bool AP_Arming_Copter::parameter_checks(bool display_failure) { // check various parameter values if ((checks_to_perform == ARMING_CHECK_ALL) || (checks_to_perform & ARMING_CHECK_PARAMETERS)) { // ensure all rc channels have different functions if (rc().duplicate_options_exist()) { check_failed(ARMING_CHECK_PARAMETERS, display_failure, "Duplicate Aux Switch Options"); return false; } // failsafe parameter checks if (copter.g.failsafe_throttle) { // check throttle min is above throttle failsafe trigger and that the trigger is above ppm encoder's loss-of-signal value of 900 if (copter.channel_throttle->get_radio_min() <= copter.g.failsafe_throttle_value+10 || copter.g.failsafe_throttle_value < 910) { check_failed(ARMING_CHECK_PARAMETERS, display_failure, "Check FS_THR_VALUE"); return false; } } // lean angle parameter check if (copter.aparm.angle_max < 1000 || copter.aparm.angle_max > 8000) { check_failed(ARMING_CHECK_PARAMETERS, display_failure, "Check ANGLE_MAX"); return false; } // acro balance parameter check #if MODE_ACRO_ENABLED == ENABLED || MODE_SPORT_ENABLED == ENABLED if ((copter.g.acro_balance_roll > copter.attitude_control->get_angle_roll_p().kP()) || (copter.g.acro_balance_pitch > copter.attitude_control->get_angle_pitch_p().kP())) { check_failed(ARMING_CHECK_PARAMETERS, display_failure, "ACRO_BAL_ROLL/PITCH"); return false; } #endif #if RANGEFINDER_ENABLED == ENABLED && OPTFLOW == ENABLED // check range finder if optflow enabled if (copter.optflow.enabled() && !copter.rangefinder.pre_arm_check()) { check_failed(ARMING_CHECK_PARAMETERS, display_failure, "check range finder"); return false; } #endif #if FRAME_CONFIG == HELI_FRAME // check helicopter parameters if (!copter.motors->parameter_check(display_failure)) { check_failed(ARMING_CHECK_PARAMETERS, display_failure, "Heli motors checks failed"); return false; } // Inverted flight feature disabled for Heli Single and Dual frames if (copter.g2.frame_class.get() != AP_Motors::MOTOR_FRAME_HELI_QUAD && rc().find_channel_for_option(RC_Channel::aux_func_t::INVERTED) != nullptr) { check_failed(ARMING_CHECK_PARAMETERS, display_failure, "Inverted flight option not supported"); return false; } // Ensure an Aux Channel is configured for motor interlock if (rc().find_channel_for_option(RC_Channel::aux_func_t::MOTOR_INTERLOCK) == nullptr) { check_failed(ARMING_CHECK_PARAMETERS, display_failure, "Motor Interlock not configured"); return false; } #endif // HELI_FRAME // check for missing terrain data if (!pre_arm_terrain_check(display_failure)) { return false; } // check adsb avoidance failsafe #if ADSB_ENABLED == ENABLE if (copter.failsafe.adsb) { check_failed(ARMING_CHECK_PARAMETERS, display_failure, "ADSB threat detected"); return false; } #endif // check for something close to vehicle if (!pre_arm_proximity_check(display_failure)) { return false; } // ensure controllers are OK with us arming: char failure_msg[50]; if (!copter.pos_control->pre_arm_checks("PSC", failure_msg, ARRAY_SIZE(failure_msg))) { check_failed(ARMING_CHECK_PARAMETERS, display_failure, "Bad parameter: %s", failure_msg); return false; } if (!copter.attitude_control->pre_arm_checks("ATC", failure_msg, ARRAY_SIZE(failure_msg))) { check_failed(ARMING_CHECK_PARAMETERS, display_failure, "Bad parameter: %s", failure_msg); return false; } } return true; }
bool Copter::parameter_checks(bool display_failure) { // check various parameter values if ((g.arming_check == ARMING_CHECK_ALL) || (g.arming_check & ARMING_CHECK_PARAMETERS)) { // ensure ch7 and ch8 have different functions if (check_duplicate_auxsw()) { if (display_failure) { gcs_send_text(MAV_SEVERITY_CRITICAL,"PreArm: Duplicate Aux Switch Options"); } return false; } // failsafe parameter checks if (g.failsafe_throttle) { // check throttle min is above throttle failsafe trigger and that the trigger is above ppm encoder's loss-of-signal value of 900 if (channel_throttle->get_radio_min() <= g.failsafe_throttle_value+10 || g.failsafe_throttle_value < 910) { if (display_failure) { gcs_send_text(MAV_SEVERITY_CRITICAL,"PreArm: Check FS_THR_VALUE"); } return false; } } // lean angle parameter check if (aparm.angle_max < 1000 || aparm.angle_max > 8000) { if (display_failure) { gcs_send_text(MAV_SEVERITY_CRITICAL,"PreArm: Check ANGLE_MAX"); } return false; } // acro balance parameter check if ((g.acro_balance_roll > attitude_control.get_angle_roll_p().kP()) || (g.acro_balance_pitch > attitude_control.get_angle_pitch_p().kP())) { if (display_failure) { gcs_send_text(MAV_SEVERITY_CRITICAL,"PreArm: ACRO_BAL_ROLL/PITCH"); } return false; } #if RANGEFINDER_ENABLED == ENABLED && OPTFLOW == ENABLED // check range finder if optflow enabled if (optflow.enabled() && !rangefinder.pre_arm_check()) { if (display_failure) { gcs_send_text(MAV_SEVERITY_CRITICAL,"PreArm: check range finder"); } return false; } #endif #if FRAME_CONFIG == HELI_FRAME // check helicopter parameters if (!motors.parameter_check(display_failure)) { return false; } #endif // HELI_FRAME // check for missing terrain data if (!pre_arm_terrain_check(display_failure)) { return false; } // check adsb avoidance failsafe if (failsafe.adsb) { if (display_failure) { gcs_send_text(MAV_SEVERITY_CRITICAL,"PreArm: ADSB threat detected"); } return false; } // check for something close to vehicle if (!pre_arm_proximity_check(display_failure)) { return false; } } return true; }