Commit Graph
4614 Commits
Author SHA1 Message Date
JakubandClaude Opus 5.5 b0e24bb076 feat(eink): landscape and portrait builds, 8x13 font in landscape
The L1 e-ink solo build splits in two, one per screen shape, so each
screen can be laid out for a single shape. Settings > Rotation now only
turns the screen upside down, and the joystick turns with it.

Landscape writes in misc-fixed 8x13 at the panel's own resolution
(EINK_LARGE_FONT); portrait keeps the 6x9. All drawing moves into
EinkGfxDisplay, which the panel driver and the simulator share; the
FreeSans fonts and the CRC32 library go.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 19:24:36 +02:00
JakubandClaude Opus 5.5 a733b8bcf5 docs(solo): bring the docs up to date with the L1 refresh
- Home pages as they are now (Status, quick panels, Map page), the Status
  screen's tabs instead of Diagnostics / GPS / Sensors, lock clock Big /
  Compact and the hint on a key press, battery curve on L1 and L2, "+ Send"
  and a failed send, trail pin, vector map behind -D MAP_VECTOR.
- Developer guide: drawScreenHeader, soft frames, InfoKit, TabBar, a status
  bar without blinking, toast and millis() rules; ui-core status; build
  flags (GPS_SKYVIEW, MAP_VECTOR, HIST_ARCHIVE added, ui-tiny-only ones out).
- New simulator screenshots: the clock page and the Status page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 14:23:15 +02:00
JakubandClaude Opus 5.5 3631e0ab85 fix(l2): no Lock clock row in Settings
The Big / Compact lock look is ui-new's; the shared schema row did nothing
on the L2's slide-to-unlock card.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 14:23:15 +02:00
JakubandClaude Opus 5.5 687a31e657 refactor(ui): remove dead code and fix stale comments after the review
- ui-core: Diagnostics::systemLines, NearbyModel::typeShort,
  rptctl::currentPresetName, RoomSessions::pendingKey, settings::isSwitch,
  UiCore::reconcileDMUnread.
- ui-new: the retired Recent page, fmtAlt, the battMvToPercent wrapper,
  setFavouriteChannelSlot, AccordionList onHeader/visibleCount, drawBoxedIcon
  and seven unused icons; info::row folded into info::valueRow.
- ui-lvgl: onOpenNav, TileDownloader::withTrails; the trail header size is
  one constant (TRAIL_HDR) for live and saved trails.
- Home quick panels save prefs only when a value changed.
- Comments brought in line with the code (status bar reserve, settings rows,
  page order, SH1106 frame skip, UiCore header).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 13:49:26 +02:00
JakubandClaude Opus 5.5 096b8e2b1d feat(ui): drop echo toasts for actions the screen already shows
L1: Counters reset, Trail reset, Contact added/deleted, Logged in (admin),
Logged out, Channel deleted, Share target / Bot channel / Bot room set,
PIN set/cleared, Preset saved/deleted, and Unpinned on the favourites grid.
L2: Channel deleted, Counters reset, Region/Preset/Scope/Waypoint deleted,
Target cleared, Trail cleared, Message history deleted, Contact added/deleted.
Failures and Unpinned where the item leaves the screen stay.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 13:49:26 +02:00
JakubandClaude Opus 5.5 6cd081add1 fix(l1): wrap-safe UI timers, a failed send keeps the text, bars stop at the ends
- The redraw, alert, splash and sensor timers compare millis() wrap-safe
  (refreshDue(), alertShowing(); 0 = now / none), so the screen keeps
  refreshing past the 49.7-day rollover.
