Line data Source code
1 : /* 2 : This program is free software: you can redistribute it and/or modify 3 : it under the terms of the GNU General Public License as published by 4 : the Free Software Foundation, either version 3 of the License, or 5 : (at your option) any later version. 6 : 7 : This program is distributed in the hope that it will be useful, 8 : but WITHOUT ANY WARRANTY; without even the implied warranty of 9 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 : GNU General Public License for more details. 11 : 12 : You should have received a copy of the GNU General Public License 13 : along with this program. If not, see <http://www.gnu.org/licenses/>. 14 : */ 15 : #pragma once 16 : 17 : #include "AP_BattMonitor_config.h" 18 : 19 : #if AP_BATTERY_ENABLED 20 : 21 : #include "AP_BattMonitor.h" 22 : 23 : #include <AP_Common/AP_Common.h> 24 : 25 : class AP_BattMonitor_Backend 26 : { 27 : public: 28 : // constructor. This incorporates initialisation as well. 29 : AP_BattMonitor_Backend(AP_BattMonitor &mon, AP_BattMonitor::BattMonitor_State &mon_state, AP_BattMonitor_Params ¶ms); 30 : 31 : // we declare a virtual destructor so that BattMonitor driver can 32 : // override with a custom destructor if need be 33 0 : virtual ~AP_BattMonitor_Backend(void) {} 34 : 35 : // initialise 36 0 : virtual void init() {}; 37 : 38 : // read the latest battery voltage 39 : virtual void read() = 0; 40 : 41 : /// returns true if battery monitor instance provides time remaining info 42 0 : virtual bool has_time_remaining() const { return false; } 43 : 44 : /// returns true if battery monitor instance provides consumed energy info 45 344 : virtual bool has_consumed_energy() const { return false; } 46 : 47 : /// returns true if battery monitor instance provides current info 48 : virtual bool has_current() const = 0; 49 : 50 : // returns true if battery monitor provides individual cell voltages 51 2081845 : virtual bool has_cell_voltages() const { return false; } 52 : 53 : // returns true if battery monitor provides temperature 54 2081845 : virtual bool has_temperature() const { return false; } 55 : 56 : // returns true if temperature retrieved successfully 57 : virtual bool get_temperature(float &temperature) const; 58 : 59 : // capacity_remaining_pct - returns true if the battery % is available and writes to the percentage argument 60 : // returns false if the battery is unhealthy, does not have current monitoring, or the pack_capacity is too small 61 : virtual bool capacity_remaining_pct(uint8_t &percentage) const WARN_IF_UNUSED; 62 : 63 : // return true if cycle count can be provided and fills in cycles argument 64 0 : virtual bool get_cycle_count(uint16_t &cycles) const { return false; } 65 : 66 : // return true if state of health (as a percentage) can be provided and fills in soh_pct argument 67 : bool get_state_of_health_pct(uint8_t &soh_pct) const; 68 : 69 : /// get voltage with sag removed (based on battery current draw and resistance) 70 : /// this will always be greater than or equal to the raw voltage 71 : float voltage_resting_estimate() const; 72 : 73 : // update battery resistance estimate and voltage_resting_estimate 74 : virtual void update_resistance_estimate(); 75 : 76 : // updates failsafe timers, and returns what failsafes are active 77 : virtual AP_BattMonitor::Failsafe update_failsafes(void); 78 : 79 : // returns false if we fail arming checks, in which case the buffer will be populated with a failure message 80 : bool arming_checks(char * buffer, size_t buflen) const; 81 : 82 : // reset remaining percentage to given value 83 : virtual bool reset_remaining(float percentage); 84 : 85 : // return mavlink fault bitmask (see MAV_BATTERY_FAULT enum) 86 1732841 : virtual uint32_t get_mavlink_fault_bitmask() const { return 0; } 87 : 88 : // logging functions 89 : void Log_Write_BAT(const uint8_t instance, const uint64_t time_us) const; 90 : void Log_Write_BCL(const uint8_t instance, const uint64_t time_us) const; 91 : 92 : // set desired powered state (enabled/disabled) 93 0 : virtual void set_powered_state(bool power_on) {}; 94 : 95 : // Update an ESC telemetry channel's power information 96 : void update_esc_telem_outbound(); 97 : 98 : // amps: current (A) 99 : // dt_us: time between samples (micro-seconds) 100 1235504 : static float calculate_mah(float amps, float dt_us) { return (float) (amps * dt_us * AUS_TO_MAH); } 101 : 102 : // check if a option is set 103 2603875 : bool option_is_set(const AP_BattMonitor_Params::Options option) const { 104 2603875 : return (uint16_t(_params._options.get()) & uint16_t(option)) != 0; 105 : } 106 : 107 : #if AP_BATTERY_SCRIPTING_ENABLED 108 0 : virtual bool handle_scripting(const BattMonitorScript_State &battmon_state) { return false; } 109 : #endif 110 : 111 : // set battery BMS sleep timeout in seconds 112 : // set to zero to disable sleep 113 0 : virtual void set_sleep_timeout(uint16_t timeout_sec) {} 114 : 115 : protected: 116 : AP_BattMonitor &_mon; // reference to front-end 117 : AP_BattMonitor::BattMonitor_State &_state; // reference to this instances state (held in the front-end) 118 : AP_BattMonitor_Params &_params; // reference to this instances parameters (held in the front-end) 119 : 120 : // checks what failsafes could be triggered 121 : void check_failsafe_types(bool &low_voltage, bool &low_capacity, bool &critical_voltage, bool &critical_capacity) const; 122 : void update_consumed(AP_BattMonitor::BattMonitor_State &state, uint32_t dt_us); 123 : 124 : private: 125 : // resistance estimate 126 : uint32_t _resistance_timer_ms; // system time of last resistance estimate update 127 : float _voltage_filt; // filtered voltage 128 : float _current_max_amps; // maximum current since start-up 129 : float _current_filt_amps; // filtered current 130 : float _resistance_voltage_ref; // voltage used for maximum resistance calculation 131 : float _resistance_current_ref; // current used for maximum resistance calculation 132 : }; 133 : 134 : #if AP_BATTERY_SCRIPTING_ENABLED 135 : struct BattMonitorScript_State { 136 : float voltage; // Battery voltage in volts 137 : bool healthy; // True if communicating properly 138 : uint8_t cell_count; // Number of valid cells in state 139 : uint8_t capacity_remaining_pct=UINT8_MAX; // Remaining battery capacity in percent, 255 for invalid 140 : uint8_t state_of_health_pct=UINT8_MAX; // Remaining battery health in percent, 255 for invalid 141 : uint16_t cell_voltages[32]; // allow script to have up to 32 cells, will be limited internally 142 : uint16_t cycle_count=UINT16_MAX; // Battery cycle count, 65535 for unavailable 143 : /* 144 : all of the following float variables should be set to NaN by the 145 : script if they are not known. 146 : consumed_mah will auto-integrate if set to NaN 147 : */ 148 : float current_amps=nanf(""); // Battery current in amperes 149 : float consumed_mah=nanf(""); // Total current drawn since start-up in milliampere hours 150 : float consumed_wh=nanf(""); // Total energy drawn since start-up in watt hours 151 : float temperature=nanf(""); // Battery temperature in degrees Celsius 152 : }; 153 : #endif // AP_BATTERY_SCRIPTING_ENABLED 154 : 155 : #endif // AP_BATTERY_ENABLED