feat: initial lora-dongle firmware scaffold
Transparent LoRa-over-USB dongle firmware supporting Heltec V3 (ESP32-S3) and RAK 4631 (nRF52840) boards. Actor-model architecture with typed channels between USB, radio, and display tasks. - Protocol: Command/Response enums with COBS+postcard framing design - Board abstraction: auto-discovered via build.rs Jinja2 codegen - Radio task: SX1262 state machine (Idle → Receiving ↔ Transmitting) - Display task: optional SSD1306 dashboard via StatusWatch - RAK 4631: fully wired SPI/USB/I2C peripherals, clippy-clean - Heltec V3: structure in place, awaits espup Xtensa toolchain
This commit is contained in:
20 files changed
+2599
No files matched your search
+39
@@ -0,0 +1,39 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
mod board;
|
||||
mod channel;
|
||||
mod display;
|
||||
mod error;
|
||||
mod protocol;
|
||||
mod radio;
|
||||
mod usb;
|
||||
|
||||
use embassy_executor::Spawner;
|
||||
|
||||
use crate::channel::{CommandChannel, ResponseChannel, StatusWatch};
|
||||
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(feature = "rak_4631")] {
|
||||
use panic_probe as _;
|
||||
} else if #[cfg(feature = "heltec_v3")] {
|
||||
use esp_backtrace as _;
|
||||
}
|
||||
}
|
||||
|
||||
static COMMANDS: CommandChannel = CommandChannel::new();
|
||||
static RESPONSES: ResponseChannel = ResponseChannel::new();
|
||||
static STATUS: StatusWatch = StatusWatch::new();
|
||||
|
||||
#[embassy_executor::main]
|
||||
async fn main(spawner: Spawner) {
|
||||
let board = board::Board::init();
|
||||
let (radio, usb, display) = board.into_parts();
|
||||
|
||||
spawner.spawn(radio::radio_task(radio, &COMMANDS, &RESPONSES, &STATUS)).unwrap();
|
||||
spawner.spawn(usb::usb_task(usb, &COMMANDS, &RESPONSES)).unwrap();
|
||||
|
||||
if let Some(dp) = display {
|
||||
spawner.spawn(display::display_task(dp, &STATUS)).unwrap();
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user