use super::delay; use house::Harrogate; use lights::rgb::{blend, blend_steps, linear_gradient, Rgb}; use lights::{HardwareRgb, Lights}; const OFF: Rgb = Rgb(0, 0, 0); const CYAN: Rgb = Rgb(0, 128, 200); const BLUE: Rgb = Rgb(0, 0, 200); const PURPLE: Rgb = Rgb(128, 0, 128); const WHITE: Rgb = Rgb(255, 255, 255); const PULSE_LEN: usize = 50; const SEGMENT_LEN: usize = 20; const ZOOM: usize = 10; const ZOOM_SEGMENT_LEN: usize = SEGMENT_LEN * ZOOM + ZOOM; const HALF_PORCH: usize = 75; const FULL_PORCH: usize = 150; #[allow(dead_code)] #[inline(always)] pub fn run(lights: &mut impl Lights) -> ! { let mut color_pulse = linear_gradient(CYAN, BLUE, PULSE_LEN) .chain(linear_gradient(BLUE, PURPLE, PULSE_LEN)) .chain(linear_gradient(PURPLE, CYAN, PULSE_LEN)) .cycle(); let mut t = 0; loop { // advance "time" for pattern t += 1; if t > ZOOM_SEGMENT_LEN { t = 0; } let color = color_pulse.next().unwrap_or(Rgb(255, 0, 0)); let half_pattern_func = |i| { let x = (i * ZOOM) + t; let x = x % ZOOM_SEGMENT_LEN; match x { x if x > SEGMENT_LEN * ZOOM => { blend_steps(WHITE, OFF, ZOOM, x - SEGMENT_LEN * ZOOM) } x => blend_steps(OFF, WHITE, SEGMENT_LEN * ZOOM, x), } }; let pattern_func = |i| match i { i if i < HALF_PORCH => half_pattern_func(i), i => half_pattern_func(FULL_PORCH - i), }; Harrogate { porch_back: (0..FULL_PORCH).map(pattern_func), porch_front: (0..FULL_PORCH) .map(pattern_func) .map(|b| blend(color, WHITE, b)), } .render_to(lights); delay(48_000_000); } }