scd30_interface/data/
automatic_self_calibration.rsuse crate::error::DataError;
use crate::util::check_deserialization;
const ASC_VALUE: &str = "Automatic self-calibration";
const ASC_EXPECTED: &str = "0 or 1";
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum AutomaticSelfCalibration {
Active = 1,
Inactive = 0,
}
#[cfg(feature = "defmt")]
impl defmt::Format for AutomaticSelfCalibration {
fn format(&self, f: defmt::Formatter) {
match self {
AutomaticSelfCalibration::Active => defmt::write!(f, "Active"),
AutomaticSelfCalibration::Inactive => defmt::write!(f, "Inactive"),
}
}
}
impl AutomaticSelfCalibration {
pub fn to_be_bytes(&self) -> [u8; 2] {
(*self as u16).to_be_bytes()
}
}
impl TryFrom<&[u8]> for AutomaticSelfCalibration {
type Error = DataError;
fn try_from(data: &[u8]) -> Result<Self, Self::Error> {
check_deserialization(data, 3)?;
match data[1] {
1 => Ok(Self::Active),
0 => Ok(Self::Inactive),
val => Err(DataError::UnexpectedValueReceived {
parameter: ASC_VALUE,
expected: ASC_EXPECTED,
actual: val as u16,
}),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serialize_inactive_works() {
let asc = AutomaticSelfCalibration::Inactive;
assert_eq!(asc.to_be_bytes(), [0x00, 0x00]);
}
#[test]
fn serialize_active_works() {
let asc = AutomaticSelfCalibration::Active;
assert_eq!(asc.to_be_bytes(), [0x00, 0x01]);
}
#[test]
fn deserialize_inactive_spec_sample_works() {
let data = [0x00, 0x00, 0x81];
assert_eq!(
AutomaticSelfCalibration::try_from(&data[..]).unwrap(),
AutomaticSelfCalibration::Inactive
);
}
#[test]
fn deserialize_active_works() {
let data = [0x00, 0x01, 0xB0];
assert_eq!(
AutomaticSelfCalibration::try_from(&data[..]).unwrap(),
AutomaticSelfCalibration::Active
);
}
#[test]
fn deserialize_out_of_specification_value_errors() {
let data = [0x00, 0x02, 0xE3];
assert_eq!(
AutomaticSelfCalibration::try_from(&data[..]).unwrap_err(),
DataError::UnexpectedValueReceived {
parameter: ASC_VALUE,
expected: ASC_EXPECTED,
actual: 2
}
);
}
}