rtcm_rs/df/dfs/
df_msg1230_biases.rs

1use 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}