diff --git a/PROJECT_MAP.md b/PROJECT_MAP.md index ed43361..b672f03 100644 --- a/PROJECT_MAP.md +++ b/PROJECT_MAP.md @@ -6,12 +6,12 @@ | Метрика | Значение | |---------|----------| -| Строк кода | ~18000 | -| Файлов исходников | 44 | -| Язык | JS 71%, Rust 4%, Kotlin 10%, CSS 15% | -| Таблиц в БД | 17 | -| Экранов | 7 основных + 12 модалок | -| IPC команд (Tauri) | 6 | +| Строк кода | ~22000 | +| Файлов исходников | 50+ | +| Язык | JS 70%, Rust 6%, Kotlin 12%, CSS 12% | +| Таблиц в БД | 20 | +| Экранов | 7 основных + 15 модалок | +| IPC команд (Tauri) | 14 | | Библиотеки | Leaflet, Chart.js, Hammer.js, JSZip | | Платформы | Android (Kotlin), Desktop (Tauri) | @@ -21,12 +21,12 @@ | Файл | Строк | Назначение | |------|-------|------------| -| `js/main.js` | 4214 | Экраны, навигация (winStack), модалки, графики, нутриенты | -| `js/db.js` | 1167 | SQLite через Tauri IPC. Миграции, CRUD, 36 полей добавок | -| `js/gps.js` | 1048 | GPS запись, физика ккал (power model), haversine, импорт/экспорт | +| `js/main.js` | ~5000 | Экраны, навигация (winStack), модалки, графики, нутриенты, HR UI | +| `js/db.js` | ~1400 | SQLite через Tauri IPC. Миграции, CRUD, 41 поле добавок, water_pct, reserves | +| `js/gps.js` | ~1100 | GPS запись, физика ккал (power model), altitude filter, BLE HR polling | | `js/tilecache.js` | 178 | Оффлайн кэш тайлов карты (IndexedDB) | -| `js/bmr.js` | 61 | BMR (Mifflin-St Jeor + реальный из истории веса), таблица РСП (27 нутриентов) | -| `css/styles.css` | 1893 | Темная тема, мобильный дизайн | +| `js/bmr.js` | ~70 | BMR (Mifflin-St Jeor), РСП из БД (33 нутриента), полураспад | +| `css/styles.css` | ~2000 | Темная тема, мобильный дизайн, HR зоны | | `index.html` | 26 | Точка входа, порядок загрузки скриптов | | `data/products_seed.db` | 8.2MB | 13481 продукт (magnit 8627, 5ka 3103, ION 1078, kdv 672, manual 1) | @@ -36,31 +36,33 @@ | Файл | Строк | Назначение | |------|-------|------------| -| `src/lib.rs` | 512 | Миграции v1, IPC команды, seed import | +| `src/lib.rs` | ~540 | Миграции v1, IPC команды, seed import, update check | +| `src/ble.rs` | ~470 | BLE HR: btleplug (desktop), file IPC (Android), FitPro + Standard HR | | `src/main.rs` | 5 | Точка входа | -| `Cargo.toml` | 18 | tauri, tauri-plugin-sql, rusqlite, serde | +| `Cargo.toml` | — | tauri, tauri-plugin-sql, rusqlite, serde, btleplug, tokio, uuid | | `tauri.conf.json` | — | Конфиг приложения, плагины, ресурсы | ### Android Kotlin (`src-tauri/gen/android/.../dev/baldav/app/`) | Файл | Строк | Назначение | |------|-------|------------| -| `MainActivity.kt` | 153 | FileObserver для IPC, seed DB копирование, safe insets, SAF | +| `MainActivity.kt` | ~300 | FileObserver IPC, seed DB, safe insets, SAF, BLE commands, OTA check | | `GpsRecorderService.kt` | 205 | Foreground service GPS, WakeLock, JSONL батчевая запись | +| `BleHrService.kt` | ~340 | Foreground service BLE HR, FitPro protocol, GATT queue, scan/connect | | `generated/*.kt` | ~1100 | Tauri-сгенерированные: WebView, IPC, permissions | ### Инструменты (`tools/`) | Скрипт | Назначение | |--------|------------| -| `5ka_scraper.user.js` | Tampermonkey скрейпер 5ka.ru (рекурсивный BFS категорий) | +| `5ka_scraper.user.js` | Tampermonkey скрейпер 5ka.ru (BFS категорий, Load JSON) | +| `magnit_scraper.user.js` | Tampermonkey скрейпер magnit.ru (NUXT_DATA парсинг) | | `ion_scraper.user.js` | Tampermonkey скрейпер web.ion.ru (fetch, без перезагрузок) | | `import_ion.js` | Импорт ION продуктов в seed DB | | `import_with_dedup.js` | Импорт с дедупликацией по имени | | `enrich_nutrients.js` | Обогащение микронутриентами из ION | | `parse_magnit.js` | Парсер HTML каталога Магнит | | `parse_kdv.js` | Парсер HTML каталога KDV | -| `scrape_5ka.js`, `scrape_5ka_api.js` | CLI скрейперы 5ka | | `download_tiles.js` | Скачивание тайлов карт для оффлайна | | `fetch_openfoodfacts.js` | OpenFoodFacts API | | `fuzzy_dedup.js` | Нечёткая дедупликация | @@ -69,7 +71,7 @@ | Файл | Назначение | |------|------------| -| `build.sh` | Сборка: android/debug/release, sync frontend, версионирование | +| `build.sh` | Сборка: android/debug/release, sync frontend, версионирование, -u upload на VPS | | `BUILD_NUMBER` | Автоинкремент номера сборки | | `ion_products.json` | 1111 продуктов ION (сырые данные скрейпера) | | `5ka_products_fresh.json` | 3103 продукта 5ka (сырые данные) | @@ -94,8 +96,12 @@ | `supplements` | Добавки (БАД) | name, daily_dose_g, витамины/минералы | | `supplement_log` | Приём добавок | date, supplement_id, dose_g | | `gps_sessions` | GPS тренировки | date, activity_type, distance, kcal, speed, elevation, bike_id | -| `gps_points` | Точки трека | session_id, ts, lat, lon, altitude, speed, seq | +| `gps_points` | Точки трека | session_id, ts, lat, lon, altitude, speed, seq, heart_rate, spo2, bp_sys, bp_dia | | `bikes` | Велосипеды | name, weight_kg, wheel, звёзды, surface_type, is_active | +| `rdi_standards` | Стандарты РСП (RU/EU/US) | code, name | +| `rdi_values` | Нормы нутриентов | standard_id, nutrient_key, value, norm_type (rdi/aup) | +| `nutrient_halflife` | Полураспад нутриентов | nutrient_key, halflife_avg_days | +| `nutrient_reserves` | Запасы нутриентов по дням | date, reserves (JSON) | ### Seed DB (products_seed.db) @@ -115,11 +121,11 @@ ``` ### Экраны -- **Сегодня** — дневной баланс ккал, еда (продукты + блюда), активность, вес, сон, добавки, статистика (графики) +- **Сегодня** — баланс ккал, еда (продукты + блюда), GPS тренировки, активность, вес, сон, добавки, прогресс-бар жидкости, нутриенты (приход + запасы) - **Продукты** — подтабы [Продукты | Рецепты], поиск, карточки с КБЖУ, добавление в дневник -- **Трек** — список GPS тренировок, запись, импорт GPX/FTB, скачивание карт -- **Добавки** — список БАД, логирование приёма -- **Настройки** — профиль (вес, рост, BMR), велосипеды, GPS конфиг, оффлайн режим +- **Трек** — GPS тренировки (запись с HR), карта, графики скорости/высоты/ЧСС, импорт GPX/FTB +- **Добавки** — 41 нутриент (витамины, минералы, жирные кислоты, женьшень, ресвератрол, CoQ10) +- **Настройки** — профиль, образ жизни, нормы ЧСС/давления, BLE пульсометр, велосипеды, GPS конфиг, OTA обновления ### Модалки - Еда: showFoodModal, showEditFoodModal, showFoodFromRecipeModal @@ -133,10 +139,19 @@ |---------|------------| | `import_seed_products` | Импорт продуктов из seed DB, прогресс-события | | `get_safe_insets` | Отступы Android status/nav bar | -| `gps_service_command` | start/stop GPS сервиса | +| `gps_service_command` | start/stop GPS + BLE команды (ble_scan/connect/disconnect) | | `gps_service_read_points` | Чтение JSONL файла точек | | `save_file` | SAF диалог сохранения (GPX экспорт) | | `get_app_info` | Версия, git hash, дата сборки | +| `get_update_info` | Проверка OTA обновления (BUILD_NUMBER с VPS) | +| `ble_scan` | Сканирование BLE устройств | +| `ble_scan_results` | Результаты скана (Android) | +| `ble_connect` | Подключение к BLE устройству | +| `ble_disconnect` | Отключение BLE | +| `ble_get_hr` | Последние данные HR/SpO2/BP | +| `ble_is_connected` | Статус подключения | +| `ble_check_bluetooth` | Состояние Bluetooth адаптера | +| `ble_save_device` | Сохранение привязанного устройства | ## Формула ккал (GPS) diff --git a/README.md b/README.md index ceafba6..355b8f3 100644 --- a/README.md +++ b/README.md @@ -4,26 +4,32 @@ ## Возможности -- **Дневник питания** — 13480 продуктов из магазинов (Магнит, 5ка, KDV) + база ИОН с микронутриентами. Рецепты с учётом термообработки (потери витаминов при варке/жарке). Единицы измерения (штуки, ложки, стаканы). -- **GPS трекинг** — запись маршрутов на велосипеде/пешком в фоне. Оффлайн карты (Leaflet + IndexedDB кэш). Импорт GPX/FTB (FitoTrack). Экспорт GPX. -- **Расчёт ккал** — физическая модель для велосипеда (мощность из gradient + Crr + CdA). MET-таблица для ходьбы/бега. Профили велосипедов (вес, звёзды, покрытие). -- **Графики** — скорость и высота тренировки с зумом. Тренд веса. Донат макронутриентов. Баланс ккал (приход/расход). +- **Дневник питания** — 13480 продуктов из магазинов (Магнит, 5ка, KDV) + база ИОН с микронутриентами. Рецепты с учётом термообработки (потери витаминов при варке/жарке). Единицы измерения (штуки, ложки, стаканы). Ввод количества формулами (4*30, 300+50). +- **GPS трекинг** — запись маршрутов на велосипеде/пешком в фоне. Оффлайн карты (Leaflet + IndexedDB кэш). Импорт GPX/FTB (FitoTrack). Экспорт GPX. Фильтр altitude outlier'ов и GPS-залипаний. +- **BLE пульсометр** — подключение к FitPro браслетам и стандартным HR датчикам (0x180D). ЧСС, SpO2, давление в реальном времени при записи трека. +- **Расчёт ккал** — физическая модель для велосипеда (мощность из gradient + Crr + CdA). MET-таблица для ходьбы/бега. Профили велосипедов. BMR по Mifflin-St Jeor с коэффициентом активности. +- **Нутриенты** — 37 микронутриентов (витамины, минералы, жирные кислоты, женьшень, ресвератрол, CoQ10). Нормы РСП/АУП (РФ/ЕС/США). Фармакокинетика — запасы в организме по полураспаду. +- **Трекинг жидкости** — water_pct в продуктах, прогресс-бар, настраиваемая норма. +- **Графики** — скорость, высота, ЧСС тренировки с зумом и pan. Тренд веса. Донат макронутриентов. Баланс ккал (приход/расход). +- **OTA обновления** — проверка BUILD_NUMBER на VPS, скачивание через браузер. - **Вес, сон, добавки** — логирование с историей. ## Стек - **Frontend**: чистый JavaScript, HTML, CSS. Без React/Vue/bundler. -- **Backend**: Rust (Tauri 2) — SQLite, IPC, seed import. -- **Android**: Kotlin — foreground GPS service, WakeLock, SAF. +- **Backend**: Rust (Tauri 2) — SQLite, IPC, seed import, BLE (btleplug на десктопе). +- **Android**: Kotlin — foreground GPS service, BLE HR service, WakeLock, SAF. - **Библиотеки**: Leaflet (карты), Chart.js (графики), Hammer.js (жесты), JSZip. ## Сборка ```bash # Зависимости: Rust, Node.js, Android SDK + NDK -./build.sh -d android # debug APK -./build.sh android # release APK -./build.sh -i android -d # debug + установка на устройство +./build.sh -d android # debug APK +./build.sh android # release APK +./build.sh -i android -d # debug + установка на устройство +./build.sh -u android # release + upload на VPS (OTA) +./build.sh -d -i -u android # debug + install + upload ``` ## Структура @@ -32,19 +38,24 @@ ``` frontend/ - js/main.js — UI, навигация, модалки (3264 строк) - js/db.js — БД, миграции, CRUD (972) - js/gps.js — GPS, физика ккал (947) - js/tilecache.js — оффлайн тайлы (178) - css/styles.css — стили (1599) + js/main.js — UI, навигация, модалки (~5000 строк) + js/db.js — БД, миграции, CRUD (~1400) + js/gps.js — GPS, физика ккал, BLE HR polling (~1100) + js/bmr.js — BMR формула, РСП, полураспад нутриентов + js/tilecache.js — оффлайн тайлы (IndexedDB) + css/styles.css — стили, тёмная тема data/products_seed.db — 13480 продуктов src-tauri/ - src/lib.rs — Rust бэкенд (512) - gen/android/ — Kotlin: MainActivity, GpsRecorderService + src/lib.rs — Rust бэкенд, seed import + src/ble.rs — BLE HR (btleplug десктоп, file IPC Android) + gen/android/ — Kotlin: MainActivity, GpsRecorderService, BleHrService tools/ - *_scraper.user.js — скрейперы магазинов (Tampermonkey) - import_*.js — импорт в seed DB - enrich_nutrients.js — обогащение микронутриентами + 5ka_scraper.user.js — Tampermonkey скрейпер 5ка + magnit_scraper.user.js — Tampermonkey скрейпер Магнит + ion_scraper.user.js — Tampermonkey скрейпер ИОН +smart/ + protocol.js — FitPro BLE протокол (reverse-engineered) + hr-reader.js — Node.js прототип чтения ЧСС ``` ## Данные продуктов