93 lines
12 KiB
Markdown
93 lines
12 KiB
Markdown
Техническое задание на разработку приложения для силовых тренировок «Феникс 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 файлов).
|
||
Реализация функции синхронизации телефона с личным сервером с поддержкой очереди и идемпотентности.
|
||
Добавление раздела «История» и веб-интерфейса на сервере.
|
||
|