- Add lib/GxEPD2-patch/src/GxEPD2_BW.h: local patched copy of GxEPD2_BW.h
that exposes getBuffer()/getBufferSize() under ENABLE_SCREENSHOT guard.
Include guard (_GxEPD2_BW_H_) prevents double-inclusion of the installed
library version.
- GxEPDDisplay.h: use patched header via relative include when
ENABLE_SCREENSHOT so the patch takes precedence over the installed lib
(PlatformIO adds library paths before -I build_flags).
- DisplayDriver.h: add virtual getBuffer()/getBufferSize()/getDisplayType()
defaults (nullptr/0/0) under ENABLE_SCREENSHOT.
- SH1106Display.h / SSD1306Display.h / GxEPDDisplay.h: add concrete overrides;
getDisplayType() returns 0 (OLED) or 1 (e-ink).
- MyMesh.cpp/h: replace fragile C-cast with virtual dispatch in
handleScreenshotRequest(); extend 5-byte header to 6 bytes by appending
display_type so the host tool can decode the correct pixel layout.
- tools/screenshot.py: parse 6-byte header; add eink_buffer_to_image()
that decodes the row-major MSB-first GxEPD2 buffer with DISPLAY_ROTATION=1
(phys_x = 127-ly, phys_y = lx); dispatch on display_type.
- variants/wio-tracker-l1-eink/platformio.ini: add
[env:WioTrackerL1Eink_companion_dual_dev] with ENABLE_SCREENSHOT.
- variants/wio-tracker-l1/platformio.ini: unchanged (OLED env already exists).
Builds verified: WioTrackerL1Eink_companion_dual_dev SUCCESS,
WioTrackerL1Eink_companion_radio_ble SUCCESS (unaffected).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add MESHCORE_VERSION build flag ("1.15") to companion base configs.
Splash screen now shows MESHCORE_VERSION in the large text and the
plus firmware version (stripped of commit hash) in the Plus bar,
e.g. "1.15" large + "Plus v1.11 for Wio" below.
Change CI tag pattern to v* and simplify version extraction so tag
v1.11 maps directly to FIRMWARE_VERSION=v1.11.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Rename WioTrackerL1_companion_radio_dual_settings → WioTrackerL1_companion_dual
and WioTrackerL1Eink_companion_radio_dual → WioTrackerL1Eink_companion_dual.
Fix CI workflow: remove hardcoded branch refs so both build jobs check out
the tagged commit; add version extraction to each build job (previously
GIT_TAG_VERSION was only set in the release job, leaving FIRMWARE_VERSION
empty during builds); update build commands to use new env names.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Display rotation is now a runtime setting (Settings → Rotation), so separate
build targets for landscape/portrait are redundant. Collapsed four envs into two:
WioTrackerL1Eink_companion_radio_ble — BLE only
WioTrackerL1Eink_companion_radio_dual — BLE + USB (DUAL_SERIAL)
Default DISPLAY_ROTATION=1 (landscape, 250×122) moved to the shared base
section; users adjust orientation via the in-app Settings screen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove fixed 128×128 virtual space and scaling; use 1:1 pixel mapping
- Display dimensions derived from panel native size + DISPLAY_ROTATION
- setCursor compensates for GFX font baseline offset (ascender per font size)
- Add getLineHeight() / getCharWidth() overrides for FreeSans fonts
- New envs: landscape (250×122) and portrait (122×250), BLE and dual variants
- Integrate all wio-tracker-l1-improvements features into e-ink build
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- DualSerialInterface: guard writeFrame/isWriteBusy/isBLEConnected with
_ble_enabled to avoid BLE-after-disable race
- NearbyScreen: initialize all fields in constructor; promote D_* layout
constants to class scope; clamp _dscroll on result count change;
replace hardcoded 2 with D_VISIBLE in scroll logic; allow re-scan
from detail view via KEY_CONTEXT_MENU/KEY_ENTER
- variant.cpp: fix inconsistent indentation in initVariant()
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- DualSerialInterface: enable()/disable() control BLE only, USB always on;
USB state machine not read while BLE connected to avoid partial-frame
corruption; reset USB on BLE disconnect for clean reconnect
- Fix -UBLE_DEBUG_LOGGING (no space) to avoid PlatformIO SCons parse error
- build.sh: drop separate USB/BLE builds, dual_settings only
- wio-tracker-l1-eink: enable DUAL_SERIAL in companion_radio_ble build
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
BLE takes priority when connected; USB is always ready as fallback.
Both state machines run continuously — no BLE disconnect on USB connect.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Moved UI_HAS_JOYSTICK_UPDOWN=1 from _settings-only variants to the
WioTrackerL1CompanionBLE and WioTrackerL1CompanionUSB base configs.
The hardware always had the up/down buttons; the flag was only in
_settings as a temporary testing boundary.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
UI_SENSORS_PAGE=1 activates the existing sensor display screen in
HomeScreen — shows temperature, pressure, humidity, voltage and other
LPP-formatted sensor data from connected I2C sensors (BME280, etc.).
BME280 support is already included via sensor_base build flags.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
build.sh sets FIRMWARE_VERSION via PLATFORMIO_BUILD_FLAGS — hardcoding
it in platformio.ini caused a macro redefinition conflict. Instead,
build_wio_tracker_l1_firmwares() now appends "-Plus" to the env var
before calling build_firmware(), so the final version string becomes
e.g. v1.15.0-Plus-abcdef.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Override the upstream FIRMWARE_VERSION define via build_flags so all
companion radio builds (USB and BLE) show "v1.15.0-Plus" on the splash
screen. The #ifndef guard in MyMesh.h makes this override automatic.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
The Waveshare RP2040-LoRa board has an RF switch with two complementary
control lines:
- DIO2 (CTRL) -- driven automatically by the SX1262 chip: HIGH on TX,
LOW on RX
- GPIO17 (!CTRL) -- was not configured in MeshCore, so it floated and
the switch never properly selected the LNA/RX path
Without this pin driven, the RF switch never switches to RX mode,
resulting in completely degraded reception. TX was unaffected because
DIO2 alone is sufficient to activate the TX path.
Adding SX126X_RXEN=17 lets RadioLib drive GPIO17 as the complement of
DIO2, so the switch correctly routes the signal to the LNA on receive.
Reference: https://files.waveshare.com/wiki/RP2040-LoRa/Rp2040-lora-sch.pdf
variants/thinknode_m5/platformio.ini contained actual WiFi SSID and
password credentials (Livebox-633C) committed by mistake. Replaced
with placeholder values consistent with other variants (myssid/mypwd).
env:Generic_ESPNOW_room_svr was using 'Heltec Room' as ADVERT_NAME,
causing Generic ESPNow room server nodes to advertise with the wrong
device name on the mesh.
Repeater and Room Server environments in variants/thinknode_m5/platformio.ini
were using 'Thinknode M2' as the ADVERT_NAME, causing M5 nodes to advertise
with the wrong device name on the mesh.
- env:ThinkNode_M5_Repeater: 'Thinknode M2 Repeater' -> 'Thinknode M5 Repeater'
- env:ThinkNode_M5_room_server: 'Thinknode M2 Room Server' -> 'Thinknode M5 Room Server'