ardupilot/libraries/AP_Arming/AP_Arming.h
Peter Barker 5428d13502 AP_Arming: remove bogus ARMING_CHECK_NONE 'bitmask value'
This looks like a bitmask value, but if you treat it like one (and
people have in the past!) by using logical operations then you get the
incorrect result.

Places which were checking for equivalence to ARMING_CHECK_NONE now
simply check the bitmask to see if it is all-empty.
2019-10-08 10:31:07 +11:00

167 lines
5.0 KiB
C++

#pragma once
#include <AP_HAL/AP_HAL.h>
#include <AP_Param/AP_Param.h>
#include <AP_InertialSensor/AP_InertialSensor.h>
#include <RC_Channel/RC_Channel.h>
class AP_Arming {
public:
AP_Arming();
/* Do not allow copies */
AP_Arming(const AP_Arming &other) = delete;
AP_Arming &operator=(const AP_Arming&) = delete;
static AP_Arming *get_singleton();
enum ArmingChecks {
ARMING_CHECK_ALL = (1U << 0),
ARMING_CHECK_BARO = (1U << 1),
ARMING_CHECK_COMPASS = (1U << 2),
ARMING_CHECK_GPS = (1U << 3),
ARMING_CHECK_INS = (1U << 4),
ARMING_CHECK_PARAMETERS = (1U << 5),
ARMING_CHECK_RC = (1U << 6),
ARMING_CHECK_VOLTAGE = (1U << 7),
ARMING_CHECK_BATTERY = (1U << 8),
ARMING_CHECK_AIRSPEED = (1U << 9),
ARMING_CHECK_LOGGING = (1U << 10),
ARMING_CHECK_SWITCH = (1U << 11),
ARMING_CHECK_GPS_CONFIG = (1U << 12),
ARMING_CHECK_SYSTEM = (1U << 13),
ARMING_CHECK_MISSION = (1U << 14),
ARMING_CHECK_RANGEFINDER = (1U << 15),
};
enum class Method {
RUDDER,
MAVLINK,
AUXSWITCH,
MOTORTEST,
SCRIPTING,
};
enum class Required {
NO = 0,
YES_MIN_PWM = 1,
YES_ZERO_PWM = 2
};
void init(void);
// these functions should not be used by Copter which holds the armed state in the motors library
Required arming_required();
virtual bool arm(AP_Arming::Method method, bool do_arming_checks=true);
virtual bool disarm();
bool is_armed();
// get bitmask of enabled checks
uint16_t get_enabled_checks();
// pre_arm_checks() is virtual so it can be modified in a vehicle specific subclass
virtual bool pre_arm_checks(bool report);
// some arming checks have side-effects, or require some form of state
// change to have occurred, and thus should not be done as pre-arm
// checks. Those go here:
virtual bool arm_checks(AP_Arming::Method method);
// get expected magnetic field strength
uint16_t compass_magfield_expected() const;
// rudder arming support
enum class RudderArming {
IS_DISABLED = 0, // DISABLED leaks in from vehicle defines.h
ARMONLY = 1,
ARMDISARM = 2
};
RudderArming get_rudder_arming_type() const { return (RudderArming)_rudder_arming.get(); }
static const struct AP_Param::GroupInfo var_info[];
protected:
// Parameters
AP_Int8 require;
AP_Int32 checks_to_perform; // bitmask for which checks are required
AP_Float accel_error_threshold;
AP_Int8 _rudder_arming;
AP_Int32 _required_mission_items;
// internal members
bool armed;
uint32_t last_accel_pass_ms[INS_MAX_INSTANCES];
uint32_t last_gyro_pass_ms[INS_MAX_INSTANCES];
virtual bool barometer_checks(bool report);
bool airspeed_checks(bool report);
bool logging_checks(bool report);
virtual bool ins_checks(bool report);
virtual bool compass_checks(bool report);
virtual bool gps_checks(bool report);
bool battery_checks(bool report);
bool hardware_safety_check(bool report);
virtual bool board_voltage_checks(bool report);
virtual bool rc_calibration_checks(bool report);
bool manual_transmitter_checks(bool report);
bool mission_checks(bool report);
bool rangefinder_checks(bool report);
bool fence_checks(bool report);
virtual bool system_checks(bool report);
bool can_checks(bool report);
virtual bool proximity_checks(bool report) const;
bool servo_checks(bool report) const;
bool rc_checks_copter_sub(bool display_failure, const RC_Channel *channels[4]) const;
// returns true if a particular check is enabled
bool check_enabled(const enum AP_Arming::ArmingChecks check) const;
// returns a mavlink severity which should be used if a specific check fails
MAV_SEVERITY check_severity(const enum AP_Arming::ArmingChecks check) const;
// handle the case where a check fails
void check_failed(const enum AP_Arming::ArmingChecks check, bool report, const char *fmt, ...) const FMT_PRINTF(4, 5);
void check_failed(bool report, const char *fmt, ...) const FMT_PRINTF(3, 4);
void Log_Write_Arm_Disarm();
private:
static AP_Arming *_singleton;
bool ins_accels_consistent(const AP_InertialSensor &ins);
bool ins_gyros_consistent(const AP_InertialSensor &ins);
enum MIS_ITEM_CHECK {
MIS_ITEM_CHECK_LAND = (1 << 0),
MIS_ITEM_CHECK_VTOL_LAND = (1 << 1),
MIS_ITEM_CHECK_DO_LAND_START = (1 << 2),
MIS_ITEM_CHECK_TAKEOFF = (1 << 3),
MIS_ITEM_CHECK_VTOL_TAKEOFF = (1 << 4),
MIS_ITEM_CHECK_RALLY = (1 << 5),
MIS_ITEM_CHECK_MAX
};
};
namespace AP {
AP_Arming &arming();
};