Mercurial > public > ostc4
annotate Discovery/Src/tCCR.c @ 751:70e9c83ecf22
resolv merge
author | Ideenmodellierer |
---|---|
date | Mon, 13 Mar 2023 22:23:00 +0100 |
parents | dd5db6e2c9a4 |
children | 39ff186b6f98 |
rev | line source |
---|---|
38 | 1 /////////////////////////////////////////////////////////////////////////////// |
2 /// -*- coding: UTF-8 -*- | |
3 /// | |
4 /// \file Discovery/Src/tCCR.c | |
5 /// \brief HUD data via optical port | |
6 /// \author Heinrichs Weikamp gmbh | |
7 /// \date 18-Dec-2014 | |
8 /// | |
9 /// \details | |
10 /// | |
11 /// $Id$ | |
12 /////////////////////////////////////////////////////////////////////////////// | |
13 /// \par Copyright (c) 2014-2018 Heinrichs Weikamp gmbh | |
14 /// | |
15 /// This program is free software: you can redistribute it and/or modify | |
16 /// it under the terms of the GNU General Public License as published by | |
17 /// the Free Software Foundation, either version 3 of the License, or | |
18 /// (at your option) any later version. | |
19 /// | |
20 /// This program is distributed in the hope that it will be useful, | |
21 /// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
22 /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
23 /// GNU General Public License for more details. | |
24 /// | |
25 /// You should have received a copy of the GNU General Public License | |
26 /// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
27 ////////////////////////////////////////////////////////////////////////////// | |
28 | |
29 /* Includes ------------------------------------------------------------------*/ | |
30 #include <string.h> | |
31 #include "tCCR.h" | |
32 #include "ostc.h" | |
33 #include "data_central.h" | |
34 #include "data_exchange.h" | |
35 #include "check_warning.h" | |
446
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
36 #include "configuration.h" |
634 | 37 #include <math.h> |
38 | 38 |
39 /* Private types -------------------------------------------------------------*/ | |
40 typedef struct | |
41 { | |
42 uint8_t hud_firmwareVersion; | |
43 bit8_Type status_byte; | |
44 uint16_t sensor_voltage_100uV[3]; | |
45 uint8_t sensor_ppo2_cbar[3]; | |
46 uint8_t temp1; | |
47 uint16_t battery_voltage_mV; | |
48 uint16_t checksum; | |
49 } SIrLink; | |
50 | |
634 | 51 typedef enum |
52 { | |
53 sensorOK = 0, | |
54 sensorSuspect, | |
55 SensorOutOfBounds | |
56 } sensorTrustState_t; | |
57 | |
58 | |
322
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
59 #define HUD_BABBLING_IDIOT (30u) /* 30 Bytes received without break */ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
60 #define HUD_RX_FRAME_LENGTH (15u) /* Length of a HUD data frame */ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
61 #define HUD_RX_FRAME_BREAK_MS (100u) /* Time used to detect a gap between two byte receptions => frame start */ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
62 #define HUD_RX_START_DELAY_MS (500u) /* Delay for start of RX function to avoid start of reception while a transmission is ongoing. */ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
63 /* Based on an assumed cycle time by the sensor of 1 second. Started at time of last RX */ |
38 | 64 |
449
91a939915bfa
Added initialization of bottle sensor data age counter
ideenmodellierer
parents:
446
diff
changeset
|
65 #define BOTTLE_SENSOR_TIMEOUT (6000u) /* signal pressure budget as not received after 10 minutes (6000 * 100ms) */ |
91a939915bfa
Added initialization of bottle sensor data age counter
ideenmodellierer
parents:
446
diff
changeset
|
66 |
634 | 67 #define MAX_SENSOR_COMPARE_DEVIATION (0.15f) /* max deviation between two sensors allowed before their results are rated as suspect */ |
662 | 68 #define MAX_SENSOR_VOLTAGE_MV (250u) /* max allowed voltage value for a sensor measurement */ |
69 | |
70 #ifdef ENABLE_ALTERNATIVE_SENSORTYP | |
71 #define MIN_SENSOR_VOLTAGE_MV (3u) /* min allowed voltage value for a sensor measurement (Inspiration, Submatix, Sentinel Typ) */ | |
72 #else | |
73 #define MIN_SENSOR_VOLTAGE_MV (8u) /* min allowed voltage value for a sensor measurement (legacy OSTC TYP) */ | |
74 #endif | |
634 | 75 |
322
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
76 /* Private variables ---------------------------------------------------------*/ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
77 static SIrLink receiveHUD[2]; |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
78 static uint8_t boolHUDdata = 0; |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
79 static uint8_t data_old__lost_connection_to_HUD = 1; |
38 | 80 |
322
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
81 static uint8_t receiveHUDraw[16]; |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
82 |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
83 static uint8_t StartListeningToUART_HUD = 0; |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
84 static uint16_t HUDTimeoutCount = 0; |
655 | 85 static uint16_t ScrubberTimeoutCount = 0; |
322
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
86 |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
87 static __IO ITStatus UartReadyHUD = RESET; |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
88 static uint32_t LastReceivedTick_HUD = 0; |
38 | 89 |
90 /* Private variables with external access via get_xxx() function -------------*/ | |
91 | |
92 /* Private function prototypes -----------------------------------------------*/ | |
635 | 93 static uint8_t tCCR_fallbackToFixedSetpoint(void); |
38 | 94 |
95 #ifndef USART_IR_HUD | |
96 | |
97 void tCCR_init(void) | |
98 { | |
99 } | |
100 void tCCR_control(void) | |
101 { | |
102 } | |
103 void tCCR_test(void) | |
104 { | |
105 } | |
106 void tCCR_restart(void) | |
107 { | |
108 } | |
109 float get_ppO2Sensor_bar(uint8_t sensor_id) | |
110 { | |
111 } | |
112 float get_sensorVoltage_mV(uint8_t sensor_id) | |
113 { | |
114 } | |
115 float get_HUD_battery_voltage_V(void) | |
116 { | |
117 } | |
118 void tCCR_tick(void) | |
119 { | |
120 } | |
121 | |
122 #else | |
123 /* Exported functions --------------------------------------------------------*/ | |
124 | |
125 float get_ppO2Sensor_bar(uint8_t sensor_id) | |
126 { | |
127 if((sensor_id > 2) || data_old__lost_connection_to_HUD) | |
128 return 0; | |
129 | |
130 return (float)(receiveHUD[boolHUDdata].sensor_ppo2_cbar[sensor_id]) / 100.0f; | |
131 } | |
132 | |
133 float get_sensorVoltage_mV(uint8_t sensor_id) | |
134 { | |
135 if((sensor_id > 2) || data_old__lost_connection_to_HUD) | |
136 return 0; | |
137 | |
138 return (float)(receiveHUD[boolHUDdata].sensor_voltage_100uV[sensor_id]) / 10.0f; | |
139 } | |
140 | |
141 float get_HUD_battery_voltage_V(void) | |
142 { | |
143 if(data_old__lost_connection_to_HUD) | |
144 return 0; | |
145 | |
146 return (float)(receiveHUD[boolHUDdata].battery_voltage_mV) / 1000.0f; | |
147 } | |
148 | |
149 | |
563 | 150 void test_O2_sensor_values_outOfBounds(int8_t * outOfBouds1, int8_t * outOfBouds2, int8_t * outOfBouds3) |
38 | 151 { |
152 uint8_t sensorNotActiveBinary; | |
153 uint8_t sensorActive[3]; | |
634 | 154 sensorTrustState_t sensorState[3]; |
155 uint8_t index; | |
156 | |
38 | 157 |
158 // test1: user deactivation | |
159 sensorNotActiveBinary = stateUsed->diveSettings.ppo2sensors_deactivated; | |
160 | |
161 for(int i=0;i<3;i++) | |
162 sensorActive[i] = 1; | |
163 | |
164 if(sensorNotActiveBinary) | |
165 { | |
166 if(sensorNotActiveBinary & 1) | |
167 sensorActive[0] = 0; | |
168 | |
169 if(sensorNotActiveBinary & 2) | |
170 sensorActive[1] = 0; | |
171 | |
172 if(sensorNotActiveBinary & 4) | |
173 sensorActive[2] = 0; | |
174 } | |
175 | |
176 // test2: mV of remaining sensors | |
744 | 177 for(index=0; index<3; index++) |
38 | 178 { |
744 | 179 sensorState[index] = sensorOK; |
634 | 180 |
744 | 181 if(sensorActive[index]) |
38 | 182 { |
744 | 183 if(((stateUsed->lifeData.extIf_sensor_map[index] == SENSOR_DIGO2) && (((SSensorDataDiveO2*)(stateUsed->lifeData.extIf_sensor_data))->status & DVO2_FATAL_ERROR)) |
184 || ((stateUsed->lifeData.sensorVoltage_mV[index] < MIN_SENSOR_VOLTAGE_MV) || (stateUsed->lifeData.sensorVoltage_mV[index] > MAX_SENSOR_VOLTAGE_MV))) | |
185 { | |
186 sensorActive[index] = 0; | |
187 switch(index) | |
188 { | |
189 case 0: | |
190 sensorNotActiveBinary |= 1; | |
191 break; | |
192 case 1: | |
193 sensorNotActiveBinary |= 2; | |
194 break; | |
195 case 2: | |
196 sensorNotActiveBinary |= 4; | |
197 break; | |
198 } | |
199 } | |
38 | 200 } |
201 } | |
202 | |
203 *outOfBouds1 = 0; | |
204 *outOfBouds2 = 0; | |
205 *outOfBouds3 = 0; | |
206 | |
207 /* with two, one or no sensor, there is nothing to compare anymore | |
208 */ | |
209 if(sensorNotActiveBinary) | |
210 { | |
211 // set outOfBounds for both tests | |
212 if(!sensorActive[0]) | |
213 *outOfBouds1 = 1; | |
214 | |
215 if(!sensorActive[1]) | |
216 *outOfBouds2 = 1; | |
217 | |
218 if(!sensorActive[2]) | |
219 *outOfBouds3 = 1; | |
220 } | |
221 else | |
222 { | |
634 | 223 /* Check two or more of Three */ |
224 /* compare every sensor with each other. If there is only one mismatch the value might be OK. In case both comparisons fail the sensor is out of bounds */ | |
225 if(fabsf(stateUsed->lifeData.ppO2Sensor_bar[0] - stateUsed->lifeData.ppO2Sensor_bar[1]) > MAX_SENSOR_COMPARE_DEVIATION) | |
38 | 226 { |
634 | 227 sensorState[0]++; |
228 sensorState[1]++; | |
38 | 229 } |
634 | 230 if(fabsf(stateUsed->lifeData.ppO2Sensor_bar[0] - stateUsed->lifeData.ppO2Sensor_bar[2]) > MAX_SENSOR_COMPARE_DEVIATION) |
38 | 231 { |
634 | 232 sensorState[0]++; |
233 sensorState[2]++; | |
234 } | |
235 if(fabsf(stateUsed->lifeData.ppO2Sensor_bar[1] - stateUsed->lifeData.ppO2Sensor_bar[2]) > MAX_SENSOR_COMPARE_DEVIATION) | |
236 { | |
237 sensorState[1]++; | |
238 sensorState[2]++; | |
38 | 239 } |
634 | 240 for(index = 0; index < 3; index++) |
38 | 241 { |
634 | 242 if(sensorState[index] == SensorOutOfBounds) |
243 { | |
244 switch(index) | |
245 { | |
246 case 0: | |
247 *outOfBouds1 = 1; | |
248 break; | |
249 case 1: | |
250 *outOfBouds2 = 1; | |
251 break; | |
252 case 2: | |
253 *outOfBouds3 = 1; | |
254 break; | |
255 default: | |
256 break; | |
257 } | |
258 } | |
38 | 259 } |
260 } | |
261 } | |
262 | |
635 | 263 /* this function is called out of the 100ms callback => to be considered for debouncing */ |
38 | 264 uint8_t get_ppO2SensorWeightedResult_cbar(void) |
265 { | |
634 | 266 static uint8_t lastValidValue = 0; |
38 | 267 int8_t sensorOutOfBound[3]; |
268 uint16_t result = 0; | |
269 uint8_t count = 0; | |
582
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
563
diff
changeset
|
270 uint8_t retVal = 0; |
38 | 271 |
563 | 272 test_O2_sensor_values_outOfBounds(&sensorOutOfBound[0], &sensorOutOfBound[1], &sensorOutOfBound[2]); |
38 | 273 |
274 for(int i=0;i<3;i++) | |
275 { | |
276 if(!sensorOutOfBound[i]) | |
277 { | |
563 | 278 result += stateUsed->lifeData.ppO2Sensor_bar[i] * 100.0; /* convert centibar used by HUB */ |
38 | 279 count++; |
280 } | |
281 } | |
634 | 282 if(count == 0) /* all sensors out of bounds! => return last valid value as workaround till diver takes action */ |
582
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
563
diff
changeset
|
283 { |
635 | 284 if(debounce_warning_fallback(100)) |
285 { | |
286 set_warning_fallback(); | |
287 retVal = tCCR_fallbackToFixedSetpoint(); /* this function only changes setpoint if option is enabled */ | |
288 } | |
289 if(retVal == 0) | |
290 { | |
291 retVal = lastValidValue; | |
292 } | |
582
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
563
diff
changeset
|
293 } |
38 | 294 else |
582
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
563
diff
changeset
|
295 { |
635 | 296 reset_debounce_warning_fallback(); |
297 retVal = (uint8_t)(result / count); | |
298 lastValidValue = retVal; | |
582
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
563
diff
changeset
|
299 } |
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
563
diff
changeset
|
300 return retVal; |
38 | 301 } |
302 | |
303 | |
304 void tCCR_init(void) | |
305 { | |
449
91a939915bfa
Added initialization of bottle sensor data age counter
ideenmodellierer
parents:
446
diff
changeset
|
306 uint8_t loop; |
91a939915bfa
Added initialization of bottle sensor data age counter
ideenmodellierer
parents:
446
diff
changeset
|
307 |
38 | 308 StartListeningToUART_HUD = 1; |
449
91a939915bfa
Added initialization of bottle sensor data age counter
ideenmodellierer
parents:
446
diff
changeset
|
309 |
91a939915bfa
Added initialization of bottle sensor data age counter
ideenmodellierer
parents:
446
diff
changeset
|
310 SDiveState* pDiveData = stateRealGetPointerWrite(); |
91a939915bfa
Added initialization of bottle sensor data age counter
ideenmodellierer
parents:
446
diff
changeset
|
311 for(loop=0;loop<(2*NUM_GASES+1);loop++) |
91a939915bfa
Added initialization of bottle sensor data age counter
ideenmodellierer
parents:
446
diff
changeset
|
312 { |
91a939915bfa
Added initialization of bottle sensor data age counter
ideenmodellierer
parents:
446
diff
changeset
|
313 pDiveData->lifeData.bottle_bar_age_MilliSeconds[loop] = BOTTLE_SENSOR_TIMEOUT; |
91a939915bfa
Added initialization of bottle sensor data age counter
ideenmodellierer
parents:
446
diff
changeset
|
314 } |
38 | 315 } |
316 | |
317 | |
318 /* after 3 seconds without update from HUD | |
319 * data is considered old | |
320 */ | |
321 void tCCR_tick(void) | |
322 { | |
655 | 323 SSettings* pSettings = settingsGetPointer(); |
324 | |
325 if(pSettings->ppo2sensors_source == O2_SENSOR_SOURCE_OPTIC) | |
563 | 326 { |
327 if(HUDTimeoutCount < 3 * 10) | |
328 HUDTimeoutCount++; | |
329 else | |
330 { | |
331 data_old__lost_connection_to_HUD = 1; | |
332 if(HUDTimeoutCount < 20 * 10) | |
333 HUDTimeoutCount++; | |
334 else | |
335 tCCR_fallbackToFixedSetpoint(); | |
336 } | |
337 } | |
655 | 338 |
339 /* decrease scrubber timer only in real dive mode */ | |
710 | 340 if((pSettings->scrubTimerMode != SCRUB_TIMER_OFF) && (isLoopMode(pSettings->dive_mode)) && (stateUsed->mode == MODE_DIVE)) // && (stateUsed == stateRealGetPointer())) |
655 | 341 { |
342 ScrubberTimeoutCount++; | |
343 if(ScrubberTimeoutCount >= 600) /* resolution is minutes */ | |
344 { | |
345 ScrubberTimeoutCount = 0; | |
710 | 346 if(pSettings->scrubberData[pSettings->scubberActiveId].TimerCur > 0) |
655 | 347 { |
710 | 348 pSettings->scrubberData[pSettings->scubberActiveId].TimerCur--; |
655 | 349 } |
710 | 350 translateDate(stateUsed->lifeData.dateBinaryFormat, &pSettings->scrubberData[pSettings->scubberActiveId].lastDive); |
655 | 351 } |
352 } | |
38 | 353 } |
354 | |
322
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
355 void tCCR_SetRXIndication(void) |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
356 { |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
357 static uint8_t floatingRXCount = 0; |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
358 |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
359 if((UartIR_HUD_Handle.RxXferSize == HUD_RX_FRAME_LENGTH) || (UartIR_HUD_Handle.RxXferSize == HUD_RX_FRAME_LENGTH - 1)) /* we expected a complete frame */ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
360 { |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
361 UartReadyHUD = SET; |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
362 LastReceivedTick_HUD = HAL_GetTick(); |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
363 floatingRXCount = 0; |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
364 } |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
365 else /* follow up of error handling */ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
366 { |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
367 if(time_elapsed_ms(LastReceivedTick_HUD, HAL_GetTick()) > HUD_RX_FRAME_BREAK_MS) /* Reception took a while => frame start detected */ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
368 { |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
369 HAL_UART_Receive_IT(&UartIR_HUD_Handle, &receiveHUDraw[1], 14); /* We have already the first byte => get the missing 14 */ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
370 } |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
371 else |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
372 { |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
373 if(floatingRXCount++ < HUD_BABBLING_IDIOT) |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
374 { |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
375 HAL_UART_Receive_IT(&UartIR_HUD_Handle, receiveHUDraw, 1); /* Start polling of incoming bytes */ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
376 } |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
377 else /* Significant amount of data comming in without break => disable input */ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
378 { /* by not reactivation HUD RX, no recovery fromthis state */ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
379 stateUsedWrite->diveSettings.ppo2sensors_deactivated = 0x07; /* Display deactivation */ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
380 } |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
381 } |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
382 } |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
383 |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
384 } |
38 | 385 |
386 void tCCR_restart(void) | |
387 { | |
322
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
388 HAL_UART_AbortReceive_IT(&UartIR_HUD_Handle); /* Called by the error handler. RX will be restarted by control function */ |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
389 StartListeningToUART_HUD = 1; |
38 | 390 } |
391 | |
392 | |
393 void tCCR_control(void) | |
394 { | |
446
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
395 uint16_t checksum = 0; |
457 | 396 #ifdef ENABLE_BOTTLE_SENSOR |
446
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
397 SDiveState *pLivedata = stateRealGetPointerWrite(); |
457 | 398 #endif |
322
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
399 |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
400 if((UartReadyHUD == RESET) && StartListeningToUART_HUD && (time_elapsed_ms(LastReceivedTick_HUD, HAL_GetTick()) > HUD_RX_START_DELAY_MS)) |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
401 { |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
402 StartListeningToUART_HUD = 0; |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
403 HAL_UART_Receive_IT(&UartIR_HUD_Handle, receiveHUDraw, HUD_RX_FRAME_LENGTH); |
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
404 } |
38 | 405 |
406 if(UartReadyHUD == SET) | |
407 { | |
408 UartReadyHUD = RESET; | |
322
31e471d60797
Added start of frame detection for HUD data
ideenmodellierer
parents:
272
diff
changeset
|
409 StartListeningToUART_HUD = 1; |
38 | 410 |
446
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
411 /* check if received package is valid */ |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
412 for(int i=0;i<13;i++) |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
413 { |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
414 checksum += receiveHUDraw[i]; |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
415 } |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
416 receiveHUD[!boolHUDdata].checksum = receiveHUDraw[13] + (256 * receiveHUDraw[14]); |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
417 if(checksum == receiveHUD[!boolHUDdata].checksum) |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
418 { |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
419 #ifdef ENABLE_BOTTLE_SENSOR |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
420 if(receiveHUDraw[0] == 0xA5) /* code for pressure sensor */ |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
421 { |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
422 pLivedata->lifeData.bottle_bar[pLivedata->lifeData.actualGas.GasIdInSettings] = receiveHUDraw[10]; |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
423 pLivedata->lifeData.bottle_bar_age_MilliSeconds[pLivedata->lifeData.actualGas.GasIdInSettings] = 0; |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
424 } |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
425 else |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
426 #endif |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
427 /* handle O2 sensor data */ |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
428 { |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
429 memcpy(&receiveHUD[!boolHUDdata], receiveHUDraw, 11); |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
430 receiveHUD[!boolHUDdata].battery_voltage_mV = receiveHUDraw[11] + (256 * receiveHUDraw[12]); |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
431 } |
38 | 432 |
446
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
433 boolHUDdata = !boolHUDdata; |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
434 HUDTimeoutCount = 0; |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
435 data_old__lost_connection_to_HUD = 0; |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
436 } |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
437 else |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
438 { |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
439 if(data_old__lost_connection_to_HUD) /* we lost connection, maybe due to RX shift => start single byte read to resynchronize */ |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
440 { |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
441 HAL_UART_Receive_IT(&UartIR_HUD_Handle, receiveHUDraw, 1); |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
442 StartListeningToUART_HUD = 0; |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
443 } |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
444 } |
f1257a32f2d4
Introduced configuration header for variant managment:
ideenmodellierer
parents:
322
diff
changeset
|
445 memset(receiveHUDraw,0,sizeof(receiveHUDraw)); |
38 | 446 } |
447 } | |
448 | |
449 #endif | |
450 /* Private functions ---------------------------------------------------------*/ | |
451 | |
635 | 452 static uint8_t tCCR_fallbackToFixedSetpoint(void) |
38 | 453 { |
635 | 454 uint8_t retVal = 0; |
662 | 455 uint8_t setpointCbar, actualGasID; |
38 | 456 |
662 | 457 if((stateUsed->mode == MODE_DIVE) && (stateUsed->diveSettings.CCR_Mode == CCRMODE_Sensors) && (stateUsed->diveSettings.fallbackOption)) |
458 { | |
459 if(stateUsed->diveSettings.diveMode == DIVEMODE_CCR) | |
460 { | |
461 setpointCbar = stateUsed->diveSettings.setpoint[1].setpoint_cbar; | |
462 stateUsedWrite->diveSettings.CCR_Mode = CCRMODE_FixedSetpoint; | |
463 } | |
464 else | |
465 { | |
466 setpointCbar = stateUsed->lifeData.ppo2Simulated_bar * 100; | |
467 stateUsedWrite->diveSettings.CCR_Mode = CCRMODE_Simulation; | |
468 } | |
469 actualGasID = stateUsed->lifeData.actualGas.GasIdInSettings; | |
470 setActualGas_DM(&stateUsedWrite->lifeData,actualGasID,setpointCbar); | |
38 | 471 |
662 | 472 set_warning_fallback(); |
473 retVal = setpointCbar; | |
38 | 474 } |
635 | 475 return retVal; |
38 | 476 } |