cu_sensor_payloads/
barometer.rs1use 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#[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 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 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}