UI improvements for telemetry debugging
This commit is contained in:
@@ -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,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user