Commit Graph
888 Commits
Author SHA1 Message Date
Kaj SchittecatandClaude Opus 5 c388a36cb9 touch: restore the trailing newlines the T-Deck Max PRs dropped
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 14:10:45 +02:00
Kaj SchittecatandClaude Opus 5 9fe008e5ef Merge PR #547 from pelgraine: T-Deck Max boots with Wi-Fi off
Wi-Fi and BLE together at boot leave about 28% of internal RAM free on this
board, so it starts with BLE only; the Settings toggle persists any choice.
HAS_TDECK_MAX gated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 14:06:41 +02:00
Kaj SchittecatandClaude Opus 5 37e4441cd7 Merge PR #546 from pelgraine: T-Deck Max UI
E-paper adaptations for the Max, all behind HAS_TDECK_MAX: no fades, the
page repainted before power-off so no black frame is left on the glass, a
sleep banner, tap to wake, and the keyboard-backlight chord.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 14:06:41 +02:00
Kaj SchittecatandClaude Opus 5 9c47a9e50d touch: fixes on the merged PRs, and ship the T-Deck Max
Review of #531 turned up four things that had to be fixed before release:

- An unusable region name no longer discards the radio settings. The save
  returned early, so frequency, bandwidth, SF, CR and TX power were thrown
  away, and the rule rejects names with capitals or a "$private" scope, so
  anyone carrying an older region could not change their radio at all. On the
  pager that path is the silent blur save, so it failed with nothing on screen.
  Now only the region is skipped, and it says so.
- Restored useChainedFont() on the telemetry Show button: without the fallback
  chain that label is boxes in Russian, Ukrainian, Bulgarian, Serbian, Greek.
- Region scanning installs unknown repeaters as transient contacts so their
  encrypted replies can be matched. They were never removed, so each scan left
  up to 16 nameless entries in the contact table (and in Contacts). They are
  dropped when the scan ends or the page closes.
- One radio request per scan tick. The loop ran through all 16 repeaters in a
  single 200 ms tick, which is that many key derivations back to back.

The V4-R8 also did not build (its src/ files see a vendored lv_conf.h, so the
new text-size fonts were missing) and then did not fit at 101.3%. It builds at
85.6% now: the board no longer carries the compiled-in translations it
inherited from the V4, which it never needed, since with 8 MB of PSRAM its
store works like any other 8 MB board.

