pub struct SleepAmountTracker {
max_time_to_sleep: u8,
time_to_sleep: u8,
warm_wakeup: u8,
max_warm_wakeups: u8,
}
impl SleepAmountTracker {
pub fn new(max_time_to_sleep: u8, max_warm_wakeups: u8) -> Self {
Self { max_time_to_sleep, max_warm_wakeups, warm_wakeup: 0, time_to_sleep: 0 }
}
#[inline]
pub fn reset_sleep(&mut self) {
self.time_to_sleep = 0;
}
#[inline]
pub fn increase_sleep(&mut self) {
if self.time_to_sleep == 0 {
self.time_to_sleep = 1;
self.warm_wakeup = 0;
return;
}
if self.warm_wakeup < self.max_warm_wakeups {
self.warm_wakeup += 1;
} else if self.time_to_sleep < self.max_warm_wakeups {
self.time_to_sleep = std::cmp::min(2 * self.time_to_sleep, self.max_time_to_sleep);
}
}
#[inline]
pub fn sleep_amount(&self) -> u8 {
self.time_to_sleep
}
}