Commit Graph
4634 Commits
Author SHA1 Message Date
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
SimpSonandGitHub 323a9819a2 Add files via upload
Preserves the last GPS fix
2026-10-22 22:01:54 +02:00
SimpSonandGitHub 564ffe0659 Add files via upload
add -D GPS_SKYVIEW
2026-10-22 21:59:45 +02:00
SimpSonandGitHub b416b4dd13 Add files via upload
keypad improvements
2026-10-22 21:58:30 +02:00
JakubandGitHub 615e71b98d Merge pull request #52 from sim1988son/simpson-dev
Fix Simpson Enter with keyboard visible
2026-10-21 13:01:37 +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>
v2.0.1
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 5bee64ef3b build(watch13): the Latin/Greek/Cyrillic 6x9 OLED font
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>
2026-10-16 15:40:37 +02:00
JakubandClaude Opus 5.5 136c87f990 build(promicro): the Latin/Greek/Cyrillic 6x9 OLED font
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>
2026-10-16 15:38:26 +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
JakubandClaude Opus 5.5 31b8c3fbb0 Simpson: a release build, its schematic and keypad in the docs
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>
2026-10-16 00:05:16 +02:00
Jakub 4b0780208f Merge pull request #49 from sim1988son/simpson-dev
Add Simpson board support
2026-10-16 00:03:42 +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>
v2.0
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 0346cebaf6 fix(security): a kept route no longer grants the contact remote CLI
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>
2026-10-15 15:42:14 +02:00
JakubandClaude Opus 5.5 ad8e3f859f docs: 2.0 notes - the e-ink Nodes map, packet flow's legend and dashes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 15:30:28 +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 5f531fad60 docs: 2.0 release notes (everything since 1.28), README header centred with badges and screenshots
- 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>
2026-10-15 14:53:30 +02:00
JakubandClaude Opus 5.5 ff4ca2832f docs: the app on BT and USB at once, /prefs.json, UIColor, txdelay and agc commands
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 14:42:04 +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 81dbae592f Merge branch 'dev' 2026-10-15 19:42:40 +11:00
Scott Powell 07a833bbbe * version 1.18.0 2026-10-15 19:42:01 +11:00
ripplebizandGitHub 9043a2bbf8 Merge pull request #3596 from recrof/wifi-companion-boards
added dynamic wifi to: heltec wsl3, v4r8, wireless paper; rak 3112; seeed xiao s3 (wio)
2026-10-15 19:35:32 +11:00
Rastislav Vysoky 97c0aec8d6 added dynamic wifi to: heltec wsl3, v4r8, wireless paper; rak 3112; xiao s3 (wio) 2026-10-15 09:57:31 +02:00
ripplebizandGitHub f1b608a777 Merge pull request #2377 from fschrempf/dev
Disable NRF52 undervoltage bootlock feature
2026-10-15 15:02:12 +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
JakubandClaude Opus 5.5 b4ec5dcb54 feat(map): base layers - Topo, Light, Dark, Satellite, Esri Topo
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>
2026-10-14 17:25:16 +02:00
JakubandClaude Opus 5.5 85ef06b6be feat(map): packet flow shows all traffic - kinds in colours, a legend, its own nodes
- Every packet heard is drawn, by kind in fixed colours: advert, DM,
  channel, request, ack, other, sent. One that can't be placed on the map
  is a ring at your own position.
- A legend pill at the top counts each kind over the last minute.
- On a map without node markers, a flow brings its own nodes (a dot and
  the name), fading with it.
- Copies of one packet (the same packet hash) share one fade, so a path
  goes out as a whole, not segment by segment.
- 32 flows kept on ESP32 (12 on nRF).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:24:24 +02:00
JakubandClaude Opus 5.5 2f2db6045c fix(l2): WiFi fails to start or join - big statics and task stacks to PSRAM
WiFi starts and joins on internal RAM: ~42 KB the first time, ~25 KB after,
more for WPA. Free internal RAM had shrunk to ~20 KB after opening the map
(the tile decoder's 12 KB stack, the 32 KB I-cache, the DMA draw buffers,
UI statics), so a scan failed at once (esp_wifi_init: no memory) and a join
during a tile download timed out (AUTH_EXPIRE).

