pour l'instant le programe detecte chacun des bord puis recadre le trapeze en carrer avec une marge en cas de depassement.
45 lines
1.5 KiB
Rust
45 lines
1.5 KiB
Rust
use log::{debug, warn};
|
|
use std::thread;
|
|
use std::time::{Duration, Instant};
|
|
|
|
/// Converts helios Geometry to Helios
|
|
#[derive(Debug, Clone, Copy)]
|
|
pub struct Framerate {
|
|
start: Instant,
|
|
prev_trace_time: Instant,
|
|
framerate: u8,
|
|
}
|
|
|
|
impl Framerate {
|
|
pub fn new(framerate: u8) -> Result<Self, Box<dyn std::error::Error>> {
|
|
Ok(Framerate {
|
|
start: Instant::now(),
|
|
prev_trace_time: Instant::now(),
|
|
framerate,
|
|
})
|
|
}
|
|
pub fn handle_time(&mut self) -> Result<(f64), Box<dyn std::error::Error>> {
|
|
let frame_time = 1000000000 / self.framerate 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 slower than expected {:?} > {:?}",
|
|
// nanotime_spent, frame_time,
|
|
//);
|
|
}
|
|
|
|
let time_from_begin = self.start.elapsed().as_nanos() as f64 / 1000000000.;
|
|
self.prev_trace_time = now;
|
|
Ok(time_from_begin)
|
|
}
|
|
}
|