1use tinyvec::ArrayVec;
2
3pub mod message;
4
5mod msm_mappings;
6
7pub use msm_mappings::bds::SigId as BdsSigId;
8pub use msm_mappings::gal::SigId as GalSigId;
9pub use msm_mappings::glo::SigId as GloSigId;
10pub use msm_mappings::gps::SigId as GpsSigId;
11pub use msm_mappings::navic::SigId as NavicSigId;
12pub use msm_mappings::qzss::SigId as QzssSigId;
13pub use msm_mappings::sbas::SigId as SbasSigId;
14
15macro_rules! msg {
16 (
17 id: $id:ident,
18 type_name: $type_name:ident,
19 fields: [ $( ( $field_name:ident, $frag_id:ident $(, $len_data:tt )? ) ),+ ],
20 ) => {
21 pub mod $id {
22 use $crate::df::{assembler::Assembler, parser::Parser};
23 use $crate::df::dfs::*;
24 use $crate::rtcm_error::RtcmError;
25 #[cfg(feature = "serde")]
26 use $crate::{Serialize,Deserialize};
27 #[cfg(feature = "test_gen")]
28 use $crate::source_repr::SourceRepr;
29 #[allow(unused)]
30 use super::*; pub mod export_types {
33 $(
34 #[allow(unused)]
35 pub use super::$frag_id::export_types::*;
36 )+
37
38 pub use super::$type_name;
39 }
40
41 #[derive(Default, Clone, Debug, PartialEq)]
42 #[cfg_attr(feature="serde",derive(Serialize,Deserialize),serde(crate = "sd"))]
43 pub struct $type_name {
44 $(pub $field_name:$frag_id::DataType),+
45 }
46 pub type DataType = $type_name;
47 pub fn encode(asm:&mut Assembler, value:&$type_name) -> Result<(),RtcmError> {
48 $(
49 $frag_id::encode(asm, &value.$field_name)?;
50 )+
51 Ok(())
52 }
53 pub fn decode(par:&mut Parser) -> Result<$type_name,RtcmError> {
54 $(
55 #[allow(unused)]
56 let $field_name = $frag_id::decode(par, $($len_data)? )?;
57 )+
58
59 Ok($type_name {
60 $(
61 $field_name
62 ),+
63 })
64 }
65 #[cfg(feature = "test_gen")]
66 use $crate::val_gen::ValGen;
67 #[cfg(feature = "test_gen")]
68 pub fn generate<FR,LR,RR>(asm:&mut Assembler, val_gen:&mut ValGen<FR,LR,RR>) -> Result<(),RtcmError>
69 where FR:rand::Rng, LR:rand::Rng, RR:rand::Rng {
70
71 $(
72 #[allow(unused)]
73 let $field_name = $frag_id::generate(asm, val_gen, $($len_data)? )?;
74 )+
75 Ok(())
76 }
77 #[cfg(feature = "test_gen")]
78 impl SourceRepr for $type_name {
79 fn to_source(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
80 use core::fmt::Write;
81 write!(f, "{} {{", stringify!($type_name))?;
82 $(
83 write!(f,"{}:", stringify!($field_name))?;
84 self.$field_name.to_source(f)?;
85 f.write_char(',')?;
86 )+
87 f.write_char('}')
88 }
89 }
90 }
91 };
92}
93#[allow(unused)]
94macro_rules! msg_len_middle {
95 (
96 id: $id:ident,
97 type_name: $type_name:ident,
98 fields1: [ $( ( $field_name1:ident, $frag_id1:ident ) ),+ ],
99 len_field: $len_df_id:ident,
100 fields2: [ $( ( $field_name2:ident, $frag_id2:ident ) ),+ ],
101 vec_field: $vec_field_name:ident, $vec_frag_id:ident,
102 ) => {
103 pub mod $id {
104 use $crate::df::{assembler::Assembler, parser::Parser};
105 use $crate::df::dfs::*;
106 use $crate::rtcm_error::RtcmError;
107 #[cfg(feature = "serde")]
108 use $crate::{Serialize,Deserialize};
109 #[cfg(feature = "test_gen")]
110 use $crate::source_repr::SourceRepr;
111 #[allow(unused)]
112 use super::*; pub mod export_types {
115 $(
116 #[allow(unused)]
117 pub use super::$frag_id1::export_types::*;
118 )+
119 $(
120 #[allow(unused)]
121 pub use super::$frag_id2::export_types::*;
122 )+
123 #[allow(unused)]
124 pub use super::$len_df_id::export_types::*;
125 pub use super::$vec_frag_id::export_types::*;
126
127 pub use super::$type_name;
128 }
129
130 #[derive(Default, Clone, Debug, PartialEq)]
131 #[cfg_attr(feature="serde",derive(Serialize,Deserialize),serde(crate = "sd"))]
132 pub struct $type_name {
133 $(pub $field_name1:$frag_id1::DataType,)+
134 $(pub $field_name2:$frag_id2::DataType,)+
135 pub $vec_field_name:$vec_frag_id::DataType,
136 }
137 pub type DataType = $type_name;
138 pub fn encode(asm:&mut Assembler, value:&$type_name) -> Result<(),RtcmError> {
139 $(
141 $frag_id1::encode(asm, &value.$field_name1)?;
142 )+
143 $len_df_id::encode(asm, &value.$vec_field_name.len())?;
145 $(
147 $frag_id2::encode(asm, &value.$field_name2)?;
148 )+
149 $vec_frag_id::encode(asm, &value.$vec_field_name)?;
151
152 Ok(())
153 }
154 pub fn decode(par:&mut Parser) -> Result<$type_name,RtcmError> {
155 $(
156 #[allow(unused)]
157 let $field_name1 = $frag_id1::decode(par)?;
158 )+
159 let vec_len:usize = $len_df_id::decode(par)?;
160 $(
161 #[allow(unused)]
162 let $field_name2 = $frag_id2::decode(par)?;
163 )+
164 let $vec_field_name = $vec_frag_id::decode(par, vec_len)?;
165
166 Ok($type_name {
167 $(
168 $field_name1,
169 )+
170 $(
171 $field_name2,
172 )+
173 $vec_field_name,
174 })
175 }
176 #[cfg(feature = "test_gen")]
177 use $crate::val_gen::ValGen;
178 #[cfg(feature = "test_gen")]
179 pub fn generate<FR,LR,RR>(asm:&mut Assembler, val_gen:&mut ValGen<FR,LR,RR>) -> Result<(),RtcmError>
180 where FR:rand::Rng, LR:rand::Rng, RR:rand::Rng {
181
182 $(
183 #[allow(unused)]
184 let _ = $frag_id1::generate(asm, val_gen)?;
185 )+
186 let vec_len = $len_df_id::generate(asm, val_gen)?;
187 $(
188 #[allow(unused)]
189 let _ = $frag_id2::generate(asm, val_gen)?;
190 )+
191 let _ = $vec_frag_id::generate(asm, val_gen, vec_len)?;
192 Ok(())
193 }
194 #[cfg(feature = "test_gen")]
195 impl SourceRepr for $type_name {
196 fn to_source(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
197 use core::fmt::Write;
198 write!(f, "{} {{", stringify!($type_name))?;
199 $(
200 write!(f,"{}:", stringify!($field_name1))?;
201 self.$field_name1.to_source(f)?;
202 f.write_char(',')?;
203 )+
204 $(
205 write!(f,"{}:", stringify!($field_name2))?;
206 self.$field_name2.to_source(f)?;
207 f.write_char(',')?;
208 )+
209 write!(f,"{}:", stringify!($vec_field_name))?;
210 self.$vec_field_name.to_source(f)?;
211
212 f.write_char('}')
213 }
214 }
215 }
216 };
217}
218#[allow(unused)]
219macro_rules! frag_vec {
220 (
221 id: $id:ident,
222 frag_id: $frag_id:ident,
223 cap_name: $cap_name:ident,
224 ) => {
225 pub mod $id {
226 use super::*;
227 use $crate::df::{assembler::Assembler, parser::Parser};
228 use $crate::msg::*;
229 use $crate::rtcm_error::RtcmError;
230 use $crate::util::DataVec;
231
232 pub mod export_types {
233 #[allow(unused)]
234 pub use super::$frag_id::export_types::*;
235 }
236
237 pub type DataType = DataVec<$frag_id::DataType, $cap_name>;
238 pub fn encode(asm: &mut Assembler, value: &DataType) -> Result<(), RtcmError> {
239 for v in value.iter() {
240 $frag_id::encode(asm, v)?;
241 }
242 Ok(())
243 }
244 pub fn decode(par: &mut Parser, len: usize) -> Result<DataType, RtcmError> {
245 if len > $cap_name {
246 return Err(RtcmError::CapacityExceeded);
247 }
248 let mut value = DataVec::new();
249 for _ in 0..len {
250 let v = $frag_id::decode(par)?;
251 value.push(v);
252 }
253 Ok(value)
254 }
255 #[cfg(feature = "test_gen")]
256 use $crate::val_gen::ValGen;
257 #[cfg(feature = "test_gen")]
258 pub fn generate<FR, LR, RR>(
259 asm: &mut Assembler,
260 val_gen: &mut ValGen<FR, LR, RR>,
261 len: usize,
262 ) -> Result<(), RtcmError>
263 where
264 FR: rand::Rng,
265 LR: rand::Rng,
266 RR: rand::Rng,
267 {
268 for _ in 0..len {
269 $frag_id::generate(asm, val_gen)?;
270 }
271 Ok(())
272 }
273 }
274 };
275}
276
277#[allow(unused)]
278macro_rules! frag_vec_with_len {
279 (
280 id: $id:ident,
281 frag_id: $frag_id:ident,
282 cap: $cap_name:ident,
283 len_bits: $len_bits:literal,
284 ) => {
285 pub mod $id {
286 use super::*;
287 use $crate::df::bit_value::U16;
288 use $crate::df::{assembler::Assembler, parser::Parser};
289 use $crate::msg::*;
290 use $crate::rtcm_error::RtcmError;
291 use $crate::util::DataVec;
292
293 pub mod export_types {
296 pub use super::$frag_id::export_types::*;
298 }
299
300 pub type DataType = DataVec<$frag_id::DataType, $cap_name>;
301 pub fn encode(asm: &mut Assembler, value: &DataType) -> Result<(), RtcmError> {
302 let len = value.len() as u16;
303 asm.put::<U16>(len, $len_bits)?;
304
305 for v in value.iter() {
306 $frag_id::encode(asm, v)?;
307 }
308 Ok(())
309 }
310 pub fn decode(par: &mut Parser) -> Result<DataType, RtcmError> {
311 let len = par.parse::<U16>($len_bits)? as usize;
312 if len > $cap_name {
313 return Err(RtcmError::CapacityExceeded);
314 }
315 let mut value = DataVec::new();
316 for _ in 0..len {
317 let v = $frag_id::decode(par)?;
318 value.push(v);
319 }
320 Ok(value)
321 }
322 #[cfg(feature = "test_gen")]
323 use $crate::val_gen::ValGen;
324 #[cfg(feature = "test_gen")]
325 pub fn generate<FR, LR, RR>(
326 asm: &mut Assembler,
327 val_gen: &mut ValGen<FR, LR, RR>,
328 ) -> Result<(), RtcmError>
329 where
330 FR: rand::Rng,
331 LR: rand::Rng,
332 RR: rand::Rng,
333 {
334 let len = if val_gen.len_rng.gen::<u64>() == u64::MAX {
335 $cap_name as u16
336 } else {
337 val_gen.len_rng.gen::<u16>() % ($cap_name as u16 + 1)
338 };
339 asm.put::<U16>(len, $len_bits)?;
340 for _ in 0..len {
341 $frag_id::generate(asm, val_gen)?;
342 }
343 Ok(())
344 }
345 }
346 };
347}
348
349#[allow(unused)]
350macro_rules! frag_grid16p {
351 (
352 id: $id:ident,
353 frag_id: $frag_id:ident,
354 ) => {
355 pub mod $id {
356 #[allow(unused)]
357 use super::*;
358 #[allow(unused)]
359 use $crate::df::dfs::*;
360 use $crate::df::{assembler::Assembler, parser::Parser};
361 #[allow(unused)]
362 use $crate::msg::*;
363 use $crate::rtcm_error::RtcmError;
364 use $crate::util::Grid16P;
365
366 pub mod export_types {
367 pub use super::$frag_id::export_types::*;
368 }
369
370 pub type DataType = Grid16P<$frag_id::DataType>;
371 pub fn encode(asm: &mut Assembler, value: &DataType) -> Result<(), RtcmError> {
372 for v in value.iter() {
373 $frag_id::encode(asm, v)?;
374 }
375 Ok(())
376 }
377 pub fn decode(par: &mut Parser) -> Result<DataType, RtcmError> {
378 let mut value = Grid16P::new();
379 for v in value.iter_mut() {
380 *v = $frag_id::decode(par)?;
381 }
382 Ok(value)
383 }
384 #[cfg(feature = "test_gen")]
385 use $crate::val_gen::ValGen;
386 #[cfg(feature = "test_gen")]
387 pub fn generate<FR, LR, RR>(
388 asm: &mut Assembler,
389 val_gen: &mut ValGen<FR, LR, RR>,
390 ) -> Result<(), RtcmError>
391 where
392 FR: rand::Rng,
393 LR: rand::Rng,
394 RR: rand::Rng,
395 {
396 for _ in 0..16 {
397 $frag_id::generate(asm, val_gen)?;
398 }
399 Ok(())
400 }
401 }
402 };
403}
404
405#[allow(unused)]
406macro_rules! msm_data_seg_frag {
407 (
408 id: $id:ident,
409 type_name: $type_name:ident,
410 gnss: $gnss:ident,
411 sat_id: $sat_id:ident,
412 sig_id: $sig_id:ident,
413 ) => {
414 pub mod $id {
415 use super::*;
416 use $crate::df::bit_value::{U32, U64};
417 use $crate::df::{assembler::Assembler, parser::Parser};
418 use $crate::msg::{
419 cell_mask_id_vec, mask_len_u32, mask_len_u64, msm_mappings::$gnss::*,
420 };
421 use $crate::rtcm_error::RtcmError;
422 use $crate::tinyvec::ArrayVec;
423 #[cfg(feature = "serde")]
424 use $crate::{Deserialize, Serialize};
425
426 pub mod export_types {
427 #[allow(unused)]
428 pub use super::$sat_id::export_types::*;
429 pub use super::$sig_id::export_types::*;
430
431 pub use super::$type_name;
432 }
433
434 #[derive(Default, Clone, Debug, PartialEq)]
435 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "sd"))]
436 pub struct $type_name {
437 pub satellite_data: $sat_id::DataType,
438 pub signal_data: $sig_id::DataType,
439 }
440 pub type DataType = $type_name;
441 pub fn encode(asm: &mut Assembler, value: &$type_name) -> Result<(), RtcmError> {
442 let mut sat_mask: u64 = 0;
443 for s in value.satellite_data.iter() {
444 if s.satellite_id > 0 && s.satellite_id <= 64 {
445 let sat: u64 = 1 << (64 - s.satellite_id);
446 if sat & sat_mask > 0 {
447 return Err(RtcmError::DuplicateSatellite);
448 }
449 sat_mask |= sat;
450 } else {
451 return Err(RtcmError::InvalidSatelliteId);
452 }
453 }
454 let mut sig_mask: u32 = 0;
455 let mut sat_sig_mask: u64 = 0;
456 let mut cell_vec: ArrayVec<[(u8, u8); 64]> = ArrayVec::new();
457 for s in value.signal_data.iter() {
458 let sat_id = if s.satellite_id > 0 && s.satellite_id <= 64 {
459 s.satellite_id
460 } else {
461 return Err(RtcmError::InvalidSatelliteId);
462 };
463 let sig_id = if let Some(signal_id) = to_id(s.signal_id) {
464 signal_id
465 } else {
466 return Err(RtcmError::InvalidSignalId);
467 };
468 let sat: u64 = 1 << (64 - sat_id);
469 sat_sig_mask |= sat;
470 let sig = 1 << (32 - sig_id);
471 sig_mask |= sig;
472 cell_vec.push((sat_id, sig_id));
473 }
474 if sat_mask != sat_sig_mask {
475 return Err(RtcmError::SatelliteMismatch);
476 }
477 let mut sat_indx = [0usize; 64];
478 let mut sig_indx = [0usize; 32];
479 let mut indx_counter = 0;
480 for i in 0..64 {
481 if (sat_mask >> (63 - i)) % 2 == 1 {
482 sat_indx[i] = indx_counter;
483 indx_counter += 1;
484 }
485 }
486 indx_counter = 0;
487 for i in 0..32 {
488 if (sig_mask >> (31 - i)) % 2 == 1 {
489 sig_indx[i] = indx_counter;
490 indx_counter += 1;
491 }
492 }
493 let sig_mask_len = mask_len_u32(sig_mask);
494 let cell_cont_len = sig_mask_len * value.satellite_data.len();
495 let mut cell_mask: u64 = 0;
496 for (sat_id, sig_id) in cell_vec {
497 let cell_indx = sat_indx[sat_id as usize - 1] * sig_mask_len
498 + sig_indx[sig_id as usize - 1];
499 let cell = 1 << (cell_cont_len - 1 - cell_indx);
500 if cell & cell_mask > 0 {
501 return Err(RtcmError::DuplicateSatelliteSignal);
502 }
503 cell_mask |= cell;
504 }
505 asm.put::<U64>(sat_mask, 64)?;
506 asm.put::<U32>(sig_mask, 32)?;
507 asm.put::<U64>(cell_mask, cell_cont_len)?;
508
509 $sat_id::encode(asm, &value.satellite_data)?;
510 $sig_id::encode(asm, &value.signal_data)?;
511 Ok(())
512 }
513 pub fn decode(par: &mut Parser) -> Result<$type_name, RtcmError> {
514 let sat_mask = par.parse::<U64>(64)?;
515 let sig_mask = par.parse::<U32>(32)?;
516
517 let sat_len = mask_len_u64(sat_mask);
518 let sig_len = mask_len_u32(sig_mask);
519
520 let cell_mask = par.parse::<U64>(sat_len * sig_len)?;
521 if let Some((sat_vec, cell_vec)) = cell_mask_id_vec(sat_mask, sig_mask, cell_mask) {
522 let satellite_data = $sat_id::decode(par, &sat_vec)?;
523 let signal_data = $sig_id::decode(par, &cell_vec)?;
524 Ok($type_name {
525 satellite_data,
526 signal_data,
527 })
528 } else {
529 return Err(RtcmError::InvalidSatelliteSignalCount);
530 }
531 }
532 #[cfg(feature = "test_gen")]
533 use $crate::val_gen::ValGen;
534 #[cfg(feature = "test_gen")]
535 pub fn generate<FR, LR, RR>(
536 asm: &mut Assembler,
537 val_gen: &mut ValGen<FR, LR, RR>,
538 ) -> Result<(), RtcmError>
539 where
540 FR: rand::Rng,
541 LR: rand::Rng,
542 RR: rand::Rng,
543 {
544 let sig_len: usize = (val_gen.len_rng.gen::<usize>() % 64) + 1;
545 let subset: usize = val_gen.rng_rng.gen::<usize>();
546 let mut cell_vec: ArrayVec<[(u8, u8); 64]> = ArrayVec::new();
547 let mut sat_mask: u64 = 0;
548 let mut sig_mask: u32 = 0;
549 let mut sat_num: usize = 0;
550 let mut sig_num: usize = 0;
551 for _ in 0..sig_len {
552 let (sat_id, sig_id) = loop {
553 let sat_id: u8 = (((subset % 65) as u8
554 + (val_gen.rng_rng.gen::<u8>() % (64 / id_len_div64() as u8)))
555 % 64)
556 + 1;
557 let sig_id = random_id(&mut val_gen.rng_rng, subset);
558 if !cell_vec.iter().any(|e| e.0 == sat_id && e.1 == sig_id) {
559 break (sat_id, sig_id);
560 }
561 };
562 cell_vec.push((sat_id, sig_id));
563 let sat: u64 = 1 << (64 - sat_id);
564 if (sat_mask & sat) == 0 {
565 sat_num += 1;
566 }
567 sat_mask |= sat;
568 let sig: u32 = 1 << (32 - sig_id);
569 if (sig_mask & sig) == 0 {
570 sig_num += 1;
571 }
572 sig_mask |= sig;
573 }
574 let cell_cont_len = sig_num * sat_num;
575 let mut sat_indx = [0usize; 64];
576 let mut sig_indx = [0usize; 32];
577 let mut indx_counter = 0;
578 for i in 0..64 {
579 if (sat_mask >> (63 - i)) % 2 == 1 {
580 sat_indx[i] = indx_counter;
581 indx_counter += 1;
582 }
583 }
584 indx_counter = 0;
585 for i in 0..32 {
586 if (sig_mask >> (31 - i)) % 2 == 1 {
587 sig_indx[i] = indx_counter;
588 indx_counter += 1;
589 }
590 }
591 let mut cell_mask: u64 = 0;
592 for (sat_id, sig_id) in cell_vec {
593 let cell_indx =
594 sat_indx[sat_id as usize - 1] * sig_num + sig_indx[sig_id as usize - 1];
595 let cell: u64 = 1 << (cell_cont_len - 1 - cell_indx);
596 debug_assert_eq!(cell & cell_mask, 0);
597 cell_mask |= cell;
598 }
599 asm.put::<U64>(sat_mask, 64)?;
600 asm.put::<U32>(sig_mask, 32)?;
601 asm.put::<U64>(cell_mask, cell_cont_len)?;
602 $sat_id::generate(asm, val_gen, sat_mask)?;
603 $sig_id::generate(asm, val_gen, sig_len)?;
604
605 Ok(())
606 }
607
608 #[cfg(feature = "test_gen")]
609 impl $crate::source_repr::SourceRepr for $type_name {
610 fn to_source(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
611 use core::fmt::Write;
612
613 write!(f, "{} {{", stringify!($type_name))?;
614 f.write_str("satellite_data: ")?;
615 self.satellite_data.to_source(f)?;
616 f.write_str(", signal_data: ")?;
617 self.signal_data.to_source(f)?;
618 f.write_char('}')?;
619
620 Ok(())
621 }
622 }
623 }
624 };
625}
626#[allow(unused)]
627fn mask_len_u32(sat_mask: u32) -> usize {
628 let mut counter: usize = 0;
629 for sh in 0..32 {
630 counter += ((sat_mask >> sh) % 2) as usize;
631 }
632 counter
633}
634#[allow(unused)]
635fn mask_len_u64(sat_mask: u64) -> usize {
636 let mut counter: usize = 0;
637 for sh in 0..64 {
638 counter += ((sat_mask >> sh) % 2) as usize;
639 }
640 counter
641}
642#[allow(unused)]
643macro_rules! msm_sat_frag {
644 (
645 id: $id:ident,
646 type_name: $type_name:ident,
647 fields: [ $( ( $field_name:ident, $frag_id:ident ) ),+ ],
648 ) => {
649 pub mod $id {
650 use $crate::util::DataVec;
651 use $crate::df::{assembler::Assembler, parser::Parser};
652 use $crate::df::dfs::*;
653 use $crate::rtcm_error::RtcmError;
654 use $crate::tinyvec::ArrayVec;
655 #[cfg(feature = "serde")]
656 use $crate::{Serialize,Deserialize};
657
658 pub mod export_types {
659 $(
660 #[allow(unused)]
661 pub use super::$frag_id::export_types::*;
662 )+
663
664 pub use super::$type_name;
665 }
666
667 #[derive(Default,Clone, Debug, PartialEq)]
668 #[cfg_attr(feature="serde",derive(Serialize,Deserialize),serde(crate = "sd"))]
669 pub struct $type_name {
670 pub satellite_id: u8,
671 $(pub $field_name:$frag_id::DataType),+
672 }
673 pub type DataType = DataVec<$type_name,64>;
674 pub fn encode(asm:&mut Assembler, value:&DataType) -> Result<(),RtcmError> {
675 let mut value = value.clone();
676 let slice = value.as_mut_slice();
677 slice.sort_unstable_by(|a,b| a.satellite_id.cmp(&b.satellite_id));
678 $(
679 for v in value.iter() {
680 $frag_id::encode(asm, &v.$field_name)?;
681 }
682 )+
683 Ok(())
684 }
685 pub fn decode(par:&mut Parser, sat_vec:&ArrayVec<[u8;64]>) -> Result<DataType,RtcmError> {
686 let mut value = DataVec::<$type_name,64>::new();
687 value.set_len(sat_vec.len());
688 {
689 let mut iter = value.iter_mut();
690 for s in sat_vec {
691 let v = iter.next().unwrap();
692 v.satellite_id = *s;
693 }
694 }
695 $(
696 for v in value.iter_mut() {
697 v.$field_name = $frag_id::decode(par)?;
698 }
699 )+
700 Ok(value)
701 }
702 #[cfg(feature = "test_gen")]
703 use $crate::val_gen::ValGen;
704 #[cfg(feature = "test_gen")]
705 pub fn generate<FR,LR,RR>(asm:&mut Assembler, val_gen:&mut ValGen<FR,LR,RR>, sat_mask:u64) -> Result<(),RtcmError>
706 where FR:rand::Rng, LR:rand::Rng, RR:rand::Rng {
707
708 let mut sat_len:usize = 0;
709 for i in 0..64 {
710 if (sat_mask >> (63-i)) % 2 == 1 {
711 sat_len += 1;
712 }
713 }
714 $(
715 for _ in 0..sat_len {
716 $frag_id::generate(asm, val_gen)?;
717 }
718 )+
719
720 Ok(())
721 }
722 #[cfg(feature = "test_gen")]
723 impl $crate::source_repr::SourceRepr for $type_name {
724 fn to_source(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
725 use core::fmt::Write;
726
727 write!(f, "{} {{", stringify!($type_name))?;
728 f.write_str("satellite_id:")?;
729 self.satellite_id.to_source(f)?;
730 f.write_char(',')?;
731
732 $(
733 write!(f, "{}:", stringify!($field_name))?;
734 self.$field_name.to_source(f)?;
735 f.write_char(',')?;
736 )+
737 f.write_char('}')?;
738
739 Ok(())
740 }
741 }
742 }
743 };
744}
745#[allow(unused)]
746macro_rules! msm_sig_frag {
747 (
748 id: $id:ident,
749 type_name: $type_name:ident,
750 gnss: $gnss:ident,
751 fields: [ $( ( $field_name:ident, $frag_id:ident ) ),+ ],
752 ) => {
753 pub mod $id {
754 use $crate::util::DataVec;
755 use $crate::df::{assembler::Assembler, parser::Parser};
756 use $crate::df::dfs::*;
757 use $crate::rtcm_error::RtcmError;
758 use $crate::tinyvec::ArrayVec;
759 use $crate::msg::msm_mappings::$gnss::*;
760 #[cfg(feature = "serde")]
761 use $crate::{Serialize,Deserialize};
762
763 pub mod export_types {
764 $(
765 #[allow(unused)]
766 pub use super::$frag_id::export_types::*;
767 )+
768
769 pub use super::$type_name;
770 }
771
772 #[derive(Default, Clone, Debug, PartialEq)]
773 #[cfg_attr(feature="serde",derive(Serialize,Deserialize),serde(crate = "sd"))]
774 pub struct $type_name {
775 pub satellite_id:u8,
776 pub signal_id:SigId,
777 $(pub $field_name:$frag_id::DataType),+
778 }
779 pub type DataType = DataVec<$type_name,64>;
780 pub fn encode(asm:&mut Assembler, value:&DataType) -> Result<(),RtcmError> {
781 let mut value = value.clone();
782 let slice = value.as_mut_slice();
783 slice.sort_unstable_by(|a,b| {
784 match a.satellite_id.cmp(&b.satellite_id) {
785 core::cmp::Ordering::Less => core::cmp::Ordering::Less,
786 core::cmp::Ordering::Equal => a.signal_id.cmp(&b.signal_id),
787 core::cmp::Ordering::Greater => core::cmp::Ordering::Greater,
788 }
789 });
790 $(
791 for v in value.iter() {
792 $frag_id::encode(asm, &v.$field_name)?;
793 }
794 )+
795 Ok(())
796 }
797 pub fn decode(par:&mut Parser, cell_vec:&ArrayVec<[(u8,u8);64]>) -> Result<DataType,RtcmError> {
798 let mut value = DataVec::<$type_name,64>::new();
799 value.set_len(cell_vec.len());
800 {
801 let mut iter = value.iter_mut();
802 for cv in cell_vec {
803 let v = iter.next().unwrap();
804 v.satellite_id = cv.0;
805 v.signal_id = if let Some(v) = to_sig(cv.1) {
806 v
807 } else {
808 return Err(RtcmError::InvalidSignalId);
809 }
810 }
811 }
812 $(
813 for v in value.iter_mut() {
814 v.$field_name = $frag_id::decode(par)?;
815 }
816 )+
817 Ok(value)
818 }
819 #[cfg(feature = "test_gen")]
820 use $crate::val_gen::ValGen;
821 #[cfg(feature = "test_gen")]
822 pub fn generate<FR,LR,RR>(asm:&mut Assembler, val_gen:&mut ValGen<FR,LR,RR>, sig_len:usize) -> Result<(),RtcmError>
823 where FR:rand::Rng, LR:rand::Rng, RR:rand::Rng {
824 $(
825 for _ in 0..sig_len {
826 $frag_id::generate(asm, val_gen)?;
827 }
828 )+
829 Ok(())
830 }
831 #[cfg(feature = "test_gen")]
832 impl $crate::source_repr::SourceRepr for $type_name {
833 fn to_source(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
834 use core::fmt::Write;
835
836 write!(f, "{} {{", stringify!($type_name))?;
837 f.write_str("satellite_id: ")?;
838 self.satellite_id.to_source(f)?;
839 write!(f, ", signal_id: {}::", stringify!($gnss))?;
840 self.signal_id.to_source(f)?;
841 f.write_char(',')?;
842
843 $(
844 write!(f, "{}: ", stringify!($field_name))?;
845 self.$field_name.to_source(f)?;
846 f.write_char(',')?;
847 )+
848 f.write_char('}')?;
849
850 Ok(())
851 }
852 }
853 }
854 };
855}
856#[allow(unused)]
857fn mask_to_id_vec_u32(mask: u32) -> ArrayVec<[u8; 32]> {
858 let mut indx_vec = ArrayVec::new();
859 for i in 0..32 {
860 if (mask >> (31 - i)) % 2 == 1 {
861 indx_vec.push(i + 1);
862 }
863 }
864 indx_vec
865}
866#[allow(unused)]
867fn mask_to_id_vec_u64(mask: u64) -> ArrayVec<[u8; 64]> {
868 let mut indx_vec = ArrayVec::new();
869 for i in 0..64 {
870 if (mask >> (63 - i)) % 2 == 1 {
871 indx_vec.push(i + 1);
872 }
873 }
874 indx_vec
875}
876#[allow(unused)]
877fn cell_mask_id_vec(
878 sat_mask: u64,
879 sig_mask: u32,
880 cell_mask: u64,
881) -> Option<(ArrayVec<[u8; 64]>, ArrayVec<[(u8, u8); 64]>)> {
882 let sat_vec = mask_to_id_vec_u64(sat_mask);
883 let sig_vec = mask_to_id_vec_u32(sig_mask);
884 let cell_cont_len = sat_vec.len() * sig_vec.len();
885 if cell_cont_len > 64 || cell_cont_len == 0 {
886 return None;
887 }
888 let mut cell_vec = ArrayVec::new();
889 for i in 0..cell_cont_len {
890 if (cell_mask >> (cell_cont_len - 1 - i)) % 2 == 1 {
891 cell_vec.push((sat_vec[i / sig_vec.len()], sig_vec[i % sig_vec.len()]));
892 }
893 }
894 Some((sat_vec, cell_vec))
895}
896
897pub const DESC_CAP: usize = 31;
899pub const DB_LINK_CAP: usize = 7;
900pub const SAT_CAP_LEGACY: usize = 31;
901pub const SAT_CAP_MAC: usize = 15;
902pub const SAT_CAP_FKP: usize = 31;
903pub const SAT_CAP_RES: usize = 31;
904pub const SAT_CAP_1013: usize = 31;
905pub const SAT_CAP_1057: usize = 60;
906pub const SAT_CAP_1058: usize = 63;
907pub const SAT_CAP_1059: usize = 390;
908pub const SAT_CAP_1060: usize = 39;
909pub const SAT_CAP_1061: usize = 63;
910pub const SAT_CAP_1062: usize = 63;
911pub const SAT_CAP_1063: usize = 60;
912pub const SAT_CAP_1064: usize = 63;
913pub const SAT_CAP_1065: usize = 390;
914pub const SAT_CAP_1066: usize = 39;
915pub const SAT_CAP_1067: usize = 63;
916pub const SAT_CAP_1068: usize = 63;
917
918#[cfg(any(
919 feature = "msg1071",
920 feature = "msg1072",
921 feature = "msg1073",
922 feature = "msg1081",
923 feature = "msg1082",
924 feature = "msg1083",
925 feature = "msg1091",
926 feature = "msg1092",
927 feature = "msg1093",
928 feature = "msg1101",
929 feature = "msg1102",
930 feature = "msg1103",
931 feature = "msg1111",
932 feature = "msg1112",
933 feature = "msg1113",
934 feature = "msg1121",
935 feature = "msg1122",
936 feature = "msg1123",
937 feature = "msg1131",
938 feature = "msg1132",
939 feature = "msg1133"
940))]
941mod msm123_sat;
942
943#[cfg(any(
944 feature = "msg1074",
945 feature = "msg1076",
946 feature = "msg1084",
947 feature = "msg1086",
948 feature = "msg1094",
949 feature = "msg1096",
950 feature = "msg1104",
951 feature = "msg1106",
952 feature = "msg1114",
953 feature = "msg1116",
954 feature = "msg1124",
955 feature = "msg1126",
956 feature = "msg1134",
957 feature = "msg1136"
958))]
959mod msm46_sat;
960
961#[cfg(any(
962 feature = "msg1075",
963 feature = "msg1077",
964 feature = "msg1095",
965 feature = "msg1097",
966 feature = "msg1105",
967 feature = "msg1107",
968 feature = "msg1115",
969 feature = "msg1117",
970 feature = "msg1125",
971 feature = "msg1127",
972 feature = "msg1135",
973 feature = "msg1137"
974))]
975mod msm57_sat;
976
977#[cfg(any(feature = "msg1085", feature = "msg1087"))]
978mod msm57_glo_sat;
979
980macro_rules! include_msg {
981 ($msg:ident, $feature:literal) => {
982 #[cfg(feature = $feature)]
983 mod $msg;
984 #[cfg(feature = $feature)]
985 pub use $msg::$msg::export_types::*;
986 };
987}
988
989include_msg!(msg1001, "msg1001");
990include_msg!(msg1002, "msg1002");
991include_msg!(msg1003, "msg1003");
992include_msg!(msg1004, "msg1004");
993include_msg!(msg1005, "msg1005");
994include_msg!(msg1006, "msg1006");
995include_msg!(msg1007, "msg1007");
996include_msg!(msg1008, "msg1008");
997include_msg!(msg1009, "msg1009");
998include_msg!(msg1010, "msg1010");
999include_msg!(msg1011, "msg1011");
1000include_msg!(msg1012, "msg1012");
1001include_msg!(msg1013, "msg1013");
1002include_msg!(msg1014, "msg1014");
1003include_msg!(msg1015, "msg1015");
1004include_msg!(msg1016, "msg1016");
1005include_msg!(msg1017, "msg1017");
1006include_msg!(msg1019, "msg1019");
1007include_msg!(msg1020, "msg1020");
1008include_msg!(msg1021, "msg1021");
1009include_msg!(msg1022, "msg1022");
1010include_msg!(msg1023, "msg1023");
1011include_msg!(msg1024, "msg1024");
1012include_msg!(msg1025, "msg1025");
1013include_msg!(msg1026, "msg1026");
1014include_msg!(msg1027, "msg1027");
1015include_msg!(msg1029, "msg1029");
1016include_msg!(msg1030, "msg1030");
1017include_msg!(msg1031, "msg1031");
1018include_msg!(msg1032, "msg1032");
1019include_msg!(msg1033, "msg1033");
1020include_msg!(msg1034, "msg1034");
1021include_msg!(msg1035, "msg1035");
1022include_msg!(msg1037, "msg1037");
1023include_msg!(msg1038, "msg1038");
1024include_msg!(msg1039, "msg1039");
1025include_msg!(msg1041, "msg1041");
1026include_msg!(msg1042, "msg1042");
1027include_msg!(msg1044, "msg1044");
1028include_msg!(msg1045, "msg1045");
1029include_msg!(msg1046, "msg1046");
1030include_msg!(msg1057, "msg1057");
1031include_msg!(msg1058, "msg1058");
1032include_msg!(msg1059, "msg1059");
1033include_msg!(msg1060, "msg1060");
1034include_msg!(msg1061, "msg1061");
1035include_msg!(msg1062, "msg1062");
1036include_msg!(msg1063, "msg1063");
1037include_msg!(msg1064, "msg1064");
1038include_msg!(msg1065, "msg1065");
1039include_msg!(msg1066, "msg1066");
1040include_msg!(msg1067, "msg1067");
1041include_msg!(msg1068, "msg1068");
1042include_msg!(msg1071, "msg1071");
1043include_msg!(msg1072, "msg1072");
1044include_msg!(msg1073, "msg1073");
1045include_msg!(msg1074, "msg1074");
1046include_msg!(msg1075, "msg1075");
1047include_msg!(msg1076, "msg1076");
1048include_msg!(msg1077, "msg1077");
1049include_msg!(msg1081, "msg1081");
1050include_msg!(msg1082, "msg1082");
1051include_msg!(msg1083, "msg1083");
1052include_msg!(msg1084, "msg1084");
1053include_msg!(msg1085, "msg1085");
1054include_msg!(msg1086, "msg1086");
1055include_msg!(msg1087, "msg1087");
1056include_msg!(msg1091, "msg1091");
1057include_msg!(msg1092, "msg1092");
1058include_msg!(msg1093, "msg1093");
1059include_msg!(msg1094, "msg1094");
1060include_msg!(msg1095, "msg1095");
1061include_msg!(msg1096, "msg1096");
1062include_msg!(msg1097, "msg1097");
1063include_msg!(msg1101, "msg1101");
1064include_msg!(msg1102, "msg1102");
1065include_msg!(msg1103, "msg1103");
1066include_msg!(msg1104, "msg1104");
1067include_msg!(msg1105, "msg1105");
1068include_msg!(msg1106, "msg1106");
1069include_msg!(msg1107, "msg1107");
1070include_msg!(msg1111, "msg1111");
1071include_msg!(msg1112, "msg1112");
1072include_msg!(msg1113, "msg1113");
1073include_msg!(msg1114, "msg1114");
1074include_msg!(msg1115, "msg1115");
1075include_msg!(msg1116, "msg1116");
1076include_msg!(msg1117, "msg1117");
1077include_msg!(msg1121, "msg1121");
1078include_msg!(msg1122, "msg1122");
1079include_msg!(msg1123, "msg1123");
1080include_msg!(msg1124, "msg1124");
1081include_msg!(msg1125, "msg1125");
1082include_msg!(msg1126, "msg1126");
1083include_msg!(msg1127, "msg1127");
1084include_msg!(msg1131, "msg1131");
1085include_msg!(msg1132, "msg1132");
1086include_msg!(msg1133, "msg1133");
1087include_msg!(msg1134, "msg1134");
1088include_msg!(msg1135, "msg1135");
1089include_msg!(msg1136, "msg1136");
1090include_msg!(msg1137, "msg1137");
1091include_msg!(msg1230, "msg1230");
1092include_msg!(msg1300, "msg1300");
1093include_msg!(msg1301, "msg1301");
1094include_msg!(msg1302, "msg1302");
1095include_msg!(msg1303, "msg1303");
1096include_msg!(msg1304, "msg1304");