aranet4 0.1.0

Read current and historical measurements from an Aranet4 CO2 Monitor over bluetooth
Documentation
#![allow(unused)]
use serde_repr::{Deserialize_repr, Serialize_repr};

use uuid::Uuid;
#[non_exhaustive]
pub struct AranetService;
#[non_exhaustive]
pub struct GenericService;
#[non_exhaustive]
pub struct CommonService;

impl AranetService {
    pub const UUID: Uuid = Uuid::from_u128(0xf0cd1400_95da_4f4b_9ac8_aa55d312af0c);
    pub const READ_CURRENT_READINGS: Uuid = Uuid::from_u128(0xf0cd1503_95da_4f4b_9ac8_aa55d312af0c);
    pub const READ_INTERVAL: Uuid = Uuid::from_u128(0xf0cd2002_95da_4f4b_9ac8_aa55d312af0c);
    pub const READ_SECONDS_SINCE_UPDATE: Uuid =
        Uuid::from_u128(0xf0cd2004_95da_4f4b_9ac8_aa55d312af0c);
    pub const READ_TOTAL_READINGS: Uuid = Uuid::from_u128(0xf0cd2001_95da_4f4b_9ac8_aa55d312af0c);
    pub const READ_HISTORY_READINGS: Uuid = Uuid::from_u128(0xf0cd2005_95da_4f4b_9ac8_aa55d312af0c);
    pub const WRITE_CMD: Uuid = Uuid::from_u128(0xf0cd1402_95da_4f4b_9ac8_aa55d312af0c);
}

impl GenericService {
    pub const UUID: Uuid = Uuid::from_u128(0x00001800_0000_1000_8000_00805f9b34fb);
    pub const READ_DEVICE_NAME: Uuid = Uuid::from_u128(0x00002a00_0000_1000_8000_00805f9b34fb);
}

impl CommonService {
    pub const UUID: Uuid = Uuid::from_u128(0x0000180a_0000_1000_8000_00805f9b34fb);
    pub const READ_MANUFACTURER_NAME: Uuid =
        Uuid::from_u128(0x00002a29_0000_1000_8000_00805f9b34fb);
    pub const READ_MODEL_NUMBER: Uuid = Uuid::from_u128(0x00002a24_0000_1000_8000_00805f9b34fb);
    pub const READ_SERIAL_NO: Uuid = Uuid::from_u128(0x00002a25_0000_1000_8000_00805f9b34fb);
    pub const READ_HW_REV: Uuid = Uuid::from_u128(0x00002a27_0000_1000_8000_00805f9b34fb);
    pub const READ_SW_REV: Uuid = Uuid::from_u128(0x00002a28_0000_1000_8000_00805f9b34fb);
    pub const READ_BATTERY: Uuid = Uuid::from_u128(0x00002a19_0000_1000_8000_00805f9b34fb);
}

#[derive(Debug, Serialize_repr, Deserialize_repr, PartialEq, Eq, Clone, Copy)]
#[repr(u8)]
pub enum LogParameter {
    Temperature = 1,
    Humidity = 2,
    Pressure = 3,
    Co2 = 4,
}

/// Convert a temperature from u16 representation to Fahrenheit
pub(crate) fn convert_temperature(temp: u16) -> f32 {
    (temp as f32 / 20.0) * 1.8 + 32_f32
}
/// Convert a pressure from u16 representation
pub(crate) fn convert_pressure(pressure: u16) -> f32 {
    pressure as f32 / 10.0
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn log_parameter_serialize() {
        let x = LogParameter::Co2;
        let bin = bincode::serialize(&x).expect("value to serialize");
        assert_eq!(&bin, &[4u8]);
        let bin = &[3u8];
        let x: LogParameter = bincode::deserialize(bin).expect("value to deserialize");
        assert_eq!(x, LogParameter::Pressure);
    }
}