improve time management
This commit is contained in:
parent
b332d75c7f
commit
66c431f20c
|
@ -27,9 +27,9 @@ impl<const N: usize> Pattern for StarsRandom<N> {
|
||||||
fn init(&mut self) -> Option<Self::Strip> {
|
fn init(&mut self) -> Option<Self::Strip> {
|
||||||
if let Some(color) = self.background_color {
|
if let Some(color) = self.background_color {
|
||||||
self.strip = Strip::<N>::new(color);
|
self.strip = Strip::<N>::new(color);
|
||||||
let red = (self.color.red as i16 - color.red as i16);
|
let red = self.color.red as i16 - color.red as i16;
|
||||||
let green = (color.green as i16 - self.color.green as i16);
|
let green = color.green as i16 - self.color.green as i16;
|
||||||
let blue = (self.color.blue as i16 - color.blue as i16);
|
let blue = self.color.blue as i16 - color.blue as i16;
|
||||||
self.step = (
|
self.step = (
|
||||||
-(red / self.steps as i16) as i8,
|
-(red / self.steps as i16) as i8,
|
||||||
-(green / self.steps as i16) as i8,
|
-(green / self.steps as i16) as i8,
|
||||||
|
|
|
@ -9,6 +9,7 @@ use std::future::Future;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tokio::sync::watch::{Receiver, Sender};
|
use tokio::sync::watch::{Receiver, Sender};
|
||||||
|
use tokio::time::Instant;
|
||||||
|
|
||||||
pub(crate) mod period {
|
pub(crate) mod period {
|
||||||
use serde::{de::Error as _, Deserialize, Deserializer};
|
use serde::{de::Error as _, Deserialize, Deserializer};
|
||||||
|
@ -56,17 +57,19 @@ async fn runner_loop<const N: usize>(runner: DeviceSequence<N>, tx: Sender<Strip
|
||||||
for mut context in runner {
|
for mut context in runner {
|
||||||
let mut strip = context.pattern.init().unwrap_or(background);
|
let mut strip = context.pattern.init().unwrap_or(background);
|
||||||
let delay = context.period;
|
let delay = context.period;
|
||||||
|
let mut next_instant = Instant::now() + 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 = apply_mask(background, value);
|
strip = apply_mask(background, value);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tokio::time::sleep(delay).await;
|
tokio::time::sleep_until(next_instant).await;
|
||||||
|
next_instant += delay;
|
||||||
}
|
}
|
||||||
background = strip;
|
background = strip;
|
||||||
println!("{:?}", background);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn apply_mask<const N: usize>(previous_strip: Strip<N>, strip: Strip<{ N }>) -> Strip<N> {
|
fn apply_mask<const N: usize>(previous_strip: Strip<N>, strip: Strip<{ N }>) -> Strip<N> {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user