feat: RGB LED support — blinks green on RX, red on TX
- Added RgbLed trait with impl on () for boards without LED - Added WS2812 driver (driver/ws2812.rs) using ESP32-S3 RMT peripheral - 80MHz clock, 12.5ns resolution, 24-bit GRB encoding - Zero extra crate dependencies - Heltec V3/V3-UART/V4: WS2812B on GPIO38 via RMT channel 0 - RAK WisBlock/Wio Tracker: type LedDriver = (), led = None (no-op) - Display task: green blink on RX packet, red blink on TX packet - LED auto-off on timer tick (~1s), off when display is off/reset - LoRaBoard trait gains type LedDriver: RgbLed associated type - BoardParts gains led: Option<L> field
This commit is contained in:
11 files changed
+157
-20
No files matched your search
@@ -7,9 +7,12 @@
|
||||
//! use the `heltec_v3` feature instead for native USB CDC-ACM support.
|
||||
|
||||
use esp_hal::gpio::{Level, Output, OutputConfig};
|
||||
use esp_hal::rmt::{Rmt, TxChannelConfig, TxChannelCreator};
|
||||
use esp_hal::time::Rate;
|
||||
|
||||
use super::esp32s3;
|
||||
use super::traits::{BoardParts, LoRaBoard};
|
||||
use crate::driver::ws2812::Ws2812;
|
||||
use crate::hal::esp32s3 as mcu;
|
||||
|
||||
pub use super::esp32s3::{
|
||||
@@ -17,6 +20,7 @@ pub use super::esp32s3::{
|
||||
};
|
||||
|
||||
pub type UartDriver = esp_hal::uart::Uart<'static, esp_hal::Async>;
|
||||
pub type LedDriver = Ws2812;
|
||||
|
||||
pub struct UartParts {
|
||||
pub driver: UartDriver,
|
||||
@@ -34,6 +38,7 @@ impl LoRaBoard for Board {
|
||||
type CommParts = UartParts;
|
||||
type DisplayParts = DisplayParts;
|
||||
type DisplayDriver = DisplayDriver;
|
||||
type LedDriver = Ws2812;
|
||||
|
||||
fn init() -> Self {
|
||||
let p = esp_hal::init(esp_hal::Config::default());
|
||||
@@ -44,7 +49,7 @@ impl LoRaBoard for Board {
|
||||
mcu::mac_address()
|
||||
}
|
||||
|
||||
fn into_parts(self) -> BoardParts<RadioParts, UartParts, DisplayParts> {
|
||||
fn into_parts(self) -> BoardParts<RadioParts, UartParts, DisplayParts, Ws2812> {
|
||||
let p = self.p;
|
||||
|
||||
mcu::start_timer(p.TIMG0);
|
||||
@@ -75,10 +80,20 @@ impl LoRaBoard for Board {
|
||||
let i2c = mcu::init_i2c(p.I2C0, p.GPIO17, p.GPIO18);
|
||||
let display = Some(DisplayParts { i2c });
|
||||
|
||||
// WS2812B RGB LED on GPIO38 via RMT channel 0
|
||||
let rmt = Rmt::new(p.RMT, Rate::from_mhz(80))
|
||||
.expect("RMT init")
|
||||
.into_async();
|
||||
let led_channel = rmt.channel0
|
||||
.configure_tx(p.GPIO38, TxChannelConfig::default().with_clk_divider(1).with_idle_output(true))
|
||||
.expect("RMT TX channel init");
|
||||
let led = Some(Ws2812::new(led_channel));
|
||||
|
||||
BoardParts {
|
||||
radio,
|
||||
host,
|
||||
display,
|
||||
led,
|
||||
mac: Self::mac_address(),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user