#[non_exhaustive]
#[derive(Debug)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum Error {
Exceeded,
}
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct Counter {
value: u8,
max_value: u8,
}
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[allow(missing_docs)]
pub enum CounterType {
Busy,
Caps,
DiscoverIdentity,
HardReset,
MessageId,
Retry,
}
impl Counter {
pub fn new(counter_type: CounterType) -> Self {
let max_value = match counter_type {
CounterType::Busy => 5,
CounterType::Caps => 50,
CounterType::DiscoverIdentity => 20,
CounterType::HardReset => 3,
CounterType::MessageId => 7,
CounterType::Retry => 2,
};
Self { value: 0, max_value }
}
pub fn max_value(&self) -> u8 {
self.max_value
}
pub fn new_from_value(counter_type: CounterType, value: u8) -> Self {
let mut counter = Self::new(counter_type);
counter.set(value);
counter
}
pub fn set(&mut self, value: u8) {
self.value = value % (self.max_value + 1);
}
pub fn value(&self) -> u8 {
self.value
}
pub fn increment(&mut self) -> Result<(), Error> {
self.set(self.value + 1);
if self.value == 0 { Err(Error::Exceeded) } else { Ok(()) }
}
pub fn reset(&mut self) {
self.value = 0;
}
}