Commit Graph
439 Commits
Author SHA1 Message Date
shade 906f6fa7fa feat: лимит флуда анонсами и бюджет канала; перевод веб-панели на русский 2026-10-20 18:23:05 +03:00
shade b3a6be4a7f feat: ADC-поправка батареи для всех плат, вариант A на экране загрузки
- ESP32Board: общий механизм adcMultiplierBase()/adcMultiplier(); setAdcMultiplier
  возвращает false только там, где батарея измеряется не через ADC
- платы со своей формулой переведены на общий механизм: Heltec E213/E290/T190,
  heltec_tracker_v2, Heltec v2, ThinkNode M2/M5; Station G2/G3 и T-Beam сообщают,
  что подстройка не поддерживается
- мастер настройки: поле ADC стартует от действующего значения платы
  (getAdcMultiplier) и работает с тремя знаками (x.xxx), например 5.420;
  0.000 возвращает заводское значение платы
- Meshadventurer: добавлена поддержка множителя (раньше делитель был зашит числом 2
  и set adc.multiplier отвечал Error: unsupported)
- экран загрузки: meshcore.io, версия с датой и posadmesh.ru; строка < Repeater > убрана

Проверено сборкой: heltec_v4_repeater_mqtt, Meshadventurer_sx1262_repeater_mqtt
2026-10-16 11:35:07 +03:00
shade 82ec2f4c83 fix(ui): всплывающее окно для ответов устройства в мастере настройки
- ответ CLI показывался строкой поверх экрана и сливался с содержимым, особенно
  в верхней части (например OK - reboot to apply на экране частоты)
- теперь это модальное окно: рамка, свой фон, перенос текста и кнопка OK;
  закрывается коротким нажатием, пока открыто — экран под ним не меняется
- окно показывается сразу (сброс таймера отрисовки), при закрытии экран
  перерисовывается немедленно
- setToast/renderToast заменены на showPopup/renderPopup
- документация: posadmesh-docs/device-setup.md (раздел «Всплывающие сообщения»
  и макет экрана), README — журнал изменений

Проверено сборкой: heltec_v4_repeater_mqtt, Meshadventurer_sx1262_repeater_mqtt,
Generic_E22_sx1262_repeater_mqtt (без дисплея)
2026-10-16 11:16:16 +03:00
shade 8f27aa9202 fix(ui): мастер настройки больше не отправляет set radio с нулевыми значениями
- applyRadio() отправлял команду всегда, в том числе при выходе из меню, если
  в этой сессии не открывали ни один радиопункт: рабочая копия (_radio_*) оставалась
  нулевой, устройство отвечало Error, invalid radio params
- добавлен признак _radio_dirty: команда уходит только после реальной правки
  частоты, полосы, SF или CR; при успешном применении признак сбрасывается
- перед отправкой значения перечитываются из настроек узла (loadRadio), а при
  каждом входе в мастер рабочая копия обновляется (_radio_loaded = false)
- README: запись в журнале изменений

Проверено сборкой: heltec_v4_repeater_mqtt, Meshadventurer_sx1262_repeater_mqtt,
Generic_E22_sx1262_repeater_mqtt (без дисплея)
2026-10-16 11:03:21 +03:00
shade 1e751a85d4 feat(ui): экран батареи и калибровка ADC в мастере настройки
- UITask: новые пункты меню Battery и ADC
  Battery — напряжение, процент заряда, полоска и текущий множитель ADC; короткое
  нажатие показывает «сырое» значение АЦП в милливольтах, длинное/двойное — выход в меню
  ADC — поразрядная правка множителя в формате x.xx (как полоса), под цифрами
  показывается измеренное напряжение, поэтому калибровать можно прямо на экране
- процент заряда берётся у платы (getBatteryPercent), а если плата его не считает —
  линейно по getBatteryMinMilliVolts()/getBatteryMaxMilliVolts()
- множитель применяется командой set adc.multiplier, значение 0.00 возвращает
  заводской расчёт платы; проверка и сохранение остаются в CommonCLI
