Commit Graph

64 Commits

Author SHA1 Message Date
Jakub
21005aa74c WioTrackerL1 UI v1.15.1: bugfixes and UX polish
- Fix placeholder picker colors: dark box + white border, light fill
  for selected item (consistent with rest of UI)
- Fix placeholders not expanded when sending from keyboard (expandMsg
  was only called in MSG_PICK path, not KEYBOARD path)
- Fix sent messages incrementing unread counter: set _phase=CHANNEL_HIST
  before addChannelMsg so viewing=true
- Fix keyboard column inverse mapping on UP from special row
- Remove old_row dead code from QuickMsgScreen keyboard handler
- Alert banner shown only on home screen, suppressed in settings/messages
- Bump FIRMWARE_VERSION to v1.15.1

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 17:19:03 +02:00
Jakub
886ee62015 WioTrackerL1 UI: predefined messages, caps lock, placeholder picker, 139-char limit
- Settings → Messages section: 10 user-editable message slots (M1–M10)
  with on-screen keyboard editor; slot M1 defaults to "OK" on first boot
- Keyboard: add Caps Lock [^] button — stays highlighted when active,
  all letters display and insert as uppercase until toggled off
- Keyboard: add [{}] placeholder picker overlay — inserts {loc} or {time}
  into the message at cursor position; available in both compose and
  settings slot editor
- Max message length raised to 139 chars to match the companion app;
  ChHistEntry text buffer extended to 140 chars
- NodePrefs: custom_msgs slot size extended to 140 chars per slot
- KB constants (KB_MAX_LEN, KB_CHARS, etc.) moved before SettingsScreen
  so both SettingsScreen and QuickMsgScreen can reference them

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 16:52:24 +02:00
Jakub
85c9857521 WioTrackerL1: redesign companion UI (channels, keyboard, msg preview)
- QuickMsg → Message screen: channel history, on-screen keyboard, custom message first
- Channel history: RAM ring buffer (32 entries, 80 chars), fullscreen view with word-wrap scroll
- After channel send: stay in history, own message shown as "Me: ..."
- MsgPreview: one message per screen with up/down nav, ENTER opens fullscreen scroll
- Monochromatic display: all color usage corrected to DARK/LIGHT only
- Top bar: battery icon, BT muted indicator, splash "Plus for Wio"
- KB_MAX_LEN: 64 → 100 chars; channel text buffer: 52 → 80 chars

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 15:56:30 +02:00
Jakub
acab1efe77 Splash screen: show unofficial build marker for Plus builds
Add FIRMWARE_PLUS_BUILD compile flag to both companion sections in
platformio.ini. When set, SplashScreen shows "+ unofficial build" in
yellow below the build date. Avoids runtime string parsing — the
existing version stripping logic (cuts at first dash) is unchanged.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 22:58:46 +02:00
Jakub
81363690f2 SettingsScreen: skip flash write if no settings changed
Track dirty state per-field in handleInput. savePrefs() on exit only
if at least one value was actually modified. Buzzer is excluded — it
already saves immediately via toggleBuzzer(). markClean() resets the
flag each time the settings screen is opened.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 22:12:29 +02:00
Jakub
d35c7d2d74 Fix null pointer dereferences in SettingsScreen index helpers
lowBatIndex(), autoOffIndex(), gpsIntervalIndex() each called
getNodePrefs() independently without null check, while renderItem()
had its own guarded copy. Added null checks consistent with the rest
of the class. Also initialize _node_prefs to NULL in UITask constructor.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 20:26:05 +02:00
Jakub
3abc5e1e1c Battery %: use LiPo discharge curve with variable shutdown threshold
Replace linear voltage-to-percent formula with a LiPo discharge curve
lookup table and linear interpolation. The curve is then rescaled so
that low_batt_mv (configurable shutdown threshold) maps to 0% and
4200mV maps to 100%, preserving the non-linear shape regardless of
the chosen threshold.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 19:47:12 +02:00
Jakub
202060af12 QuickMsgScreen: show only companion (chat) contacts
Filter contact list to ADV_TYPE_CHAT only — excludes repeaters, rooms,
and sensors which cannot receive direct chat messages.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 18:58:13 +02:00
Jakub
76904f2ec5 Fix: use out_path_len instead of path_len in QuickMsgScreen
ContactInfo has out_path_len, not path_len.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 18:53:52 +02:00
Jakub
3f871c00f6 QuickMsgScreen: sort favourites first, mark with asterisk
Favourite contacts (flags & 0x01 set by companion app) appear at the
top of the contact picker, marked with '*'. Non-favourites appear
below. The favourite bit is already synced by the existing protocol
via CMD_ADD_UPDATE_CONTACT — no protocol changes needed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 18:52:31 +02:00
Jakub
85afda7e46 Add hardware watchdog and QuickMsgScreen
Watchdog: nRF52840 hardware WDT with 30s timeout, runs during sleep.
Resets device if main loop stalls for >30s. Pets in every loop()
iteration so normal operation never triggers it.

