feat(battery): add fault flag bitmask helpers and improve computeMaxCellVoltageDelta function

This commit is contained in:
Claudio Chies
2026-09-10 13:35:52 +02:00
committed by Claudio Chies
parent 8f83e8e311
commit adde4b1039
2 changed files with 31 additions and 12 deletions
+25 -12
View File
@@ -37,6 +37,19 @@
#include <px4_defines.h>
#include <px4_platform_common/log.h>
// Pre-shifted bitmask helpers for battery_status_s fault flags.
#define FAULT_DEEP_DISCHARGE_FLAG (1 << battery_status_s::FAULT_DEEP_DISCHARGE)
#define FAULT_SPIKES_FLAG (1 << battery_status_s::FAULT_SPIKES)
#define FAULT_CELL_FAIL_FLAG (1 << battery_status_s::FAULT_CELL_FAIL)
#define FAULT_OVER_CURRENT_FLAG (1 << battery_status_s::FAULT_OVER_CURRENT)
#define FAULT_OVER_TEMPERATURE_FLAG (1 << battery_status_s::FAULT_OVER_TEMPERATURE)
#define FAULT_UNDER_TEMPERATURE_FLAG (1 << battery_status_s::FAULT_UNDER_TEMPERATURE)
#define FAULT_INCOMPATIBLE_VOLTAGE_FLAG (1 << battery_status_s::FAULT_INCOMPATIBLE_VOLTAGE)
#define FAULT_INCOMPATIBLE_FIRMWARE_FLAG (1 << battery_status_s::FAULT_INCOMPATIBLE_FIRMWARE)
#define FAULT_INCOMPATIBLE_MODEL_FLAG (1 << battery_status_s::FAULT_INCOMPATIBLE_MODEL)
#define FAULT_HARDWARE_FAILURE_FLAG (1 << battery_status_s::FAULT_HARDWARE_FAILURE)
#define FAULT_FAILED_TO_ARM_FLAG (1 << battery_status_s::FAULT_FAILED_TO_ARM)
const char *const UavcanBatteryBridge::NAME = "battery";
void UavcanBatteryBridge::publishBattery(int node_id, uint8_t instance)
@@ -315,19 +328,19 @@ void UavcanBatteryBridge::cbat_sub_cb(const uavcan::ReceivedDataStructure<cuav::
uint16_t faults = 0;
if (msg.status_flags & cuav::equipment::power::CBAT::STATUS_FLAG_OVERLOAD) {
faults |= (1 << battery_status_s::FAULT_OVER_CURRENT);
faults |= FAULT_OVER_CURRENT_FLAG;
}
if (msg.status_flags & cuav::equipment::power::CBAT::STATUS_FLAG_BAD_BATTERY) {
faults |= (1 << battery_status_s::FAULT_HARDWARE_FAILURE);
faults |= FAULT_HARDWARE_FAILURE_FLAG;
}
if (msg.status_flags & cuav::equipment::power::CBAT::STATUS_FLAG_TEMP_HOT) {
faults |= (1 << battery_status_s::FAULT_OVER_TEMPERATURE);
faults |= FAULT_OVER_TEMPERATURE_FLAG;
}
if (msg.status_flags & cuav::equipment::power::CBAT::STATUS_FLAG_TEMP_COLD) {
faults |= (1 << battery_status_s::FAULT_UNDER_TEMPERATURE);
faults |= FAULT_UNDER_TEMPERATURE_FLAG;
}
_battery_status[instance].faults = faults;
@@ -393,38 +406,38 @@ UavcanBatteryBridge::battery_continuous_sub_cb(const uavcan::ReceivedDataStructu
uint16_t faults = 0;
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_OVER_CURRENT) {
faults |= (1 << battery_status_s::FAULT_OVER_CURRENT);
faults |= FAULT_OVER_CURRENT_FLAG;
}
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_OVER_TEMP) {
faults |= (1 << battery_status_s::FAULT_OVER_TEMPERATURE);
faults |= FAULT_OVER_TEMPERATURE_FLAG;
}
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_UNDER_TEMP) {
faults |= (1 << battery_status_s::FAULT_UNDER_TEMPERATURE);
faults |= FAULT_UNDER_TEMPERATURE_FLAG;
}
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_INCOMPATIBLE_VOLTAGE) {
faults |= (1 << battery_status_s::FAULT_INCOMPATIBLE_VOLTAGE);
faults |= FAULT_INCOMPATIBLE_VOLTAGE_FLAG;
}
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_INCOMPATIBLE_FIRMWARE) {
faults |= (1 << battery_status_s::FAULT_INCOMPATIBLE_FIRMWARE);
faults |= FAULT_INCOMPATIBLE_FIRMWARE_FLAG;
}
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_INCOMPATIBLE_CELLS_CONFIGURATION) {
faults |= (1 << battery_status_s::FAULT_INCOMPATIBLE_MODEL);
faults |= FAULT_INCOMPATIBLE_MODEL_FLAG;
}
if (msg.status_flags & (BatteryContinuous::STATUS_FLAG_FAULT_SHORT_CIRCUIT
| BatteryContinuous::STATUS_FLAG_FAULT_PROTECTION_SYSTEM
| BatteryContinuous::STATUS_FLAG_FAULT_CELL_IMBALANCE
| BatteryContinuous::STATUS_FLAG_BAD_BATTERY)) {
faults |= (1 << battery_status_s::FAULT_HARDWARE_FAILURE);
faults |= FAULT_HARDWARE_FAILURE_FLAG;
}
if (msg.status_flags & BatteryContinuous::STATUS_FLAG_FAULT_UNDER_VOLT) {
faults |= (1 << battery_status_s::FAULT_DEEP_DISCHARGE);
faults |= FAULT_DEEP_DISCHARGE_FLAG;
}
_battery_status[instance].faults = faults;
+6
View File
@@ -389,8 +389,14 @@ void Battery::computeScale()
}
}
// Returns the voltage spread across cells: max(cell_v) - min(cell_v).
// Only cells with a positive voltage are considered; cells reporting 0 V are
// treated as absent.
// Returns 0 if fewer than two valid cells are present.
float Battery::computeMaxCellVoltageDelta(const float *cells, size_t n)
{
if (cells == nullptr) { return 0.0; }
float v_min = FLT_MAX;
float v_max = 0.f;