Dashboard¶
| Garmin | Wear OS | Apple Watch | |
|---|---|---|---|
| Status | 🟡 | ✅ | ⏳ |
| Code | source/views/DashboardView.mc, source/Chart.mc, source/BaroIndicator.mc, source/DataModel.mc, source/TripContext.mc |
wear/…/presentation/views/DashboardView.kt, core/…/SpeedChart.kt, core/…/BaroIndicator.kt, wear/…/recording/TripEngine.kt |
— |
Verified against code: 2026-10-13
Purpose¶
Instrument screen 1, the screen a track opens on. It answers "how fast, where to, how far" at a glance: a large SOG in a black block, the course, the track distance, max and average speed, the barometer with its trend, and the vessel state with the numbers of the current state period. A 1 Hz speed chart under the SOG shows the last few minutes, coloured by vessel state.
The screen is the first page of the instrument pager (input.md); the Track view follows it. Colours and fonts come from the visual system.
Layout / behaviour¶
The dashboard is the only instrument screen with a white background and black text. It is redrawn once per second, on the 1 Hz tick.
Grid¶
All positions derive from a grid of 4 columns × 5 rows:
cellWidth= round(width / 4) ≈ 0.25 wcellHeight= round(height / 5) ≈ 0.20 hspacer= round(height / 22) ≈ 0.045 h (sizes of the GPS bars and the baro arrow)
Positions below are the resulting fractions of screen width (x) and height (y). x 0.50 / y 0.50 is the centre. "Right edge" / "left edge" means the text is right- or left-justified at that x; every text is vertically centred on its y.
| Element | Position | Size | Colour | Content |
|---|---|---|---|---|
| Background | Full screen | — | White 0xFFFFFF |
— |
| Rule 1 | y 0.20, full width | 1 px | Black | Separates the status row |
| Rule 2 | y 0.60, full width | 1 px | Black | Below the SOG block |
| Rule 3 | y 0.80, full width | 1 px | Black | Above the timer |
| SOG block | x 0.30–0.70, y 0.20–0.60 | 0.40 w × 0.40 h | Black, filled | Holds the SOG and the speed chart |
Rows from top to bottom:
- Status row (y 0–0.20): GPS bars, clock, battery.
- Instrument rows (y 0.20–0.60): left column max speed,
CoG, COG; centre the SOG block; right column average speed,nM, distance. - State row (y 0.60–0.80): baro arrow, pressure, vessel state header.
- Timer row (y 0.80–1.00): track timer.
Status row¶
| Element | Position | Font / size | Colour | Content & format | Constraints |
|---|---|---|---|---|---|
| GPS bars | Left edge x 0.19 (cellWidth × 0.75); top y 0.09 (cellHeight × 0.45); bars bottom-aligned at y 0.09 + 2 × spacer ≈ 0.18 | 3 bars, each spacer − 1 px wide (spacer if spacer ≤ 2), 1 px apart; heights 1 ×, 1.5 × and 2 × spacer |
Lit: blue 0x00AAFF; unlit: light grey 0xAAAAAA |
GPS quality 0–4. Bar 1 lights from quality 2, bar 2 from 3, bar 3 at 4 | Bar width is 1 px narrower than the spacer so the third bar never touches the clock on 218–240 px screens |
| Clock | x 0.50 centred, y 0.12 (cellHeight × 0.6) | Numerals font | Black | Time of day H:MM, 24-hour, hour without leading zero: 9:05, 14:30 |
Ignores the watch's 12/24-hour setting |
| Battery gauge | Left edge x 0.675 (cellWidth × 2.7), top y 0.11 (cellHeight × 0.55) | Outline cellWidth / 2.2 ≈ 0.114 w wide, cellWidth / 4 ≈ 0.0625 w high | Outline light grey 0xAAAAAA (1 px); fill blue 0x00AAFF |
Fill inset 2 px, width = level % × outline width − 4 px | No percentage text, no tip, no red low state. The fill is 4 px short of proportional, so it vanishes below 4 px ÷ outline width: about 15 % on 240 px, 8 % on 454 px |
Instrument rows¶
| Element | Position | Font / size | Colour | Content & format | Constraints |
|---|---|---|---|---|---|
| Max speed ▲ | Filled triangle left of the value, gap 1.5 % w (min 3 px); vertically centred on y 0.27 | Width 2.5 % w (min 6 px; e.g. 6 px on 240, 11 px on 454), height 1.35 × width | Orange 0xFF5500 |
Upward triangle, marks the value as max speed | Moves left with the value's width |
| Max speed | Right edge x 0.275 (cellWidth × 1.1), y 0.27 (cellHeight × 1.35) | Header font | Black | Highest 1 Hz SOG of the track in knots. Below 10: one decimal (8.4); from 10: no decimals (12). No unit |
Kept across pause and resume (recording.md) |
CoG label |
Right edge x 0.275, y 0.40 | Header font | Orange 0xFF5500 |
CoG |
— |
| COG | Right edge x 0.275, y 0.52 (cellHeight × 2.6) | Numerals font | Black | Smoothed COG in whole degrees, 0–359, no °, no leading zeros: 5, 215 |
- while there is no valid COG (below 1 kn, no fix). See calculations |
| SOG | x 0.50 centred, y 0.34 (cellHeight × 1.70) | Below 10 kn: sog (hero) font. From 10 kn: tens digit in header font, the rest in sog font | White 0xFFFFFF |
SOG in knots, one decimal, rounded: 0.0, 6.8, 12.4 |
See "SOG from 10 kn" below |
| Speed chart | x 0.30–0.70, y 0.40–0.60 (lower half of the SOG block) | One column per pixel | Each column in the vessel state colour of its sample | See "Speed chart" below | Drawn before the SOG, so the SOG digits sit on top of the chart |
Ø label |
Left edge x 0.725 (cellWidth × 2.9), y 0.27 | System font XTINY | Orange 0xFF5500 |
Ø (average) |
— |
| Average speed | Left edge x 0.7125 (cellWidth × 2.85) + width of Ø + 3 px, y 0.27 |
Header font | Black | Track average speed in knots = track distance × 3600 / track seconds (unpaused). Below 10: one decimal; from 10: no decimals. No unit | 0.0 until both distance and time are above 0. On screens wider than 240 px the value starts slightly left of the Ø's right edge (the 0.0125 w difference outgrows the 3 px) |
nM label |
Left edge x 0.725, y 0.40 | Header font | Orange 0xFF5500 |
nM |
— |
| Track distance | Left edge x 0.725, y 0.52 | Numerals font | Black | Track distance in nautical miles. Below 10: two decimals (3.47); 10 to below 100: one decimal (23.4); from 100: no decimals (104) |
Distance of this track only, kept across pause and resume. Source: recording.md |
SOG from 10 kn¶
Below 10.0 kn the SOG is one string in the hero font, centred on x 0.50.
From 10.0 kn the first character (the tens digit) is drawn in the header font and the rest (2.4 of 12.4) in the hero font, so four characters fit in the block. The two parts are centred as a group on x 0.50 with a 2 px gap. The small tens digit is moved down by half the height difference of the two fonts, so the bottoms of both line boxes line up.
The switch uses the raw speed, before rounding. From 9.95 to 9.99 kn the SOG reads 10.0, all in the hero font.
Speed chart¶
- One sample every 4 s: the mean of the four 1 Hz SOG values (null values ignored; a slot with only nulls stays empty). 40 samples, so the chart spans the last 160 s. New samples enter on the right.
- Each sample keeps the accent of the vessel state when it was taken (vessel-state.md). A sample without a colour falls back to blue
0x00AAFF. - Vertical scale: from 0 to the highest visible sample, but at least 7 kn, plus 10 % of that span below and above. So 0 kn still draws a thin strip at the bottom, and the top sample never reaches the top edge.
- Columns are filled from the sample's height down to the bottom of the block. No line is drawn on top of the columns.
- The chart is not saved: it starts empty after a resume.
State row¶
| Element | Position | Font / size | Colour | Content & format | Constraints |
|---|---|---|---|---|---|
| Baro arrow | Left x 0.09 (2 × spacer), top y 0.70 − 8 px (cellHeight × 3.5 − 8) | spacer wide (≈ 0.045 h), 1.3 × spacer high | Steady: blue 0x00AAFF; rising or falling: yellow 0xFFAA00; strong: red 0xFF0000 |
Filled triangle: pointing right (steady or not enough samples), up (rising), down (falling) | Trend rules: calculations. Needs 3 samples (about 6 min) before it can leave "steady". Starts over after a resume |
hPa label |
Right edge x 0.325 (cellWidth × 1.3), y 0.66 (cellHeight × 3.3) | System font XTINY | Orange 0xFF5500 |
hPa |
— |
| Pressure | Right edge x 0.325, y 0.76 (cellHeight × 3.8) | Header font | Black | Ambient pressure in whole hPa, decimals dropped: 1013 |
-- while there is no reading (no barometer, no value yet). A four-digit value ends close to the baro arrow on 240 px screens |
| State header, line 1 | Left edge x 0.375 (cellWidth × 1.5), y 0.668 (cellHeight × 3.34) | Header font | Black | Vessel state in its -ing form: Motoring, Motorsailing, Sailing, Anchoring, Buoy, Mooring, Shoreline, Drifting (vessel-state.md) |
Mixed case as listed, never upper case. Not coloured by state |
| State header, line 2 | Left edge x 0.375, y 0.756 (cellHeight × 3.78) | System font XTINY | Values black, units orange 0xFF5500 |
Numbers of the current state period, see below | Not truncated; very long values can run into the bezel on 218–240 px screens |
Line 2 while sailing, motoring or motorsailing reads <distance>nM Ø<speed>kn without spaces around the units, e.g. 1.4nM Ø5.2kn. It is drawn as four parts side by side: distance (black), nM Ø (orange), speed (black), kn (orange).
- Distance: nautical miles since the vessel state was last changed, one decimal.
- Speed: mean of the 1 Hz SOG values above 0 since the state change, one decimal. Seconds at 0.0 kn don't count.
0.0before the first moving second.
Line 2 in a stationary state (anchor, buoy, mooring, shoreline, adrift) is the time since the state change as H:MM:SS, black, e.g. 0:15:30. No label, no start time.
Both reset when the vessel state changes (vessel-state.md). Distance and speed are kept across pause and resume; the duration restarts after the app was closed (recording.md).
Timer row¶
| Element | Position | Font / size | Colour | Content & format | Constraints |
|---|---|---|---|---|---|
| Track timer | x 0.50 centred, y 0.88 (cellHeight × 4.4) | Numerals font | Black | Unpaused time of this track as H:MM:SS, hours unpadded: 0:07:12, 12:03:45 |
Counts on across pause and resume. While the track is paused the text is PAUSED instead (see Known deviations) |
Garmin¶
No differences beyond the fonts: the custom fonts are the per-screen bitmap sheets and XTINY is the device's Graphics.FONT_XTINY (visual-system.md).
Wear OS¶
- Swiping left opens the vessel state picker page (menus.md).
- Tapping the state header (the band y 0.60–0.80, between rules 2 and 3, full width) opens the vessel state picker. This replaces the Garmin BACK button. See input.md.
- A paused track is not on screen (the app goes to the background, lifecycle.md), so the
PAUSEDtext is never seen. - After the
Low Power Screentime without input (default 20 s), and in ambient mode, the dashboard is replaced by the low-power layout: clock and SOG at the same places, on black (live-surfaces.md).
Apple Watch¶
⏳ Planned as instrument page 1 with the same layout (apple_watch_port_plan.md §1.2). Tapping the state header opens the vessel state picker; Double Tap and the Ultra Action button do the same (input.md).
States and edge cases¶
| Situation | What the dashboard shows |
|---|---|
| No GPS fix | SOG 0.0, COG -, all GPS bars grey (quality 0 = none, or 1 = last known position). Distance, averages and timer keep their values; the timer keeps counting |
| Fix but below 1 kn | COG - (course unreliable when slow) |
| No barometer, or no reading yet | Pressure --, baro arrow blue, pointing right |
| Track just started | Max 0.0, Ø 0.0, distance 0.00, timer 0:00:00, chart empty for the first 4 s |
| Track resumed after a pause | Distance, max, Ø, timer and the state period values continue. Chart and baro trend start over |
| Low battery | The gauge's fill vanishes below about 15 % (240 px) or 8 % (454 px). The battery alert is separate (alerts-and-auto-stats.md) |
| 218 px screen | Smallest supported. Nothing overlaps; tightest spots are the third GPS bar vs. the clock, and the pressure vs. the baro arrow |
Known deviations¶
- Garmin:
PAUSEDshows empty boxes. The timer draws thePAUSEDstring in the numerals font, whose glyph set has no letters (DashboardView.drawTimer; glyph sets in visual-system.md). Only seen if the dashboard is on screen while the track is paused. Wear OS draws the letters, but never shows that state.