use rppal::spi::{Bus, Mode, SlaveSelect, Spi}; use smart_leds::SmartLedsWrite; use std::error::Error; use ws2812_spi::Ws2812; const SPI_CLOCK_SPEED: u32 = 3_800_000; pub trait StatusLed { fn turn_off(&mut self) -> Result<(), Box>; fn turn_on(&mut self, color: rgb::RGB8) -> Result<(), Box>; } pub struct SpiLed { controller: Ws2812, } impl SpiLed { pub fn new() -> Result { let spi = Spi::new(Bus::Spi0, SlaveSelect::Ss0, SPI_CLOCK_SPEED, Mode::Mode0)?; let controller = Ws2812::new(spi); Ok(SpiLed { controller }) } } impl StatusLed for SpiLed { fn turn_off(&mut self) -> Result<(), Box> { self.controller .write(vec![rgb::RGB8::new(0, 0, 0)].into_iter())?; Ok(()) } fn turn_on(&mut self, color: rgb::RGB8) -> Result<(), Box> { self.controller.write(vec![color].into_iter())?; Ok(()) } }