Commit Graph
698 Commits
Author SHA1 Message Date
Pixel Perfect 1f2a4b6068 fix(tpager): close app pages from back gesture 2026-08-10 12:21:08 -07:00
Pixel Perfect 3bff2b9257 fix(tpager): resize mentions for larger fonts 2026-08-10 12:21:08 -07:00
Pixel Perfect 151ca4ae1f fix(tpager): resize contact detail menus 2026-08-10 12:09:56 -07:00
Pixel Perfect eadff5ca11 fix(fonts): rebuild touch fonts from OFL sources 2026-08-10 11:15:36 -07:00
Pixel Perfect e58618c590 fix(tpager): clear signal poll focus outline 2026-08-10 09:36:23 -07:00
Pixel Perfect a8bf7b8784 feat(tpager): add full-width traffic detail chart 2026-08-10 09:36:22 -07:00
Pixel Perfect 2627849905 fix(tpager): enlarge contact share panel 2026-08-10 09:36:22 -07:00
Pixel Perfect 733d4015cf fix(tpager): restore bright close focus 2026-08-10 09:36:22 -07:00
Pixel Perfect 48f0589ef5 fix(tpager): center discovered count badge 2026-08-10 09:36:22 -07:00
Pixel Perfect 77a80ed04e fix(tpager): keep contact rows compact 2026-08-10 09:36:22 -07:00
Pixel Perfect a5e2ba07c0 fix(tpager): make Jumbo chat text distinct 2026-08-10 09:36:22 -07:00
Pixel Perfect 32fc5c99e9 fix(tpager): keep familiar size preset names 2026-08-10 09:36:22 -07:00
Pixel Perfect 2ef3746c55 feat(tpager): finish accessible chat sizing 2026-08-10 09:36:22 -07:00
Pixel Perfect 8783e2ebe8 fix(tpager): reclaim the overview header row 2026-08-10 09:36:22 -07:00
Pixel Perfect f22c22020e fix(ui): scope QR scaling to Pager 2026-08-10 09:36:22 -07:00
Pixel Perfect fb4a11c887 fix(tpager): align overview actions with status bar 2026-08-10 09:36:22 -07:00
Pixel Perfect 09b4e696dd fix(tpager): shrink overview action buttons 2026-08-10 09:36:22 -07:00
Pixel Perfect 69d33b4f42 fix(tpager): contain large UI chrome and menus 2026-08-10 09:36:22 -07:00
Pixel Perfect e8732f38a2 fix(touch): keep composer geometry consistent
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-10 09:36:21 -07:00
Pixel Perfect b12187480d fix(touch): size Pager chat rows from fonts
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-10 09:36:21 -07:00
Pixel Perfect b5ead407cc fix(touch): honor Pager fallback line metrics
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-10 09:36:21 -07:00
Pixel Perfect fba8cdedff fix(touch): keep enlarged Pager UI readable
Signed-off-by: Pixel Perfect <me@pixp.cc>
2026-08-10 09:36:21 -07:00
Kaj Schittecat 04947c1413 touch: dev FIRMWARE_VERSION default follows the pinned core (release.sh auto-sync) 2026-08-10 13:15:34 +02:00
Kaj SchittecatandClaude Opus 5 7bc55ef205 release: firmware-data gate broke on its own pipefail (grep -q SIGPIPEs strings)
The script runs under 'set -o pipefail'. grep -q exits at the first match, which
SIGPIPEs the strings feeding it, so the pipeline reported failure and the gate
declared every image untagged — on its first real run, against images that
carried the tag correctly. Count instead of short-circuiting.

