smart_led_effects 0.1.8

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

pub struct Morse {
    wipe: Wipe,
}

impl Morse {
    pub fn new(count: usize, message: &str, colour: Option<Srgb<u8>>, reverse: bool) -> Self {
        let code = Self::string_to_morse(message);

        let colour = colour.unwrap_or(Srgb::new(255, 0, 0));

        let code = code
            .iter()
            .map(|&x| if x == 1 { colour } else { Srgb::new(0, 0, 0) })
            .collect::<Vec<Srgb<u8>>>();

        let wipe = Wipe::new(count, code, reverse);

        Morse { wipe }
    }

    fn string_to_morse(message: &str) -> Vec<u8> {
        let mut out = Vec::new();
        for c in message.chars() {
            match c {
                'a' | 'A' => out.extend(vec![1, 0, 1, 1, 1]),
                'b' | 'B' => out.extend(vec![1, 1, 1, 0, 1, 0, 1, 0, 1]),
                'c' | 'C' => out.extend(vec![1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1]),
                'd' | 'D' => out.extend(vec![1, 1, 1, 0, 1, 0, 1]),
                'e' | 'E' => out.extend(vec![1, 1, 1, 0]),
                'f' | 'F' => out.extend(vec![1, 0, 1, 0, 1, 1, 1, 0, 1]),
                'g' | 'G' => out.extend(vec![1, 1, 1, 0, 1, 1, 1, 0, 1]),
                'h' | 'H' => out.extend(vec![1, 0, 1, 0, 1, 0, 1]),
                'i' | 'I' => out.extend(vec![1, 0, 1]),
                'j' | 'J' => out.extend(vec![1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1]),
                'k' | 'K' => out.extend(vec![1, 1, 1, 0, 1, 0, 1, 1, 1]),
                'l' | 'L' => out.extend(vec![1, 0, 1, 1, 1, 0, 1, 0, 1]),
                'm' | 'M' => out.extend(vec![1, 1, 1, 0, 1, 1, 1]),
                'n' | 'N' => out.extend(vec![1, 1, 1, 0, 1]),
                'o' | 'O' => out.extend(vec![1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1]),
                'p' | 'P' => out.extend(vec![1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1]),
                'q' | 'Q' => out.extend(vec![1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1]),
                'r' | 'R' => out.extend(vec![1, 0, 1, 1, 1, 0, 1]),
                's' | 'S' => out.extend(vec![1, 0, 1, 0, 1]),
                't' | 'T' => out.extend(vec![1, 0]),
                'u' | 'U' => out.extend(vec![1, 0, 1, 0, 1, 1, 1]),
                'v' | 'V' => out.extend(vec![1, 0, 1, 0, 1, 0, 1, 1, 1]),
                'w' | 'W' => out.extend(vec![1, 0, 1, 1, 1, 0, 1, 1, 1]),
                'x' | 'X' => out.extend(vec![1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1]),
                'y' | 'Y' => out.extend(vec![1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1]),
                'z' | 'Z' => out.extend(vec![1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1]),
                '0' => out.extend(vec![
                    1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1,
                ]),
                '1' => out.extend(vec![1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1]),
                '2' => out.extend(vec![1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1]),
                '3' => out.extend(vec![1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1]),
                '4' => out.extend(vec![1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1]),
                '5' => out.extend(vec![1, 0, 1, 0, 1, 0, 1, 0, 1]),
                '6' => out.extend(vec![1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1]),
                '7' => out.extend(vec![1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1]),
                '8' => out.extend(vec![1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1]),
                '9' => out.extend(vec![1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1]),
                _ => (),
            }
            out.extend(vec![0, 0, 0]);
        }
        out
    }
}

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

    fn next(&mut self) -> Option<Vec<Srgb<u8>>> {
        self.wipe.next()
    }
}