From 69bf24ad35c88ed0bbc5a3235d641f1ec48dd6db Mon Sep 17 00:00:00 2001 From: Gus Grubba Date: Mon, 2 Apr 2018 18:00:38 -0400 Subject: [PATCH] Support for low battery state (and remaining time) --- src/Vehicle/BatteryFact.json | 14 ++++++++++++++ src/Vehicle/Vehicle.cc | 20 ++++++++++++++++++++ src/Vehicle/Vehicle.h | 9 ++++++++- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/Vehicle/BatteryFact.json b/src/Vehicle/BatteryFact.json index 521443553..b80ab86f0 100644 --- a/src/Vehicle/BatteryFact.json +++ b/src/Vehicle/BatteryFact.json @@ -46,5 +46,19 @@ "type": "float", "decimalPlaces": 2, "units": "W" +}, +{ + "name": "timeRemaining", + "shortDescription": "Time Remaining", + "type": "int32", + "units": "s" +}, +{ + "name": "chargeState", + "shortDescription": "Charge State", + "type": "uint8", + "enumStrings": "Low Battery State Not Provided,Normal Operation,Low Battery State,Critical Battery State,Emergency Battery State,Battery Failed,Battery Unhealthy", + "enumValues": "0,1,2,3,4,5,6", + "decimalPlaces": 0 } ] diff --git a/src/Vehicle/Vehicle.cc b/src/Vehicle/Vehicle.cc index 7154e2496..9dd0585b3 100644 --- a/src/Vehicle/Vehicle.cc +++ b/src/Vehicle/Vehicle.cc @@ -1319,6 +1319,20 @@ void Vehicle::_handleBatteryStatus(mavlink_message_t& message) } _batteryFactGroup.cellCount()->setRawValue(cellCount); + + //-- Time remaining in seconds (0 means not supported) + _batteryFactGroup.timeRemaining()->setRawValue(bat_status.time_remaining); + //-- Battery charge state (0 means not supported) + if(bat_status.charge_state <= MAV_BATTERY_CHARGE_STATE_UNHEALTHY) { + _batteryFactGroup.chargeState()->setRawValue(bat_status.charge_state); + } else { + _batteryFactGroup.chargeState()->setRawValue(0); + } + //-- TODO: Somewhere, actions would be taken based on this chargeState: + // MAV_BATTERY_CHARGE_STATE_CRITICAL: Battery state is critical, return / abort immediately + // MAV_BATTERY_CHARGE_STATE_EMERGENCY: Battery state is too low for ordinary abortion, fastest possible emergency stop preventing damage + // MAV_BATTERY_CHARGE_STATE_FAILED: Battery failed, damage unavoidable + // MAV_BATTERY_CHARGE_STATE_UNHEALTHY: Battery is diagnosed to be broken or an error occurred, usage is discouraged / prohibited } void Vehicle::_setHomePosition(QGeoCoordinate& homeCoord) @@ -3247,6 +3261,8 @@ const char* VehicleBatteryFactGroup::_currentFactName = "cur const char* VehicleBatteryFactGroup::_temperatureFactName = "temperature"; const char* VehicleBatteryFactGroup::_cellCountFactName = "cellCount"; const char* VehicleBatteryFactGroup::_instantPowerFactName = "instantPower"; +const char* VehicleBatteryFactGroup::_timeRemainingFactName = "timeRemaining"; +const char* VehicleBatteryFactGroup::_chargeStateFactName = "chargeState"; const char* VehicleBatteryFactGroup::_settingsGroup = "Vehicle.battery"; @@ -3267,6 +3283,8 @@ VehicleBatteryFactGroup::VehicleBatteryFactGroup(QObject* parent) , _temperatureFact (0, _temperatureFactName, FactMetaData::valueTypeDouble) , _cellCountFact (0, _cellCountFactName, FactMetaData::valueTypeInt32) , _instantPowerFact (0, _instantPowerFactName, FactMetaData::valueTypeFloat) + , _timeRemainingFact (0, _timeRemainingFactName, FactMetaData::valueTypeInt32) + , _chargeStateFact (0, _chargeStateFactName, FactMetaData::valueTypeUint8) { _addFact(&_voltageFact, _voltageFactName); _addFact(&_percentRemainingFact, _percentRemainingFactName); @@ -3275,6 +3293,8 @@ VehicleBatteryFactGroup::VehicleBatteryFactGroup(QObject* parent) _addFact(&_temperatureFact, _temperatureFactName); _addFact(&_cellCountFact, _cellCountFactName); _addFact(&_instantPowerFact, _instantPowerFactName); + _addFact(&_timeRemainingFact, _timeRemainingFactName); + _addFact(&_chargeStateFact, _chargeStateFactName); // Start out as not available _voltageFact.setRawValue (_voltageUnavailable); diff --git a/src/Vehicle/Vehicle.h b/src/Vehicle/Vehicle.h index 4070ac17b..e667d3190 100644 --- a/src/Vehicle/Vehicle.h +++ b/src/Vehicle/Vehicle.h @@ -255,6 +255,8 @@ public: Q_PROPERTY(Fact* temperature READ temperature CONSTANT) Q_PROPERTY(Fact* cellCount READ cellCount CONSTANT) Q_PROPERTY(Fact* instantPower READ instantPower CONSTANT) + Q_PROPERTY(Fact* timeRemaining READ timeRemaining CONSTANT) + Q_PROPERTY(Fact* chargeState READ chargeState CONSTANT) Fact* voltage (void) { return &_voltageFact; } Fact* percentRemaining (void) { return &_percentRemainingFact; } @@ -263,7 +265,8 @@ public: Fact* temperature (void) { return &_temperatureFact; } Fact* cellCount (void) { return &_cellCountFact; } Fact* instantPower (void) { return &_instantPowerFact; } - + Fact* timeRemaining (void) { return &_timeRemainingFact; } + Fact* chargeState (void) { return &_chargeStateFact; } static const char* _voltageFactName; static const char* _percentRemainingFactName; @@ -272,6 +275,8 @@ public: static const char* _temperatureFactName; static const char* _cellCountFactName; static const char* _instantPowerFactName; + static const char* _timeRemainingFactName; + static const char* _chargeStateFactName; static const char* _settingsGroup; @@ -291,6 +296,8 @@ private: Fact _temperatureFact; Fact _cellCountFact; Fact _instantPowerFact; + Fact _timeRemainingFact; + Fact _chargeStateFact; }; class VehicleTemperatureFactGroup : public FactGroup -- 2.22.0