smart_led_effects 0.1.8

A collection of effects for LED strips
Documentation
use crate::strip::EffectIterator;
use palette::{FromColor, Hsv, ShiftHueAssign, Srgb};

pub struct Rainbow {
    last_state: Vec<Hsv>,
    step_size: f32,
}

impl Rainbow {
    pub fn new(count: usize, steps: Option<usize>) -> Self {
        let mut last_state = Vec::new();
        let mut color = Hsv::new(0.0, 1.0, 1.0);
        last_state.push(color);
        let separation = 360.0 / count as f32;
        let step = steps.unwrap_or(360);
        let step_size = 360.0 / step as f32;

        for _ in 1..count {
            color.shift_hue_assign(separation);
            last_state.push(color);
        }
        Rainbow {
            last_state,
            step_size,
        }
    }
}

impl EffectIterator for Rainbow {
    fn name(&self) -> &'static str {
        "Rainbow"
    }

    fn next(&mut self) -> Option<Vec<Srgb<u8>>> {
        for pixel in self.last_state.iter_mut() {
            pixel.shift_hue_assign(self.step_size);
        }

        Some(
            self.last_state
                .iter()
                .map(|x| Srgb::from_color(*x).into_format::<u8>())
                .collect::<Vec<Srgb<u8>>>(),
        )
    }
}