Commit Graph
1865 Commits
Author SHA1 Message Date
JakubandClaude Opus 5.5 bf7b262645 feat(l1): messages kept on flash across a power-off, and "Powered off" on e-ink
Settings > Messages > Keep messages (Off, 500, 1000, 2500 in all; off by
default; HIST_FLASH, ui-core/HistoryLog.h). Two append-only logs on the QSPI
flash, channels and DMs, restored into the RAM rings at the start. A batch is
written a minute after the first unsaved change and at shutdown, as the L1's
power switch gives no warning. Each segment has a directory of its own: a
LittleFS 1.x commit erases one of a directory's two fixed blocks every time.

E-ink panels keep their last frame, so a shutdown now leaves "Powered off" on
it and puts the controller into deep sleep.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 09:46:43 +01:00
JakubandClaude Opus 5.5 751cbc1e79 fix(home): the title bar from the first frame when the Clock page is hidden
Home starts on page 0, the Clock. render() chose whether to draw the bar
before moving on from a hidden page, so that frame had none and the next
refresh came 5 s later or on a key press.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 09:46:43 +01:00
JakubandClaude Opus 5.5 6ce3ed0ff9 fix(settings): Time zone says it's the winter time, which summer time adds an hour to
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 17:06:55 +01:00
JakubandClaude Opus 5.5 3a26a8bee7 fix: review pass - Discover's late replies dropped and its way back usable, the Gallery's newest first and faster, the network clock's toast
- Discover: a reply after its try timed out, was stopped or was overtaken
  went on to the normal handling and became the contact's route (and sent
  a path back); the last tags sent are kept and a late reply is dropped.
  Leaving Route on the L2 stops a discovery as it stops a trace.
- Discover: a route whose reply came back another way offers that way too
  (L2 There / Back, L1 a Back row), turned round into a route there, so a
  trace checks it; the Discover button no longer sits on its group.
- Screenshots: numbered one past the highest (one pass over the folder,
  not a stat per number), so one taken after a delete is still the newest.
- Gallery: the newest 300 kept whatever order the folder lists them in;
  BMP rows read in the file's order and several at a time; the thumbnail
  buffer sized to the page; the folder read once per visit; a failed
  open frees or restores the picture.
- NTP: the slot the router's server goes in emptied before joining, so a
  cached address isn't taken for it; "Clock set from the network" judged
  against the clock a tick before (SNTP has set the system time already).
