push empty samples to compensate time lag
this can happen when the script freezes or the device goes to sleep
This commit is contained in:
parent
81794de504
commit
9025e0e461
|
|
@ -27,7 +27,7 @@ fn main() {
|
||||||
.iter()
|
.iter()
|
||||||
.map(|g| Graph::new(g, &mut proto))
|
.map(|g| Graph::new(g, &mut proto))
|
||||||
.collect();
|
.collect();
|
||||||
let mut runner = Runner::new(graphs, proto);
|
let mut runner = Runner::new(graphs, proto, config.global.period);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let r = runner.tick();
|
let r = runner.tick();
|
||||||
|
|
|
||||||
|
|
@ -85,4 +85,8 @@ impl ObservableCollection {
|
||||||
pub fn sample(&self, proto: &mut Protocol) -> Result<Vec<f32>, ProtocolError> {
|
pub fn sample(&self, proto: &mut Protocol) -> Result<Vec<f32>, ProtocolError> {
|
||||||
self.observables.iter().map(|o| o.sample(proto)).collect()
|
self.observables.iter().map(|o| o.sample(proto)).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_num_observables(&self) -> usize {
|
||||||
|
self.observables.len()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
|
use std::time::SystemTime;
|
||||||
|
|
||||||
use draw::{StackedConfig, StackedSeries, StackedSeriesConfig, stacked};
|
use draw::{StackedConfig, StackedSeries, StackedSeriesConfig, stacked};
|
||||||
|
use imageproc::image::codecs::pnm::SampleEncoding;
|
||||||
use protocol::Protocol;
|
use protocol::Protocol;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
|
@ -68,17 +70,41 @@ impl fmt::Display for RunnerError {
|
||||||
pub struct Runner {
|
pub struct Runner {
|
||||||
graphs: Vec<Graph>,
|
graphs: Vec<Graph>,
|
||||||
proto: Protocol,
|
proto: Protocol,
|
||||||
|
last_sample: SystemTime,
|
||||||
|
sampling_period: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Runner {
|
impl Runner {
|
||||||
pub fn new(graphs: Vec<Graph>, proto: Protocol) -> Runner {
|
pub fn new(graphs: Vec<Graph>, proto: Protocol, sampling_period: f32) -> Runner {
|
||||||
Runner {
|
Runner {
|
||||||
graphs: graphs,
|
graphs: graphs,
|
||||||
proto: proto,
|
proto: proto,
|
||||||
|
last_sample: SystemTime::UNIX_EPOCH,
|
||||||
|
sampling_period: sampling_period,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn tick(&mut self) -> Result<(), RunnerError> {
|
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 {
|
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
|
let sample = g
|
||||||
.observable
|
.observable
|
||||||
.sample(&mut self.proto)
|
.sample(&mut self.proto)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue