A fitness balance app with calories calculator (consumed+burnt), extensive mapping/routing capabilities route for your walks and bike rides
Find a file
4aiman 84a2b786ca GPS: course-up map rotation in landscape + robust screen-off import
- applyBearing: use h, not h - rotOffset. The .rec-screen (map + panel) is
  CSS-rotated by rotOffset in landscape and setBearing adds another rotate on
  the map pane; subtracting rotOffset cancelled the screen rotation for the
  map only, gluing course to the portrait top edge while the panel turned.
  Using h lets the map turn with the screen -> course points to physical top.
- Poll: guard the requestAnimationFrame yield with !document.hidden. rAF never
  fires while the screen is off, so awaiting it there hung the import loop and
  froze point import mid-walk (regression from the progressive-draw change).
- recoverSession: import missing native points by the SET of existing
  timestamps instead of ts > maxDbTs. Sparse screen-gated points can have a
  late max ts, so the old check imported nothing and left the track full of
  gaps; also pass sensorData so bearing/accel/gyro are stored.
2026-07-08 22:11:17 +03:00
frontend GPS: course-up map rotation in landscape + robust screen-off import 2026-07-08 22:11:17 +03:00
src GPS point ordering + GPX export + chart zoom fixes 2026-05-16 21:21:13 +03:00
src-tauri GPS: course-up map rotation in landscape + robust screen-off import 2026-07-08 22:11:17 +03:00
.gitignore Initial commit: BalDav health tracker 2026-05-13 10:21:24 +03:00
data.js GPS point ordering + GPX export + chart zoom fixes 2026-05-16 21:21:13 +03:00
index.html GPS point ordering + GPX export + chart zoom fixes 2026-05-16 21:21:13 +03:00
package-lock.json GPS point ordering + GPX export + chart zoom fixes 2026-05-16 21:21:13 +03:00
package.json Initial commit: BalDav health tracker 2026-05-13 10:21:24 +03:00
PROJECT_MAP.md GPS: course-up map rotation in landscape + robust screen-off import 2026-07-08 22:11:17 +03:00
README.md GPS: course-up map rotation in landscape + robust screen-off import 2026-07-08 22:11:17 +03:00

BalDav

Персональный трекер здоровья и физической активности.

Возможности

  • Дневник питания — 24400+ продуктов (Магнит, 5ка, Health-Diet.ru, Ашан, Макдоналдс, KFC, Додо Пицца, KDV, ИОН, Гриднев). 37 нутриентов (витамины, минералы, omega-3/6, вода, клетчатка). Рецепты с термообработкой. Формулы порций (4*30, 300+50).
  • GPS трекинг — запись маршрутов на велосипеде/пешком в фоне (foreground service, точки пишутся при выключенном экране; один файл на сессию, переживает START_STICKY-перезапуск ОС; полный до-импорт нативных точек по timestamp при финализации — без потерь, даже если экран был выключен всю запись, а при пробуждении экрана точки видимо нарастают на карте по мере импорта). Оффлайн карты (Leaflet + IndexedDB кэш). Импорт GPX/FTB (FitoTrack). Экспорт GPX. Фильтр altitude outlier'ов и GPS-залипаний. Отбор точек по точности (жёсткий порог по настройке «Мин. точность» — рубит грубые сотовые фиксы ~800м, оставляет слабый но точный GPS; где сигнала нет — честный разрыв). Направление (bearing) каждой точки пишется в БД. Вращение карты по компасу (leaflet-rotate, EMA-сглаживание, gimbal lock компенсация) и course-up по GPS-курсу (в ландшафте карта доворачивается вместе с экраном — курс к физическому верху). Ландшафтный режим (CSS rotation + панель справа, 3 режима: off/auto/lock). Dead reckoning при потере GPS (гироскоп + акселерометр). Placeholder до GPS (пиксельарт). Карта проезженных дорог (дедупликация 2м, вело/пешие). Импорт тайлов по регионам (SQLite, роутер LAN).
  • BLE пульсометр — подключение к FitPro браслетам и стандартным HR датчикам (0x180D). ЧСС, SpO2, давление в реальном времени при записи трека.
  • Расчёт ккал — физическая модель для велосипеда (мощность из gradient + Crr + CdA). MET-таблица для ходьбы/бега и тренировок (приседания 6.0, скакалка 12.3, растяжки 2.3, бассейн 8.0). Профили велосипедов. BMR по Mifflin-St Jeor с коэффициентом активности.
  • Тренировки — приседания (подходы x повторения), скакалка, растяжки, бассейн (дистанция). Автоматический расчёт ккал по MET и весу.
  • Нутриенты — 37 микронутриентов (витамины, минералы, жирные кислоты, женьшень, ресвератрол, CoQ10). Нормы РСП/АУП (РФ/ЕС/США). Фармакокинетика — запасы в организме по полураспаду.
  • Трекинг жидкости — water_pct в продуктах, прогресс-бар, настраиваемая норма.
  • Графики — скорость, высота, ЧСС тренировки с зумом и pan. Тренд веса. Донат макронутриентов. Баланс ккал (приход/расход).
  • OTA обновления — проверка BUILD_NUMBER на роутере (LAN) или VPS, скачивание через браузер.
  • Ручные маршруты — рисование трека на карте тапами, elevation из прошлых треков или open-meteo API.
  • Экспорт/импорт — свои продукты, рецепты и добавки одним файлом (JSON).
  • Вес, сон, добавки — логирование с историей.

Стек

  • Frontend: чистый JavaScript, HTML, CSS. Без React/Vue/bundler.
  • Backend: Rust (Tauri 2) — SQLite, IPC, seed import, BLE (btleplug на десктопе).
  • Android: Kotlin — foreground GPS service, BLE HR service, WakeLock, SAF.
  • Библиотеки: Leaflet 1.9.4 (карты), leaflet-rotate (компас), Chart.js (графики), Hammer.js (жесты), JSZip.

Сборка

# Зависимости: 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 -u android       # release + upload на VPS (OTA)
./build.sh -d -i -u android # debug + install + upload

Структура

Подробно: PROJECT_MAP.md

frontend/
  js/main.js          — UI, навигация, модалки, компас, ландшафт (~5500 строк)
  js/db.js            — БД, миграции, CRUD (~1500)
  js/gps.js           — GPS, физика ккал, BLE HR polling (~1200)
  js/bmr.js           — BMR формула, РСП, полураспад нутриентов
  js/sync.js          — синхронизация между устройствами (LAN)
  js/tilecache.js     — оффлайн тайлы (IndexedDB)
  css/styles.css      — стили, тёмная тема, ландшафтный режим
  img/gps-placeholder.png — пиксельарт заглушка до GPS
  data/products_seed.db — 13480 продуктов
src-tauri/
  src/lib.rs          — Rust бэкенд, seed import
  src/ble.rs          — BLE HR (btleplug десктоп, file IPC Android)
  gen/android/        — Kotlin: MainActivity, GpsRecorderService, BleHrService
tools/
  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 прототип чтения ЧСС

Данные продуктов

Источник Продуктов Витамины/минералы
Health-Diet.ru 8090 да (37 нутриентов, omega-3/6, вода)
Магнит (SSR парсинг) 7690 нет
5ка (API скрейпер) 3354 нет
Ашан (HD) 2000 да
ИОН (web.ion.ru) 1079 да
KDV (SSR парсинг) 667 нет
Макдоналдс (HD) 619 да
KFC (HD) 361 да
Додо Пицца 258 КБЖУ
Гриднев (PDF) 217 да
Всего ~24400