The build-date change in the previous commit was precautionary (it matches the
convention the meshcomod release flow already uses); I have no evidence the
spaces were actually breaking the flags, and should not have called it the fix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 13:12:31 +02:00
Kaj SchittecatandClaude Opus 5 46960f0cd2 release: build date must not contain spaces (it broke the whole flag string)
PLATFORMIO_BUILD_FLAGS is whitespace-split, so '10 Aug 2026' tore the string
apart and every -D after it was dropped — including FIRMWARE_RELEASE_TAG, which
is precisely the untagged-build failure the new gate exists to catch. The gate
caught it on the first real run and stopped beta_61 before anything published.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 13:04:46 +02:00
Kaj SchittecatandClaude Opus 5 d22c200932 touch: fetch-deps integrity guard + beta_61 note for the P4 receive fix
The vendored core is gitignored and fetch-deps rm -rf's it, so a hand-edit
there dies with no history. That cost us the esp-nimble-cpp 2.x port and then
the P4's polled receive. Both live in the core now; fetch-deps verifies they
survived the copy and fails loudly if not.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
beta_61
2026-08-10 12:40:15 +02:00
Kaj Schittecat 48a71695e7 touch: pin core-v1.17.4 — polled receive restores the T-Display P4
Verified on device: the P4 receives channel messages and delivery
confirmations again, and the About RX counters move off zero.
2026-08-10 12:39:00 +02:00
Kaj SchittecatandClaude Opus 5 d4ade2e616 i18n: add the 48 UI strings no language file had, as empty rows for translators
The firmware asked for these keys and no .lang file carried them, so they
rendered English in all 13 languages with nothing to show a translator that
they were missing. Mostly strings that shipped with a feature whose PR did not
touch the language files: the SD arbitration and migration warnings, the
Wi-Fi/BLE coexistence messages, the keyboard-navigation vocabulary
(Up/Down/Left/Right/Select/Scroll) and section names (General, Clock & time,
Sensors, Screen, Home, Messages, Keys, Compact, Snake).

They go in with an EMPTY translation, which is the format's own way of saying
'not translated yet': the runtime loader requires a non-empty value
(`if (*p && tab[1])`) and gen-lang-builtin.py requires `if k and v`, so both
skip these rows and the English falls through exactly as before. Confirmed:
i18n_builtin.h regenerates byte-identical. No `# ver:` bump for the same
reason — device behaviour is unchanged, so there is nothing to re-download.

Also fixes the audit's own row parser to match the loader: a line is a comment
only when it has NO tab. Testing for a leading '#' hid every key starting with
LVGL recolor markup ("#7A7F87 Wardrive: …#"), the exact class the loader has a
comment warning about.

Every language is now at 0 missing keys.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 10:24:56 +02:00
Kaj SchittecatandClaude Opus 5 69bace7c15 tooling: audit .lang files against the TR() keys the firmware looks up
Nothing checked this. The .lang files are hand-maintained and i18n_builtin.h is
generated FROM them, so drift is invisible in both directions: a row whose
English no longer appears in any TR() call is translated for nothing, and a
TR() key with no row renders English in every language forever.

