use crate::BASE_ADDR;
#[derive(Debug)]
pub enum Error<E> {
I2C(E),
InvalidInputData,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Measurement {
pub temperature: f32,
pub humidity: Option<f32>,
pub status: Status,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Status {
pub data_ready: bool,
pub high_temp_threshold_exceeded: bool,
pub low_temp_threshold_exceeded: bool,
pub high_humidity_threshold_exceeded: bool,
pub low_humidity_threshold_exceeded: bool,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum MeasurementMode {
TemperatureAndHumidity,
TemperatureOnly,
}
impl Default for MeasurementMode {
fn default() -> Self {
MeasurementMode::TemperatureAndHumidity
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SlaveAddr {
Default,
Alternative(bool),
}
impl Default for SlaveAddr {
fn default() -> Self {
SlaveAddr::Default
}
}
impl SlaveAddr {
pub(crate) fn addr(self) -> u8 {
match self {
SlaveAddr::Default => BASE_ADDR,
SlaveAddr::Alternative(false) => BASE_ADDR,
SlaveAddr::Alternative(true) => BASE_ADDR | 1,
}
}
}
#[cfg(test)]
mod tests {
use super::BASE_ADDR as ADDR;
use super::{MeasurementMode, SlaveAddr};
#[test]
fn can_get_default_address() {
let addr = SlaveAddr::default();
assert_eq!(ADDR, addr.addr());
}
#[test]
fn can_generate_alternative_addresses() {
assert_eq!(ADDR, SlaveAddr::Alternative(false).addr());
assert_eq!(ADDR | 1, SlaveAddr::Alternative(true).addr());
}
#[test]
fn can_get_default_measurement_mode() {
assert_eq!(
MeasurementMode::TemperatureAndHumidity,
MeasurementMode::default()
);
}
}