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)]
pub struct DeviceErrors(pub(crate) [bool; 6]);
use core::ops::{Index, IndexMut};
impl Index<DeviceError> for DeviceErrors {
type Output = bool;
fn index(&self, idx: DeviceError) -> &Self::Output {
match idx {
DeviceError::InvalidRegisterWrite => &self.0[0],
DeviceError::InvalidRegisterRead => &self.0[1],
DeviceError::InvalidMeasurement => &self.0[2],
DeviceError::MaxResistence => &self.0[3],
DeviceError::HeaterFault => &self.0[4],
DeviceError::HeaterSupply => &self.0[5],
}
}
}
impl IndexMut<DeviceError> for DeviceErrors {
fn index_mut(&mut self, idx: DeviceError) -> &mut Self::Output {
match idx {
DeviceError::InvalidRegisterWrite => &mut self.0[0],
DeviceError::InvalidRegisterRead => &mut self.0[1],
DeviceError::InvalidMeasurement => &mut self.0[2],
DeviceError::MaxResistence => &mut self.0[3],
DeviceError::HeaterFault => &mut self.0[4],
DeviceError::HeaterSupply => &mut self.0[5],
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum DeviceError {
InvalidRegisterWrite,
InvalidRegisterRead,
InvalidMeasurement,
MaxResistence,
HeaterFault,
HeaterSupply,
}
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)]
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());
}
#[test]
fn can_index_device_errors() {
let errors = DeviceErrors([true; 6]);
assert!(errors[DeviceError::InvalidRegisterWrite]);
assert!(errors[DeviceError::InvalidRegisterRead]);
assert!(errors[DeviceError::InvalidMeasurement]);
assert!(errors[DeviceError::MaxResistence]);
assert!(errors[DeviceError::HeaterFault]);
assert!(errors[DeviceError::HeaterSupply]);
}
}