Christopher Van HooseandClaude Opus 5 7060a38dba Fix V4-R8 crash on Wi-Fi association with BLE on; widen companion ATT MTU
Wi-Fi power save: remove the preference, always use DTIM modem sleep.

An R8 with saved credentials and Bluetooth enabled aborted every time Wi-Fi
associated. Coredump: crashing task "wifi", abort() inside pm_set_sleep_type,
with nimble_host and btController both live.

WIFI_PS_NONE is not a legal sleep mode while the BT controller is running --
modem sleep is precisely what yields airtime to BLE -- and the Wi-Fi PM blob
aborts rather than refusing. 844d8c3 made power save a preference defaulting
OFF on the V4-R8, which is why only that board crashed; the comment above the
apply site already stated the invariant it broke ("gives BLE coexistence
airtime").

The latency it was buying does not exist either. Profiling the companion link
on hardware: an app sync is ~40 CMD_GET_CHANNEL round trips (the device reports
MAX_GROUP_CHANNELS=40 and the app reads every slot individually), 165ms each,
with this firmware accounting for 28ms of 8264ms -- 0.3%. Sync cost is
round-trip COUNT, not link latency, so there was nothing to trade away.

Guarding the setting was considered and rejected: it would have to be silently
inert whenever Bluetooth is on, which is a confusing thing to leave in a
Settings screen. Removed instead -- toggle, prefs accessors and R8 default.
The stored wifi_ps NVS key is simply never read again; no migration needed.

Companion BLE: ATT MTU MAX_FRAME_SIZE -> MAX_FRAME_SIZE + 3.

A notification payload is ATT_MTU-3, so SerialBLEInterface::begin()'s
setMTU(MAX_FRAME_SIZE) left a full-length frame 3 bytes too big and NimBLE
silently dropped the overflow (ble_att_truncate_to_mtu). MyMesh::queueMessage()
clamps message text to exactly MAX_FRAME_SIZE, so maximum-length messages lost
their last 3 bytes -- over BLE only; USB/TCP/WS were unaffected. Applied from
the vendored transport rather than the core: setMTU() is a public static, so
MeshCore needs no change. Verified on an M9, which now negotiates 179.

All 8 environments build. R8 flashed and confirmed to be the booting slot
(otadata seq 1 -> ota_0); its boot log is not observable over USB because
opening the port drops that board into ROM download mode.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 00:53:41 -04:00
2026-07-19 13:58:05 +02:00
2026-08-19 16:28:49 +02:00
2026-08-14 15:57:08 -04:00

WADAMESH

A real touchscreen UI for your mesh radio. · open source · GPL-3.0

Touch-UI MeshCore companion-radio firmware for the LilyGo T-Deck / T-Deck Plus and Heltec V4 + TFT (ESP32-S3).

An LVGL touch UI — map, chat, contacts, channels, settings — split out of meshcomod. The app depends on a MeshCore fork via PlatformIO lib_deps.

Boards

See DEVICES.md for the full support matrix, install paths and per-board status.

  • LilyGo T-Deck / T-Deck Plus — env LilyGo_TDeck_companion_radio_touch (stable)
  • Heltec V4 + TFT + CHSC6x touch — env heltec_v4_tft_companion_radio_usb_tcp_touch (stable)
  • Tanmatsu (ESP32-P4) — built from tanmatsu/ (ESP-IDF), ships via the Tanmatsu app store
  • Elecrow ThinkNode M9 — env ThinkNode_M9_companion_radio_touch (beta) — keyboard & d-pad guide
  • RAK WisMesh Tap V2 (RAK3312) — env rak_tap_v2_companion_radio_touch (beta)

Architecture

This repo holds only the app: the companion_radio glue, the ui-touch LVGL UI, the two boards' glue/variants, and platformio.ini. The MeshCore core is not vendored here — it's pulled as a library via lib_deps from the ALLFATHER-BV/meshcomod monorepo (the same repo as the non-touch firmware), pinned by a lean source-only core-* git tag. The touch-app files this repo owns (TouchPrefsStore, WifiRuntimeStore, the transports, …) are dropped from the lib via -DMC_VENDORED_TOUCH_APP so they aren't compiled twice. The build is byte-identical to the original in-tree meshcomod firmware.

Build

PlatformIO pulls the core fork and all libraries automatically:

pio run -e heltec_v4_tft_companion_radio_usb_tcp_touch   # Heltec V4 TFT
pio run -e LilyGo_TDeck_companion_radio_touch            # LilyGo T-Deck
# or just `pio run` to build both

Flash with the NVS-preserving 4-component chain (bootloader / partitions / boot_app0 / firmware at 0x0 / 0x8000 / 0xe000 / 0x10000) so saved Wi-Fi credentials survive — not a merged image, which 0xFF-pads and wipes NVS.

Contributing

Contributions are welcome — see CONTRIBUTING.md. One topic per PR; inbound contributions are accepted under the project's GPL-3.0 license.

License

GPL-3.0-or-later — see LICENSE. wadamesh is copyleft: anyone who distributes a build or a fork must also make their source available under the GPL. This keeps the UI open and concentrates community effort instead of fragmenting it into closed forks.

wadamesh incorporates and depends on MeshCore (MIT, © Scott Powell / rippleradios.com) and other third-party components — see NOTICE for the full list and their licenses. MeshCore-derived files keep their MIT notices; the combined work is distributed under the GPL (MIT is GPL-compatible). The MeshCore fork that wadamesh builds against stays MIT on purpose, so its Wi-Fi/BLE hooks remain upstreamable to MeshCore.

S
Description
No description provided
Readme GPL-3.0
270 MiB
0 Stars 1 Watchers 0 Forks
Languages
C 48.3%
C++ 41.2%
Lua 3.4%
HTML 2.9%
Python 2%
Other 2.1%