14 KiB
Требования к модулю: m13-fenix-data-field
Модуль — FenixDataField (архитектура разд. 1.1): поле данных Connect IQ (Monkey C) «Феникс» в штатном профиле «Силовая»: текущий пульс + зона цветом, метрики подхода (время, средний пульс), автономный таймер отдыха с вибрацией. Самодостаточная копия требований (d-dev-6). Источники: Ф-2.1–Ф-2.8 (requirements), errata Ф-2.4 (m12, автономный таймер), ОВ-7 (tech-req 1, таргеты), tech-req 6 п. 1 (UI/UX часов), 7 п. 1 (закрытие части «таймер» прототипа канала), ui-ux-recommendations разд. 2.
1. Назначение и границы
Поле данных на часах во время силовой активности: отображает пульс,
зону и метрики подхода, вибрирует в конце отдыха и при выходе пульса
в красную зону. Только отображение и вибрации — запись .fit ведёт
платформа Garmin (Ф-2.7); часы полностью автономны (Ф-2.4: не
зависимость — никаких требований к телефону).
1.1. Границы подхода (исследование API, 2026-10-19)
Ф-2.3 предполагала границами подхода «штатное событие нового подхода (Strength Set) → событие Lap». Проверка по актуальной документации Connect IQ API (вплоть до текущей версии платформы):
- События/данных повторений в Connect IQ API нет — ни в
Toybox.Activity(6 классов: Info, ProfileInfo, SplitInfo, WorkoutStep…; уActivity.Infoнет полей сетов/повторов), ни отдельным модулем; классов повторений нет в общем списке классов. Это не ограничение fenix 6X — API не существует ни в одной версии платформы: штатная детекция повторений «Силовой» сторонним кодом недоступна. - Доступно полю данных:
compute(info as Activity.Info)— раз в секунду (currentHeartRate— Number|Null, API 1.0.0);onTimerLap()— нажатие кнопки Lap (API 1.3.0); таймерные колбэкиonTimerStart/Stop/Pause/Resume/Reset(API 1.3.0);Attention.vibrate([VibeProfile(duty, мс)])— до 8 профилей подряд, поля данных поддержаны (API 1.0.0); собственная разметка экрана (onLayout+ отрисовкаdc, параметрическая поdc.getWidth/getHeight). - Решение v1 (errata Ф-2.3, разд. 5): границы подхода = между
нажатиями Lap — штатная семантика «Силовой» (Lap жмётся в конце
подхода, метки попадают в
.fit, КУ-2 сохраняется). «Время подхода» = интервал с последнего Lap (включает предшествующий отдых — точное время «под нагрузкой» без детекции повторений не измеряется); «средний пульс подхода» = среднееcurrentHeartRateза тот же интервал. Lap обнуляет метрики и стартует таймер отдыха.
В границах модуля:
- проект Monkey C
3-app\5-watch\FenixDataField: манифест (тип datafield, UUID,minApiVersion— не выше 2.1.0, чтобы поле ставилось и на старые CIQ-устройства), таргетная матрицаmonkey.jungle— якорьfenix6x(280×280); добавление модели — строка таргета, код и макет не меняются (мультитаргет-инфраструктура, указание владельца 2026-10-19); - ядро (чистые классы Monkey C, без UI):
SetTracker— метрики подхода: время с границы (Lap), средний пульс интервала (накопление сэмплов изcompute), обнуление поonTimerLap; null-пульс пропускается;RestTimer— автономный таймер отдыха: старт по Lap, длительность из настройкиrestSec(умолчание 120 =Rest.DefaultSecтелефона), обратный отсчёт, конец → вибрация; пауза активности (onTimerPause/Resume) останавливает/ведёт дальше;ZoneCalc— зоны отmaxBpm: < 50 % синяя (recovery), 50–70 % зелёная, 70–85 % жёлтая, > 85 % красная;maxBpmиз настройкиhrMaxBpm, не задана (0) — формула Танаки208 − 0,7 × возраст(настройкаage); возвращает цвет (MIP-палитра) и текстовую подпись зоны;
- экран поля — параметрическая разметка семейства квадратных
MIP-экранов (якоря + размеры от
dc, без фиксированных координат под конкретную модель): текущий пульс — крупнейшее число (FONT_NUMBER_*), плашка/ободок зоны цветом + подпись зоны текстом (цвет — не единственный носитель), строка состояния «ПОДХОД мм:сс · ср N» / «ОТДЫХ мм:сс» (обратный отсчёт), прочерк при отсутствии пульса; - вибрации: конец отдыха — однократная лёгкая; красная зона — двойная с гистерезисом (повторная не раньше 60 с, сброс при возврате в жёлтую зону);
- настройки поля (стандартные properties, settings.xml):
restSec(30–600, умолчание 120),hrMaxBpm(0–250, умолчание 0 = расчёт по формуле),age(14–100, умолчание 45), подписи ru/en; умолчания зашиты в сборку — работают без магазина; - тесты Toybox.Test (модуль есть с API 2.1.0; asserts компилируются out в release): зоны, таймер отдыха, трекер подхода; прогон инструментарием SDK;
- сборка и доставка:
monkeycпо всем таргетам без ошибок, подпись developer-ключом, инструкция sideload на Fenix 6X (developer mode + Garmin Connect Mobile) — в readme модуля.
Вне границ модуля: запись .fit (платформа Garmin), сетевой
обмен из поля (Communications на fenix 6X недоступен полям данных —
errata ОВ-3 m12; канал живого пульса — m12, BLE-трансляция),
редактирование настроек на часах (поля данных не имеют собственных
экранов настроек), публикация в магазине Connect IQ (опция владельца
— см. решение 3 гейта 1.3), добавление таргетов fenix6/6S (по
фактическому парку — строка конфигурации), пульс-оповещения
Safety.HrStrengthMax (абсолютный порог 120 — телефон, Ф-3/Ф-13;
часы красят по процентам Ф-2.2).
2. Решения интерфейса (ui-ux разд. 2, tech-req 6 п. 1)
- Один экран-поле, читается за 1–2 с (glanceable): пульс — главное число; всё остальное — строкой состояния мельче.
- Семантика кнопок не меняется: Lap — конец подхода (штатно), Start/Stop — пауза/стоп активности; поле не требует ни одного нажатия и не перехватывает кнопки (Ф-2.5, Ф-2.6).
- Цвет зоны дублируется подписью (recovery/лёгкая/средняя/высокая — те же названия, что на «Профиле» телефона m10).
- MIP-экран: тёмный фон, высокий контраст, крупные шрифты
(
FONT_NUMBER_*для пульса), 64-цветная палитра; читаемость на солнце не требует подсветки. - Нет пульса (датчик не готов / null) — прочерк «—», остальное живое; поле не падает (Ф-2.8).
3. Инварианты (🛡 — нарушать запрещено)
- Поле не пишет в сеть и не хранит историю (Ф-2.7): только отображение и вибрации; запись активности ведёт платформа Garmin.
- Кнопки не перехватываются (Ф-2.5, Ф-2.6): Lap/Start/Stop — штатная обработка; поле не блокирует паузу, остановку и сохранение активности.
- Часы автономны (Ф-2.4): поле не требует телефона и никак его не вызывает; работа поля не зависит от наличия связи с чем бы то ни было.
- Отсутствующая функция молча пропускается (Ф-2.8): нет пульса — прочерк; вибрация недоступна на модели — просто не вызывается; поле не падает.
- Один исходный код (Ф-2.8, указание владельца 2026-10-19): функциональное поведение одинаково на всех таргетах; разметка — параметрический макет семейства экранов; добавление модели часов — конфигурация сборки без правок кода.
- Секретов нет: поле ничего не передаёт — ключей, паролей и персональных данных в коде/настройках нет (настройки — возраст, макс. ЧСС, отдых).
4. Критерии приёмки модуля
monkeycсобирает все таргеты матрицы без ошибок и предупреждений (кроме подавленных обоснованно); тестыToybox.Testзелёные (зоны, таймер отдыха, метрики подхода).- Симулятор Connect IQ: поле добавляется в профиль Strength; пульс/зона/строка подхода отображаются и обновляются раз в секунду; Lap обнуляет метрики и запускает отдых; вибрации вызываются (видно в логе симулятора).
- Приёмка на устройстве владельца (Fenix 6X, якорь): sideload
dev-сборки; «Силовая» с полем «Феникс»: пульс и зона на экране,
Lap — граница подхода, вибрация конца отдыха, двойная вибрация
в красной зоне; метки Lap присутствуют в
.fitвыгрузки Garmin Connect (проверяется импортом m06/консолью m08). - Деградация: без пульс-данных — прочерк, поле живое; пауза активности — таймер стоит; модель без вибрации — остальное работает (Ф-2.8, смок владельца на имеющемся парке).
5. Errata НД (по утверждении гейта 1.3; ВНЕСЕНА 2026-10-19)
- requirements Ф-2.1: «время текущего подхода (под нагрузкой)» → «время с последнего Lap (границы подхода — Ф-2.3; включает предшествующий отдых — точное время „под нагрузкой“ не измеряется: детекция повторений недоступна Connect IQ API, errata 2026-10-19)»;
- requirements Ф-2.3: «от штатного события нового подхода (Strength Set) до события Lap» → «между нажатиями кнопки Lap (штатная семантика „Силовой“: Lap — конец подхода, метки Lap попадают в .fit, КУ-2): событие Strength Set в Connect IQ API отсутствует (errata 2026-10-19 — класса повторений нет ни в одной версии платформы, проверено по актуальному API); метрики подхода считаются за интервал Lap→Lap и обнуляются на Lap»;
- requirements Ф-2.2 — правка не потребовалась: норма уже содержит «границы — из настроек поля данных (Connect IQ settings; автоматическая передача с телефона — открытый вопрос 3)»;
- tech-requirements 7 п. 1: дополнено «вибрация конца отдыха и метрики подхода Lap→Lap — приёмка m13».
Волна внесена одним пакетом после «утверждаю» гейта 1.3 (без подъёма версий документов — errata в телах разделов, версии поднимутся на ближайшем ревью; прецедент — волна m12).