mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-02 20:28:37 +08:00
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:
@@ -406,7 +406,7 @@ Syslink::handle_message(syslink_message_t *msg)
|
|||||||
|
|
||||||
_battery.setConnected(true);
|
_battery.setConnected(true);
|
||||||
_battery.updateVoltage(vbat);
|
_battery.updateVoltage(vbat);
|
||||||
_battery.updateBatteryStatus(t);
|
_battery.updateAndPublishBatteryStatus(t);
|
||||||
|
|
||||||
// Update battery charge state
|
// Update battery charge state
|
||||||
if (charging) {
|
if (charging) {
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ INA226::INA226(const I2CSPIDriverConfig &config, int battery_index) :
|
|||||||
_battery.setConnected(false);
|
_battery.setConnected(false);
|
||||||
_battery.updateVoltage(0.f);
|
_battery.updateVoltage(0.f);
|
||||||
_battery.updateCurrent(0.f);
|
_battery.updateCurrent(0.f);
|
||||||
_battery.updateBatteryStatus(hrt_absolute_time());
|
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
|
||||||
}
|
}
|
||||||
|
|
||||||
INA226::~INA226()
|
INA226::~INA226()
|
||||||
@@ -229,7 +229,7 @@ INA226::collect()
|
|||||||
_battery.setConnected(success);
|
_battery.setConnected(success);
|
||||||
_battery.updateVoltage(static_cast<float>(_bus_voltage * INA226_VSCALE));
|
_battery.updateVoltage(static_cast<float>(_bus_voltage * INA226_VSCALE));
|
||||||
_battery.updateCurrent(static_cast<float>(_current * _current_lsb));
|
_battery.updateCurrent(static_cast<float>(_current * _current_lsb));
|
||||||
_battery.updateBatteryStatus(hrt_absolute_time());
|
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
|
||||||
|
|
||||||
perf_end(_sample_perf);
|
perf_end(_sample_perf);
|
||||||
|
|
||||||
@@ -295,7 +295,7 @@ INA226::RunImpl()
|
|||||||
_battery.setConnected(false);
|
_battery.setConnected(false);
|
||||||
_battery.updateVoltage(0.f);
|
_battery.updateVoltage(0.f);
|
||||||
_battery.updateCurrent(0.f);
|
_battery.updateCurrent(0.f);
|
||||||
_battery.updateBatteryStatus(hrt_absolute_time());
|
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
|
||||||
|
|
||||||
if (init() != PX4_OK) {
|
if (init() != PX4_OK) {
|
||||||
ScheduleDelayed(INA226_INIT_RETRY_INTERVAL_US);
|
ScheduleDelayed(INA226_INIT_RETRY_INTERVAL_US);
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ INA228::INA228(const I2CSPIDriverConfig &config, int battery_index) :
|
|||||||
_battery.setConnected(false);
|
_battery.setConnected(false);
|
||||||
_battery.updateVoltage(0.f);
|
_battery.updateVoltage(0.f);
|
||||||
_battery.updateCurrent(0.f);
|
_battery.updateCurrent(0.f);
|
||||||
_battery.updateBatteryStatus(hrt_absolute_time());
|
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
|
||||||
}
|
}
|
||||||
|
|
||||||
INA228::~INA228()
|
INA228::~INA228()
|
||||||
@@ -310,7 +310,7 @@ INA228::collect()
|
|||||||
_battery.setConnected(success);
|
_battery.setConnected(success);
|
||||||
_battery.updateVoltage(static_cast<float>(_bus_voltage * INA228_VSCALE));
|
_battery.updateVoltage(static_cast<float>(_bus_voltage * INA228_VSCALE));
|
||||||
_battery.updateCurrent(static_cast<float>(_current * _current_lsb));
|
_battery.updateCurrent(static_cast<float>(_current * _current_lsb));
|
||||||
_battery.updateBatteryStatus(hrt_absolute_time());
|
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
|
||||||
|
|
||||||
perf_end(_sample_perf);
|
perf_end(_sample_perf);
|
||||||
|
|
||||||
@@ -376,7 +376,7 @@ INA228::RunImpl()
|
|||||||
_battery.setConnected(false);
|
_battery.setConnected(false);
|
||||||
_battery.updateVoltage(0.f);
|
_battery.updateVoltage(0.f);
|
||||||
_battery.updateCurrent(0.f);
|
_battery.updateCurrent(0.f);
|
||||||
_battery.updateBatteryStatus(hrt_absolute_time());
|
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
|
||||||
|
|
||||||
if (init() != PX4_OK) {
|
if (init() != PX4_OK) {
|
||||||
ScheduleDelayed(INA228_INIT_RETRY_INTERVAL_US);
|
ScheduleDelayed(INA228_INIT_RETRY_INTERVAL_US);
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ INA238::INA238(const I2CSPIDriverConfig &config, int battery_index) :
|
|||||||
_battery.setConnected(false);
|
_battery.setConnected(false);
|
||||||
_battery.updateVoltage(0.f);
|
_battery.updateVoltage(0.f);
|
||||||
_battery.updateCurrent(0.f);
|
_battery.updateCurrent(0.f);
|
||||||
_battery.updateBatteryStatus(hrt_absolute_time());
|
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
|
||||||
}
|
}
|
||||||
|
|
||||||
INA238::~INA238()
|
INA238::~INA238()
|
||||||
@@ -197,7 +197,7 @@ int INA238::collect()
|
|||||||
_battery.setConnected(success);
|
_battery.setConnected(success);
|
||||||
_battery.updateVoltage(static_cast<float>(bus_voltage * INA238_VSCALE));
|
_battery.updateVoltage(static_cast<float>(bus_voltage * INA238_VSCALE));
|
||||||
_battery.updateCurrent(static_cast<float>(current * _current_lsb));
|
_battery.updateCurrent(static_cast<float>(current * _current_lsb));
|
||||||
_battery.updateBatteryStatus(hrt_absolute_time());
|
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
|
||||||
|
|
||||||
perf_end(_sample_perf);
|
perf_end(_sample_perf);
|
||||||
|
|
||||||
@@ -254,7 +254,7 @@ void INA238::RunImpl()
|
|||||||
_battery.setConnected(false);
|
_battery.setConnected(false);
|
||||||
_battery.updateVoltage(0.f);
|
_battery.updateVoltage(0.f);
|
||||||
_battery.updateCurrent(0.f);
|
_battery.updateCurrent(0.f);
|
||||||
_battery.updateBatteryStatus(hrt_absolute_time());
|
_battery.updateAndPublishBatteryStatus(hrt_absolute_time());
|
||||||
|
|
||||||
if (init() != PX4_OK) {
|
if (init() != PX4_OK) {
|
||||||
ScheduleDelayed(INA238_INIT_RETRY_INTERVAL_US);
|
ScheduleDelayed(INA238_INIT_RETRY_INTERVAL_US);
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ VOXLPM::init()
|
|||||||
_battery.setConnected(false);
|
_battery.setConnected(false);
|
||||||
_battery.updateVoltage(0.f);
|
_battery.updateVoltage(0.f);
|
||||||
_battery.updateCurrent(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 */
|
/* 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.setConnected(true);
|
||||||
_battery.updateVoltage(_voltage);
|
_battery.updateVoltage(_voltage);
|
||||||
_battery.updateCurrent(_amperage);
|
_battery.updateCurrent(_amperage);
|
||||||
_battery.updateBatteryStatus(tnow);
|
_battery.updateAndPublishBatteryStatus(tnow);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fallthrough
|
// fallthrough
|
||||||
@@ -371,7 +371,7 @@ VOXLPM::measure()
|
|||||||
_battery.setConnected(true);
|
_battery.setConnected(true);
|
||||||
_battery.updateVoltage(0.f);
|
_battery.updateVoltage(0.f);
|
||||||
_battery.updateCurrent(0.f);
|
_battery.updateCurrent(0.f);
|
||||||
_battery.updateBatteryStatus(tnow);
|
_battery.updateAndPublishBatteryStatus(tnow);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -130,7 +130,10 @@ void Battery::updateBatteryStatus(const hrt_abstime ×tamp)
|
|||||||
} else {
|
} else {
|
||||||
_connected = false;
|
_connected = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
battery_status_s Battery::getBatteryStatus()
|
||||||
|
{
|
||||||
battery_status_s battery_status{};
|
battery_status_s battery_status{};
|
||||||
battery_status.voltage_v = _voltage_v;
|
battery_status.voltage_v = _voltage_v;
|
||||||
battery_status.voltage_filtered_v = _voltage_filter_v.getState();
|
battery_status.voltage_filtered_v = _voltage_filter_v.getState();
|
||||||
@@ -149,13 +152,23 @@ void Battery::updateBatteryStatus(const hrt_abstime ×tamp)
|
|||||||
battery_status.capacity = _params.capacity > 0.f ? static_cast<uint16_t>(_params.capacity) : 0;
|
battery_status.capacity = _params.capacity > 0.f ? static_cast<uint16_t>(_params.capacity) : 0;
|
||||||
battery_status.id = static_cast<uint8_t>(_index);
|
battery_status.id = static_cast<uint8_t>(_index);
|
||||||
battery_status.warning = _warning;
|
battery_status.warning = _warning;
|
||||||
|
|
||||||
if (_source == _params.source) {
|
|
||||||
battery_status.timestamp = hrt_absolute_time();
|
battery_status.timestamp = hrt_absolute_time();
|
||||||
|
return battery_status;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Battery::publishBatteryStatus(const battery_status_s &battery_status)
|
||||||
|
{
|
||||||
|
if (_source == _params.source) {
|
||||||
_battery_status_pub.publish(battery_status);
|
_battery_status_pub.publish(battery_status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Battery::updateAndPublishBatteryStatus(const hrt_abstime ×tamp)
|
||||||
|
{
|
||||||
|
updateBatteryStatus(timestamp);
|
||||||
|
publishBatteryStatus(getBatteryStatus());
|
||||||
|
}
|
||||||
|
|
||||||
void Battery::sumDischarged(const hrt_abstime ×tamp, float current_a)
|
void Battery::sumDischarged(const hrt_abstime ×tamp, float current_a)
|
||||||
{
|
{
|
||||||
// Not a valid measurement
|
// Not a valid measurement
|
||||||
|
|||||||
@@ -97,6 +97,16 @@ public:
|
|||||||
*/
|
*/
|
||||||
void updateBatteryStatus(const hrt_abstime ×tamp);
|
void updateBatteryStatus(const hrt_abstime ×tamp);
|
||||||
|
|
||||||
|
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 ×tamp);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct {
|
struct {
|
||||||
param_t v_empty;
|
param_t v_empty;
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ AnalogBattery::updateBatteryStatusADC(hrt_abstime timestamp, float voltage_raw,
|
|||||||
Battery::setConnected(connected);
|
Battery::setConnected(connected);
|
||||||
Battery::updateVoltage(voltage_v);
|
Battery::updateVoltage(voltage_v);
|
||||||
Battery::updateCurrent(current_a);
|
Battery::updateCurrent(current_a);
|
||||||
Battery::updateBatteryStatus(timestamp);
|
Battery::updateAndPublishBatteryStatus(timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AnalogBattery::is_valid()
|
bool AnalogBattery::is_valid()
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ EscBattery::Run()
|
|||||||
_battery.setConnected(true);
|
_battery.setConnected(true);
|
||||||
_battery.updateVoltage(average_voltage_v);
|
_battery.updateVoltage(average_voltage_v);
|
||||||
_battery.updateCurrent(total_current_a);
|
_battery.updateCurrent(total_current_a);
|
||||||
_battery.updateBatteryStatus(esc_status.timestamp);
|
_battery.updateAndPublishBatteryStatus(esc_status.timestamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ void BatterySimulator::Run()
|
|||||||
_battery.setConnected(true);
|
_battery.setConnected(true);
|
||||||
_battery.updateVoltage(vbatt);
|
_battery.updateVoltage(vbatt);
|
||||||
_battery.updateCurrent(ibatt);
|
_battery.updateCurrent(ibatt);
|
||||||
_battery.updateBatteryStatus(now_us);
|
_battery.updateAndPublishBatteryStatus(now_us);
|
||||||
|
|
||||||
perf_end(_loop_perf);
|
perf_end(_loop_perf);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user