diff --git a/libraries/AP_Motors/AP_MotorsHeli.cpp b/libraries/AP_Motors/AP_MotorsHeli.cpp index 7f62e63503..7ca05c7d2a 100644 --- a/libraries/AP_Motors/AP_MotorsHeli.cpp +++ b/libraries/AP_Motors/AP_MotorsHeli.cpp @@ -204,6 +204,7 @@ void AP_MotorsHeli::output() update_throttle_filter(); if (_flags.armed) { + calculate_armed_scalars(); if (!_flags.interlock) { output_armed_zero_throttle(); } else if (_flags.stabilizing) { diff --git a/libraries/AP_Motors/AP_MotorsHeli.h b/libraries/AP_Motors/AP_MotorsHeli.h index 02ef8cd62f..3daba60fc5 100644 --- a/libraries/AP_Motors/AP_MotorsHeli.h +++ b/libraries/AP_Motors/AP_MotorsHeli.h @@ -136,6 +136,9 @@ public: // calculate_scalars - must be implemented by child classes virtual void calculate_scalars() = 0; + // calculate_armed_scalars - must be implemented by child classes + virtual void calculate_armed_scalars() = 0; + // var_info for holding Parameter information static const struct AP_Param::GroupInfo var_info[]; diff --git a/libraries/AP_Motors/AP_MotorsHeli_Single.cpp b/libraries/AP_Motors/AP_MotorsHeli_Single.cpp index 8434822913..b079d89efa 100644 --- a/libraries/AP_Motors/AP_MotorsHeli_Single.cpp +++ b/libraries/AP_Motors/AP_MotorsHeli_Single.cpp @@ -218,6 +218,18 @@ void AP_MotorsHeli_Single::set_desired_rotor_speed(int16_t desired_speed) _tail_rotor.set_desired_speed(_direct_drive_tailspeed); } +// calculate_scalars - recalculates various scalers used. +void AP_MotorsHeli_Single::calculate_armed_scalars() +{ + _main_rotor.set_ramp_time(_rsc_ramp_time); + _main_rotor.set_runup_time(_rsc_runup_time); + _main_rotor.set_critical_speed(_rsc_critical); + _main_rotor.set_idle_output(_rsc_idle_output); + _main_rotor.set_power_output_range(_rsc_power_low, _rsc_power_high); + _main_rotor.recalc_scalers(); +} + + // calculate_scalars - recalculates various scalers used. void AP_MotorsHeli_Single::calculate_scalars() { @@ -244,13 +256,8 @@ void AP_MotorsHeli_Single::calculate_scalars() // send setpoints to main rotor controller and trigger recalculation of scalars _main_rotor.set_control_mode(static_cast(_rsc_mode.get())); - _main_rotor.set_ramp_time(_rsc_ramp_time); - _main_rotor.set_runup_time(_rsc_runup_time); - _main_rotor.set_critical_speed(_rsc_critical); - _main_rotor.set_idle_output(_rsc_idle_output); - _main_rotor.set_power_output_range(_rsc_power_low, _rsc_power_high); - _main_rotor.recalc_scalers(); - + calculate_armed_scalars(); + // send setpoints to tail rotor controller and trigger recalculation of scalars if (_tail_type == AP_MOTORS_HELI_SINGLE_TAILTYPE_DIRECTDRIVE_VARPITCH) { _tail_rotor.set_control_mode(ROTOR_CONTROL_MODE_SPEED_SETPOINT); diff --git a/libraries/AP_Motors/AP_MotorsHeli_Single.h b/libraries/AP_Motors/AP_MotorsHeli_Single.h index e8cfbeadce..f4fa3cebdc 100644 --- a/libraries/AP_Motors/AP_MotorsHeli_Single.h +++ b/libraries/AP_Motors/AP_MotorsHeli_Single.h @@ -95,6 +95,9 @@ public: // calculate_scalars - recalculates various scalars used void calculate_scalars(); + // calculate_armed_scalars - recalculates scalars that can change while armed + void calculate_armed_scalars(); + // get_motor_mask - returns a bitmask of which outputs are being used for motors or servos (1 means being used) // this can be used to ensure other pwm outputs (i.e. for servos) do not conflict uint16_t get_motor_mask();