- ESP-IDF: CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY, and the esp_timer
  task stack 8 -> 4 KB (it uses ~0.4 KB). Rebuild the framework libs:
  pio run -e Wio_Tracker_L2_idf_libs.
- PSRAM_BSS (EXT_RAM_BSS_ATTR) on the UI's big statics: QR codes, map
  state, charts, lists. .dram0.bss 115 -> 66 KB.
- The tile decoder's and fetcher's task stacks in PSRAM.

Free internal RAM, idle: 48 -> 105 KB; WiFi up: 57 KB, 29 KB at the
lowest while downloading tiles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:23:29 +02:00
JakubandClaude Opus 5.5 3825dcc077 fix(l2): fast typing - a second finger is a new tap, not a slide
With two thumbs the second lands before the first lifts; the panel's
first point then jumped to it and LVGL saw one press sliding from key to
key, losing the first letter (or starting a scroll). A new GT911 track id
is now a release, then a press. The keyboard no longer hands a rolling
finger to a scroll or gesture up the tree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 12:51:03 +02:00
JakubandClaude Opus 5.5 c779bf46b5 feat(ui-lvgl): title bar with the clock, tidier controls, contextual nav bar
Density from less chrome instead of smaller rows (ROW_H stays 44):
- titled screens drop the status bar; the title bar (APPBAR_H) holds back,
  the title, the screen's actions and the time/battery on a pill; the status
  bar returns for Home, the map, typing, the quick panel and the lock
- one radius (RADIUS) for everything tapped: buttons, tabs, choices, chips
- tabs are all segmented at TAB_H in the body (GPS, Clock converted)
- Nodes: chips row + sort + status line become one toolbar row with
  Show / Order choices; Messages' All/Favourites is the same choice
- nav map: the target bar only while there is a target; the pin opens one
  "Places" popup; back from a map options page restores the map and Map
  tools as left, without a jump
- node detail actions at the top of the scroll; Home tiles fill the page
- rowsFit() leaves growing labels to the flex (a screen title cut to one
  letter after Messages' filter changed)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 12:51:03 +02:00
JakubandClaude Opus 5.5 a8440c890e feat(map): packet flow - what the radio hears, as lines between nodes
Every packet heard runs from its origin through the repeaters with a
position to this device; a packet sent is a ring. ui-core/PacketFlow.h
resolves them (UiCore::flow, MyMesh logRx/logTx -> Listener). ui-lvgl
draws them on the map's marker layer and repaints only their area while
they move; ui-new draws the last minute on the Nodes map ("Flow" in its
options). Setting: Map options > On the map > Packet flow, CLI map.flow.
Off by default. Sim-checked only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 12:50:43 +02:00
JakubandClaude Opus 5.5 120ddfc830 feat(route): trace per link, to the node or the last repeater, find where it stops; channel order re-sorts on entry
Core: PathEditor results are links (node k hearing k-1 and back); toNode()
off traces only the repeaters (a companion answers only with repeat on);
probe() traces to each repeater in turn after no reply; failures carry a
reason; an empty list saves "direct". PingEngine takes over a slot left past
its timeout. A kept route: the dropped heard path isn't announced to the app
nor bumps lastmod; an app update keeps the flag only if it leaves the route.
Marker boxes sized for every dot and name (overflow).

ui-lvgl Route: one line per node with out / back dB coloured by quality, tap
a hop to move / remove, tap the node to include it, Keep in the header, Find
where beside a no-reply status. ui-new Path: To node / Find break rows,
result alerts, cursor kept on its action.

Channels: ui-new re-sorts the list on entering it, cursor on the same channel.
Docs: Path and trace, Channel order. Sim hooks: open route, add channel,
open messages.

Checked in the browser sim (L2 + ui-new peer + repeater); not on hardware.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 11:20:55 +02:00
JakubandClaude Sonnet 5.5 24dd025086 feat(channels): Channel order setting - slots, newest message or name (#48)
Shared chanctl::order() builds the channel list for ui-new and the L2:
favourites first, then by ch_sort. New ch_sort pref at the end of NodePrefs,
Settings > Contacts row and contacts.channel.order CLI key.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-14 10:46:20 +02:00
Liam CottleandGitHub 2586f7abe3 Merge pull request #3591 from liamcottle/feature/companion-ble-wifi
Add WiFi support to Heltec v3 and v4 BLE variants
2026-10-14 20:23:11 +13:00