add ring and ringscanner pattern
This commit is contained in:
		
							parent
							
								
									4dd5587b49
								
							
						
					
					
						commit
						20b8f6d4db
					
				@ -55,15 +55,9 @@
 | 
			
		||||
  - name: titi
 | 
			
		||||
    sequence:
 | 
			
		||||
      - pattern:
 | 
			
		||||
          type: FadeRandom
 | 
			
		||||
          fade :
 | 
			
		||||
            steps: 50
 | 
			
		||||
            begin_color: *black
 | 
			
		||||
            end_color: &cyan
 | 
			
		||||
                red: 0
 | 
			
		||||
                green: 255
 | 
			
		||||
                blue: 255
 | 
			
		||||
          stability : 30
 | 
			
		||||
          type: RingScanner
 | 
			
		||||
          color: *green
 | 
			
		||||
          ring_size: 4
 | 
			
		||||
          max_iteration : 50
 | 
			
		||||
        period: 100
 | 
			
		||||
      - pattern:
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,8 @@ mod fill_random;
 | 
			
		||||
mod fill_unstable;
 | 
			
		||||
mod rain;
 | 
			
		||||
mod rainbow;
 | 
			
		||||
mod ring;
 | 
			
		||||
mod ring_scanner;
 | 
			
		||||
mod scanner;
 | 
			
		||||
 | 
			
		||||
use crate::patterns::blink::Blink;
 | 
			
		||||
@ -18,6 +20,8 @@ use crate::patterns::fill_random::FillRandom;
 | 
			
		||||
use crate::patterns::fill_unstable::FillUnstable;
 | 
			
		||||
use crate::patterns::rain::Rain;
 | 
			
		||||
use crate::patterns::rainbow::Rainbow;
 | 
			
		||||
use crate::patterns::ring::Ring;
 | 
			
		||||
use crate::patterns::ring_scanner::RingScanner;
 | 
			
		||||
use crate::patterns::scanner::Scanner;
 | 
			
		||||
use rand::rngs::ThreadRng;
 | 
			
		||||
use rand::Rng;
 | 
			
		||||
