Skip to main content

plato_engine_block/
tick.rs

1//! Tick — a single snapshot of all sensor readings at a point in time.
2
3use crate::sensor::SensorSpec;
4
5/// A single tick: timestamp + all sensor values.
6#[derive(Debug, Clone)]
7pub struct Tick {
8    /// Monotonic tick index.
9    pub index: u64,
10    /// Timestamp in seconds since engine start (or epoch).
11    pub timestamp: f64,
12    /// Sensor readings: (name, value).
13    pub data: Vec<(String, f64)>,
14}
15
16impl Tick {
17    /// Create a new tick by reading all sensors.
18    pub fn from_sensors(index: u64, timestamp: f64, sensors: &[SensorSpec]) -> Self {
19        let data: Vec<(String, f64)> = sensors
20            .iter()
21            .map(|s| {
22                let val = (s.callback)();
23                (s.name.clone(), val)
24            })
25            .collect();
26        Tick {
27            index,
28            timestamp,
29            data,
30        }
31    }
32
33    /// Get a sensor value by name.
34    pub fn get(&self, sensor_name: &str) -> Option<f64> {
35        self.data
36            .iter()
37            .find(|(name, _)| name == sensor_name)
38            .map(|(_, v)| *v)
39    }
40}