micropelt 1.1.8

Micropelt device communication definitions
Documentation
use std::io::{Error, ErrorKind, Result};

use crate::{lorawan, PortPayload};

use super::port::Port;
use super::{
    data_rate, external_sensor, motor, motor_config, on_off, operate, pid, slow_harvest,
    temperature_drop, temperature_estimate, version,
};

#[derive(Clone, Debug, PartialEq)]
pub enum Uplink {
    Operate(operate::Uplink),
    Version(version::Uplink),
    DataRate(data_rate::Uplink),
    Motor(motor::Uplink),
    SlowHarvest(slow_harvest::Uplink),
    TemperatureDrop(temperature_drop::Uplink),
    Pid(pid::Uplink),
    TemperatureEstimate(temperature_estimate::Uplink),
    ExternalSensor(external_sensor::Uplink),
    OnOff(on_off::Uplink),
    MotorConfig(motor_config::Uplink),
}

impl lorawan::Uplink for Uplink {
    fn deserialise(input: &PortPayload) -> Result<Self> {
        if input.port == Port::Operate as u8 {
            Ok(Self::Operate(operate::Uplink::deserialise(&input.payload)?))
        } else if input.port == Port::Version as u8 {
            Ok(Self::Version(version::Uplink::deserialise(&input.payload)?))
        } else if input.port == Port::Motor as u8 {
            Ok(Self::Motor(motor::Uplink::deserialise(&input.payload)?))
        } else if input.port == Port::DataRate as u8 {
            Ok(Self::DataRate(data_rate::Uplink::deserialise(
                &input.payload,
            )?))
        } else if input.port == Port::SlowHarvest as u8 {
            Ok(Self::SlowHarvest(slow_harvest::Uplink::deserialise(
                &input.payload,
            )?))
        } else if input.port == Port::TemperatureDrop as u8 {
            Ok(Self::TemperatureDrop(
                temperature_drop::Uplink::deserialise(&input.payload)?,
            ))
        } else if input.port == Port::Pid as u8 {
            Ok(Self::Pid(pid::Uplink::deserialise(&input.payload)?))
        } else if input.port == Port::TemperatureEstimate as u8 {
            Ok(Self::TemperatureEstimate(
                temperature_estimate::Uplink::deserialise(&input.payload)?,
            ))
        } else if input.port == Port::ExternalSensor as u8 {
            Ok(Self::ExternalSensor(external_sensor::Uplink::deserialise(
                &input.payload,
            )?))
        } else if input.port == Port::OnOff as u8 {
            Ok(Self::OnOff(on_off::Uplink::deserialise(&input.payload)?))
        } else if input.port == Port::MotorConfig as u8 {
            Ok(Self::MotorConfig(motor_config::Uplink::deserialise(
                &input.payload,
            )?))
        } else {
            Err(Error::new(
                ErrorKind::Unsupported,
                format!("fport {} is not yet used", input.port),
            ))
        }
    }
}