mirror of https://github.com/eldruin/ds323x-rs
Add functions to get/set the minutes.
parent
4aa34d8ab4
commit
c1b02cb3c0
|
@ -7,6 +7,7 @@ extremely accurate real-time clocks, based on the [`embedded-hal`] traits.
|
|||
|
||||
This driver allows you to:
|
||||
- Read/write the seconds.
|
||||
- Read/write the minutes.
|
||||
|
||||
## The devices
|
||||
|
||||
|
|
|
@ -6,14 +6,28 @@ use interface::{ ReadRegister, WriteRegister };
|
|||
|
||||
impl<DI, IC, E> Ds323x<DI, IC>
|
||||
where
|
||||
DI: ReadRegister<Error = E> + WriteRegister<Error = E>
|
||||
DI: ReadRegister<Error = E>
|
||||
{
|
||||
/// Read the seconds.
|
||||
pub fn get_seconds(&mut self) -> Result<u8, Error<E>> {
|
||||
let data = self.iface.read_register(Register::SECONDS)?;
|
||||
Ok(packed_bcd_to_decimal(data))
|
||||
self.read_register_decimal(Register::SECONDS)
|
||||
}
|
||||
|
||||
/// Read the minutes.
|
||||
pub fn get_minutes(&mut self) -> Result<u8, Error<E>> {
|
||||
self.read_register_decimal(Register::MINUTES)
|
||||
}
|
||||
|
||||
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.
|
||||
|
@ -21,7 +35,21 @@ where
|
|||
if seconds > 59 {
|
||||
return Err(Error::InvalidInputData);
|
||||
}
|
||||
self.iface.write_register(Register::SECONDS, decimal_to_packed_bcd(seconds))
|
||||
self.write_register_decimal(Register::SECONDS, seconds)
|
||||
}
|
||||
|
||||
/// Set the minutes [0-59].
|
||||
///
|
||||
/// Will return an `Error::InvalidInputData` if the minutes are out of range.
|
||||
pub fn set_minutes(&mut self, minutes: u8) -> Result<(), Error<E>> {
|
||||
if minutes > 59 {
|
||||
return Err(Error::InvalidInputData);
|
||||
}
|
||||
self.write_register_decimal(Register::MINUTES, minutes)
|
||||
}
|
||||
|
||||
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))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
//!
|
||||
//! This driver allows you to:
|
||||
//! - Read/write the seconds.
|
||||
//! - Read/write the minutes.
|
||||
//!
|
||||
//! ## The devices
|
||||
//!
|
||||
|
@ -177,6 +178,7 @@ struct Register;
|
|||
|
||||
impl Register {
|
||||
const SECONDS : u8 = 0x00;
|
||||
const MINUTES : u8 = 0x01;
|
||||
}
|
||||
|
||||
const DEVICE_ADDRESS: u8 = 0b110_1000;
|
||||
|
|
|
@ -10,6 +10,7 @@ pub struct Register;
|
|||
|
||||
impl Register {
|
||||
pub const SECONDS : u8 = 0x00;
|
||||
pub const MINUTES : u8 = 0x01;
|
||||
}
|
||||
|
||||
pub struct DummyOutputPin;
|
||||
|
|
|
@ -7,21 +7,46 @@ mod common;
|
|||
use common::{ DEVICE_ADDRESS, Register, new_ds3231,
|
||||
new_ds3232, new_ds3234 };
|
||||
|
||||
get_test!(can_get_seconds_ds3231, get_seconds, new_ds3231, 1,
|
||||
I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::SECONDS], vec![1]));
|
||||
mod seconds {
|
||||
use super::*;
|
||||
get_test!(can_get_ds3231, get_seconds, new_ds3231, 1,
|
||||
I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::SECONDS], vec![1]));
|
||||
|
||||
get_test!(can_get_seconds_ds3232, get_seconds, new_ds3232, 1,
|
||||
I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::SECONDS], vec![1]));
|
||||
get_test!(can_get_ds3232, get_seconds, new_ds3232, 1,
|
||||
I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::SECONDS], vec![1]));
|
||||
|
||||
get_test!(can_get_seconds_ds3234, get_seconds, new_ds3234, 1,
|
||||
SpiTrans::transfer(vec![Register::SECONDS, 0], vec![Register::SECONDS, 1]));
|
||||
get_test!(can_get_ds3234, get_seconds, new_ds3234, 1,
|
||||
SpiTrans::transfer(vec![Register::SECONDS, 0], vec![Register::SECONDS, 1]));
|
||||
|
||||
|
||||
set_test!(can_set_seconds_ds3231, set_seconds, new_ds3231, 1,
|
||||
I2cTrans::write(DEVICE_ADDRESS, vec![Register::SECONDS, 1]));
|
||||
set_test!(can_set_ds3231, set_seconds, new_ds3231, 1,
|
||||
I2cTrans::write(DEVICE_ADDRESS, vec![Register::SECONDS, 1]));
|
||||
|
||||
set_test!(can_set_seconds_ds3232, set_seconds, new_ds3232, 1,
|
||||
I2cTrans::write(DEVICE_ADDRESS, vec![Register::SECONDS, 1]));
|
||||
set_test!(can_set_ds3232, set_seconds, new_ds3232, 1,
|
||||
I2cTrans::write(DEVICE_ADDRESS, vec![Register::SECONDS, 1]));
|
||||
|
||||
set_test!(can_set_seconds_ds3234, set_seconds, new_ds3234, 1,
|
||||
SpiTrans::write(vec![Register::SECONDS + 0x80, 1]));
|
||||
set_test!(can_set_ds3234, set_seconds, new_ds3234, 1,
|
||||
SpiTrans::write(vec![Register::SECONDS + 0x80, 1]));
|
||||
}
|
||||
|
||||
mod minutes {
|
||||
use super::*;
|
||||
get_test!(can_get_ds3231, get_minutes, new_ds3231, 1,
|
||||
I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::MINUTES], vec![1]));
|
||||
|
||||
get_test!(can_get_ds3232, get_minutes, new_ds3232, 1,
|
||||
I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::MINUTES], vec![1]));
|
||||
|
||||
get_test!(can_get_ds3234, get_minutes, new_ds3234, 1,
|
||||
SpiTrans::transfer(vec![Register::MINUTES, 0], vec![Register::MINUTES, 1]));
|
||||
|
||||
|
||||
set_test!(can_set_ds3231, set_minutes, new_ds3231, 1,
|
||||
I2cTrans::write(DEVICE_ADDRESS, vec![Register::MINUTES, 1]));
|
||||
|
||||
set_test!(can_set_ds3232, set_minutes, new_ds3232, 1,
|
||||
I2cTrans::write(DEVICE_ADDRESS, vec![Register::MINUTES, 1]));
|
||||
|
||||
set_test!(can_set_ds3234, set_minutes, new_ds3234, 1,
|
||||
SpiTrans::write(vec![Register::MINUTES + 0x80, 1]));
|
||||
}
|
Loading…
Reference in New Issue