Material 3 blue seed, light, drawn at 390×844 against the real widgets: SettingsShell renders each category as a ListTile with a leading Icon, a subtitle and a trailing chevron under a centred AppBar, and detail panes are Cards of ListTiles split by Divider(height: 1). Icon choices match settings_screen.dart; they are drawn here as inline SVG so this file needs no network to render. Values are examples; the bullets are the behavior to build. GPS mode rides firmware 0xC5 sub-codes 0x0D / 0x0E, gated on caps byte 2 0x20 (meshcore-firmware#1789). Owner-approved 2026-10-23 Approved as drawn: one three-way GPS control above the coordinates, one consolidated status row between them, Location as a top-level category under Radio Settings, Radio stats unchanged for now, and button and buzzer split across Node Settings and Message Settings. Corrected 2026-10-24: wire facts only (the command is 0xC5, not a new 0xC7; the buzzer-only example boards; the sleep-interval floor). The design is unchanged.
The selector is the only on/off control. The status row goes quiet and the sleep row is gone, because neither has meaning here.
gps.en = 0 and leaves the mode byte untouched, matching gpsStoredModeForPick.Continuous acquisition. The sleep row stays hidden: it governs Power save only, and a dead row invites someone to set it.
gps.en = 1 and gps.mode = 1 together, the way setGpsMode() does on the device.0xFF (never set) also displays as On, per gpsModeFromPrefs.The state a badge at an event actually sits in. One status row carries activity, next attempt and last fix, so nothing is said twice.
gps.en = 1 and gps.mode = 2.Most variants do not compile the duty cycle. The third option is absent rather than offered and ignored.
OFFBAND_GPS_POWER_SAVE is opt-in per variant and today is set only on the QCC badge.gpsPowerSaveAvailable() so it never offers a mode nothing drives. The client needs the same signal.ps_ok in every GPS reply, so Power save is hidden per radio rather than per firmware version. The caps bit 0x20 alone would not do: a radio can speak the GPS sub-codes without the duty cycle.GPS sits two levels down today, inside Node Settings then the Location dialog, with its enable toggle duplicated in both. Location becomes its own category and owns GPS outright.
One entry today, shown on button matrix or notify scope together. Boards such as the M5Stack Unit C6L, ThinkNode M9 and Wio Tracker L1 e-ink have a buzzer and no button, so they are not one feature.
0x02, Buzzer and tones on 0x01. Firmware already sets the two independently, and the screen already shows each half from its own bit; what changes is the entry and where it lives.The badge's own screen does exactly this: setGpsMode() at MyMesh.h:458 writes both fields, and gpsEnabledForMode exists for the writer that sets both. What is forbidden is a bool-only writer clobbering the mode byte. An earlier draft had two controls and was wrong; #969's original wording pointed that way.
Activity and last fix were separate blocks in the first draft. In a dense app that is one job taking two slots, so they are merged into a single ListTile between the selector and the coordinates.
gps_interval is a reporting cadence; gps_ps_interval_s is a power duty cycle (NodePrefs.h:73-78). They live in different cards so the difference is visible, and are never merged.
GPS fix state in the Channels and Contacts headers is #974; it lands in the same shared app-bar widget as epic #613, so it must follow #614 rather than run beside it. Where Radio stats lives is #980.
The client renders the device's answer, never its own assumption. Choosing Off does not change the stored mode byte, so a client modelling its own write would show the wrong mode. Clamping has the same shape: the reporting interval is already constrained to 0 through 86400, so the user must see the clamped value, not what they typed. Delivered: the 0xC5 GPS reply carries the stored values after every write.
OFFBAND_GPS_POWER_SAVE is per variant and currently only on the QCC badge. The GPS reply's ps_ok byte says whether this radio can run it; without that, the client would offer a mode that does nothing.