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}