- поразрядный редактор SCREEN_DIGITS теперь обслуживает и полосу, и ADC
- документация: posadmesh-docs/device-setup.md (таблица меню, раздел «Батарея и
  калибровка ADC», два новых макета экранов), README — журнал изменений

Проверено сборкой: heltec_v4_repeater_mqtt, Meshadventurer_sx1262_repeater_mqtt,
Generic_E22_sx1262_repeater_mqtt (без дисплея — код исключается препроцессором)
2026-10-16 10:32:27 +03:00
shade 80d36d20bc 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: оставлен наш
2026-10-16 10:05:18 +03:00
Scott Powell 07a833bbbe * version 1.18.0 2026-10-15 19:42:01 +11:00
shade 04bb5714c8 feat: Save & exit in radio editors, wiki docs with screen images
- экраны Frequency и Bandwidth: единица измерения в конце строки значения
  (868.731 MHz, 062.50 kHz), внизу отдельный пункт Save & exit
- после правки цифр пользователь переходит на Save & exit и удерживает кнопку:
  значения применяются, экран возвращается в предыдущее меню
- документация: страница posadmesh-docs/device-setup.md дополнена схемой управления
  и изображениями всех экранов (12 картинок в posadmesh-docs/_assets/wizard/)
- вики Gitea: страницы Home и Device-Setup с теми же иллюстрациями
- README: ссылка на вики, схема управления и запись в журнале изменений
2026-10-11 18:44:30 +03:00
shade ce1b71d6fd feat: separate radio settings in the on-device setup wizard
- радиопресет заменён на четыре отдельных пункта меню: Frequency, Bandwidth, CR, SF
- частота: целые МГц шагом +-1, кГц правятся по разрядам (принцип как у координат)
- полоса: поразрядный ввод значения с точкой (формат 062.50)
- CR и SF: шаг +-1 с ограничением 5-8 и 5-12
- применение любого из четырёх пунктов отправляет set radio <частота>,<полоса>,<sf>,<cr>
  целиком, остальные значения сохраняются; внизу меню остаётся Save & exit
- документация device-setup.md обновлена, README: раздел и журнал изменений
- проверено сборкой: heltec_v4_repeater_mqtt, Meshadventurer_sx1262_repeater_mqtt,
  Generic_E22_sx1262_repeater_mqtt (без дисплея)
2026-10-11 18:06:55 +03:00
shade 71f7095d17 feat: on-device setup wizard for repeaters with display and button
- добавлен локальный мастер настройки репитера: examples/simple_repeater/UITask.*
  (меню на кнопке, редактор координат, применение значений через CommonCLI)
- MyMesh: публичный доступ к CommonCLI для UI (getCLI), main.cpp передаёт его в UITask
- мастер работает на любой цели с дисплеем и кнопкой и исключается препроцессором
  там, где их нет; WiFi-код теперь под #if defined(ESP32)
- новая страница документации posadmesh-docs/device-setup.md, ссылки в index.md и mkdocs.yml
- README: раздел «Настройка с дисплея и кнопки» и запись в журнале изменений
- проверено сборкой: heltec_v4_repeater_mqtt, Meshadventurer_sx1262_repeater_mqtt,
  Generic_E22_sx1262_repeater_mqtt (без дисплея), RAK_3112_repeater_mqtt
