gnss_protos/gps/
frame2.rs1use crate::twos_complement;
2
3const WORD3_IODE_MASK: u32 = 0x3fc00000;
4const WORD3_IODE_SHIFT: u32 = 22;
5const WORD3_CRS_MASK: u32 = 0x003fffc0;
6const WORD3_CRS_SHIFT: u32 = 6;
7
8const WORD4_DELTA_N_MASK: u32 = 0x3fffc000;
9const WORD4_DELTA_N_SHIFT: u32 = 14;
10const WORD4_M0_MSB_MASK: u32 = 0x00003fc0;
11const WORD4_M0_MSB_SHIFT: u32 = 6;
12
13const WORD5_M0_LSB_MASK: u32 = 0x3fffffc0;
14const WORD5_M0_LSB_SHIFT: u32 = 6;
15
16const WORD6_CUC_MASK: u32 = 0x3fffc000;
17const WORD6_CUC_SHIFT: u32 = 14;
18const WORD6_E_MSB_MASK: u32 = 0x00003fc0;
19const WORD6_E_MSB_SHIFT: u32 = 6;
20
21const WORD7_E_LSB_MASK: u32 = 0x3fffffc0;
22const WORD7_E_LSB_SHIFT: u32 = 6;
23
24const WORD8_CUS_MASK: u32 = 0x3fffc000;
25const WORD8_CUS_SHIFT: u32 = 14;
26const WORD8_SQRTA_MSB_MASK: u32 = 0x00003fc0;
27const WORD8_SQRTA_MSB_SHIFT: u32 = 6;
28
29const WORD9_SQRTA_LSB_MASK: u32 = 0x3fffffc0;
30const WORD9_SQRTA_LSB_SHIFT: u32 = 6;
31
32const WORD10_TOE_MASK: u32 = 0x3fffc000;
33const WORD10_TOE_SHIFT: u32 = 14;
34const WORD10_FITINT_MASK: u32 = 0x00002000;
35const WORD10_AODO_MASK: u32 = 0x00001f00;
36const WORD10_AODO_SHIFT: u32 = 8;
37
38#[derive(Debug, Default, Copy, Clone, PartialEq)]
40pub struct GpsQzssFrame2 {
41 pub toe: u32,
43
44 pub iode: u8,
46
47 pub m0: f64,
49
50 pub dn: f64,
52
53 pub cuc: f64,
55
56 pub cus: f64,
58
59 pub crs: f64,
61
62 pub e: f64,
64
65 pub sqrt_a: f64,
67
68 pub fit_int_flag: bool,
70
71 pub aodo: u8,
73}
74
75#[derive(Debug, Default, Clone)]
76pub struct Word3 {
77 pub iode: u8,
78 pub crs: i32,
79}
80
81impl Word3 {
82 pub(crate) fn decode(dword: u32) -> Self {
83 let iode = ((dword & WORD3_IODE_MASK) >> WORD3_IODE_SHIFT) as u8;
84 let crs = ((dword & WORD3_CRS_MASK) >> WORD3_CRS_SHIFT) as u32;
85 let crs = twos_complement(crs, 0xffff, 0x8000);
86 Self { iode, crs }
87 }
88}
89
90#[derive(Debug, Default, Clone)]
91pub struct Word4 {
92 pub dn: i16,
94
95 pub m0_msb: u8,
97}
98
99impl Word4 {
100 pub(crate) fn decode(dword: u32) -> Self {
101 let dn = ((dword & WORD4_DELTA_N_MASK) >> WORD4_DELTA_N_SHIFT) as i16;
102 let m0_msb = ((dword & WORD4_M0_MSB_MASK) >> WORD4_M0_MSB_SHIFT) as u8;
103 Self { dn, m0_msb }
104 }
105}
106
107#[derive(Debug, Default, Clone)]
108pub struct Word5 {
109 pub m0_lsb: u32,
111}
112
113impl Word5 {
114 pub(crate) fn decode(dword: u32) -> Self {
115 let m0_lsb = ((dword & WORD5_M0_LSB_MASK) >> WORD5_M0_LSB_SHIFT) as u32;
116 Self { m0_lsb }
117 }
118}
119
120#[derive(Debug, Default, Clone)]
121pub struct Word6 {
122 pub cuc: i16,
123
124 pub e_msb: u8,
126}
127
128impl Word6 {
129 pub(crate) fn decode(dword: u32) -> Self {
130 let cuc = ((dword & WORD6_CUC_MASK) >> WORD6_CUC_SHIFT) as i16;
131 let e_msb = ((dword & WORD6_E_MSB_MASK) >> WORD6_E_MSB_SHIFT) as u8;
132 Self { cuc, e_msb }
133 }
134}
135
136#[derive(Debug, Default, Clone)]
137pub struct Word7 {
138 pub e_lsb: u32,
140}
141
142impl Word7 {
143 pub(crate) fn decode(dword: u32) -> Self {
144 let e_lsb = ((dword & WORD7_E_LSB_MASK) >> WORD7_E_LSB_SHIFT) as u32;
145 Self { e_lsb }
146 }
147}
148
149#[derive(Debug, Default, Clone)]
150pub struct Word8 {
151 pub cus: i32,
152
153 pub sqrt_a_msb: u8,
155}
156
157impl Word8 {
158 pub(crate) fn decode(dword: u32) -> Self {
159 let cus = ((dword & WORD8_CUS_MASK) >> WORD8_CUS_SHIFT) as u32;
160
161 let cus = twos_complement(cus, 0xffff, 0x8000);
162 let sqrt_a_msb = ((dword & WORD8_SQRTA_MSB_MASK) >> WORD8_SQRTA_MSB_SHIFT) as u8;
163 Self { cus, sqrt_a_msb }
164 }
165}
166
167#[derive(Debug, Default, Clone)]
168pub struct Word9 {
169 pub sqrt_a_lsb: u32,
171}
172
173impl Word9 {
174 pub(crate) fn decode(dword: u32) -> Self {
175 let sqrt_a_lsb = ((dword & WORD9_SQRTA_LSB_MASK) >> WORD9_SQRTA_LSB_SHIFT) as u32;
176 Self { sqrt_a_lsb }
177 }
178}
179
180#[derive(Debug, Default, Clone)]
181pub struct Word10 {
182 pub toe: u16,
184
185 pub fitint: bool,
187
188 pub aodo: u8,
190}
191
192impl Word10 {
193 pub(crate) fn decode(dword: u32) -> Self {
194 let toe = ((dword & WORD10_TOE_MASK) >> WORD10_TOE_SHIFT) as u16;
195 let fitint = (dword & WORD10_FITINT_MASK) > 0;
196 let aodo = ((dword & WORD10_AODO_MASK) >> WORD10_AODO_SHIFT) as u8;
197 Self { toe, fitint, aodo }
198 }
199}
200
201