1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
use super::Parameter;
use serde::Deserialize;

#[derive(Debug, Deserialize, PartialEq, Clone)]
pub struct ErrorStatistics {
    #[serde(rename = "CompositeSCP")]
    pub composite_scp: Option<CompositeSCP>,
    #[serde(rename = "Components")]
    pub components: Option<Components>,
    #[serde(rename = "AdditionalParams")]
    pub additional_params: Option<Vec<Parameter>>,
}
#[derive(Debug, Deserialize, PartialEq, Clone)]
pub struct CompositeSCP {
    #[serde(rename = "RgAzErr")]
    pub rg_az_err: Option<RgAzErr>,
    #[serde(rename = "RowColErr")]
    pub row_col_err: Option<RowColErr>,
}
#[derive(Debug, Deserialize, PartialEq, Clone)]
pub struct RgAzErr {
    #[serde(rename = "Rg")]
    pub rg: f64,
    #[serde(rename = "Az")]
    pub az: f64,
    #[serde(rename = "RgAz")]
    pub rg_az: f64,
}
#[derive(Debug, Deserialize, PartialEq, Clone)]
pub struct RowColErr {
    #[serde(rename = "Row")]
    pub row: f64,
    #[serde(rename = "Col")]
    pub col: f64,
    #[serde(rename = "RowCol")]
    pub row_col: f64,
}

#[derive(Debug, Deserialize, PartialEq, Clone)]
pub struct Components {
    #[serde(rename = "PosVelErr")]
    pub pos_vel_err: Option<PosVelErr>,
    #[serde(rename = "RadarSensor")]
    pub radar_sensor: Option<RadarSensor>,
    #[serde(rename = "TropoErro")]
    pub tropo_erro: Option<TropoError>,
    #[serde(rename = "IonoError")]
    pub iono_error: Option<IonoError>,
}
#[derive(Debug, Deserialize, PartialEq, Clone)]
pub struct PosVelErr {
    #[serde(rename = "Frame")]
    pub frame: Frame,
    #[serde(rename = "P1")]
    pub p1: f64,
    #[serde(rename = "P2")]
    pub p2: f64,
    #[serde(rename = "P3")]
    pub p3: f64,
    #[serde(rename = "V1")]
    pub v1: f64,
    #[serde(rename = "V2")]
    pub v2: f64,
    #[serde(rename = "V3")]
    pub v3: f64,
    #[serde(rename = "CorrCoefs")]
    pub corr_coefs: Option<CorrCoefs>,
    #[serde(rename = "PositionDecorr")]
    pub position_decorr: Option<Decorr>,
}
#[derive(Debug, Deserialize, PartialEq, Clone)]
pub struct Frame {
    #[serde(rename = "$text")]
    pub value: FrameEnum,
}
#[derive(Debug, Deserialize, PartialEq, Clone)]
pub enum FrameEnum {
    ECF,
    #[serde(rename = "RIC_ECF")]
    RICECF,
    #[serde(rename = "RIC_ECI")]
    RICECI,
}
#[derive(Debug, Deserialize, PartialEq, Clone)]
pub struct CorrCoefs {
    #[serde(rename = "P1P2")]
    pub p1p2: f64,
    #[serde(rename = "P1P3")]
    pub p1p3: f64,
    #[serde(rename = "P1V1")]
    pub p1v1: f64,
    #[serde(rename = "P1V2")]
    pub p1v2: f64,
    #[serde(rename = "P1V3")]
    pub p1v3: f64,
    #[serde(rename = "P2P3")]
    pub p2p3: f64,
    #[serde(rename = "P2V1")]
    pub p2v1: f64,
    #[serde(rename = "P2V2")]
    pub p2v2: f64,
    #[serde(rename = "P2V3")]
    pub p2v3: f64,
    #[serde(rename = "P3V1")]
    pub p3v1: f64,
    #[serde(rename = "P3V2")]
    pub p3v2: f64,
    #[serde(rename = "P3V3")]
    pub p3v3: f64,
    #[serde(rename = "V1V2")]
    pub v1v2: f64,
    #[serde(rename = "V1V3")]
    pub v1v3: f64,
    #[serde(rename = "V2V3")]
    pub v2v3: f64,
}
#[derive(Debug, Deserialize, PartialEq, Clone)]
pub struct RadarSensor {
    #[serde(rename = "RangeBias")]
    pub range_bias: f64,
    #[serde(rename = "ClockFreqSF")]
    pub clock_freq_sf: Option<f64>,
    #[serde(rename = "TransmitFreqSF")]
    pub transmit_freq_sf: Option<f64>,
    #[serde(rename = "RangeBiasDecorr")]
    pub range_bias_decorr: Option<Decorr>,
}
#[derive(Debug, Deserialize, PartialEq, Clone)]
pub struct TropoError {
    #[serde(rename = "TropoRangeVertical")]
    pub tropo_range_vertical: Option<f64>,
    #[serde(rename = "TropoRangeSlant")]
    pub tropo_range_slant: Option<f64>,
    #[serde(rename = "TropoRangeDecorr")]
    pub tropo_range_decorr: Option<Decorr>,
}
#[derive(Debug, Deserialize, PartialEq, Clone)]
pub struct IonoError {
    #[serde(rename = "IonoRangeVertical")]
    pub iono_range_vertical: Option<f64>,
    #[serde(rename = "IonoRangeRateVertical")]
    pub iono_range_rate_vertical: Option<f64>,
    #[serde(rename = "IonoRgRgRateCC")]
    pub iono_rg_rg_rate_cc: f64,
    #[serde(rename = "IonoRangeVertDecorr")]
    pub iono_range_vert_decorr: Option<Decorr>,
}

#[derive(Debug, Deserialize, PartialEq, Clone)]
pub struct Decorr {
    #[serde(rename = "CorrCoefZero")]
    pub corr_coef_zero: f64,
    #[serde(rename = "DecorrRate")]
    pub decorr_rate: f64,
}