add ring and ringscanner pattern
This commit is contained in:
parent
4dd5587b49
commit
20b8f6d4db
|
@ -55,15 +55,9 @@
|
||||||
- name: titi
|
- name: titi
|
||||||
sequence:
|
sequence:
|
||||||
- pattern:
|
- pattern:
|
||||||
type: FadeRandom
|
type: RingScanner
|
||||||
fade :
|
color: *green
|
||||||
steps: 50
|
ring_size: 4
|
||||||
begin_color: *black
|
|
||||||
end_color: &cyan
|
|
||||||
red: 0
|
|
||||||
green: 255
|
|
||||||
blue: 255
|
|
||||||
stability : 30
|
|
||||||
max_iteration : 50
|
max_iteration : 50
|
||||||
period: 100
|
period: 100
|
||||||
- pattern:
|
- pattern:
|
||||||
|
|
|
@ -7,6 +7,8 @@ mod fill_random;
|
||||||
mod fill_unstable;
|
mod fill_unstable;
|
||||||
mod rain;
|
mod rain;
|
||||||
mod rainbow;
|
mod rainbow;
|
||||||
|
mod ring;
|
||||||
|
mod ring_scanner;
|
||||||
mod scanner;
|
mod scanner;
|
||||||
|
|
||||||
use crate::patterns::blink::Blink;
|
use crate::patterns::blink::Blink;
|
||||||
|
@ -18,6 +20,8 @@ use crate::patterns::fill_random::FillRandom;
|
||||||
use crate::patterns::fill_unstable::FillUnstable;
|
use crate::patterns::fill_unstable::FillUnstable;
|
||||||
use crate::patterns::rain::Rain;
|
use crate::patterns::rain::Rain;
|
||||||
use crate::patterns::rainbow::Rainbow;
|
use crate::patterns::rainbow::Rainbow;
|
||||||
|
use crate::patterns::ring::Ring;
|
||||||
|
use crate::patterns::ring_scanner::RingScanner;
|
||||||
use crate::patterns::scanner::Scanner;
|
use crate::patterns::scanner::Scanner;
|
||||||
use rand::rngs::ThreadRng;
|
use rand::rngs::ThreadRng;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
@ -38,6 +42,8 @@ pub(crate) enum Patterns<const N: usize> {
|
||||||
Rain(Rain<N>),
|
Rain(Rain<N>),
|
||||||
FadeRandom(FadeRandom<N>),
|
FadeRandom(FadeRandom<N>),
|
||||||
FadeUnstable(FadeUnstable<N>),
|
FadeUnstable(FadeUnstable<N>),
|
||||||
|
Ring(Ring<N>),
|
||||||
|
RingScanner(RingScanner<N>),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait Pattern: Iterator {
|
pub trait Pattern: Iterator {
|
||||||
|
@ -62,6 +68,8 @@ impl<const N: usize> Iterator for Patterns<N> {
|
||||||
Patterns::Rain(p) => p.next(),
|
Patterns::Rain(p) => p.next(),
|
||||||
Patterns::FadeRandom(p) => p.next(),
|
Patterns::FadeRandom(p) => p.next(),
|
||||||
Patterns::FadeUnstable(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::Rain(p) => p.init(),
|
||||||
Patterns::FadeRandom(p) => p.init(),
|
Patterns::FadeRandom(p) => p.init(),
|
||||||
Patterns::FadeUnstable(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::Rain(p) => p.is_last_iteration(),
|
||||||
Patterns::FadeRandom(p) => p.is_last_iteration(),
|
Patterns::FadeRandom(p) => p.is_last_iteration(),
|
||||||
Patterns::FadeUnstable(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 crate::Strip;
|
||||||
use serde::{Deserialize, Serialize};
|
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)]
|
#[derive(Serialize, Deserialize, Debug, Eq, Hash, PartialEq, Copy, Clone)]
|
||||||
pub struct FadeRandom<const N: usize> {
|
pub struct FadeRandom<const N: usize> {
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
|
|
|
@ -3,9 +3,9 @@ use crate::patterns::Pattern;
|
||||||
use crate::Strip;
|
use crate::Strip;
|
||||||
use serde::{Deserialize, Serialize};
|
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)]
|
#[derive(Serialize, Deserialize, Debug, Eq, Hash, PartialEq, Copy, Clone)]
|
||||||
pub struct FadeUnstable<const N: usize> {
|
pub struct FadeUnstable<const N: usize> {
|
||||||
#[serde(default)]
|
#[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