1use thiserror::Error;
2
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6mod method;
7mod modeling;
8mod solver;
9
10pub use crate::{
11 carrier::Signal,
12 cfg::solver::SolverOpts,
13 cfg::{method::Method, modeling::Modeling},
14 prelude::TimeScale,
15};
16
17#[derive(Debug, Error)]
19pub enum Error {
20 #[error("invalid troposphere model")]
21 InvalidTroposphereModel,
22
23 #[error("invalid user profile")]
24 InvalidUserProfile,
25
26 #[error("invalid clock profile")]
27 InvalidClockProfile,
28}
29
30const fn default_timescale() -> TimeScale {
31 TimeScale::GPST
32}
33
34const fn max_tropo_bias() -> f64 {
35 30.0
36}
37
38const fn max_iono_bias() -> f64 {
39 10.0
40}
41
42const fn min_sv_elev() -> Option<f64> {
43 Some(12.5)
44}
45
46const fn default_code_smoothing() -> usize {
47 0
48}
49
50const fn default_eclipse_rate_percent() -> f64 {
51 10.0
52}
53
54#[derive(Default, Debug, Clone, PartialEq)]
55#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
56pub struct InternalDelay {
64 pub delay: f64,
66
67 pub frequency: f64,
69}
70
71#[derive(Debug, Clone)]
72#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
73pub struct Config {
74 #[cfg_attr(feature = "serde", serde(default = "default_timescale"))]
77 pub timescale: TimeScale,
78
79 #[cfg_attr(feature = "serde", serde(default))]
81 pub method: Method,
82
83 #[cfg_attr(feature = "serde", serde(default))]
91 pub prefered_signal: Option<Signal>,
92
93 #[cfg_attr(feature = "serde", serde(default))]
95 pub fixed_altitude: Option<f64>,
96
97 #[cfg_attr(feature = "serde", serde(default = "default_code_smoothing"))]
103 pub code_smoothing: usize,
104
105 #[cfg_attr(feature = "serde", serde(default))]
109 pub int_delay: Vec<InternalDelay>,
110
111 #[cfg_attr(feature = "serde", serde(default))]
113 pub arp_enu: Option<(f64, f64, f64)>,
114
115 #[cfg_attr(feature = "serde", serde(default))]
117 pub solver: SolverOpts,
118
119 #[cfg_attr(feature = "serde", serde(default))]
124 pub externalref_delay_s: Option<f64>,
125
126 #[cfg_attr(
130 feature = "serde",
131 serde(alias = "max_eclipse_rate", default = "default_eclipse_rate_percent")
132 )]
133 pub max_eclipse_rate_percent: f64,
134
135 #[cfg_attr(feature = "serde", serde(default = "min_sv_elev"))]
138 pub min_sv_elev: Option<f64>,
139
140 #[cfg_attr(feature = "serde", serde(default))]
144 pub min_sv_azim: Option<f64>,
145
146 #[cfg_attr(feature = "serde", serde(default))]
150 pub max_sv_azim: Option<f64>,
151
152 #[cfg_attr(feature = "serde", serde(default))]
154 pub min_snr: Option<f64>,
155
156 #[cfg_attr(feature = "serde", serde(default = "max_tropo_bias"))]
159 pub max_tropo_bias: f64,
160
161 #[cfg_attr(feature = "serde", serde(default = "max_iono_bias"))]
164 pub max_iono_bias: f64,
165
166 #[cfg_attr(feature = "serde", serde(default))]
168 pub modeling: Modeling,
169}
170
171impl Default for Config {
172 fn default() -> Self {
173 Self {
174 timescale: default_timescale(),
175 method: Method::default(),
176 solver: SolverOpts::default(),
177 int_delay: Default::default(),
178 modeling: Modeling::default(),
179 fixed_altitude: None,
180 prefered_signal: None,
181 arp_enu: None,
182 min_snr: None, min_sv_azim: None,
184 max_sv_azim: None,
185 externalref_delay_s: None,
186 min_sv_elev: min_sv_elev(),
187 max_iono_bias: max_iono_bias(),
188 max_tropo_bias: max_tropo_bias(),
189 code_smoothing: default_code_smoothing(),
190 max_eclipse_rate_percent: default_eclipse_rate_percent(),
191 }
192 }
193}
194
195impl Config {
196 pub fn with_navigation_method(&self, method: Method) -> Self {
198 let mut s = self.clone();
199 s.method = method;
200 s
201 }
202
203 pub fn with_modeling(&self, modeling: Modeling) -> Self {
206 let mut s = self.clone();
207 s.modeling = modeling;
208 s
209 }
210}
211
212#[cfg(test)]
213#[cfg(feature = "serde")]
214mod test {
215 use super::*;
216 use std::io::Write;
217
218 #[test]
219 fn generate_default_preset() {
220 let cfg = Config::default();
221 let string = serde_json::to_string_pretty(&cfg).unwrap();
222 let mut fd = std::fs::File::create("default.json").unwrap();
223 write!(fd, "{}", string).unwrap();
224 }
225}