QuickMsgScreen: new UI screen accessible from home screen pages.
Two-phase UI: contact picker (shows all contacts with hop count),
then predefined message picker (location, I'm OK, need help, on my
way, ETA 10min, ETA 30min). Location message uses live GPS fix if
available. Sends via the_mesh.sendMessage() and shows sent/error alert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 18:45:35 +02:00
Jakub
0fc12b60fe Add RTC time persistence to flash
Save last known unix timestamp to /rtc_save on shutdown and restore it
on startup, so the clock shows correct time immediately after restart
without waiting for GPS fix.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 18:23:25 +02:00
Jakub
6cf8544979 feat(wio-tracker-l1): energy optimizations
- CPU sleep: board.sleep(0) in main loop puts NRF52 into WFE/sd_app_evt_wait
  between iterations; wakes on any interrupt (radio, BLE, timer). Largest
  power saving of the three changes.

- VBAT_ENABLE gating: voltage divider now powered only during ADC read
  (HIGH for 10ms, then LOW). Previously stayed HIGH continuously.
  Fixed in both variant.cpp (init) and WioTrackerL1Board::getBattMilliVolts().

- LED off with display: PIN_LED is cleared when auto-off triggers and
  restored (handed back to userLedHandler) when display wakes. Avoids
  idle LED current draw during screen-off periods.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 18:01:59 +02:00
Jakub
a6ef2f703b feat(wio-tracker-l1): add settings screen and companion radio improvements
Settings screen (UI_HAS_JOYSTICK_UPDOWN build variant):
- Display brightness (5 levels, contrast curve tuned for SH1106 non-linearity)
- Buzzer on/off (respected at startup, no more forced unmute)
- TX power (2–22 dBm)
- Auto-off delay (5s / 15s / 30s / 60s / never)
- GPS update interval (off / 30s / 1min / 5min / 15min / 30min)
- Timezone offset (UTC-12..+14) for clock screen
- Low battery auto-shutdown threshold (off / 3.0–3.5V, default 3.4V)
- Battery display mode (icon / % / voltage)

Battery:
- EMA filter (alpha=0.2) on ADC readings to smooth voltage spikes from uneven load
- Battery % calculated using low_batt_mv as 0% anchor
- Mute icon repositions dynamically based on battery display width

Clock screen on HomeScreen showing time/date with timezone support.

Build:
- _settings variants added for USB and BLE companion radio builds
- Automatic UF2 generation on every build via create-uf2.py post-script
- UI_HAS_JOYSTICK_UPDOWN flag guards joystick_up/down to avoid breaking other boards

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 15:18:35 +02:00
Scott Powell
2325973fec * Companion: applyGPSPrefs() now just in one place (moved out of UITask) 2026-03-25 16:26:51 +11:00
Leah
fb025fb67e Add muted icon to show when buzzer is muted 2026-02-11 10:00:20 +01:00
taco
598489be47 refactor ui with ring buffer and display most recent 2026-02-04 09:38:05 +11:00
Steven Linn
44e7c092c8 Add battery min/max voltage parameter support 2026-01-28 22:24:49 -07:00
liquidraver
e855706abb move showalert after saveprefs 2025-12-17 21:27:22 +01:00
fdlamotte
01f7a3c95e Merge pull request #1057 from liquidraver/wiodev
Disable screen switching on when connected
2025-12-04 11:10:51 +01:00
ripplebiz
0082149c60 Merge pull request #996 from mattzzw/dev
Add display of IP address to companion screen
2025-12-03 13:52:48 +11:00
csrutil
39503ad0b4 move GPS preference initialization to UITask 2025-11-29 18:35:34 +08:00
csrutil
c641beabd3 https://github.com/meshcore-dev/MeshCore/issues/989 - persist GPS enabled state to preferences
Add GPS configuration to NodePrefs structure and persist the GPS
enabled state when toggled via UI. This ensures GPS settings are
retained across device restarts.
2025-11-29 16:37:23 +08:00
Florent
1c0017b634 thinknode_m5: gps support 2025-11-28 13:15:11 +01:00
Florent
ee4e87c3ee thinknode_m5: manage baclight 2025-11-28 10:33:19 +01:00
ripplebiz
13bf82f1c4 Merge pull request #1130 from zaquaz/buzzer-feature-pr
Added buzzer config persistance across restart
2025-11-27 16:04:44 +11:00
Frieder Schrempf
048bd268a1 companion: ui: Respect LED_STATE_ON for status LED
The current logic only works for active high LEDs. Some boards need
an active low level control and therefore they set LED_STATE_ON to 0.
Take this into account and use the correct LED pattern for both cases.

