Commit Graph
5219 Commits
Author SHA1 Message Date
mikecarper 3c6fee3277 Ensure full repeater packet logging 2026-08-19 16:20:24 -07:00
mikecarper 4ebbdc3d9b Merge remote-tracking branch 'review/observer-firmware' into keymindCascade
# Conflicts:
#	MQTT_IMPLEMENTATION.md
#	examples/simple_repeater/MyMesh.cpp
#	examples/simple_room_server/MyMesh.cpp
#	examples/simple_sensor/SensorMesh.cpp
#	src/helpers/CommonCLI.h
#	src/helpers/MQTTPresets.h
#	src/helpers/bridges/MQTTBridge.cpp
#	src/helpers/bridges/MQTTBridge.h
#	src/helpers/radiolib/CustomLLCC68Wrapper.h
#	src/helpers/ui/SH1106Display.cpp
2026-08-19 13:45:47 -07:00
mikecarper a192c1ea69 Merge remote-tracking branch 'iotthinks/PowerSaving-v17' into keymindCascade
# Conflicts:
#	examples/companion_radio/main.cpp
#	variants/heltec_v4/platformio.ini
2026-08-19 13:31:42 -07:00
mikecarper 5f0452412d Merge remote-tracking branch 'upstream/dev' into keymindCascade 2026-08-19 13:30:32 -07:00
mikecarper a39bbbd467 Add normalradio to common CLI 2026-08-19 12:44:49 -07:00
mikecarper 5ba511cfb7 Restore OTA deployment tuning 2026-08-19 12:37:23 -07:00
mikecarper e797c8aa46 Document legacy OTA airtime tuning 2026-08-19 11:54:19 -07:00
mikecarper 610eef7529 Avoid legacy OTA proof collisions 2026-08-19 11:43:25 -07:00
mikecarper dc4a8808c0 Harden and qualify compact RAK3401 OTA updates 2026-08-19 11:17:22 -07:00
hansimgamrandClaude Opus 4.8 41c60da575 Show plug at >=95% instead of exactly 100%
Boards without a charge-complete signal only infer "full" from voltage, and
a real pack rarely reads the full BATT_MAX_MILLIVOLTS (4.2V), so the plug icon
was effectively never shown. Treat "full" as a high band (>= 95%) so the plug
appears when the battery is charged rather than requiring an exact 100%.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 12:44:41 -04:00
hansimgamrandClaude Opus 4.8 3a440ac41a Add charging indicator to companion_radio battery icon
Show a small lightning-bolt icon to the left of the battery indicator on
the ui-new home screen while the device is externally powered, and a plug
icon once the battery reads full. The bolt/plug sits beside the battery so
the fill bar stays clean and uninterrupted. When a buzzer is present, the
mute icon shifts one slot further left so the two never overlap.

Charging state is derived from board.isExternalPowered(), so this works on
any board that reports external power (e.g. the nRF52 VBUS-detect path).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 12:44:41 -04:00
agessaman 539ae72bca fix(mqtt): stop a wedged client before deleting it on the dirty-stop path
The stop timeout bounded only the cooperative attempt. Its fallback tears down
clients from the calling task, and both helpers skipped the stop entirely when
the client reported not-connected — then deleted it anyway. That is the exact
shape of the dangerous case: a client whose DISCONNECTED callback has already
cleared its connected flag while it sits inside esp_mqtt_client_stop() reports
not-connected, so the stop was skipped precisely when it mattered and the
object was freed from under a live ESP-MQTT task.

Both helpers take a force flag, and only the dirty branch passes it. force is
deliberately not gated on connected(), and routes through the existing
forceStop() rather than disconnect(), whose wait for the DISCONNECTED event is
unbounded. Every other caller — the non-ESP32 release path, the Core-0
cooperative teardown, reconfigure, and the slot-cap path — keeps its current
behaviour byte for byte.