- A failed send leaves the keyboard with its text ("Not sent" in the field
  label, as alerts don't show over it) or the quick-message list with
  "Send failed", instead of dropping to Home. No "Sent" echo.
- The dashboard's Sats field shows "--" with the GPS off, not a stale count.
- Brightness and volume in Settings stop at both ends instead of wrapping.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 13:49:16 +02:00
JakubandClaude Opus 5.5 6ae0e73663 feat(l1): clock page and lock screen in the splash lettering
The Home clock page draws HH:MM in the boot splash's slanted digits, with a
seconds bar, a centred date and the clock fields as columns. The lock screen
keeps the status bar, puts the big clock under it and shows unread messages
in a pill; the unlock hint appears for a few seconds after a key press on the
lit screen (not the waking one). Settings > Display > Lock clock adds a
compact look: a small clock with the date beside it and the clock fields as
rows (NodePrefs lock_compact, schema 0xC0DE0033). 12-hour time sets AM / PM
beside the digits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:58:56 +02:00
JakubandClaude Opus 5.5 61c75946f6 feat(l2,core): battery curve editor and an L2 feedback round
- Battery curve: NodePrefs batt_curve_mv[11] (voltage at 0..100 %, all
  zeros = built-in LiPo curve, sentinel 0xC0DE0032). ui-core/Battery.h
  uses it for every percentage. L1: Settings > System > Batt curve list
  (Left/Right 10 mV, Reset); L2: Settings > Power > Battery curve chart
  with draggable points and a line at the cell's voltage.
- L2: the Nodes map is the full navigation map plus the nodes, Back
  returns to Nodes; the favourite button is lit while it is one; pinning
  to the Home dial uses a thumbtack (fonts regenerated); minimap dots
  follow the accent; arranging tiles shows where they land while dragging;
  emoji row in Diagnostics > Font.
- Sim hooks: sim_open nodesmap / accent@N / homeedit / battcurve.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:25:58 +02:00
JakubandClaude Opus 5.5 1166ea8dde fix(core): a flood DM's ACK folded into the return path reaches the UI
The base class matched an ACK carried in a PATH packet without going
through onAckRecv(), so the device UI's delivery marker never saw it and
kept resending the DM until a plain ACK arrived. MyMesh now passes it on
to the listener as well.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:25:58 +02:00
JakubandClaude Opus 5.5 0f635c0171 feat(l1): Home quick panels, map page with live data, quieter status bar
- Icon pages become quick panels: two or three rows (Settings, Messages,
  Bluetooth, Advert, Tools, Power) inset from the edges, the last one
  opening the full screen. Brightness and auto-advert are edited in place
  (Enter, Left/Right, Enter/Back saves once).
- Tools panel shows the two tools used last with their live state.
- Map page: preview on the left, GPS / trail / live / target on the right.
- Favourites as soft cards; Status tile with a battery spark line.
- Status bar without boxes or blinking; BT only when connected, GPS
  search glyph without a fix.
- Redrawn mini icons (advert waves, cog, wrench, messages); big hovering
  icons removed. Tools list is text only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 10:23:58 +02:00
JakubandClaude Opus 5.5 6d8e56fbd0 feat(l1): one title bar, page dots, disclosure marks and push buttons
drawScreenHeader replaces drawCenteredHeader on every ui-new screen: the
title in normal case, page dots instead of "TRAIL 1/3", the menu hint, no
icon (the screen was just picked by one). Accordions in Settings and Tools
show a disclosure triangle instead of +/-, Tools sections drop their icons.
Form "[Save]" rows and "+ Send" share drawButton; form fields use valueRow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 08:45:05 +02:00
JakubandClaude Opus 5.5 4ba171d6d8 feat(l1): one list row for settings and tool screens: values flush right, switches for on/off
InfoKit gains valueRow (value at the right edge, cut and scrolling when
selected), switchRow and listRow (exact ON/OFF becomes a switch). Settings,
Live Share, Locator, Repeater, Bot, Auto-Advert, alarm, GPIO and popup value
rows use them; units after a space, "Off" in title case, Trail summary as
blocks with a big distance and a points meter, "+ Send" as a soft pill.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 08:29:44 +02:00
JakubandClaude Opus 5.5 4d8724dcc5 feat(l1): Status page and screen replace Radio/GPS/Sensors pages and Diagnostics
Home's Radio, GPS and Sensors pages become one Status page: four tiles split
by dotted rules (radio, GPS, battery, nodes), each a headline over a detail.
Enter opens the Status screen, tabs Radio / GPS / Sky / Power / Mesh /
System, which also takes over Tools > Diagnostics and Tools > Satellites
(the sky plot now lives in SkyView.h). GPS on/off moves to Enter on its tab.

New InfoKit.h holds the shared pieces, sized from the font: label/value row
(a long value takes its own line), centred section title, meter, chip, big
number with unit, switch, history line (one sample a minute) and a block
flow that scrolls a tab by whole blocks.

The Status page keeps the old Radio bit and shows when any of the three old
pages did; the save format is unchanged. The L1 degree sign was a cp437
byte the UTF-8 renderer drew as a box; now U+00B0. The perf walk covers
every Home page and Status tab.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:51:47 +02:00
Huw DuddyandGitHub fad0ffb7f1 Merge pull request #3533 from oltaco/fix/bad-comment-format
Fix bad comment format
2026-10-02 07:46:36 +10:00
taco 0e1ba7102d tidy: remove old commented Bluefruit.autoConnLed(false) 2026-10-02 07:40:42 +10:00
taco 35e10a9c75 fix bad comment format 2026-10-02 07:35:34 +10:00
JakubandClaude Opus 5.5 061e5ba36b feat(l1): Home pages slide sideways, the page pill glides along
DisplayDriver gains slideBegin()/slideCompose(): the driver keeps the frame
on screen and, in the next one, moves it out while the new rows follow.
SH1106 does it on its 1 KB buffer (+1 KB RAM for the copy), the sim on its
canvas; drivers that can't read their frame back keep cutting over (e-ink).

Home slides the content below the page-icon row in 220 ms with an ease-out
(the whole screen to and from the header-less clock), and the current-page
pill glides between icons.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:08:40 +02:00
JakubandClaude Opus 5.5 608231ed6b feat(l1): L2 splash, hovering Home icons, soft selections, two-line DM bubbles
- Splash: the L2 wordmark and lettering, shared through ui-core/Lettering.h,
  rise in with loading dots under the version line (static frame on e-ink).
- Home: the header shows the time once the clock is set; icon pages carry
  only their title. One 32 px icon family (3 px strokes) bobs 2 px over a
  dithered blob shadow that shrinks as it rises; the unread badge rides on
  the Messages bubble; Bluetooth off is the icon at half density.
- Soft corners on every selection, the page pill, tabs and popups;
  dotted scrollbar track with a rounded thumb; the tab bar lays out whole
  tabs and shows edge arrows only in free space.
- DM bubbles drop the sender row and wrap to a second line, with the
  delivery mark and age closing it.
- Keyboards name what is typed (channel, contact, Password, Scope...)
  and show characters left near the limit; PIN entry has its own preview.
- Loading dots for waits (login, scan, GPS) and signal bars in place of
  raw RSSI in Nearby.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:59:44 +02:00
JakubandClaude Opus 5.5 1580de53f5 feat(l1): one soft-cornered frame for popups, alerts and bubbles; small screen fixes
DisplayDriver gets drawSoftRect / fillSoftRect / drawPanel (the unread badge's
corner knockout; a panel also clears a 1 px moat so lines below stop short of
its border). Used by alerts, popups, the accent picker, the lock hint, chat
bubbles and the send button.

Fixes: no "Msg:" toast for a message landing in the open thread; Nodes scan
text fits the screen; the PIN pad skips the blanks beside 0; Auto-Advert is a
plain value row; the Admin picker says what it needs when empty; the GPS page
shows "-" instead of 999 before a first fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:13:11 +02:00
JakubandClaude Opus 5.5 a6612ee2b0 perf(l1): -D UI_PERF_L1 walks the screens and reports draw time, heap and stacks
Opens each screen directly, types keys, and prints per step over USB: frames
drawn/sent, render and flush time (CPU cycle counter), heap used/free/largest
block, every task's stack headroom, and a screen dump. Measurement only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:01:53 +02:00
JakubandClaude Opus 5.5 0c739992bb perf(l1): OLED sends only the parts of the screen that changed
Each frame is hashed per 32-column block of each 8-px page and only changed
blocks go over I2C. A full frame was 1 KB / 31 ms on every change; a moved
selection, a scrolling name or a clock tick is now 1-8 ms. 128 B of hashes,
no frame copy; full sends stay for wake/clear and SPI panels.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:01:53 +02:00
JakubandClaude Opus 5.5 c8e1f4a604 perf(l2): long lists build only the rows on screen
New message, Nodes (and its Scan popup), Admin and Messages show their
items through one virtual list: a screenful of rows, handed to the next
item as one scrolls out, the scroll extent from the items' heights. 256
contacts: 522 objects and ~950 ms of filling in (frames up to 96 ms)
before, 19 objects at once now; a scrolled frame 28.5 -> 11.7 ms. Nodes
257 -> 49 objects. A new message rewrites Messages' rows in place
(46 -> 20 ms) instead of building the screen again; it's rebuilt only
when "Read all" comes or goes. A held row keeps what it shows until let
go. Perf tools: -D PERF_LISTS, -D PERF_LIST_MUL.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 20:56:14 +02:00
JakubandClaude Opus 5.5 71e3dd8a8b perf(l2): Nodes slides in smoothly, Diagnostics opens in half the time
Rows still to build wait while a screen slides in, so its frames aren't
a fill budget apart (Nodes: 12 frames of 24 ms instead of 7 of 33, up to
65). The crash dump in flash is read at boot, not on the first
Diagnostics (build 54 -> 20 ms). The perf tools time Nodes too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 20:56:14 +02:00
JakubandClaude Opus 5.5 0a07dc3deb perf(l2): screen sent by DMA while the next part is drawn
The panel takes each 24-line band by DMA while LVGL draws the next one
into the other buffer (two 15 KB buffers in internal RAM; LovyanGFX's
4092-byte DMA descriptors leave PSRAM unaligned for the S3's DMA, which
showed as shifted and smeared bands). LVGL draws in the panel's byte
order, and so do map tiles and the frozen screen under a popup, so
nothing is swapped on the way out. Full frames ~10-25% faster (page1
19.9 -> 14.7 ms, Home 21.4 -> 18.2 ms). Without the internal RAM the
screen is sent as before. The arduino2 env keeps the old way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 20:56:13 +02:00
Huw DuddyandGitHub ea0213754f Merge pull request #2838 from benskigomez/fix/gps-cold-start-detection
GPS: poll up to 5s for cold-start detection instead of a single 1s check
2026-10-01 23:52:16 +10:00
Huw DuddyandGitHub f35216799a Merge pull request #3128 from bplein/feature/ble_led_disable
Allow for build-time macro to disable the bluetooth LED
2026-10-01 23:51:04 +10:00
Huw DuddyandGitHub 1af2760c88 Merge pull request #3531 from meshcore-dev/revert-3411-patch-3
Revert "Fix Heltec Mesh Node T1 GNSS pins"
2026-10-01 22:19:32 +10:00
Huw DuddyandGitHub a706d1d943 Revert "Fix Heltec Mesh Node T1 GNSS pins" 2026-10-01 22:17:44 +10:00
Huw DuddyandGitHub 914143cb7e Merge pull request #3411 from Avamander/patch-3
Fix Heltec Mesh Node T1 GNSS pins
2026-10-01 20:31:38 +10:00
Huw DuddyandGitHub ce266c00e5 Merge pull request #2065 from robekl/fix-t1000e-sensor-power-pin
Fix T1000-E sensor power pin mapping
2026-10-01 20:04:07 +10:00
Huw DuddyandGitHub 2ce37ec8cc Merge branch 'dev' into fix-t1000e-sensor-power-pin 2026-10-01 19:57:50 +10:00
JakubandClaude Opus 5.5 ca5e66a4a1 feat(l2): tidier map overlays: activities top centre, credit + scale + zoom in one pill
Recording / live share and the download stack in a column at the top
centre, empty when nothing runs; the recording pill is plain text with
only its mark coloured (red stop, accent pause / live) -- all-red text
was hard to read over the map. The credit, scale bar and zoom share one
pill bottom left (a tap shows the credit). Every map pill is 22 px with
round ends.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 11:40:15 +02:00
JakubandClaude Opus 5.5 1125e9a13e perf(l2): choice popups open smoothly, switches never cut short by a rebuild
A popup over a still screen is frozen and dimmed as it opens, so the
panel's rise redraws only the panel: 6-8 frames of 19-25 ms instead of
3-4 of 45-65 ms. Picker options are one label each (time zone list
97 -> 52 ms to build). The bottom popup no longer animates a dim of 0.

Repeater updates its hint in place (130 ms rebuild gone); Auto power,
Imperial units and Relay on rebuild the screen after the knob has
moved (rebuildSoon). -D PERF_CONTROLS times every control on the
settings screens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 11:27:48 +02:00
JakubandClaude Opus 5.5 910a7c0197 fix(l2): map download no longer stalls on busy tile servers
A 404/503 answer (OpenTopoMap renders on demand) went to an immediate
2 s retry and counted as network loss, so each tile then waited up to
60 s. Answered errors now go straight to the retry list; long pauses
only when there is no answer at all. Three retry rounds (20/60/120 s)
for the tiles still missing, transfers cut after 30 s, failures logged
on serial.

Download popup tidied: title + floating close, percentage instead of
tile counts (also on the map pill), no dead zoom row, no finish toast
after Stop or while the popup shows the result.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 10:54:09 +02:00
JakubandClaude Opus 5.5 f77c7ea901 perf(l2): screens lay out in up to half the time: row widths known before the first layout
A group row's text column (and an info row's key) grows into what the
controls on its right leave, and LVGL lays out children before their
parent, so its labels were first measured 1 px wide; LVGL also works out a
new label's height at its old width (0) before the real one. Each height
that changed then took another pass up the screen: 4-6 passes per screen.