Signed-off-by: Frieder Schrempf <frieder@fris.de>
2025-11-22 15:05:08 +01:00
Jaroslav Škarvada
07e7e2d44b companion: Suspend radio when hibernating
This should significantly reduce power consumption in hibernation.

Fixes: #1014

Signed-off-by: Jaroslav Škarvada <jskarvad@redhat.com>
Signed-off-by: Frieder Schrempf <frieder@fris.de> # generalize for all radios and UIs
2025-11-22 15:05:01 +01:00
zaquaz
2bd47de3b9 Added buzzer config persistance accross restart 2025-11-20 19:02:32 -08:00
liquidraver
eae16cfc5f less unnecessary comments, less lines of code :) 2025-11-03 21:39:35 +01:00
liquidraver
397d280c3b stop OLED powering on every message if connected to phone 2025-11-03 21:25:31 +01:00
Adam Mealings
c13b4ae481 Analogue button delay based on millis 2025-10-31 13:04:59 +00:00
Matthias Wientapper
f339c74bb4 * Add #ifdef, reuse variable 2025-10-27 17:58:29 +01:00
Matthias Wientapper
a38418e09a * Add display of IP address to companion screen 2025-10-22 20:01:15 +02:00
Florent
7d62a27836 uitask: bring back buzzer toggle on tracker l1 2025-10-18 13:40:01 +02:00
Scott Powell
cd920693ec * UITask: new UI_HAS_JOYSTICK
* MomentaryButton: new constructor 'multiclick' param
* WIoTrackerL1: now just use joystick, joystick press for KEY_ENTER, no multi-click for snappier UI
2025-10-16 17:33:22 +11:00
Florent de Lamotte
18bfc2d81a DisplayDriver: introduce drawTextRightAlign and drawTextLeftAlign 2025-10-01 18:07:59 +02:00
Florent
db7635102d gps_page: enable if gps enabled 2025-09-28 09:43:28 +02:00
Florent
76aa7cf488 ui_task: initial gps page 2025-09-23 12:08:34 +02:00
ripplebiz
b3e9fd76ce Merge pull request #708 from csrutil/feature/vibration-feedback
 feat: add vibration feedback system
2025-09-18 13:12:36 +10:00
csrutil
6f8ce425d8 remove the unnecessary blank line 2025-09-17 09:19:18 +08:00
csrutil
043f37a08e ♻️ refactor: unify UI notification methods into single notify() function
Consolidates soundBuzzer() and triggerVibration() into a unified notify() method
that handles both audio and haptic feedback based on UIEventType.
2025-09-17 08:56:18 +08:00
csrutil
2da50882c0 feat: add vibration feedback support for UI events
- Add genericVibration class with 5-second cooldown and 1-second pulse
- Integrate vibration triggers for new messages and contact discoveries
- Add conditional compilation support with PIN_VIBRATION guard
- Implement abstract interface for vibration in UITask system
2025-09-17 08:56:18 +08:00
Michael Hart
bd6aa983a3 feat: add DisplayDriver methods for UTF-8 filtering and text ellipsis
- Add translateUTF8ToBlocks() method to convert UTF-8 characters to displayable blocks
- Add drawTextEllipsized() method for text truncation with ellipsis
- Apply UTF-8 filtering to node names, recent contacts, and message content
- Use ellipsized text rendering for recent contacts to prevent overflow
- Addresses PR feedback by moving text processing to DisplayDriver level
2025-09-16 17:17:15 -07:00
Florent de Lamotte
d83cdc501f ui: use LPPDataHelper and conditionals for sensors page 2025-09-09 16:32:41 +02:00
Florent de Lamotte
2d4b77c998 Merge remote-tracking branch 'upstream/dev' into ui_sensors_page 2025-09-09 15:36:14 +02:00
Florent de Lamotte
8fdaaceb1c ui: refresh sensors on gps toggle 2025-09-05 15:35:04 +02:00
Florent de Lamotte
f974cb2a4f ui: ENTER on SENSORS page toggles gps 2025-09-05 15:32:02 +02:00
Florent de Lamotte
2d651221c4 ui: sensors page 2025-09-05 15:20:52 +02:00
recrof
5b2c1715f4 lilygo t-echo cleanup, add AUTO_SHUTDOWN_MILLIVOLTS 2025-09-04 21:45:42 +02:00