battery: separate out publishing from updating

to allow smart battery drivers to use the battery class and
filling in additional information in case it makes sense.
This commit is contained in:
Matthias Grob 2021-12-01 18:34:26 +01:00
parent e70d70468a
commit fdc40880d0
10 changed files with 40 additions and 17 deletions

View File

@ -406,7 +406,7 @@ Syslink::handle_message(syslink_message_t *msg)
_battery.setConnected(true);
_battery.updateVoltage(vbat);
_battery.updateBatteryStatus(t);
_battery.updateAndPublishBatteryStatus(t);
// Update battery charge state
if (charging) {

View File

@ -86,7 +86,7 @@ INA226::INA226(const I2CSPIDriverConfig &config, int battery_index) :
_battery.setConnected(false);
_battery.updateVoltage(0.f);
_battery.updateCurrent(0.f);
_battery.updateBatteryStatus(hrt_absolute_time());
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
}
INA226::~INA226()
@ -229,7 +229,7 @@ INA226::collect()
_battery.setConnected(success);
_battery.updateVoltage(static_cast<float>(_bus_voltage * INA226_VSCALE));
_battery.updateCurrent(static_cast<float>(_current * _current_lsb));
_battery.updateBatteryStatus(hrt_absolute_time());
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
perf_end(_sample_perf);
@ -295,7 +295,7 @@ INA226::RunImpl()
_battery.setConnected(false);
_battery.updateVoltage(0.f);
_battery.updateCurrent(0.f);
_battery.updateBatteryStatus(hrt_absolute_time());
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
if (init() != PX4_OK) {
ScheduleDelayed(INA226_INIT_RETRY_INTERVAL_US);

View File

@ -88,7 +88,7 @@ INA228::INA228(const I2CSPIDriverConfig &config, int battery_index) :
_battery.setConnected(false);
_battery.updateVoltage(0.f);
_battery.updateCurrent(0.f);
_battery.updateBatteryStatus(hrt_absolute_time());
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
}
INA228::~INA228()
@ -310,7 +310,7 @@ INA228::collect()
_battery.setConnected(success);
_battery.updateVoltage(static_cast<float>(_bus_voltage * INA228_VSCALE));
_battery.updateCurrent(static_cast<float>(_current * _current_lsb));
_battery.updateBatteryStatus(hrt_absolute_time());
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
perf_end(_sample_perf);
@ -376,7 +376,7 @@ INA228::RunImpl()
_battery.setConnected(false);
_battery.updateVoltage(0.f);
_battery.updateCurrent(0.f);
_battery.updateBatteryStatus(hrt_absolute_time());
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
if (init() != PX4_OK) {
ScheduleDelayed(INA228_INIT_RETRY_INTERVAL_US);

View File

@ -71,7 +71,7 @@ INA238::INA238(const I2CSPIDriverConfig &config, int battery_index) :
_battery.setConnected(false);
_battery.updateVoltage(0.f);
_battery.updateCurrent(0.f);
_battery.updateBatteryStatus(hrt_absolute_time());
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
}
INA238::~INA238()
@ -197,7 +197,7 @@ int INA238::collect()
_battery.setConnected(success);
_battery.updateVoltage(static_cast<float>(bus_voltage * INA238_VSCALE));
_battery.updateCurrent(static_cast<float>(current * _current_lsb));
_battery.updateBatteryStatus(hrt_absolute_time());
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
perf_end(_sample_perf);
@ -254,7 +254,7 @@ void INA238::RunImpl()
_battery.setConnected(false);
_battery.updateVoltage(0.f);
_battery.updateCurrent(0.f);
_battery.updateBatteryStatus(hrt_absolute_time());
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
if (init() != PX4_OK) {
ScheduleDelayed(INA238_INIT_RETRY_INTERVAL_US);

View File

@ -74,7 +74,7 @@ VOXLPM::init()
_battery.setConnected(false);
_battery.updateVoltage(0.f);
_battery.updateCurrent(0.f);
_battery.updateBatteryStatus(hrt_absolute_time());
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
}
/* do I2C init, it will probe the bus for two possible configurations, LTC2946 or INA231 */
@ -345,7 +345,7 @@ VOXLPM::measure()
_battery.setConnected(true);
_battery.updateVoltage(_voltage);
_battery.updateCurrent(_amperage);
_battery.updateBatteryStatus(tnow);
_battery.updateAndPublishBatteryStatus(tnow);
}
// fallthrough
@ -371,7 +371,7 @@ VOXLPM::measure()
_battery.setConnected(true);
_battery.updateVoltage(0.f);
_battery.updateCurrent(0.f);
_battery.updateBatteryStatus(tnow);
_battery.updateAndPublishBatteryStatus(tnow);
}
break;

View File

@ -130,7 +130,10 @@ void Battery::updateBatteryStatus(const hrt_abstime &timestamp)
} else {
_connected = false;
}
}
battery_status_s Battery::getBatteryStatus()
{
battery_status_s battery_status{};
battery_status.voltage_v = _voltage_v;
battery_status.voltage_filtered_v = _voltage_filter_v.getState();
@ -149,13 +152,23 @@ void Battery::updateBatteryStatus(const hrt_abstime &timestamp)
battery_status.capacity = _params.capacity > 0.f ? static_cast<uint16_t>(_params.capacity) : 0;
battery_status.id = static_cast<uint8_t>(_index);
battery_status.warning = _warning;
battery_status.timestamp = hrt_absolute_time();
return battery_status;
}
void Battery::publishBatteryStatus(const battery_status_s &battery_status)
{
if (_source == _params.source) {
battery_status.timestamp = hrt_absolute_time();
_battery_status_pub.publish(battery_status);
}
}
void Battery::updateAndPublishBatteryStatus(const hrt_abstime &timestamp)
{
updateBatteryStatus(timestamp);
publishBatteryStatus(getBatteryStatus());
}
void Battery::sumDischarged(const hrt_abstime &timestamp, float current_a)
{
// Not a valid measurement

View File

@ -97,6 +97,16 @@ public:
*/
void updateBatteryStatus(const hrt_abstime &timestamp);
battery_status_s getBatteryStatus();
void publishBatteryStatus(const battery_status_s &battery_status);
/**
* Convenience function for combined update and publication
* @see updateBatteryStatus()
* @see publishBatteryStatus()
*/
void updateAndPublishBatteryStatus(const hrt_abstime &timestamp);
protected:
struct {
param_t v_empty;

View File

@ -83,7 +83,7 @@ AnalogBattery::updateBatteryStatusADC(hrt_abstime timestamp, float voltage_raw,
Battery::setConnected(connected);
Battery::updateVoltage(voltage_v);
Battery::updateCurrent(current_a);
Battery::updateBatteryStatus(timestamp);
Battery::updateAndPublishBatteryStatus(timestamp);
}
bool AnalogBattery::is_valid()

View File

@ -102,7 +102,7 @@ EscBattery::Run()
_battery.setConnected(true);
_battery.updateVoltage(average_voltage_v);
_battery.updateCurrent(total_current_a);
_battery.updateBatteryStatus(esc_status.timestamp);
_battery.updateAndPublishBatteryStatus(esc_status.timestamp);
}
}

View File

@ -102,7 +102,7 @@ void BatterySimulator::Run()
_battery.setConnected(true);
_battery.updateVoltage(vbatt);
_battery.updateCurrent(ibatt);
_battery.updateBatteryStatus(now_us);
_battery.updateAndPublishBatteryStatus(now_us);
perf_end(_loop_perf);
}