drone status menue with status and critical event log implemented

This commit is contained in:
Constantin Leue
2026-08-04 23:15:56 +02:00
parent 75736793f2
commit 8e4df2d0d3
15 changed files with 571 additions and 24 deletions
@@ -35,6 +35,8 @@ class TelemetryFrame {
required this.headingDeg,
required this.armed,
required this.batteryPercent,
required this.batteryVoltage,
required this.currentA,
required this.linkQuality,
required this.snrDb,
required this.hdop,
@@ -65,6 +67,14 @@ class TelemetryFrame {
/// Akku-Ladestand in Prozent (0-100).
final int batteryPercent;
/// Akkuspannung in Volt (siehe parseMspInavAnalogVoltage in
/// msp_telemetry_codec.dart).
final double batteryVoltage;
/// Aktuelle Stromaufnahme in Ampere (siehe parseMspInavAnalogAmperage in
/// msp_telemetry_codec.dart).
final double currentA;
/// Empfaenger-Linkqualitaet in Prozent (0-100).
final int linkQuality;
@@ -95,6 +95,11 @@ class MockFlightControllerLink implements FlightControllerLink {
headingDeg: _heading,
armed: _armed,
batteryPercent: _batteryPercent.round(),
// 6S-Akku (22.2V nominal), Spannung sinkt mit dem Mock-Ladestand
// mit, damit auch die neue Statusanzeige (Doku: "Drone battery
// Voltage") auf Werteaenderungen reagiert.
batteryVoltage: 18.0 + (_batteryPercent / 100) * 6.0,
currentA: 12.5,
linkQuality: 95,
snrDb: 9,
hdop: 0.9,
@@ -138,6 +138,20 @@ MspNavMode parseMspNavMode(Uint8List payload) {
/// 0-100 berechnet, siehe [MspCommands.inavAnalog]).
int parseMspInavAnalogBatteryPercent(Uint8List payload) => payload[21];
/// Parst die `MSP2_INAV_ANALOG`-Antwort und liefert die Akkuspannung in Volt
/// (Offset 1, u16 in 0.01V-Schritten - `battery.c`: `static uint16_t vbat`,
/// Kommentar "battery voltage in 0.01V steps", siehe [MspCommands.inavAnalog]).
double parseMspInavAnalogVoltage(Uint8List payload) =>
ByteData.sublistView(payload).getUint16(1, Endian.little) / 100.0;
/// Parst die `MSP2_INAV_ANALOG`-Antwort und liefert die aktuelle
/// Stromaufnahme in Ampere (Offset 3, `fc_msp.c`: `sbufWriteU16(dst,
/// getAmperage())` - "send amperage in 0.01 A steps", `getAmperage()` selbst
/// liefert `int16_t`, deshalb vorzeichenbehaftet gelesen, siehe
/// [MspCommands.inavAnalog]).
double parseMspInavAnalogAmperage(Uint8List payload) =>
ByteData.sublistView(payload).getInt16(3, Endian.little) / 100.0;
/// Parst die `MSP2_INAV_GET_LINK_STATS`-Antwort und liefert die
/// Empfaenger-Linkqualitaet in Prozent (Offset 1, `rxLinkStatistics.uplinkLQ`
/// - bereits 0-100, siehe [MspCommands.inavLinkStats]).
@@ -39,6 +39,8 @@ class MspTelemetryPoller {
bool _armed = false;
int? _activeWaypointIndex;
int _batteryPercent = 0;
double _batteryVoltage = 0;
double _currentA = 0;
int _linkQuality = 0;
int _snrDb = 0;
int _navMode = 0;
@@ -86,9 +88,10 @@ class MspTelemetryPoller {
final navMode = parseMspNavMode(navStatusPayload);
_navMode = navMode.mode;
_flightMode = navMode.formatted;
_batteryPercent = parseMspInavAnalogBatteryPercent(
await _client.request(MspCommands.inavAnalog),
);
final analogPayload = await _client.request(MspCommands.inavAnalog);
_batteryPercent = parseMspInavAnalogBatteryPercent(analogPayload);
_batteryVoltage = parseMspInavAnalogVoltage(analogPayload);
_currentA = parseMspInavAnalogAmperage(analogPayload);
final linkStatsPayload = await _client.request(MspCommands.inavLinkStats);
_linkQuality = parseMspLinkQuality(linkStatsPayload);
_snrDb = parseMspLinkStatsSnr(linkStatsPayload);
@@ -105,6 +108,8 @@ class MspTelemetryPoller {
headingDeg: gps.headingDeg,
armed: _armed,
batteryPercent: _batteryPercent,
batteryVoltage: _batteryVoltage,
currentA: _currentA,
linkQuality: _linkQuality,
snrDb: _snrDb,
hdop: gps.hdop,