micropelt/mlr003/external_sensor/
uplink.rs1use 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}