#[derive(Debug, Clone)]
pub enum Resolution {
Humidity12Temperature14,
Humidity8Temperature12,
Humidity10Temperature13,
Humidity11Temperature11,
}
#[derive(Debug, Clone)]
pub enum SupplyVoltage {
High,
Low,
}
pub struct UserRegister(pub(crate) u8);
impl UserRegister {
pub fn resolution(&self) -> Resolution {
let bit7 = ((self.0 >> 7) & 1) == 1;
let bit0 = (self.0 & 1) == 1;
match (bit7, bit0) {
(false, false) => Resolution::Humidity12Temperature14,
(false, true) => Resolution::Humidity8Temperature12,
(true, false) => Resolution::Humidity10Temperature13,
(true, true) => Resolution::Humidity11Temperature11,
}
}
pub fn supply_voltage(&self) -> SupplyVoltage {
let bit6 = ((self.0 >> 6) & 1) == 1;
if bit6 {
SupplyVoltage::Low
} else {
SupplyVoltage::High
}
}
pub fn heater_enabled(&self) -> bool {
((self.0 >> 2) & 1) == 1
}
pub fn otp_reload_enabled(&self) -> bool {
let bit1 = ((self.0 >> 1) & 1) == 1;
!bit1
}
pub fn set_resolution(&mut self, resolution: Resolution) {
let bit_7_mask = 1u8 << 7;
let bit_0_mask = 1u8;
self.0 &= !(bit_7_mask | bit_0_mask);
match resolution {
Resolution::Humidity12Temperature14 => { }
Resolution::Humidity8Temperature12 => {
self.0 |= bit_0_mask;
}
Resolution::Humidity10Temperature13 => {
self.0 |= bit_7_mask;
}
Resolution::Humidity11Temperature11 => {
self.0 |= bit_7_mask | bit_0_mask;
}
}
}
pub fn set_heater_enabled(&mut self, enabled: bool) {
let bit_2_mask = 1u8 << 2;
if enabled {
self.0 |= bit_2_mask;
} else {
self.0 &= !bit_2_mask;
}
}
pub fn set_otp_reload_enabled(&mut self, otp_reload: bool) {
let bit_1_mask = 1u8 << 1;
if otp_reload {
self.0 &= !bit_1_mask;
} else {
self.0 |= bit_1_mask;
}
}
}
mod debug_impl {
use super::UserRegister;
use core::fmt::{Debug, Formatter, Result};
impl Debug for UserRegister {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
f.debug_struct("UserRegister")
.field("resolution", &self.resolution())
.field("supply_voltage", &self.supply_voltage())
.field("heater_enabled", &self.heater_enabled())
.field("otp_reload_enabled", &self.otp_reload_enabled())
.finish()
}
}
}