Commit Graph
535 Commits
Author SHA1 Message Date
István def866d07b Merge branch 'main' into pisti87-hungarian-lang 2026-08-04 07:43:02 +02:00
Kaj SchittecatandClaude Opus 4.8 84378c06b9 touch: beta_57 notes rewritten to the house style (fuller why-focused prose)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 18:02:31 +02:00
Kaj SchittecatandClaude Opus 4.8 3c0f454d32 touch: beta_57 — community drop: auto-retry (#207), Pager TCXO (#209), SD-store fixes (#211/#212/#213), Discover emoji + SD format fixes
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
beta_57
2026-08-03 17:10:10 +02:00
István b64ef39ebd Upgrade actions/checkout from v6 to v4 2026-08-03 17:03:08 +02:00
Kaj SchittecatandClaude Opus 4.8 169971205d touch: run the SD format + paste workers on every board that offers them (#172)
The Format button (and its busy overlay) is compiled for T-Deck, M9 and
V4-R8, and Copy/Paste for every Files-app board, but both deferred workers
in UITask::loop were gated T-Deck-only. Elsewhere the tap set a pending
counter nothing consumed: the notice stayed up forever and the format
latch blocked SD remounting until reboot. Widen the format worker to the
button's gate (via the per-board sdSharedSPI accessor), ungate paste.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 17:02:14 +02:00
Kaj SchittecatandClaude Opus 4.8 f4a6c1b3ad touch: recolor-safe node names in Discover feed + msg-info trace (#223)
A repeater name with an emoji (multi-byte UTF-8 cut at a byte cap) or a
literal '#' desynced the LVGL recolor runs in the Discover feed, visually
killing every row after it; same class in the message-info repeat list.
Names are now UTF-8-boundary-cleaned and '#'-escaped at both sites, and
copyUtf8ReplacingMissingGlyphs no longer emits a split glyph at its cap.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 16:52:34 +02:00
István ca885dfb85 feat(lang): add Hungarian language 2026-08-03 16:41:45 +02:00
István 4b752919a4 Update i18n.cpp 2026-08-03 16:32:50 +02:00
István 402585d0b5 Update i18n.cpp 2026-08-03 16:25:52 +02:00
Kaj Schittecat e1aceec8a8 Merge pull request #212 from PixPMusic/pixpmusic/sd-prefs-concurrency 2026-08-03 15:52:04 +02:00
Kaj Schittecat 829278c9a2 Merge pull request #213 from PixPMusic/pixpmusic/storage-wdt-state 2026-08-03 15:51:55 +02:00
Kaj Schittecat c64a6eae49 Merge pull request #211 from PixPMusic/pixpmusic/datastore-pref-rename 2026-08-03 15:45:48 +02:00
Kaj Schittecat d9a0040d16 Merge pull request #209 from PixPMusic/pixpmusic/tpager-sx1262-tcxo 2026-08-03 15:45:42 +02:00
Kaj SchittecatandClaude Opus 4.8 78fed3a09d touch: Radio & Mesh toggle for the #207 auto-retry (default ON, opt-out)
'Retry sends until heard' switch under Radio & Mesh gates mikecarper's retry
train (#207): OFF stops new retry trains (an in-flight one finishes its
schedule), applied live and persisted (cfg v44 retry_echo, default ON).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 15:23:19 +02:00
Kaj 8d02fa78e8 Merge pull request #207 from mikecarper/feat/retry-until-echo
Retry until echo is heard
2026-08-03 15:18:29 +02:00
István 568001e1db feat(lang): add Hungarian language v0.3 2026-08-03 11:19:04 +02:00
István f55b9441c9 Update release.yml 2026-08-02 22:15:57 +02:00
Pixel Perfect afd41c393f fix(storage): make the heavy-WDT depth counter atomic
_wdtHeavyDepth() is a plain int, but WdtHeavyGuard is taken from both the
UI/loop task and the core-1 history worker (histFlushTaskFn ->
uiSegRunArmedJob -> uiSegAppendRecords/uiSegCompactWrite, each of which holds
one). Both run at priority 1 on core 1, so ordinary tick round-robin can
preempt between the load and the store of d++ / --d.

That race predates this PR, but this PR makes it likely rather than
theoretical: the new guard in rebootDevice() is constructed immediately
before uiHistWaitWorkerIdle(), a deliberate wait of up to 9 s on the very
worker that also takes the guard. Interleave the two and either

  - the depth strands above zero, so enableCore0WDT() is never called again
    and IDLE0 stays unsubscribed from the task watchdog for the session, or
  - the depth drops to zero while a guard is still held, re-arming the
    watchdog during the flash burst it exists to cover -- which panics
    mid-save and loses exactly the chat history rebootDevice() runs to
    persist.

Use std::atomic with an acq_rel fetch_add and a compare-exchange decrement.
The CAS preserves the original `d > 0` underflow guard, which still matters:
doFactoryReset() calls wdtHeavyBegin() with no matching end because it
reboots, so the counter can legitimately stay elevated and an unbalanced end
must not drive it negative.

Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-02 13:15:06 -07:00
István a35ae6fb0e Update release.yml 2026-08-02 22:11:55 +02:00
István b7d55db5e6 feat(lang): add Hungarian language v0.2
v0.1 6-303 ok
v0.2 305-386 ok
2026-08-02 21:52:52 +02:00
István 0d5b1ec9c6 add lang: hu
hungary lang added 0.1 1-303. ok
2026-08-02 19:09:20 +02:00
Pixel Perfect 4418b1f598 fix(prefs): avoid heap churn on cached reads
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-01 23:57:39 -07:00
Pixel Perfect 42a545a570 fix(storage): keep IDF watchdog guards nontrivial
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-01 22:34:41 -07:00
Pixel Perfect 7f4776e20d fix(storage): let clean preference flushes succeed
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-01 22:03:33 -07:00
Pixel Perfect a92afa191c fix(storage): gate loop watchdog APIs in IDF apps
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-01 21:59:17 -07:00
Pixel Perfect 8252e43b32 fix(storage): deduplicate concurrent preference loads
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-01 21:20:48 -07:00
Pixel Perfect 1e6a6b4b35 fix(storage): inspect the Arduino loop task watchdog
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-01 21:20:48 -07:00
Pixel Perfect 958ace84aa fix(storage): make file-backed preferences concurrency-safe
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-01 20:37:01 -07:00
Pixel Perfect 9202ad0a10 fix(storage): preserve loop watchdog state
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-01 20:33:06 -07:00
Pixel Perfect 603217312e fix(storage): commit rooted preference updates
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-01 20:33:04 -07:00
Pixel Perfect 5604bfa697 fix(tpager): use vendor TCXO voltage
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-01 20:33:03 -07:00
mikecarper 04d5f33575 Retry messages until an echo is heard 2026-08-01 17:13:03 -07:00
Kaj SchittecatandClaude Opus 4.8 a68ea66805 touch: beta_56 — duty-cycle preset fix, Pager SD storage, issue-sweep batch
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
beta_56
2026-08-01 12:28:58 +02:00
Kaj SchittecatandClaude Opus 4.8 bcc084820c touch: radio presets set a REAL duty limit — airtime factor was 10x off (#161)
MeshCore's airtime_factor is the Dispatcher's TX pacing multiplier: duty =
1/(1+af), so a 10% duty limit needs af = 9. The presets wrote af = pct/100
(0.10), which configured every preset user's radio to ~91% duty -- the Home
meter's 'always 91%' was truthfully reporting the misconfiguration, on every
region preset including UK/EU.

- applyMeshRadioPresetFields converts duty% -> factor correctly (clamped to
  the core's 0..9).
- findMatchingMeshRadioPreset accepts both the correct and the old buggy value
  so previously-configured devices still show their preset in the dropdown.
- healPresetAirtimeFactor (run once at UI begin) rewrites the factor for
  devices whose params exactly match a preset and whose stored factor matches
  the OLD buggy write -- the exact-match requirement is the guard against
  touching deliberate user-set values.

NOTE for the web client: Meshcomod-client/shared/radio_presets.ts documents
the same pct/100 convention and needs the matching fix.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 12:23:18 +02:00
Kaj SchittecatandClaude Opus 4.8 a2548c39ab touch: T-Pager gets the full store-on-SD machinery (#193)
The pager's SD support shipped in pieces (mount ladder with XL9555 card-detect,
tile-cache fallback, shared TFT_eSPI SPIClass) but CAP_SD/CAP_FILESYSTEM were
never flipped from the pre-wiring 0, so the Files app gates and the whole
'Store data on SD' machinery stayed compiled out -- an inserted, mounted,
browsable card that nothing would store to. Flipped the caps, extended the
boot storage selection + SPIFFS->SD migration + SdNvsPrefs routing gates to
TLORA_PAGER, and exported tloraPagerSharedSPI() from the variant so main.cpp
can mount the card at boot on the shared bus like the T-Deck.

Both pager envs + T-Deck + V4 + R8 build.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 12:19:46 +02:00
Kaj SchittecatandClaude Opus 4.8 badad25305 touch: issue batch — unlock branding (#165), Discover row overflow (#191), scope in details (#157)
- #165: the animated post-unlock overlay still said MESHCOMOD; now WADAMESH.
- #191: Discover app rows cap the name and use single-letter node types so the
  trailing last-heard age always fits the line.
- #157: the Info popup only read the transport scope for FLOOD messages, so a
  region-scoped DIRECT message showed no scope; and senders that carry the
  region in transport_codes[1] with codes[0]=0 showed Scope 0000. The scope is
  now read for any RX and falls back to codes[1] when codes[0] is zero.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 12:13:08 +02:00
Kaj SchittecatandClaude Opus 4.8 f0fc356a05 touch: beta_55 — prefs crash-safety + Pager UI sizes (PixPMusic), SD clock renegotiation, R8 buzzer
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
beta_55
2026-08-01 11:39:34 +02:00
Kaj SchittecatandClaude Opus 4.8 51617b404e touch: SD mount ladders renegotiate the clock upward after a slow-rung init (#194)
A card whose power-up handshake only completed at 400 kHz kept 400 kHz as its
SESSION clock — SD.begin's frequency is the operating clock, and neither the
boot ladder (main.cpp) nor the runtime ladder (fmSdTryMount) ever raised it
after a slow success. With the SD as the T-Deck's primary store that meant
loading contacts + history at ~25 KB/s: the reported ~3-minute boot, f_getfree
timeouts making an inserted card show as 0 KB/empty in the file manager, and
backups wedging. Launcher installs hit it most (the Launcher's own SD use
leaves the card needing the slow wake path more often).

Standard SD bring-up is init-slow-then-raise: after any sub-4MHz success both
ladders now re-begin at 4 MHz, falling back to the clock that just worked if
the fast re-begin fails. A healthy card is unaffected (mounts at 4 MHz on the
first rung). T-Deck + V4-R8 + M9 (the shared-SPI SD boards) build.

Likely also behind the long-standing Launcher-mode weirdness cluster together
with the torn-prefs fix (#195/#196): slow-clock sessions made every write
window enormous.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 11:36:24 +02:00
Kaj Schittecat 67b863d93e Merge branch 'main' of https://github.com/ALLFATHER-BV/wadamesh 2026-08-01 11:29:52 +02:00
Kaj 44a4a354b0 Merge pull request #197 from PixPMusic/pixpmusic/pager-ui-size
feat(touch): add T-Pager UI size presets
2026-08-01 11:29:50 +02:00
Kaj Schittecat a3b535237e Merge branch 'main' of https://github.com/ALLFATHER-BV/wadamesh 2026-08-01 11:18:54 +02:00
Kaj 7a7b70c93f Merge pull request #196 from PixPMusic/pixpmusic/atomic-touch-prefs
fix(esp32): persist preferences safely off the UI task
2026-08-01 11:18:52 +02:00
Pixel Perfect 05f4ba6542 feat(touch): add T-Pager UI size presets
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-01 02:14:24 -07:00
Kaj SchittecatandClaude Opus 4.8 c0d702a8a7 touch: control-centre GPS tile long-press opens the GPS page, not Radio
Stale CAT_RADIO from before the settings reorg gave GPS its own category —
every other tile already pointed at its own page. All boards.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 10:15:26 +02:00
Kaj SchittecatandClaude Opus 4.8 cdd2f21cbb touch: V4-R8 buzzer — wire the Expansion Kit V2's PAM8904 DIN (GPIO4)
The R8 env shipped HELTEC_V4_BUZZER_PIN=-1 because the Kit V2's PAM8904 wiring
was unconfirmed, so R8 users have never heard a notification. Heltec's
Expansion_board_V2.03.pdf schematic settles it: DIN = GPIO4, and EN1/EN2 are
hardware-strapped high (10K pull-ups, 3x boost) with DIP switch SW1 as a
hardware mute -- no enable code needed, the stock V4 tone() chime drives DIN
directly. GPIO4 is unclaimed on the R8 (board I2C moved to 17/18).

Tester-verify: chime on message. If still silent, SW1 on the expansion board
is the hardware mute -- check it is not switched to ground.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-01 09:59:03 +02:00
István 2270c5d2cc Update i18n.cpp 2026-08-01 05:34:55 +02:00
Pixel Perfect 2001ef72dd refactor(esp32): persist preferences off the UI task
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-07-31 18:08:27 -07:00
Pixel Perfect 540084a718 fix(touch): stop persisting unused tab state 2026-07-31 17:10:55 -07:00
Pixel Perfect 1c761e7846 fix(esp32): make file-backed preferences crash-safe
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-07-31 09:57:44 -07:00
Kaj SchittecatandClaude Opus 4.8 d52fcc47a5 touch: beta_54 — P4 screen-flash + GPS fixes, Romanian (jcyrio), V4-R8 landscape rescue
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
beta_54
2026-07-31 17:45:18 +02:00