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

3.3 KiB
Raw Permalink Blame History

Спецификация 02: HrSampleStore — буфер пульса (чистый JVM)

Источники: Ф-3.2 (текущее значение + линия последнего подхода), module_reqs разд. 1 (буфер, устаревание >10 с, решение 4 — только память). Единица 2.

1. Интерфейс

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 обнуляет всё.