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

12 KiB
Raw Permalink Blame History

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