baldav/docs/session-logs/2026-10-30_barometer-ble-baldav.md
4aiman 9251c1dd90 ble: barometer on its own connection - simultaneous HR+baro, auto-connect, UI
Separate BleBaroService so the HR strap and the barometer each hold their own GATT link and
work at the same time (one adapter, several LE connections). Verified on device against a PC
BlueZ emulator of the sensor: BleHR and BleBaro deliver in parallel, no cross-talk.

- BleBaroService: dedicated baro connection (scan-before-connect + direct-connect fallback,
  ESS subscribe, writes ble_baro_data.json). MainActivity routes baro connects to it and
  auto-connects both HR (ble_device.json) and baro (baro_device.json) at start.
- Rust: ble_baro_disconnect, ble_save_baro_device.
- Settings: a 'Датчики (BLE)' section - heart-rate and barometer as separate rows with their
  own slots, bind/connect/unbind, and a live pressure/temperature/altitude readout.
- Tracking: altitude_baro_m stored per point, preferred in elevation stats (null without baro).
- Record screen: 'Высота' from the barometer (1 Hz, dot marker), temperature from the sensor.
- Fixes: direct-connect on scan timeout; Locale.US JSON (RU decimal comma broke the parse);
  parsing routed by characteristic (baro no longer written into the pulse); VR/HR stop returns
  to the tracks list instead of into details.
- tools/baro-sensor/emulate_baro.py: PC BlueZ peripheral that emulates the sensor for testing.

Emulator-verified only; real board still pending.
2026-10-30 22:46:26 +03:00

4.9 KiB
Raw Blame History

2026-10-30 - BLE-барометр: сторона baldav

Контекст

Делаем самодельный датчик высоты: ESP32-C3 SuperMini + BMP280, вещает давление и температуру по BLE (стандартный Environmental Sensing). Железо заказано, ещё едет. Прошивка датчика - в tools/baro-sensor/ (PlatformIO + Arduino-скетч), схема сборки - tools/baro-sensor/baro-guide.html. Эта задача - прочитать датчик в baldav и считать высоту.

Что сделано

Читаем барометр тем же путём, что и пульсометр (Kotlin BLE-сервис -> файл -> Rust -> JS), новым device_type = "baro". Диспетчер команд (MainActivity) не менялся - тип проходит насквозь.

  • BleHrService.kt: тип baro - подписка на ESS (0x181A): давление 0x2A6D (uint32, 0.1 Па) и температура 0x2A6E (int16, 0.01 C). Пишет ble_baro_data.json + ble_baro_log.jsonl. Все ветки барометра под deviceType == "baro"; HR/GPS-пути не тронуты.
  • ble.rs: структура BaroReading, определение ESS, команда ble_get_baro (Android читает файл; десктоп возвращает None). Зарегистрирована в lib.rs.
  • frontend/js/baro.js: ПАССИВНЫЙ модуль window.BARO. Гипсометрический пересчёт давления в высоту с реальной температурой датчика, якорь к высоте GPS на старте. Ничего не исполняется, пока не вызван BARO.start() - без барометра приложение работает как раньше.

Состояние

Проверено компиляцией (сборка 0.1.538, без ошибок). На устройстве НЕ проверено - нет железа.

Продолжение того же дня: обвязка, UI, проверка эмулятором

Железа ещё нет, поэтому эмулировали датчик на ПК (tools/baro-sensor/emulate_baro.py - BlueZ D-Bus GATT-сервер, вещает ESS 0x181A с давлением/температурой), телефон читал его реальным путём. Проверено на устройстве: BleHR: HR:70 и BleBaro: Baro:... Pa одновременно.

Сделано:

  • BleBaroService - отдельный сервис/соединение для барометра, работает параллельно с пульсометром (один адаптер держит несколько LE-связей). Баро-подключения маршрутизируются в него из MainActivity. Авто-подключение при старте: баро из baro_device.json, пульс из ble_device.json (оба сами цепляются).
  • Rust: ble_baro_disconnect, ble_save_baro_device. JS сохраняет baro-устройство при привязке.
  • Настройки: секция "Датчики (BLE)" - пульсометр и барометр раздельно, свои слоты и кнопки, живой показ давления/температуры/высоты.
  • Трекинг: altitude_baro_m в точках, предпочитается в статистике высот (null без датчика).
  • Экран записи: "Высота" от барометра (обновление 1 Гц, пометка точкой), температура с датчика (белая, с десятой).
  • Починки по пути: directConnect при таймауте скана; Locale.US в JSON (была запятая от RU-локали); маршрутизация парсинга по характеристике (баро не писал в пульс); навигация после Стоп в VR/ЧСС (на список, а не в детали).

Осталось (по приходу платы)

  • Активировать модуль: BARO.start() при подключении baro-устройства, задать BARO.getGpsAlt.
  • Привязать высоту барометра к треку поездки (в точки / поправка высот П.5).
  • UI: показать барометрическую высоту; выбор baro-устройства в scan-UI уже работает (тип проходит).
  • Ограничение: сервис держит одно BLE-соединение, поэтому барометр и пульсометр одновременно пока нельзя - отдельный следующий шаг (две связи / второй сервис).