Commit Graph
1855 Commits
Author SHA1 Message Date
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
JakubandClaude Opus 5.5 f6c0a2f021 refactor(companion): the app's links through upstream's MultiSerialInterface
- Bluetooth + USB (+ WiFi/Ethernet/UART per build) in one interface_manager,
  as upstream; frames go to every enabled link, USB is read while BT is
  connected. DUAL_SERIAL now means ENABLE_USB_INTERFACE.
- WiFi interface with upstream's wifi_* prefs and set/get wifi.* CLI.
- isClientConnected moved into ArduinoSerialInterface (DTR on nRF52 and
  ESP32 native CDC).
- UI uses isBluetoothEnabled/enableBluetooth/disableBluetooth; turning BT
  off leaves USB and the other links on.
- DualSerialInterface removed.
- Sim build gains DynamicConfigSerializer.cpp (broken since bd64c203).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 14:04:58 +02:00
JakubandClaude Opus 5.5 bd64c203c7 refactor(prefs): settings saved as /prefs.json, upstream's ConfigSerializer
NodePrefs is now NodePrefsFields (the fields) plus how they're saved: one
JSON key per field, upstream's keys under "radio", "gps", "repeat", "comp"
and "custom" (so either firmware reads what the other wrote of them),
ours under "solo". Saved atomically (temp file, then renamed), through a
buffer. 2.0-rc's binary /prefs is removed, not converted: 2.0 starts from
the defaults; /new_prefs from before 2.0 is still imported.

From upstream with it: txdelay / direct.txdelay / agc.reset.interval
(prefs and CLI), and the board's own settings through getCustom()
(Board::attachDynamicPrefs) in place of the merge's stopgap adapter.
ConfigSerializer reads values up to 191 characters (was 127): 140-byte
texts, an 80-byte table in hex.

Test: every field round-trips through the JSON byte for byte; the alarm
label tests expect "Once" (the label changed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 13:25:58 +02:00
JakubandClaude Opus 5.5 28be1c6206 Merge upstream companion-v1.18.0
Fixes and features from upstream: MACThenDecrypt / command buffer
overflow fixes, ACK forwarding delay, transport code 0 as unscoped,
hidden nodes don't answer DISCOVER, LR2021/LR1121 fixes, GPS cold-start
detection and waitFor()/drain(), NMEA fix-age counters, ESP32 RTC after a
crash, remote CLI by text message (TXT_TYPE_CLI_COMMAND),
PUSH_CODE_BINARY_RESPONSE, board.loop(), new boards (Wio Tracker L1 1W,
ThinkNode M4/M8, Muzi Base, Waveshare LR1121, Pico W).

Kept ours: NodePrefs, main.cpp, every UI, GxEPDDisplay. The companion CLI
stays MyMeshCli.h's handleCliCommand(); upstream's handleCommand() calls
it. The board's FEM gains go through attachDynamicPrefs() with an adapter
over our NodePrefs fields. Upstream's JSON prefs and MultiSerialInterface
come as their own stages.

Also: the display defaults were inside RADIO_FEM_TXGAIN's #else (a
missing #endif).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 13:11:48 +02:00
JakubandClaude Opus 5.5 d1fc6e3fdd fix(l2): Messages - "Read all" an icon, the title squeezed to "Me..." beside it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 12:53:22 +02:00
Scott Powell 07a833bbbe * version 1.18.0 2026-10-15 19:42:01 +11:00
JakubandClaude Opus 5.5 b17f97c71f fix(l2): quick panel stalled and tore when pulled; GPS sky plot cut off
The panel froze and dimmed the screen as the finger started: a snapshot of
the whole screen (slow on the map) and a full-screen flush, so it stalled,
jumped and tore top to bottom. Now it slides opaque over the live screen
(a clear layer under it still takes the tap that closes it), built at start.
Its slide is timed by its own frames, at most 30 ms a frame: a slow frame
ended the 160 ms lv_anim and the panel just appeared.

The sky plot on GPS > Sky was a fixed 168 px, taller than what is left
under the title bar and tabs: now it takes that height.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 23:24:52 +02:00
JakubandClaude Opus 5.5 743500761a feat(l2): light theme reworked - a tint for selected, grey values, quiet edges
The light theme read as the dark one inverted. Now something selected (a
tab, a segment, a tile, Fav) is a tint of the accent with the accent's text
(SEL_*), the full accent fill stays for the primary action; setting values
read in grey (VALUE); popups, the banner and the toast have a quiet grey edge
(EDGE), the toast is a dark pill; neutral greys the RGB565 panel keeps
neutral; the big clock graphite.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 23:24:46 +02:00
JakubandClaude Opus 5.5 76e96f7eaa feat(l2): light theme
Settings > Display > Theme: Dark / Light (NVS mc_ui/light). The colour
tokens are set once before anything is built, so a change restarts the
device. Text on an accent fill is the new ON_ACCENT (it was BG, white
in the light theme); each accent has a deeper hand-picked light variant
that reads on white and takes white text. The map's empty-tile fill and
grid and the areas' outlines follow the theme too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 22:55:47 +02:00
JakubandClaude Opus 5.5 e5a55c3b1f feat: flashlight - the whole screen white at full brightness
L2: a Flashlight app on Home (a lightbulb icon added to the fonts): a
white layer over everything, the backlight at 100 %, no auto-off; a tap,
the side or the top button puts it away and the brightness back.
L1: Tools > System > Flashlight, the whole OLED lit at full contrast
until a key. Not on e-ink.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 22:55:01 +02:00
JakubandClaude Opus 5.5 06a188d572 fix(l2): quick panel - the screen showed through its rounded top corners
The panel starts a radius up, under the status bar, so its top corners
are hidden there instead of cut out over the frozen screen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 22:54:56 +02:00