rtcm_rs/df/dfs/
df_msg1230_biases.rs1use crate::df::bit_value::*;
2use crate::df::{assembler::Assembler, parser::Parser};
3use crate::msg::GloSigId;
4use crate::rtcm_error::RtcmError;
5#[cfg(feature = "test_gen")]
6use crate::source_repr::SourceRepr;
7use crate::util::DataVec;
8#[cfg(feature = "serde")]
9use crate::{Deserialize, Serialize};
10
11#[derive(Default, Clone, Debug, PartialEq)]
12#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "sd"))]
13pub struct Msg1230CodePhaseBias {
14 pub signal_id: GloSigId,
15 pub bias_m: f32,
16}
17
18#[cfg(feature = "test_gen")]
19impl SourceRepr for Msg1230CodePhaseBias {
20 fn to_source(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
21 use core::fmt::Write;
22 write!(f, "Msg1230CodePhaseBias {{ signal_id: glo::")?;
23 self.signal_id.to_source(f)?;
24 write!(f, ", bias_m: ")?;
25 self.bias_m.to_source(f)?;
26 f.write_char('}')
27 }
28}
29
30pub mod export_types {
31 pub use super::Msg1230CodePhaseBias;
32}
33
34pub type DataType = DataVec<Msg1230CodePhaseBias, 4>;
35
36#[allow(unused)]
37pub fn encode(asm: &mut Assembler, value: &DataType) -> Result<(), RtcmError> {
38 let mut sig_mask: u8 = 0;
39 let mut value = value.clone();
40 let slice = value.as_mut_slice();
41 slice.sort_unstable_by(|a, b| a.signal_id.cmp(&b.signal_id));
42 for v in slice.iter() {
43 let sig_id = v.signal_id;
44 match (sig_id.band(), sig_id.attribute()) {
45 (1, 'C') => {
46 sig_mask |= 1 << 3;
47 }
48 (1, 'P') => {
49 sig_mask |= 1 << 2;
50 }
51 (2, 'C') => {
52 sig_mask |= 1 << 1;
53 }
54 (2, 'P') => {
55 sig_mask |= 1;
56 }
57 _ => {
58 return Err(RtcmError::InvalidSignalId);
59 }
60 }
61 }
62 asm.put::<U8>(sig_mask, 4)?;
63 for v in slice.iter() {
64 let mut bias = v.bias_m;
65 bias /= 0.02;
66 let bias = if bias > 0.0 { bias + 0.5 } else { bias - 0.5 } as i16;
67 asm.put::<I16>(bias, 16)?;
68 }
69 Ok(())
70}
71
72#[allow(unused)]
73pub fn decode(par: &mut Parser) -> Result<DataType, RtcmError> {
74 let mut value = DataVec::<Msg1230CodePhaseBias, 4>::new();
75 let sig_mask: u8 = par.parse::<U8>(4)?;
76 for i in 0..4usize {
77 if sig_mask & (1 << (3 - i)) != 0 {
78 let bias_m = (par.parse::<I16>(16)? as f32) * 0.02;
79
80 match i {
81 0 => {
82 value.push(Msg1230CodePhaseBias {
83 signal_id: GloSigId::new(1, 'C'),
84 bias_m,
85 });
86 }
87 1 => {
88 value.push(Msg1230CodePhaseBias {
89 signal_id: GloSigId::new(1, 'P'),
90 bias_m,
91 });
92 }
93 2 => {
94 value.push(Msg1230CodePhaseBias {
95 signal_id: GloSigId::new(2, 'C'),
96 bias_m,
97 });
98 }
99 3 => {
100 value.push(Msg1230CodePhaseBias {
101 signal_id: GloSigId::new(2, 'P'),
102 bias_m,
103 });
104 }
105 _ => unreachable!(),
106 }
107 }
108 }
109 Ok(value)
110}
111
112#[cfg(feature = "test_gen")]
113use crate::val_gen::ValGen;
114#[cfg(feature = "test_gen")]
115#[allow(unused)]
116pub fn generate<FR, LR, RR>(
117 asm: &mut Assembler,
118 val_gen: &mut ValGen<FR, LR, RR>,
119) -> Result<DataType, RtcmError>
120where
121 FR: rand::Rng,
122 LR: rand::Rng,
123 RR: rand::Rng,
124{
125 let mut value = DataVec::<Msg1230CodePhaseBias, 4>::new();
126 let sig_mask: u8 = val_gen.len_rng.gen();
127 asm.put::<U8>(sig_mask, 4)?;
128 for i in 0..4usize {
129 if sig_mask & (1 << (3 - i)) != 0 {
130 let raw_val: i16 = val_gen.field_rng.gen();
131 let bias_m = (raw_val as f32) * 0.02;
132
133 match i {
134 0 => {
135 value.push(Msg1230CodePhaseBias {
136 signal_id: GloSigId::new(1, 'C'),
137 bias_m,
138 });
139 }
140 1 => {
141 value.push(Msg1230CodePhaseBias {
142 signal_id: GloSigId::new(1, 'P'),
143 bias_m,
144 });
145 }
146 2 => {
147 value.push(Msg1230CodePhaseBias {
148 signal_id: GloSigId::new(2, 'C'),
149 bias_m,
150 });
151 }
152 3 => {
153 value.push(Msg1230CodePhaseBias {
154 signal_id: GloSigId::new(2, 'P'),
155 bias_m,
156 });
157 }
158 _ => unreachable!(),
159 }
160
161 asm.put::<I16>(raw_val, 16)?;
162 }
163 }
164 Ok(value)
165}