1use super::{PCF8563, DEVICE_ADDRESS, hal, Error, Register, BitFlags, Control};
4use hal::blocking::i2c::{Write, WriteRead};
5
6#[allow(non_camel_case_types)]
8#[derive(Copy, Clone, Debug, Eq, PartialEq)]
9#[repr(u8)]
10pub enum TimerFreq {
11 Timer_4096Hz = 0b0000_0000,
13 Timer_64Hz = 0b0000_0001,
15 Timer_1Hz = 0b0000_0010,
17 Timer_1_60Hz = 0b0000_0011,
19}
20
21impl TimerFreq {
22 pub fn bits(self) -> u8 {
24 self as u8
25 }
26}
27
28#[allow(non_camel_case_types)]
30#[derive(Copy, Clone, Debug)]
31pub enum InterruptOutput {
32 Continuous,
34 Pulsating,
36}
37
38
39impl<I2C, E> PCF8563<I2C>
40where
41 I2C: Write<Error = E> + WriteRead<Error = E>,
42{
43
44 pub fn set_timer(&mut self, time: u8) -> Result<(), Error<E>> {
46 self.write_register(Register::TIMER, time)
47 }
48
49 pub fn set_timer_frequency(
51 &mut self,
52 frequency: TimerFreq,
53 ) -> Result<(), Error<E>> {
54 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)
58 }
59
60 pub fn control_timer(&mut self, flag: Control) -> Result<(), Error<E>> {
62 match flag {
63 Control::On => {
64 self.set_register_bit_flag(Register::TIMER_CTRL, BitFlags::TE)
65 }
66 Control::Off => {
67 self.clear_register_bit_flag(Register::TIMER_CTRL, BitFlags::TE)
68 }
69 }
70 }
71
72 pub fn is_timer_enabled(&mut self) -> Result<bool, Error<E>> {
74 self.is_register_bit_flag_high(Register::TIMER_CTRL, BitFlags::TE)
75 }
76
77 pub fn control_timer_interrupt(&mut self, flag: Control) -> Result<(), Error<E>> {
79 match flag {
80 Control::On => {
81 self.set_register_bit_flag(Register::CTRL_STATUS_2, BitFlags::TIE)
82 }
83 Control::Off => {
84 self.clear_register_bit_flag(Register::CTRL_STATUS_2, BitFlags::TIE)
85 }
86 }
87 }
88
89 pub fn is_timer_interrupt_enabled(&mut self) -> Result<bool, Error<E>> {
91 self.is_register_bit_flag_high(Register::CTRL_STATUS_2, BitFlags::TIE)
92 }
93
94 pub fn get_timer_flag(&mut self) -> Result<bool, Error<E>> {
96 self.is_register_bit_flag_high(Register::CTRL_STATUS_2, BitFlags::TF)
97 }
98
99 pub fn clear_timer_flag(&mut self) -> Result<(), Error<E>> {
101 self.clear_register_bit_flag(Register::CTRL_STATUS_2, BitFlags::TF)
102 }
103
104 pub fn timer_interrupt_output(&mut self, output: InterruptOutput) -> Result<(), Error<E>> {
106 match output {
107 InterruptOutput::Continuous => {
108 self.clear_register_bit_flag(Register::CTRL_STATUS_2, BitFlags::TI_TP)
109 }
110 InterruptOutput::Pulsating => {
111 self.set_register_bit_flag(Register::CTRL_STATUS_2, BitFlags::TI_TP)
112 }
113 }
114 }
115
116 pub fn get_timer(&mut self) -> Result<u8, Error<E>> {
118 let mut data = [0];
119 self.i2c
120 .write_read(DEVICE_ADDRESS, &[Register::TIMER], &mut data)
121 .map_err(Error::I2C)?;
122 Ok(data[0])
123 }
124
125 }