Fix time encoding and decoding
This commit is contained in:
parent
0676e40b25
commit
95def2d4ff
43
src/time.rs
43
src/time.rs
@ -48,14 +48,14 @@ impl Time {
|
|||||||
pub(crate) fn decode(dos_time: u16, dos_time_hi_res: u8) -> Self {
|
pub(crate) fn decode(dos_time: u16, dos_time_hi_res: u8) -> Self {
|
||||||
let hour = dos_time >> 11;
|
let hour = dos_time >> 11;
|
||||||
let min = (dos_time >> 5) & 0x3F;
|
let min = (dos_time >> 5) & 0x3F;
|
||||||
let sec = (dos_time & 0x1F) * 2 + (dos_time_hi_res as u16) / 2;
|
let sec = (dos_time & 0x1F) * 2 + (dos_time_hi_res as u16) / 100;
|
||||||
let millis = (dos_time_hi_res as u16 % 100) * 10;
|
let millis = (dos_time_hi_res as u16 % 100) * 10;
|
||||||
Time { hour, min, sec, millis }
|
Time { hour, min, sec, millis }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn encode(&self) -> (u16, u8) {
|
pub(crate) fn encode(&self) -> (u16, u8) {
|
||||||
let dos_time = (self.hour << 11) | (self.min << 5) | (self.sec / 2);
|
let dos_time = (self.hour << 11) | (self.min << 5) | (self.sec / 2);
|
||||||
let dos_time_hi_res = ((self.millis / 100) + (self.sec % 2) * 100) as u8;
|
let dos_time_hi_res = ((self.millis / 10) + (self.sec % 2) * 100) as u8;
|
||||||
(dos_time, dos_time_hi_res)
|
(dos_time, dos_time_hi_res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -155,3 +155,42 @@ impl TimeProvider for DefaultTimeProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) static DEFAULT_TIME_PROVIDER: DefaultTimeProvider = DefaultTimeProvider { _dummy: () };
|
pub(crate) static DEFAULT_TIME_PROVIDER: DefaultTimeProvider = DefaultTimeProvider { _dummy: () };
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::{Date, Time};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn date_encode_decode() {
|
||||||
|
let d = Date {
|
||||||
|
year: 2055,
|
||||||
|
month: 7,
|
||||||
|
day: 23
|
||||||
|
};
|
||||||
|
assert_eq!(d, Date::decode(d.encode()));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn time_encode_decode() {
|
||||||
|
let t1 = Time {
|
||||||
|
hour: 15,
|
||||||
|
min: 3,
|
||||||
|
sec: 29,
|
||||||
|
millis: 990,
|
||||||
|
};
|
||||||
|
let t2 = Time {
|
||||||
|
sec: 18,
|
||||||
|
.. t1
|
||||||
|
};
|
||||||
|
let t3 = Time {
|
||||||
|
millis: 40,
|
||||||
|
.. t1
|
||||||
|
};
|
||||||
|
let (x1, y1) = t1.encode();
|
||||||
|
let (x2, y2) = t2.encode();
|
||||||
|
let (x3, y3) = t3.encode();
|
||||||
|
assert_eq!(t1, Time::decode(x1, y1));
|
||||||
|
assert_eq!(t2, Time::decode(x2, y2));
|
||||||
|
assert_eq!(t3, Time::decode(x3, y3));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user