gnss_qc_traits/processing/time/
correction.rs1use hifitime::{Duration, Epoch, Polynomial, TimeScale};
2
3#[derive(Copy, Clone, PartialEq)]
6pub struct TimeCorrection {
7 pub lhs_timescale: TimeScale,
9
10 pub rhs_timescale: TimeScale,
12
13 pub ref_epoch: Epoch,
15
16 pub validity_period: Duration,
18
19 pub polynomial: Polynomial,
21}
22
23impl TimeCorrection {
24 pub fn from_reference_time_of_week_seconds(
27 ref_week: u32,
28 ref_tow: u64,
29 validity_period: Duration,
30 lhs_timescale: TimeScale,
31 rhs_timescale: TimeScale,
32 polynomial: Polynomial,
33 ) -> Self {
34 Self::from_reference_time_of_week_nanos(
35 ref_week,
36 ref_tow * 1_000_000_000,
37 validity_period,
38 lhs_timescale,
39 rhs_timescale,
40 polynomial,
41 )
42 }
43
44 pub fn from_reference_epoch(
46 ref_epoch: Epoch,
47 validity_period: Duration,
48 rhs_timescale: TimeScale,
49 polynomial: Polynomial,
50 ) -> Self {
51 Self {
52 ref_epoch,
53 validity_period,
54 lhs_timescale: ref_epoch.time_scale,
55 rhs_timescale,
56 polynomial,
57 }
58 }
59
60 pub fn from_reference_time_of_week_nanos(
63 ref_week: u32,
64 ref_tow_nanos: u64,
65 validity_period: Duration,
66 lhs_timescale: TimeScale,
67 rhs_timescale: TimeScale,
68 polynomial: Polynomial,
69 ) -> Self {
70 let ref_epoch = Epoch::from_time_of_week(ref_week, ref_tow_nanos, lhs_timescale);
71
72 Self {
73 ref_epoch,
74 validity_period,
75 lhs_timescale,
76 rhs_timescale,
77 polynomial,
78 }
79 }
80
81 pub fn applies(&self, now: Epoch) -> bool {
84 let dt = (now - self.ref_epoch).abs();
85 dt < self.validity_period
86 }
87
88 pub fn validity_period_start(&self) -> Epoch {
90 self.ref_epoch - self.validity_period
91 }
92
93 pub fn validity_period_end(&self) -> Epoch {
95 self.ref_epoch + self.validity_period
96 }
97}