use std::time::{Duration, Instant};
use crate::peripheral::Peripheral;
use deimos_shared::{peripherals::PeripheralId, states::OperatingMetrics};
use crate::socket::SocketAddr;
#[derive(Default, Clone, Copy, Debug)]
pub(crate) struct PeripheralMetrics {
pub operating_metrics: OperatingMetrics,
pub last_received_time_ns: i64,
pub raw_timing_delta_ns: f64,
pub filtered_timing_delta_ns: f64,
pub requested_period_delta_ns: f64,
pub requested_phase_delta_ns: f64,
pub loss_of_contact_counter: f64,
pub cycle_lag_count: f64,
}
pub(crate) enum ConnState {
Binding {
binding_timeout: Instant,
reconnect_deadline: Option<Instant>,
},
Configuring {
configuring_timeout: Instant,
reconnect_deadline: Option<Instant>,
},
Operating(),
Disconnected {
deadline: Option<Instant>,
},
}
pub(crate) struct PeripheralState {
pub addr: SocketAddr,
#[allow(dead_code)]
pub id: PeripheralId,
pub name: String,
pub acknowledged_configuration: bool,
pub conn_state: ConnState,
pub metrics: PeripheralMetrics,
pub has_received_packet: bool,
pub metric_full_names: Vec<String>,
}
impl PeripheralState {
#[allow(clippy::borrowed_box)] pub fn new(
name: &String,
addr: SocketAddr,
p: &Box<dyn Peripheral>,
ctx: &crate::controller::context::ControllerCtx,
) -> Self {
let mut mnames = Vec::new();
for orig in [
"cycle_time_ns",
"cycle_time_margin_ns",
"raw_timing_delta_ns",
"filtered_timing_delta_ns",
"requested_period_delta_ns",
"requested_phase_delta_ns",
"loss_of_contact_counter",
"cycle_lag_count",
]
.iter()
{
mnames.push(format!("{name}.metrics.{orig}"))
}
let metrics = PeripheralMetrics::default();
let acknowledged_configuration = false;
let conn_state = ConnState::Binding {
binding_timeout: Instant::now() + Duration::from_millis(ctx.binding_timeout_ms as u64),
reconnect_deadline: None,
};
let id = p.id();
Self {
addr,
id,
name: name.to_owned(),
acknowledged_configuration,
conn_state,
metrics,
has_received_packet: false,
metric_full_names: mnames,
}
}
pub fn write_metric_values(&self, out: &mut [f64]) {
out[0] = self.metrics.operating_metrics.cycle_time_ns as f64;
out[1] = self.metrics.operating_metrics.cycle_time_margin_ns as f64;
out[2] = self.metrics.raw_timing_delta_ns;
out[3] = self.metrics.filtered_timing_delta_ns;
out[4] = self.metrics.requested_period_delta_ns;
out[5] = self.metrics.requested_phase_delta_ns;
out[6] = self.metrics.loss_of_contact_counter;
out[7] = self.metrics.cycle_lag_count;
}
}