- Sim: sim_scroll up stops at the top.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 16:30:19 +01:00
JakubandClaude Opus 5.5 e154a4e721 feat(l2): Gallery app (screenshots as thumbnails, full view with swipe and delete, the saved trails), the clock from NTP while WiFi is up (the router's server from DHCP first), tabs switch on release, Home apps out of Settings
- Gallery: thumbnails 30 to a page, built only while the screen is still (a decode held the loop and a scroll read as a tap)
- segmented(): CLICK_TRIG, so a swipe starting on a screen's tabs doesn't switch them
- Settings > Device > Home apps removed (hold an app on Home instead)
- platformio.ini: a note that the L2 has no microphone on GPIO15 (verified on hardware)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 15:39:56 +01:00
JakubandClaude Opus 5.5 cdc2ff25c9 feat: summer time - Settings > Summer time (Europe, North America, Australia, New Zealand) puts the clock an hour ahead and back by itself; every local time goes through tzHoursAt(), the alarm keeps its time across the change (a skipped time rings an hour later, a repeated one once)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 14:09:25 +01:00
JakubandClaude Opus 5.5 c46a0a2b55 feat(l2): keyboard - a second symbols page behind #+= with the brackets and the rest of ASCII ([ ] { } < > \ | ~ ^ ` $ and a few more)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 14:09:25 +01:00
JakubandClaude Opus 5.5 cce2798d2d feat(route): Discover - path discovery from the device, 1/3/5 tries 20 s apart, the routes found to use in the route editor
MyMesh::sendPathDiscovery() shares the request with the app's
CMD_SEND_PATH_DISCOVERY_REQ and hands the reply (the way there and back)
to the UI; PathEditor keeps up to 4 distinct routes with how often each
came. L2: Find the route under Route; L1: Discover row in Path / trace.
Docs: Discover, message routes on the map, Ask status and discovery.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 23:09:23 +01:00
JakubandClaude Opus 5.5 f4ad1bd643 feat(l2): recent packets on the map - the flow legend's tap lists the last 10 placed packets, a tap plays one again, Play all plays them in turn
PacketFlow keeps them (each with up to 3 ways it came, contacts by key
prefix) once a frontend asks, in PSRAM; the map frames a replay that's off
screen. Back on the map closes a popup first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 22:40:30 +01:00
JakubandClaude Opus 5.5 e8553d276d fix(bot): !hops / {hops} say 'known route' as !path does, a route followed by ':' is found, {rssi} among the L2's placeholders
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 22:40:30 +01:00
JakubandClaude Opus 5.5 c1af501cc4 fix(l2): a map line starts from the middle of the own-position and node dots
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 20:42:36 +01:00
JakubandClaude Opus 5.5 80580ead54 fix: review pass - options menu room for Show route, 'known route' for a direct-routed !path, 3-byte hashes, a channel's route not from here, bot sender looked up once, no decimal times as routes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 20:06:03 +01:00
JakubandClaude Opus 5.5 8aec54b7e5 feat(bot): a Log tab with the bot's last 32 replies (ESP32 and the L2 sim)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 19:59:19 +01:00
JakubandClaude Opus 5.5 be03297e41 test(sim): sim_test_bot and sim_test_contact_hash hooks for the bot and route checks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 19:54:02 +01:00
JakubandClaude Opus 5.5 30ebef765f feat(bot): {path} !path (#55), {snr} {rssi} !snr, !dist, Actions by All/Fav
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 19:46:28 +01:00
JakubandClaude Opus 5.5 81c551425e feat(ui): a route written in a message shown on the map (L2 Route, L1 Show route)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 19:46:28 +01:00
JakubandClaude Sonnet 5.5 009bde0db4 fix(ui): the empty channel list says 'Fav only' when that filter hides every channel (#54)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 12:35:31 +01:00
JakubandClaude Sonnet 5.5 2ae55e97ac fix: review pass - storage unmount timeout, nav dial animates, dial text room, nearby name width, Simpson Enter with another key, GPS chip
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 10:12:56 +01:00
JakubandClaude Sonnet 5.5 e03fa7c084 fix(l2): no bright bar on the dark screen at power-on
The first frame (the sprite's default white background, black dots) came out as
a bright bar across the middle of the screen. A plain black frame now, and the
backlight stays off until it's sent: dark through the panel's reset and init
(the LP5814 keeps its state across a restart), lit with the first frame.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 21:33:59 +01:00
JakubandClaude Sonnet 5.5 e6ae1d63b8 fix(l2): the top button wakes the screen at once, switches it off on letting go
A press that silenced the alarm, took a screenshot or woke the screen doesn't
also switch the screen off when it's let go.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 21:33:59 +01:00
JakubandClaude Sonnet 5.5 9c40c83f4a fix(l2): the chat rows' preview isn't cut at the bottom
The font's line is 18 px (emoji and fallback glyphs), the subtitle label was a
fixed 15: the tails of y, g, j and emoji were cut. Now 18, the title and the
subtitle 1 px further apart; the row stays 44.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 21:33:59 +01:00
JakubandClaude Sonnet 5.5 52812d8235 feat(ui): a turn dial / compass rose on narrow navigation screens
navview::draw (Waypoints, trail back, Nearby, a message's location) shows a
dial beside the lines, or under them on a tall screen (portrait e-ink) where
that makes it larger: with a course a turn dial (the top is where you're
heading, the arrow points at the target, "Turn R 55"), without it the compass
rose. The 4.2" screens keep theirs. On a short screen (the 64 px OLED) the
gap under the distance and the pitch of the lines give way so the ETA is not
cut off at the bottom.

sim_nav_waypoint() opens a waypoint's navigate view from the simulator page.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 14:47:51 +01:00
JakubandClaude Sonnet 5.5 15ac4d8f83 feat(l2): a turn dial in the navigation bar
An arrow at the target on a round dial whose top is the way you're heading:
turn until it points up. It turns green and the ring doubles when you're
within 12 degrees. The text says how far to turn ("turn right 55") instead of
two bearings to subtract. Standing still there's no course: the arrow greys
out, the top is north and marked red, and the text keeps the bearing.

sim_nav_target() sets a target from the simulator page.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 14:47:51 +01:00
JakubandClaude Sonnet 5.5 c5da3ecdea fix(l2): a banner or toast doesn't wait on a sleeping screen to be hidden
LVGL's timers stand still while the screen sleeps, so a message that arrived
with wake-on-message off (or in quiet hours, or with a client connected) left
its banner up until the next wake. No banner is shown while asleep now, and
sleep() hides a banner or toast that was up.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 19:29:00 +02:00
JakubandClaude Opus 5.5 1552ca4383 fix(l2): the battery shows an icon, a percentage or a voltage, not the icon too
Battery display's percent and voltage modes still drew the icon before
the number. Each mode now shows one thing; the title bar no longer has a
battery level to fold away, so only the button words give way to a title.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:00:52 +02:00
JakubandClaude Opus 5.5 b44ee6a599 feat(status): the path hash size on Status > Radio (L2: Diag > Radio)
Bytes per repeater in a path we send (Settings > Radio > Advanced), next
to the TX power.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:00:52 +02:00
JakubandClaude Opus 5.5 24156769f0 fix(bot): !temp and {temp} fall back to the chip's temperature
Same gap as the screens had: the bot reply, a typed message's {temp} and
the placeholder lists read only the sensors, so a board without one (the
L1) answered !temp with n/a while its telemetry carried a temperature.
The fallback moves to LocalSensors.h, shared by the screens, expandMsg()
and sensorPlaceholders(); the latter now takes the chip's temperature.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:55:19 +02:00
JakubandClaude Opus 5.5 21feec0972 fix(l2): wait out the tile being read before the SD card is unmounted
USB drive and Format card closed the open map pack and unmounted, while the
tile task could still be reading a tile off the card (a map left open, a
prefetch). Both now wait for it first, as the map's own redraw does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:52:11 +02:00
JakubandClaude Opus 5.5 a69ecd9d14 feat(ui): UI_NO_HIBERNATE hides the Hibernate row
Upstream's flag (meshcore-dev/MeshCore#3290, already set on the L1 OLED
builds) did nothing in the Solo UI. The L1 has a power switch; a pocket
could hibernate it by mistake from the Shutdown page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:33:52 +02:00
JakubandClaude Opus 5.5 d2e1f086e2 fix(ui): the chip's temperature when no sensor reads one
The telemetry reply adds the MCU temperature, the screens read only the
sensors: on a board without a temperature sensor (the L1) the app showed
a temperature and the clock field '--'. The clock, Status and the L2's
Home now fall back to the chip's, like the reply. The bot's !temp and
{temp} still read only the sensors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:33:52 +02:00
JakubandClaude Opus 5.5 467d64af40 fix(nearby): a node's name takes the room its row leaves
The name column always reserved 7-9 characters on the right, though a scan
row shows only 11 px of signal bars: names got about half the OLED.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:33:33 +02:00
JakubandClaude Opus 5.5 c85e53a094 fix(settings): Home pages listed in their order, numbered 1-10
The rows kept a fixed order while their numbers came from page_order,
which still has slots for retired pages (Recent, GPS, Sensors): numbers
skipped, and Left/Right could swap a page with a slot that has no row, so
nothing seemed to happen. Rows now show the pages in Home's order; a move
skips retired slots and the highlight follows the page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:33:33 +02:00
JakubandClaude Opus 5.5 a67b0fa025 fix(simpson): PR #53 follow-up - LF endings, no MESHCORE_VERSION, a long Enter wakes the screen first
The keypad files came back with CRLF endings; MESHCORE_VERSION is the
MeshCore base on the splash (1.18.0), not the Solo version, which comes
from the tag; ENV_INCLUDE_GPS is already set by the ProMicro base. A long
Enter with the screen off acted on the dark screen: it now only wakes it,
like every other key, and restarts the screen-off timer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:33:33 +02:00
SimpSonandGitHub 2d2360fc75 Add files via upload 2026-10-22 23:03:44 +02:00
SimpSonandGitHub b751956466 Add files via upload 2026-10-22 23:01:17 +02:00
SimpSonandGitHub fd10ac6a40 Add files via upload
during GPS duty-cycle sleep, displays the cached position, adds long-press Enter handling
2026-10-22 22:05:33 +02:00
sim1988son 7073f1ebc2 Fix Simpson Enter with keyboard visible 2026-10-20 22:07:52 +02:00
MarekZegare4andClaude Sonnet 5.5 1683be63ca fix(l2): title bar fits its title - the battery level, then button words, give way
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 12:58:04 +02:00
MarekZegare4andClaude Sonnet 5.5 e2c50062b6 feat(ui): UI_ENTER_DOUBLE_BACK - double-click Enter goes back, off by default
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 12:58:04 +02:00
JakubandClaude Opus 5.5 0ea17f0414 fix(nearby): the ping popup scrolls to its last result row
The OLED popup fits 3 rows, a finished ping has 4; UP/DOWN were swallowed
so SNR back stayed hidden. Enter on any row sends. Fixes #50.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 15:38:26 +02:00
JakubandClaude Opus 5.5 9dbf4501a3 fix(cardkb): no background poll task when the CardKB shares the display's I2C bus
On the ProMicro the CardKB sits on Wire with the SSD1306. The poll task,
active while a frame goes out, read the keyboard mid-transfer: frozen
screen and a boot loop since rc3. Fixes #51.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 15:38:26 +02:00
sim1988sonandCopilot ebada411f7 Fix Simpson keypad T9 and buzzer settings
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-15 22:09:25 +02:00
sim1988son 539271f293 Add Simpson board support 2026-10-15 20:39:48 +02:00
JakubandClaude Opus 5.5 1f47fc56cd fix(route): a stored route longer than the editor's 7 hops can't be saved cut short
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 18:41:18 +02:00
JakubandClaude Opus 5.5 d85a3a1eef fix(map): L2 packet flow lines meet the marks too - PacketFlow::pointNow()
A flow's point is where its contact is now, its end here where you are now
(GPS, else the position set in Privacy): shared by the L2 map and the
OLED / e-ink Nodes map.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 15:42:14 +02:00
JakubandClaude Opus 5.5 5932317d6b feat(eink): Nodes map uses the room - names, trail, waypoints, side pane with the flow legend, a scale bar
- Every e-ink build: the nodes' names beside their dots, placed where they
  cover no other name, dot or mark; the trail dotted and the waypoints.
- 4.2" and 4.26": the map on the left 3/5, beside it the selected node
  (distance and direction, type, last heard, path, a compass rose) and,
  with Flow on, a legend counting each kind over the last minute; the
  kinds are told apart by their dashes (gfx::Dash).
- E-ink scale: a framed bar, half filled, ticks at the ends, the distance
  over its middle. The OLED map is unchanged.
- The distance shows with the position set in Privacy too.
- Sim: sim_trail() lays a trail and two waypoints.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 15:29:15 +02:00
JakubandClaude Opus 5.5 649d499d6f fix(ui): packet flow lines meet the marks on the OLED and e-ink map
- The newest lines are three strokes centred on the line, not two to one
  side.
- A flow's points are drawn where the contacts and you are now, not where
  they were when it was heard; dots and lines round the same way.
- With the GPS off, the position set in Privacy is your mark on the map
  and where the lines end.
- Far ends are projected and clipped in floats: zoomed in, a far point no
  longer overflows an int and turns a line around.
- Rings are clipped to the map and as thick as a line; the scale and the
  north mark get a background; on e-ink the ring here stays 15 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 15:12:59 +02:00
JakubandClaude Opus 5.5 cdf979dcca fix: settings and lists lost to a restart mid-save on ESP32, LR1121 boards, repeater/room sims
- A restart between commitTempFile()'s remove and rename left only the .tmp;
  loads now recover it (prefs, contacts, channels, scopes).
- CustomLR1121Wrapper lacked readLiveRSSI/readLiveSNR: LR1121 boards didn't
  compile.
- The repeater and room server sims gain DynamicConfigSerializer.cpp and
  CommonRadioPrefs.cpp (broken since the v1.18 merge).
- Comments still describing the removed DualSerialInterface.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 14:42:04 +02:00
JakubandClaude Opus 5.5 8c20914689 refactor(ui): upstream's UIColor palette in place of the DARK/LIGHT enum
- DisplayDriver takes ColorVal; each driver's .cpp defines the UIColor roles
  (window_bkg, primary_txt, ...) in its own values. ui-new draws in two:
  window_bkg and primary_txt. OLED and e-ink look as before (sim screens
  pixel-identical).
- E213, E290, LGFX, Null, ST7735, ST7789LCD, U8g2 taken whole from upstream
  (with them the rewritten ST7735 driver and the Heltec V4 R8 TFT display).
- SH1106, SSD1306, ST7789, EinkGfxDisplay and the sim drivers converted.
- ui-orig, ui-tiny, simple_* get upstream's colour roles; the repeater's UI
  taken from upstream (its power-off screen).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 14:42:04 +02:00
JakubandClaude Opus 5.5 83ba0161da chore(solo): MESHCORE_VERSION 1.18.0 (splash, Diag)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 14:07:52 +02:00