feat: MQTT-окружения для Waveshare S3 LR1121 и переход AGENTS.md на работу в main

- добавлены 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
This commit is contained in:
shade committed 2026-10-16 10:20:54 +03:00
1 parent 80d36d20bc
commit 8fa0bfe1d3
3 files changed
+70 -22

No files matched your search

+12 -13
View File
@@ -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` можно только через интеграционную ветку с проверкой сборкой.
## Границы области работ
@@ -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++) {
+44
View File
@@ -1642,3 +1642,47 @@ build_flags =
-UMQTT_DEBUG
build_src_filter = ${env:Xiao_S3_LoRa2021F33-2G4_repeater_mqtt.build_src_filter}
+<helpers/bridges/MQTTBridge.cpp>
; ---------------------------------------------------------------------------
; 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>
+<helpers/mqtt/*.cpp>
+<helpers/web/*.cpp>
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}
+<helpers/bridges/ESPNowBridge.cpp>
[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}
+<helpers/bridges/MQTTBridge.cpp>