rowsFit(), run before a frame's layout (LV_EVENT_REFR_START) and by
layoutNow() in place of every explicit lv_obj_update_layout(), gives each
new row's growing child the width the flex will give it, worked out from
the other children's styles and text, and labelFit() measures wrapping
labels at their real width up front. The grow stays, so a control that
can't be sized ahead only falls back to the old passes.

Layout on the device: Display page 34 -> 24 ms, Bot 33 -> 18, Quick
37 -> 22, Radio 26 -> 18, Diagnostics 20 -> 12. Sim screenshots of 26
screens unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 10:30:27 +02:00
JakubandClaude Opus 5.5 634294ee3a perf(l2): Clock opens in half the time: own number wheel instead of lv_roller
An infinite lv_roller measures its whole option text (repeated three
times) on every style change, layout pass and frame. The hand-drawn wheel
draws only the visible rows, with the same look, drag, throw, tap and
wrap-around. Clock first frame 99 -> 54 ms (layout 42 -> 12 ms).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 09:55:24 +02:00
JakubandClaude Opus 5.5 38f5db5a61 perf(l2): bigger CPU instruction cache, TLS and BLE buffers in PSRAM
The framework libs are rebuilt for the L2's own ESP-IDF options
(solo/wio-tracker-l2/idf/sdkconfig): a 32 KB instruction cache and
64-byte data cache lines make frames ~35% faster (map 45 -> 30 ms,
settings ~36 -> 22 ms). mbedTLS and the NimBLE host allocate in PSRAM,
so internal RAM ends up with more free than before (103 KB, largest
block 57 KB; was 89.6 / 45).

