Skip to main content

cu_sensor_payloads/
barometer.rs

1use bincode::{Decode, Encode};
2use cu29::prelude::*;
3use cu29::units::si::f32::{Pressure, ThermodynamicTemperature};
4use cu29::units::si::pressure::pascal;
5use cu29::units::si::thermodynamic_temperature::degree_celsius;
6use serde::{Deserialize, Serialize};
7
8/// Standardized barometer payload carrying pressure and temperature.
9#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, Encode, Decode, Reflect)]
10pub struct BarometerPayload {
11    pub pressure: Pressure,
12    pub temperature: ThermodynamicTemperature,
13}
14
15impl Default for BarometerPayload {
16    fn default() -> Self {
17        Self {
18            pressure: Pressure::new::<pascal>(0.0),
19            temperature: ThermodynamicTemperature::new::<degree_celsius>(0.0),
20        }
21    }
22}
23
24impl BarometerPayload {
25    /// Build a barometer payload from scalar values.
26    ///
27    /// * `pressure_pa` - pressure in Pascal.
28    /// * `temperature_c` - temperature in °C.
29    pub fn from_raw(pressure_pa: f32, temperature_c: f32) -> Self {
30        Self {
31            pressure: Pressure::new::<pascal>(pressure_pa),
32            temperature: ThermodynamicTemperature::new::<degree_celsius>(temperature_c),
33        }
34    }
35
36    /// Build a barometer payload from unit-carrying types.
37    pub fn from_units(pressure: Pressure, temperature: ThermodynamicTemperature) -> Self {
38        Self {
39            pressure,
40            temperature,
41        }
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48    use bincode::config;
49
50    #[test]
51    fn round_trip_encode_decode() {
52        let payload = BarometerPayload::from_raw(101_325.0, 23.4);
53
54        let cfg = config::standard();
55        let mut buffer = [0u8; 128];
56        let len = bincode::encode_into_slice(payload, &mut buffer, cfg).unwrap();
57        let (decoded, used) =
58            bincode::decode_from_slice::<BarometerPayload, _>(&buffer[..len], cfg).unwrap();
59
60        assert_eq!(used, len);
61        assert_eq!(
62            decoded.pressure.get::<pascal>(),
63            payload.pressure.get::<pascal>()
64        );
65        assert_eq!(
66            decoded.temperature.get::<degree_celsius>(),
67            payload.temperature.get::<degree_celsius>()
68        );
69    }
70}