- improve MeshCore BLE security, pairing, MTU handling and passkey popup behavior
- align Meshtastic ack, traceroute and MQTT proxy handling with companion expectations
- extract shared two-pane nav/layout/style components and migrate chat, contacts and settings
- simplify tracker and contacts list interaction, scrolling and visual consistency
* Implement TDeck touch-friendly home grid and power management updates
* Add initial M5Stack Tab5 ESP-IDF environment and board skeleton
* BLE/Meshtastic: apply config at runtime and fix Admin/Telemetry for app compatibility
Meshtastic Admin set_* immediate responses:
- After set_channel: respond with get_channel_response (echo applied channel).
- After set_config: respond with get_config_response for the config type that was set.
- After set_module_config: respond with get_module_config_response after saveModuleConfig().
- After store_ui_config: respond with get_ui_config_response.
This prevents the Meshtastic app from marking these operations as failed when the device applied config but did not send a reply.
DeviceMetrics and Telemetry:
- Add buildDeviceMetrics() in meshtastic_ble (battery from board, uptime_seconds from millis).
- Set has_device_metrics and device_metrics in buildSelfNodeInfo() so the app receives battery and uptime for the local node.
- Give Telemetry module config explicit defaults in loadModuleConfig() (device_update_interval, device_telemetry_enabled, etc.) so get_module_config returns a valid structure.
Apply config at runtime (so BLE-written config takes effect):
- Add AppContext::applyPositionConfig() to push gps_interval_ms and gps_mode to GpsService (setCollectionInterval, setGnssConfig). Call it from BLE set_config when position config is written.
- Add screen_sleep.h with getScreenSleepTimeout() / setScreenSleepTimeout() declarations (implemented in main.cpp). BLE display, device_ui, and store_ui_config now call setScreenSleepTimeout() instead of writing Preferences only, so the in-memory screen timeout updates immediately without reboot.
- Settings UI includes screen_sleep.h and uses the same API.
Other:
- BLE topbar asset and icon when BLE is enabled (ble_topbar.png/c, ui_status, LV_Helper).
- Node store: PersistedNodeEntry and INodeStore gain hw_model; mt_adapter and contact_service pass/store it for Meshtastic app compatibility.
- Variant env tweaks (tlora_pager, tdeck). Event bus and minor cleanups.
* feat: align Meshtastic BLE/iOS flow and add T-Deck keyboard support
- add BLE pairing popup and align more Meshtastic admin/status behavior with iOS expectations
- complete BLE MQTT client proxy bridge and persist OK-to-MQTT / ignore-MQTT channel settings
- add native T-Deck I2C keyboard input, backlight control, and SPACE-to-menu behavior
- fix chat bubble wrapping, contact removal sync, and pager wake/menu regressions
* fix: restore lilygo_twatch_s3 build
- remove duplicate M5Tab5Board isGPSReady declaration
- exclude M5Tab5Board.cpp from T-Watch S3 source filters to avoid duplicate board singletons
- verified with pio run -e lilygo_twatch_s3
Add a thread-safe mesh adapter router and route AppContext through it so MeshProtocol can switch backend adapters at runtime without stale state.\n\nWire CMD_SET_CONFIG MeshProtocol updates to runtime backend switching before persisting config, emit EV_STATUS immediately after HELLO handshake, and document protocol-aware decode guidance for HostLink clients.
- complete MeshCore protocol alignment work across chat/team/hostlink paths
- refactor Contacts Discover into a mode-based action list for consistent UI behavior
- add MeshCore identity/crypto persistence plumbing and related protocol handlers
- document Meshtastic + MeshCore dual-compatibility in README (EN/CN)
Apply remaining cross-module updates covering HostLink bridge handling, chat/contact storage and event-flow tuning, GPS/track recorder SPI coordination, and USB mode Wi-Fi behavior.
Complete UI refinements for contacts, team, GPS, and GNSS skyplot interactions, including T-Deck layout/input behavior improvements and related state plumbing.
Enable LVGL touchpad input for the T-Deck environment and wire GT911 touch initialization/point reading in TDeckBoard (with orientation mapping aligned to LilyGo reference behavior).
Improve runtime smoothness after SD insertion by raising T-Deck SD init SPI speed from 800kHz to 4MHz while keeping fallback retries, and reduce periodic SD pressure by caching Team UI snapshot reads in ui_status.
Also harden T-Deck board runtime behavior by enabling PMU battery measurement channels, adding ADC-based battery fallback/anti-drop guards, and tightening RTC readiness to require a sane epoch.
This commit closes the PC-to-device app-data send path and wires team location semantics end to end across protocol, service, and UI.
HostLink protocol and runtime:
- Add CMD_TX_APP_DATA (0x15) frame type and CapTxAppData capability bit.
- Implement command parsing for portnum/to/channel/flags/payload and validate payload bounds.
- Add a pending command queue and process commands from AppContext::update() to keep IO task light and avoid direct service execution in the USB thread.
- Route Team app portnums (300..304) to TeamController send paths, including Team mgmt wire decoding and plain/encrypted mgmt selection via flags.
- Preserve generic mesh sendAppData fallback for non-Team app portnums.
- Update hostlink protocol docs with CMD_TX_APP_DATA payload, flags, and Team source mapping/compat notes.
Team service/controller send path:
- Extend TeamController and TeamService send APIs with dest and want_ack parameters for mgmt/chat/position/waypoint/track.
- Add explicit send error mapping for hostlink result reporting and improve last_send_error assignment on encode/encrypt/mesh failures.
UI and data model for semantic location markers:
- Add TeamLocationMarker icon enum helpers and integrate source->icon mapping in UI rendering.
- Update team chat compose Position action to open a marker picker dialog with icon choices and cancel flow.
- Encode selected marker in TeamChatLocation.source, auto-fill label, and send as TEAM_CHAT location payload.
- Extend ChatMessage model with team_location_icon and geo fields so conversation and map can render marker semantics.
- Show semantic icon in team conversation message bubble when location source is a known marker.
- Add GPS map overlay for recent semantic team location markers with member/time labels and lifecycle cleanup.
Assets and docs:
- Add LVGL image assets for AreaCleared/BaseCamp/GoodFind/Rally/SOS markers and source PNGs.
- Update TEAM/HostLink docs with source enum mapping and unknown-value fallback guidance for PC clients.
Other platform-specific input adjustment:
- Refine T-Deck LVGL encoder data reset path to avoid stale state interactions in the input callback.
Implement a real TDeckBoard::setBrightness() path instead of only updating an in-memory value.
Code changes:
- Move setBrightness override in TDeckBoard.h from inline stub to cpp implementation.
- In TDeckBoard.cpp, persist brightness state, guard on display readiness, and drive DISP_BL pin HIGH/LOW so brightness=0 physically disables backlight.
- Keep LilyGoDispArduinoSPI brightness state in sync via LilyGoDispArduinoSPI::setBrightness(level).
- Refine trackball rotary handling to edge-based detection with lower debounce/repeat latency, and re-arm click on stable release to avoid sticky one-shot behavior.
Impact:
- Auto sleep in screenSleepTask now has visible effect on T-Deck because setBrightness(0) controls hardware backlight.
- Rotary input behavior remains responsive while reducing mixed-direction/sticky states.
* feat: PA adjust
* feat: topbar status icon
* fix: settings bug
* feat: unify UI theme and node info link stats
* Improve mesh handling, input back actions, and keyboard alt symbols
- add IRQ/NVS diagnostics for radio and persistence
- refresh link stats and adjust NodeInfo/Position reply handling
- handle Backspace to trigger page back actions
- make Alt act as symbol modifier and rename GPS menu to Map
* fix: hostlink
* style: format