use super::{I2c, BitFlags, Control, Error, Register, DEVICE_ADDRESS, PCF8563};
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(u8)]
pub enum TimerFreq {
Timer_4096Hz = 0b0000_0000,
Timer_64Hz = 0b0000_0001,
Timer_1Hz = 0b0000_0010,
Timer_1_60Hz = 0b0000_0011,
}
impl TimerFreq {
pub fn bits(self) -> u8 {
self as u8
}
}
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug)]
pub enum InterruptOutput {
Continuous,
Pulsating,
}
impl<I2C, E> PCF8563<I2C>
where
I2C: I2c<Error = E>,
{
pub fn set_timer(&mut self, time: u8) -> Result<(), Error<E>> {
self.write_register(Register::TIMER, time)
}
pub fn set_timer_frequency(&mut self, frequency: TimerFreq) -> Result<(), Error<E>> {
let data = self.read_register(Register::TIMER_CTRL)?; let data = data & 0b1000_0000; let data = data | frequency.bits(); self.write_register(Register::TIMER_CTRL, data)
}
pub fn control_timer(&mut self, flag: Control) -> Result<(), Error<E>> {
match flag {
Control::On => self.set_register_bit_flag(Register::TIMER_CTRL, BitFlags::TE),
Control::Off => self.clear_register_bit_flag(Register::TIMER_CTRL, BitFlags::TE),
}
}
pub fn is_timer_enabled(&mut self) -> Result<bool, Error<E>> {
self.is_register_bit_flag_high(Register::TIMER_CTRL, BitFlags::TE)
}
pub fn control_timer_interrupt(&mut self, flag: Control) -> Result<(), Error<E>> {
match flag {
Control::On => self.set_register_bit_flag(Register::CTRL_STATUS_2, BitFlags::TIE),
Control::Off => self.clear_register_bit_flag(Register::CTRL_STATUS_2, BitFlags::TIE),
}
}
pub fn is_timer_interrupt_enabled(&mut self) -> Result<bool, Error<E>> {
self.is_register_bit_flag_high(Register::CTRL_STATUS_2, BitFlags::TIE)
}
pub fn get_timer_flag(&mut self) -> Result<bool, Error<E>> {
self.is_register_bit_flag_high(Register::CTRL_STATUS_2, BitFlags::TF)
}
pub fn clear_timer_flag(&mut self) -> Result<(), Error<E>> {
self.clear_register_bit_flag(Register::CTRL_STATUS_2, BitFlags::TF)
}
pub fn timer_interrupt_output(&mut self, output: InterruptOutput) -> Result<(), Error<E>> {
match output {
InterruptOutput::Continuous => {
self.clear_register_bit_flag(Register::CTRL_STATUS_2, BitFlags::TI_TP)
}
InterruptOutput::Pulsating => {
self.set_register_bit_flag(Register::CTRL_STATUS_2, BitFlags::TI_TP)
}
}
}
pub fn get_timer(&mut self) -> Result<u8, Error<E>> {
let mut data = [0];
self.i2c
.write_read(DEVICE_ADDRESS, &[Register::TIMER], &mut data)
.map_err(Error::I2C)?;
Ok(data[0])
}
}