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:
|
This driver allows you to:
|
||||||
- Read/write the seconds.
|
- Read/write the seconds.
|
||||||
|
- Read/write the minutes.
|
||||||
|
|
||||||
## The devices
|
## The devices
|
||||||
|
|
||||||
|
|
|
@ -6,14 +6,28 @@ use interface::{ ReadRegister, WriteRegister };
|
||||||
|
|
||||||
impl<DI, IC, E> Ds323x<DI, IC>
|
impl<DI, IC, E> Ds323x<DI, IC>
|
||||||
where
|
where
|
||||||
DI: ReadRegister<Error = E> + WriteRegister<Error = E>
|
DI: ReadRegister<Error = E>
|
||||||
{
|
{
|
||||||
/// Read the seconds.
|
/// Read the seconds.
|
||||||
pub fn get_seconds(&mut self) -> Result<u8, Error<E>> {
|
pub fn get_seconds(&mut self) -> Result<u8, Error<E>> {
|
||||||
let data = self.iface.read_register(Register::SECONDS)?;
|
self.read_register_decimal(Register::SECONDS)
|
||||||
Ok(packed_bcd_to_decimal(data))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 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].
|
/// Set the seconds [0-59].
|
||||||
///
|
///
|
||||||
/// Will return an `Error::InvalidInputData` if the seconds are out of range.
|
/// Will return an `Error::InvalidInputData` if the seconds are out of range.
|
||||||
|
@ -21,7 +35,21 @@ where
|
||||||
if seconds > 59 {
|
if seconds > 59 {
|
||||||
return Err(Error::InvalidInputData);
|
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:
|
//! This driver allows you to:
|
||||||
//! - Read/write the seconds.
|
//! - Read/write the seconds.
|
||||||
|
//! - Read/write the minutes.
|
||||||
//!
|
//!
|
||||||
//! ## The devices
|
//! ## The devices
|
||||||
//!
|
//!
|
||||||
|
@ -177,6 +178,7 @@ struct Register;
|
||||||
|
|
||||||
impl Register {
|
impl Register {
|
||||||
const SECONDS : u8 = 0x00;
|
const SECONDS : u8 = 0x00;
|
||||||
|
const MINUTES : u8 = 0x01;
|
||||||
}
|
}
|
||||||
|
|
||||||
const DEVICE_ADDRESS: u8 = 0b110_1000;
|
const DEVICE_ADDRESS: u8 = 0b110_1000;
|
||||||
|
|
|
@ -10,6 +10,7 @@ pub struct Register;
|
||||||
|
|
||||||
impl Register {
|
impl Register {
|
||||||
pub const SECONDS : u8 = 0x00;
|
pub const SECONDS : u8 = 0x00;
|
||||||
|
pub const MINUTES : u8 = 0x01;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct DummyOutputPin;
|
pub struct DummyOutputPin;
|
||||||
|
|
|
@ -7,21 +7,46 @@ mod common;
|
||||||
use common::{ DEVICE_ADDRESS, Register, new_ds3231,
|
use common::{ DEVICE_ADDRESS, Register, new_ds3231,
|
||||||
new_ds3232, new_ds3234 };
|
new_ds3232, new_ds3234 };
|
||||||
|
|
||||||
get_test!(can_get_seconds_ds3231, get_seconds, new_ds3231, 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]));
|
I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::SECONDS], vec![1]));
|
||||||
|
|
||||||
get_test!(can_get_seconds_ds3232, get_seconds, new_ds3232, 1,
|
get_test!(can_get_ds3232, get_seconds, new_ds3232, 1,
|
||||||
I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::SECONDS], vec![1]));
|
I2cTrans::write_read(DEVICE_ADDRESS, vec![Register::SECONDS], vec![1]));
|
||||||
|
|
||||||
get_test!(can_get_seconds_ds3234, get_seconds, new_ds3234, 1,
|
get_test!(can_get_ds3234, get_seconds, new_ds3234, 1,
|
||||||
SpiTrans::transfer(vec![Register::SECONDS, 0], vec![Register::SECONDS, 1]));
|
SpiTrans::transfer(vec![Register::SECONDS, 0], vec![Register::SECONDS, 1]));
|
||||||
|
|
||||||
|
|
||||||
set_test!(can_set_seconds_ds3231, set_seconds, new_ds3231, 1,
|
set_test!(can_set_ds3231, set_seconds, new_ds3231, 1,
|
||||||
I2cTrans::write(DEVICE_ADDRESS, vec![Register::SECONDS, 1]));
|
I2cTrans::write(DEVICE_ADDRESS, vec![Register::SECONDS, 1]));
|
||||||
|
|
||||||
set_test!(can_set_seconds_ds3232, set_seconds, new_ds3232, 1,
|
set_test!(can_set_ds3232, set_seconds, new_ds3232, 1,
|
||||||
I2cTrans::write(DEVICE_ADDRESS, vec![Register::SECONDS, 1]));
|
I2cTrans::write(DEVICE_ADDRESS, vec![Register::SECONDS, 1]));
|
||||||
|
|
||||||
set_test!(can_set_seconds_ds3234, set_seconds, new_ds3234, 1,
|
set_test!(can_set_ds3234, set_seconds, new_ds3234, 1,
|
||||||
SpiTrans::write(vec![Register::SECONDS + 0x80, 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