ofps-suite 0.1.0

GUI tool for OFPS
use std::time::{Duration, Instant};

pub struct Timer {
    start: Instant,
    target: Duration,
}

impl Default for Timer {
    fn default() -> Self {
        Self {
            start: Instant::now(),
            target: Default::default(),
        }
    }
}

impl Timer {
    pub fn sleep(&self) {
        if let Some(duration) = self.target.checked_sub(self.start.elapsed()) {
            std::thread::sleep(duration);
        }
    }

    pub fn add(&mut self, duration: Duration) {
        self.target += duration;
    }

    pub fn handle_option(timer: &mut Option<Self>, enable: bool, add_time: Option<Duration>) {
        if enable {
            if timer.is_none() {
                *timer = Some(Default::default());
            }

            let decoder_timer = timer.as_mut().unwrap();

            decoder_timer.sleep();

            if let Some(add_time) = add_time {
                decoder_timer.add(add_time);
            }
        } else {
            *timer = None;
        }
    }
}