Workout mode: HR-only recording (зарядка) without GPS
New 'Зарядка' activity type records a session with no GPS - no location service, no watchPosition, no track points - just the heart-rate poll and a timer, for indoor exercise. kcal comes from HR (Keytel gross minus BMR, net like the rest of the app) and counts in the daily balance. - gps.js: GPS.hrKcalNet; startRecording/stopRecording 'workout' branches; the HR poll appends [relSec,bpm] samples. - db.js: gps_sessions.hr_samples column + setSessionHrSamples. - main.js: 'Зарядка (пульс)' option; renderWorkoutInline (map-less live screen: big HR, timer, kcal, connect-sensor button); renderWorkoutDetail (HR chart by zones, load, avg/max). - tools/hr_log.py: background HR logger (standard 0x180D, no pairing). Sensor read from the desktop confirmed on a Coospo H808S (F7:72:74:A4:FB:07, ~1 Hz) without pairing.
This commit is contained in:
parent
dd1642b6e9
commit
f704498d11
7 changed files with 295 additions and 3 deletions
40
docs/session-logs/2026-10-17_hr-workout-mode.md
Normal file
40
docs/session-logs/2026-10-17_hr-workout-mode.md
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
# Сессия 2026-10-17 - HR-датчик Coospo H808S: чтение + режим "Зарядка" без GPS
|
||||
|
||||
## Датчик прочитан с ПК (без спаривания)
|
||||
`F7:72:74:A4:FB:07` (`808S 0026275`), стандарт 0x180D/0x2A37. `tools/ble_probe.py`
|
||||
подключается без pair(), живой пульс ~1/сек (+ RR). `tools/hr_log.py` - фоновый логгер
|
||||
(epoch,bpm в файл, авто-переподключение). Адаптер ПК - hci1 (один). Подробности в памяти
|
||||
project-hr-sensor.
|
||||
|
||||
## Режим "Зарядка" (workout) - запись без GPS, только пульс + нагрузка
|
||||
Нужен был режим трекинга без геолокации (домашняя зарядка): меряет пульс и ккал, GPS не
|
||||
включает и не пишет.
|
||||
|
||||
- `frontend/js/gps.js`:
|
||||
- `GPS.hrKcalNet(samples, profile)` - нетто-ккал по пульсу (Keytel gross минус BMR/мин,
|
||||
как и остальная активность). samples = [[relSec,bpm]].
|
||||
- `startRecording(type, wkg, profile)` - ветка `workout`: НЕ запускает нативный GPS-сервис,
|
||||
watchPosition, поллинг точек. Создаёт сессию (`activity_type="workout"`), запускает HR-опрос.
|
||||
- HR-опрос (`_startHrMonitor`) при workout пушит `[relSec,bpm]` в `GPS.recording.hrSamples`.
|
||||
- `stopRecording` ветка workout: считает ккал (Keytel), avg/max пульс, сохраняет `hr_samples`
|
||||
(JSON) + `finishGpsSession(dist=0, kcal)`.
|
||||
- `frontend/js/db.js`: миграция `gps_sessions.hr_samples TEXT`; `setSessionHrSamples`.
|
||||
- `frontend/js/main.js`:
|
||||
- выпадашка записи: "Зарядка (пульс)".
|
||||
- `renderWorkoutInline` - экран записи без карты: крупный пульс, таймер, живые ккал,
|
||||
средний/макс, кнопка "Подключить пульсометр" (с проверкой BT), Стоп -> деталь.
|
||||
- `renderWorkoutDetail` - деталь без карты: график пульса (цвет по HR-зонам), время,
|
||||
нагрузка (ккал), средний/макс, удалить.
|
||||
- `frontend/css/styles.css`: `.workout-screen` и пр.
|
||||
|
||||
Ккал зарядки идёт в дневной баланс автоматически (`getDailyActivityTotals` суммирует
|
||||
`gps_sessions.total_kcal`). `recalculateSession` для workout - no-op (точек нет, возвращает null),
|
||||
так что "Пересчитать всё" не затирает HR-ккал.
|
||||
|
||||
## Осталось (отдельным коммитом)
|
||||
Заряд ремня ЧСС (0x180F/0x2A19) + голос/писк на 10% и 5%.
|
||||
|
||||
## Проверка
|
||||
Синтаксис JS ок. На телефоне: выбрать "Зарядка", Старт (без браслета покажет "Подключите
|
||||
пульсометр"), подключить датчик -> пульс крупно + ккал растут; Стоп -> деталь с графиком.
|
||||
Нужен BT на телефоне + привязанный датчик. (Сейчас BT на телефоне выключен.)
|
||||
Loading…
Add table
Add a link
Reference in a new issue