Hydration reminder: level-based drink alerts during a ride or VR

A shared Hydration singleton (ticked by the GPS ride service and the HR/VR
service, deduped in one process) accrues the body's water need over an active
session and subtracts what you logged via the "+вода" button. It stays silent
while you keep up — can be quiet for hours — and only beeps LOUD on the alarm
stream (cuts through media volume) once the running deficit passes a threshold,
then re-beeps on a cooldown. Not a fixed timer.

Rust set_hydration_config / hydration_drink bridge JS settings and the "+вода"
button to hydration.json / water_drink.txt that the native service reads.
This commit is contained in:
4aiman 2026-10-24 01:13:43 +03:00
commit 6183f0c529
13 changed files with 271 additions and 6 deletions

View file

@ -0,0 +1,31 @@
# 2026-10-24 - Уровневое напоминание пить на тренировке
## Что
Напоминание пить во время велозаезда и VR. НЕ фиксированный таймер (в норме молчит часами) -
уровневая модель: во время активности копится потребность в воде (пот), кнопка «+вода» гасит
отставание; громкий сигнал только когда дефицит превышает порог.
## Реализация
- `Hydration.kt` (новый) - синглтон на процесс (оба сервиса в одном процессе -> дедуп, нет двойных
бипов на заезде с ремнём). `tick()` копит `sweatMlPerHour` за время, вычитает выпитое из
`water_drink.txt`, сигналит (ToneGenerator STREAM_ALARM - пробивает громкость + вибро +
уведомление) при дефиците >= `alertMl`, повтор через `reAlertMin`. Конфиг `hydration.json`.
- `GpsRecorderService.kt` (велозаезд) и `BleHrService.kt` (VR) тикают `Hydration` (reset при старте).
- Rust: `set_hydration_config(enabled, alert_ml, sweat_ml_per_hour, re_alert_min)`,
`hydration_drink(ml)` (пишет в `water_drink.txt`, оба пути корня). Манифест: VIBRATE.
- JS: настройка в профиле (вкл, сигнал при отставании мл, +вода за нажатие мл); кнопка «+вода» на
экране записи -> `hydration_drink` + `DB.logWaterDrink` (ищет 100%-воду, идёт в дневной итог).
## Эволюция (несколько итераций по уточнениям)
- Сначала привязал к HR-сервису (VR). Исправлено: главное - велик, значит GPS-сервис.
- Сначала фиксированный интервал. Исправлено: не таймер, а УРОВЕНЬ (дефицит), молчит пока пьёшь.
## Статус
Собрано (0.1.519), JS/Rust/Kotlin компилируются. Залито на роутер
(http://192.168.1.1:88/baldav/baldav.apk) и VPS (https://4aiman.top/baldav/baldav.apk) - build 519.
НА УСТРОЙСТВЕ НЕ ПРОВЕРЕНО (телефон был отключён). Проверка: профиль -> включить, старт «Вело»,
подождать, «+вода» гасит.
## Дальше
- Кнопка «+вода» на экране VR (сейчас только на записи-карте).
- Возможно вынести sweatMlPerHour/reAlertMin в настройки (сейчас 600/15 по умолчанию).