From fe990d7295719be4cff5c1e046654a4b81502de1 Mon Sep 17 00:00:00 2001
From: Diego Barrios Romero <eldruin@gmail.com>
Date: Sun, 16 Jul 2023 13:43:46 +0200
Subject: [PATCH 1/4] Avoid using deprecated methods

---
 README.md                   |  5 ++++-
 examples/linux.rs           |  5 ++++-
 src/ds323x/configuration.rs | 13 ++++++-------
 tests/alarms.rs             |  4 ++--
 tests/datetime.rs           | 34 +++++++++++++++++++++++-----------
 5 files changed, 39 insertions(+), 22 deletions(-)

diff --git a/README.md b/README.md
index 1db3164..8ed15bf 100644
--- a/README.md
+++ b/README.md
@@ -117,7 +117,10 @@ use linux_embedded_hal::I2cdev;
 fn main() {
     let dev = I2cdev::new("/dev/i2c-1").unwrap();
     let mut rtc = Ds323x::new_ds3231(dev);
-    let datetime = NaiveDate::from_ymd(2020, 5, 1).and_hms(19, 59, 58);
+    let datetime = NaiveDate::from_ymd_opt(2020, 5, 1)
+        .unwrap()
+        .and_hms_opt(19, 59, 58)
+        .unwrap();
     rtc.set_datetime(&datetime).unwrap();
     // do something else...
     let time = rtc.time().unwrap();
diff --git a/examples/linux.rs b/examples/linux.rs
index d4653fe..2a03071 100644
--- a/examples/linux.rs
+++ b/examples/linux.rs
@@ -4,7 +4,10 @@ use linux_embedded_hal::I2cdev;
 fn main() {
     let dev = I2cdev::new("/dev/i2c-1").unwrap();
     let mut rtc = Ds323x::new_ds3231(dev);
-    let datetime = NaiveDate::from_ymd(2020, 5, 1).and_hms(19, 59, 58);
+    let datetime = NaiveDate::from_ymd_opt(2020, 5, 1)
+        .unwrap()
+        .and_hms_opt(19, 59, 58)
+        .unwrap();
     rtc.set_datetime(&datetime).unwrap();
     // do something else...
     let time = rtc.time().unwrap();
diff --git a/src/ds323x/configuration.rs b/src/ds323x/configuration.rs
index edfa965..1a6327e 100644
--- a/src/ds323x/configuration.rs
+++ b/src/ds323x/configuration.rs
@@ -84,13 +84,12 @@ where
 
     /// Set the square-wave output frequency.
     pub fn set_square_wave_frequency(&mut self, freq: SqWFreq) -> Result<(), Error<CommE, PinE>> {
-        let new_control;
-        match freq {
-            SqWFreq::_1Hz => new_control = self.control & !BitFlags::RS2 & !BitFlags::RS1,
-            SqWFreq::_1_024Hz => new_control = self.control & !BitFlags::RS2 | BitFlags::RS1,
-            SqWFreq::_4_096Hz => new_control = self.control | BitFlags::RS2 & !BitFlags::RS1,
-            SqWFreq::_8_192Hz => new_control = self.control | BitFlags::RS2 | BitFlags::RS1,
-        }
+        let new_control = match freq {
+            SqWFreq::_1Hz => self.control & !BitFlags::RS2 & !BitFlags::RS1,
+            SqWFreq::_1_024Hz => self.control & !BitFlags::RS2 | BitFlags::RS1,
+            SqWFreq::_4_096Hz => self.control | BitFlags::RS2 & !BitFlags::RS1,
+            SqWFreq::_8_192Hz => self.control | BitFlags::RS2 | BitFlags::RS1,
+        };
         self.write_control(new_control)
     }
 
diff --git a/tests/alarms.rs b/tests/alarms.rs
index cbe349d..73224fe 100644
--- a/tests/alarms.rs
+++ b/tests/alarms.rs
@@ -637,7 +637,7 @@ mod alarm1_day {
         set_alarm1_hms,
         ALARM1_SECONDS,
         [4, 3, 2, AM | 1],
-        NaiveTime::from_hms(2, 3, 4)
+        NaiveTime::from_hms_opt(2, 3, 4).unwrap()
     );
     set_alarm_test!(
         match_hms,
@@ -922,7 +922,7 @@ mod alarm2_day {
         set_alarm2_hm,
         ALARM2_MINUTES,
         [3, 2, AM | 1],
-        NaiveTime::from_hms(2, 3, 0)
+        NaiveTime::from_hms_opt(2, 3, 0).unwrap()
     );
     set_alarm_test!(
         match_hm,
diff --git a/tests/datetime.rs b/tests/datetime.rs
index 620356b..7012575 100644
--- a/tests/datetime.rs
+++ b/tests/datetime.rs
@@ -1,4 +1,5 @@
 use embedded_hal_mock::{i2c::Transaction as I2cTrans, spi::Transaction as SpiTrans};
+use rtcc::NaiveDateTime;
 mod common;
 use self::common::{
     destroy_ds3231, destroy_ds3232, destroy_ds3234, new_ds3231, new_ds3232, new_ds3234, Register,
@@ -8,6 +9,17 @@ use self::common::{
 use ds323x::Rtcc;
 use ds323x::{DateTimeAccess, Error, Hours, NaiveDate, NaiveTime};
 
+fn new_datetime(y: i32, mo: u32, d: u32, h: u32, min: u32, s: u32) -> NaiveDateTime {
+    NaiveDate::from_ymd_opt(y, mo, d)
+        .unwrap()
+        .and_hms_opt(h, min, s)
+        .unwrap()
+}
+
+fn new_date(y: i32, mo: u32, d: u32) -> NaiveDate {
+    NaiveDate::from_ymd_opt(y, mo, d).unwrap()
+}
+
 macro_rules! read_set_param_write_two_test {
     ($name:ident, $method:ident, $value:expr, $register:ident, $binary_value1_read:expr, $bin1:expr, $bin2:expr) => {
         _set_param_test!(
@@ -206,28 +218,28 @@ macro_rules! invalid_dt_test {
             use super::*;
             #[test]
             fn datetime_too_small() {
-                let dt = NaiveDate::from_ymd(1999, 1, 2).and_hms(3, 4, 5);
+                let dt = new_datetime(1999, 1, 2, 3, 4, 5);
                 let mut dev = $create_method(&[]);
                 assert_invalid_input_data!(dev.set_datetime(&dt));
                 $destroy_method(dev);
             }
             #[test]
             fn datetime_too_big() {
-                let dt = NaiveDate::from_ymd(2101, 1, 2).and_hms(3, 4, 5);
+                let dt = new_datetime(2101, 1, 2, 3, 4, 5);
                 let mut dev = $create_method(&[]);
                 assert_invalid_input_data!(dev.set_datetime(&dt));
                 $destroy_method(dev);
             }
             #[test]
             fn date_too_small() {
-                let d = NaiveDate::from_ymd(1999, 1, 2);
+                let d = new_date(1999, 1, 2);
                 let mut dev = $create_method(&[]);
                 assert_invalid_input_data!(dev.set_date(&d));
                 $destroy_method(dev);
             }
             #[test]
             fn date_too_big() {
-                let d = NaiveDate::from_ymd(2101, 1, 2);
+                let d = new_date(2101, 1, 2);
                 let mut dev = $create_method(&[]);
                 assert_invalid_input_data!(dev.set_date(&d));
                 $destroy_method(dev);
@@ -255,7 +267,7 @@ macro_rules! dt_test {
             use super::*;
             #[test]
             fn get_datetime() {
-                let dt = NaiveDate::from_ymd(2018, 8, 13).and_hms(23, 59, 58);
+                let dt = new_datetime(2018, 8, 13, 23, 59, 58);
                 let mut dev = $create_method(&$mac_trans_read!(
                     SECONDS,
                     [
@@ -275,7 +287,7 @@ macro_rules! dt_test {
 
             #[test]
             fn set_datetime() {
-                let dt = NaiveDate::from_ymd(2018, 8, 13).and_hms(23, 59, 58);
+                let dt = new_datetime(2018, 8, 13, 23, 59, 58);
                 let mut dev = $create_method(&$mac_trans_write!(
                     SECONDS,
                     [
@@ -294,7 +306,7 @@ macro_rules! dt_test {
 
             #[test]
             fn get_date() {
-                let d = NaiveDate::from_ymd(2018, 8, 13);
+                let d = new_date(2018, 8, 13);
                 let mut dev = $create_method(&$mac_trans_read!(
                     DOM,
                     [0b0001_0011, 0b0000_1000, 0b0001_1000],
@@ -306,7 +318,7 @@ macro_rules! dt_test {
 
             #[test]
             fn set_date() {
-                let d = NaiveDate::from_ymd(2018, 8, 13);
+                let d = new_date(2018, 8, 13);
                 let mut dev = $create_method(&$mac_trans_write!(
                     DOW,
                     [0b0000_0010, 0b0001_0011, 0b0000_1000, 0b0001_1000]
@@ -317,7 +329,7 @@ macro_rules! dt_test {
 
             #[test]
             fn set_date_century() {
-                let d = NaiveDate::from_ymd(2100, 8, 13);
+                let d = new_date(2100, 8, 13);
                 let mut dev = $create_method(&$mac_trans_write!(
                     DOW,
                     [0b0000_0110, 0b0001_0011, 0b1000_1000, 0]
@@ -328,7 +340,7 @@ macro_rules! dt_test {
 
             #[test]
             fn get_time() {
-                let t = NaiveTime::from_hms(23, 59, 58);
+                let t = NaiveTime::from_hms_opt(23, 59, 58).unwrap();
                 let mut dev = $create_method(&$mac_trans_read!(
                     SECONDS,
                     [0b0101_1000, 0b0101_1001, 0b0010_0011],
@@ -340,7 +352,7 @@ macro_rules! dt_test {
 
             #[test]
             fn set_time() {
-                let t = NaiveTime::from_hms(23, 59, 58);
+                let t = NaiveTime::from_hms_opt(23, 59, 58).unwrap();
                 let mut dev = $create_method(&$mac_trans_write!(
                     SECONDS,
                     [0b0101_1000, 0b0101_1001, 0b0010_0011]

From f7d48398dc152f46d5a99ba36627ad02e30cec4e Mon Sep 17 00:00:00 2001
From: Diego Barrios Romero <eldruin@gmail.com>
Date: Sun, 16 Jul 2023 13:43:59 +0200
Subject: [PATCH 2/4] Update copyright

---
 LICENSE-MIT | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/LICENSE-MIT b/LICENSE-MIT
index 0f6c02d..bf445da 100644
--- a/LICENSE-MIT
+++ b/LICENSE-MIT
@@ -1,4 +1,4 @@
-Copyright (C) 2018-2022 Diego Barrios Romero
+Copyright (C) 2018-2023 Diego Barrios Romero
 
 Permission is hereby granted, free of charge, to any person obtaining a copy of
 this software and associated documentation files (the "Software"), to deal in

From a8b84285700f545ab7c78cdcfe494ee29b8466bf Mon Sep 17 00:00:00 2001
From: Diego Barrios Romero <eldruin@gmail.com>
Date: Sun, 16 Jul 2023 13:44:14 +0200
Subject: [PATCH 3/4] Update dependency

---
 Cargo.toml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Cargo.toml b/Cargo.toml
index bc53d2e..6b92d96 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -25,7 +25,7 @@ embedded-hal = "0.2.7"
 rtcc = "0.3"
 
 [dev-dependencies]
-embedded-hal-mock = "0.8.0"
+embedded-hal-mock = "0.9.0"
 linux-embedded-hal = "0.3.2"
 
 [profile.release]

From de0231b958bd670f945fb9f44358989650c0b70a Mon Sep 17 00:00:00 2001
From: Diego Barrios Romero <eldruin@gmail.com>
Date: Sun, 16 Jul 2023 13:44:50 +0200
Subject: [PATCH 4/4] Raise MSRV and update CI

---
 .github/workflows/build.yml | 107 ++++++++++--------------------------
 CHANGELOG.md                |   3 +-
 README.md                   |   2 +-
 3 files changed, 32 insertions(+), 80 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index de3e868..4385c96 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -1,8 +1,5 @@
-on:
-  push:
-  pull_request:
-
 name: Build
+on: [push, pull_request]
 
 env:
   RUSTFLAGS: '--deny warnings'
@@ -13,7 +10,7 @@ jobs:
     runs-on: ubuntu-latest
     strategy:
       matrix:
-        rust: [stable, beta, 1.35.0]
+        rust: [stable, 1.60.0]
         TARGET:
           - x86_64-unknown-linux-gnu
           - x86_64-unknown-linux-musl
@@ -26,16 +23,14 @@ jobs:
           - thumbv7m-none-eabi
 
     steps:
-      - uses: actions/checkout@v2
-      - uses: actions-rs/toolchain@v1
+      - uses: actions/checkout@v3
+      - uses: dtolnay/rust-toolchain@master
         with:
-          profile: minimal
           toolchain: ${{ matrix.rust }}
-          target: ${{ matrix.TARGET }}
-          override: true
+          targets: ${{ matrix.TARGET }}
 
       - name: Checkout CI scripts
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           repository: 'eldruin/rust-driver-ci-scripts'
           ref: 'master'
@@ -44,114 +39,70 @@ jobs:
       - run: ./ci/patch-no-std.sh
         if: ${{ ! contains(matrix.TARGET, 'x86_64') }}
 
-      - name: Build
-        uses: actions-rs/cargo@v1
-        with:
-          command: build
-          args: --target=${{ matrix.TARGET }}
+      - run: cargo build --target=${{ matrix.TARGET }}
 
   checks:
     name: Checks
     runs-on: ubuntu-latest
-    strategy:
-      matrix:
-        rust: [stable, beta]
-        TARGET:
-          - x86_64-unknown-linux-gnu
 
     steps:
-      - uses: actions/checkout@v2
-      - uses: actions-rs/toolchain@v1
+      - uses: actions/checkout@v3
+      - uses: dtolnay/rust-toolchain@stable
         with:
-          profile: minimal
-          toolchain: ${{ matrix.rust }}
-          target: ${{ matrix.TARGET }}
-          override: true
+          targets: x86_64-unknown-linux-gnu
           components: rustfmt
 
-      - name: Doc
-        uses: actions-rs/cargo@v1
-        with:
-          command: doc
-
-      - name: Formatting
-        uses: actions-rs/cargo@v1
-        with:
-          command: fmt
-          args: --all -- --check
+      - run: cargo doc
+      - run: cargo fmt --all -- --check
 
   clippy:
     name: Clippy
     runs-on: ubuntu-latest
-    strategy:
-      matrix:
-        rust: [1.58.1]
-        TARGET:
-          - x86_64-unknown-linux-gnu
 
     steps:
-      - uses: actions/checkout@v2
-      - uses: actions-rs/toolchain@v1
+      - uses: actions/checkout@v3
+      - uses: dtolnay/rust-toolchain@master
         with:
-          profile: minimal
-          toolchain: ${{ matrix.rust }}
-          target: ${{ matrix.TARGET }}
-          override: true
+          toolchain: 1.70.0
+          targets: x86_64-unknown-linux-gnu
           components: clippy
 
-      - name: Clippy
-        uses: actions-rs/clippy-check@v1
-        with:
-          args: --all-targets -- --allow clippy::bool_assert_comparison
-          token: ${{ secrets.GITHUB_TOKEN }}
+      - run: cargo clippy --all-targets
 
   test:
     name: Tests
     runs-on: ubuntu-latest
     strategy:
       matrix:
-        rust: [stable, beta]
+        rust: [stable]
         TARGET: [x86_64-unknown-linux-gnu, x86_64-unknown-linux-musl]
 
     steps:
-      - uses: actions/checkout@v2
-      - uses: actions-rs/toolchain@v1
+      - uses: actions/checkout@v3
+      - uses: dtolnay/rust-toolchain@master
         with:
-          profile: minimal
           toolchain: ${{ matrix.rust }}
-          target: ${{ matrix.TARGET }}
-          override: true
+          targets: ${{ matrix.TARGET }}
 
       - name: Test
-        uses: actions-rs/cargo@v1
-        with:
-          command: test
-          args: --target=${{ matrix.TARGET }}
+        run: cargo test --target=${{ matrix.TARGET }}
 
       - name: Build examples
-        uses: actions-rs/cargo@v1
-        if: contains(matrix.TARGET, 'x86_64')
-        with:
-          command: build
-          args: --target=${{ matrix.TARGET }} --examples
+        run: cargo build --target=${{ matrix.TARGET }} --examples
 
   coverage:
     name: Coverage
     runs-on: ubuntu-latest
+    container:
+      image: xd009642/tarpaulin:latest
+      options: --security-opt seccomp=unconfined
     steps:
-      - name: Checkout repository
-        uses: actions/checkout@v2
 
-      - name: Install stable toolchain
-        uses: actions-rs/toolchain@v1
-        with:
-          toolchain: stable
-          override: true
+      - uses: actions/checkout@v3
+      - uses: dtolnay/rust-toolchain@stable
 
       - name: Run cargo-tarpaulin
-        uses: actions-rs/tarpaulin@v0.1
-        with:
-          args: '--out Lcov -- --test-threads 1'
+        run: cargo tarpaulin --out Lcov -- --test-threads 1
 
       - name: upload to Coveralls
         uses: coverallsapp/github-action@master
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 56599d4..11f8712 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,7 +7,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
 
 ## [Unreleased]
 
-...
+### Changed
+- Raised MSRV to version 1.60.0
 
 ## [0.5.0] - 2022-02-21
 
diff --git a/README.md b/README.md
index 8ed15bf..054df82 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 [![crates.io](https://img.shields.io/crates/v/ds323x.svg)](https://crates.io/crates/ds323x)
 [![Docs](https://docs.rs/ds323x/badge.svg)](https://docs.rs/ds323x)
-![MSRV](https://img.shields.io/badge/rustc-1.35+-blue.svg)
+![MSRV](https://img.shields.io/badge/rustc-1.60+-blue.svg)
 [![Build Status](https://github.com/eldruin/ds323x-rs/workflows/Build/badge.svg)](https://github.com/eldruin/ds323x-rs/actions?query=workflow%3ABuild)
 [![Coverage Status](https://coveralls.io/repos/eldruin/ds323x-rs/badge.svg?branch=master)](https://coveralls.io/r/eldruin/ds323x-rs?branch=master)