use paste::paste;
use uom::si::f64::{
ElectricCharge, ElectricCurrent, ElectricPotential, Energy, Frequency, MassConcentration, Power, Pressure, Ratio,
ThermodynamicTemperature, Velocity,
};
pub trait Measurement: core::fmt::Debug {}
#[maybe_async_cfg::maybe(sync(feature = "sync"), async(feature = "async"))]
#[allow(async_fn_in_trait)]
pub trait OneshotSensor {
type Error: core::fmt::Debug;
type Measurement: self::Measurement;
async fn measure(&mut self) -> Result<Self::Measurement, Self::Error>;
}
#[maybe_async_cfg::maybe(sync(feature = "sync"), async(feature = "async"))]
#[allow(async_fn_in_trait)]
pub trait ContinuousSensor {
type Error: core::fmt::Debug;
type Measurement: self::Measurement;
async fn start_measuring(&mut self) -> Result<(), Self::Error>;
async fn stop_measuring(&mut self) -> Result<(), Self::Error>;
async fn measurement_interval_us(&mut self) -> Result<u32, Self::Error>;
async fn current_measurement(&mut self) -> Result<Option<Self::Measurement>, Self::Error>;
async fn is_measurement_ready(&mut self) -> Result<bool, Self::Error>;
async fn next_measurement(&mut self) -> Result<Self::Measurement, Self::Error>;
}
macro_rules! define_sensor_measurement {
(
$sensor_name:ident,
$measurement_type:ty,
$measurement_desc:expr
) => {
paste! {
#[doc = concat!("A sensor which measures ", $measurement_desc)]
pub trait [<$sensor_name Sensor>] {}
#[doc = concat!("A measurement result which may include a ", $measurement_desc, " measurement")]
pub trait [<$sensor_name Measurement>]: Measurement {
fn [<$sensor_name:snake>](&self) -> Option<$measurement_type>;
}
}
};
}
define_sensor_measurement!(Charge, ElectricCharge, "charge");
define_sensor_measurement!(Co2Concentration, Ratio, "CO2 concentration");
define_sensor_measurement!(Current, ElectricCurrent, "current");
define_sensor_measurement!(Energy, Energy, "energy");
define_sensor_measurement!(HchoConcentration, Ratio, "HCHO concentration");
define_sensor_measurement!(NoxIndex, Ratio, "NOx index");
define_sensor_measurement!(Pm10Concentration, MassConcentration, "PM10 concentration");
define_sensor_measurement!(Pm1Concentration, MassConcentration, "PM1 concentration");
define_sensor_measurement!(Pm2_5Concentration, MassConcentration, "PM2.5 concentration");
define_sensor_measurement!(Pm4Concentration, MassConcentration, "PM4 concentration");
define_sensor_measurement!(Power, Power, "power");
define_sensor_measurement!(Pressure, Pressure, "pressure");
define_sensor_measurement!(RelativeHumidity, Ratio, "relative humidity");
define_sensor_measurement!(SoilMoisture, Ratio, "soil moisture");
define_sensor_measurement!(Temperature, ThermodynamicTemperature, "temperature");
define_sensor_measurement!(VocIndex, Ratio, "VOC index");
define_sensor_measurement!(Voltage, ElectricPotential, "voltage");
define_sensor_measurement!(WindSpeed, Velocity, "wind speed");
define_sensor_measurement!(Frequency, Frequency, "frequency");