2026-10-11 17:44:41 +03:00
shade c86ae584ab refactor: rebrand to PosadMesh, translate docs to Russian, drop legacy brokers
Build and deploy Docs site to GitHub Pages / github-pages (push) Canceled after 0s
PR Build Check / build (Heltec_v3_companion_radio_ble) (push) Canceled after 0s
PR Build Check / build (Heltec_v3_repeater) (push) Canceled after 0s
PR Build Check / build (Heltec_v3_room_server) (push) Canceled after 0s
PR Build Check / build (LilyGo_Tlora_C6_repeater_) (push) Canceled after 0s
PR Build Check / build (PicoW_repeater) (push) Canceled after 0s
PR Build Check / build (RAK_4631_companion_radio_ble) (push) Canceled after 0s
PR Build Check / build (RAK_4631_companion_radio_ethernet) (push) Canceled after 0s
PR Build Check / build (RAK_4631_repeater) (push) Canceled after 0s
PR Build Check / build (RAK_4631_repeater_ethernet) (push) Canceled after 0s
PR Build Check / build (RAK_4631_room_server) (push) Canceled after 0s
PR Build Check / build (RAK_4631_room_server_ethernet) (push) Canceled after 0s
PR Build Check / build (Tbeam_SX1276_repeater) (push) Canceled after 0s
PR Build Check / build (wio-e5-mini_repeater) (push) Canceled after 0s
PR Build Check / build (wio_wm1110_repeater) (push) Canceled after 0s
Run Unit Tests / test (push) Canceled after 0s
2026-10-07 19:04:39 +03:00
Scott Powell f19733e478 * don't respond to DISCOVER requests if node has adverts turned off. (isHiddenNode()) 2026-10-04 15:02:00 +11:00
Wolfram Keil 61be70849a Add board loop hook for periodic work 2026-09-22 08:01:48 +02:00
Kevin Le c425648bfc Off LED before powering off for repeater 2026-09-19 11:26:42 +07:00
João Brázio 95214e8c40 Ensure command buffers stay NUL-terminated to prevent overflow
The serial command buffers must stay NUL-terminated within their
bounds: if they ever aren't, strlen() can return >= sizeof(command)
and the read loop would index past the buffer. Additionally, a full
buffer now becomes a completed line (end-of-line marker placed
inside the buffer, NUL terminator kept) instead of overwriting the
terminator and silently corrupting the buffer for the next pass.

Applies to the serial CLI readers of the repeater, room server,
sensor and secure chat examples, and to the CLI rescue reader of
the companion example.
2026-09-04 20:01:39 +01:00
Scott Powell 5a162ff4c6 * new DynamicConfigSerializer
* board/variant KeyValueStore now can write to 'custom' object in Json prefs
2026-08-24 17:12:56 +10:00
Scott Powell 47b0b7b3b8 * T096, and Station G3: refactoring the 'FEM' prefs to variant-specific code
* CommonCLI: 'FEM' commands removed
* introduced static no-op attachDynamicPrefs() for all boards
2026-08-24 01:50:22 +10:00
Scott Powell 2c0ace2519 * new TXT_TYPE_CLI_COMMAND (3) 2026-08-23 22:04:05 +10:00
Jared DohrmanandClaude Fable 5 866498299e fix(web): stop HTTPS panel heap fragmentation, add self-heal and heap counters
Both Clyde North observers stopped answering over WiFi after days of
uptime while LoRa and MQTT kept working. `memory` showed heap_min ~1KB
and a largest internal block of 19KB: the HTTPS listener was alive but
no mbedTLS handshake (~40KB contiguous) could be allocated.

The trigger was the Aug 9 lru_purge change: with a 2-socket pool, every
browser page-load burst evicted a live session and forced a fresh TLS
handshake, and the repeated 40KB alloc/free cycles fragmented internal
RAM. Before that change the pool simply jammed, so nothing churned.

