Merge upstream MeshCore v1.18.0 (tag repeater-v1.18.0) into main

Разрешённые конфликты (12 файлов, из них 4 companion взяты из upstream целиком):

- examples/companion_radio/*: взят upstream, companion в форке не собирается
- examples/simple_repeater/MyMesh.cpp: убрана наша интеграция вентилятора
  (setFanPostTxHoldMs/setFanMode) — upstream 1.18.0 сам грузит настройки вентилятора
  через attachDynamicPrefs, а его CLI (get fan, set fan auto|on|off, set fan.lo/hi)
  доступен через board.handleCommand из CommonCLI; удалён наш дублирующий блок
  get fan/set fan. Оставлена наша сигнатура format*StatsReply(char*, size_t)
- examples/simple_repeater/MyMesh.h: оставлены наши WebSensorSnapshot/BlacklistEntry/
  ChanNameFilter и getCLI() (нужен мастеру настройки), добавлен upstream isHiddenNode();
  FIRMWARE_VERSION по умолчанию — v1.18.0
- src/helpers/CommonCLI.h: оставлены наши FanPrefs (совместимость NVS) и добавлен
  upstream DynamicConfigSerializer custom (getCustom() нужен attachDynamicPrefs)
- src/helpers/ESP32Board.h: время восстанавливается сначала из NVS (наша надстройка,
  переживает отключение питания), затем из RTC-памяти upstream, иначе опорная дата;
  deep sleep по-прежнему не трогаем
- src/helpers/sensors/EnvironmentSensorManager.cpp: взята логика upstream
  (detected[], один драйвер на тип), поверх возвращено определение адреса платой
  (boardDetectedI2CSensorAddress)
- variants/lilygo_tbeam_1w/*: взят upstream (задача вентилятора, NTC, гистерезис,
  CLI и сохранение настроек), наши правки перенесены как делегирование его API
- README.md: оставлен наш
This commit is contained in:
shade committed 2026-10-16 10:05:18 +03:00
commit 80d36d20bc
200 files changed
+7197 -1571

No files matched your search

+6 -4
View File
@@ -443,7 +443,7 @@ void MyMesh::onPeerDataRecv(mesh::Packet *packet, uint8_t type, int sender_idx,
memcpy(&sender_timestamp, data, 4); // timestamp (by sender's RTC clock - which could be wrong)
uint8_t flags = (data[4] >> 2); // message attempt number, and other flags
if (!(flags == TXT_TYPE_PLAIN || flags == TXT_TYPE_CLI_DATA)) {
if (!(flags == TXT_TYPE_PLAIN || flags == TXT_TYPE_CLI_DATA || flags == TXT_TYPE_CLI_COMMAND)) {
MESH_DEBUG_PRINTLN("onPeerDataRecv: unsupported command flags received: flags=%02x", (uint32_t)flags);
} else if (sender_timestamp >= client->last_timestamp) { // prevent replay attacks, but send Acks for retries
bool is_retry = (sender_timestamp == client->last_timestamp);
@@ -463,7 +463,7 @@ void MyMesh::onPeerDataRecv(mesh::Packet *packet, uint8_t type, int sender_idx,
uint8_t temp[166];
bool send_ack;
if (flags == TXT_TYPE_CLI_DATA) {
if (flags == TXT_TYPE_CLI_DATA || flags == TXT_TYPE_CLI_COMMAND) {
if (client->isAdmin()) {
if (is_retry) {
temp[5] = 0; // no reply
@@ -725,8 +725,8 @@ void MyMesh::begin(FILESYSTEM *fs) {
radio_driver.setParams(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr);
radio_driver.setTxPower(_prefs.tx_power_dbm);
radio_driver.setRxBoostedGainMode(_prefs.rx_boosted_gain);
board.setLoRaFemLnaEnabled(_prefs.radio_fem_rxgain);
board.setLoRaFemPaGainEnabled(_prefs.radio_fem_txgain);
board.attachDynamicPrefs(_prefs.getCustom());
updateAdvertTimer();
updateFloodAdvertTimer();
@@ -987,6 +987,8 @@ void MyMesh::handleCommand(uint32_t sender_timestamp, char *command, char *reply
addSystemPost(msg);
snprintf(reply, MAX_POST_TEXT_LEN, "OK");
}
} else if (memcmp(command, "set repeat on", 13) == 0) {
strcpy(reply, "ERR - repeat now deprecated");
} else{
_cli.handleCommand(sender_timestamp, command, reply); // common CLI commands
}