add fillUnstable pattern
This commit is contained in:
parent
086e194a1d
commit
4451917154
|
@ -11,6 +11,7 @@ pub(crate) enum Patterns<const N: usize> {
|
||||||
ColorWipe(ColorWipe<N>),
|
ColorWipe(ColorWipe<N>),
|
||||||
Scanner(Scanner<N>),
|
Scanner(Scanner<N>),
|
||||||
FillRandom(FillRandom<N>),
|
FillRandom(FillRandom<N>),
|
||||||
|
FillUnstable(FillUnstable<N>)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<const N: usize> Iterator for Patterns<N> {
|
impl<const N: usize> Iterator for Patterns<N> {
|
||||||
|
@ -23,6 +24,7 @@ impl<const N: usize> Iterator for Patterns<N> {
|
||||||
Patterns::ColorWipe(p) => p.next(),
|
Patterns::ColorWipe(p) => p.next(),
|
||||||
Patterns::Scanner(p) => p.next(),
|
Patterns::Scanner(p) => p.next(),
|
||||||
Patterns::FillRandom(p) => p.next(),
|
Patterns::FillRandom(p) => p.next(),
|
||||||
|
Patterns::FillUnstable(p) => p.next(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -311,7 +313,7 @@ impl<const N: usize> Iterator for Scanner<N> {
|
||||||
|
|
||||||
/// # FillRandom
|
/// # FillRandom
|
||||||
///
|
///
|
||||||
/// fill strip with color then apply random variation
|
/// fill strip with color then apply random variation to each pixel
|
||||||
#[derive(Serialize, Deserialize, Debug, Eq, Hash, PartialEq, Copy, Clone)]
|
#[derive(Serialize, Deserialize, Debug, Eq, Hash, PartialEq, Copy, Clone)]
|
||||||
pub struct FillRandom<const N: usize> {
|
pub struct FillRandom<const N: usize> {
|
||||||
pub(crate) color: PixelColor,
|
pub(crate) color: PixelColor,
|
||||||
|
@ -356,3 +358,48 @@ impl<const N: usize> Iterator for FillRandom<N> {
|
||||||
Some(strip)
|
Some(strip)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// # FillUnstable
|
||||||
|
///
|
||||||
|
/// fill strip with color then apply same random variation to all pixel
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Eq, Hash, PartialEq, Copy, Clone)]
|
||||||
|
pub struct FillUnstable<const N: usize> {
|
||||||
|
pub(crate) color: PixelColor,
|
||||||
|
pub(crate) stability: usize,
|
||||||
|
pub(crate) max_iteration: Option<usize>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<const N: usize> Iterator for FillUnstable<N> {
|
||||||
|
type Item = Strip<N>;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
if let Some(iteration) = self.max_iteration {
|
||||||
|
if iteration == 0 {
|
||||||
|
return None;
|
||||||
|
} else {
|
||||||
|
self.max_iteration = Some(iteration - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut strip = Strip::<N>::default();
|
||||||
|
let mut rng = rand::thread_rng();
|
||||||
|
let red_delta = rng.gen_range(0..self.stability) as u8;
|
||||||
|
let green_delta = rng.gen_range(0..self.stability) as u8;
|
||||||
|
let blue_delta = rng.gen_range(0..self.stability) as u8;
|
||||||
|
let operation = rng.gen_bool(0.5);
|
||||||
|
let red;
|
||||||
|
let green;
|
||||||
|
let blue;
|
||||||
|
if operation {
|
||||||
|
red = self.color.red.saturating_add(red_delta);
|
||||||
|
green = self.color.green.saturating_add(green_delta);
|
||||||
|
blue = self.color.blue.saturating_add(blue_delta);
|
||||||
|
} else {
|
||||||
|
red = self.color.red.saturating_sub(red_delta);
|
||||||
|
green = self.color.green.saturating_sub(green_delta);
|
||||||
|
blue = self.color.blue.saturating_sub(blue_delta);
|
||||||
|
}
|
||||||
|
strip.fill(PixelColor { red, green, blue });
|
||||||
|
Some(strip)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -21,7 +21,6 @@ pub async fn runner_loop<const N: usize>(runner: DeviceSequence<N>, tx: Sender<S
|
||||||
for mut context in runner {
|
for mut context in runner {
|
||||||
let mut strip = context.pattern.next().unwrap();
|
let mut strip = context.pattern.next().unwrap();
|
||||||
let delay = context.period;
|
let delay = context.period;
|
||||||
println!("{:?}", delay);
|
|
||||||
while tx.send(strip).is_ok() {
|
while tx.send(strip).is_ok() {
|
||||||
if let Some(value) = context.pattern.next() {
|
if let Some(value) = context.pattern.next() {
|
||||||
strip = value;
|
strip = value;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user