scd30_interface/data/
ambient_pressure.rsuse crate::error::DataError;
#[derive(Debug, PartialEq)]
pub struct AmbientPressure(u16);
const MIN_AMBIENT_PRESSURE: u16 = 700;
const MAX_AMBIENT_PRESSURE: u16 = 1400;
const AMBIENT_PRESSURE_VAL: &str = "Ambient pressure compensation";
const PRESSURE_UNIT: &str = "mBar";
impl AmbientPressure {
pub const fn to_be_bytes(&self) -> [u8; 2] {
self.0.to_be_bytes()
}
}
#[cfg(feature = "defmt")]
impl defmt::Format for AmbientPressure {
fn format(&self, f: defmt::Formatter) {
defmt::write!(f, "{}mBar", self.0)
}
}
impl TryFrom<u16> for AmbientPressure {
type Error = DataError;
fn try_from(pressure: u16) -> Result<Self, Self::Error> {
match pressure {
0 => Err(DataError::UseDefaultPressure),
p if !(MIN_AMBIENT_PRESSURE..=MAX_AMBIENT_PRESSURE).contains(&p) => {
Err(DataError::ValueOutOfRange {
parameter: AMBIENT_PRESSURE_VAL,
min: MIN_AMBIENT_PRESSURE,
max: MAX_AMBIENT_PRESSURE,
unit: PRESSURE_UNIT,
})
}
_ => Ok(Self(pressure)),
}
}
}
#[derive(Debug)]
pub enum AmbientPressureCompensation {
DefaultPressure,
CompensationPressure(AmbientPressure),
}
impl AmbientPressureCompensation {
pub const fn to_be_bytes(&self) -> [u8; 2] {
match self {
AmbientPressureCompensation::DefaultPressure => [0x00, 0x00],
AmbientPressureCompensation::CompensationPressure(ambient_pressure) => {
ambient_pressure.to_be_bytes()
}
}
}
}
#[cfg(feature = "defmt")]
impl defmt::Format for AmbientPressureCompensation {
fn format(&self, f: defmt::Formatter) {
match self {
AmbientPressureCompensation::DefaultPressure => defmt::write!(f, "Default Pressure"),
AmbientPressureCompensation::CompensationPressure(pres) => {
defmt::write!(f, "Compensation Pressure: {}mBar", pres)
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serialize_sample_works() {
let pressure = AmbientPressure(700);
assert_eq!(pressure.to_be_bytes(), [0x02, 0xBC]);
}
#[test]
fn create_allowed_value_from_u16_works() {
let values = [700, 1000, 1400];
for value in values {
assert_eq!(
AmbientPressure::try_from(value).unwrap(),
AmbientPressure(value)
);
}
}
#[test]
fn create_from_u16_non_null_out_of_spec_value_errors() {
let values = [500, 2000];
for value in values {
assert_eq!(
AmbientPressure::try_from(value).unwrap_err(),
DataError::ValueOutOfRange {
parameter: AMBIENT_PRESSURE_VAL,
min: 700,
max: 1400,
unit: PRESSURE_UNIT
}
);
}
}
#[test]
fn create_from_u16_null_value_errors() {
assert_eq!(
AmbientPressure::try_from(0).unwrap_err(),
DataError::UseDefaultPressure
);
}
}