UI improvements for telemetry debugging

This commit is contained in:
Constantin Leue
2026-08-02 20:21:21 +02:00
parent 6cfb82bd77
commit f42d997d4c
7 changed files with 272 additions and 190 deletions
+61 -9
View File
@@ -1,3 +1,5 @@
import 'dart:math' as math;
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -114,6 +116,10 @@ class FlyScreen extends ConsumerWidget {
maxDescentRate: droneProfile.maxDescentRate,
);
final missionStats = computeMissionStats(waypoints);
final safeEdgeInset = math.max(
MediaQuery.of(context).padding.left,
MediaQuery.of(context).padding.right,
);
final terrainProfile = ref.watch(terrainProvider).profile;
final warnings = computeMissionWarnings(
waypoints: waypoints,
@@ -125,6 +131,28 @@ class FlyScreen extends ConsumerWidget {
terrain: terrainProfile,
);
// Vor der ersten Telemetrie (Verbindungsaufbau laeuft noch, oder Mock
// hat noch nicht getickt) auf dem ersten Wegpunkt statt gar nicht
// anzeigen - vermeidet einen leeren/verwirrenden Kartenausschnitt beim
// Eintritt in den Fly-Modus.
final droneMarker = telemetry != null
? Marker(
point: LatLng(telemetry.lat, telemetry.lon),
width: 28,
height: 28,
alignment: Alignment.center,
child: DroneMarkerIcon(headingDeg: telemetry.headingDeg),
)
: waypoints.isEmpty
? null
: Marker(
point: LatLng(waypoints.first.lat, waypoints.first.lon),
width: 28,
height: 28,
alignment: Alignment.center,
child: const DroneMarkerIcon(),
);
return Stack(
children: [
MissionMap(
@@ -142,15 +170,21 @@ class FlyScreen extends ConsumerWidget {
borderColor: Colors.white,
),
],
droneMarker: telemetry == null
? null
: Marker(
point: LatLng(telemetry.lat, telemetry.lon),
width: 28,
height: 28,
alignment: Alignment.center,
child: DroneMarkerIcon(headingDeg: telemetry.headingDeg),
),
droneMarker: droneMarker,
),
// Live-Hoehe/-Geschwindigkeit aus der Telemetrie (HTML-Demonstrator:
// #altReadout/#spdReadout im Fly-Modus) - anders als dort keine
// SET-Zeile, weil es im Waypoint-Fly-Modus kein editierbares
// Rad-Widget (curAlt/curSpeed) gibt, dessen Wert sinnvoll waere.
Positioned(
top: 56,
left: 14 + safeEdgeInset,
child: _liveReadout('Alt', telemetry?.altitudeM, 'm'),
),
Positioned(
top: 56,
right: 14 + safeEdgeInset,
child: _liveReadout('Speed', telemetry?.speedMs, 'm/s'),
),
Positioned(
left: 0,
@@ -174,4 +208,22 @@ class FlyScreen extends ConsumerWidget {
],
);
}
Widget _liveReadout(String label, double? value, String unit) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: Colors.black.withValues(alpha: 0.7),
borderRadius: BorderRadius.circular(6),
),
child: Text(
'$label: ${value != null ? '${value.round()} $unit' : '—'}',
style: const TextStyle(
color: Colors.white,
fontSize: 15,
fontWeight: FontWeight.w500,
),
),
);
}
}