diff --git a/AGENTS.md b/AGENTS.md index 801d2b63..4e54b505 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -162,7 +162,7 @@ Workflow upstream MeshCore в `.github/workflows/` остаются под ис Проект собирает и поставляет только MQTT-прошивки (`*_repeater_mqtt`, `*_repeater_mqtt_espnow`, `*_repeater_mqtt_bridge`). Связанные с этим правила: -- текущая официальная версия MeshCore — `v1.15.0` +- текущая официальная версия MeshCore — `v1.18.0` (база PosadMesh после слияния upstream; предыдущая база — `v1.17.1`) - линия companion-прошивок удалена из проекта: окружения `*_companion_radio_*` и код `examples/companion_radio` остаются в upstream-оверлеях, PosadMesh их не собирает и не документирует - не придумывайте отдельные номера версий PosadMesh для треков, которых нет в `release-notes.yml` @@ -189,24 +189,23 @@ git tag repeater-mqtt-v2026.5.1 Типичный порядок выпуска: -1. Обновить `release-notes.yml` в ветке `develop`. -2. Смерджить релизный PR из `develop` в `main`. -3. Собрать нужные прошивки — локально или ручным workflow в Gitea Actions — с подходящими `FIRMWARE_VERSION` и `POSADMESH_VERSION`. -4. Создать нужный тег или теги релиза на целевом коммите в `main`. -5. Запушить теги в git.meshinfo.ru и создать релиз в его веб-интерфейсе. +1. Обновить `release-notes.yml` в `main`. +2. Собрать нужные прошивки — локально или ручным workflow в Gitea Actions — с подходящими `FIRMWARE_VERSION` и `POSADMESH_VERSION`. +3. Создать нужный тег или теги релиза на целевом коммите в `main`. +4. Запушить теги в git.meshinfo.ru и создать релиз в его веб-интерфейсе. ## Синхронизация с upstream Когда просят подтянуть изменения из upstream MeshCore: -- тянуть из `meshcore-dev/MeshCore:dev` -- начинать с локальной ветки `develop` -- создать временную интеграционную ветку от `develop` -- влить upstream `dev` в эту временную интеграционную ветку -- разрешать конфликты так, чтобы сохранить изменения, специфичные для PosadMesh -- влить готовую интеграционную ветку обратно в `develop` +- брать релизный тег upstream нужной роли (например `repeater-v1.18.0`), а не ветку: тег содержит ещё и релизные коммиты, которых в `dev` нет (на момент 1.18.0 — 7 штук) +- вся работа ведётся в `main` (ветка `develop` в этом репозитории — устаревшая, от эпохи EastMesh, ей не пользуемся) +- создать временную интеграционную ветку от `main`, например `integrate/upstream-1.18.0` +- поставить страховочный тег `pre-<версия>` на текущий `main` и сделать `git bundle` перед слиянием +- влить тег upstream в интеграционную ветку, разрешать конфликты так, чтобы сохранить изменения, специфичные для PosadMesh +- проверить сборкой несколько ключевых целей, затем влить интеграционную ветку в `main` -Не вливайте upstream напрямую в `main`. +Вливать upstream напрямую в `main` можно только через интеграционную ветку с проверкой сборкой. ## Границы области работ diff --git a/src/helpers/sensors/EnvironmentSensorManager.cpp b/src/helpers/sensors/EnvironmentSensorManager.cpp index 68dd82c5..06f5af74 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.cpp +++ b/src/helpers/sensors/EnvironmentSensorManager.cpp @@ -213,21 +213,22 @@ static RAK12500LocationProvider RAK12500_provider; #endif // ============================================================ -// I2C sensor probe -// Probes only the compiled-in sensor addresses. -// This runs before any sensor library is touched, so a missing -// or misbehaving device cannot stall or crash the boot sequence. +// I2C bus scan +// Сканирует шину до обращения к библиотекам датчиков, чтобы +// отсутствующее или зависшее устройство не тормозило загрузку. // ============================================================ -static bool probeI2CAddress(TwoWire* wire, uint8_t addr) { +static void scanI2CBus(TwoWire* wire, bool found[128]) { if (wire == nullptr) { - return false; + return; } #if defined(ESP32) - wire->setTimeOut(20); + wire->setTimeOut(20); // PosadMesh: ограничиваем ожидание, иначе зависший датчик тянет boot #endif - wire->beginTransmission(addr); - return wire->endTransmission() == 0; + for (uint8_t addr = 0x08; addr < 0x78; addr++) { + wire->beginTransmission(addr); + found[addr] = (wire->endTransmission() == 0); + } } static bool readI2CRegister8(TwoWire* wire, uint8_t addr, uint8_t reg, uint8_t* value) { @@ -953,6 +954,10 @@ bool EnvironmentSensorManager::begin() { MESH_DEBUG_PRINTLN("I2C using board pins SDA: %d SCL: %d", PIN_BOARD_SDA, PIN_BOARD_SCL); #endif + // Scan the I2C bus before touching any sensor library. + bool detected[128] = {}; + scanI2CBus(TELEM_WIRE, detected); + // Walk the sensor table and initialize only detected devices. _active_sensor_count = 0; for (size_t i = 0; i < SENSOR_TABLE_SIZE && _active_sensor_count < MAX_ACTIVE_SENSORS; i++) { diff --git a/variants/posadmesh_mqtt/platformio.ini b/variants/posadmesh_mqtt/platformio.ini index c15b6c3d..28ec9625 100644 --- a/variants/posadmesh_mqtt/platformio.ini +++ b/variants/posadmesh_mqtt/platformio.ini @@ -1642,3 +1642,47 @@ build_flags = -UMQTT_DEBUG build_src_filter = ${env:Xiao_S3_LoRa2021F33-2G4_repeater_mqtt.build_src_filter} + + +; --------------------------------------------------------------------------- +; Waveshare ESP32-S3 LR1121 (плата добавлена в upstream 1.18.0) +; Без дисплея, кнопки и датчика батареи; радио LR1121 (850-930 МГц и 2.4 ГГц) +; --------------------------------------------------------------------------- +[env:Waveshare_S3_LR1121_repeater_mqtt] +extends = Waveshare_S3_LR1121 +build_flags = + ${Waveshare_S3_LR1121.build_flags} + -D ADVERT_NAME='"Waveshare LR1121 Repeater"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D MAX_NEIGHBOURS=50 + -D WITH_MQTT_UPLINK=1 + -D MQTT_DEBUG=1 + -D WIFI_SSID='"myssid"' + -D WIFI_PWD='"mypwd"' + -D MQTT_DEFAULT_IATA='"UNSET"' + -D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=1 +build_src_filter = ${Waveshare_S3_LR1121.build_src_filter} + +<../examples/simple_repeater> + + + + +lib_deps = + ${Waveshare_S3_LR1121.lib_deps} + ${esp32_ota.lib_deps} + +[env:Waveshare_S3_LR1121_repeater_mqtt_espnow] +extends = env:Waveshare_S3_LR1121_repeater_mqtt +build_flags = + ${env:Waveshare_S3_LR1121_repeater_mqtt.build_flags} + -D WITH_ESPNOW_BRIDGE=1 +build_src_filter = ${env:Waveshare_S3_LR1121_repeater_mqtt.build_src_filter} + + + +[env:Waveshare_S3_LR1121_repeater_mqtt_bridge] +extends = env:Waveshare_S3_LR1121_repeater_mqtt +build_flags = + ${env:Waveshare_S3_LR1121_repeater_mqtt.build_flags} + -D WITH_MQTT_BRIDGE=1 + -UMQTT_DEBUG +build_src_filter = ${env:Waveshare_S3_LR1121_repeater_mqtt.build_src_filter} + +