This does not make the path bounded. esp_mqtt_client_stop() waits on the
client's STOPPED_BIT with portMAX_DELAY on the pinned framework, so a client
wedged inside mbedTLS can still block the caller. The change trades a
free-under-a-live-task for a wait, which is the safer of the two failure modes.
Bounding it properly, and the surrounding destroy-while-still-stopping hazard,
need the ownership handoff reworked; that is tracked separately.
2026-08-19 08:38:00 -07:00
agessaman bd91ff80ea fix(mqtt): clear a slot that preferences say is disabled on bridge start
The preset-application loop in begin() only had a positive branch, so when
preferences named no preset the slot kept whatever the previous begin() left in
RAM. Nothing else resets it: teardownSlot() deliberately preserves enabled and
preset so a reconfigure can reuse the mbedTLS context, and the constructor
clears them exactly once. A bridge restart could therefore resurrect a broker
the operator had disabled and reconnect to it with the old credentials.

Config fields only. The client belongs to destroySlotClients() and the token
buffer to releaseSlotAuthToken(); clearing either here would strand a pointer
esp-mqtt still holds in its config.

Note the positive branch re-enabling a slot is correct and unchanged: a slot
capped off at startup is disabled in RAM only, with preferences still naming a
real preset, and the cap decision has to be re-made on each start.

Reachable via WebConfig, where a pending full restart discards the per-slot
restart mask, so a batch that disables a slot can end in a restart that never
applied the disable. A plain CLI set cannot reach it: restartBridgeSlot()
applies the change to the live bridge immediately, keeping RAM and preferences
in agreement. Verified on hardware as a non-regression check for that reason —
disable, restart, slot stays down; restore, restart, all slots return.
2026-08-19 08:38:00 -07:00
Kevin Le a3b9ad91a5 Disabled automatic light sleep for companions with USB CDC Serial 2026-08-19 19:19:16 +07:00
Thomas Osterried b762420433 Skip empty channel slots in searchChannelsByHash
An unconfigured slot has an all-zero secret, so it matches null-key group traffic (a sender with an unset PSK). The zero-key MAC validates against the empty slot and the foreign message is delivered as if it belonged to that channel — every node with a free slot is a null-key sink. Skip empty slots.
2026-08-19 09:35:25 +02:00
liamcottle 67d6d42a4c fix for 3-byte paths passed to CMD_SEND_RAW_DATA 2026-08-19 18:59:24 +12:00
mikecarper 47993d178e Update MeshCore features and OTA layout handling 2026-08-18 23:17:42 -07:00
Scott Powell 4b8966d4f9 WIO Tracker L1 1W variant 2026-08-19 15:29:19 +10:00
Kevin Le 1a7f70e7b3 Added ARDUINO_USB_MODE=1 back to Heltec v4. ARDUINO_USB_MODE in heltec_v4.json has no effect. 2026-08-19 11:36:47 +07:00
Kevin Le 61048f5868 Added missing POWERSAVING_FIRSTSLEEP_SECS for room servers 2026-08-19 10:19:05 +07:00
Huw Duddy dab6b63567 Merge pull request #3235 from meshcore-dev/send-raw-direct-fix
Fix for CMD_SEND_RAW_DATA and multi-byte paths
2026-08-19 11:32:34 +10:00
ripplebiz dd17105992 Merge pull request #3246 from liamcottle/update/toolchain
Update GCC toolchain for nRF52 boards to fix builds on Raspberry Pi
2026-08-19 11:30:08 +10:00
liamcottle 612b217b90 updated gcc toolchain for nrf52 boards 2026-08-19 12:07:29 +12:00
mikecarper 0c4619bcc3 Expose Companion WiFi and radio power controls 2026-08-18 16:51:59 -07:00
mikecarper 818f610ba3 Fix Cascade power saving, USB Companion, and mOTA flows 2026-08-18 14:02:10 -07:00
agessaman 25d035f80a fix(mqtt): render the mbedtls diagnostic magnitude correctly
ESP-IDF stores the mbedTLS stack error as a positive magnitude (it captures
-ret), so negating it before printing produced "mbedtls:-0xFFFF8100" instead
of "mbedtls:-0x7F00" for the record-buffer allocation failure. %04X is a
minimum width, so nothing masked it.

Normalisation moves into MQTTReplyFormat.h as mbedtlsErrorMagnitude() rather
than staying inline in the bridge: inline is why this survived, since the
existing test passes the already-correct magnitude straight into replyAppendf
and never exercised the caller. It accepts either sign so a later SDK storing
the real negative code still renders, and widens to int64_t before negating
because negating INT32_MIN is undefined behaviour.

