mod led;
use crate::bus::memory_map::*;
use crate::Bus;
pub use led::Rgbw;
#[derive(Debug)]
pub struct Everloop<'a> {
bus: &'a Bus,
}
impl<'a> Everloop<'a> {
pub fn new(bus: &Bus) -> Everloop {
Everloop { bus }
}
pub fn set(&self, leds: &[Rgbw]) {
if leds.len() > self.bus.device_leds as usize {
panic!(
"Invalid LED set. This device only has {} LEDs",
self.bus.device_leds
);
}
let mut request = Vec::with_capacity(self.bus.device_leds as usize + 2);
request.push(fpga_address::EVERLOOP as i32);
request.push((self.bus.device_leds * 4) as i32);
for led in leds {
request
.push(unsafe { std::mem::transmute::<[u8; 4], i32>([led.r, led.g, led.b, led.w]) });
}
for _ in 0..(request.capacity() - request.len()) {
request.push(unsafe { std::mem::transmute::<[u8; 4], i32>([0, 0, 0, 0]) })
}
self.bus
.write(unsafe { std::mem::transmute::<&mut Vec<i32>, &mut Vec<u8>>(&mut request) });
}
pub fn set_all(&self, color: Rgbw) {
let mut leds = Vec::new();
leds.extend(std::iter::repeat(color).take(self.bus.device_leds as usize));
self.set(&leds)
}
}