use serde::Deserialize;
use crate::time_types::NtpDuration;
#[derive(Debug, Copy, Clone, Deserialize)]
#[serde(rename_all = "kebab-case", deny_unknown_fields)]
pub struct AlgorithmConfig {
#[serde(default = "default_precision_low_probability")]
pub precision_low_probability: f64,
#[serde(default = "default_precision_high_probability")]
pub precision_high_probability: f64,
#[serde(default = "default_precision_hysteresis")]
pub precision_hysteresis: i32,
#[serde(default = "default_precision_minimum_weight")]
pub precision_minimum_weight: f64,
#[serde(default = "default_poll_interval_low_weight")]
pub poll_interval_low_weight: f64,
#[serde(default = "default_poll_interval_high_weight")]
pub poll_interval_high_weight: f64,
#[serde(default = "default_poll_interval_hysteresis")]
pub poll_interval_hysteresis: i32,
#[serde(default = "default_poll_interval_step_threshold")]
pub poll_interval_step_threshold: f64,
#[serde(default = "default_delay_outlier_threshold")]
pub delay_outlier_threshold: f64,
#[serde(default = "default_initial_wander")]
pub initial_wander: f64,
#[serde(default = "default_initial_frequency_uncertainty")]
pub initial_frequency_uncertainty: f64,
#[serde(default = "default_maximum_source_uncertainty")]
pub maximum_source_uncertainty: f64,
#[serde(default = "default_range_statistical_weight")]
pub range_statistical_weight: f64,
#[serde(default = "default_range_delay_weight")]
pub range_delay_weight: f64,
#[serde(default = "default_steer_offset_threshold")]
pub steer_offset_threshold: f64,
#[serde(default = "default_steer_offset_leftover")]
pub steer_offset_leftover: f64,
#[serde(default = "default_steer_frequency_threshold")]
pub steer_frequency_threshold: f64,
#[serde(default = "default_steer_frequency_leftover")]
pub steer_frequency_leftover: f64,
#[serde(default = "default_step_threshold")]
pub step_threshold: f64,
#[serde(default = "default_slew_maximum_frequency_offset")]
pub slew_maximum_frequency_offset: f64,
#[serde(default = "default_slew_minimum_duration")]
pub slew_minimum_duration: f64,
#[serde(default = "default_maximum_frequency_steer")]
pub maximum_frequency_steer: f64,
#[serde(default)]
pub ignore_server_dispersion: bool,
#[serde(default = "default_meddling_threshold")]
pub meddling_threshold: NtpDuration,
}
impl Default for AlgorithmConfig {
fn default() -> Self {
Self {
precision_low_probability: default_precision_low_probability(),
precision_high_probability: default_precision_high_probability(),
precision_hysteresis: default_precision_hysteresis(),
precision_minimum_weight: default_precision_minimum_weight(),
poll_interval_low_weight: default_poll_interval_low_weight(),
poll_interval_high_weight: default_poll_interval_high_weight(),
poll_interval_hysteresis: default_poll_interval_hysteresis(),
poll_interval_step_threshold: default_poll_interval_step_threshold(),
delay_outlier_threshold: default_delay_outlier_threshold(),
initial_wander: default_initial_wander(),
initial_frequency_uncertainty: default_initial_frequency_uncertainty(),
maximum_source_uncertainty: default_maximum_source_uncertainty(),
range_statistical_weight: default_range_statistical_weight(),
range_delay_weight: default_range_delay_weight(),
steer_offset_threshold: default_steer_offset_threshold(),
steer_offset_leftover: default_steer_offset_leftover(),
steer_frequency_threshold: default_steer_frequency_threshold(),
steer_frequency_leftover: default_steer_frequency_leftover(),
step_threshold: default_step_threshold(),
slew_maximum_frequency_offset: default_slew_maximum_frequency_offset(),
slew_minimum_duration: default_slew_minimum_duration(),
maximum_frequency_steer: default_maximum_frequency_steer(),
ignore_server_dispersion: false,
meddling_threshold: default_meddling_threshold(),
}
}
}
fn default_precision_low_probability() -> f64 {
1. / 3.
}
fn default_precision_high_probability() -> f64 {
2. / 3.
}
fn default_precision_hysteresis() -> i32 {
16
}
fn default_precision_minimum_weight() -> f64 {
0.1
}
fn default_poll_interval_low_weight() -> f64 {
0.4
}
fn default_poll_interval_high_weight() -> f64 {
0.6
}
fn default_poll_interval_hysteresis() -> i32 {
16
}
fn default_poll_interval_step_threshold() -> f64 {
1e-6
}
fn default_delay_outlier_threshold() -> f64 {
5.
}
fn default_initial_wander() -> f64 {
1e-8
}
fn default_initial_frequency_uncertainty() -> f64 {
100e-6
}
fn default_maximum_source_uncertainty() -> f64 {
0.250
}
fn default_range_statistical_weight() -> f64 {
2.
}
fn default_range_delay_weight() -> f64 {
0.25
}
fn default_steer_offset_threshold() -> f64 {
2.0
}
fn default_steer_offset_leftover() -> f64 {
1.0
}
fn default_steer_frequency_threshold() -> f64 {
0.0
}
fn default_steer_frequency_leftover() -> f64 {
0.0
}
fn default_step_threshold() -> f64 {
0.010
}
fn default_slew_maximum_frequency_offset() -> f64 {
200e-6
}
fn default_maximum_frequency_steer() -> f64 {
495e-6
}
fn default_slew_minimum_duration() -> f64 {
8.0
}
fn default_meddling_threshold() -> NtpDuration {
NtpDuration::from_seconds(5.)
}