From 5d8dd68d476d9bcafe57ef223bf16f11501aae31 Mon Sep 17 00:00:00 2001 From: Tangent Wantwight Date: Sat, 23 Nov 2019 18:55:21 -0500 Subject: [PATCH] First stab at a december display --- harrogate/Cargo.toml | 2 ++ harrogate/src/december_2019.rs | 63 ++++++++++++++++++++++++++++++++++ harrogate/src/door_light.rs | 3 +- harrogate/src/main.rs | 4 +++ 4 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 harrogate/src/december_2019.rs diff --git a/harrogate/Cargo.toml b/harrogate/Cargo.toml index 70871ac..7a76c4a 100644 --- a/harrogate/Cargo.toml +++ b/harrogate/Cargo.toml @@ -13,6 +13,8 @@ debug = true replace-default = [] +december-2019 = ["replace-default"] + [dependencies] house = { path = "../house" } itsybitsy_m0 = "0.5" diff --git a/harrogate/src/december_2019.rs b/harrogate/src/december_2019.rs new file mode 100644 index 0000000..4c4d7a8 --- /dev/null +++ b/harrogate/src/december_2019.rs @@ -0,0 +1,63 @@ +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); + } +} diff --git a/harrogate/src/door_light.rs b/harrogate/src/door_light.rs index 66bc204..0a7b012 100644 --- a/harrogate/src/door_light.rs +++ b/harrogate/src/door_light.rs @@ -12,7 +12,8 @@ const ON: Rgb = Rgb(255, 255, 255); * 85 OFF + 65 door = 150 dots */ - #[inline(always)] +#[allow(dead_code)] +#[inline(always)] pub fn run(lights: &mut impl Lights) -> ! { let door_highlight = linear_gradient(OFF, ON, 20) .chain(repeat(ON).take(25)) diff --git a/harrogate/src/main.rs b/harrogate/src/main.rs index a4e6db3..d3a4b79 100644 --- a/harrogate/src/main.rs +++ b/harrogate/src/main.rs @@ -5,12 +5,16 @@ use lights_hal::{boot, entry}; pub use lights_hal::delay; +mod december_2019; mod door_light; #[entry] fn main() -> ! { let mut lights = boot(); + #[cfg(feature = "december-2019")] + december_2019::run(&mut lights); + #[cfg(not(feature = "replace-default"))] door_light::run(&mut lights); }