From ba5213adf29104296226c343ce4676cc7ff68d3c Mon Sep 17 00:00:00 2001
From: Diego Barrios Romero <eldruin@gmail.com>
Date: Sun, 28 Oct 2018 13:32:51 +0100
Subject: [PATCH] Add functions to set/get the day of the month

---
 README.md              |  1 +
 src/ds323x/datetime.rs | 15 +++++++++++++++
 src/lib.rs             |  2 ++
 tests/common/mod.rs    |  1 +
 tests/ds323x.rs        |  7 +++++++
 5 files changed, 26 insertions(+)

diff --git a/README.md b/README.md
index fcda82c..5dc8e13 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,7 @@ This driver allows you to:
 - Read/write the minutes.
 - Read/write the hours in 24h or AM/PM format.
 - Read/write the weekday.
+- Read/write the day.
 
 ## The devices
 
diff --git a/src/ds323x/datetime.rs b/src/ds323x/datetime.rs
index 90b1cd9..4f22e75 100644
--- a/src/ds323x/datetime.rs
+++ b/src/ds323x/datetime.rs
@@ -52,6 +52,11 @@ where
         self.read_register_decimal(Register::DOW)
     }
 
+    /// Read the day of the month [1-31].
+    pub fn get_day(&mut self) -> Result<u8, Error<E>> {
+        self.read_register_decimal(Register::DOM)
+    }
+
     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))
@@ -113,6 +118,16 @@ where
         self.iface.write_register(Register::DOW, weekday)
     }
 
+    /// Set the day of month [1-31].
+    ///
+    /// Will return an `Error::InvalidInputData` if the day is out of range.
+    pub fn set_day(&mut self, day: u8) -> Result<(), Error<E>> {
+        if day < 1 || day > 7 {
+            return Err(Error::InvalidInputData);
+        }
+        self.iface.write_register(Register::DOM, day)
+    }
+
     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))
     }
diff --git a/src/lib.rs b/src/lib.rs
index 56e669e..c691cb9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -8,6 +8,7 @@
 //! - Read/write the minutes.
 //! - Read/write the hours in 24h or AM/PM format.
 //! - Read/write the weekday.
+//! - Read/write the day.
 //!
 //! ## The devices
 //!
@@ -183,6 +184,7 @@ impl Register {
     const MINUTES   : u8 = 0x01;
     const HOURS     : u8 = 0x02;
     const DOW       : u8 = 0x03;
+    const DOM       : u8 = 0x04;
 }
 
 struct BitFlags;
diff --git a/tests/common/mod.rs b/tests/common/mod.rs
index 7656b48..d389e86 100644
--- a/tests/common/mod.rs
+++ b/tests/common/mod.rs
@@ -13,6 +13,7 @@ impl Register {
     pub const MINUTES   : u8 = 0x01;
     pub const HOURS     : u8 = 0x02;
     pub const DOW       : u8 = 0x03;
+    pub const DOM       : u8 = 0x04;
 }
 
 pub struct DummyOutputPin;
diff --git a/tests/ds323x.rs b/tests/ds323x.rs
index 987ff29..db00ac2 100644
--- a/tests/ds323x.rs
+++ b/tests/ds323x.rs
@@ -98,3 +98,10 @@ mod weekday {
     set_param_test!(set_weekday, DOW, 1, 1);
     set_invalid_param_range_test!(set_weekday, 0, 8);
 }
+
+mod day {
+    use super::*;
+    get_param_test!(get_day, DOM, 1, 1);
+    set_param_test!(set_day, DOM, 1, 1);
+    set_invalid_param_range_test!(set_day, 0, 8);
+}