holiday_lights/harrogate/src/halloween_2020.rs

60 lines
1.7 KiB
Rust

//! orange-and-purple with "lightning" flashes
use super::delay;
use house::{Harrogate, PORCH_BACK_LEN, PORCH_FRONT_LEN};
use lights::{murmurf, rgb::Rgb, HardwareRgb, Lights};
const BLACK: Rgb = Rgb(0, 0, 0);
const DIM: Rgb = Rgb(92, 92, 92);
const LIGHTNING: Rgb = Rgb(255, 255, 220);
const ORANGE: Rgb = Rgb(255, 150, 0);
const PURPLE: Rgb = Rgb(100, 0, 128);
// tenth of a second
const TIC: u32 = 4_800_000;
#[allow(dead_code)]
#[inline(always)]
pub fn run(lights: &mut impl Lights<Pixel = HardwareRgb>) -> ! {
let mut rng = 0xB00u32;
let mut back_buffer = [BLACK; PORCH_BACK_LEN];
let mut draw = |back_buffer: &[Rgb]| {
let front_pattern = [PURPLE, ORANGE].iter().cycle().cloned();
Harrogate {
porch_front: front_pattern.take(PORCH_FRONT_LEN),
porch_back: back_buffer.iter().cloned(),
}
.render_to(lights);
};
loop {
// clear
back_buffer.iter_mut().for_each(|pix| *pix = DIM);
draw(&back_buffer);
// delay 3-15 seconds
delay(TIC * (murmurf(&mut rng) % 120 + 30));
// flash 1
back_buffer.iter_mut().for_each(|pix| *pix = BLACK);
flash(&mut rng, &mut back_buffer);
draw(&back_buffer);
delay(TIC * 2);
// flash 2
flash(&mut rng, &mut back_buffer);
draw(&back_buffer);
delay(TIC * 3);
}
}
fn flash(rng: &mut u32, back_buffer: &mut [Rgb]) {
let start = murmurf(rng) as usize % (PORCH_BACK_LEN - 20);
let len = murmurf(rng) as usize % 20 + murmurf(rng) as usize % 20 + 10;
let end = (start + len).min(PORCH_BACK_LEN);
back_buffer.as_mut()[start..end]
.iter_mut()
.for_each(|pix| *pix = LIGHTNING);
}