use core::convert::From;
#[derive(Debug)]
pub enum Error<CommE, PinE> {
I2C(CommE),
Pin(PinE),
Device(DeviceErrors),
NoValidApp,
InvalidInputData,
}
#[derive(Debug)]
pub enum ErrorAwake<E> {
I2C(E),
Device(DeviceErrors),
NoValidApp,
InvalidInputData,
}
impl<CommE, PinE> From<ErrorAwake<CommE>> for Error<CommE, PinE> {
fn from(error: ErrorAwake<CommE>) -> Self {
match error {
ErrorAwake::I2C(e) => Error::I2C(e),
ErrorAwake::Device(e) => Error::Device(e),
ErrorAwake::NoValidApp => Error::NoValidApp,
ErrorAwake::InvalidInputData => Error::InvalidInputData,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct DeviceErrors {
pub invalid_register_write: bool,
pub invalid_register_read: bool,
pub invalid_measurement: bool,
pub max_resistance: bool,
pub heater_fault: bool,
pub heater_supply: bool,
}
#[derive(Debug)]
pub struct ModeChangeError<E, DEV> {
pub dev: DEV,
pub error: E,
}
impl<E, DEV> ModeChangeError<E, DEV> {
pub(crate) fn new(dev: DEV, error: E) -> Self {
ModeChangeError { dev, error }
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum MeasurementMode {
Idle,
ConstantPower1s,
PulseHeating10s,
LowPowerPulseHeating60s,
ConstantPower250ms,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum FirmwareMode {
Boot,
Application,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum InterruptMode {
Disabled,
OnDataReady,
OnThresholdCrossed,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct AlgorithmResult {
pub eco2: u16,
pub etvoc: u16,
pub raw_current: u8,
pub raw_voltage: u16,
}
#[derive(Debug, Clone, Copy)]
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 => 0x5A,
SlaveAddr::Alternative(false) => 0x5A,
SlaveAddr::Alternative(true) => 0x5B,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn can_get_default_address() {
let addr = SlaveAddr::default();
assert_eq!(0x5A, addr.addr());
}
#[test]
fn can_generate_alternative_addresses() {
assert_eq!(0x5A, SlaveAddr::Alternative(false).addr());
assert_eq!(0x5B, SlaveAddr::Alternative(true).addr());
}
}