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.
4.9 KiB
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-соединение, поэтому барометр и пульсометр одновременно пока нельзя - отдельный следующий шаг (две связи / второй сервис).