mirror of https://github.com/eldruin/ds323x-rs
Add function to get/set the month
parent
63fe08c6b5
commit
2cf7855293
|
@ -11,6 +11,7 @@ This driver allows you to:
|
|||
- Read/write the hours in 24h or AM/PM format.
|
||||
- Read/write the weekday.
|
||||
- Read/write the day.
|
||||
- Read/write the month.
|
||||
|
||||
## The devices
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ pub enum Hours {
|
|||
|
||||
impl<DI, IC, E> Ds323x<DI, IC>
|
||||
where
|
||||
DI: ReadRegister<Error = E>
|
||||
DI: ReadRegister<Error = E> + WriteRegister<Error = E>
|
||||
{
|
||||
/// Read the seconds.
|
||||
pub fn get_seconds(&mut self) -> Result<u8, Error<E>> {
|
||||
|
@ -57,16 +57,18 @@ where
|
|||
self.read_register_decimal(Register::DOM)
|
||||
}
|
||||
|
||||
/// Read the month [1-12].
|
||||
pub fn get_month(&mut self) -> Result<u8, Error<E>> {
|
||||
let data = self.iface.read_register(Register::MONTH)?;
|
||||
let value = data & !BitFlags::CENTURY;
|
||||
Ok(packed_bcd_to_decimal(value))
|
||||
}
|
||||
|
||||
fn read_register_decimal(&mut self, register: u8) -> Result<u8, Error<E>> {
|
||||
let data = self.iface.read_register(register)?;
|
||||
Ok(packed_bcd_to_decimal(data))
|
||||
}
|
||||
}
|
||||
|
||||
impl<DI, IC, E> Ds323x<DI, IC>
|
||||
where
|
||||
DI: WriteRegister<Error = E>
|
||||
{
|
||||
/// Set the seconds [0-59].
|
||||
///
|
||||
/// Will return an `Error::InvalidInputData` if the seconds are out of range.
|
||||
|
@ -128,6 +130,19 @@ where
|
|||
self.iface.write_register(Register::DOM, day)
|
||||
}
|
||||
|
||||
/// Set the month [1-12].
|
||||
///
|
||||
/// Will return an `Error::InvalidInputData` if the month is out of range.
|
||||
pub fn set_month(&mut self, month: u8) -> Result<(), Error<E>> {
|
||||
if month < 1 || month > 12 {
|
||||
return Err(Error::InvalidInputData);
|
||||
}
|
||||
// keep the century bit
|
||||
let data = self.iface.read_register(Register::MONTH)?;
|
||||
let value = (data & BitFlags::CENTURY) | decimal_to_packed_bcd(month);
|
||||
self.iface.write_register(Register::MONTH, value)
|
||||
}
|
||||
|
||||
fn write_register_decimal(&mut self, register: u8, decimal_number: u8) -> Result<(), Error<E>> {
|
||||
self.iface.write_register(register, decimal_to_packed_bcd(decimal_number))
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
//! - Read/write the hours in 24h or AM/PM format.
|
||||
//! - Read/write the weekday.
|
||||
//! - Read/write the day.
|
||||
//! - Read/write the month.
|
||||
//!
|
||||
//! ## The devices
|
||||
//!
|
||||
|
@ -185,6 +186,7 @@ impl Register {
|
|||
const HOURS : u8 = 0x02;
|
||||
const DOW : u8 = 0x03;
|
||||
const DOM : u8 = 0x04;
|
||||
const MONTH : u8 = 0x05;
|
||||
}
|
||||
|
||||
struct BitFlags;
|
||||
|
@ -192,6 +194,7 @@ struct BitFlags;
|
|||
impl BitFlags {
|
||||
const H24_H12 : u8 = 0b0100_0000;
|
||||
const AM_PM : u8 = 0b0010_0000;
|
||||
const CENTURY : u8 = 0b1000_0000;
|
||||
}
|
||||
|
||||
const DEVICE_ADDRESS: u8 = 0b110_1000;
|
||||
|
|
|
@ -14,6 +14,7 @@ impl Register {
|
|||
pub const HOURS : u8 = 0x02;
|
||||
pub const DOW : u8 = 0x03;
|
||||
pub const DOM : u8 = 0x04;
|
||||
pub const MONTH : u8 = 0x05;
|
||||
}
|
||||
|
||||
pub struct DummyOutputPin;
|
||||
|
|
|
@ -34,6 +34,20 @@ macro_rules! set_param_test {
|
|||
[ SpiTrans::write(vec![Register::$register + 0x80, $binary_value]) ]);
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! read_set_param_test {
|
||||
($method:ident, $register:ident, $value:expr, $binary_value_read:expr, $binary_value_write:expr) => {
|
||||
set_test!(can_read_set_ds3231, $method, new_ds3231, $value,
|
||||
[ I2cTrans::write_read(DEV_ADDR, vec![Register::$register], vec![$binary_value_read]),
|
||||
I2cTrans::write(DEV_ADDR, vec![Register::$register, $binary_value_write]) ]);
|
||||
|
||||
set_test!(can_read_set_ds3232, $method, new_ds3232, $value,
|
||||
[ I2cTrans::write_read(DEV_ADDR, vec![Register::$register], vec![$binary_value_read]),
|
||||
I2cTrans::write(DEV_ADDR, vec![Register::$register, $binary_value_write]) ]);
|
||||
|
||||
set_test!(can_read_set_ds3234, $method, new_ds3234, $value,
|
||||
[ SpiTrans::transfer(vec![Register::$register, 0], vec![Register::$register, $binary_value_read]),
|
||||
SpiTrans::write(vec![Register::$register + 0x80, $binary_value_write]) ]);
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -107,3 +121,16 @@ mod day {
|
|||
set_param_test!(set_day, DOM, 1, 1);
|
||||
set_invalid_param_range_test!(set_day, 0, 8);
|
||||
}
|
||||
|
||||
mod month {
|
||||
use super::*;
|
||||
get_param_test!(get_month, MONTH, 1, 1);
|
||||
read_set_param_test!(set_month, MONTH, 12, 0b0000_0010, 0b0001_0010);
|
||||
set_invalid_param_range_test!(set_month, 0, 13);
|
||||
|
||||
mod keeps_century {
|
||||
use super::*;
|
||||
get_param_test!(get_month, MONTH, 12, 0b1001_0010);
|
||||
read_set_param_test!(set_month, MONTH, 12, 0b1000_0010, 0b1001_0010);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue