scd4x_rs/
sample.rs

1// Copyright Claudio Mattera 2024.
2//
3// Distributed under the MIT License or the Apache 2.0 License at your option.
4// See the accompanying files License-MIT.txt and License-Apache-2.0.txt, or
5// online at
6// https://opensource.org/licenses/MIT
7// https://opensource.org/licenses/Apache-2.0
8
9//! Data types and functions for SCD4x sensor samples
10
11#[cfg(feature = "uom")]
12use uom::si::f32::Length as UomAltitude;
13#[cfg(feature = "uom")]
14use uom::si::f32::Pressure as UomPressure;
15#[cfg(feature = "uom")]
16use uom::si::f32::Ratio as UomHumidity;
17#[cfg(feature = "uom")]
18use uom::si::f32::Ratio as UomCo2;
19#[cfg(feature = "uom")]
20use uom::si::f32::ThermodynamicTemperature as UomTemperature;
21#[cfg(feature = "uom")]
22use uom::si::length::meter;
23#[cfg(feature = "uom")]
24use uom::si::pressure::hectopascal;
25#[cfg(feature = "uom")]
26use uom::si::ratio::part_per_million;
27#[cfg(feature = "uom")]
28use uom::si::ratio::percent;
29#[cfg(feature = "uom")]
30use uom::si::thermodynamic_temperature::degree_celsius;
31
32#[cfg(feature = "uom")]
33/// Type for CO₂ concentration values
34pub type Co2 = UomCo2;
35
36#[cfg(feature = "uom")]
37/// Type for temperature values
38pub type Temperature = UomTemperature;
39
40#[cfg(feature = "uom")]
41/// Type for humidity values
42pub type Humidity = UomHumidity;
43
44#[cfg(feature = "uom")]
45/// Type for pressure values
46pub type Pressure = UomPressure;
47
48#[cfg(feature = "uom")]
49/// Type for altitude values
50pub type Altitude = UomAltitude;
51
52#[cfg(feature = "uom")]
53/// Convert a raw value in PPM to a CO₂ concentration
54pub(crate) fn co2_from_ppm(raw: f32) -> Co2 {
55    Co2::new::<part_per_million>(raw)
56}
57
58#[cfg(feature = "uom")]
59/// Convert a CO₂ concentration to a raw value in PPM
60pub(crate) fn ppm_from_co2(co2: Co2) -> f32 {
61    co2.get::<part_per_million>()
62}
63
64#[cfg(feature = "uom")]
65/// Convert a raw value in Celsius to a temperature
66pub(crate) fn temperature_from_celsius(raw: f32) -> Temperature {
67    Temperature::new::<degree_celsius>(raw)
68}
69
70#[cfg(feature = "uom")]
71/// Convert a temperature to a raw value in Celsius
72pub(crate) fn celsius_from_temperature(temperature: Temperature) -> f32 {
73    temperature.get::<degree_celsius>()
74}
75
76#[cfg(feature = "uom")]
77/// Convert a raw value to a humidity
78pub(crate) fn humidity_from_number(raw: f32) -> Humidity {
79    Humidity::new::<percent>(raw)
80}
81
82#[cfg(feature = "uom")]
83/// Convert a pressure to a raw value in hectoPascal
84pub(crate) fn hectopascal_from_pressure(pressure: Pressure) -> f32 {
85    pressure.get::<hectopascal>()
86}
87
88#[cfg(all(feature = "uom", feature = "blocking"))]
89#[cfg(test)]
90/// Convert a raw value in hectoPascal to a pressure
91pub(crate) fn pressure_from_hectopascal(raw: f32) -> Pressure {
92    Pressure::new::<hectopascal>(raw)
93}
94
95#[cfg(feature = "uom")]
96/// Convert a raw value in meter to an altitude
97pub(crate) fn altitude_from_meter(raw: f32) -> Altitude {
98    Altitude::new::<meter>(raw)
99}
100
101#[cfg(feature = "uom")]
102/// Convert an altitude to a raw value in meter
103pub(crate) fn meter_from_altitude(altitude: Altitude) -> f32 {
104    altitude.get::<meter>()
105}
106
107#[cfg(not(feature = "uom"))]
108/// Type for CO₂ values
109pub type Co2 = f32;
110
111#[cfg(not(feature = "uom"))]
112/// Type for temperature values
113pub type Temperature = f32;
114
115#[cfg(not(feature = "uom"))]
116/// Type for temperature values
117pub type Humidity = f32;
118
119#[cfg(not(feature = "uom"))]
120/// Type for pressure values
121pub type Pressure = f32;
122
123#[cfg(not(feature = "uom"))]
124/// Type for altitude values
125pub type Altitude = f32;
126
127#[cfg(not(feature = "uom"))]
128/// Convert a raw value in Celsius to a temperature
129pub(crate) fn co2_from_ppm(raw: f32) -> Co2 {
130    raw
131}
132
133#[cfg(not(feature = "uom"))]
134/// Convert a CO₂ concentration to a raw value in PPM
135pub(crate) fn ppm_from_co2(co2: Co2) -> f32 {
136    co2
137}
138
139#[cfg(not(feature = "uom"))]
140/// Convert a raw value in Celsius to a temperature
141pub(crate) fn temperature_from_celsius(raw: f32) -> Temperature {
142    raw
143}
144
145#[cfg(not(feature = "uom"))]
146/// Convert a temperature to a raw value in Celsius
147pub(crate) fn celsius_from_temperature(temperature: Temperature) -> f32 {
148    temperature
149}
150
151#[cfg(not(feature = "uom"))]
152/// Convert a raw value to a humidity
153pub(crate) fn humidity_from_number(raw: f32) -> Humidity {
154    raw
155}
156
157#[cfg(not(feature = "uom"))]
158/// Convert a pressure to a raw value in hectoPascal
159pub(crate) fn hectopascal_from_pressure(pressure: Pressure) -> f32 {
160    pressure
161}
162
163#[cfg(all(not(feature = "uom"), feature = "blocking"))]
164#[cfg(test)]
165/// Convert a raw value in hectoPascal to a pressure
166pub(crate) fn pressure_from_hectopascal(raw: f32) -> Pressure {
167    raw
168}
169
170#[cfg(not(feature = "uom"))]
171/// Convert a raw value in meter to an altitude
172pub(crate) fn altitude_from_meter(raw: f32) -> Altitude {
173    raw
174}
175
176#[cfg(not(feature = "uom"))]
177/// Convert an altitude to a raw value in meter
178pub(crate) fn meter_from_altitude(altitude: Altitude) -> f32 {
179    altitude
180}
181
182/// A full sample: CO₂ concentration, temperature and humidity
183#[derive(Copy, Clone, Debug, Default, PartialEq)]
184pub struct Sample {
185    /// CO₂ concentration
186    pub co2: Co2,
187
188    /// Temperature
189    pub temperature: Temperature,
190
191    /// Humidity
192    pub humidity: Humidity,
193}