Give the Fly App every remaining GO 4 flight mode and the missing settings

Intelligent modes: Point of Interest (orbit on the map, live radius and
speed), Follow Me (follows the phone), QuickShots on a boxed subject,
Course Lock / Home Lock, Tripod and Cinematic, a Free hyperlapse, and
Waypoints 2.0 for V2-only aircraft. ActiveTrack gains Spotlight Pro and
Circle. Every mode has a first-use tutorial and stops from the rail.
Waypoints can resume an interrupted mission, change cruise speed in
flight and check terrain clearance (Open-Meteo, on tap).

Settings: units, C1/C2 actions, dual-operator master/slave, HDMI/SDI
output, a link spectrum chart, Wi-Fi name and password, aircraft name,
video cache, battery warning history and pairing, non-smart cell
voltages. Calibration: compass interference meter, per-IMU calibration,
lens infinity focus and a first-manual-focus prompt. Also an RTK chip,
gimbal movement presets and motor tuning, Precision Takeoff gated on the
flight controller, and the precise GEO database's server version.

Built and unit/widget-tested only; nothing has flown yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
tajniak81andClaude Opus 5.5 committed 2026-10-20 23:06:16 +02:00
1 parent 91ca150a35
commit 636da1ac2c
57 files changed
+5363 -87

No files matched your search

+14 -7
View File
@@ -1,10 +1,13 @@
import 'package:flutter/material.dart';
import '../../../fly/fly_prefs.dart';
import '../../../fly/hud_features.dart';
import '../../../fly/state/aircraft_state.dart';
import '../../../fly/units.dart';
import '../hud_kit.dart';
/// The bottom telemetry strip (plan P2): H · D · VS (with arrow) · HS · VPS.
/// The bottom telemetry strip (plan P2): H · D · VS (with arrow) · HS · VPS,
/// in metres or feet as Settings → General → Units says.
class TelemetryStrip extends StatelessWidget {
const TelemetryStrip({super.key, required this.aircraft});
@@ -13,21 +16,25 @@ class TelemetryStrip extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListenableBuilder(
listenable: aircraft,
listenable: Listenable.merge(<Listenable>[aircraft, FlyPrefs.units]),
builder: (BuildContext context, _) {
final AircraftState a = aircraft;
final UnitSystem u = FlyPrefs.units.value;
final double? vs = a.verticalSpeed;
// Under 0.1 m/s is hover noise; no arrow for it.
final int dir = vs == null || vs.abs() < 0.1 ? 0 : vs.sign.toInt();
double? len(double? m) => m == null ? null : Units.lengthValue(m, u);
double? spd(double? ms) => ms == null ? null : Units.speedValue(ms, u);
final String l = Units.lengthUnit(u), s = Units.speedUnit(u);
return GlassPill(
height: 40,
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Row(mainAxisSize: MainAxisSize.min, children: <Widget>[
_Field('H', fmtNum(a.altitude), 'm'),
_Field('D', fmtNum(a.homeDistance, digits: 0), 'm'),
_Field('VS', fmtNum(vs?.abs()), 'm/s', arrow: dir),
_Field('HS', fmtNum(a.horizontalSpeed), 'm/s'),
Requires(HudFeatures.vpsReadout, child: _Field('VPS', fmtNum(a.vpsHeight), 'm')),
_Field('H', fmtNum(len(a.altitude)), l),
_Field('D', fmtNum(len(a.homeDistance), digits: 0), l),
_Field('VS', fmtNum(spd(vs?.abs())), s, arrow: dir),
_Field('HS', fmtNum(spd(a.horizontalSpeed)), s),
Requires(HudFeatures.vpsReadout, child: _Field('VPS', fmtNum(len(a.vpsHeight)), l)),
]),
);
},