2021-08-06 23:27:41 -04:00
|
|
|
use crate::color::Rgb;
|
2021-08-09 23:13:38 -04:00
|
|
|
use serde::Deserialize;
|
2021-08-12 21:06:22 -04:00
|
|
|
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;
|
|
|
|
pub mod moving_pixel;
|
|
|
|
pub mod moving_rainbow;
|
2021-08-09 21:28:42 -04:00
|
|
|
pub mod orb;
|
2021-08-01 19:38:17 -04:00
|
|
|
pub mod solid;
|
|
|
|
pub use collide::Collide;
|
|
|
|
pub use fade::Fade;
|
|
|
|
pub use moving_pixel::MovingPixel;
|
|
|
|
pub use moving_rainbow::MovingRainbow;
|
2021-08-09 21:28:42 -04:00
|
|
|
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-09 23:13:38 -04:00
|
|
|
#[derive(Deserialize, Debug)]
|
2021-08-12 21:06:22 -04:00
|
|
|
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-09 23:13:38 -04:00
|
|
|
MovingRainbow(u8, bool),
|
2021-08-09 23:26:10 -04:00
|
|
|
Orb(Rgb, u8, u8),
|
2021-08-10 17:44:03 -04:00
|
|
|
Solid((Rgb,)),
|
|
|
|
}
|
|
|
|
|
2021-08-12 21:06:22 -04:00
|
|
|
impl Parameters {
|
2021-08-10 17:44:03 -04:00
|
|
|
pub fn to_pattern(&self) -> Box<dyn Pattern + Send + Sync> {
|
|
|
|
match self {
|
2021-08-12 21:06:22 -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)),
|
|
|
|
Self::MovingRainbow(w, f) => Box::new(MovingRainbow::new(*w, *f)),
|
|
|
|
Self::Orb(c, x, y) => Box::new(Orb::new(*c, *x, *y)),
|
|
|
|
Self::Solid((c,)) => Box::new(Solid::new(*c)),
|
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 {
|
2021-08-06 20:32:16 -04:00
|
|
|
fn init(&mut self, num_lights: u16) -> Result<(), ()>;
|
|
|
|
fn step(&mut self) -> Result<bool, ()>;
|
2021-08-12 21:06:22 -04:00
|
|
|
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() {}
|
|
|
|
// }
|