From 8fa0bfe1d375792f61ced74c3b27d4610b2b9753 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 16 Oct 2026 10:20:54 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20MQTT-=D0=BE=D0=BA=D1=80=D1=83=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20Waveshare=20S3?= =?UTF-8?q?=20LR1121=20=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=20AGENTS.md=20=D0=BD=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D1=83=20=D0=B2=20main?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - добавлены Waveshare_S3_LR1121_repeater_mqtt/_espnow/_bridge: из новых плат upstream 1.18.0 только эта на ESP32; ThinkNode M8 и M4, Wio Tracker L1 1W и Muzi Base — на nRF52, WiFi нет, MQTT-сборки для них невозможны (им место в форке MeshCore, не здесь) - EnvironmentSensorManager: возвращён scanI2CBus из upstream (слияние его потеряло, потому что мы когда-то заменили полное сканирование шины поштучной проверкой адресов); при этом сохранён наш таймаут 20 мс на ESP32 и наша поддержка адреса, определённого платой - AGENTS.md: работаем в main, ветка develop устарела (эпоха EastMesh); upstream тянем релизным тегом, а не веткой dev; версия upstream — v1.18.0 Проверено сборкой после слияния: heltec_v4_repeater_mqtt, LilyGo_TBeam_1W_repeater_mqtt, Meshadventurer_sx1262_repeater_mqtt, RAK_3112_repeater_mqtt, heltec_v4_repeater_mqtt_espnow, heltec_v4_repeater_mqtt_bridge, LilyGo_Tlora_C6_repeater_mqtt_espnow (наш фикс ESP-IDF 5), LilyGo_TBeam_1W_repeater_mqtt_espnow, Waveshare_S3_LR1121_repeater_mqtt, Waveshare_S3_LR1121_repeater_mqtt_bridge MQTT-целей стало 112: 42 uplink, 34 espnow, 36 bridge --- AGENTS.md | 25 +++++------ .../sensors/EnvironmentSensorManager.cpp | 23 ++++++---- variants/posadmesh_mqtt/platformio.ini | 44 +++++++++++++++++++ 3 files changed, 70 insertions(+), 22 deletions(-) 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} + +