use fixed::types::{I16F16, I18F14, U16F16};
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[non_exhaustive]
pub enum Address {
Address0x44,
Address0x45,
Address0x46,
}
impl From<Address> for u8 {
fn from(address: Address) -> Self {
match address {
Address::Address0x44 => 0x44,
Address::Address0x45 => 0x45,
Address::Address0x46 => 0x46,
}
}
}
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum HeatingPower {
Low,
Medium,
High,
}
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum HeatingDuration {
Short,
Long,
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct Measurement {
temperature: I16F16,
humidity: I16F16,
}
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum Precision {
Low,
Medium,
High,
}
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct SensorData {
pub temperature: u16,
pub humidity: u16,
}
#[cfg(feature = "defmt")]
impl defmt::Format for Measurement {
fn format(&self, f: defmt::Formatter) {
defmt::write!(
f,
"Measurement {{ {} m°C, {} m% }}",
self.temperature_milli_celsius(),
self.humidity_milli_percent(),
);
}
}
impl From<SensorData> for Measurement {
fn from(raw: SensorData) -> Self {
const MINUS_45: I16F16 = I16F16::const_from_int(-45);
const MINUS_6: I16F16 = I16F16::const_from_int(-6);
let temperature_quotient = U16F16::from_num(raw.temperature) / (u16::MAX as u32);
let humidity_quotient = U16F16::from_num(raw.humidity) / (u16::MAX as u32);
Self {
temperature: MINUS_45 + 175 * temperature_quotient.to_num::<I16F16>(),
humidity: MINUS_6 + 125 * humidity_quotient.to_num::<I16F16>(),
}
}
}
impl Measurement {
pub fn temperature_celsius(&self) -> I16F16 {
self.temperature
}
pub fn temperature_milli_celsius(&self) -> i32 {
let milli = self.temperature.to_num::<I18F14>() * 1000;
milli.to_num::<i32>()
}
pub fn humidity_milli_percent(&self) -> i32 {
let milli = self.humidity.to_num::<I18F14>() * 1000;
milli.to_num::<i32>()
}
pub fn humidity_percent(&self) -> I16F16 {
self.humidity
}
}