Wio_Tracker_L2_idf_libs does the rebuild; it has to run before the
firmware env, also in CI. idf/arduino_tinyusb gives the rebuild the
TinyUSB options and the framework's prebuilt library, which it would
otherwise lose.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 09:23:50 +02:00
JakubandClaude Opus 5.5 2f3b95adb4 fix(l2): the GPS switch no longer jumps
UiCore::setGpsEnabled() wrote the prefs to flash at once, which stalled
the loop mid-animation. It takes save = false now (default true, the L1
unchanged); the L2 marks the prefs changed and writes them on leaving
the screen, as its other switches.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 23:23:04 +02:00
JakubandClaude Opus 5.5 b53b0e1349 feat(l2): vector map off unless built with -D MAP_VECTOR
The vector map isn't finished: without the flag it stays off whatever
was saved, and its switch and the Vector regions row are gone from the
map tools. The code stays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 23:23:04 +02:00
JakubandClaude Opus 5.5 1ff58d4a81 perf(l2): no redraws while nothing changes
Found by counting flushes on idle screens in the sim:
- The compose field's cursor blinked (a redraw every 400 ms) as soon as
  a conversation opened, the keyboard hidden: lv_keyboard_set_textarea()
  focuses the field, and LVGL only stops a blink when the cursor moves.
  fieldFocus() sets the state and nudges the blink; also used for the
  WiFi and channel fields, which left theirs running.
