aquarium_control/recorder/
recorder_data_frame.rs1use chrono::NaiveDateTime;
10use std::fmt;
11
12#[derive(Debug, PartialEq, Clone)]
13#[derive(Default)]
18pub struct RecorderDataFrame {
19 pub timestamp: NaiveDateTime,
21
22 pub water_temperature: Option<f32>,
24
25 pub water_temperature_filtered: Option<f32>,
27
28 pub ph: Option<f32>,
30
31 pub ph_filtered: Option<f32>,
33
34 pub conductivity: Option<f32>,
36
37 pub conductivity_filtered: Option<f32>,
39
40 pub conductivity_compensated: Option<f32>,
42
43 pub refill_in_progress: Option<bool>,
45
46 pub tank_level_switch_position: Option<bool>,
48
49 pub tank_level_switch_position_stabilized: Option<bool>,
51
52 pub tank_level_switch_invalid: Option<bool>,
54
55 pub surface_ventilation_status: Option<bool>,
57
58 pub ambient_temperature: Option<f32>,
60
61 pub ambient_humidity: Option<f32>,
63
64 pub heater_status: Option<bool>,
66}
67
68impl fmt::Display for RecorderDataFrame {
69 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
83 let none_string = "None".to_string();
84 let water_temperature_string = match self.water_temperature {
85 Some(water_temperature) => water_temperature.to_string(),
86 None => none_string.clone(),
87 };
88 let water_temperature_filtered_string = match self.water_temperature_filtered {
89 Some(water_temperature_filtered) => water_temperature_filtered.to_string(),
90 None => none_string.clone(),
91 };
92 let ph_string = match self.ph {
93 Some(ph) => ph.to_string(),
94 None => none_string.clone(),
95 };
96 let ph_filtered_string = match self.ph_filtered {
97 Some(ph_filtered) => ph_filtered.to_string(),
98 None => none_string.clone(),
99 };
100 let conductivity_string = match self.conductivity {
101 Some(conductivity) => conductivity.to_string(),
102 None => none_string.clone(),
103 };
104 let conductivity_filtered_string = match self.conductivity_filtered {
105 Some(conductivity_filtered) => conductivity_filtered.to_string(),
106 None => none_string.clone(),
107 };
108 let conductivity_compensated_string = match self.conductivity_compensated {
109 Some(conductivity_compensated) => conductivity_compensated.to_string(),
110 None => none_string.clone(),
111 };
112 let refill_in_progress_string = match self.refill_in_progress {
113 Some(refill_in_progress) => match refill_in_progress {
114 true => "yes".to_string(),
115 false => "no".to_string(),
116 },
117 None => none_string.clone(),
118 };
119 let tank_level_switch_position_string = match self.tank_level_switch_position {
120 Some(tank_level_switch_position) => match tank_level_switch_position {
121 true => "high".to_string(),
122 false => "low".to_string(),
123 },
124 None => none_string.clone(),
125 };
126 let tank_level_switch_position_stabilized_string =
127 match self.tank_level_switch_position_stabilized {
128 Some(tank_level_switch_position_stabilized) => {
129 match tank_level_switch_position_stabilized {
130 true => "high".to_string(),
131 false => "low".to_string(),
132 }
133 }
134 None => none_string.clone(),
135 };
136 let tank_level_switch_invalid_string = match self.tank_level_switch_invalid {
137 Some(tank_level_switch_invalid) => match tank_level_switch_invalid {
138 true => "invalid".to_string(),
139 false => "valid".to_string(),
140 },
141 None => none_string.clone(),
142 };
143 let surface_ventilation_status_string = match self.surface_ventilation_status {
144 Some(surface_ventilation_status) => match surface_ventilation_status {
145 true => "on".to_string(),
146 false => "off".to_string(),
147 },
148 None => none_string.clone(),
149 };
150 let ambient_temperature_string = match self.ambient_temperature {
151 Some(ambient_temperature) => ambient_temperature.to_string(),
152 None => none_string.clone(),
153 };
154 let ambient_humidity_string = match self.ambient_humidity {
155 Some(ambient_humidity) => ambient_humidity.to_string(),
156 None => none_string.clone(),
157 };
158 let heater_status_string = match self.heater_status {
159 Some(heater_status) => match heater_status {
160 true => "on".to_string(),
161 false => "off".to_string(),
162 },
163 None => none_string.clone(),
164 };
165 write!(
166 f,
167 "\n**************************************\ntimestamp: {}\
168 \nwater_temperature: {},\nwater_temperature_filtered: {}, \
169 \nph: {},\nph_filtered: {}, \
170 \nconductivity: {},\nconductivity_filtered: {},\nconductivity_compensated: {}, \
171 \nrefill_in_progress: {}, \
172 \ntank_level_switch_position: {},\ntank_level_switch_position_stabilized: {}\ntank_level_switch_invalid: {},\
173 \nsurface_ventilation_status: {},\
174 \nambient_temperature: {},\nambient_humidity: {}, \
175 \nheater_status: {} \n
176 **************************************\n",
177 self.timestamp,
178 water_temperature_string,
179 water_temperature_filtered_string,
180 ph_string,
181 ph_filtered_string,
182 conductivity_string,
183 conductivity_filtered_string,
184 conductivity_compensated_string,
185 refill_in_progress_string,
186 tank_level_switch_position_string,
187 tank_level_switch_position_stabilized_string,
188 tank_level_switch_invalid_string,
189 surface_ventilation_status_string,
190 ambient_temperature_string,
191 ambient_humidity_string,
192 heater_status_string,
193 )
194 }
195}
196
197#[cfg(test)]
198impl RecorderDataFrame {
199 pub fn assert(
230 &self,
231 target_water_temperature: Option<f32>,
232 target_water_temperature_filtered: Option<f32>,
233 target_water_ph: Option<f32>,
234 target_water_ph_filtered: Option<f32>,
235 target_water_conductivity: Option<f32>,
236 target_water_conductivity_filtered: Option<f32>,
237 target_water_conductivity_compensated: Option<f32>,
238 target_refill_in_progress: Option<bool>,
239 target_tank_level_switch_position: Option<bool>,
240 target_tank_level_switch_position_stabilized: Option<bool>,
241 target_tank_level_switch_invalid: Option<bool>,
242 target_surface_ventilation_status: Option<bool>,
243 target_ambient_temperature: Option<f32>,
244 target_ambient_humidity: Option<f32>,
245 target_heater_status: Option<bool>,
246 ) {
247 assert_eq!(self.water_temperature, target_water_temperature);
248 assert_eq!(
249 self.water_temperature_filtered,
250 target_water_temperature_filtered,
251 );
252 assert_eq!(self.ph, target_water_ph);
253 assert_eq!(self.ph_filtered, target_water_ph_filtered);
254 assert_eq!(self.conductivity, target_water_conductivity);
255 assert_eq!(
256 self.conductivity_filtered,
257 target_water_conductivity_filtered
258 );
259 assert_eq!(
260 self.conductivity_compensated,
261 target_water_conductivity_compensated
262 );
263 assert_eq!(self.refill_in_progress, target_refill_in_progress);
264 assert_eq!(
265 self.tank_level_switch_position,
266 target_tank_level_switch_position
267 );
268 assert_eq!(
269 self.tank_level_switch_position_stabilized,
270 target_tank_level_switch_position_stabilized
271 );
272 assert_eq!(
273 self.tank_level_switch_invalid,
274 target_tank_level_switch_invalid
275 );
276 assert_eq!(
277 self.surface_ventilation_status,
278 target_surface_ventilation_status
279 );
280 assert_eq!(self.ambient_temperature, target_ambient_temperature);
281 assert_eq!(self.ambient_humidity, target_ambient_humidity);
282 assert_eq!(self.heater_status, target_heater_status);
283 }
284}