Browse Source

added logic to encode NAN as INT16_MAX to transfer to IO from FMU

sbg
dlwalter 6 years ago committed by Lorenz Meier
parent
commit
310fd80405
  1. 9
      src/drivers/px4io/px4io.cpp
  2. 8
      src/modules/px4iofirmware/mixer.cpp

9
src/drivers/px4io/px4io.cpp

@ -1304,8 +1304,15 @@ PX4IO::io_set_control_state(unsigned group) @@ -1304,8 +1304,15 @@ PX4IO::io_set_control_state(unsigned group)
for (unsigned i = 0; i < _max_controls; i++) {
/* ensure FLOAT_TO_REG does not produce an integer overflow */
const float ctrl = math::constrain(controls.control[i], -1.0f, 1.0f);
if(!isfinite(ctrl)){
regs[i] = INT16_MAX;
}
else
{
regs[i] = FLOAT_TO_REG(ctrl);
}
regs[i] = FLOAT_TO_REG(ctrl);
}
if (!_test_fmu_fail) {

8
src/modules/px4iofirmware/mixer.cpp

@ -412,7 +412,13 @@ mixer_callback(uintptr_t handle, @@ -412,7 +412,13 @@ mixer_callback(uintptr_t handle,
switch (source) {
case MIX_FMU:
if (control_index < PX4IO_CONTROL_CHANNELS && control_group < PX4IO_CONTROL_GROUPS) {
control = REG_TO_FLOAT(r_page_controls[CONTROL_PAGE_INDEX(control_group, control_index)]);
if(r_page_controls[CONTROL_PAGE_INDEX(control_group, control_index)] == INT16_MAX){
//catch NAN values encoded as INT16 max for disarmed outputs
control = NAN;
}
else{
control = REG_TO_FLOAT(r_page_controls[CONTROL_PAGE_INDEX(control_group, control_index)]);
}
break;
}

Loading…
Cancel
Save