aw-lights/src/pattern.rs

90 lines
2.6 KiB
Rust
Raw Normal View History

2021-08-06 23:27:41 -04:00
use crate::color::Rgb;
2021-08-15 13:43:27 -04:00
use serde::{Deserialize, Serialize};
use std::collections::vec_deque;
2021-07-31 14:29:21 -04:00
2021-08-01 19:38:17 -04:00
pub mod collide;
pub mod fade;
2021-08-15 14:18:18 -04:00
pub mod flashing;
2021-08-01 19:38:17 -04:00
pub mod moving_pixel;
pub mod moving_rainbow;
pub mod orb;
2021-08-01 19:38:17 -04:00
pub mod solid;
pub use collide::Collide;
pub use fade::Fade;
2021-08-15 14:18:18 -04:00
pub use flashing::Flashing;
2021-08-01 19:38:17 -04:00
pub use moving_pixel::MovingPixel;
pub use moving_rainbow::MovingRainbow;
pub use orb::Orb;
2021-08-01 19:38:17 -04:00
pub use solid::Solid;
2021-07-31 14:29:21 -04:00
2021-08-15 13:43:27 -04:00
#[derive(Serialize, Deserialize, Debug)]
pub enum Parameters {
2021-08-09 23:26:10 -04:00
Collide(Rgb, Rgb, Rgb),
2021-08-10 17:44:03 -04:00
Fade((Rgb,)),
MovingPixel((Rgb,)),
2021-08-15 20:45:33 -04:00
MovingRainbow(u8, bool, u8),
2021-08-09 23:26:10 -04:00
Orb(Rgb, u8, u8),
2021-08-10 17:44:03 -04:00
Solid((Rgb,)),
2021-08-15 19:32:54 -04:00
Flashing(Vec<Rgb>, u8, u16),
2021-08-10 17:44:03 -04:00
}
impl Parameters {
2021-08-15 14:18:18 -04:00
pub fn into_pattern(self) -> Box<dyn Pattern + Send + Sync> {
2021-08-10 17:44:03 -04:00
match self {
2021-08-15 14:18:18 -04:00
Self::Collide(l, r, c) => Box::new(Collide::new(l, r, c)),
Self::Fade((c,)) => Box::new(Fade::new(c)),
Self::MovingPixel((c,)) => Box::new(MovingPixel::new(c)),
2021-08-15 20:45:33 -04:00
Self::MovingRainbow(w, f, s) => Box::new(MovingRainbow::new(w, f, s)),
2021-08-15 14:18:18 -04:00
Self::Orb(c, x, y) => Box::new(Orb::new(c, x, y)),
Self::Solid((c,)) => Box::new(Solid::new(c)),
2021-08-15 19:32:54 -04:00
Self::Flashing(cs, w, r) => Box::new(Flashing::new(cs, w, r)),
2021-08-10 17:44:03 -04:00
}
}
2021-08-09 23:13:38 -04:00
}
2021-08-10 17:44:03 -04:00
pub trait Pattern: std::fmt::Debug + Send + Sync {
fn init(&mut self, num_lights: u16) -> Result<(), ()>;
fn step(&mut self) -> Result<bool, ()>;
fn get_strip(&self) -> vec_deque::Iter<Rgb>;
2021-07-31 14:29:21 -04:00
}
2021-08-01 19:38:17 -04:00
// #[cfg(test)]
// mod tests {
// use super::*;
// const NUM_LIGHTS: u16 = 10;
2021-08-06 23:27:41 -04:00
// fn test_strip() -> Vec<Rgb> {
2021-08-01 19:38:17 -04:00
// vec![color::BLACK; NUM_LIGHTS.into()]
// }
// #[test]
// fn moving_pixel() {
2021-08-06 23:27:41 -04:00
// let color = Rgb(123, 152, 89);
2021-08-01 19:38:17 -04:00
// let mut pat = MovingPixel::new(color.clone());
// let mut strip = test_strip();
// assert!(pat.init(&mut strip, NUM_LIGHTS).is_ok());
// // One is my color
// assert_eq!(strip.iter().filter(|c| **c == color).count(), 1);
// // The rest are off
// assert_eq!(
// strip.iter().filter(|c| **c == color::BLACK).count(),
// (NUM_LIGHTS - 1).into()
// );
// pat.step(&mut strip);
// // One is my color
// assert_eq!(strip.iter().filter(|c| **c == color).count(), 1);
// // The rest are off
// assert_eq!(
// strip.iter().filter(|c| **c == color::BLACK).count(),
// (NUM_LIGHTS - 1).into()
// );
// }
// #[test]
// fn solid() {}
// #[test]
// fn moving_rainbow() {}
// #[test]
// fn fade() {}
// #[test]
// fn collide() {}
// }