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_HIonce. - Vibration: 100 % for 250 ms, 150 ms off, three times.
- Watches without a speaker or vibration motor stay silent or still.
Wear OS¶
- Beeps:
ToneGeneratoron the alarm stream at volume 100,TONE_PROP_BEEPfor 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.