@ -38,6 +42,8 @@ pub(crate) enum Patterns<const N: usize> {
 | 
			
		||||
    Rain(Rain<N>),
 | 
			
		||||
    FadeRandom(FadeRandom<N>),
 | 
			
		||||
    FadeUnstable(FadeUnstable<N>),
 | 
			
		||||
    Ring(Ring<N>),
 | 
			
		||||
    RingScanner(RingScanner<N>),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub trait Pattern: Iterator {
 | 
			
		||||
@ -62,6 +68,8 @@ impl<const N: usize> Iterator for Patterns<N> {
 | 
			
		||||
            Patterns::Rain(p) => p.next(),
 | 
			
		||||
            Patterns::FadeRandom(p) => p.next(),
 | 
			
		||||
            Patterns::FadeUnstable(p) => p.next(),
 | 
			
		||||
            Patterns::Ring(p) => p.next(),
 | 
			
		||||
            Patterns::RingScanner(p) => p.next(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -81,6 +89,8 @@ impl<const N: usize> Pattern for Patterns<N> {
 | 
			
		||||
            Patterns::Rain(p) => p.init(),
 | 
			
		||||
            Patterns::FadeRandom(p) => p.init(),
 | 
			
		||||
            Patterns::FadeUnstable(p) => p.init(),
 | 
			
		||||
            Patterns::Ring(p) => p.init(),
 | 
			
		||||
            Patterns::RingScanner(p) => p.init(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -96,6 +106,8 @@ impl<const N: usize> Pattern for Patterns<N> {
 | 
			
		||||
            Patterns::Rain(p) => p.is_last_iteration(),
 | 
			
		||||
            Patterns::FadeRandom(p) => p.is_last_iteration(),
 | 
			
		||||
            Patterns::FadeUnstable(p) => p.is_last_iteration(),
 | 
			
		||||
            Patterns::Ring(p) => p.is_last_iteration(),
 | 
			
		||||
            Patterns::RingScanner(p) => p.is_last_iteration(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -3,9 +3,9 @@ use crate::patterns::Pattern;
 | 
			
		||||
use crate::Strip;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
/// # Blink
 | 
			
		||||
/// # FadeRandom
 | 
			
		||||
///
 | 
			
		||||
/// fade from one color to an other then go back several times
 | 
			
		||||
/// fade from one color to an other with random variations applied to each pixel
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug, Eq, Hash, PartialEq, Copy, Clone)]
 | 
			
		||||
pub struct FadeRandom<const N: usize> {
 | 
			
		||||
    #[serde(default)]
 | 
			
		||||
 | 
			
		||||
@ -3,9 +3,9 @@ use crate::patterns::Pattern;
 | 
			
		||||
use crate::Strip;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
/// # Blink
 | 
			
		||||
/// # FadeUnstable
 | 
			
		||||
///
 | 
			
		||||
/// fade from one color to an other then go back several times
 | 
			
		||||
/// fade from one color to an other with random variations applied to the entire strip
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug, Eq, Hash, PartialEq, Copy, Clone)]
 | 
			
		||||
pub struct FadeUnstable<const N: usize> {
 | 
			
		||||
    #[serde(default)]
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										66
									
								
								src/patterns/ring.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								src/patterns/ring.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,66 @@
 | 
			
		||||
use crate::patterns::{Pattern, PixelColor};
 | 
			
		||||
use crate::Strip;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
/// # Ring
 | 
			
		||||
///
 | 
			
		||||
/// display a ring  on the strip
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug, Eq, Hash, PartialEq, Copy, Clone)]
 | 
			
		||||
pub struct Ring<const N: usize> {
 | 
			
		||||
    #[serde(default)]
 | 
			
		||||
    pub(crate) current_iteration: usize,
 | 
			
		||||
    pub(crate) max_iteration: Option<usize>,
 | 
			
		||||
    pub(crate) color: PixelColor,
 | 
			
		||||
    pub(crate) background_color: Option<PixelColor>,
 | 
			
		||||
    pub(crate) ring_size: usize,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<const N: usize> Pattern for Ring<N> {
 | 
			
		||||
    type Strip = Strip<N>;
 | 
			
		||||
 | 
			
		||||
    fn init(&mut self) -> Option<Self::Strip> {
 | 
			
		||||
        None
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn is_last_iteration(&self) -> bool {
 | 
			
		||||
        match self.max_iteration {
 | 
			
		||||
            None => false,
 | 
			
		||||
            Some(max_iter) => {
 | 
			
		||||
                if self.current_iteration >= max_iter {
 | 
			
		||||
                    true
 | 
			
		||||
                } else {
 | 
			
		||||
                    false
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<const N: usize> Iterator for Ring<N> {
 | 
			
		||||
    type Item = Strip<N>;
 | 
			
		||||
 | 
			
		||||
    fn next(&mut self) -> Option<Self::Item> {
 | 
			
		||||
        if self.is_last_iteration() {
 | 
			
		||||
            return None;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let mut strip: Strip<N>;
 | 
			
		||||
 | 
			
		||||
        if let Some(color) = self.background_color {
 | 
			
		||||
            strip = Strip::new(color);
 | 
			
		||||
        } else {
 | 
			
		||||
            strip = Strip::default();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let nbr_iter = N / self.ring_size;
 | 
			
		||||
        let iter = self.current_iteration % nbr_iter;
 | 
			
		||||
        let first_index = iter * self.ring_size;
 | 
			
		||||
        let last_index = first_index + self.ring_size;
 | 
			
		||||
 | 
			
		||||
        for i in first_index..last_index {
 | 
			
		||||
            strip[i] = Some(self.color);
 | 
			
		||||
        }
 | 
			
		||||
        self.current_iteration += 1;
 | 
			
		||||
        Some(strip)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										70
									
								
								src/patterns/ring_scanner.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/patterns/ring_scanner.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,70 @@
 | 
			
		||||
use crate::patterns::{Pattern, PixelColor};
 | 
			
		||||
use crate::Strip;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
/// # RingScanner
 | 
			
		||||
///
 | 
			
		||||
/// display a ring  on the strip fading for the previous ones
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug, Eq, Hash, PartialEq, Copy, Clone)]
 | 
			
		||||
pub struct RingScanner<const N: usize> {
 | 
			
		||||
    #[serde(default)]
 | 
			
		||||
    pub(crate) current_iteration: usize,
 | 
			
		||||
    pub(crate) max_iteration: Option<usize>,
 | 
			
		||||
    pub(crate) color: PixelColor,
 | 
			
		||||
    pub(crate) background_color: Option<PixelColor>,
 | 
			
		||||
    pub(crate) ring_size: usize,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<const N: usize> Pattern for RingScanner<N> {
 | 
			
		||||
    type Strip = Strip<N>;
 | 
			
		||||
 | 
			
		||||
    fn init(&mut self) -> Option<Self::Strip> {
 | 
			
		||||
        None
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn is_last_iteration(&self) -> bool {
 | 
			
		||||
        match self.max_iteration {
 | 
			
		||||
            None => false,
 | 
			
		||||
            Some(max_iter) => {
 | 
			
		||||
                if self.current_iteration >= max_iter {
 | 
			
		||||
                    true
 | 
			
		||||
                } else {
 | 
			
		||||
                    false
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<const N: usize> Iterator for RingScanner<N> {
 | 
			
		||||
    type Item = Strip<N>;
 | 
			
		||||
 | 
			
		||||
    fn next(&mut self) -> Option<Self::Item> {
 | 
			
		||||
        if self.is_last_iteration() {
 | 
			
		||||
            return None;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let mut strip: Strip<N>;
 | 
			
		||||
 | 
			
		||||
        if let Some(color) = self.background_color {
 | 
			
		||||
            strip = Strip::new(color);
 | 
			
		||||
        } else {
 | 
			
		||||
            strip = Strip::default();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let nbr_iter = N / self.ring_size;
 | 
			
		||||
        let iter = self.current_iteration % nbr_iter;
 | 
			
		||||
 | 
			
		||||
        for j in 0..iter {
 | 
			
		||||
            let first_index = j * self.ring_size;
 | 
			
		||||
            let last_index = first_index + self.ring_size;
 | 
			
		||||
            let fade_gain = 2 * (iter - j);
 | 
			
		||||
            for i in first_index..last_index {
 | 
			
		||||
                strip[i] = Some(self.color / fade_gain as u8);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        self.current_iteration += 1;
 | 
			
		||||
        Some(strip)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user