- lv_obj_align_to() restyles on every call, so the status bar's icons
  redrew every second; placeLeftOf() moves them only when they move.
- Text colours set every second (nav bar, GPS status, Diag errors) go
  through setTextColor(), which skips an unchanged colour.
- A LV_LABEL_LONG_DOT label writes its "..." into its own text, so
  setText() never matched and rewrote it every refresh (the nav bar's
  hint); labelShows() reads past the dots.
- The map area, the area-outline, trail and vector-label layers were
  invalidated on every map refresh (every 3 s, a full-map redraw); now
  only when the view or what they draw changed.

Idle map: 17 -> 1 flush in 5 s; list and settings screens: 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 23:22:31 +02:00
JakubandClaude Opus 5.5 74efb6addd perf(l2): the Quick-message editor freezes the screen under it
The editor has its own 80 % dim layer, not a popupOpen() one, so every
key press redrew the list under it and blended the dim over it. It now
freezes the screen like the popups (freeze::now); the frozen image takes
the dim layer's own level instead of assuming 60 %.

Keyboard redraw 38.7 -> 29.7 ms, full frame 46.3 -> 39.7 ms.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 23:21:59 +02:00
JakubandClaude Opus 5.5 01f35afa38 perf(l2): nothing drawn under the map tiles
- The map screen's own fill is only painted where the map area doesn't
  cover it (the strip it uncovers as it drifts in); the area and the
  opaque status bar hide the rest. ~2 ms a frame.
