pull/19/merge
Paul Bender 2025-10-15 22:21:07 +00:00 committed by GitHub
commit 78efe1654a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 1559 additions and 35 deletions

1548
lcov.info 100644

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,6 @@
//! Common implementation //! Common implementation
use super::{ use super::{decimal_to_packed_bcd, hours_to_register, packed_bcd_to_decimal};
decimal_to_packed_bcd, hours_to_register, packed_bcd_to_decimal, some_or_invalid_error,
};
use crate::{ use crate::{
interface::{ReadData, WriteData}, interface::{ReadData, WriteData},
BitFlags, DateTimeAccess, Datelike, Ds323x, Error, Hours, NaiveDate, NaiveDateTime, NaiveTime, BitFlags, DateTimeAccess, Datelike, Ds323x, Error, Hours, NaiveDate, NaiveDateTime, NaiveTime,
@ -29,10 +27,11 @@ where
let minute = packed_bcd_to_decimal(data[Register::MINUTES as usize + 1]); let minute = packed_bcd_to_decimal(data[Register::MINUTES as usize + 1]);
let second = packed_bcd_to_decimal(data[Register::SECONDS as usize + 1]); let second = packed_bcd_to_decimal(data[Register::SECONDS as usize + 1]);
let date = NaiveDate::from_ymd_opt(year.into(), month.into(), day.into()); let date = NaiveDate::from_ymd_opt(year.into(), month.into(), day.into())
let date = some_or_invalid_error(date)?; .ok_or(Error::InvalidDeviceState)?;
let datetime = date.and_hms_opt(get_h24(hour).into(), minute.into(), second.into());
some_or_invalid_error(datetime) date.and_hms_opt(get_h24(hour).into(), minute.into(), second.into())
.ok_or(Error::InvalidDeviceState)
} }
fn set_datetime(&mut self, datetime: &NaiveDateTime) -> Result<(), Self::Error> { fn set_datetime(&mut self, datetime: &NaiveDateTime) -> Result<(), Self::Error> {
@ -78,8 +77,8 @@ where
let minute = packed_bcd_to_decimal(data[Register::MINUTES as usize + 1]); let minute = packed_bcd_to_decimal(data[Register::MINUTES as usize + 1]);
let second = packed_bcd_to_decimal(data[Register::SECONDS as usize + 1]); let second = packed_bcd_to_decimal(data[Register::SECONDS as usize + 1]);
let time = NaiveTime::from_hms_opt(get_h24(hour).into(), minute.into(), second.into()); NaiveTime::from_hms_opt(get_h24(hour).into(), minute.into(), second.into())
some_or_invalid_error(time) .ok_or(Error::InvalidDeviceState)
} }
fn weekday(&mut self) -> Result<u8, Self::Error> { fn weekday(&mut self) -> Result<u8, Self::Error> {
@ -116,8 +115,9 @@ where
let month = let month =
packed_bcd_to_decimal(data[Register::MONTH as usize + 1 - offset] & !BitFlags::CENTURY); packed_bcd_to_decimal(data[Register::MONTH as usize + 1 - offset] & !BitFlags::CENTURY);
let day = packed_bcd_to_decimal(data[Register::DOM as usize + 1 - offset]); let day = packed_bcd_to_decimal(data[Register::DOM as usize + 1 - offset]);
let date = NaiveDate::from_ymd_opt(year.into(), month.into(), day.into());
some_or_invalid_error(date) NaiveDate::from_ymd_opt(year.into(), month.into(), day.into())
.ok_or(Error::InvalidDeviceState)
} }
fn set_seconds(&mut self, seconds: u8) -> Result<(), Self::Error> { fn set_seconds(&mut self, seconds: u8) -> Result<(), Self::Error> {

View File

@ -28,34 +28,10 @@ fn hours_to_register<E>(hours: Hours) -> Result<u8, Error<E>> {
} }
} }
fn some_or_invalid_error<T, E>(data: Option<T>) -> Result<T, Error<E>> {
if let Some(data) = data {
Ok(data)
} else {
Err(Error::InvalidDeviceState)
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
#[test]
fn if_some_then_get_inner() {
match some_or_invalid_error::<u8, ()>(Some(1)) {
Ok(1) => (),
_ => panic!(),
}
}
#[test]
fn if_none_then_error() {
match some_or_invalid_error::<u8, ()>(None) {
Err(Error::InvalidDeviceState) => (),
_ => panic!(),
}
}
#[test] #[test]
fn can_convert_packed_bcd_to_decimal() { fn can_convert_packed_bcd_to_decimal() {
assert_eq!(0, packed_bcd_to_decimal(0b0000_0000)); assert_eq!(0, packed_bcd_to_decimal(0b0000_0000));