Browse Source

output drivers: add option to generate a separate output range reversing param

Makes it a bit easier to configure. Reversing by setting MIN > MAX is still
supported.
master
Beat Küng 3 years ago committed by Daniel Agar
parent
commit
d1abdd0f8d
  1. 20
      Tools/module_config/generate_actuators_metadata.py
  2. 32
      Tools/module_config/generate_params.py
  3. 1
      src/drivers/linux_pwm_out/module.yaml
  4. 1
      src/drivers/pwm_out/module.yaml
  5. 1
      src/drivers/pwm_out_sim/module_hil.yaml
  6. 1
      src/drivers/pwm_out_sim/module_sim.yaml
  7. 1
      src/drivers/px4io/module.yaml
  8. 1
      src/drivers/uavcan/module.yaml
  9. 1
      src/drivers/uavcan_v1/module.yaml
  10. 9
      src/lib/mixer_module/mixer_module.cpp
  11. 1
      src/lib/mixer_module/mixer_module.hpp
  12. 3
      validation/module_schema.yaml

20
Tools/module_config/generate_actuators_metadata.py

@ -130,7 +130,8 @@ def get_actuator_output(yaml_config, output_functions, timer_config_file, verbos
return None return None
output_groups = yaml_config['actuator_output']['output_groups'] actuator_output_yaml = yaml_config['actuator_output']
output_groups = actuator_output_yaml['output_groups']
module_name = process_module_name(yaml_config['module_name']) module_name = process_module_name(yaml_config['module_name'])
group_idx = 0 group_idx = 0
@ -139,8 +140,9 @@ def get_actuator_output(yaml_config, output_functions, timer_config_file, verbos
actuator_output = { actuator_output = {
'label': module_name 'label': module_name
} }
if 'show_subgroups_if' in yaml_config['actuator_output']: if 'show_subgroups_if' in actuator_output_yaml:
actuator_output['show-subgroups-if'] = yaml_config['actuator_output']['show_subgroups_if'] actuator_output['show-subgroups-if'] = actuator_output_yaml['show_subgroups_if']
add_reverse_range_param = actuator_output_yaml.get('add_reverse_range_param', False)
# config parameters # config parameters
def get_config_params(param_list): def get_config_params(param_list):
@ -159,7 +161,7 @@ def get_actuator_output(yaml_config, output_functions, timer_config_file, verbos
parameters.append(param) parameters.append(param)
return parameters return parameters
parameters = get_config_params(yaml_config['actuator_output'].get('config_parameters', [])) parameters = get_config_params(actuator_output_yaml.get('config_parameters', []))
if len(parameters) > 0: if len(parameters) > 0:
actuator_output['parameters'] = parameters actuator_output['parameters'] = parameters
@ -254,6 +256,16 @@ def get_actuator_output(yaml_config, output_functions, timer_config_file, verbos
if show_if: param['show-if'] = show_if if show_if: param['show-if'] = show_if
per_channel_params.append(param) per_channel_params.append(param)
if add_reverse_range_param:
param = {
'label': 'Rev Range\n(for Servos)',
'name': param_prefix+'_REV',
'index-offset': -1,
'show-as': 'bitset',
}
per_channel_params.append(param)
# TODO: support non-standard per-channel parameters # TODO: support non-standard per-channel parameters
subgroup['per-channel-parameters'] = per_channel_params subgroup['per-channel-parameters'] = per_channel_params

32
Tools/module_config/generate_params.py

@ -178,6 +178,9 @@ def get_actuator_output_params(yaml_config, output_functions,
all_params = {} all_params = {}
group_idx = 0 group_idx = 0
add_reverse_range_param = yaml_config['actuator_output'].get('add_reverse_range_param', False)
all_param_prefixes = {}
def add_local_param(param_name, param_def): def add_local_param(param_name, param_def):
nonlocal all_params nonlocal all_params
# add as a list, as there can be multiple entries with the same param_name # add as a list, as there can be multiple entries with the same param_name
@ -259,6 +262,11 @@ def get_actuator_output_params(yaml_config, output_functions,
for i in range(count): for i in range(count):
output_function_values[start+i] = function_name_label+' '+str(i+1) output_function_values[start+i] = function_name_label+' '+str(i+1)
if param_prefix not in all_param_prefixes:
all_param_prefixes[param_prefix] = []
all_param_prefixes[param_prefix].append((instance_start,
instance_start_label, num_channels, channel_label))
# function param # function param
param = { param = {
'description': { 'description': {
@ -338,6 +346,30 @@ When set to -1 (default), the value depends on the function (see {:}).
} }
add_local_param(param_prefix+'_'+param_suffix+'${i}', param) add_local_param(param_prefix+'_'+param_suffix+'${i}', param)
if add_reverse_range_param:
for param_prefix in all_param_prefixes:
groups = all_param_prefixes[param_prefix]
# collect the bits
channel_bits = {}
for instance_start, instance_start_label, num_instances, label in groups:
for instance in range(instance_start, instance_start+num_instances):
instance_label = instance - instance_start + instance_start_label
channel_bits[instance-1] = label + ' ' + str(instance_label)
param = {
'description': {
'short': 'Reverse Output Range for '+module_name,
'long':
'''Allows to reverse the output range for each channel.
Note: this is only useful for servos.
'''.format(channel_label),
},
'type': 'bitmask',
'default': 0,
'bit': channel_bits
}
add_local_param(param_prefix+'_REV', param)
if verbose: print('adding actuator params: {:}'.format(all_params)) if verbose: print('adding actuator params: {:}'.format(all_params))
return all_params return all_params

1
src/drivers/linux_pwm_out/module.yaml

@ -1,5 +1,6 @@
module_name: PWM Output module_name: PWM Output
actuator_output: actuator_output:
add_reverse_range_param: true
output_groups: output_groups:
- param_prefix: PWM_MAIN - param_prefix: PWM_MAIN
channel_label: 'Channel' channel_label: 'Channel'

1
src/drivers/pwm_out/module.yaml

@ -1,5 +1,6 @@
module_name: '${PWM_MAIN_OR_AUX}' module_name: '${PWM_MAIN_OR_AUX}'
actuator_output: actuator_output:
add_reverse_range_param: true
output_groups: output_groups:
- generator: pwm - generator: pwm
param_prefix: '${PWM_MAIN_OR_AUX}' param_prefix: '${PWM_MAIN_OR_AUX}'

1
src/drivers/pwm_out_sim/module_hil.yaml

@ -1,6 +1,7 @@
module_name: HIL module_name: HIL
actuator_output: actuator_output:
add_reverse_range_param: true
show_subgroups_if: 'SYS_HITL>0' show_subgroups_if: 'SYS_HITL>0'
output_groups: output_groups:
- param_prefix: HIL_ACT - param_prefix: HIL_ACT

1
src/drivers/pwm_out_sim/module_sim.yaml

@ -1,6 +1,7 @@
module_name: SIM module_name: SIM
actuator_output: actuator_output:
add_reverse_range_param: true
output_groups: output_groups:
- param_prefix: PWM_MAIN - param_prefix: PWM_MAIN
channel_label: Channel channel_label: Channel

1
src/drivers/px4io/module.yaml

@ -1,5 +1,6 @@
module_name: PWM MAIN module_name: PWM MAIN
actuator_output: actuator_output:
add_reverse_range_param: true
output_groups: output_groups:
- generator: pwm - generator: pwm
param_prefix: PWM_MAIN param_prefix: PWM_MAIN

1
src/drivers/uavcan/module.yaml

@ -1,5 +1,6 @@
module_name: UAVCAN module_name: UAVCAN
actuator_output: actuator_output:
add_reverse_range_param: true
show_subgroups_if: 'UAVCAN_ENABLE>=3' show_subgroups_if: 'UAVCAN_ENABLE>=3'
config_parameters: config_parameters:
- param: 'UAVCAN_ENABLE' - param: 'UAVCAN_ENABLE'

1
src/drivers/uavcan_v1/module.yaml

@ -1,5 +1,6 @@
module_name: UAVCANv1 module_name: UAVCANv1
actuator_output: actuator_output:
add_reverse_range_param: true
output_groups: output_groups:
- param_prefix: UCAN1_ESC - param_prefix: UCAN1_ESC
channel_label: 'ESC' channel_label: 'ESC'

9
src/lib/mixer_module/mixer_module.cpp

@ -138,6 +138,9 @@ void MixingOutput::initParamHandles()
snprintf(param_name, sizeof(param_name), "%s_%s%d", _param_prefix, "FAIL", i + 1); snprintf(param_name, sizeof(param_name), "%s_%s%d", _param_prefix, "FAIL", i + 1);
_param_handles[i].failsafe = param_find(param_name); _param_handles[i].failsafe = param_find(param_name);
} }
snprintf(param_name, sizeof(param_name), "%s_%s", _param_prefix, "REV");
_param_handle_rev_range = param_find(param_name);
} }
void MixingOutput::printStatus() const void MixingOutput::printStatus() const
@ -230,6 +233,12 @@ void MixingOutput::updateParams()
} }
} }
int32_t rev_range_param;
if (_param_handle_rev_range != PARAM_INVALID && param_get(_param_handle_rev_range, &rev_range_param) == 0) {
_reverse_output_mask |= rev_range_param;
}
if (function_changed) { if (function_changed) {
_need_function_update = true; _need_function_update = true;
} }

1
src/lib/mixer_module/mixer_module.hpp

@ -346,6 +346,7 @@ private:
bool _has_backup_schedule{false}; bool _has_backup_schedule{false};
const char *const _param_prefix; const char *const _param_prefix;
ParamHandles _param_handles[MAX_ACTUATORS]; ParamHandles _param_handles[MAX_ACTUATORS];
param_t _param_handle_rev_range{PARAM_INVALID};
hrt_abstime _lowrate_schedule_interval{300_ms}; hrt_abstime _lowrate_schedule_interval{300_ms};
ActuatorTest _actuator_test{_function_assignment}; ActuatorTest _actuator_test{_function_assignment};
uint32_t _reversible_mask{0}; ///< per-output bits. If set, the output is configured to be reversible (motors only) uint32_t _reversible_mask{0}; ///< per-output bits. If set, the output is configured to be reversible (motors only)

3
validation/module_schema.yaml

@ -251,6 +251,9 @@ actuator_output:
function: function:
type: string type: string
allowed: [ enable ] allowed: [ enable ]
add_reverse_range_param:
# Add a separate range reversing bitmask param.
type: boolean
output_groups: output_groups:
type: list type: list
minlength: 1 minlength: 1

Loading…
Cancel
Save