Drone Status Menue: Sensor-Status, Arming, Temperaturen und Steig-/Sinkrate hinzugefuegt

Neue Zeile ganz oben mit farblich kodierten Sensor-Badges (ACC/BARO/MAG/
GPS/RNG/OF/PITOT/TEMP, aus dem sensorStatus-Bitfeld von MSP2_INAV_STATUS,
zuvor schon dokumentiert aber ungenutzt), darunter ein Zeilenpaar fuer
Arming-Status und die ersten 3 Temperatursensoren (neu: MSP2_INAV_
TEMPERATURES, 0x201E). Ans Ende der Liste die Steig-/Sinkrate (vario aus
MSP_ALTITUDE, bislang nur die Hoehe selbst wurde daraus gelesen).

- msp_commands.dart: inavTemperatures-Konstante ergaenzt; die Sensor-
  Status-Bits (bisher nur als Doc-Kommentar bei MSP2_INAV_STATUS notiert)
  zu echten Konstanten (MspSensorStatusBits) promoviert, da jetzt
  tatsaechlich gebraucht.
- msp_telemetry_codec.dart: parseMspAltitudeVerticalSpeedMs,
  parseMspInavStatusSensorStatus, parseMspInavTemperaturesC ergaenzt +
  Unit-Tests.
- TelemetryFrame: sensorStatusBits (Bitmaske, protokollneutral
  durchgereicht wie navMode), temperaturesC (erste 3 Sensoren, null je
  nicht konfiguriertem Slot), verticalSpeedMs.
- msp_telemetry_poller.dart: vario kommt aus derselben MSP_ALTITUDE-
  Antwort wie die Hoehe (keine zusaetzliche Anfrage), sensorStatus aus
  derselben MSP2_INAV_STATUS-Antwort wie ARMED; MSP2_INAV_TEMPERATURES neu
  im 2-Hz-Statuszyklus abgefragt.
- MockFlightControllerLink: synthetische Sensor-/Temperatur-/Vario-Werte
  (kein Pitot/Rangefinder/Opflow am T1 Ranger vorgesehen), leicht
  schwankend, damit die neuen Felder auch ohne Hardware sichtbar auf
  Werteaenderungen reagieren.
- drone_status_messages_panel.dart: eigene Sensor-Status-Zeile (lokale
  Bit-Konstanten statt MSP-Import, analog zum bestehenden navMode-Muster
  in domain/telemetry/drone_status.dart, damit die UI protokollneutral
  bleibt), Arming+Temperaturen-Zeilenpaar, Vertical-speed-Zeile am Ende.

Auf dem Pixel_10a-Emulator verifiziert: Sensor-Badges gruen/grau je nach
Bitmaske, Arming/Temperaturen-Paar, Vertical speed am Listenende.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Constantin Leue
2026-08-06 15:32:56 +02:00
co-authored by Claude Sonnet 5
parent 08791cac0c
commit 9cece7dbb6
9 changed files with 324 additions and 21 deletions
@@ -3,6 +3,7 @@ import 'dart:math' as math;
import '../../domain/waypoint/flat_waypoint_list.dart';
import '../flight_controller_link.dart';
import '../msp/msp_commands.dart';
/// Synthetische Telemetrie fuer UI-Entwicklung/Tests ohne Hardware oder SITL
/// (Architektur-Doku 3.1).
@@ -42,6 +43,7 @@ class MockFlightControllerLink implements FlightControllerLink {
Timer? _ticker;
double _heading = 0;
double _batteryPercent = 100;
int _tickCount = 0;
/// Aktuelle Drift vom Ankerpunkt in Metern (Nord/Ost) - Zufalls-Trudeln
/// innerhalb eines 10-m-Radius statt eines fest stehenden Punkts, damit
@@ -77,6 +79,7 @@ class MockFlightControllerLink implements FlightControllerLink {
// Langsam sinkender Akkustand, damit die Anzeige auch ohne Hardware
// sichtbar auf Werteaenderungen reagiert (Doku 9).
_batteryPercent = (_batteryPercent - 0.1).clamp(0, 100);
_tickCount++;
// Zufallsschritt, danach auf den 10-m-Radius um den Ankerpunkt
// zurueckgeklemmt statt frei wegzulaufen.
@@ -125,6 +128,28 @@ class MockFlightControllerLink implements FlightControllerLink {
flightMode: _activeWaypointIndex != null
? 'Waypoint mission (en route)'
: 'Idle',
// Kein Pitot/Rangefinder/Optical-Flow am T1 Ranger vorgesehen (Doku
// Architektur 6: "MSPV2_INAV_AIR_SPEED ... fuer den T1 Ranger
// aktuell nicht relevant") - die uebrigen Sensoren gelten als
// vorhanden/gesund, damit die Sensor-Status-Zeile im Drone-Status-
// Menue sowohl gruene als auch graue Badges zeigt.
sensorStatusBits: MspSensorStatusBits.acc |
MspSensorStatusBits.baro |
MspSensorStatusBits.mag |
MspSensorStatusBits.gps |
MspSensorStatusBits.temp,
// Leichtes Schwanken um drei Basiswerte statt fester Zahlen, damit
// die Temperaturfelder ebenfalls sichtbar auf Werteaenderungen
// reagieren (Doku 9).
temperaturesC: [
28.0 + math.sin(_tickCount * 0.05) * 1.5,
34.0 + math.sin(_tickCount * 0.07) * 2.0,
46.0 + math.sin(_tickCount * 0.06) * 3.0,
],
// Sinuskurve statt fester 0 - die Mock-Hoehe selbst bleibt
// konstant (siehe altitudeM oben), die Steig-/Sinkrate soll aber
// trotzdem sichtbar zwischen Steigen/Sinken wechseln koennen.
verticalSpeedMs: math.sin(_tickCount * 0.3) * 2.5,
activeWaypointIndex: _activeWaypointIndex,
));
});