6.9 KiB
6.9 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
[0.4.0] - 2026-04-11
Added
- ELECROW ThinkNode-M2 board support (ESP32-S3 + SX1262 + 1.3" SH1106 OLED
via CP2102 UART bridge, 1000 mAh Li-Po handheld)
- Pin map verified against Meshtastic's
variants/esp32s3/ELECROW-ThinkNode-M2 - DIO3 TCXO driven at 3.3 V (not 1.8 V like Heltec)
- Dedicated
LORA_POWER_EN(GPIO48) sequenced HIGH before SPI init VEXT_ENABLE(GPIO46) is active HIGH — opposite polarity from Heltec- Reuses the existing async SH1106 driver at I2C address 0x3C
- Pin map verified against Meshtastic's
Changed
hal::esp32s3::{init_spi, init_i2c}andboard::esp32s3::init_radioare now generic over GPIO type, so ESP32-S3 boards with different pin assignments can share the helpers.board::esp32s3::init_radiotakes aTcxoCtrlVoltageparameter instead of hardcodingCtrl1V8— needed for ThinkNode-M2's 3.3 V TCXO.- SSD1306 display items in
board::esp32s3are now cfg-gated to Heltec boards (ThinkNode-M2 supplies its own SH1106create_display). justfileusescargo +espfor Xtensa targets instead ofcargo +nightlywith aRUSTC=espoverride — the self-contained esp toolchain keeps its cargo, rustc, and rust-src versions aligned. Public nightly's rust-src had drifted ahead of the esp fork, breaking-Zbuild-std.- Migrated to embassy-executor 0.10 and embassy-rp 0.10
- ESP crates (esp-hal, esp-rtos, esp-backtrace, esp-println) patched from esp-rs/esp-hal main branch until esp-rtos publishes with 0.10 support
- Adapted to embassy-executor 0.10 SpawnToken API (task functions now return
Result<SpawnToken, SpawnError>,Spawner::spawnno longer returns Result) - Adapted to esp-hal main branch API changes:
efuse::base_mac_address(),esp_rtos::startnow requiresSoftwareInterrupt, embassy-rp SPI constructor now requires DMA interrupt bindings just checknow runs clippy with-D warningsinstead of plaincargo check- Rust toolchain bumped to 1.94 in mise.toml
Fixed
core::mem::forget(output)pattern in ESP32-S3 board files is nowlet _vext = Output::new(...)— current esp-hal makesOutputnon-Drop, which madeforgeta no-op and tripped clippy'sforget_non_droplint.- UART boards (heltec_v3_uart) display stuck on splash screen after boot.
Host task sent
DisplayCommand::Reset(which sets disconnected=true) instead ofDisplayCommand::On. UART has no DTR, so nothing ever cleared it.
[0.3.0] - 2026-04-10
Added
- Waveshare RP2040-LoRa board support (RP2040 + SX1262, no OLED, LED on GPIO25)
- First RP2040 board — third MCU family after ESP32-S3 and nRF52840
- New
hal/rp2040.rsmodule with MCU primitives (SPI, USB, flash unique ID) - USB-C via FPC ribbon cable to adapter board
- PE4259 antenna switch on GPIO17, 850-930 MHz (HF)
Changed
cortex-m-rt/set-vtormoved from global dependency to per-board feature (Cortex-M0+ has no VTOR register)build.rsmemory.x selection is now target-aware (thumbv6m vs thumbv7em)
[0.2.1] - 2026-04-07
Fixed
- Display stuck on status screen after USB disconnect (stale radio status
updates re-rendered dashboard over splash because
disconnectedflag was not set in theResethandler) - Radio left running after host disconnect, now sends
StopRxwhen DTR drops - System deadlock when host app closes serial port while radio is receiving
(unsolicited responses in radio task now use
try_sendto avoid blocking on a full response channel) - LED orphaned if OLED display initialization fails (display task now falls back to a LED-only event loop instead of returning early)
[0.2.0] - 2026-04-07
Added
- Wio Tracker L1 board support (nRF52840 + SX1262, SH1106 OLED)
- LED blink on packet activity: brief flash on RX and TX when display is on
- RX brightness scales with SNR (stronger signal = brighter)
- Works on all boards with a user LED (Heltec V3/V4, Wio Tracker)
- Native USB CDC-ACM support for Heltec V3 (requires hardware mod: solder R29/R3)
heltec_v3_uartfeature for stock (unmodified) V3 boards via CP2102 bridgeRgbLedtrait andSimpleLeddriver for GPIO-based LEDsLoRaBoardtrait with full associated types (RadioParts,CommParts,DisplayParts,DisplayDriver,LedDriver) andBoardParts<R, C, D, L>struct
Changed
- Major firmware architecture reorganization:
hal/module for MCU-specific primitives (ESP32-S3, nRF52840)driver/module for hardware peripheral drivers (SH1106, SimpleLed)host/module for unified USB/UART communication with internal cfg dispatchboard/contains only board definitions — no MCU helpers or drivers mixed in- Board files are declarative wiring diagrams calling hal primitives
run()function has zero board-specific conditional compilation- Display init moved to board layer (
create_display()) — display task has no cfg - Flattened
radio/anddisplay/directories (no single-file directories) build.rsauto-discovers boards by content (implementsLoRaBoard) and helper modules byuse super::imports — no exclusion listscheckandclippycommands now use--releaseprofile- Deduplicated USB/UART protocol framing (shared
CobsDecoder+route_command) - Removed
ErrorCode::CrcError(SX1262 silently drops bad-CRC packets)
Fixed
- Display stuck on splash screen for UART boards (disconnected flag started true)
[0.1.0] - 2026-03-15
Added
- Transparent LoRa radio over USB CDC-ACM (VID
1209, PID5741) - COBS-framed fixed-size LE binary protocol (9 commands, 7 responses)
- Radio configuration: frequency, bandwidth, spreading factor, coding rate, TX power
- Continuous RX mode with RSSI/SNR per packet
- Single-shot TX with optional per-packet config override
- SSD1306 OLED display support with status dashboard
- Radio state, frequency, modulation parameters
- Packet counters (RX/TX)
- RSSI sparkline (1-minute history, TX shown as dotted bars)
- Combined splash/waiting screen on disconnect
- Auto-detect USB host connect/disconnect via DTR
- Config validation against per-board hardware limits
TX_POWER_MAXsentinel (-128): auto-use the board's maximum TX power- Board support: Heltec V3, Heltec V4, RAK WisBlock 4631
- Python host library (
dongloraon PyPI) withpip installanddonglora-muxCLI - USB multiplexer for sharing one dongle with multiple applications
- Two-way LoRa bridge over TCP (
examples/lora_bridge.py)
Technical
- Embassy async runtime (no threads, CPU sleeps when idle)
- Zero-config: boots and waits for host commands
- Protocol-agnostic: firmware has no opinion about what you transmit
- Tasks never panic: all errors reported to host or logged
- Board abstraction: one
.rsfile + one Cargo feature per board