use embedded_hal::{
delay::DelayNs,
digital::{ErrorType, InputPin, OutputPin, PinState},
};
use crate::SensorError;
pub struct Dht<P: InputPin + OutputPin, D: DelayNs> {
pub pin: P,
pub delay: D,
}
impl<P: InputPin + OutputPin, D: DelayNs> Dht<P, D> {
pub fn new(pin: P, delay: D) -> Self {
Self { pin, delay }
}
pub fn read_byte(&mut self) -> Result<u8, SensorError> {
let mut byte: u8 = 0;
for n in 0..8 {
let _ = self.wait_until_state(PinState::High);
self.delay.delay_us(30);
let is_bit_1 = self.pin.is_high();
if is_bit_1.unwrap() {
let bit_mask = 1 << (7 - (n % 8));
byte |= bit_mask;
let _ = self.wait_until_state(PinState::Low);
}
}
Ok(byte)
}
pub fn wait_until_state(&mut self, state: PinState) -> Result<(), <P as ErrorType>::Error> {
while !match state {
PinState::Low => self.pin.is_low(),
PinState::High => self.pin.is_high(),
}? {
self.delay.delay_us(1);
}
Ok(())
}
}