Commit Graph
1231 Commits
Author SHA1 Message Date
Michael A. CojocariandClaude Opus 5.5 dbecef0b6f feat(crowpanel-35): add Elecrow CrowPanel 3.5" (ESP32-S3, ILI9488 + GT911) touch target
- New crowpanel_35 variant: display, SD, board and target files, plus board JSON
- Portrait mode is drawn rotated 180°; landscape stays at rotation 3
- Share the GT911 touch driver between Wio Tracker L2 and CrowPanel
  (WioTrackerL2Touch.cpp -> src/helpers/input/LgfxGt911Touch.cpp)
- platformio envs, flasher/site entries, release and merge-bin support
- Tests for the CrowPanel SD codec and merge-bin

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132MkJ7RUV32mV9F7o4PJMm
2026-10-02 20:16:06 -04:00
Michael A. CojocariandClaude Opus 5.5 f7402e628c fix(tdisplay-p4): Pick colour button no longer runs into the accent swatch
The P4's larger UI scale grew the button over the swatch, which sat at a fixed
x. On the P4 the button is narrower and the swatch sits a gap past its end, in
every orientation. Other boards are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 14:32:37 -04:00
Michael A. CojocariandClaude Opus 5.5 1cad071bd0 fix(ui): opening a chat no longer pops up the on-screen keyboard
On touch boards without a built-in keyboard, opening a chat focused the
composer and that focus raised the on-screen keys, covering the conversation.
The focus now only binds the composer (cursor shown, a Bluetooth, clip-on or
CardKB keyboard types straight in); tapping the composer brings the keys up.
T-Deck, T-Deck Pro and M9 are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 14:32:37 -04:00
Michael A. CojocariandClaude Opus 5.5 3378df5494 feat(tdisplay-p4): clipping the keyboard on in portrait offers a landscape restart
When the keyboard expansion arrives while the UI is portrait, a dialog counts
down 15 s and then saves landscape and restarts (the Settings orientation
switch's path); "Reboot Now" does it at once. Cancel, or taking the keyboard
off again, keeps portrait. A keyboard already attached at boot is not an
arrival, so a Cancel is not asked again on every start, and nothing is offered
under the lock screen. showConfirm() gains confirmSetMessage() to update the
open dialog's text in place.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012GRWzzRs7oRvFRNcHUZF4c
2026-10-01 11:31:27 -04:00
Michael A. CojocariandClaude Opus 5.5 b078df52e9 feat(ui): lock screen shows the battery, laid out for every panel; P4 BOOT button locks
Lock screen (all boards, #579): the default view is now drawn from parts
instead of the old 320x240 bitmap with the padlock and wordmark baked in,
which cover-scaled into a jumble on any other panel shape. WADAMESH sits at
the top, the clock below it (clear of the status bar), a smaller padlock in
the centre with the unread count to its left and a new battery readout to its
right, each centred between the padlock and the screen edge. Short panels get
a smaller wordmark and padlock. The clock's burn-in drift now moves around its
new place instead of snapping it back to y=30 every minute. T-Deck Pro keeps
its black-on-white e-paper colours; custom wallpapers are unchanged.

T-Display P4: the BOOT button (GPIO35) now works like the Wio Tracker L2's
wake button -- a press wakes or lights the lock screen, a 2 s hold locks or
unlocks -- so the P4 gets the lock screen and the "Lock when screen off"
setting. It gets no Power-off row: GPIO35 cannot wake the P4 from deep sleep.

Also: the chat list's per-row gear clears the list scrollbar on large panels.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 20:54:15 -04:00
Michael A. CojocariandClaude Opus 5.5 ad91b1cb3f feat(tdisplay-p4): clip-on keyboard expansion, plus keyboard and layout fixes
The T-Display P4 keyboard expansion (TCA8418 + its own XL9555, ported from
camillia-mt) now works. It is looked for every 1.5 s, so it can be clipped on
or off while running, and is routed like the CardKB and Bluetooth keyboards:
it types into the focused field and keeps the on-screen keyboard down. The
external-keyboard routing was gated on Bluetooth, which the P4 lacks, so it
now follows a new CAP_EXT_KEYBOARD; the Bluetooth-only parts stay on
CAP_BLE_KEYBOARD.

- Keys: Shift/Sym/Alt one-shot, Caps Lock lights the expansion LEDs, arrows
  and Backspace repeat, Alt+Backspace backs out, F1-F5 open the tabs left to
  right, and F11 steps the keyboard light through off/low/medium/high (saved
  across reboots).
- Wire1 is shared with the ES8311 codec on other pins; P4I2c1 switches it
  under a lock, and the codec's lazy bring-up now goes through it.
- With the keyboard attached the tab bar labels F1-F5 beside each icon, and
  Enter on a chat bubble opens its action menu.

Also, on any keyboard build, Enter runs the command in the terminal and the
repeater admin console (the admin console's Enter hook sat on its Send button,
where nothing raised it). And on the P4: the status-bar name shrinks to fit the
bar, the Discover buttons are spaced out, contact names clear their icon in
landscape, and leaving an app returns the focus to its tile in the app drawer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 20:10:12 -04:00
Michael A. CojocariandClaude Opus 5.5 d6bc169017 fix(ui): Map side buttons show which one is selected (#576)
The keyboard/trackball cursor is a 3 px accent outline, and on an accent
fill it disappears. setSelectionGlow already swaps to the contrast
outline (white, black on Day) there, but only for a fully opaque fill;
the Map's side buttons are accent at 70% over the tiles, so they kept
the accent outline and the selected one barely stood out. Any fill that
is at least half accent now takes the contrast outline.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 20:20:18 -04:00
Michael A. Cojocari 500b24e38c feat(tdisplay-p4): support LR2021 radio variants (#504) 2026-09-26 21:59:58 -04:00
Michael A. CojocariandClaude Opus 5.5 b408487dec fix(ui): tapping the accent popup after its text box closed crashed (#574)
The accent popup keeps a pointer to the text box it edits, and about 25
separate paths close the popup by hand. A path that deleted the text
box without closing it (e.g. a form closing after its send) left the
popup on screen pointing at freed memory; tapping an accent letter then
ran lv_textarea_del_char on it. That is the beta_85 T-Deck crash in
#574 (loopTask LoadProhibited at 0x3, accentBoxCellCb ->
lv_textarea_del_char), matched against the release image.

Tie the popup to its text box with an LV_EVENT_DELETE hook that clears
the pointer and hides the popup (hide only: in a layer clean the popup
may be deleted in the same pass). The cell handler also checks the text
box is still valid, and accentBoxHide no longer deletes a popup that
something else already removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 19:41:48 -04:00
Michael A. CojocariandClaude Opus 5.5 edf465ab19 fix(tdisplay-p4): Spectrum peak readout no longer overlaps the RBW/span line
The right-aligned peak readout shares the RBW/span line, and on the
narrow portrait panel it ran over that text. In portrait the RBW/span
line, chart and waterfall start one text line lower; the peak stays put
and the tall panel has the room. Landscape, the T-Deck Pro (peak on its
own line already) and the other boards are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 20:57:49 -04:00
Michael A. CojocariandClaude Opus 5.5 df18b3bf56 fix(tdisplay-p4): Send advert starts under the status bar; stacked buttons in portrait
The page offset its content by a second STATUSBAR_H to clear the tall
status bar's lower row, which overlaps the page on square panels. The
round panel's bar is already its full two rows and never doubles, so on
the P4 that only left an empty band above the Home button, in both
orientations. Start 8 px below the bar there instead.

In portrait, Flood and Zero-hop stack as two full-width buttons instead
of sharing a cramped row. Landscape and the other boards are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 20:57:49 -04:00
Michael A. CojocariandClaude Opus 5.5 f3ee043b5a fix(tdisplay-p4): contact action sheet is one column in portrait
The sheet's two-column grid of half-width buttons cut most labels off
with "..." on the narrow portrait panel. In portrait every action gets
its own full-width row; the card grows to fit and its body scrolls past
the screen height like any tall sheet. Delete stays the red bottom row.
Landscape and the other boards keep the grid.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 20:57:49 -04:00
Michael A. CojocariandClaude Opus 5.5 d902cc8153 fix(tdisplay-p4): composer buttons one size, centred on the text box
The P4 is a large-screen board, so its quick-reply/emoji chips were
56 px against a 34x30 send button, all pinned to the composer's bottom
edge, where the landscape row sat under the panel's bottom corner arcs.

All three buttons are now 45 px (the average) in both orientations and
vertically centred on the text box, re-centred as it grows. That lifts
them ~9 px off the screen edge, with a floor matching the status bar's
top-corner clearance. In landscape the quick-reply button also moves
16 px in from the bottom-left corner. Replaces the 32 px the portrait
two-row change assumed from the small boards' sizes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 19:43:49 -04:00
Michael A. CojocariandClaude Opus 5.5 d217b33667 fix(ui): leaving an unedited Profile field no longer says it saved (#570)
Node name and advert location save on blur, and every blur saved and
showed "Name saved" / "Position saved", edited or not. On the M9 (no
touch) moving focus past a field with the d-pad is a blur, so the
alert flashed for each field crossed.

On blur, skip the save and the alert when the field still holds what
it was filled with: the name with missing glyphs replaced, the
position as "%.6f". An edit still saves and says so. This also stops a
bare blur writing the glyph-replaced display form over the real name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 14:22:39 -04:00
Michael A. CojocariandClaude Opus 5.5 d9794dc8bf feat(terminal): add and delete channels from the terminal
chan add <name> [key], chan add #tag, chan del <slot|name> and
chan key <slot|name>, in the on-device console and remote terminal.
They reuse the Channels screen's save and delete paths, so the chats
list updates at once. No rename: chat threads are matched to channels
by name, and the Channels screen has no rename for the same reason.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 12:17:49 -04:00
Michael A. CojocariandClaude Opus 5.5 e6b89ffc61 fix(ui): at-a-glance title and message centred, with a gap between them
The channel/sender line was pinned at y=30 and the message at y=60,
so a title taller than 30 px (larger UI-size presets, bigger panels)
was drawn over the message, and the rest of a tall screen stayed empty.
Centre both horizontally and centre the pair vertically with 16 px
between them; the message box takes the height its text needs, capped
to what fits and cut at a whole line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 12:17:49 -04:00
Michael A. CojocariandClaude Opus 5.5 594c6b12a3 fix(tdisplay-p4): contact names clear of their type icon in portrait
The name started a fixed 24 px after the icon, but the antenna and room
glyphs are wider than the person glyph and all three grow with the
UI-size preset, so some names touched their icon. Start the name 8 px
past the widest of the three, never closer than before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 12:17:49 -04:00
Michael A. CojocariandClaude Opus 5.5 85296b07a7 fix(tdisplay-p4): composer send button clear of the corner; two rows in portrait
The send button sat at the composer's bottom-right, under the panel's
rounded corner. Pull it in by the same 16 px safe-area the tab bar
uses, and narrow the text box to match.

Portrait: the single row (QR | emoji | text | send) was crunched on the
284-px panel. Split it into two rows: quick-reply and emoji
right-aligned on top, text and send below. All three buttons are 32 px,
midway between the old 30-px chips and the 34-px send button.
Landscape keeps the single row, and chatComposerApplyRows re-lays it
out when the keyboard's rotate button flips orientation with a chat
open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 12:17:49 -04:00
Michael A. CojocariandClaude Opus 5.5 94ac4beccf fix(lua): ui.input text box takes typing on keyboard boards (#571)
While a Lua app was open, every physical-keyboard key went to the app,
and luaAppKey always claims the key, including while the app's own
wada.ui.input prompt was open. The prompt's text box never received a
character on the T-Deck, Pager, M9 or Attaky, or from a Bluetooth
keyboard (reported with Wardrive's "Name this run").

Don't forward keys to the app while that prompt is open, in
handleHwKey and both bleKbdDispatch paths; they then type into the
bound text box like any other prompt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 12:17:49 -04:00
Claude e1f6c75091 docs(tdisplay-p4): full-reset restarts, landscape touch and the landscape Cmdr layout
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FbY4FsGuX2fNDpNttB6a7R
2026-09-25 01:28:50 +00:00
Claude 6c6600add1 Merge remote-tracking branch 'origin/main' into fix/touch-ui-followups
# Conflicts:
#	variants/tdisplay_p4/target.cpp
2026-09-25 01:17:45 +00:00
Claude 81f5de8ef8 T-Display P4: nav bar taps land where they are made in landscape
In landscape the P4's tab bar barely responded to taps, while swipes between
tabs still worked.

P4 landscape is LVGL software rotation, and LVGL 8 rotates pointer input for a
rotated display itself (indev_pointer_proc): it expects points in the
unrotated panel frame. The touch driver was also mapping points to landscape
(heltecV4CapTouchSetPointRotation), on the belief that LVGL does not, so every
point was rotated twice. In ROT_90, the rotation the Orientation button picks,
a tap at (X, Y) reached LVGL at (615 - Y, X): a tap on the bar at the bottom
landed in the middle of the screen or below it, and never on a tab button.
Swipes were unaffected because the driver detects them in its own mapped
coordinates.

The driver keeps its landscape mapping, which its swipe detection and the
direct readers (tab-bar guard, remote-mode hold) need. lvglTouchRead now
converts the point back to the panel frame before giving it to LVGL, keyed on
the driver's rotation, so the chat keyboard's rotate trick on a portrait UI
(LVGL rotated, driver not) passes through unchanged. Also corrects the comment
in UITask::begin that said LVGL does not rotate input.

Not built or tested on hardware.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FbY4FsGuX2fNDpNttB6a7R
2026-09-25 01:13:46 +00:00
Claude 14e78aeaa7 T-Display P4: lay out the landscape Cmdr screen like the Wio Tracker L2
In landscape the P4 home screen mixed its portrait column-flow layout with the
landscape right-hand button column: the TX/RX chart ran full width underneath
the buttons, and the info card was placed below the portrait launcher grid,
off the bottom of the 284-px-tall screen.

Landscape now follows the Wio Tracker L2's arrangement: status lines and a
chart sized to the remaining height on the left, clear of a right-hand column
of Advert / Terminal / Apps / Control spread evenly down the content height
(6-px gaps, each 22..46 px). The info card is portrait-only; its eight rows do
not fit landscape. The height is taken from the measured tab, since the
round-corner status bar leaves less than tabContentH() reports. Portrait is
unchanged.

Not built or tested on hardware.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FbY4FsGuX2fNDpNttB6a7R
2026-09-25 01:09:31 +00:00
Claude 1501394fe5 T-Display P4: a settings reboot no longer leaves the screen off
After a setting that reboots (theme, rotation, language, remote mode...) the
P4 came back with the panel dark, and only a second reboot brought it back.

esp_restart() on the ESP32-P4 is a CPU reset: esp_system_reset_modules_on_exit()
resets DMA, UARTs, SDMMC and crypto, but not the MIPI-DSI host or its DPI path.
The display driver then initialises over a host still half-configured from the
previous session and the panel stays dark. A full chip reset always recovers it.

So every software restart now becomes a full system reset: a shutdown handler,
installed first thing in app_main so it runs last, arms the RTC watchdog with
RESET_SYSTEM. Being a shutdown handler it covers rebootDevice(), OTA, the
console and factory reset without touching any of them. Same fix as
camillia-mt's T-Display P4 port.

Those restarts now arrive as ESP_RST_WDT, so an RTC_NOINIT marker records that
the restart was deliberate, and the crash-report prompt and Settings -> About
read the reset reason through bootResetReason(), which reports ESP_RST_SW for
them. Otherwise a lingering coredump would re-prompt "restarted after a crash"
on every settings reboot.

Not built here (no ESP-IDF toolchain in this environment); needs a P4 build and
an on-device check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FbY4FsGuX2fNDpNttB6a7R
2026-09-25 01:08:59 +00:00
Michael A. CojocariandClaude Opus 5.5 1c3576e1d6 fix(tdisplay-p4): GPS the camillia-mt way, 9600 start with baud probing
camillia-mt's working T-Display P4 GPS wakes the L76K through the XL9535
before opening UART1 on RX 22 / TX 23, starts at 9600 and probes other
rates until valid NMEA arrives. Wake and pins already match here; the
difference was the rate. The P4 used the core MicroNMEALocationProvider
locked to one rate (115200), so a receiver at any other rate gave an
open but silent UART.

Build the P4's provider as WadaNmeaLocationProvider with UART probing
(already on main via PR #517, used by the T-Deck Pro), starting at 9600:
it walks 9600/19200/38400/57600/115200 until a checksummed sentence
arrives and saves the working rate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 8f97db532c feat(tdisplay-p4): cold-boot clock sync over saved Wi-Fi
The "Sync time from saved Wi-Fi after cold boot" option (#383) existed
only on the T-Deck and ThinkNode M9. The P4's PCF8563 has come back with
impossible dates too, so enable it there: the Settings > Clock switches
(CAP_BOOT_TIME_SYNC), the runtime gate in BootTimeSync.cpp, and a call
in the P4's own startup at the same point the S3 main.cpp uses, before
the TCP/WS/BLE transports start.

Esp-hosted builds only: the sync drives Arduino's real WiFi, which the
legacy ESP-AT build must never touch. As elsewhere it is opt-in, runs
only after a true power-on, and skips when the RTC already gave a
trustworthy time or Wi-Fi is on anyway.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 e469993295 fix(ui): keep the screen-timeout slider inside the settings page
The track started 4 px in at 96% width, but the knob overhangs each end
by its 6 px padding plus half the track height, so at the lowest setting
it was drawn past the left edge. Inset the track by that overhang on both
sides of the content width.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 4aafab4b1c feat(web): paste text into the device from the browser (VNC / Remote UI)
The mirror page only forwarded key presses: its key handler skips
anything with Ctrl/Cmd held, so Ctrl+V / Cmd+V did nothing, and a paste
into the hidden input phones use was discarded. Catch the document
'paste' event and type the clipboard text into the device's focused
field, and add a Paste button (a prompt box) for phones, where a
plain-HTTP page cannot read the clipboard from script.

Pasted text goes out in batches of 16 keys every 80 ms so the device's
256-entry key ring is never overrun; line breaks become spaces so a
multi-line paste cannot press Enter and send a half-typed message;
characters outside the BMP are dropped (keys are 16-bit). Same page on
every board.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 005e4ff5a6 fix(tdisplay-p4): show the real web UI port (8765) on esp-hosted builds
WEB_UI_PORT_STR was 5000 on every P4 build, from the ESP-AT days when the
single AT listener shared the companion port. The esp-hosted build serves
the web UI on WS_PORT (8765) like the other boards, so the VNC, Remote,
Files, terminal and remote-placeholder addresses pointed at the wrong
port. Keep 5000 only for WADA_P4_LEGACY_AT builds; other boards were
already correct.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 36f96e0b7c fix(ui): smaller "Enable web access" label and address on the VNC page
The switch label drops from the 14 px to the 12 px body font and the
browser address from 16 px to 14 px, so both fit comfortably.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 0bff47286c fix(ui): Join private channel form sits just above the keyboard
The form hugged the header and left most of the tall page empty, so on
on-screen-keyboard boards start it where its Join button ends just above
the keyboard's top edge (keyboard height as kbApplyLayoutForRotation sets
it: CHAT_KB_H portrait, half the screen landscape). Physical-keyboard
boards, and screens without the spare room, keep the old layout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 7e39b7c853 fix(ui): shorter Add channel options in a smaller font
"Create a private channel" / "Join a private channel" / "Join the public
channel" / "Join a hashtag channel" become "Create private channel",
"Join private channel", "Join Public channel" and "Join # channel", in
the body font a step below the title. The first two reuse existing
translated strings; the other two fall back to English until translated.
The labels were also wrapped in TR() twice; now translated once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 dfc44b9d11 fix(ui): fit the Power menu's Download mode label
"Download mode (wait for USB flash)" ran past its button. Use the smaller
font for that button and wrap it inside the button, centred on two lines.
The text (and its translations) is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 164c6d05d2 fix(backup): exported settings were invalid JSON
396e818 added rx_delay_base, buzzer_quiet, client_repeat, ble_pin and
gps_fuzz_m after the "region_scope": " opening quote had already been
printed, so they landed inside that string and every backup exported
since then failed to import ("bad/unreadable JSON"). Print region_scope
last, opened and closed in one place. Backups made with the broken build
must be exported again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 5cdbf96cff fix(ui): smaller text and more room above stacked confirm buttons
In the stacked (portrait) confirmation dialog, e.g. the backup Import
prompt, the multi-line message sat hard against the buttons. Use the
smaller body font there and widen the message-to-buttons gap; the card
height follows. Landscape dialogs are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 1467184d79 fix(ui): tighter Cmdr info panel; round-panel breadcrumb and status row
Cmdr: the info panel's values column started at a fixed SC(100), leaving
a wide gap after short labels like "Node". Size it from the labels' real
width and draw a thin divider between the two columns.

Round-cornered status bar (T-Display P4):
- The settings/tool breadcrumb moves from row 1 to row 2 so its top is
  level with the battery readout, at row 2's text size instead of the
  tall bar's larger one, and is capped (with an ellipsis) short of the
  status icons it now shares the row with.
- The signal/SD/Wi-Fi/BLE icons start after the widest the battery
  percentage can get ("100%" in its font) instead of a fixed 64 px, so
  they no longer cover it; the charging close-up keeps its old position.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 237a33e68e feat(backup): include screen and app preferences in settings backups
The backup carried node settings but none of the touch UI's own
preferences. Add an "app_settings" block: the active Wi-Fi connection
(SSID, password, radio/BLE switches) and every touch preference key as
["key","type","value"] triples: the packed cfg blob (display, theme,
keyboard, map, UI scale, notifications, advert timers...), sound and
DND settings, tile server, lock wallpaper, notification sounds, quick
replies, channel scopes, favourites, ignore lists, channel mute and
emoji, repeater passwords, the last radio preset and saved Wi-Fi
networks.

Import restores them as section bit 0x20 (the UI's Import now applies
it). Only keys and types this build writes itself are accepted. The cfg
blob is merged field by field and keeps what belongs to the unit:
battery calibration, GPS baud, clock floor, FEM/antenna, the paired BLE
keyboard, remote/console boot modes and beta-report counters. Storage
choice, the setup flag and the discovered-nodes cache are not exported.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 b00deeffd3 fix(ui,backup): 2x2 location-privacy buttons; export the remaining settings
GPS screen: the four location-privacy accuracy buttons sat in one row and
were too narrow for their labels. Lay them out two columns by two rows.

Backup export: the wadamesh_settings block now also carries the
location-privacy radius, BLE pairing PIN, RX delay, buzzer quiet and
client repeat, and import restores them with range checks (the radius
only to the values the UI offers, the PIN to six digits). Every other
NodePrefs field was already exported; identity, radio, position,
channels and contacts are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 b60c26ac85 feat(tdisplay-p4): esp-hosted C6 backend for Wi-Fi
Current T-Display P4 V1 units ship the C6 with esp-hosted firmware
(2.12.3), and main's P4 build only spoke ESP-AT, so Wi-Fi could not come
up on them at all. This is a one-time import of the esp-hosted backend

- TDP4_C6_HOSTED build switch (default hosted; WADA_P4_LEGACY_AT=1 keeps
  the ESP-AT path for older units), with the ESP-AT socket/WiFi facades
  and the single-listener TCP router guarded to the legacy build.
- tdisplay_p4: build.sh hosted patches and fullclean handling,
  idf_component.yml esp-hosted pin, sdkconfig, main.cpp hosted bring-up
  and SNTP, c6_at updates, and the C6 reset hook in target.cpp.
- P4 Wi-Fi scan wait in UITask.
- TDISPLAY_P4_C6_FIRMWARE_PLAN.md.

Not imported from that commit: UI-scale default, GPS log lines, UI

build-upload-monitor.sh: run build.sh's own fullclean for the P4 (idf.py
fullclean rejects the patched managed components).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:50 -04:00
Michael A. CojocariandClaude Opus 5.5 4d86f66c39 fix(tdisplay-p4): draw the Remote UI placeholder on the physical panel
In Remote UI mode the UI renders off-screen for the browser and the
physical panel shows a status placeholder drawn through the
DisplayDriver API. On the P4 every fill/text call was an empty stub, and
writePixelsRGB565 takes half-resolution LVGL coordinates and upscales
2x, so only the logo appeared, twice as big and pushed towards the top
right, over whatever was on screen before.

Add P4PanelPainter: native-resolution fills, rectangles and text for
both P4 panels (RM69A10 AMOLED, HI8561 LCD), rasterising LVGL's
Montserrat fonts at the UI's 2x scale, written through a new
non-upscaling writeNativeRGB565. Give the placeholder a layout for the
tall portrait panel: logo, title, browser address or Wi-Fi status, and
the touch-and-hold exit hint, matching the other builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:04 -04:00
Michael A. CojocariandClaude Opus 5.5 b932c13e34 fix(ui): stack confirm-dialog buttons in portrait
The shared confirmation dialog placed a fixed-width Cancel and OK side by
side, and on portrait panels they overran each other (reported on the
backup Import prompt). In portrait, or whenever the card is too narrow
for both, stack them full width with OK above Cancel, and grow the card
to fit. Landscape layouts are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:04 -04:00
Michael A. CojocariandClaude Opus 5.5 485436daa2 fix(ui): centre the onboarding welcome message and buttons
The first setup step pinned "Let's set up your device" under the title and
its Skip / Get Started buttons to the bottom edge, leaving a large empty
gap on tall panels like the T-Display P4. Lay them out as one block in the
middle of the screen with centred text, clamped so it never overlaps the
title or drops below the old bottom-edge position on short panels.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:04 -04:00
Michael A. CojocariandClaude Opus 5.5 ed9a49c506 scripts: T-Display P4 targets in build-upload-monitor and build-all
build-upload-monitor.sh gains --tdisplay-p4 (AMOLED) and
--tdisplay-p4-lcd (HI8561 LCD SKU). The P4 is an ESP-IDF app, so these
drive tdisplay_p4/build.sh (build/flash/monitor, --erase, --fullclean,
PORT= for the serial port) instead of pio; both appear in the interactive
menu and the --just-build sweep, which skips them when ESP-IDF is absent.
PlatformIO is only required when a PlatformIO board is chosen.

build-all-targets.sh also builds the LCD SKU. Both SKUs share
build/tdisplay_p4 and WADA_P4_LCD is read only at configure time, so each
P4 build reconfigures first; before this, the AMOLED entry rebuilt
whichever panel had been configured last.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:04 -04:00
Claude d2ee8cea5f fix(ui): Mentions breadcrumb on the left like every other screen
The Mentions screen drew its own header with the back chevron at the top
right, the only screen whose back breadcrumb was on the right. Use the
shared app-page chrome instead (appPageBegin/appPageEnd, as Send advert,
Spectrum and the settings pages do): "‹ @ Mentions" on the left of the
status bar, tap to go back. The list starts below the tall bar on square
panels. Keeps the existing translated "@  Mentions" key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UBQtHzNKA9Q55ogrULN6JJ
2026-09-24 15:28:04 -04:00
Claude fc631be52c fix(tdisplay-p4): GPS baud, nav bar, map chrome, presets, export
- GPS: the P4 listened at 9600 (the L76K power-on default), but LilyGo's
  factory firmware leaves the receiver at 115200, so the UART opened and
  never parsed a sentence. Set GPS_BAUD_RATE=115200 for the P4. A GPS baud
  saved in Settings still overrides it.
- Nav bar: the active-tab bar assumed a full-width tab row. The P4's round
  corners inset the row by SB_INSET_X on each side, leaving the bar ~13 px
  off under the outer tabs. Measure the real button row instead; move the
  unread and update badges in by the same inset.
- Map: with no tiles rendered the canvas shows the COLOR_FIELD
  placeholder, but the chrome followed only the night setting (except on
  the Wio Tracker L2). Pick the chrome colour from the placeholder's
  brightness on every board, and refresh it when tiles appear or vanish.
- Radio & mesh: picking a community preset only filled the fields and a
  dropdown never blurs a field, so nothing was saved; leaving the screen
  lost it. Apply on pick. Also remember the picked preset by label, since
  several presets share identical parameters and the first match
  (e.g. EU/UK instead of Switzerland) was shown on return.
- Export: add a wadamesh_settings block with airtime factor, region
  scope, auto-add rules, advert/telemetry policy, multi-ACKs, GPS and
  RX boosted gain, and restore it on import. The stock-app fields keep
  their exact shape.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 15:28:04 -04:00
Michael A. Cojocari 2fde038f08 fix(m9): streamline mark-all-read action
Closes #569\n\nCo-Authored-By: GitHub Copilot <noreply@github.com>
2026-09-24 15:16:09 -04:00
Michael A. Cojocari a3090aebbe fix(tdeck-pro): split v1.0 and v1.1 targets 2026-09-23 16:43:29 -04:00
Michael A. Cojocari 98dd4dadea fix(m9): preserve locked drawer through shortcuts
Keep the app-drawer Home root open beneath Messages, Map, Mentions, and Advert function-key navigation while still dismissing overlays and respecting blocker dialogs.

Fixes #564
2026-09-23 10:34:28 -04:00
Michael A. Cojocari a8067c921b fix(tdeck-pro): separate compact chat messages
Measure the same vertical padding that compact rows render and increase the blank gap between separate messages without changing wrapped-line spacing.

Fixes #563
2026-09-23 10:23:59 -04:00
Michael A. Cojocari 31a6a9798e fix(tdeck-pro): make console readable on e-paper
Use white paper and black ink from the first boot frame, commit sprite-backed input updates, and keep the e-paper cursor solid.

Fixes #562
2026-09-23 10:23:45 -04:00