Skip to content

Alerts and auto-stats

Garmin Wear OS Apple Watch
Status ✅ ✅ ⏳
Code source/AlertManager.mc, source/SettingsStore.mc, source/settings/SettingsMenu.mc, source/views/AlertView.mc, source/views/AutoStatsView.mc, source/views/EphemeralView.mc, source/TripContext.mc (intervals, overlay slot) core/…/AlertManager.kt (AlertManager, AutoStats, AutoStatsTracker), core/…/Settings.kt, wear/…/recording/TripEngine.kt (overlay slot), wear/…/recording/Feedback.kt, wear/…/presentation/views/OtherViews.kt (AlertView, AutoStatsView), wear/…/presentation/SailEverApp.kt (settings screens) —

Verified against code: 2026-10-13

Purpose

The watch warns the skipper when something needs attention: the boat moves while it should be stationary, the battery runs low, or the pressure falls. Between alerts it reports progress on its own: a short summary after every distance split and every 30 or 60 minutes. Both appear as full-screen overlays that close themselves, so nobody has to touch the watch.

Overlays

Alerts and auto-stats share one overlay slot on top of the current screen.

  • Auto-close: the overlay counts down on the 1 Hz tick (recording.md) and closes after 6 s. It uses no timer of its own.
  • Dismiss: any key, tap, swipe or crown turn closes it at once. The input is swallowed: nothing reaches the screen below.
  • No hints: no button prompts, arrows or "press any key".
  • One at a time: a new overlay replaces the one on screen. Exception: an auto-stats overlay that comes while an alert shows waits until the alert has gone, then shows. Only one waits; a newer one replaces it.
  • Order in a tick: auto-stats are fed before the countdown, alerts are checked after it. At most one alert fires per tick; Float is checked first, then Battery, then Baro.
  • Nothing is checked or counted while the track is paused.

Garmin

The overlay is pushed as its own view on top of whatever is showing (instruments or a menu). It is only popped while it is the top view; if something was pushed over it, it closes as soon as it is on top again.

Wear OS

The overlay is drawn over the instrument pages and the Controls page. Any touch (on release), a crown turn or a stem button closes it. While another screen (picker, stats) is open, the overlay is not visible but still counts down.

Alerts

Alert Fires when Repeats Default Options
Float vessel state is stationary (any of the five, including Adrift) and SOG ≥ limit on 15 consecutive ticks yes: the counter restarts after each alert, so it fires again every 15 s while the condition holds ON, 0.8 kn 0.3 · 0.5 · 0.8 · 1.0 · 1.5 · 2.0 kn
Low battery 0 % < battery < threshold once per recording run ON, 15 % 5 · 10 · 15 · 20 · 25 %
Baro drop pressure fell by more than the limit between the oldest and the newest sample of the barometer trend buffer once per recording run ON, 1.5 hPa 0.5 · 1.0 · 1.5 · 2.0 · 2.5 · 3.0 · 4.0 hPa
  • Any tick where the Float condition fails resets its 15 s count.
  • A recording run lasts from Start or Resume until the app closes or the track ends. Pause and resume in the same run keep the once-flags; resuming after the app was closed resets them.
  • The baro trend buffer and its phases: ../shared/calculations.md. Without a barometer the Baro alert never fires.

Alert overlay

Solid red background, white text, centred:

Element Position Font Colour Content
Background full screen — red 0xFF0000 (COLOR_RED) —
Title x 0.50, y 0.32 small system font white FLOAT ALERT / LOW BATTERY / BARO DROP
Message x 0.50, y 0.52 tiny system font white SOG >= 0.8 kn (15s) / Battery < 15% / Drop > 1.5 hPa / 3h

The message shows the configured threshold: kn and hPa with one decimal, % as a whole number.

Sound and vibration

Alert Auto-stats
Beeps 3 1
Vibration 3 pulses none

Garmin

  • Beeps: tone profile of 2500 Hz for 150 ms, then 150 ms silence, per beep. One beep, or a watch without tone profiles, plays TONE_ALERT_HI once.
  • Vibration: 100 % for 250 ms, 150 ms off, three times.
  • Watches without a speaker or vibration motor stay silent or still.

Wear OS

  • Beeps: ToneGenerator on the alarm stream at volume 100, TONE_PROP_BEEP for 150 ms, one every 300 ms. Watches without a speaker stay silent.
  • Vibration: waveform 250 ms on / 150 ms off, three times, at full amplitude.

Apple Watch

⏳ The strongest haptic patterns, repeated, plus the full-screen overlay (Apple haptics are weaker than Garmin vibes).

Auto-stats

Two independent reports. Each counts only unpaused seconds and shows only the last completed interval: no trip, day or track totals.

Report Completes when Shows Skipped when Default Options
Distance split interval distance ≥ step split time, average speed, max speed never ON, 1 nm 1 · 5 · 10 nm
Time update interval seconds ≥ step × 60 interval distance, average speed, max speed the vessel state was stationary on every tick of the interval (e.g. a night at anchor) ON, 60 min 30 min · 1 h
  • Split time counts unpaused seconds.
  • Average speed = interval distance × 3600 / interval seconds.
  • Max speed = highest SOG on any tick of the interval.
  • After a report (or a skip) the interval starts again at zero. Distance beyond the step is not carried over.
  • Intervals continue across a pause in the same recording run. They restart when the app was closed and the track resumed.
  • A report that is switched off does not count. Settings can only change while no track runs (they live in the start menu).

Auto-stats overlay

Navy background. A header, a short rule, then three rows. Each row hangs on a centre gutter: the caption right-aligned to its left, the value left-aligned to its right.

