1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use crate::{read::*, AirQualitySensor, Reading, SensorError};
use embedded_hal::i2c::{AddressMode, Error as I2cError, I2c};

/// A SEN0177 device connected via I2C
pub struct Sen0177<A, I2C, E>
where
    A: AddressMode + Copy,
    I2C: I2c<A, Error = E>,
    E: I2cError,
{
    i2c_bus: I2C,
    address: A,
}

impl<A, I2C, E> Sen0177<A, I2C, E>
where
    A: AddressMode + Copy,
    I2C: I2c<A, Error = E>,
    E: I2cError,
{
    /// Creates a new sensor instance connected to I2C bus `i2c_bus` at address `address`
    pub fn new(i2c_bus: I2C, address: A) -> Self {
        Self { i2c_bus, address }
    }
}

impl<A, I2C, E> AirQualitySensor<E> for Sen0177<A, I2C, E>
where
    A: AddressMode + Copy,
    I2C: I2c<A, Error = E>,
    E: I2cError,
{
    fn read(&mut self) -> Result<Reading, SensorError<E>> {
        let mut buf: [u8; PAYLOAD_LEN] = [0; PAYLOAD_LEN];
        self.i2c_bus.read(self.address, &mut buf)?;
        if buf[0] != MAGIC_BYTE_0 || buf[1] != MAGIC_BYTE_1 {
            Err(SensorError::BadMagic)
        } else {
            parse_data(&buf)
        }
    }
}