- Send `Connection: close` and trigger a session close on one-shot
  responses (pages, favicon, redirect, login, 401s) so page-load bursts
  release their sockets immediately. The authenticated /api/* polling
  connection keeps keep-alive so it does not pay a handshake per poll.
- Gate WebPanelServer::start() on internal heap headroom (56KB free /
  32KB largest), retrying every 15s instead of every loop tick.
- Self-heal: when the panel is idle and the largest internal block drops
  below 24KB, stop and re-create the server to return its pools.
- Count the MQTT teardown path that deliberately abandons a client on a
  heap-integrity failure.
- Expose the above as `heals:`/`deferred:` in `get web.status` and
  `leaked:` in `get mqtt.status`.
- Fix the stats page Channel/Gateway cells showing `--`: the /api/stats
  summary JSON never carried channel, gateway health, or the watchdog
  count (only the `get wifi.status` string did).
- Add eastmesh-tools/web-heap-check.sh to read heap/service health over
  the API and optionally stress the panel with browser-style bursts.
- Release notes 2026.8.3 for both observer tracks.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 10:53:53 +00:00
ripplebiz e0031870f6 Merge pull request #3233 from entr0p1/fix/centralise-max-clients
Fix duplicate MAX_CLIENTS definition
2026-08-20 14:09:30 +10:00
Rastislav Vysoky 2db4b40617 repeater: set loop.detect to minimal as default for new installs 2026-08-18 14:56:58 +02:00
entr0p1 a8a6001576 Duplicate MAX_CLIENTS definition
MAX_CLIENTS is defined in both src/helpers/ClientACL.h and examples/simple_repeater/MyMesh.h. Appears it was centralised in the former header file some time ago. Both are included in some places and, depending on which order they're in, either value can win.

This change drops the duplicate entry from the repeater firmware and bumps the central limit up to 32 (per the original repeater firmware value).

Changes:
- Remove MAX_CLIENTS from repeater MyMesh.h
- Increase MAX_CLIENTS limit in ClientACL.h to 32
2026-08-17 23:01:52 +10:00
Jared Dohrman d3dbc0a063 Merge remote-tracking branch 'upstream/dev' into integrate-upstream-dev-2026-08-15
# Conflicts:
#	src/helpers/ui/SH1106Display.cpp
2026-08-15 08:41:31 +10:00
Scott Powell d929643524 * version 1.17.1 2026-08-14 22:19:19 +10:00
Jared DohrmanandClaude Fable 5 088d7f40f9 feat(observer-wifi): gateway watchdog and wifi reconnect command
Both Clyde North observers sat WL_CONNECTED on an AP that kept beaconing
after its bridge to the wired LAN died: association up, good RSSI, stale
DHCP lease, but ARP-invisible and both MQTT brokers stuck in backoff.
The firmware equated "associated" with "online", so neither node ever
re-scanned and the outage held until a manual reassociation.

Add a connectivity watchdog to NetworkService: while connected, ARP-probe
the gateway every 30s (posted to the lwIP tcpip thread, safe on both the
IDF4 and IDF5 cores). If the gateway stays silent for 3 minutes, clear
the channel hint and force a full disconnect/rescan so the node can roam
to a healthy AP, backing off exponentially (up to 48min) while the
outage persists. Nodes without a gateway skip the probe.

Add a `wifi reconnect` repeater command that triggers the same forced
reassociation on demand, and report `gw:ok|lost wd:<count>` in
`get wifi.status`. Teach the web panel parser the new fields (also fixes
the IP metric rendering as "x.x.x.x channel:n") and show Gateway and
Channel in the Wi-Fi card.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 19:23:12 +10:00
ripplebiz b09cb27a1f Merge pull request #3106 from ViezeVingertjes/fix/scoped-reply-routing
Fix replies dropped when flood.max.unscoped is low
2026-08-13 15:00:37 +10:00
ripplebiz a4ab7f0e59 Merge pull request #3137 from agessaman/feat/station-g3-fem-prefs
Station G3: Expose, persist, and apply FEM gain preferences
2026-08-12 16:11:23 +10:00
Jared DohrmanandClaude Fable 5 9551272abe Merge remote-tracking branch 'upstream/dev' into integrate-upstream-dev-2026-08-09
Integrates upstream v1.17.0. Key adaptations:
- companion + repeater NodePrefs moved to upstream's new ConfigSerializer
  (prefs.json) format; EastMesh fields (companion wifi, repeater fan and
  MQTT bridge peer) appended as serializer groups/keys
- legacy binary prefs loaders retain EastMesh tail fields, so existing
  devices migrate their settings to the new format
- companion main.cpp adopts upstream InterfaceManager while keeping
  runtime WiFi credentials from prefs
- kept EastMesh release-tag versioning in setup-build-environment action

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 16:30:22 +10:00
Scott Powell 93b2db63de * version 1.17.0 2026-08-09 15:14:46 +10:00
agessaman 23066573e5 fix(station-g3): expose FEM gain preferences 2026-08-06 15:29:14 -07:00
ripplebiz 84e3a67bd7 Merge pull request #3115 from oltaco/meshnology_w12
Add support for Meshnology W12 and LR2021 Wrapper
2026-08-05 15:04:00 +10:00
taco 9d4f93806d LR2021: auto-LDRO for side detectors 2026-08-05 14:23:32 +10:00
taco 696a82d7c2 LR2021 multi-SF support (side detectors) 2026-08-05 14:23:32 +10:00
ViezeVingertjes b155081882 Merge remote-tracking branch 'upstream/dev' into fix/scoped-reply-routing
# Conflicts:
#	examples/simple_repeater/MyMesh.cpp
2026-08-04 11:49:58 +02:00
ViezeVingertjes fad11c90f3 Fix replies dropped when flood.max.unscoped is low 2026-08-03 22:57:12 +02:00
Scott Powell 0fd11ed223 * bounds check added for anon_req reply_path_len 2026-08-04 01:00:31 +10:00
ripplebiz c86e63d2f5 Merge pull request #2982 from meshcore-dev/config-serializer
Config serializer
2026-07-27 17:58:03 +10:00
Scott Powell ee79df4c4f Merge branch 'dev' into config-serializer
# Conflicts:
#	test/mocks/Arduino.h
#	test/mocks/Stream.h
2026-07-24 15:06:48 +10:00
Scott Powell 56274db4ad * build fixes for old ESP32 boards 2026-07-22 19:52:23 +10:00
Scott Powell b8504e55c6 * refactor of Color mapping in UITasks / DisplayDrivers
* color displays now with a new light theme
2026-07-22 16:03:33 +10:00
Florent c644720ea7 uitask: screen and radio poweroff moved to board 2026-07-17 08:29:31 -04:00
fdlamotte 76c6e73fb6 Merge branch 'dev' into repeater_btn 2026-07-17 06:55:19 -04:00
Scott Powell 85285c6cbc Merge branch 'dev' into config-serializer 2026-07-16 17:22:28 +10:00
ripplebiz b55d69e57a Merge pull request #1983 from rgregg/rak-ethernet
Support for RAK ethernet module
2026-07-15 18:53:38 +10:00
Scott Powell 2af1e6d099 * first draft of new ConfigSerializer. (simple embedded JSON prefs) 2026-07-15 01:23:57 +10:00
Quency-D 4d0ba1516c Remove the watchdog feeding operation from each iteration of the loop to reduce power consumption. 2026-07-14 17:23:13 +08:00
Ryan Gregg 16b76bd35a Merge remote-tracking branch 'upstream/dev' into rak-ethernet
# Conflicts:
#	examples/companion_radio/main.cpp
2026-07-13 23:06:00 -07:00
Jared Dohrman 9fd108f946 Merge remote-tracking branch 'upstream/dev' into integrate-upstream-dev-2026-07-09
# Conflicts:
#	.github/actions/setup-build-environment/action.yml
#	README.md
#	examples/simple_repeater/MyMesh.cpp
#	examples/simple_room_server/MyMesh.cpp
#	examples/simple_sensor/SensorMesh.cpp
#	src/helpers/CommonCLI.cpp
#	src/helpers/CommonCLI.h
#	src/helpers/radiolib/CustomLR1110Wrapper.h
#	variants/tenstar_c3/target.h
2026-07-09 16:51:30 +10:00
Florent 2efb3af69b repeater: poweroff on long press 2026-07-06 08:40:56 -04:00
Quency-D 2867542cfa Merge branch 'dev' into solar-watchdog 2026-07-04 16:47:37 +08:00