13 switch (message.msgid) {
35BatteryFactGroup::BatteryFactGroup(uint32_t batteryId, QObject *parent)
36 :
FactGroupWithId(1000, QStringLiteral(
":/json/Vehicle/BatteryFact.json"), parent)
38 _addFact(&_batteryFunctionFact);
39 _addFact(&_batteryTypeFact);
40 _addFact(&_voltageFact);
41 _addFact(&_currentFact);
42 _addFact(&_mahConsumedFact);
43 _addFact(&_temperatureFact);
44 _addFact(&_percentRemainingFact);
45 _addFact(&_timeRemainingFact);
46 _addFact(&_timeRemainingStrFact);
47 _addFact(&_chargeStateFact);
48 _addFact(&_instantPowerFact);
51 _batteryFunctionFact.setRawValue(MAV_BATTERY_FUNCTION_UNKNOWN);
53 _voltageFact.setRawValue(
qQNaN());
54 _currentFact.setRawValue(
qQNaN());
55 _mahConsumedFact.setRawValue(
qQNaN());
56 _temperatureFact.setRawValue(
qQNaN());
57 _percentRemainingFact.setRawValue(
qQNaN());
58 _timeRemainingFact.setRawValue(
qQNaN());
59 _chargeStateFact.setRawValue(MAV_BATTERY_CHARGE_STATE_UNDEFINED);
60 _instantPowerFact.setRawValue(
qQNaN());
67 switch (message.msgid) {
68 case MAVLINK_MSG_ID_HIGH_LATENCY:
69 _handleHighLatency(vehicle, message);
71 case MAVLINK_MSG_ID_HIGH_LATENCY2:
72 _handleHighLatency2(vehicle, message);
74 case MAVLINK_MSG_ID_BATTERY_STATUS:
75 _handleBatteryStatus(vehicle, message);
84 mavlink_high_latency_t highLatency{};
85 mavlink_msg_high_latency_decode(&message, &highLatency);
87 percentRemaining()->setRawValue((highLatency.battery_remaining == UINT8_MAX) ? qQNaN() : highLatency.battery_remaining);
94 mavlink_high_latency2_t highLatency2{};
95 mavlink_msg_high_latency2_decode(&message, &highLatency2);
97 percentRemaining()->setRawValue((highLatency2.battery == -1) ? qQNaN() : highLatency2.battery);
104 mavlink_battery_status_t batteryStatus{};
105 mavlink_msg_battery_status_decode(&message, &batteryStatus);
107 if (batteryStatus.id !=
id()->rawValue().toUInt()) {
112 double totalVoltage = qQNaN();
113 for (
int i = 0; i < 10; i++) {
114 const double cellVoltage = ((batteryStatus.voltages[i] == UINT16_MAX)) ? qQNaN() : (static_cast<double>(batteryStatus.voltages[i]) / 1000.0);
115 if (qIsNaN(cellVoltage)) {
119 totalVoltage = cellVoltage;
121 totalVoltage += cellVoltage;
125 for (
int i = 0; i < 4; i++) {
126 const double cellVoltage = ((batteryStatus.voltages_ext[i] == 0)) ? qQNaN() : (static_cast<double>(batteryStatus.voltages_ext[i]) / 1000.0);
127 if (qIsNaN(cellVoltage)) {
130 totalVoltage += cellVoltage;
133 function()->setRawValue(batteryStatus.battery_function);
134 type()->setRawValue(batteryStatus.type);
135 temperature()->setRawValue((batteryStatus.temperature == INT16_MAX) ? qQNaN() : (static_cast<double>(batteryStatus.temperature) / 100.0));
136 voltage()->setRawValue(totalVoltage);
137 current()->setRawValue((batteryStatus.current_battery == -1) ? qQNaN() : (static_cast<double>(batteryStatus.current_battery) / 100.0));
138 mahConsumed()->setRawValue((batteryStatus.current_consumed == -1) ? qQNaN() : batteryStatus.current_consumed);
139 percentRemaining()->setRawValue((batteryStatus.battery_remaining == -1) ? qQNaN() : batteryStatus.battery_remaining);
140 timeRemaining()->setRawValue((batteryStatus.time_remaining == 0) ? qQNaN() : batteryStatus.time_remaining);
141 chargeState()->setRawValue(batteryStatus.charge_state);
142 instantPower()->setRawValue(totalVoltage * current()->rawValue().toDouble());
147void BatteryFactGroup::_timeRemainingChanged(
const QVariant &value)
149 if (qIsNaN(value.toDouble())) {
150 _timeRemainingStrFact.setRawValue(
"––:––:––");
152 const int totalSeconds = value.toInt();
153 const int hours = totalSeconds / 3600;
154 const int minutes = (totalSeconds % 3600) / 60;
155 const int seconds = totalSeconds % 60;
157 _timeRemainingStrFact.setRawValue(QString::asprintf(
"%02dH:%02dM:%02dS", hours, minutes, seconds));
struct __mavlink_message mavlink_message_t
BatteryFactGroupListModel(QObject *parent=nullptr)
FactGroupWithId * _createFactGroupWithId(uint32_t id) final
bool _shouldHandleMessage(const mavlink_message_t &message, QList< uint32_t > &ids) const final
Dynamically manages FactGroupWithIds based on incoming messages.
void _setTelemetryAvailable(bool telemetryAvailable)
void rawValueChanged(const QVariant &value)
QModelIndex index(int row, int column=0, const QModelIndex &parent=QModelIndex()) const override
void clear() override final