From 5098e7b453d5726f946c96cfdad4c69bce78f62d Mon Sep 17 00:00:00 2001
From: kirbylife <kirbylife@protonmail.com>
Date: Thu, 30 Mar 2023 22:25:02 -0600
Subject: [PATCH] Add method to create a Datetime since the RTC instance

---
 src/datetime.rs | 22 ++++++++++++++++++++++
 src/main.rs     | 22 ++--------------------
 2 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/src/datetime.rs b/src/datetime.rs
index 6bcc19f..0f9539d 100644
--- a/src/datetime.rs
+++ b/src/datetime.rs
@@ -30,6 +30,28 @@ impl Datetime {
         t += self.seconds as i64;
         t as u64
     }
+
+    pub fn from_ds3231<T: ds323x::Rtcc>(rtc: &mut T) -> Self {
+        let year = rtc.year().map_err(|_| ()).unwrap();
+        let month = rtc.month().map_err(|_| ()).unwrap();
+        let day = rtc.day().map_err(|_| ()).unwrap();
+        let hour = match rtc.hours().map_err(|_| ()).unwrap() {
+            ds323x::Hours::AM(val) => val,
+            ds323x::Hours::PM(val) => val + 12,
+            ds323x::Hours::H24(val) => val,
+        };
+        let minute = rtc.minutes().map_err(|_| ()).unwrap();
+        let second = rtc.seconds().map_err(|_| ()).unwrap();
+
+        Datetime {
+            year: year,
+            month: month,
+            day: day,
+            hours: hour,
+            minutes: minute,
+            seconds: second,
+        }
+    }
 }
 
 fn year_to_secs(year: i64) -> (i64, bool) {
diff --git a/src/main.rs b/src/main.rs
index 0bedda3..bebe2e6 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -7,7 +7,6 @@ mod datetime;
 use arduino_hal::default_serial;
 use arduino_hal::delay_ms;
 use crypto::hmac_sha1;
-use ds323x::Rtcc;
 
 use panic_halt as _;
 
@@ -73,27 +72,10 @@ fn main() -> ! {
     );
     let mut rtc = ds323x::Ds323x::new_ds3231(i2c_clock);
 
-    let year = rtc.year().unwrap();
-    let month = rtc.month().unwrap();
-    let day = rtc.day().unwrap();
-    let hour = match rtc.hours().unwrap() {
-        ds323x::Hours::AM(val) => val,
-        ds323x::Hours::PM(val) => val + 12,
-        ds323x::Hours::H24(val) => val,
-    };
-    let minute = rtc.minutes().unwrap();
-    let second = rtc.seconds().unwrap();
+    let datetime = datetime::Datetime::from_ds3231(&mut rtc);
 
-    let datetime = datetime::Datetime {
-        year: year,
-        month: month,
-        day: day,
-        hours: hour,
-        minutes: minute,
-        seconds: second,
-    };
     let timestamp = datetime.unix_epoch();
-    ufmt::uwriteln!(&mut serial, "Timestamp: {}", timestamp);
+    ufmt::uwriteln!(&mut serial, "Timestamp: {}", timestamp).unwrap();
 
     let token = generate_otp_token("FS7J22EHLLSOGKUVJKV2XE7FTIX24JAJ", 1680155315);
     ufmt::uwriteln!(&mut serial, "token: {}", token).unwrap();