- With every visible cell holding a tile, the map area drops its fill and
  grid, which lie under the tiles anyway, and still reports that it
  covers what's below (coversOwnArea, shared with the frozen popup
  image). The Home minimap drops them the same way. ~5 ms a frame.

Full map frame ~50 -> 46-48 ms on the L2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 23:21:26 +02:00
Huw DuddyandGitHub bbe54f8c55 Merge pull request #2719 from jirogit/fix/techo-lite-flash-device
fix(techo-lite): remove duplicate EXTERNAL_FLASH_DEVICES definition
2026-10-01 00:41:23 +10:00
Huw DuddyandGitHub 79e309365f Merge pull request #3001 from Szetya/patch-1
Fix T-Echo Lite GPS pins
2026-10-01 00:38:23 +10:00
Huw DuddyandGitHub 77396d0538 Merge pull request #3301 from beala/beala/fix-t1-clock
Fix clock on Heltec T1: Do not misidentify IMU as an RTC
2026-09-30 23:46:32 +10:00
Huw DuddyandGitHub 884391447c Merge pull request #3155 from TadyTheFish/enable-ina226-promicro
Enable INA226 support for ProMicro nRF52840
2026-09-30 23:23:35 +10:00
JakubandClaude Opus 5.5 31cbb1a91a perf(l2): UI_PERF_TEST draw profiles and layout counters
Kept for the optimisation pass before a release:
- perfDrawProfile(): a full redraw timed per object (its own drawing),
  totals by kind and the costliest listed -- on settings pages, Contacts,
  Home, the map and under a frozen popup; the screen's entrance frames too.
- Per screen: build, layout, first draw and redraw apart.
- A popup over Home: a full frame dimmed live and frozen.
- The reset reason and a core dump summary at start.
- -D PERF_WRAP_TEXT with -Wl,--wrap= of lv_text_get_size_attributes,
  lv_layout_apply, lv_obj_get_style_prop_internal and lv_obj_send_event:
  text measured, flex runs, style reads and events per screen.
- -D PERF_KEEP_USB leaves the USB popup up.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 14:33:32 +02:00
JakubandClaude Opus 5.5 f70019f920 perf(l2): the screen under a popup is frozen, not redrawn
Once a popup's dim is up, the screen below is drawn once into an image
(LV_USE_SNAPSHOT), darkened as the dim layer darkens it, and shown opaque
over the screen with the dim layer cleared. LVGL then starts drawing from
that image; an lv_image with no background never reports that it covers,
so it answers the cover check itself. A full frame under a popup: 45.7 ->
32.6 ms; freezing costs ~29 ms once, as the popup settles.

One popup at a time (a second one dims live), a strip keeps the status
bar dimmed under top-layer popups, the image goes with its popup, and the
popup dims live again if its screen goes first. POP_BOTTOM (over a live
map) isn't frozen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 14:33:32 +02:00
JakubandClaude Opus 5.5 36c647cd05 perf(l2): cards, rows and notes get pixel widths up front
LVGL lays out children before their parent, and a new box's size is only
known after a pass, so every level sized in % of the one above cost a whole
extra layout pass over the screen. innerW() works the width out from the
styles instead; fillWidth() sets it on infoCard, infoLine (every row),
noteLabel and scrollList, and the screen body is px-wide.

Display & power page: 101 -> 76 flex runs, layout 68 -> 54 ms, first
frame 161 -> 146 ms; the other settings pages and Radio / Bot / Quick
alike. Four passes remain: a row's text column grows beside its control,
so its width is only known after the row's own layout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 14:32:33 +02:00
JakubandClaude Opus 5.5 abbbdc5ae5 perf(l2): cheaper frames -- less overdraw and blending
Measured on the L2 (steady full frames): Settings page 37.7 -> 31.4 ms,
Display 41.5 -> 37.9, Contacts 34.6 -> 32.9, Home 37.3 -> 32.4.

- styleSurface() leaves boxes in the page colour unpainted; styleOpaque()
  for the screen and the status bar, which things slide under.
- group() cards clip their corners only while a row is held
  (rowPressable(), shared by the tappable rows).
- rowSlider(): the track an opaque tint (theme::mix(), also behind
  ACCENT_DIM) instead of 20 % accent blended every frame.
- Map buttons, pills, scale, nav bar and the Home minimap labels opaque.
- Screens drift in without the fading cover: its full-screen blend was in
  every entrance frame (page 39 -> 29 ms).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 14:30:45 +02:00