feat: add framerate with fixed value for now (20Hz)
This commit is contained in:
parent
3ce346306f
commit
6f04925ea5
39
src/framerate.rs
Normal file
39
src/framerate.rs
Normal file
@ -0,0 +1,39 @@
|
||||
use log::{debug, warn};
|
||||
use std::time::{Duration, Instant};
|
||||
use crate::errors::LJResult;
|
||||
use std::{thread};
|
||||
|
||||
/// Converts helios Geometry to Helios
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct Framerate {
|
||||
prev_trace_time: Instant,
|
||||
fps: u8,
|
||||
}
|
||||
|
||||
impl Framerate {
|
||||
pub fn new() -> LJResult<Self> {
|
||||
Ok(Framerate {
|
||||
prev_trace_time: Instant::now(),
|
||||
fps: 20,
|
||||
})
|
||||
}
|
||||
pub fn handle_time(&mut self) -> LJResult<()> {
|
||||
let frame_time = 1000000000 / self.fps as u128;
|
||||
let now = Instant::now();
|
||||
// How long since last loop ?
|
||||
let nanotime_spent = self.prev_trace_time.elapsed().as_nanos();
|
||||
// Diw it go too fast? If so : sleep a bit
|
||||
if frame_time > nanotime_spent {
|
||||
let nanotime_towait = frame_time - nanotime_spent;
|
||||
let dur = Duration::new(0, (nanotime_towait as f32 * 0.9) as u32);
|
||||
// debug!("{:?} - {:?} : {:?}", nanotime_towait, self.prev_trace_time, now );
|
||||
thread::sleep(dur);
|
||||
debug!("Framerate OK");
|
||||
} else {
|
||||
warn!("Frame longer than expected {:?} > {:?}", nanotime_spent, frame_time, );
|
||||
}
|
||||
|
||||
self.prev_trace_time = now;
|
||||
Ok(())
|
||||
}
|
||||
}
|
@ -5,3 +5,4 @@ pub mod device;
|
||||
pub mod point;
|
||||
pub mod transformer;
|
||||
pub mod worldstate;
|
||||
pub mod framerate;
|
||||
|
@ -9,6 +9,7 @@ mod point;
|
||||
mod transformer;
|
||||
mod device;
|
||||
mod worldstate;
|
||||
mod framerate;
|
||||
|
||||
use device::device_factory;
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
@ -21,6 +22,7 @@ use transformer::Transformers;
|
||||
use log::{LevelFilter, info, /* warn, */ error};
|
||||
use env_logger::Builder;
|
||||
use worldstate::WorldState;
|
||||
use framerate::Framerate;
|
||||
|
||||
const DEFAULT_CONF_FILE: &str = "settings.toml";
|
||||
|
||||
@ -68,9 +70,13 @@ fn run_all() -> LJResult<()> {
|
||||
// Setup geometry transformers on points lists
|
||||
let transformers = config.get_transformers();
|
||||
|
||||
// Setup framerate limiter
|
||||
let mut framerate_handler = Framerate::new()?;
|
||||
|
||||
// Dispatch based on redis requests
|
||||
while running.load(Ordering::SeqCst) {
|
||||
rs.set_status(tracer.status())?;
|
||||
let _ = framerate_handler.handle_time()?;
|
||||
let order = rs.get_order(config.laser_id)?;
|
||||
match order {
|
||||
Order::Draw | Order::Black | Order::Grid => {
|
||||
|
Loading…
Reference in New Issue
Block a user