embassy_bme280_sensor/
configuration.rs

1#[derive(Clone, Debug, Default, Eq, PartialEq)]
2pub struct SamplingConfiguration {
3    standby_duration: StandbyDuration,
4    filter: Filter,
5    spi3w: bool,
6    temperature_oversampling: Oversampling,
7    pressure_oversampling: Oversampling,
8    humidity_oversampling: Oversampling,
9    sensor_mode: SensorMode,
10}
11
12impl From<&SamplingConfiguration> for (Config, ControlMeasurement, ControlHumidity) {
13    fn from(configuration: &SamplingConfiguration) -> Self {
14        let config = (
15            configuration.standby_duration.clone(),
16            configuration.filter.clone(),
17            configuration.spi3w,
18        )
19            .into();
20        let control_measurement = (
21            configuration.temperature_oversampling,
22            configuration.pressure_oversampling,
23            configuration.sensor_mode,
24        )
25            .into();
26        let control_humidity = configuration.humidity_oversampling.into();
27        (config, control_measurement, control_humidity)
28    }
29}
30
31impl SamplingConfiguration {
32    pub(crate) fn to_low_level_configuration(
33        &self,
34    ) -> (Config, ControlMeasurement, ControlHumidity) {
35        self.into()
36    }
37
38    pub fn with_standby_time(mut self, standby_duration: StandbyDuration) -> Self {
39        self.standby_duration = standby_duration;
40        self
41    }
42
43    pub fn with_filter(mut self, filter: Filter) -> Self {
44        self.filter = filter;
45        self
46    }
47
48    #[allow(unused)]
49    pub(crate) fn with_spi3w(mut self, spi3w: bool) -> Self {
50        self.spi3w = spi3w;
51        self
52    }
53
54    pub fn with_temperature_oversampling(mut self, temperature_oversampling: Oversampling) -> Self {
55        self.temperature_oversampling = temperature_oversampling;
56        self
57    }
58
59    pub fn with_pressure_oversampling(mut self, pressure_oversampling: Oversampling) -> Self {
60        self.pressure_oversampling = pressure_oversampling;
61        self
62    }
63
64    pub fn with_humidity_oversampling(mut self, humidity_oversampling: Oversampling) -> Self {
65        self.humidity_oversampling = humidity_oversampling;
66        self
67    }
68
69    pub fn with_sensor_mode(mut self, sensor_mode: SensorMode) -> Self {
70        self.sensor_mode = sensor_mode;
71        self
72    }
73
74    pub fn with_standby_duration(mut self, standby_duration: StandbyDuration) -> Self {
75        self.standby_duration = standby_duration;
76        self
77    }
78}
79
80#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
81pub(crate) struct Config(u8);
82
83impl From<(StandbyDuration, Filter, bool)> for Config {
84    fn from((standby_duration, filter, spi3w): (StandbyDuration, Filter, bool)) -> Self {
85        let standby_duration = (standby_duration as u8) & 0b111;
86        let filter = (filter as u8) & 0b111;
87        let spi3w = u8::from(spi3w) & 0b1;
88        Self(standby_duration << 5 | filter << 2 | spi3w)
89    }
90}
91
92impl From<Config> for u8 {
93    fn from(config: Config) -> Self {
94        config.0
95    }
96}
97
98#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
99pub(crate) struct ControlHumidity(u8);
100
101impl From<Oversampling> for ControlHumidity {
102    fn from(humidity_oversampling: Oversampling) -> Self {
103        Self((humidity_oversampling as u8) & 0b111)
104    }
105}
106
107impl From<ControlHumidity> for u8 {
108    fn from(ctrl_hum: ControlHumidity) -> Self {
109        ctrl_hum.0
110    }
111}
112
113#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
114pub(crate) struct ControlMeasurement(u8);
115
116impl From<(Oversampling, Oversampling, SensorMode)> for ControlMeasurement {
117    fn from(
118        (oversampling_temperature, oversampling_pressure, sensor_mode): (
119            Oversampling,
120            Oversampling,
121            SensorMode,
122        ),
123    ) -> Self {
124        let oversampling_temperature = (oversampling_temperature as u8) & 0b111;
125        let oversampling_pressure = (oversampling_pressure as u8) & 0b111;
126        let sensor_mode = (sensor_mode as u8) & 0b11;
127        Self(oversampling_temperature << 5 | oversampling_pressure << 2 | sensor_mode)
128    }
129}
130
131impl From<ControlMeasurement> for u8 {
132    fn from(ctrl_meas: ControlMeasurement) -> Self {
133        ctrl_meas.0
134    }
135}
136
137#[derive(Clone, Debug, Default, Eq, PartialEq)]
138#[repr(u8)]
139pub enum StandbyDuration {
140    #[default]
141    Millis0_5 = 0b000,
142    Millis10 = 0b110,
143    Millis20 = 0b111,
144    Millis62_5 = 0b001,
145    Millis125 = 0b010,
146    Millis250 = 0b011,
147    Millis500 = 0b100,
148    Millis1000 = 0b101,
149}
150
151#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
152pub enum Oversampling {
153    #[default]
154    Skip = 0b000,
155    X1 = 0b001,
156    X2 = 0b010,
157    X4 = 0b011,
158    X8 = 0b100,
159    X16 = 0b101,
160}
161
162#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
163#[repr(u8)]
164pub enum SensorMode {
165    #[default]
166    Sleep = 0b00,
167    Forced = 0b01,
168    Normal = 0b11,
169}
170
171#[derive(Clone, Debug, Default, Eq, PartialEq)]
172#[repr(u8)]
173pub enum Filter {
174    #[default]
175    Off = 0b000,
176    X2 = 0b001,
177    X4 = 0b010,
178    X8 = 0b011,
179    X16 = 0b100,
180}