MQTTReplyFormat.h also gains the stdint.h it was always missing: it compiled
only because MQTTBridge.cpp pulls stdint in via other headers, and the host
test includes the header standalone.
2026-08-18 13:54:55 -07:00
mikecarper 0d4274ceea Merge remote-tracking branch 'iotthinks/PowerSaving-v17' into keymindCascade 2026-08-18 11:52:22 -07:00
mikecarper 7fb413bc12 Merge remote-tracking branch 'upstream/dev' into keymindCascade
# Conflicts:
#	examples/simple_repeater/MyMesh.cpp
2026-08-18 11:51:58 -07:00
F4FPR 2940ead504 Update ThinkNodeM6Board.h 2026-08-18 19:40:42 +02:00
F4FPR 6b696a4ef6 Update CommonCLI.cpp 2026-08-18 19:39:21 +02:00
F4FPR da863e555d Update MeshCore.h 2026-08-18 19:38:23 +02:00
agessaman c905b4dc12 feat(mqtt): add ntxmesh broker preset 2026-08-18 08:06:31 -07:00
agessaman cf14c0bb18 feat(mqtt): add ntxmesh broker preset 2026-08-18 08:04:15 -07:00
Kevin Le 4027acc74b Fixed to support usb companions 2026-08-18 20:57:20 +07:00
fdlamotte 29b33467fb Merge pull request #3180 from fdlamotte/thinknode_m8
thinknode_m8: initial support

adds some functionalities to ui_task and epddisplay:

epd display, 
- supports screen off, and clear screen
- supports forcing full refresh every N partial refreshes (off by default, configured to 60 for M8)

ui_task
- UI_SHOW_CLOCK flag to display clock on first screen
- rotary button can act like joystick (with regards to Enter key), defaults to old config for existing nodes
- screen off on long press when using rotary button (very handy for the watch)
2026-08-18 09:33:42 -04:00
ripplebiz 808994d828 Merge pull request #3238 from recrof/meshadventurer-board-relocate
fix: move MeshadventurerBoard.h to variants/meshadventurer
2026-08-18 23:04:35 +10:00
ripplebiz 5a30456225 Merge pull request #3239 from recrof/default-loop-detect-minimal
repeater: set `loop.detect` to `minimal` as default for new installs
2026-08-18 23:03:10 +10:00
Rastislav Vysoky 2db4b40617 repeater: set loop.detect to minimal as default for new installs 2026-08-18 14:56:58 +02:00
Rastislav Vysoky d65da5a81a fix: move MeshadventurerBoard.h to correct location 2026-08-18 13:51:55 +02:00
Dominik Tyrala 38f10cd12b Fixes BLE exceeding flash size 2026-08-18 09:34:34 +02:00
mikecarper 3551164476 Merge PR #3235: support multi-byte raw-data paths 2026-08-17 23:58:15 -07:00
mikecarper dcca80b6e6 Merge PR #3234: probe and claim Bosch sensor addresses
Use automatic 0x76/0x77 fallback probing while preserving the newer sensor manager implementation.
2026-08-17 23:57:27 -07:00
mikecarper 325351d573 Merge PR #3226: fix T1000-E USB product name 2026-08-17 23:55:58 -07:00
mikecarper 68c67f2cd4 Merge PR #3214: companion USB connection and flow control
Preserve the newer terminal and mOTA passthrough paths while adding real USB client detection and whole-frame transmit pacing.
2026-08-17 23:55:40 -07:00
mikecarper fab89ef01a Merge upstream dev
Resolve the LR2021 transmit-power receiver restart alongside local radio state caching.
2026-08-17 23:49:41 -07:00
mikecarper 32a681a59b Merge IoTThinks PowerSaving-v17
Port current-compatible power-saving updates while retaining newer local implementations.
2026-08-17 23:45:06 -07:00
IoTThinks 11222035ee Merge pull request #15 from Dom4n/fix/powersaving-v17-noise-floor-after-agc-reset
fix(radio): recalibrate noise floor after AGC reset
2026-08-18 11:02:46 +07:00
Kevin Le 167a32fbdc Fixed to show d h, h m and m for BLE companions 2026-08-18 10:40:16 +07:00
Scott Powell 0cce9197a1 Fix for CMD_SEND_RAW_DATA and multi-byte paths 2026-08-18 13:11:15 +10:00
Kevin Le 307bc938b5 Fixed RXPS for LR1110 2026-08-18 09:29:12 +07:00