ds1307 0.6.0

Platform-agnostic Rust driver for the DS1307 real-time clock.
Documentation
use ds1307::Ds1307;
use embedded_hal_mock::eh1::i2c::{Mock as I2cMock, Transaction as I2cTrans};

pub const ADDR: u8 = 0b110_1000;

pub struct Register;
#[allow(unused)]
impl Register {
    pub const SECONDS: u8 = 0x00;
    pub const MINUTES: u8 = 0x01;
    pub const HOURS: u8 = 0x02;
    pub const DOW: u8 = 0x03;
    pub const DOM: u8 = 0x04;
    pub const MONTH: u8 = 0x05;
    pub const YEAR: u8 = 0x06;
    pub const SQWOUT: u8 = 0x07;
    pub const RAM_BEGIN: u8 = 0x08;
    pub const RAM_END: u8 = 0x3F;
}

pub fn new(transactions: &[I2cTrans]) -> Ds1307<I2cMock> {
    Ds1307::new(I2cMock::new(transactions))
}

pub fn destroy(dev: Ds1307<I2cMock>) {
    dev.destroy().done();
}

#[macro_export]
macro_rules! assert_invalid_input_data {
    ($result:expr) => {
        match $result {
            Err(Error::InvalidInputData) => (),
            _ => panic!("InvalidInputData error not returned."),
        }
    };
}

#[macro_export]
macro_rules! set_invalid_test {
    ($name:ident, $method:ident, $( $value:expr ),+) => {
        #[test]
        fn $name() {
            let mut rtc = new(&[]);
            assert_invalid_input_data!(rtc.$method($($value),*));
            destroy(rtc);
        }
    };
}

#[macro_export]
macro_rules! trans_read {
    ($register:ident, [ $( $read_bin:expr ),+ ]) => {
        [ I2cTrans::write_read(ADDR, vec![Register::$register], vec![$( $read_bin ),*]) ]
    }
}

#[macro_export]
macro_rules! trans_write {
    ($register:ident, [ $( $read_bin:expr ),+ ]) => {
        [ I2cTrans::write(ADDR, vec![Register::$register, $( $read_bin ),*]) ]
    }
}

#[macro_export]
macro_rules! get_test {
    ($name:ident, $method:ident, $expected:expr, $transactions:expr) => {
        #[test]
        fn $name() {
            let mut dev = new(&$transactions);
            assert_eq!($expected, dev.$method().unwrap());
            destroy(dev);
        }
    };
}

#[macro_export]
macro_rules! set_test {
    ($name:ident, $method:ident, $value:expr, $transactions:expr) => {
        #[test]
        fn $name() {
            let mut dev = new(&$transactions);
            dev.$method($value).unwrap();
            destroy(dev);
        }
    };
}