Element Position Font Colour Content
Background full screen — navy 0x0B1B2B —
Header x 0.50, y 0.19, centred label font white 0xFFFFFF 1 NM SPLIT / 5 NM SPLIT / 10 NM SPLIT, or 30 MIN UPDATE / 1 HOUR UPDATE
Rule x 0.30 → 0.70, y 0.27 1 px line 0x555555 —
Row 1–3 value left edge x 0.50 + 0.04; vertical centre y 0.40 / 0.555 / 0.71 numerals font orange 0xED6017 see below
Row caption right edge x 0.50 − 0.04, on the value's baseline label font white see below
Row unit right after the value, one space, on the value's baseline label font white kn / nm

Fonts: visual-system.md. The numerals font has no letters, so units are drawn in the label font.

Row Distance split Time update
1 TIME · MM:SS, from one hour H:MM:SS DISTANCE · +X.X nm (+XXX from 100 nm)
2 AVG · X.X kn AVG · X.X kn
3 MAX · X.X kn MAX · X.X kn

Negative or missing values show as 0.

Settings menu

Reached from the start menu item Settings (sub-label Alerts & auto-stats). On Wear OS also while recording, from the Controls page (menus.md); on Garmin never while recording. Start menu: menus.md.

Settings
├── Alerts            "Float, Battery, Baro"
│   ├── Float Alert   "ON · 0.8 kn" | "OFF"
│   │   ├── Alert           toggle
│   │   └── Speed Limit     "0.8 kn"  → picker
│   ├── Battery Alert "ON · 15%" | "OFF"
│   │   ├── Alert           toggle
│   │   └── Threshold       "15%"     → picker
│   └── Baro Alert    "ON · 1.5 hPa" | "OFF"
│       ├── Alert           toggle
│       └── Drop Limit      "1.5 hPa" → picker
└── Auto-Stats        "Distance & Time"
    ├── Distance Stats "ON · 1 nm" | "OFF"
    │   ├── Distance Stats  toggle
    │   └── Distance Step   "1 nm"    → picker
    └── Time Stats     "ON · 1 h" | "OFF"
        ├── Time Stats      toggle
        └── Time Step       "1 h"     → picker
└── Low Power Screen  "After 20 s"   → picker (Wear OS only)
└── Activity Type     "Sailing" | "Boating" → picker (Garmin only)
└── Track map         toggle (Garmin: devices with maps only, default off; Wear OS: paired watches only, default on; [track-view.md](track-view.md#map-background))
  • Each level's title is the label of the item that opened it (Settings, Alerts, Auto-Stats, Float Alert, …, Speed Limit, …).
  • Sub-labels update when a level is shown again.
  • The toggle switches at once.
  • The picker lists the options with the current value focused. Picking one stores it and goes back one level.

Value formats

Group Format Examples
Float one decimal + kn 0.3 kn, 2.0 kn
Battery whole number + % 5%, 25%
Baro one decimal + hPa 0.5 hPa, 4.0 hPa
Distance whole number + nm 1 nm, 10 nm
Time under 60: number + min; else hours + h 30 min, 1 h

Storage keys

The keys are the same on every platform:

Key Content Default
cfg_alert_drift_on Float alert on true
cfg_alert_drift_speed Float speed limit, kn 0.8
cfg_alert_bat_on Battery alert on true
cfg_alert_bat_level Battery threshold, % 15
cfg_alert_baro_on Baro alert on true
cfg_alert_baro_drop Baro drop limit, hPa 1.5
cfg_stats_dist_on Distance stats on true
cfg_stats_dist_nm Distance step, nm 1.0
cfg_stats_time_on Time stats on true
cfg_stats_time_min Time step, minutes 60
cfg_activity_type Garmin only: type of the next new trip, "sailing" or "boating"; a missing or unknown value reads as sailing "sailing"
cfg_low_power_s Wear OS only: seconds without input before the low-power layout; options 5, 10, 20, 30, 45, 60 20

A missing flag reads as ON. A missing value, or one that is no longer an option, reads as the default.

Garmin

Application.Storage; flags as Boolean, values as Float or Number, cfg_activity_type as String.

Activity Type is the third item of Settings, sub-label Sailing or Boating. It opens the picker Activity Type (Sailing, Boating, the current value focused); picking one stores it and goes back one level. It sets the type of the next Start new trip; the open trip keeps its own (lifecycle.md). Wear OS records no Garmin-style activity, so it has no such setting (parity.md).

Wear OS

SharedPreferences; flags as Boolean, values as strings of a double (e.g. "15.0"). Menus are Wear Material 3 lists; the stem button confirms in the picker.

Changed while recording, a setting applies from the next second. A new distance or time step, or switching a split on, starts a fresh interval: the miles or minutes already counted are dropped, so a split never covers more than its step.

Low Power Screen is the fourth item of Settings, sub-label After <n> s. It opens the picker Low Power After (5 s … 60 s, the current value focused). It exists only on Wear OS: Garmin uses the watch's own display timeout.

Apple Watch

⏳ Phase 5 of the plan: the same alerts, splits and settings.

States and edge cases

  • No barometer: Baro never fires; the setting stays visible.
  • Battery reported as 0: treated as unknown, no alert.
  • Stationary all night: no time updates; Float fires every 15 s if the boat moves at or above the limit.
  • Alert and split in the same second: the split waits for the alert to close.

Known deviations

  • Baro message says "/ 3h", but the check compares the oldest and newest sample of the trend buffer, which spans up to 30 min in the first half hour, up to 90 min until two hours, then up to 6 h. It is not a 3-hour window.
  • Float repeats every 15 s while the boat keeps moving in a stationary state, including Adrift, where drifting is expected.
  • Auto-stats overlays show about 5 s, alerts 6 s: auto-stats are created before the countdown step of the same tick.