use crate::{BitFlags, Ds1307, Error, Register};
use embedded_hal::i2c::I2c;
#[derive(Debug, Default, Clone, Copy, PartialEq)]
pub enum SqwOutRate {
Hz1,
Khz4_096,
Khz8_192,
#[default]
Khz32_768,
}
#[derive(Debug, Default, Clone, Copy, PartialEq)]
pub enum SqwOutLevel {
Low,
#[default]
High,
}
impl<I2C, E> Ds1307<I2C>
where
I2C: I2c<Error = E>,
{
pub fn square_wave_output_enabled(&mut self) -> Result<bool, Error<E>> {
self.register_bit_flag_high(Register::SQWOUT, BitFlags::SQWE)
}
pub fn enable_square_wave_output(&mut self) -> Result<(), Error<E>> {
self.set_register_bit_flag(Register::SQWOUT, BitFlags::SQWE)
}
pub fn disable_square_wave_output(&mut self) -> Result<(), Error<E>> {
self.clear_register_bit_flag(Register::SQWOUT, BitFlags::SQWE)
}
pub fn square_wave_output_level(&mut self) -> Result<SqwOutLevel, Error<E>> {
if self.register_bit_flag_high(Register::SQWOUT, BitFlags::OUTLEVEL)? {
Ok(SqwOutLevel::High)
} else {
Ok(SqwOutLevel::Low)
}
}
pub fn set_square_wave_output_level(&mut self, level: SqwOutLevel) -> Result<(), Error<E>> {
match level {
SqwOutLevel::Low => self.clear_register_bit_flag(Register::SQWOUT, BitFlags::OUTLEVEL),
SqwOutLevel::High => self.set_register_bit_flag(Register::SQWOUT, BitFlags::OUTLEVEL),
}
}
pub fn square_wave_output_rate(&mut self) -> Result<SqwOutRate, Error<E>> {
let data = self.read_register(Register::SQWOUT)?;
let rs1 = (data & BitFlags::OUTRATERS1) != 0;
let rs0 = (data & BitFlags::OUTRATERS0) != 0;
match (rs1, rs0) {
(false, false) => Ok(SqwOutRate::Hz1),
(false, true) => Ok(SqwOutRate::Khz4_096),
(true, false) => Ok(SqwOutRate::Khz8_192),
(true, true) => Ok(SqwOutRate::Khz32_768),
}
}
pub fn set_square_wave_output_rate(&mut self, rate: SqwOutRate) -> Result<(), Error<E>> {
let data = self.read_register(Register::SQWOUT)?;
let data = data & !BitFlags::OUTRATERS1 & !BitFlags::OUTRATERS0;
let sqwout = match rate {
SqwOutRate::Hz1 => data,
SqwOutRate::Khz4_096 => data | BitFlags::OUTRATERS0,
SqwOutRate::Khz8_192 => data | BitFlags::OUTRATERS1,
SqwOutRate::Khz32_768 => data | BitFlags::OUTRATERS1 | BitFlags::OUTRATERS0,
};
self.write_register(Register::SQWOUT, sqwout)
}
}