mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-18 06:38:29 -04:00
AP_BattMonitor: add scripting backend
AP_BattMonitor_Scripting: whitespace consistency
This commit is contained in:
parent
0cf616044c
commit
fd855781d8
@ -21,6 +21,7 @@
|
|||||||
#include "AP_BattMonitor_FuelLevel_Analog.h"
|
#include "AP_BattMonitor_FuelLevel_Analog.h"
|
||||||
#include "AP_BattMonitor_Synthetic_Current.h"
|
#include "AP_BattMonitor_Synthetic_Current.h"
|
||||||
#include "AP_BattMonitor_AD7091R5.h"
|
#include "AP_BattMonitor_AD7091R5.h"
|
||||||
|
#include "AP_BattMonitor_Scripting.h"
|
||||||
|
|
||||||
#include <AP_HAL/AP_HAL.h>
|
#include <AP_HAL/AP_HAL.h>
|
||||||
|
|
||||||
@ -560,6 +561,11 @@ AP_BattMonitor::init()
|
|||||||
drivers[instance] = new AP_BattMonitor_AD7091R5(*this, state[instance], _params[instance]);
|
drivers[instance] = new AP_BattMonitor_AD7091R5(*this, state[instance], _params[instance]);
|
||||||
break;
|
break;
|
||||||
#endif// AP_BATTERY_AD7091R5_ENABLED
|
#endif// AP_BATTERY_AD7091R5_ENABLED
|
||||||
|
#if AP_BATTERY_SCRIPTING_ENABLED
|
||||||
|
case Type::Scripting:
|
||||||
|
drivers[instance] = new AP_BattMonitor_Scripting(*this, state[instance], _params[instance]);
|
||||||
|
break;
|
||||||
|
#endif // AP_BATTERY_SCRIPTING_ENABLED
|
||||||
case Type::NONE:
|
case Type::NONE:
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -1081,6 +1087,19 @@ bool AP_BattMonitor::healthy() const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if AP_BATTERY_SCRIPTING_ENABLED
|
||||||
|
/*
|
||||||
|
handle state update from a lua script
|
||||||
|
*/
|
||||||
|
bool AP_BattMonitor::handle_scripting(uint8_t idx, const BattMonitorScript_State &_state)
|
||||||
|
{
|
||||||
|
if (idx >= _num_instances) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return drivers[idx]->handle_scripting(_state);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace AP {
|
namespace AP {
|
||||||
|
|
||||||
AP_BattMonitor &battery()
|
AP_BattMonitor &battery()
|
||||||
|
@ -45,6 +45,7 @@ class AP_BattMonitor_LTC2946;
|
|||||||
class AP_BattMonitor_Torqeedo;
|
class AP_BattMonitor_Torqeedo;
|
||||||
class AP_BattMonitor_FuelLevel_Analog;
|
class AP_BattMonitor_FuelLevel_Analog;
|
||||||
class AP_BattMonitor_EFI;
|
class AP_BattMonitor_EFI;
|
||||||
|
class AP_BattMonitor_Scripting;
|
||||||
|
|
||||||
|
|
||||||
class AP_BattMonitor
|
class AP_BattMonitor
|
||||||
@ -70,6 +71,7 @@ class AP_BattMonitor
|
|||||||
friend class AP_BattMonitor_Torqeedo;
|
friend class AP_BattMonitor_Torqeedo;
|
||||||
friend class AP_BattMonitor_FuelLevel_Analog;
|
friend class AP_BattMonitor_FuelLevel_Analog;
|
||||||
friend class AP_BattMonitor_Synthetic_Current;
|
friend class AP_BattMonitor_Synthetic_Current;
|
||||||
|
friend class AP_BattMonitor_Scripting;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -109,6 +111,7 @@ public:
|
|||||||
INA239_SPI = 26,
|
INA239_SPI = 26,
|
||||||
EFI = 27,
|
EFI = 27,
|
||||||
AD7091R5 = 28,
|
AD7091R5 = 28,
|
||||||
|
Scripting = 29,
|
||||||
};
|
};
|
||||||
|
|
||||||
FUNCTOR_TYPEDEF(battery_failsafe_handler_fn_t, void, const char *, const int8_t);
|
FUNCTOR_TYPEDEF(battery_failsafe_handler_fn_t, void, const char *, const int8_t);
|
||||||
@ -273,6 +276,10 @@ public:
|
|||||||
|
|
||||||
static const struct AP_Param::GroupInfo var_info[];
|
static const struct AP_Param::GroupInfo var_info[];
|
||||||
|
|
||||||
|
#if AP_BATTERY_SCRIPTING_ENABLED
|
||||||
|
bool handle_scripting(uint8_t idx, const struct BattMonitorScript_State &state);
|
||||||
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/// parameters
|
/// parameters
|
||||||
|
@ -63,7 +63,7 @@ public:
|
|||||||
float voltage_resting_estimate() const;
|
float voltage_resting_estimate() const;
|
||||||
|
|
||||||
// update battery resistance estimate and voltage_resting_estimate
|
// update battery resistance estimate and voltage_resting_estimate
|
||||||
void update_resistance_estimate();
|
virtual void update_resistance_estimate();
|
||||||
|
|
||||||
// updates failsafe timers, and returns what failsafes are active
|
// updates failsafe timers, and returns what failsafes are active
|
||||||
virtual AP_BattMonitor::Failsafe update_failsafes(void);
|
virtual AP_BattMonitor::Failsafe update_failsafes(void);
|
||||||
@ -95,6 +95,10 @@ public:
|
|||||||
bool option_is_set(const AP_BattMonitor_Params::Options option) const {
|
bool option_is_set(const AP_BattMonitor_Params::Options option) const {
|
||||||
return (uint16_t(_params._options.get()) & uint16_t(option)) != 0;
|
return (uint16_t(_params._options.get()) & uint16_t(option)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if AP_BATTERY_SCRIPTING_ENABLED
|
||||||
|
virtual bool handle_scripting(const BattMonitorScript_State &battmon_state) { return false; }
|
||||||
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
AP_BattMonitor &_mon; // reference to front-end
|
AP_BattMonitor &_mon; // reference to front-end
|
||||||
@ -114,3 +118,23 @@ private:
|
|||||||
float _resistance_voltage_ref; // voltage used for maximum resistance calculation
|
float _resistance_voltage_ref; // voltage used for maximum resistance calculation
|
||||||
float _resistance_current_ref; // current used for maximum resistance calculation
|
float _resistance_current_ref; // current used for maximum resistance calculation
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if AP_BATTERY_SCRIPTING_ENABLED
|
||||||
|
struct BattMonitorScript_State {
|
||||||
|
float voltage; // Battery voltage in volts
|
||||||
|
bool healthy; // True if communicating properly
|
||||||
|
uint8_t cell_count; // Number of valid cells in state
|
||||||
|
uint8_t capacity_remaining_pct=UINT8_MAX; // Remaining battery capacity in percent, 255 for invalid
|
||||||
|
uint16_t cell_voltages[32]; // allow script to have up to 32 cells, will be limited internally
|
||||||
|
uint16_t cycle_count=UINT16_MAX; // Battery cycle count, 65535 for unavailable
|
||||||
|
/*
|
||||||
|
all of the following float variables should be set to NaN by the
|
||||||
|
script if they are not known.
|
||||||
|
consumed_mah will auto-integrate if set to NaN
|
||||||
|
*/
|
||||||
|
float current_amps=nanf(""); // Battery current in amperes
|
||||||
|
float consumed_mah=nanf(""); // Total current drawn since start-up in milliampere hours
|
||||||
|
float consumed_wh=nanf(""); // Total energy drawn since start-up in watt hours
|
||||||
|
float temperature=nanf(""); // Battery temperature in degrees Celsius
|
||||||
|
};
|
||||||
|
#endif // AP_BATTERY_SCRIPTING_ENABLED
|
||||||
|
@ -17,7 +17,7 @@ const AP_Param::GroupInfo AP_BattMonitor_Params::var_info[] = {
|
|||||||
// @Param: MONITOR
|
// @Param: MONITOR
|
||||||
// @DisplayName: Battery monitoring
|
// @DisplayName: Battery monitoring
|
||||||
// @Description: Controls enabling monitoring of the battery's voltage and current
|
// @Description: Controls enabling monitoring of the battery's voltage and current
|
||||||
// @Values: 0:Disabled,3:Analog Voltage Only,4:Analog Voltage and Current,5:Solo,6:Bebop,7:SMBus-Generic,8:DroneCAN-BatteryInfo,9:ESC,10:Sum Of Selected Monitors,11:FuelFlow,12:FuelLevelPWM,13:SMBUS-SUI3,14:SMBUS-SUI6,15:NeoDesign,16:SMBus-Maxell,17:Generator-Elec,18:Generator-Fuel,19:Rotoye,20:MPPT,21:INA2XX,22:LTC2946,23:Torqeedo,24:FuelLevelAnalog,25:Synthetic Current and Analog Voltage,26:INA239_SPI,27:EFI,28:AD7091R5
|
// @Values: 0:Disabled,3:Analog Voltage Only,4:Analog Voltage and Current,5:Solo,6:Bebop,7:SMBus-Generic,8:DroneCAN-BatteryInfo,9:ESC,10:Sum Of Selected Monitors,11:FuelFlow,12:FuelLevelPWM,13:SMBUS-SUI3,14:SMBUS-SUI6,15:NeoDesign,16:SMBus-Maxell,17:Generator-Elec,18:Generator-Fuel,19:Rotoye,20:MPPT,21:INA2XX,22:LTC2946,23:Torqeedo,24:FuelLevelAnalog,25:Synthetic Current and Analog Voltage,26:INA239_SPI,27:EFI,28:AD7091R5,29:Scripting
|
||||||
// @User: Standard
|
// @User: Standard
|
||||||
// @RebootRequired: True
|
// @RebootRequired: True
|
||||||
AP_GROUPINFO_FLAGS("MONITOR", 1, AP_BattMonitor_Params, _type, int8_t(AP_BattMonitor::Type::NONE), AP_PARAM_FLAG_ENABLE),
|
AP_GROUPINFO_FLAGS("MONITOR", 1, AP_BattMonitor_Params, _type, int8_t(AP_BattMonitor::Type::NONE), AP_PARAM_FLAG_ENABLE),
|
||||||
|
84
libraries/AP_BattMonitor/AP_BattMonitor_Scripting.cpp
Normal file
84
libraries/AP_BattMonitor/AP_BattMonitor_Scripting.cpp
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
#include "AP_BattMonitor_Scripting.h"
|
||||||
|
|
||||||
|
#if AP_BATTERY_SCRIPTING_ENABLED
|
||||||
|
|
||||||
|
#define AP_BATT_MONITOR_SCRIPTING_TIMEOUT_US 5000000
|
||||||
|
|
||||||
|
bool AP_BattMonitor_Scripting::capacity_remaining_pct(uint8_t &percentage) const
|
||||||
|
{
|
||||||
|
if (internal_state.capacity_remaining_pct != UINT8_MAX) {
|
||||||
|
percentage = internal_state.capacity_remaining_pct;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// Fall back to default implementation
|
||||||
|
return AP_BattMonitor_Backend::capacity_remaining_pct(percentage);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AP_BattMonitor_Scripting::get_cycle_count(uint16_t &cycles) const
|
||||||
|
{
|
||||||
|
if (internal_state.cycle_count == UINT16_MAX) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
cycles = internal_state.cycle_count;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called by frontend to update the state. Called at 10Hz
|
||||||
|
void AP_BattMonitor_Scripting::read()
|
||||||
|
{
|
||||||
|
WITH_SEMAPHORE(sem);
|
||||||
|
|
||||||
|
// Check for timeout, to prevent a faulty script from appearing healthy
|
||||||
|
if (last_update_us == 0 || AP_HAL::micros() - last_update_us > AP_BATT_MONITOR_SCRIPTING_TIMEOUT_US) {
|
||||||
|
_state.healthy = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_state.last_time_micros == last_update_us) {
|
||||||
|
// No new data
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
the script can fill in voltages up to 32 cells, for mavlink reporting
|
||||||
|
the extra cell voltages get distributed over the max of 14 for mavlink
|
||||||
|
*/
|
||||||
|
for (uint8_t i = 0; i < MIN(AP_BATT_MONITOR_CELLS_MAX,internal_state.cell_count); i++) {
|
||||||
|
_state.cell_voltages.cells[i] = internal_state.cell_voltages[i];
|
||||||
|
}
|
||||||
|
_state.voltage = internal_state.voltage;
|
||||||
|
if (!isnan(internal_state.current_amps)) {
|
||||||
|
_state.current_amps = internal_state.current_amps;
|
||||||
|
}
|
||||||
|
if (!isnan(internal_state.consumed_mah)) {
|
||||||
|
_state.consumed_mah = internal_state.consumed_mah;
|
||||||
|
}
|
||||||
|
// Overide integrated consumed energy with script value if it has been set
|
||||||
|
if (!isnan(internal_state.consumed_wh)) {
|
||||||
|
_state.consumed_wh = internal_state.consumed_wh;
|
||||||
|
}
|
||||||
|
if (!isnan(internal_state.temperature)) {
|
||||||
|
_state.temperature = internal_state.temperature;
|
||||||
|
}
|
||||||
|
|
||||||
|
_state.healthy = internal_state.healthy;
|
||||||
|
|
||||||
|
// Update the timestamp (has to be done after the consumed_mah calculation)
|
||||||
|
_state.last_time_micros = last_update_us;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AP_BattMonitor_Scripting::handle_scripting(const BattMonitorScript_State &battmon_state)
|
||||||
|
{
|
||||||
|
WITH_SEMAPHORE(sem);
|
||||||
|
internal_state = battmon_state;
|
||||||
|
const uint32_t now_us = AP_HAL::micros();
|
||||||
|
uint32_t dt_us = now_us - last_update_us;
|
||||||
|
if (last_update_us != 0 && !isnan(internal_state.current_amps) && isnan(internal_state.consumed_mah)) {
|
||||||
|
AP_BattMonitor_Backend::update_consumed(_state, dt_us);
|
||||||
|
}
|
||||||
|
last_update_us = now_us;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // AP_BATTERY_SCRIPTING_ENABLED
|
||||||
|
|
32
libraries/AP_BattMonitor/AP_BattMonitor_Scripting.h
Normal file
32
libraries/AP_BattMonitor/AP_BattMonitor_Scripting.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "AP_BattMonitor_Backend.h"
|
||||||
|
|
||||||
|
#if AP_BATTERY_SCRIPTING_ENABLED
|
||||||
|
|
||||||
|
class AP_BattMonitor_Scripting : public AP_BattMonitor_Backend
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// Inherit constructor
|
||||||
|
using AP_BattMonitor_Backend::AP_BattMonitor_Backend;
|
||||||
|
|
||||||
|
bool has_current() const override { return last_update_us != 0 && !isnan(internal_state.current_amps); }
|
||||||
|
bool has_consumed_energy() const override { return has_current(); }
|
||||||
|
bool has_cell_voltages() const override { return internal_state.cell_count > 0; }
|
||||||
|
bool has_temperature() const override { return last_update_us != 0 && !isnan(internal_state.temperature); }
|
||||||
|
bool capacity_remaining_pct(uint8_t &percentage) const override;
|
||||||
|
bool get_cycle_count(uint16_t &cycles) const override;
|
||||||
|
|
||||||
|
void read() override;
|
||||||
|
|
||||||
|
bool handle_scripting(const BattMonitorScript_State &battmon_state) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
BattMonitorScript_State internal_state;
|
||||||
|
uint32_t last_update_us;
|
||||||
|
|
||||||
|
HAL_Semaphore sem;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // AP_BATTMONITOR_SCRIPTING_ENABLED
|
||||||
|
|
@ -116,3 +116,6 @@
|
|||||||
#define AP_BATTERY_SMBUS_ROTOYE_ENABLED AP_BATTERY_SMBUS_GENERIC_ENABLED
|
#define AP_BATTERY_SMBUS_ROTOYE_ENABLED AP_BATTERY_SMBUS_GENERIC_ENABLED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef AP_BATTERY_SCRIPTING_ENABLED
|
||||||
|
#define AP_BATTERY_SCRIPTING_ENABLED (AP_SCRIPTING_ENABLED && AP_BATTERY_BACKEND_DEFAULT_ENABLED)
|
||||||
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user