mod temperature;
mod tuning;
use crate::{
error::DataError,
util::{check_deserialization, check_range},
};
pub use temperature::{TemperatureAcceleration, TemperatureOffset};
pub use tuning::{NoxTuning, VocTuning};
pub struct TargetCO2Concentration(u16);
impl From<u16> for TargetCO2Concentration {
fn from(value: u16) -> Self {
TargetCO2Concentration(value)
}
}
impl From<TargetCO2Concentration> for u16 {
fn from(value: TargetCO2Concentration) -> Self {
value.0
}
}
pub struct Co2Correction(u16);
impl Co2Correction {
pub fn is_valid(&self) -> bool {
self.0 != 0xFFFF
}
}
impl TryFrom<&[u8]> for Co2Correction {
type Error = DataError;
fn try_from(data: &[u8]) -> Result<Self, Self::Error> {
check_deserialization(data, 3)?;
let value = u16::from_be_bytes([data[0], data[1]]);
let value = if value != 0xFFFF {
value - 0x8000
} else {
value
};
Ok(Co2Correction(value))
}
}
impl From<Co2Correction> for u16 {
fn from(value: Co2Correction) -> Self {
value.0
}
}
#[derive(Debug, PartialEq)]
pub struct AmbientPressure(u16);
impl TryFrom<u16> for AmbientPressure {
type Error = DataError;
fn try_from(value: u16) -> Result<Self, Self::Error> {
check_range(value, 700, 1_200, "Ambient Pressure", "hPa")?;
Ok(AmbientPressure(value))
}
}
impl TryFrom<&[u8]> for AmbientPressure {
type Error = DataError;
fn try_from(data: &[u8]) -> Result<Self, Self::Error> {
check_deserialization(data, 3)?;
Ok(AmbientPressure(u16::from_be_bytes([data[0], data[1]])))
}
}
impl From<AmbientPressure> for u16 {
fn from(value: AmbientPressure) -> Self {
value.0
}
}
impl Default for AmbientPressure {
fn default() -> Self {
Self(1013)
}
}
#[derive(Debug, PartialEq)]
pub struct SensorAltitude(u16);
impl TryFrom<u16> for SensorAltitude {
type Error = DataError;
fn try_from(value: u16) -> Result<Self, Self::Error> {
check_range(value, 0, 3_000, "Sensor Altitude", "m")?;
Ok(SensorAltitude(value))
}
}
impl TryFrom<&[u8]> for SensorAltitude {
type Error = DataError;
fn try_from(data: &[u8]) -> Result<Self, Self::Error> {
check_deserialization(data, 3)?;
Ok(SensorAltitude(u16::from_be_bytes([data[0], data[1]])))
}
}
impl From<SensorAltitude> for u16 {
fn from(value: SensorAltitude) -> Self {
value.0
}
}
impl Default for SensorAltitude {
fn default() -> Self {
Self(0)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn target_co2_concentration_wraps_raw_value() {
let value = 12;
assert_eq!(u16::from(TargetCO2Concentration::from(value)), value)
}
}