humidity_core/sample/
summary.rs

1use crate::{
2    sensors::{self},
3    serde::{self, Deserializable, Serializable},
4};
5
6/// Summarizes the results of a sampling operation.
7#[derive(Clone, Copy, Debug, PartialEq)]
8pub struct Summary<SENSOR>
9where
10    SENSOR: sensors::Sensor,
11{
12    /// Number of samples.
13    pub n: u8,
14    /// Average reading across all samples.
15    pub avg: u16,
16    /// Minimum reading across all samples.
17    pub min: u16,
18    /// Maximum reading across all samples.
19    pub max: u16,
20    /// Sensor model.
21    pub sensor: SENSOR,
22}
23
24impl<S> Serializable for Summary<S>
25where
26    S: sensors::Sensor,
27{
28    fn serialize(&self, ser: &mut serde::Serializer) -> Result<usize, serde::Error> {
29        let mut n = ser.write_u8(self.n)?;
30        n += ser.write_u16(self.avg)?;
31        n += ser.write_u16(self.min)?;
32        n += ser.write_u16(self.max)?;
33        n += self.sensor.serialize(ser)?;
34        Ok(n)
35    }
36}
37
38impl<S> Deserializable for Summary<S>
39where
40    S: sensors::Sensor,
41{
42    fn deserialize(de: &mut serde::Deserializer) -> Result<Self, serde::Error> {
43        let n = de.read_u8()?;
44        let avg = de.read_u16()?;
45        let min = de.read_u16()?;
46        let max = de.read_u16()?;
47        let sensor = S::deserialize(de)?;
48        Ok(Self { n, avg, min, max, sensor })
49    }
50}
51
52#[cfg(test)]
53mod test {
54    use sensors::Hygrometer;
55
56    use super::*;
57
58    #[test]
59    fn sample_result_serde() {
60        let input =
61            Summary::<Hygrometer> { n: 1, avg: 990, min: 813, max: 1238, sensor: Hygrometer::YL69 };
62
63        let mut buffer = [0u8; 60];
64        let n = serde::serialize(&input, &mut buffer).unwrap();
65
66        let output = serde::deserialize::<Summary<Hygrometer>>(&buffer[..n]).unwrap();
67        assert_eq!(input, output);
68    }
69}