|
|
|
@ -1160,52 +1160,54 @@ PX4IO::io_set_arming_state()
@@ -1160,52 +1160,54 @@ PX4IO::io_set_arming_state()
|
|
|
|
|
actuator_armed_s armed; ///< system armed state
|
|
|
|
|
vehicle_control_mode_s control_mode; ///< vehicle_control_mode
|
|
|
|
|
|
|
|
|
|
orb_copy(ORB_ID(actuator_armed), _t_actuator_armed, &armed); |
|
|
|
|
orb_copy(ORB_ID(vehicle_control_mode), _t_vehicle_control_mode, &control_mode); |
|
|
|
|
int have_armed = orb_copy(ORB_ID(actuator_armed), _t_actuator_armed, &armed); |
|
|
|
|
int have_control_mode = orb_copy(ORB_ID(vehicle_control_mode), _t_vehicle_control_mode, &control_mode); |
|
|
|
|
|
|
|
|
|
uint16_t set = 0; |
|
|
|
|
uint16_t clear = 0; |
|
|
|
|
|
|
|
|
|
if (armed.armed) { |
|
|
|
|
set |= PX4IO_P_SETUP_ARMING_FMU_ARMED; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
clear |= PX4IO_P_SETUP_ARMING_FMU_ARMED; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (armed.lockdown && !_lockdown_override) { |
|
|
|
|
set |= PX4IO_P_SETUP_ARMING_LOCKDOWN; |
|
|
|
|
} else { |
|
|
|
|
clear |= PX4IO_P_SETUP_ARMING_LOCKDOWN; |
|
|
|
|
} |
|
|
|
|
if (have_armed == OK) { |
|
|
|
|
if (armed.armed) { |
|
|
|
|
set |= PX4IO_P_SETUP_ARMING_FMU_ARMED; |
|
|
|
|
} else { |
|
|
|
|
clear |= PX4IO_P_SETUP_ARMING_FMU_ARMED; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Do not set failsafe if circuit breaker is enabled */ |
|
|
|
|
if (armed.force_failsafe && !_cb_flighttermination) { |
|
|
|
|
set |= PX4IO_P_SETUP_ARMING_FORCE_FAILSAFE; |
|
|
|
|
} else { |
|
|
|
|
clear |= PX4IO_P_SETUP_ARMING_FORCE_FAILSAFE; |
|
|
|
|
} |
|
|
|
|
if (armed.lockdown && !_lockdown_override) { |
|
|
|
|
set |= PX4IO_P_SETUP_ARMING_LOCKDOWN; |
|
|
|
|
} else { |
|
|
|
|
clear |= PX4IO_P_SETUP_ARMING_LOCKDOWN; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// XXX this is for future support in the commander
|
|
|
|
|
// but can be removed if unneeded
|
|
|
|
|
// if (armed.termination_failsafe) {
|
|
|
|
|
// set |= PX4IO_P_SETUP_ARMING_TERMINATION_FAILSAFE;
|
|
|
|
|
// } else {
|
|
|
|
|
// clear |= PX4IO_P_SETUP_ARMING_TERMINATION_FAILSAFE;
|
|
|
|
|
// }
|
|
|
|
|
/* Do not set failsafe if circuit breaker is enabled */ |
|
|
|
|
if (armed.force_failsafe && !_cb_flighttermination) { |
|
|
|
|
set |= PX4IO_P_SETUP_ARMING_FORCE_FAILSAFE; |
|
|
|
|
} else { |
|
|
|
|
clear |= PX4IO_P_SETUP_ARMING_FORCE_FAILSAFE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (armed.ready_to_arm) { |
|
|
|
|
set |= PX4IO_P_SETUP_ARMING_IO_ARM_OK; |
|
|
|
|
// XXX this is for future support in the commander
|
|
|
|
|
// but can be removed if unneeded
|
|
|
|
|
// if (armed.termination_failsafe) {
|
|
|
|
|
// set |= PX4IO_P_SETUP_ARMING_TERMINATION_FAILSAFE;
|
|
|
|
|
// } else {
|
|
|
|
|
// clear |= PX4IO_P_SETUP_ARMING_TERMINATION_FAILSAFE;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
clear |= PX4IO_P_SETUP_ARMING_IO_ARM_OK; |
|
|
|
|
if (armed.ready_to_arm) { |
|
|
|
|
set |= PX4IO_P_SETUP_ARMING_IO_ARM_OK; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
clear |= PX4IO_P_SETUP_ARMING_IO_ARM_OK; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (control_mode.flag_external_manual_override_ok) { |
|
|
|
|
set |= PX4IO_P_SETUP_ARMING_MANUAL_OVERRIDE_OK; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
clear |= PX4IO_P_SETUP_ARMING_MANUAL_OVERRIDE_OK; |
|
|
|
|
if (have_control_mode == OK) { |
|
|
|
|
if (control_mode.flag_external_manual_override_ok) { |
|
|
|
|
set |= PX4IO_P_SETUP_ARMING_MANUAL_OVERRIDE_OK; |
|
|
|
|
} else { |
|
|
|
|
clear |= PX4IO_P_SETUP_ARMING_MANUAL_OVERRIDE_OK; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return io_reg_modify(PX4IO_PAGE_SETUP, PX4IO_P_SETUP_ARMING, clear, set); |
|
|
|
@ -2198,7 +2200,7 @@ PX4IO::ioctl(file * filep, int cmd, unsigned long arg)
@@ -2198,7 +2200,7 @@ PX4IO::ioctl(file * filep, int cmd, unsigned long arg)
|
|
|
|
|
struct pwm_output_values* pwm = (struct pwm_output_values*)arg; |
|
|
|
|
if (pwm->channel_count > _max_actuators) |
|
|
|
|
/* fail with error */ |
|
|
|
|
return E2BIG; |
|
|
|
|
return -E2BIG; |
|
|
|
|
|
|
|
|
|
/* copy values to registers in IO */ |
|
|
|
|
ret = io_reg_set(PX4IO_PAGE_FAILSAFE_PWM, 0, pwm->values, pwm->channel_count); |
|
|
|
@ -2217,7 +2219,7 @@ PX4IO::ioctl(file * filep, int cmd, unsigned long arg)
@@ -2217,7 +2219,7 @@ PX4IO::ioctl(file * filep, int cmd, unsigned long arg)
|
|
|
|
|
struct pwm_output_values* pwm = (struct pwm_output_values*)arg; |
|
|
|
|
if (pwm->channel_count > _max_actuators) |
|
|
|
|
/* fail with error */ |
|
|
|
|
return E2BIG; |
|
|
|
|
return -E2BIG; |
|
|
|
|
|
|
|
|
|
/* copy values to registers in IO */ |
|
|
|
|
ret = io_reg_set(PX4IO_PAGE_DISARMED_PWM, 0, pwm->values, pwm->channel_count); |
|
|
|
@ -2236,7 +2238,7 @@ PX4IO::ioctl(file * filep, int cmd, unsigned long arg)
@@ -2236,7 +2238,7 @@ PX4IO::ioctl(file * filep, int cmd, unsigned long arg)
|
|
|
|
|
struct pwm_output_values* pwm = (struct pwm_output_values*)arg; |
|
|
|
|
if (pwm->channel_count > _max_actuators) |
|
|
|
|
/* fail with error */ |
|
|
|
|
return E2BIG; |
|
|
|
|
return -E2BIG; |
|
|
|
|
|
|
|
|
|
/* copy values to registers in IO */ |
|
|
|
|
ret = io_reg_set(PX4IO_PAGE_CONTROL_MIN_PWM, 0, pwm->values, pwm->channel_count); |
|
|
|
@ -2255,7 +2257,7 @@ PX4IO::ioctl(file * filep, int cmd, unsigned long arg)
@@ -2255,7 +2257,7 @@ PX4IO::ioctl(file * filep, int cmd, unsigned long arg)
|
|
|
|
|
struct pwm_output_values* pwm = (struct pwm_output_values*)arg; |
|
|
|
|
if (pwm->channel_count > _max_actuators) |
|
|
|
|
/* fail with error */ |
|
|
|
|
return E2BIG; |
|
|
|
|
return -E2BIG; |
|
|
|
|
|
|
|
|
|
/* copy values to registers in IO */ |
|
|
|
|
ret = io_reg_set(PX4IO_PAGE_CONTROL_MAX_PWM, 0, pwm->values, pwm->channel_count); |
|
|
|
@ -2592,9 +2594,9 @@ PX4IO::ioctl(file * filep, int cmd, unsigned long arg)
@@ -2592,9 +2594,9 @@ PX4IO::ioctl(file * filep, int cmd, unsigned long arg)
|
|
|
|
|
on param_get()
|
|
|
|
|
*/ |
|
|
|
|
struct pwm_output_rc_config* config = (struct pwm_output_rc_config*)arg; |
|
|
|
|
if (config->channel >= _max_actuators) { |
|
|
|
|
if (config->channel >= RC_INPUT_MAX_CHANNELS) { |
|
|
|
|
/* fail with error */ |
|
|
|
|
return E2BIG; |
|
|
|
|
return -E2BIG; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* copy values to registers in IO */ |
|
|
|
|