|
@@ -81,13 +81,13 @@ register_bitfields![
|
|
|
|
|
|
register_structs! {
|
|
|
Ds3231Registers {
|
|
|
- (0x00 => t_second: InMemoryRegister<u8, T_SECOND::Register>),
|
|
|
- (0x01 => t_minute: InMemoryRegister<u8, T_MINUTE::Register>),
|
|
|
- (0x02 => t_hour: InMemoryRegister<u8, T_HOUR::Register>),
|
|
|
- (0x03 => t_weekday: InMemoryRegister<u8, T_DAY::Register>),
|
|
|
- (0x04 => t_day: InMemoryRegister<u8, T_DATE::Register>),
|
|
|
- (0x05 => t_month: InMemoryRegister<u8, T_MONTH::Register>),
|
|
|
- (0x06 => t_year: InMemoryRegister<u8, T_YEAR::Register>),
|
|
|
+ (0x00 => second: InMemoryRegister<u8, T_SECOND::Register>),
|
|
|
+ (0x01 => minute: InMemoryRegister<u8, T_MINUTE::Register>),
|
|
|
+ (0x02 => hour: InMemoryRegister<u8, T_HOUR::Register>),
|
|
|
+ (0x03 => weekday: InMemoryRegister<u8, T_DAY::Register>),
|
|
|
+ (0x04 => day: InMemoryRegister<u8, T_DATE::Register>),
|
|
|
+ (0x05 => month: InMemoryRegister<u8, T_MONTH::Register>),
|
|
|
+ (0x06 => year: InMemoryRegister<u8, T_YEAR::Register>),
|
|
|
(0x07 => a1_second: InMemoryRegister<u8, A_SECOND::Register>),
|
|
|
(0x08 => a1_minute: InMemoryRegister<u8, A_MINUTE::Register>),
|
|
|
(0x09 => a1_hour: InMemoryRegister<u8, A_HOUR::Register>),
|
|
@@ -105,13 +105,13 @@ register_structs! {
|
|
|
}
|
|
|
|
|
|
pub enum Weekday {
|
|
|
- SUNDAY = 0,
|
|
|
- MONDAY = 1,
|
|
|
- TUESDAY = 2,
|
|
|
- WEDNESDAY = 3,
|
|
|
- THURSDAY = 4,
|
|
|
- FRIDAY = 5,
|
|
|
- SATURDAY = 6,
|
|
|
+ Sunday = 0,
|
|
|
+ Monday = 1,
|
|
|
+ Tuesday = 2,
|
|
|
+ Wednesday = 3,
|
|
|
+ Thursday = 4,
|
|
|
+ Friday = 5,
|
|
|
+ Saturday = 6,
|
|
|
}
|
|
|
|
|
|
impl Ds3231Registers {
|
|
@@ -129,6 +129,20 @@ impl Ds3231Registers {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+fn init(address: u8, i2c: &mut impl _embedded_hal_blocking_i2c_Write) {
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#[inline]
|
|
|
+fn bcd_to_decimal(value: u8) -> u8 {
|
|
|
+ ((value >> 4) * 10) + (value & 0xF)
|
|
|
+}
|
|
|
+
|
|
|
+#[inline]
|
|
|
+fn decimal_to_bcd(value: u8) -> u8 {
|
|
|
+ ((value / 10) << 4) | (value % 10)
|
|
|
+}
|
|
|
+
|
|
|
pub fn in_dst(weekday: Weekday, day: u32, month: u32, hour_24: u32) -> bool {
|
|
|
let prev_sunday: i32 = day as i32 - weekday as i32;
|
|
|
match month {
|
|
@@ -156,49 +170,49 @@ mod test {
|
|
|
#[test]
|
|
|
fn dst_test() {
|
|
|
// 2020 - begins Mar 8th @ 2AM (Sunday), ends Nov 1st @ 2AM (Sunday)
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 8, 3, 1) == false);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 8, 3, 2) == true);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 8, 3, 3) == true);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 1, 11, 1) == true);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 1, 11, 2) == false);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 1, 11, 3) == false);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 8, 3, 1) == false);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 8, 3, 2) == true);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 8, 3, 3) == true);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 1, 11, 1) == true);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 1, 11, 2) == false);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 1, 11, 3) == false);
|
|
|
|
|
|
// 2021 - begins Mar 14th @ 2AM (Sunday), ends Nov 7th @ 2AM (Sunday)
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 14, 3, 1) == false);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 14, 3, 2) == true);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 14, 3, 3) == true);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 7, 11, 1) == true);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 7, 11, 2) == false);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 7, 11, 3) == false);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 14, 3, 1) == false);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 14, 3, 2) == true);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 14, 3, 3) == true);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 7, 11, 1) == true);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 7, 11, 2) == false);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 7, 11, 3) == false);
|
|
|
|
|
|
// 2022 - begins Mar 13th @ 2AM (Sunday), ends Nov 6th @ 2AM (Sunday)
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 13, 3, 1) == false);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 13, 3, 2) == true);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 13, 3, 3) == true);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 6, 11, 1) == true);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 6, 11, 2) == false);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 6, 11, 3) == false);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 13, 3, 1) == false);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 13, 3, 2) == true);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 13, 3, 3) == true);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 6, 11, 1) == true);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 6, 11, 2) == false);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 6, 11, 3) == false);
|
|
|
|
|
|
// 2023 - begins Mar 12th @ 2AM (Sunday), ends Nov 5th @ 2AM (Sunday)
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 12, 3, 1) == false);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 12, 3, 2) == true);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 12, 3, 3) == true);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 5, 11, 1) == true);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 5, 11, 2) == false);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 5, 11, 3) == false);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 12, 3, 1) == false);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 12, 3, 2) == true);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 12, 3, 3) == true);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 5, 11, 1) == true);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 5, 11, 2) == false);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 5, 11, 3) == false);
|
|
|
|
|
|
// Sanity check other dates in 2021
|
|
|
- assert!(in_dst(Weekday::FRIDAY, 1, 1, 0) == false);
|
|
|
- assert!(in_dst(Weekday::MONDAY, 1, 2, 0) == false);
|
|
|
- assert!(in_dst(Weekday::MONDAY, 1, 3, 0) == false);
|
|
|
- assert!(in_dst(Weekday::THURSDAY, 1, 4, 0) == true);
|
|
|
- assert!(in_dst(Weekday::SATURDAY, 1, 5, 0) == true);
|
|
|
- assert!(in_dst(Weekday::TUESDAY, 1, 6, 0) == true);
|
|
|
- assert!(in_dst(Weekday::THURSDAY, 1, 7, 0) == true);
|
|
|
- assert!(in_dst(Weekday::SUNDAY, 1, 8, 0) == true);
|
|
|
- assert!(in_dst(Weekday::WEDNESDAY, 1, 9, 0) == true);
|
|
|
- assert!(in_dst(Weekday::FRIDAY, 1, 10, 0) == true);
|
|
|
- assert!(in_dst(Weekday::MONDAY, 1, 11, 0) == true);
|
|
|
- assert!(in_dst(Weekday::WEDNESDAY, 1, 12, 0) == false);
|
|
|
+ assert!(in_dst(Weekday::Friday, 1, 1, 0) == false);
|
|
|
+ assert!(in_dst(Weekday::Monday, 1, 2, 0) == false);
|
|
|
+ assert!(in_dst(Weekday::Monday, 1, 3, 0) == false);
|
|
|
+ assert!(in_dst(Weekday::Thursday, 1, 4, 0) == true);
|
|
|
+ assert!(in_dst(Weekday::Saturday, 1, 5, 0) == true);
|
|
|
+ assert!(in_dst(Weekday::Tuesday, 1, 6, 0) == true);
|
|
|
+ assert!(in_dst(Weekday::Thursday, 1, 7, 0) == true);
|
|
|
+ assert!(in_dst(Weekday::Sunday, 1, 8, 0) == true);
|
|
|
+ assert!(in_dst(Weekday::Wednesday, 1, 9, 0) == true);
|
|
|
+ assert!(in_dst(Weekday::Friday, 1, 10, 0) == true);
|
|
|
+ assert!(in_dst(Weekday::Monday, 1, 11, 0) == true);
|
|
|
+ assert!(in_dst(Weekday::Wednesday, 1, 12, 0) == false);
|
|
|
}
|
|
|
}
|