Skip to content

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 w
  • cellHeight = round(height / 5) ≈ 0.20 h
  • spacer = 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:

  1. Status row (y 0–0.20): GPS bars, clock, battery.
  2. Instrument rows (y 0.20–0.60): left column max speed, CoG, COG; centre the SOG block; right column average speed, nM, distance.
  3. State row (y 0.60–0.80): baro arrow, pressure, vessel state header.
  4. 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.0 before 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 PAUSED text is never seen.
  • After the Low Power Screen time 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: PAUSED shows empty boxes. The timer draws the PAUSED string 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.