VEU.WathBody/Техническое задание.md

93 lines
12 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.

Техническое задание на разработку приложения для силовых тренировок «Феникс 6X» (Garmin Edition)
Дата составления: 17.10.2026
1. Общие сведения
Наименование проекта: Мобильное приложение «Феникс 6X» для контроля силовых тренировок.
Платформы: Смартфон (Android/iOS), умные часы Garmin Fenix 6.
Тип использования: Личное (без авторизации, регистрации и многопользовательского доступа).
Архитектура: Клиент-серверная. Клиент (телефон + часы), личный сервер (бекенд).
Цель: Автоматизация сбора данных о тренировках, контроль кардионагрузки (пульса) и фиксация результатов без использования рук.
2. Функциональные требования
2.1. Приложение на смартфоне (Управляющий центр)
Главный экран: Отображение текущей тренировки, таймера отдыха, текущего пульса (график за последний подход) и кнопки «Начать тренировку».
Библиотека упражнений: Редактируемый список силовых упражнений (жим, присед, тяга и т.д.). Возможность добавлять, удалять и переименовывать упражнения.
Голосовой ввод (ключевая функция):
Активация по голосовой команде (например, «Феникс, записывай») или нажатием кнопки на экране.
Распознавание фраз: «Подход 120 на 8», «Вес 80», «Отдых 90 секунд».
Автоматическое сохранение данных в текущую тренировку.
Голосовое подтверждение: «Принято, подход 120 на 8».
История тренировок: Список завершенных тренировок с датой, временем, средним пульсом и списком выполненных упражнений.
Профиль пользователя (статичный): Экран с настройками, где один раз вводятся пол, возраст и вес для калибровки зон пульса. Данные хранятся локально.
2.2. Приложение на часах Garmin Fenix 6
Важное архитектурное уточнение: Garmin не позволяет сторонним приложениям на телефоне получать данные пульса с часов в реальном времени через стандартный Bluetooth. Основной способ — нативное приложение для самих часов.
Тип приложения: Нативный виджет (Widget) или поле данных (Data Field) для нативного типа тренировки «Силовая» (Strength) в экосистеме Garmin.
Язык разработки: Monkey C (Garmin Connect IQ SDK).
Основной сценарий: Пользователь запускает на часах встроенный профиль тренировки «Силовая». На экране отображается кастомное поле данных.
Функционал на часах:
Отображение метрик: Крупный текущий пульс, средний пульс за подход, время под нагрузкой.
Цветовая индикация зон: Фон экрана или ободок меняют цвет в зависимости от пульсовой зоны (синхронизируется с данными из профиля на телефоне).
Управление подходом: Использование физических кнопок часов (например, кнопки Lap) для фиксации конца подхода.
Автономность: Часы полностью автономны. Они сами пишут трек пульса и нажатия кнопок.
2.3. Серверная часть (Личный сервер) и синхронизация
Источник данных: Данные выгружаются по завершении тренировки из облака Garmin Connect.
Механизм: После сохранения на часах тренировка попадает в Garmin Connect. Личный сервер использует Garmin Connect API.
Процесс: Скрипт на сервере забирает файл тренировки .fit, парсит его (извлекая дискретные значения пульса и нажатия кнопки Lap) и сохраняет структурированные данные в собственную базу данных.
Веб-интерфейс: Простая страница на сервере для просмотра истории тренировок с компьютера (таблица с возможностью выгрузки в CSV).
3. Требования к интерфейсу (UI/UX)
3.1. Общие принципы
Минимализм: Отсутствие лишних элементов. На экране во время подхода — не более 3-4 активных элементов.
Крупные зоны касания: Все кнопки на телефоне должны быть доступны для нажатия в перчатках или мокрыми руками.
Контрастность: Темная тема по умолчанию (черный фон) для экономии батареи AMOLED-дисплеев и снижения бликов.
Типографика: Крупный, высококонтрастный гротеск (Roboto, Inter) для цифр пульса и веса.
3.2. Экран активной тренировки (Смартфон)
Верхняя строка: Индикатор подключения к часам (зеленый/красный), уровень заряда часов, статус сети (Онлайн/Офлайн).
Центральный блок: Крупное числовое значение текущего пульса. Под ним — пульсирующая линия кардиограммы.
Блок упражнения: Название текущего упражнения и текущий рабочий вес.
Блок таймера: Крупный обратный отсчет отдыха. Цвет фона: красный (идет отдых), желтый (<10 сек), зеленый (пора начинать).
Нижняя панель: Кнопка «Голосовой ввод» (микрофон), кнопка «Сбросить».
3.3. Экран активной тренировки (Часы Garmin Fenix 6)
Экран 1 (Пульс и таймер): По центру — пульс (шрифт 40-48pt). Под ним — цветной ободок зоны пульса. Внизу — таймер отдыха.
Цветовая индикация зон: Синий (<50% макс. ЧСС), Зеленый (50-70%), Желтый (70-85%), Красный (>85%).
Управление: Кнопка Lap — завершить подход. Кнопка Start/Stop — пауза тренировки.
3.4. Обратная связь (Feedback)
Звуковые сигналы: На телефоне — короткий «щелчок» при сохранении голосовой команды.
Вибрация: На часах — легкая вибрация при окончании отдыха или выходе пульса из зоны.
Голосовое подтверждение: Телефон произносит записанные данные.
4. Технические требования
4.1. Смартфон
ОС: Android 11.0+ / iOS 15.0+.
Соединение: Bluetooth 5.0+ для связи с часами (для управления виджетом).
Разрешения: Доступ к микрофону, Bluetooth, уведомлениям, фоновой работе.
Локальная БД: SQLite / Room / Core Data для хранения тренировок офлайн.
4.2. Часы Garmin Fenix 6
Платформа: Garmin Connect IQ 4.0+.
Датчики: Оптический пульсометр Elevate Gen 3.
Экран: 1.3 дюйма, трансфлективный MIP, 260x260 px (не сенсорный, управление кнопками).
Связь: Bluetooth Smart, Wi-Fi (версии Pro/Sapphire).
4.3. Сервер
Стек: Любой (например, Python FastAPI + PostgreSQL).
Протокол: HTTPS (REST API).
Аутентификация: По статическому API-ключу, прописанному в настройках приложения.
Идемпотентность API: Сервер должен корректно обрабатывать дубликаты данных при повторных попытках отправки с телефона.
5. Обработка ошибок и автономность
5.1. Потеря связи с часами (Bluetooth)
Поведение: Приложение на телефоне не блокируется. Индикатор связи становится серым.
Голосовой ввод: Работает всегда. Данные сохраняются в локальную очередь на смартфоне с пометкой «Локально».
Восстановление: При возврате связи приложение запрашивает у часов данные о пульсе за пропущенный период и сопоставляет их с локально записанными подходами по времени.
5.2. Потеря интернет-соединения (Синхронизация с сервером)
Поведение: Все данные сначала пишутся в локальную БД. При попытке отправки на сервер данные попадают в очередь sync_pending.
Голосовое распознавание (NLP): Должен быть интегрирован локальный движок (офлайн-распознавание цифр и базовых команд). Если интернета нет, серверное распознавание отключается.
История: В офлайн-режиме приложение показывает локальный кэш тренировок.
Уведомления: При потере связи — тихий баннер «Синхронизация временно недоступна». При восстановлении — «Данные успешно синхронизированы».
6. Порядок разработки (MVP)
Создание нативного виджета для Garmin Fenix 6 (отрисовка пульса, работа кнопки Lap).
Связь телефона с часами (обнаружение устройства, статус-бар).
Экран активной тренировки на телефоне (отрисовка пульса и таймера).
Реализация голосового ввода на телефоне (офлайн-распознавание «Вес X на Y»).
Сохранение данных в локальную базу на телефоне.
Реализация API на личном сервере.
Настройка скрипта на сервере для забора данных из Garmin Connect API (парсинг .fit файлов).
Реализация функции синхронизации телефона с личным сервером с поддержкой очереди и идемпотентности.
Добавление раздела «История» и веб-интерфейса на сервере.