micropelt/mlr003/external_sensor/
uplink.rs

1use std::fmt;
2use std::io::{Error, ErrorKind, Result};
3
4use crate::utils::check_payload_length;
5
6use super::Expiry;
7
8const UPLINK_N_BYTES: usize = 2;
9
10#[derive(Clone, Debug, PartialEq)]
11pub struct Uplink {
12    expiry: Expiry,
13    temperature_source: TemperatureSource,
14}
15
16#[derive(Clone, Debug, PartialEq)]
17pub enum TemperatureSource {
18    InternalAlgorithm,
19    ExternalSensor,
20}
21
22impl Uplink {
23    pub(crate) fn deserialise(input: &[u8]) -> Result<Self> {
24        check_payload_length(input, UPLINK_N_BYTES)?;
25
26        Ok(Self {
27            expiry: Expiry::from_bin(input[0]),
28            temperature_source: TemperatureSource::from_bin(input[1])?,
29        })
30    }
31
32    pub fn expiry(&self) -> &Expiry {
33        &self.expiry
34    }
35
36    pub fn temperature_source(&self) -> &TemperatureSource {
37        &self.temperature_source
38    }
39}
40
41impl fmt::Display for TemperatureSource {
42    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
43        match self {
44            Self::InternalAlgorithm => write!(f, "Internal Algorithm"),
45            Self::ExternalSensor => write!(f, "External Sensor"),
46        }
47    }
48}
49
50impl TemperatureSource {
51    fn from_bin(input: u8) -> Result<Self> {
52        match input {
53            0 => Ok(Self::InternalAlgorithm),
54            1 => Ok(Self::ExternalSensor),
55            _ => Err(Error::new(
56                ErrorKind::InvalidInput,
57                format!("Expected 0 or 1, got {input}"),
58            )),
59        }
60    }
61}