T-Deck Max (#545) joins the release matrix: build list, flasher manifest,
DEVICES.md and the site's board list. Board names in the flasher lost their
em dashes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 14:04:24 +02:00
Kaj SchittecatandClaude Opus 5 4df42eedf4 Merge PR #531 from oumike: device usability, input and accessibility
M9 Back and Bluetooth-keyboard Esc stop at the locked app-drawer root, M9
focus fixes, optional M5Stack CardKB on the V4 and V4-R8, V4-R8 touch and
text-size accessibility, Wio L2 SD retry, high-contrast day and night themes
(#544), channel region discovery (#541) and the Czech translation
contributed in #540 by brebtatv.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 13:54:09 +02:00
pelgraine a87a44f7cc T-Deck Max: Wi-Fi off by default
Signed-off-by: pelgraine <140762863+pelgraine@users.noreply.github.com>
2026-09-21 21:17:51 +10:00
pelgraine ec5cc09399 T-Deck Max: e-paper UI, front-light and pad shortcuts
Signed-off-by: pelgraine <140762863+pelgraine@users.noreply.github.com>
2026-09-21 21:12:07 +10:00
Michael A. Cojocari 36f9628e11 feat: add Czech translation 2026-09-20 20:45:14 -04:00
Michael A. Cojocari a08342a3c0 feat(ui): discover and select channel regions 2026-09-20 19:59:56 -04:00
Michael A. Cojocari 0aa2f28c16 feat(ui): add high-contrast day and night themes 2026-09-20 19:08:45 -04:00
Kaj SchittecatandClaude Opus 5 6fe6b9f063 touch: beta_83, USB Files (files.wadamesh.com over the USB cable)
A built-in USB Files app (T-Deck and Heltec V4 for now) lets the page at
files.wadamesh.com browse, upload, download, rename and delete files on the
SD card, internal storage and the map tiles over Web Serial. File level, not
USB mass storage: the device keeps its filesystems mounted, the radio keeps
running, and the firmware enforces what may change. Live data (identity,
contacts, settings, history; /meshcomod on the card) is download-only.

- UsbFilesProtocol.h: framed messages (E7 5A, CRC32), a resyncing parser,
  path checks and the access policy; host tests in test/.
- UsbFilesSession: one request at a time (both Arduino USB serial drivers
  drop bytes when their RX queue is full), RX queue sized per session, SD
  data through a DMA-capable bounce buffer, FatFs listings with sizes, a
  beacon so the page never talks first, SD Scan's malware verdict per file.
- The companion link and MyMesh's console step off USB while it runs.
- Website: labelled side buttons, a USB Files button and card; the
  files.wadamesh.com page, vhost and deploy script.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-19 11:52:34 +02:00
Michael A. Cojocari 33839f87f2 fix(wio-l2): retry SD mount after power cycle 2026-09-18 19:31:27 -04:00
Michael A. Cojocari eb4b71fb67 fix(v4-r8): improve touch and text accessibility 2026-09-18 16:44:12 -04:00
Michael A. Cojocari bf114b4618 feat(heltec-v4): support external CardKB 2026-09-18 15:30:44 -04:00
Michael A. Cojocari c406dd1ade fix(m9): preserve unread channel color 2026-09-18 12:22:21 -04:00
Michael A. Cojocari b6419cc1d0 Merge remote-tracking branch 'upstream/main' into fix/528-m9-drawer-back 2026-09-18 12:21:49 -04:00
Kaj SchittecatandClaude Opus 5 6868911f59 touch: SD Scan, find and remove Windows malware on the SD card
Some ThinkNode M9 cards shipped with a dormant Windows worm (Elecrow
security advisory, September 2026). An infected card seen since carries
autorun.inf in the root, launching xlfqf.pif on open, explore and autoplay
with random-junk comment lines in between: the Sality autorun pattern.

- SD Scan store app (deploy/apps/sdscan/1.0, requires "sd", not seeded):
  walks the card a small page per tick, lists what it finds and why, and
  removes it after a confirmation screen with Cancel first. It says on
  every screen that it only removes files it recognises and that
  formatting the card is the safe fix. On older firmware it still finds
  threats by name but cannot remove them.
- Firmware: wada.sd.check(path) and wada.sd.remove(path), plus paging for
  wada.sd.list(path, start, max) and caps().sd_clean. What counts as a
  threat lives in SdThreat.h: autorun.inf, Windows program, script and
  shortcut extensions, or a real MZ+PE header under any name. remove()
  classifies again in firmware and refuses anything else, so no app can
  use it to delete tiles, backups or chat history. It clears read-only,
  hidden and system first, because FAT refuses to delete a read-only file.
- A warning when a card with Windows malware in its top folder is mounted,
  at boot or on insert, offering SD Scan (or the Store).
- Tests: test/test_sd_threat.cpp, and SD Scan harness scenarios including
  the real infected card's root. Removal checked on a T-Deck.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 13:33:30 +02:00
Michael A. Cojocari 23a5a62927 fix(m9): restore Language settings focus 2026-09-17 19:53:57 -04:00
Michael A. Cojocari da69f539f5 fix(m9): skip duplicate traffic focus target 2026-09-17 19:45:56 -04:00
Michael A. Cojocari a6a18ecf36 fix(m9): keep Back at locked home drawer 2026-09-17 19:28:41 -04:00
Kaj SchittecatandClaude Opus 5 ce37110515 touch: web unlock, a way out of console mode, paste keys, M9 update notice
- Web interface: unlock a manually locked screen (#506). The device publishes
  its lock state over the mirror socket and the page shows an Unlock button
  while it is set. The lock screen absorbs taps by design and only a held
  trackball or BOOT press unlocks on the device, so a browser had no way back
  from a screen it had locked itself.
- Console mode: hold the panel for three seconds to leave it (#507). The
  banner and `help` both say so. Console mode also applies the "Older keyboard
  protocol" setting now: that is applied in the graphical startup path, which
  console mode returns before, so the console ran on protocol detection alone.
  On a T-Deck that needs the older protocol every keystroke there is garbage,
  which is why `ui` could not be typed and the reporter had to side-load a
  second firmware to get the device back.
- Console mode: a touch wakes a dark panel again on the touch-only boards,
  where the keyboard and button wake paths sit below the console branch's
  return. The waking press is swallowed so it cannot also type.
- Paste into a key field lifts the key out of the surrounding text (#526): a
  32 hex digit channel secret or a 64 hex digit public key, spaced keys
  included. Before, the field filled with prose and the length cap cut the key
  off.
- ThinkNode M9: a waiting firmware update is visible (#443). The red "!" over
  the bottom-bar gear is built in the #else of that board's block, so the M9
  had no update signal at all; it gets a third slot in its own notice row,
  steady amber rather than blinking. The Settings tile in the app drawer
  carries an "!" on every board.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 20:43:06 +02:00
Kaj Schittecat 02734a4642 Merge PR #523 from oumike: SD recovery, offline map upload, glance emoji, T-Deck Pro and V4 kit input
- Pager: the SD card mounts again after the card was used on a computer
  (#522): one SD-rail power cycle and retry, and power-off unmounts and powers
  the card down
- At a glance: emoji render instead of squares (#521)
- Transfer page: upload an offline OSM tile folder to /tiles on the SD card
  (#515), with strict path checks and resumable, atomic writes
- T-Deck Pro: touch release debounce, hardware-timed chat-row holds, and a
  typed space no longer starts the screen lock
- Heltec V4 with the original Expansion Kit: the IO button goes back (tap)
  or home (hold), larger keys with a magnified preview, and larger status-bar
  targets (#525)
2026-09-17 19:55:51 +02:00
Kaj SchittecatandClaude Opus 5 793a673c64 touch: Bluetooth LE keyboards on every S3 board
Bluetooth serves either the phone app or a keyboard (Settings > Bluetooth).
Pairing lists keyboards in pairing mode and pairs with or without a code;
the paired keyboard reconnects by itself.

Keys are read the way phones and computers read them: the keyboard's Report
Map says which report carries the keys and how, so media keys and touchpads
are left alone, and the boot protocol is only the fallback. Key positions are
translated with the chosen layout (US, UK, German, French, Belgian), with
AltGr and dead keys.

While a keyboard is connected:
- text goes into the focused field, and touchscreen-only boards keep the
  on-screen keyboard down (a second tap on a field brings it up anyway)
- the arrows, Tab, Enter and Page Up/Down drive the focus highlight
- Esc is the back button; a "Back key" setting picks another key for
  keyboards whose Esc key types a character
- tab hotkeys and their hints over the tab bar are switched on
- Command tapped alone opens the emoji picker in a chat
- the status bar shows a keyboard instead of the Bluetooth glyph

The Bluetooth page is now a flex column with the choice on top, and the
settings page refit keeps it scrollable when its content grows.

Settings: prefs v61 (mode, layout, paired keyboard) and v62 (Back key).
Tests: test/test_hid_report_map.cpp, test_touch_prefs_schema.cpp.
Not on the P4 boards (Tanmatsu, T-Display P4).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 19:52:21 +02:00
Michael A. Cojocari e796984ad4 fix(heltec-v4): improve expansion kit usability 2026-09-17 11:55:24 -04:00
Michael A. Cojocari 4b7882ca44 fix(tdeck-pro): harden touch and space holds 2026-09-17 10:34:18 -04:00
Michael A. Cojocari e83bb7582e feat: upload offline maps to SD 2026-09-16 20:53:54 -04:00
Michael A. Cojocari 08ad95c5c2 fix(ui): render emoji in glance notifications 2026-09-16 20:05:00 -04:00
Michael A. Cojocari 9542756f91 fix(pager): recover SD after host use 2026-09-16 19:45:27 -04:00
Kaj SchittecatandClaude Opus 5 2f6984443d touch: fix the chat page-scroll panic on long chats (#428, #475)
Pressing down past the last message page-scrolls the chat list with an
LVGL animation. In a long chat the list uses compressed scroll
coordinates, and chatVirtRemap1To1Scroll re-anchored the position on
every LV_EVENT_SCROLL with lv_obj_scroll_to_y(LV_ANIM_OFF). That deletes
the running animation from inside its own step. LVGL 8.4 reads the
animation again after the step, and when the step was also its last
(the UI loop was busy for longer than the animation) it finished the
freed animation and freed it a second time. By the next round that
memory belonged to something else, and anim_timer called a garbage
get_value_cb: the jump to 0x00020000 in the beta_79 and beta_80 M9 dumps,
both at the same call site.

- chatVirtRemap1To1Scroll follows a scroll that an animation drives and
  leaves the re-anchor to chatVirtOnScrollEnd. The page scroll now also
  completes on long chats; the early re-anchor stopped it after a frame.
- scripts/build/patch_lvgl_anim_uaf.py skips LVGL's completion check when
  the animation list changed during the step, as LVGL 9 does. Applied to
  every touch env as a pre-script and to the vendored P4 copy
  (fetch-deps.sh, build.sh). Idempotent, fails closed on source drift.
- test/lvgl_anim_uaf/run.sh reproduces it on the host under
  AddressSanitizer: stock LVGL with the old handler reports the
  use-after-free in anim_timer, and either fix alone runs clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 14:43:14 +02:00
Kaj SchittecatandClaude Opus 5 202ea050ca touch: a self-update must never fetch another board's firmware
The per-board OTA_BIN_NAME chain ended in a bare #else naming the Heltec V4
TFT, so any board nobody had added to it silently downloaded the V4 image.
Update.end() only checks that an image is valid for an ESP32-S3, which the V4
build is, so nothing stopped it being flashed.

The Seeed Wio Tracker L2 shipped exactly like that. Its build defines only
HAS_WIO_TRACKER_L2, which the chain never tested, and the released beta_79
image carries "wadamesh-heltec-v4-tft" as its update name: an on-device update
on a Wio L2 installs Heltec V4 firmware onto Wio hardware and needs a USB
reflash to recover. The T-Deck Pro (HAS_TDECK_PRO) was in the same position
and would have done the same the moment it was published.

Every board is now listed explicitly, the V4 TFT included (the V4-R8 also
defines HELTEC_LORA_V4_TFT, and its branch already comes first), and anything
unlisted is an #error. Forgetting this table is now a build break instead of
a field brick.

Verified on all twelve OTA-capable targets: each compiles, and each binary
asks for exactly the artifact release.sh publishes for it (checked
mechanically: 10 PlatformIO envs plus both T-Display P4 SKUs, no mismatches).

Units already on beta_77 to beta_79 still have the wrong name compiled in, so
Wio L2 owners must update from the website over USB rather than on the device
until they are on a build with this fix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 12:20:09 +02:00
Kaj SchittecatandClaude Opus 5 6bb98a1224 i18n: fix the "System Information" key at its source (13 languages)
#458 renamed TR("System info") to TR("System Information") and updated the
translation table to match, so the title stayed translated. But
src/ui-touch/i18n_builtin.h is GENERATED ("DO NOT EDIT") by
scripts/build/gen-lang-builtin.py from deploy/apps/lang/*.lang, and the rename
never reached those packs. Every regeneration since then -- the PlatformIO pre-hook
and the IDF build.sh both run it -- quietly wrote the old key back, so the source
asked for "System Information" while all thirteen tables answered "System info",
and the page title fell back to English in every language.

That is also why #517 appeared to revert the rename: its copy of the header was a
freshly regenerated one, faithfully reproducing the stale packs.

Rekeyed the thirteen source packs, then regenerated. The generated table changed by
exactly one key per language and nothing else, which confirms it was otherwise in
step with the packs, and the fix now survives the build's own regeneration, which is
the thing that used to undo it. The corrected packs reach devices that download a
language once the app store is republished with the next beta.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 11:56:25 +02:00
Michael A. Cojocari 703afb9d85 Merge issue #512 telemetry poll limit into PR #517 2026-09-15 19:49:22 -04:00
Michael A. Cojocari 07060e8a41 fix: bound telemetry auto-poll requests 2026-09-15 19:49:16 -04:00
Michael A. Cojocari 7cdc14a2df build: keep consolidated target builds green 2026-09-15 09:15:40 -04:00
Michael A. Cojocari ed69b56ed6 Merge remote-tracking branch 'refs/remotes/pr/514' into integration/all-open-prs-20260913 2026-09-13 18:58:23 -04:00
Michael A. Cojocari 78ff763b4d Merge remote-tracking branch 'refs/remotes/pr/513' into integration/all-open-prs-20260913 2026-09-13 18:58:23 -04:00
Michael A. Cojocari 6316901310 Merge remote-tracking branch 'refs/remotes/pr/509' into integration/all-open-prs-20260913 2026-09-13 18:58:23 -04:00
Michael A. Cojocari c7e7dbf894 Merge remote-tracking branch 'refs/remotes/pr/502' into integration/all-open-prs-20260913 2026-09-13 18:58:23 -04:00
Michael A. Cojocari ef374faf21 Merge remote-tracking branch 'refs/remotes/pr/501' into integration/all-open-prs-20260913 2026-09-13 18:58:23 -04:00
Michael A. Cojocari ea8583ead7 Merge remote-tracking branch 'refs/remotes/pr/498' into integration/all-open-prs-20260913 2026-09-13 18:58:22 -04:00
Michael A. Cojocari fdde0dd0cc Merge remote-tracking branch 'refs/remotes/pr/497' into integration/all-open-prs-20260913 2026-09-13 18:58:22 -04:00
Michael A. Cojocari 478a0030e3 Merge remote-tracking branch 'refs/remotes/pr/496' into integration/all-open-prs-20260913 2026-09-13 18:58:22 -04:00
Michael A. Cojocari b77b236d42 Merge remote-tracking branch 'refs/remotes/pr/495' into integration/all-open-prs-20260913 2026-09-13 18:58:22 -04:00
Michael A. Cojocari 8e5775dc34 Merge remote-tracking branch 'refs/remotes/pr/494' into integration/all-open-prs-20260913
# Conflicts:
#	src/ui-touch/UITask.cpp
2026-09-13 18:58:12 -04:00
Michael A. Cojocari 31394f8f1e Merge remote-tracking branch 'refs/remotes/pr/493' into integration/all-open-prs-20260913 2026-09-13 18:57:49 -04:00
Michael A. Cojocari f060bbee09 Merge remote-tracking branch 'refs/remotes/pr/492' into integration/all-open-prs-20260913
# Conflicts:
#	src/ui-touch/UITask.cpp
2026-09-13 18:57:44 -04:00
Michael A. Cojocari 7639363c78 Merge remote-tracking branch 'refs/remotes/pr/489' into integration/all-open-prs-20260913 2026-09-13 18:56:58 -04:00
Michael A. Cojocari 2dd4dc24d5 Merge remote-tracking branch 'refs/remotes/pr/488' into integration/all-open-prs-20260913 2026-09-13 18:56:58 -04:00
Michael A. Cojocari 85e5a28be2 Merge remote-tracking branch 'refs/remotes/pr/487' into integration/all-open-prs-20260913 2026-09-13 18:56:58 -04:00
Michael A. Cojocari 240d455f9c Merge remote-tracking branch 'refs/remotes/pr/486' into integration/all-open-prs-20260913 2026-09-13 18:56:57 -04:00