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>),
|
||||
Scanner(Scanner<N>),
|
||||
FillRandom(FillRandom<N>),
|
||||
FillUnstable(FillUnstable<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::Scanner(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
|
||||
///
|
||||
/// 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)]
|
||||
pub struct FillRandom<const N: usize> {
|
||||
pub(crate) color: PixelColor,
|
||||
|
@ -356,3 +358,48 @@ impl<const N: usize> Iterator for FillRandom<N> {
|
|||
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 {
|
||||
let mut strip = context.pattern.next().unwrap();
|
||||
let delay = context.period;
|
||||
println!("{:?}", delay);
|
||||
while tx.send(strip).is_ok() {
|
||||
if let Some(value) = context.pattern.next() {
|
||||
strip = value;
|
||||
|
|
Loading…
Reference in New Issue
Block a user