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>
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>
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>
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>
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>
Simpson: Enter long-press on the keypad, GPS skyview; the last position kept
while GPS duty-cycling sleeps.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Same gap as the ProMicro: an SSD1306 solo build without
OLED_MISC_FIXED_FONT, non-Latin text as filled squares. Flash 75%.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The only SSD1306 solo build without OLED_MISC_FIXED_FONT: non-Latin text
showed as filled squares. ~14 KB flash (70.3% -> 72.3%).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
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>
The env is Simpson_companion_solo_dual, the suffix the release workflow
builds, and keeps the variant's build_unflags (they were overridden, so the
GPS pins were defined twice and the sensor drivers came back). Hardware
gets a Simpson section with sim1988son's schematic and the keypad's modes;
README lists the board.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
CONTACT_FLAG_ROUTE_PINNED was bit 4 (0x10) of ContactInfo::flags, which
upstream 1.18 made isRemoteCLIAllowed(): keeping a route to a contact let it
run any CLI command on the device remotely (radio, name, PIN, reboot,
wifi.pwd), and a contact the app allowed CLI had its route held. The kept
route moves to bit 7 (0x80). Not in any release (the route editor came
after rc3).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
- 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>
- release-notes: v2.0 section covering all of 2.0 against 1.28, the
settings reset for rc users (name, radio, BT PIN), changes since rc3
in a collapsed section.
- README: centred title, badges (release, browser sim, docs, Discord),
three screenshots, the Buy Me a Coffee button; stale "BLE has
priority over USB" note removed; e-ink row split by panel; Community
section; pmow in contributors.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
- 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>
- 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>
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>
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>
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>
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>
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>
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>
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>
Map tools > Layers > Map picks what the map is drawn from:
- Topo: OpenTopoMap, as before.
- Light and Dark: Esri's grey canvases, no labels, up to z16.
- Satellite: Esri World Imagery.
- Esri Topo.
Each layer has its own folder for downloaded areas (/sdcard/maps-light,
-dark, -sat, -esritopo; Topo stays in /sdcard/maps) and its own live-tile
cache. Live-cache records carry the layer.
Esri serves JPEG: decoded with LVGL's tjpgd (LV_USE_TJPGD), whatever the
file name says. The layer is kept in NVS (mc_ui/layer); switching waits
while a download or a deletion runs in the current folder.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>