Matching mirrors TR() in i18n.cpp, which is the part a grep gets wrong —
adjacent C literals concatenate, LV_SYMBOL_* icon prefixes are stripped before
lookup, non-ASCII is often written as \x escapes, and menu/tab labels reach
TR() through a table field rather than as a literal (resolved by harvesting the
table's initialiser).

Current state: 910 TR() keys; every language carries ~57 dead rows and is
missing ~53 keys (hu: 77 dead, 52 missing).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 09:53:31 +02:00
Kaj SchittecatandClaude Opus 5 335a64c118 touch: core-v1.17.1 (beta_60 boot loop + unreachable contacts) + release firmware-data gate
Core (core-v1.17.1, meshcomod 5406093): 1.17 reserved MAX_ANON_CONTACTS slots
at the head of contacts[], which broke two things in beta_60 —

- resetContacts() claimed those slots while the lazily-allocated PSRAM table was
  still NULL, so the new bootstrapRTCfromContacts() NULL-deref'd at boot on any
  device whose contact store loaded nothing: fresh install, erase-flash, or SD
  not mounted yet (#249). Boards with saved contacts booted fine, which is how
  it passed bench testing.
- getContactByIdx() stayed raw while getNumContacts() excludes the reserved
  slots, so every pairing of the two — contact list, action sheets, phone-app
  sync, getContactForSave — read empty slots and could not reach the newest 8
  real contacts. A just-added contact was invisible and its action-sheet
  operations resolved to a blank slot (#252).

Fork side:
- loadContacts() skips blank records, clearing the placeholder contacts beta_60
  wrote into the contacts file (the next save drops them permanently).
- Chat threads follow a peer's rename. The thread is matched by key but its name
  was never updated, while inbound messages are filed by sender name — so the
  first message after a rename created a duplicate thread (#252).
- release.sh derives FIRMWARE_VERSION / build date / core version from the tag
  and the pinned core, keeps the in-tree dev default in step, and ABORTS the
  release if any staged image does not embed its own tag. beta_60 shipped
  reporting v1.16.0-touch because that value was hand-maintained.

All 8 S3 envs build green on core-v1.17.1.

Reported-by: Pierre747, rustinmyeye, myshoeisonfire

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 08:20:00 +02:00
Kaj SchittecatandClaude Fable 5 8cd14d2aea touch: beta_60 — MeshCore 1.17 rebase
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
beta_60
2026-08-09 18:09:55 +02:00
Kaj SchittecatandClaude Fable 5 e74cdcb3fe touch: pre-LVGL screens draw explicit colors (fix white boot-logo border on 1.17)
startFrame()'s default background became UIColor::window_bkg in the 1.17
core, and boards whose DISPLAY_CLASS is a core driver link upstream's
palette — window_bkg=WHITE, primary_txt=BLACK. The boot splash grew a
white frame around the logo, and the radio-halt text would have drawn
black-on-black. Boot splash, halt screen, REMOTE placeholder and the
shutdown screen now pass explicit black/white/red instead of palette
entries whose values depend on which display driver got linked.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 17:51:26 +02:00
Kaj SchittecatandClaude Fable 5 dbe005df9c touch: bump the dev-build FIRMWARE_VERSION default to v1.17.0-touch
The core moved to 1.17 (core-v1.17.0 pin) but the About string on dev
flashes still said v1.16.0-touch — release builds override it via
release.sh, only the #ifndef default was stale.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 17:44:11 +02:00
Kaj SchittecatandClaude Fable 5 5526246683 core-117-prep: pin the real core-v1.17.0 tag (lean f453c7d on meshcomod)
All 8 S3 envs rebuilt green against the GitHub tag; the tag's tree is the
PR #46 merge commit (609c903) minus prebuilt/ — identical content to the
local test pin the branch was validated on.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 17:29:13 +02:00
Kaj SchittecatandClaude Fable 5 31e373a4b1 core-117-prep: finish the ColorVal migration on the IDF display headers + pager core-scope includes
TanmatsuDisplay.h / RM69A10Display.h / HI8561Display.h still had the 1.16
Color signatures (missed in the first sweep); pagers additionally hand the
core lib scope the TFT_eSPI include path (target.h -> ST7796LCDDisplay.h).
All 8 S3 envs + the Tanmatsu now build green on the 1.17 test pin.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 17:15:08 +02:00
Kaj SchittecatandClaude Fable 5 e3c5c4237b core-117-prep: 1.17 core compile fixes across all targets (TEST PIN — not for main)
- UIColor migration: DisplayDriver::Color enum -> ColorVal/UIColor statics in the
  6 driver headers + 3 driver .cpps + all main.cpp/UITask.cpp call sites.
- ONE palette definition: src/helpers/ui/UIColorPalette.cpp. Envs whose
  DISPLAY_CLASS is a core driver (v4_tft, attaky, tdeck, M9) take the palette
  the core driver .o carries; envs on our drivers (r8, rak via src_filter;
  pagers via helpers/ui glob; both IDF apps via the whole-archive src glob)
  compile ours. Never both — same-name core objects collide (core LGFXDisplay).
- 1.17 ESP32Board.cpp includes <target.h>: hand the core lib scope the libdeps
  include paths it can't chain to (MicroNMEA everywhere, SensorLib on pagers).
- CustomLR1121Wrapper: setRxBoostedGainMode void->bool (1.17 base).
- IDF: fetch-deps.sh gains durable vendor-time patches (ESP32Board minimal
  deep-sleep — no target.h on IDF; SerialBLEInterface esp-nimble-cpp 2.x port
  incl. esp_mac.h). helpers/ethernet/ excluded in both meshcore CMakeLists.
- platformio.ini pins point at a LOCAL test tag (mc117-clean#core-v1.17.0-test);
  swap to the real core-v1.17.0 before merging to main.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 16:13:09 +02:00
Kaj SchittecatandClaude Fable 5 e33bd41f40 touch: hu v9 — swap the one glyph the fonts lack (U+201E low quote)
Audited every non-ASCII codepoint in the v9 Hungarian file against the
extras-font ranges: full coverage (incl. Hungarian ő/ű, Latin Extended-A)
except a single „ low opening quote used once — swapped for the covered “
rather than regenerating three fonts for one glyph. Add U+201E to the
extras --symbols on the next font regen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 15:20:14 +02:00
Kaj SchittecatandClaude Fable 5 785a2df4e2 touch: Hungarian translation update v9 (pisti87) + lang store no longer downgrades (#247, #232)
hu.lang: 43 improved translations + 21 newly covered strings from pisti87,
applied as ver 9; builtin table regenerated.

Lang store (#247): the update check treated ANY version difference as
'update available' — a side-loaded NEWER file than the catalog got
DOWNGRADED on Update. Now numeric: offer only when the catalog is newer
(non-numeric versions keep the old inequality).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 15:14:48 +02:00
Kaj SchittecatandClaude Fable 5 548ab46402 touch: Discover rows show distance when both positions are known (#239)
The DISCOVER_RESP wire format carries no position, so distance is shown when
the node is also a contact with a known advert position AND we have a GPS
fix — formatted with the existing km/miles badge. Rows without both fixes
are unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 15:06:23 +02:00
Kaj SchittecatandClaude Fable 5 6fe4ee52b2 touch: æ/Æ in the long-press accent picker — Danish/Norwegian (#237)
ø/Ø and å/Å were already in the o/a accent sets; æ was the missing third.
Long-press a/A now offers it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 15:02:31 +02:00
Kaj SchittecatandClaude Fable 5 8ffbf8c5f5 touch: Files app shows file timestamps (#185) + favorites survive contact eviction (#178)
#185: file rows in the Files app now append the modified time (dd Mon HH:MM)
when the filesystem provides a sane one (FAT 1980-epoch / clockless writes
are omitted rather than shown as garbage).

#178: the core's overwrite-oldest eviction already skips contacts with flags
bit 0 set — but the device-side favorite star lived only in TouchPrefs,
invisible to the core, so a starred contact was still evictable when the
table filled. The star toggle now mirrors into the contact table's flags
(uiSetContactFavorite), and a one-shot boot sync stamps the flag for
contacts starred before this fix.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 15:00:01 +02:00
Kaj SchittecatandClaude Fable 5 22e99e1854 touch: P4 port doc — correct the TFT backlight description (#242)
The doc claimed the HI8561 TFT's backlight is panel-internal (DCS 0x51 only);
in reality it's a real LED on GPIO 51 driven by LEDC PWM, which the code has
done since ~beta_53. Stale doc line flagged by bmorcelli.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 14:49:47 +02:00
Kaj SchittecatandClaude Fable 5 e32dc83553 touch: visible on-screen error when the LoRa radio fails init (#244)
A dead or absent LoRa module halted boot behind the frozen logo with the only
clue on serial. Retry init once (transient SPI/reset flakes), then paint the
failure on the panel — 'LoRa radio not detected / wadamesh needs the LoRa
module' — before halting, so users aren't left staring at the wordmark.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 14:48:00 +02:00
Kaj SchittecatandClaude Fable 5 2a0ba3f188 touch: retried messages appear in the open chat immediately (#248)
The composer's send button calls composerSend() and then refreshes the open
detail itself. The two programmatic resend paths (long-press menu Resend and
the failed-bubble one-tap retry) called composerSend() without the refresh,
so the new bubble only appeared once something else redrew the thread.
Mirror the send button: refresh the open dm/ch detail + dirty the thread
list after a successful resend.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 14:44:23 +02:00
Kaj SchittecatandClaude Fable 5 f5fce43707 touch: prefs same-value writes are a no-op — stop gratuitous snapshot bursts (#246)
Boot-time normalize/repair setters re-put unchanged values every boot; each
one dirtied the shared file cache and bought a full touch.kv A/B snapshot.
On the Pager's internal SPIFFS that is a 0.7-1.5 s flash burst that stalls
both cores (flash-cache suspend -> the reported ui:lvgl/ui:gps stalls) and
widens the interrupted-write window that can drop a user's saved change.
Same-value puts now return success without dirtying, in both the file-mode
and legacy paths. The storage:SPIFFS-despite-SD half of #246 (profile
demotion on upgrade) was fixed separately by #206's 4778347.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 14:40:26 +02:00
Kaj 8cd6d9b52e Merge pull request #235 from PixPMusic/pixpmusic/tpager-lockscreen-brand
fix(tpager): update lock-screen branding
2026-08-09 14:32:16 +02:00
Kaj ec2f941851 Merge pull request #210 from PixPMusic/pixpmusic/tpager-wifi-ble-coexistence
fix(tpager): stabilize Wi-Fi and BLE coexistence
2026-08-09 14:31:00 +02:00
Kaj 08cf95e509 Merge pull request #221 from PixPMusic/pixpmusic/tpager-sd-map-tiles-v6
fix(tpager): persist and safely switch the SD map-tile source
2026-08-09 14:23:06 +02:00
Kaj 1786956b28 Merge pull request #206 from PixPMusic/pixpmusic/tpager-sd-arbitration
fix(tpager): arbitrate shared SPI SD lifecycle
2026-08-09 14:11:21 +02:00
Pixel Perfect 8cceda408a fix(tpager): preserve BLE bonds across Wi-Fi handoff 2026-08-05 17:56:11 -07:00