VEU.WathBody/1-docs/4-modules/m12-watch-channel/api_specs/02-hr-sample-store.md

54 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Спецификация 02: HrSampleStore — буфер пульса (чистый JVM)
Источники: Ф-3.2 (текущее значение + линия последнего подхода),
module_reqs разд. 1 (буфер, устаревание >10 с, решение 4 — только
память). Единица 2.
## 1. Интерфейс
```kotlin
class HrSampleStore {
fun add(bpm: Int, atMs: Long) // сэмпл транспортом
fun current(nowMs: Long, staleAfterMs: Long = 10_000): Int?
fun average(fromMs: Long, toMs: Long): Int? // среднее за окно
fun series(fromMs: Long, toMs: Long): List<Pair<Long, Int>> // (atMs, bpm)
fun clear() // сброс (новая тренировка)
val lastSampleAtMs: Long?
}
```
- время — абсолютные миллисекунды (`System.currentTimeMillis()`
передаётся вызывающим; в тестах — фикссированные значения);
- хранение: весь список сэмплов сессии (`ArrayList<Pair<Long, Int>>`)
— при 1 Гц и 3-часовой тренировке ~10⁴ записей, деградации
памяти нет; среднее считается инкрементально по окну проходом
(список короткий), без накопления суммы всей сессии;
- `current`: последний сэмпл, если `nowMs − atMs ≤ staleAfterMs`,
иначе `null` (прочерк, «нет данных»);
- `average`: арифметическое `Int` (округление вниз) по сэмплам
окна `[fromMs, toMs]`; пусто → `null`; `toMs` обычно «сейчас»;
- `series` — сэмплы окна в порядке поступления (линия последнего
подхода: `fromMs = время последнего logSet`, толщина линии —
один сэмпл = одна точка);
- значения bpm вне 30–250 в буфер не попадают (отфильтрованы
парсером, спец 01 §3 — двойная защита: `add` тоже игнорирует
вне диапазона).
## 2. Связь с тренировкой
- окно средней — от старта тренировки (`workout.startedAt`) до
финиша; сэмплы вне окна (канал работал до старта — экран
«Допуск») в среднее не входят;
- `clear()` вызывается фасадом при `unbind` после финишированной
тренировки; между тренировками буфер накапливается только при
открытом экране «Допуск» (для «взять с часов», спец 03 §4).
## 3. Тесты (pure JVM)
- фильтрация диапазона при `add`;
- `current`: свежий / устаревший (10 001 мс) / пустой буфер;
- `average`: пусто → null; одно значение; окно вырезает сэмплы
до/после; округление вниз (127,5 → 127);
- `series`: порядок и граница окна включительно;
- `clear` обнуляет всё.