pcf8563/
timer.rs

1//! All timer-related functions will be defined here
2
3use super::{PCF8563, DEVICE_ADDRESS, hal, Error, Register, BitFlags, Control};
4use hal::blocking::i2c::{Write, WriteRead};
5
6/// Four possible timer frequency settings.
7#[allow(non_camel_case_types)]
8#[derive(Copy, Clone, Debug, Eq, PartialEq)]
9#[repr(u8)]
10pub enum TimerFreq {    
11    /// Set timer frequency to 4096 Hz.
12    Timer_4096Hz    = 0b0000_0000, 
13    /// Set timer frequency to 64 Hz.
14    Timer_64Hz      = 0b0000_0001, 
15    /// Set timer frequency to 1 Hz.    
16    Timer_1Hz       = 0b0000_0010, 
17    /// Set timer frequency to 1/60 Hz. This should be used when timer is off to limit energy consumption.
18    Timer_1_60Hz    = 0b0000_0011, 
19}
20
21impl TimerFreq {
22    /// Converts the TimerFreq to an unsigned 8-bit value
23    pub fn bits(self) -> u8 {
24        self as u8
25    }
26}
27
28/// Two possible timer interrupt output modes
29#[allow(non_camel_case_types)]
30#[derive(Copy, Clone, Debug)]
31pub enum InterruptOutput {    
32    /// Active when TF active (default setting).
33    Continuous, 
34    /// Pulsating according to the datasheet.
35    Pulsating,     
36}
37
38
39impl<I2C, E> PCF8563<I2C>
40where
41    I2C: Write<Error = E> + WriteRead<Error = E>, 
42{
43
44    /// Set the timer [0-255]
45    pub fn set_timer(&mut self, time: u8) -> Result<(), Error<E>> {        
46        self.write_register(Register::TIMER, time)
47    }
48
49    /// Set timer frequency (does not alter the timer enabled/disabled bit).
50    pub fn set_timer_frequency(
51        &mut self,
52        frequency: TimerFreq,
53    ) -> Result<(), Error<E>> {        
54        let data = self.read_register(Register::TIMER_CTRL)?; // read current value
55        let data = data & 0b1000_0000; // keep the TE bit as is         
56        let data = data | frequency.bits(); // set the lowest two bits
57        self.write_register(Register::TIMER_CTRL, data)
58    }
59
60    /// Enable or disable the timer interrupt.
61    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    /// Check if timer is enabled.
73    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    /// Enable or disable timer interrupt.
78    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    /// Check if timer interrupt is enabled.
90    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    /// Get the timer flag status (if true, timer was triggered).
95    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    /// Clear the timer flag.
100    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    /// Select the interrupt output mode when TF flag is set (continuous or pulsating).
105    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    /// Read the current timer value.
117    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    //TO DO:
126    //
127    // pub fn get_timer_interrupt_output()
128    //
129    // pub fn get_timer_frequency()
130    //
131    /* USE THIS EXAMPLE FOR GET_TIMER_FREQUENCY() ?
132   
133    pub fn get_square_wave_output_rate(&mut self) -> Result<SQWOUTRateBits, Error<E>> {
134        let data = self.read_register(Register::SQWOUT)?;
135        Ok(SQWOUTRateBits {
136            rs0: (data & BitFlags::OUTRATERS0) != 0,
137            rs1: (data & BitFlags::OUTRATERS1) != 0,
138        })
139    }
140    */
141
142}