123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- #pragma once
- #include <AP_Common/AP_Common.h>
- #include <AP_Param/AP_Param.h>
- #include <AP_Math/AP_Math.h>
- #include <GCS_MAVLink/GCS_MAVLink.h>
- #include "AP_BattMonitor_Params.h"
- #define AP_BATT_MONITOR_MAX_INSTANCES 9
- #define AP_BATT_PRIMARY_INSTANCE 0
- #define AP_BATT_SERIAL_NUMBER_DEFAULT -1
- #define AP_BATT_MONITOR_TIMEOUT 5000
- #define AP_BATT_MONITOR_RES_EST_TC_1 0.5f
- #define AP_BATT_MONITOR_RES_EST_TC_2 0.1f
- class AP_BattMonitor_Backend;
- class AP_BattMonitor_Analog;
- class AP_BattMonitor_SMBus;
- class AP_BattMonitor_SMBus_Solo;
- class AP_BattMonitor_SMBus_Maxell;
- class AP_BattMonitor_UAVCAN;
- class AP_BattMonitor
- {
- friend class AP_BattMonitor_Backend;
- friend class AP_BattMonitor_Analog;
- friend class AP_BattMonitor_SMBus;
- friend class AP_BattMonitor_SMBus_Solo;
- friend class AP_BattMonitor_SMBus_Maxell;
- friend class AP_BattMonitor_UAVCAN;
- friend class AP_BattMonitor_Sum;
- friend class AP_BattMonitor_FuelFlow;
- friend class AP_BattMonitor_FuelLevel_PWM;
- public:
-
- enum BatteryFailsafe {
- BatteryFailsafe_None = 0,
- BatteryFailsafe_Low,
- BatteryFailsafe_Critical
- };
- FUNCTOR_TYPEDEF(battery_failsafe_handler_fn_t, void, const char *, const int8_t);
- AP_BattMonitor(uint32_t log_battery_bit, battery_failsafe_handler_fn_t battery_failsafe_handler_fn, const int8_t *failsafe_priorities);
-
- AP_BattMonitor(const AP_BattMonitor &other) = delete;
- AP_BattMonitor &operator=(const AP_BattMonitor&) = delete;
- static AP_BattMonitor *get_singleton() {
- return _singleton;
- }
- struct cells {
- uint16_t cells[MAVLINK_MSG_BATTERY_STATUS_FIELD_VOLTAGES_LEN];
- };
-
- struct BattMonitor_State {
- cells cell_voltages;
- float voltage;
- float current_amps;
- float consumed_mah;
- float consumed_wh;
- uint32_t last_time_micros;
- uint32_t low_voltage_start_ms;
- uint32_t critical_voltage_start_ms;
- float temperature;
- uint32_t temperature_time;
- float voltage_resting_estimate;
- float resistance;
- BatteryFailsafe failsafe;
- bool healthy;
- bool is_powering_off;
- bool powerOffNotified;
- };
-
- uint8_t num_instances(void) const { return _num_instances; }
-
- void init();
-
- void read();
-
- bool healthy(uint8_t instance) const;
- bool healthy() const { return healthy(AP_BATT_PRIMARY_INSTANCE); }
-
- float voltage(uint8_t instance) const;
- float voltage() const { return voltage(AP_BATT_PRIMARY_INSTANCE); }
-
-
- float voltage_resting_estimate(uint8_t instance) const;
- float voltage_resting_estimate() const { return voltage_resting_estimate(AP_BATT_PRIMARY_INSTANCE); }
-
- bool current_amps(float ¤t, const uint8_t instance = AP_BATT_PRIMARY_INSTANCE) const WARN_IF_UNUSED;
-
- bool consumed_mah(float &mah, const uint8_t instance = AP_BATT_PRIMARY_INSTANCE) const WARN_IF_UNUSED;
-
- bool consumed_wh(float&wh, const uint8_t instance = AP_BATT_PRIMARY_INSTANCE) const WARN_IF_UNUSED;
-
- virtual uint8_t capacity_remaining_pct(uint8_t instance) const;
- uint8_t capacity_remaining_pct() const { return capacity_remaining_pct(AP_BATT_PRIMARY_INSTANCE); }
-
- int32_t pack_capacity_mah(uint8_t instance) const;
- int32_t pack_capacity_mah() const { return pack_capacity_mah(AP_BATT_PRIMARY_INSTANCE); }
-
-
- bool has_failsafed(void) const { return _has_triggered_failsafe; };
-
- int8_t get_highest_failsafe_priority(void) const { return _highest_failsafe_priority; };
-
- enum AP_BattMonitor_Params::BattMonitor_Type get_type() const { return get_type(AP_BATT_PRIMARY_INSTANCE); }
- enum AP_BattMonitor_Params::BattMonitor_Type get_type(uint8_t instance) const { return _params[instance].type(); }
-
- bool overpower_detected() const;
- bool overpower_detected(uint8_t instance) const;
-
- bool has_cell_voltages() { return has_cell_voltages(AP_BATT_PRIMARY_INSTANCE); }
- bool has_cell_voltages(const uint8_t instance) const;
- const cells & get_cell_voltages() const { return get_cell_voltages(AP_BATT_PRIMARY_INSTANCE); }
- const cells & get_cell_voltages(const uint8_t instance) const;
-
- bool get_temperature(float &temperature) const { return get_temperature(temperature, AP_BATT_PRIMARY_INSTANCE); };
- bool get_temperature(float &temperature, const uint8_t instance) const;
-
- float get_resistance() const { return get_resistance(AP_BATT_PRIMARY_INSTANCE); }
- float get_resistance(uint8_t instance) const { return state[instance].resistance; }
-
- bool arming_checks(size_t buflen, char *buffer) const;
-
- void checkPoweringOff(void);
-
- bool reset_remaining(uint16_t battery_mask, float percentage);
- static const struct AP_Param::GroupInfo var_info[];
- protected:
-
- AP_BattMonitor_Params _params[AP_BATT_MONITOR_MAX_INSTANCES];
- private:
- static AP_BattMonitor *_singleton;
- BattMonitor_State state[AP_BATT_MONITOR_MAX_INSTANCES];
- AP_BattMonitor_Backend *drivers[AP_BATT_MONITOR_MAX_INSTANCES];
- uint32_t _log_battery_bit;
- uint8_t _num_instances;
- void convert_params(void);
-
- BatteryFailsafe check_failsafe(const uint8_t instance);
- void check_failsafes(void);
- battery_failsafe_handler_fn_t _battery_failsafe_handler_fn;
- const int8_t *_failsafe_priorities;
- int8_t _highest_failsafe_priority;
- bool _has_triggered_failsafe;
- };
- namespace AP {
- AP_BattMonitor &battery();
- };
|