From 9025e0e461947f83fdecca9361a144b1abb6ddde Mon Sep 17 00:00:00 2001 From: Ondrej Novak Date: Tue, 30 Jun 2026 22:44:11 +0200 Subject: [PATCH] push empty samples to compensate time lag this can happen when the script freezes or the device goes to sleep --- waybar-collectd/src/main.rs | 2 +- waybar-collectd/src/observables.rs | 4 ++++ waybar-collectd/src/runner.rs | 28 +++++++++++++++++++++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/waybar-collectd/src/main.rs b/waybar-collectd/src/main.rs index 6a806dd..dc5bb6b 100644 --- a/waybar-collectd/src/main.rs +++ b/waybar-collectd/src/main.rs @@ -27,7 +27,7 @@ fn main() { .iter() .map(|g| Graph::new(g, &mut proto)) .collect(); - let mut runner = Runner::new(graphs, proto); + let mut runner = Runner::new(graphs, proto, config.global.period); loop { let r = runner.tick(); diff --git a/waybar-collectd/src/observables.rs b/waybar-collectd/src/observables.rs index 7e0154b..b82aa20 100644 --- a/waybar-collectd/src/observables.rs +++ b/waybar-collectd/src/observables.rs @@ -85,4 +85,8 @@ impl ObservableCollection { pub fn sample(&self, proto: &mut Protocol) -> Result, ProtocolError> { self.observables.iter().map(|o| o.sample(proto)).collect() } + + pub fn get_num_observables(&self) -> usize { + self.observables.len() + } } diff --git a/waybar-collectd/src/runner.rs b/waybar-collectd/src/runner.rs index 024a431..2fbbd4f 100644 --- a/waybar-collectd/src/runner.rs +++ b/waybar-collectd/src/runner.rs @@ -1,6 +1,8 @@ use core::fmt; +use std::time::SystemTime; use draw::{StackedConfig, StackedSeries, StackedSeriesConfig, stacked}; +use imageproc::image::codecs::pnm::SampleEncoding; use protocol::Protocol; use crate::{ @@ -68,17 +70,41 @@ impl fmt::Display for RunnerError { pub struct Runner { graphs: Vec, proto: Protocol, + last_sample: SystemTime, + sampling_period: f32, } impl Runner { - pub fn new(graphs: Vec, proto: Protocol) -> Runner { + pub fn new(graphs: Vec, proto: Protocol, sampling_period: f32) -> Runner { Runner { graphs: graphs, proto: proto, + last_sample: SystemTime::UNIX_EPOCH, + sampling_period: sampling_period, } } pub fn tick(&mut self) -> Result<(), RunnerError> { + let now = SystemTime::now(); + let dt = if self.last_sample == SystemTime::UNIX_EPOCH { + self.sampling_period + } else { + now.duration_since(self.last_sample) + .expect("time jumped back") + .as_secs_f32() + }; + self.last_sample = now; + for g in &mut self.graphs { + // fill in empty samples for missing data + if dt >= 2. { + let dt_round = dt.round() as u32; + for _ in 0..dt_round { + let dummy = vec![0.; g.observable.get_num_observables()]; + g.series.push(dummy) + } + } + + // sample data let sample = g .observable .sample(&mut self.proto)