Give the Fly App GO 4-style obstacle radar, on-screen sticks, AirSense and fly zones
Vision radar: graded obstacle sectors around the centre of the video, the nearest distance per side, the obstacle overhead, and BLOCKED on a side whose sensors cannot see once the motors run. On aircraft with 360° sensing, sides without their own readings are filled from the perception ring. The same sectors sit on the attitude ball's rim, turned by the heading. Settings > Vision gains Display radar chart and the braking / sensing distances per direction. On-screen sticks: the rail's STICKS button hands the aircraft to two stick pads after a slide-to-confirm. The 25 Hz stream runs natively and sends zeros once Dart's last command is 300 ms old, so a stalled UI leaves the aircraft hovering. The sticks close when the remote takes over, on RTH or on landing. They are simulator-only on aircraft with a remote unless Settings > General > Developer allows real flights; Spark and Mavic Air on Wi-Fi may fly them for real. Which MSDK axis is forward in velocity + body mode is coded from DJI's documentation and must be checked in the simulator first. AirSense: a banner for manned aircraft at warning level 2 and up, with distance, direction and ICAO code; the planes on the map; the full list in a sheet and Settings > Safety; and the aircraft's own avoidance action with its countdown. Fly zones: DJI GEO zones around the aircraft (or the phone) on the map with their height limits, a banner for FlySafe notices and in/near-zone states, take-off refused in restricted and locked authorization zones, self-unlock of authorization zones, the aircraft's licences (enable, sync from the DJI account, remove all; ground only), and the GEO database version with an update button. Tested with unit and widget tests and screenshot renders only; nothing has run on an aircraft or the simulator yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
93f4a580e9
commit
e02bb0e5cd
34 files changed
+4376
-15
No files matched your search
@@ -17,7 +17,7 @@ import '../hud_kit.dart';
|
||||
/// The grid toggle that used to sit last lives in the camera menu (Other →
|
||||
/// Grid): a fourth button would reach the minimap on a phone.
|
||||
class ActionRail extends StatelessWidget {
|
||||
const ActionRail({super.key, required this.model, required this.flow, required this.onModes, this.modeActive = false});
|
||||
const ActionRail({super.key, required this.model, required this.flow, required this.onModes, this.modeActive = false, this.trailing});
|
||||
|
||||
final FlightModel model;
|
||||
final FlightCommandFlow flow;
|
||||
@@ -28,6 +28,9 @@ class ActionRail extends StatelessWidget {
|
||||
/// A mode's editor is open (the IFM button lights up).
|
||||
final bool modeActive;
|
||||
|
||||
/// A small control under the buttons (plan P8: the STICKS toggle).
|
||||
final Widget? trailing;
|
||||
|
||||
static ({String icon, String label, Color color}) _look(FlightCommand c) => switch (c) {
|
||||
FlightCommand.takeOff => (icon: 'takeoff', label: 'TAKE OFF', color: Glass.accent),
|
||||
FlightCommand.land => (icon: 'land', label: 'LAND', color: Glass.pillStrong),
|
||||
@@ -76,6 +79,7 @@ class ActionRail extends StatelessWidget {
|
||||
onTap: onModes,
|
||||
),
|
||||
),
|
||||
if (trailing != null) Padding(padding: const EdgeInsets.only(top: 2), child: trailing),
|
||||
]);
|
||||
},
|
||||
);
|
||||
|
||||
Reference in new issue
Block a user