Mercurial > public > ostc4
annotate Discovery/Src/data_exchange_main.c @ 250:822416168585 bm-2
Buelmann: new implementation for ceiling
Since my first functional fix in the ceiling computation in
commit ceecabfddb57, I noticed that the computation used a
linear search, that became rather computational expensive after
that commit. The simple question is: why not a binary search?
So, this commit implements the binary search. But there is a long
story attached to this. Comparing ceiling results from hwOS and this
OSTC4 code were very different. Basically, the original OSTC4
algorithm computed the ceiling using the same GFlow to GFhigh
slope, in such a way, that the ceiling was in sync with the
presented deco stops, where the hwOS code presents a GFhigh
based ceiling.
This said, it is more logical when the OSTC4 and hwOS code give
similar results. This new recursive algorithm gives very similar
results for the ceiling compared to hwOS.
To be complete here, the Buelmann ceiling is the depth to which
you can ascend, so that the leading tissue reaches GFhigh. This
also explains why the deepest deco stop is normally deeper than
the ceiling (unless one dives with GF like 80/80).
The code implemented here is rather straightforward recursion.
Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
author | Jan Mulder <jlmulder@xs4all.nl> |
---|---|
date | Thu, 11 Apr 2019 17:48:48 +0200 |
parents | f0069f002c55 |
children | 2e58a4094770 189387bf23a8 |
rev | line source |
---|---|
38 | 1 /** |
2 ****************************************************************************** | |
3 * @file data_exchange_main.c | |
4 * @author heinrichs weikamp gmbh | |
5 * @date 13-Oct-2014 | |
6 * @version V0.0.3 | |
7 * @since 17-Feb-2016 | |
8 | |
9 * @brief Communication with the second CPU == RTE system | |
10 * | |
11 @verbatim | |
12 ============================================================================== | |
13 ##### Version Changes ##### | |
14 ============================================================================== | |
15 160217 V0.0.3 pStateUsed->decolistXXXXX.tickstamp = HAL_GetTick(); added | |
16 150627 V0.0.2 | |
17 | |
18 ============================================================================== | |
19 ##### How to use ##### | |
20 ============================================================================== | |
21 | |
22 ============================================================================== | |
23 ##### Button, Set Time, Clear Deco etc Request ##### | |
24 ============================================================================== | |
25 was updated (151207) for buttons and clear deco at the moment only | |
26 using requestNecessary and checking in DataEX_copy_to_LifeData() | |
27 Hence if there is no confirm from the smallCPU on the data after the request | |
28 the request will be send again. | |
29 | |
30 ============================================================================== | |
31 ##### Device Data ##### | |
32 ============================================================================== | |
33 | |
34 main CPU always sends the device data info that it has at the moment | |
35 | |
36 on start it is INT32_MIN, INT32_MAX and 0 | |
37 as initialized in data_central.c variable declaration | |
38 | |
39 second small CPU gets request to send its device data | |
40 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
41 on reception the data is merged with the data in externLogbookFlash, |
38 | 42 stored on the externLogbookFlash and from now on send to small CPU |
43 | |
44 ============================================================================== | |
45 ##### Magnet Reset ##### | |
46 ============================================================================== | |
47 | |
48 @endverbatim | |
49 ****************************************************************************** | |
50 * @attention | |
51 * | |
52 * <h2><center>© COPYRIGHT(c) 2014 heinrichs weikamp</center></h2> | |
53 * | |
54 ****************************************************************************** | |
55 */ | |
56 | |
57 /* Includes ------------------------------------------------------------------*/ | |
133
acc98f5bd8c4
Intoduced transfer abort function for data exchange recovery
Ideenmodellierer
parents:
115
diff
changeset
|
58 #include <stdlib.h> |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
59 #include <string.h> // for memcpy |
38 | 60 #include "stm32f4xx_hal.h" |
61 #include "stdio.h" | |
62 #include "ostc.h" | |
63 #include "settings.h" | |
64 #include "data_central.h" | |
65 #include "data_exchange_main.h" | |
66 #include "base.h" | |
67 #include "decom.h" | |
68 #include "calc_crush.h" /* for vpm_init */ | |
69 #include "simulation.h" | |
70 #include "tCCR.h" | |
71 #include "timer.h" | |
72 #include "buehlmann.h" | |
73 #include "externLogbookFlash.h" | |
74 | |
75 | |
173
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
76 /* Exported variables --------------------------------------------------------*/ |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
77 static uint8_t wasPowerOn = 0; |
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
78 static confirmbit8_Type requestNecessary = { .uw = 0 }; |
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
79 static uint8_t wasUpdateNotPowerOn = 0; |
38 | 80 |
81 /* Private variables with external access ------------------------------------*/ | |
82 | |
83 /* Private variables ---------------------------------------------------------*/ | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
84 static uint8_t told_reset_logik_alles_ok = 0; |
38 | 85 |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
86 static SDataReceiveFromMaster dataOut; |
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
87 static SDataExchangeSlaveToMaster dataIn; |
38 | 88 |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
89 static uint8_t data_old__lost_connection_to_slave_counter_temp = 0; |
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
90 static uint8_t data_old__lost_connection_to_slave_counter_retry = 0; |
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
91 static uint32_t data_old__lost_connection_to_slave_counter_total = 0; |
38 | 92 |
93 /* Private types -------------------------------------------------------------*/ | |
94 | |
95 /* Private function prototypes -----------------------------------------------*/ | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
96 static uint8_t DataEX_check_header_and_footer_ok(void); |
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
97 static uint8_t DataEX_check_header_and_footer_shifted(void); |
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
98 static uint8_t DataEX_check_header_and_footer_devicedata(void); |
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
99 static void DataEX_check_DeviceData(void); |
38 | 100 |
101 /* Exported functions --------------------------------------------------------*/ | |
102 | |
103 uint8_t DataEX_was_power_on(void) | |
104 { | |
105 return wasPowerOn; | |
106 } | |
107 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
108 static uint8_t count_DataEX_Error_Handler = 0; |
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
109 static uint8_t last_error_DataEX_Error_Handler = 0; |
38 | 110 |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
111 static void DataEX_Error_Handler(uint8_t answer) |
38 | 112 { |
113 count_DataEX_Error_Handler++; | |
114 last_error_DataEX_Error_Handler = answer; | |
133
acc98f5bd8c4
Intoduced transfer abort function for data exchange recovery
Ideenmodellierer
parents:
115
diff
changeset
|
115 |
156
1fbdb45db701
Removed special indicator for DMA transfer error
Ideenmodellierer
parents:
154
diff
changeset
|
116 /* A wrong footer indicates a communication interrupt. State machine is waiting for new data which is not received because no new transmission is triggered */ |
133
acc98f5bd8c4
Intoduced transfer abort function for data exchange recovery
Ideenmodellierer
parents:
115
diff
changeset
|
117 /* ==> Abort data exchange to enable a new RX / TX cycle */ |
acc98f5bd8c4
Intoduced transfer abort function for data exchange recovery
Ideenmodellierer
parents:
115
diff
changeset
|
118 if(answer == HAL_BUSY) |
acc98f5bd8c4
Intoduced transfer abort function for data exchange recovery
Ideenmodellierer
parents:
115
diff
changeset
|
119 { |
acc98f5bd8c4
Intoduced transfer abort function for data exchange recovery
Ideenmodellierer
parents:
115
diff
changeset
|
120 HAL_SPI_Abort_IT(&cpu2DmaSpi); |
acc98f5bd8c4
Intoduced transfer abort function for data exchange recovery
Ideenmodellierer
parents:
115
diff
changeset
|
121 } |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
122 |
38 | 123 return; |
124 } | |
125 | |
126 | |
127 uint32_t DataEX_lost_connection_count(void) | |
128 { | |
129 return data_old__lost_connection_to_slave_counter_total; | |
130 } | |
131 | |
132 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
133 SDataReceiveFromMaster *dataOutGetPointer(void) |
38 | 134 { |
135 return &dataOut; | |
136 } | |
137 | |
138 void DataEX_init(void) | |
139 { | |
140 SDiveState * pStateReal = stateRealGetPointerWrite(); | |
99 | 141 pStateReal->data_old__lost_connection_to_slave = 0; //initial value |
38 | 142 data_old__lost_connection_to_slave_counter_temp = 0; |
143 data_old__lost_connection_to_slave_counter_total = 0; | |
144 | |
145 memset((void *)&dataOut, 0, sizeof(SDataReceiveFromMaster)); | |
146 | |
147 dataOut.header.checkCode[0] = 0xBB; | |
208 | 148 dataOut.header.checkCode[1] = SPI_RX_STATE_OK; |
149 dataOut.header.checkCode[2] = SPI_RX_STATE_OK; | |
38 | 150 dataOut.header.checkCode[3] = 0xBB; |
151 | |
152 dataOut.footer.checkCode[0] = 0xF4; | |
153 dataOut.footer.checkCode[1] = 0xF3; | |
154 dataOut.footer.checkCode[2] = 0xF2; | |
155 dataOut.footer.checkCode[3] = 0xF1; | |
156 } | |
157 | |
158 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
159 static void DataEx_call_helper_requests(void) |
38 | 160 { |
161 static uint8_t setDateWasSend = 0; | |
162 static uint8_t setTimeWasSend = 0; | |
163 static uint8_t calibrateCompassWasSend = 0; | |
164 static uint8_t setButtonSensitivityWasSend = 0; | |
165 static uint8_t clearDecoWasSend = 0; | |
166 static uint8_t getDeviceDataWasSend = 0; | |
167 static uint8_t setAccidentFlagWasSend = 0; | |
168 static uint8_t setEndDiveWasSend = 0; | |
169 | |
170 if(getDeviceDataWasSend) | |
171 { | |
172 dataOut.getDeviceDataNow = 0; | |
173 requestNecessary.ub.devicedata = 1; | |
174 } | |
175 getDeviceDataWasSend = 0; | |
176 if(dataOut.getDeviceDataNow) | |
177 { | |
178 getDeviceDataWasSend = 1; | |
179 } | |
180 | |
181 if(setEndDiveWasSend) | |
182 { | |
183 dataOut.setEndDive = 0; | |
184 //requestNecessary.ub.XXX = 1; not implemented and no space here | |
185 } | |
186 setEndDiveWasSend = 0; | |
187 if(dataOut.setEndDive) | |
188 { | |
189 setEndDiveWasSend = 1; | |
190 } | |
191 | |
192 if(setAccidentFlagWasSend) | |
193 { | |
194 dataOut.setAccidentFlag = 0; | |
195 requestNecessary.ub.accident = 1; | |
196 } | |
197 setAccidentFlagWasSend = 0; | |
198 if(dataOut.setAccidentFlag) | |
199 { | |
200 setAccidentFlagWasSend = 1; | |
201 } | |
202 | |
203 if(setDateWasSend) | |
204 { | |
205 dataOut.setDateNow = 0; | |
206 requestNecessary.ub.date = 1; | |
207 } | |
208 setDateWasSend = 0; | |
209 if(dataOut.setDateNow) | |
210 { | |
211 setDateWasSend = 1; | |
212 } | |
213 | |
214 if(setTimeWasSend) | |
215 { | |
216 dataOut.setTimeNow = 0; | |
217 requestNecessary.ub.time = 1; | |
218 } | |
219 setTimeWasSend = 0; | |
220 if(dataOut.setTimeNow) | |
221 { | |
222 setTimeWasSend = 1; | |
223 } | |
224 | |
225 if(calibrateCompassWasSend) | |
226 { | |
227 dataOut.calibrateCompassNow = 0; | |
228 requestNecessary.ub.compass = 1; | |
229 } | |
230 calibrateCompassWasSend = 0; | |
231 if(dataOut.calibrateCompassNow) | |
232 { | |
233 calibrateCompassWasSend = 1; | |
234 } | |
235 | |
236 if(clearDecoWasSend) | |
237 { | |
238 dataOut.clearDecoNow = 0; | |
239 requestNecessary.ub.clearDeco = 1; | |
240 } | |
241 if(dataOut.clearDecoNow) | |
242 { | |
243 clearDecoWasSend = 1; | |
244 } | |
245 | |
246 if(setButtonSensitivityWasSend) | |
247 { | |
248 dataOut.setButtonSensitivityNow = 0; | |
249 requestNecessary.ub.button = 1; | |
250 } | |
251 setButtonSensitivityWasSend = 0; | |
252 if(dataOut.setButtonSensitivityNow) | |
253 { | |
254 setButtonSensitivityWasSend = 1; | |
255 } | |
256 } | |
257 | |
258 | |
259 uint8_t DataEX_call(void) | |
260 { | |
208 | 261 static uint32_t RTEOfflineCnt = 0; |
262 static uint8_t SusppressCom = 0; | |
263 | |
38 | 264 uint8_t SPI_DMA_answer = 0; |
141 | 265 |
208 | 266 if(SusppressCom) |
38 | 267 { |
208 | 268 SusppressCom--; |
38 | 269 } |
149 | 270 else |
271 { | |
208 | 272 if(data_old__lost_connection_to_slave_counter_temp >= 2) /* error reaction is triggered whenever communication could not be reestablishen within two cycles */ |
273 { | |
274 data_old__lost_connection_to_slave_counter_temp = 0; | |
275 if(DataEX_check_header_and_footer_shifted()) | |
276 { | |
277 if(RTEOfflineCnt > 1) /* RTE restarted communication after a longer silent time => restart error handling to recover */ | |
278 { | |
279 data_old__lost_connection_to_slave_counter_retry = 0; | |
280 RTEOfflineCnt = 0; | |
281 } | |
38 | 282 |
208 | 283 /* We received shifted data. Step one. Reset DMA to see if the problem is located at main */ |
284 if (data_old__lost_connection_to_slave_counter_retry == 0) | |
285 { | |
286 HAL_SPI_Abort_IT(&cpu2DmaSpi); | |
287 } | |
288 /* reset of own DMA does not work ==> request reset of slave dma by indicating shifted receiption */ | |
289 if (data_old__lost_connection_to_slave_counter_retry == 1) | |
290 { | |
291 dataOut.header.checkCode[SPI_HEADER_INDEX_RX_STATE] = SPI_RX_STATE_SHIFTED; | |
292 } | |
293 | |
294 /* stop communication with RTE to trigger RTE timeout reaction */ | |
295 if (data_old__lost_connection_to_slave_counter_retry == 2) | |
296 { | |
297 SusppressCom = 3; | |
298 } | |
38 | 299 |
208 | 300 data_old__lost_connection_to_slave_counter_retry++; |
301 } | |
302 else | |
303 { | |
304 RTEOfflineCnt++; /* based on footer status the RTE does not seem to provide data in time */ | |
305 dataOut.header.checkCode[SPI_HEADER_INDEX_RX_STATE] = SPI_RX_STATE_OFFLINE; | |
306 } | |
307 } | |
308 #if USE_OLD_SYNC_METHOD | |
309 /* one cycle with NotChipSelect true to clear slave spi buffer */ | |
310 else | |
311 { | |
312 HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_RESET); | |
313 } | |
314 #endif | |
133
acc98f5bd8c4
Intoduced transfer abort function for data exchange recovery
Ideenmodellierer
parents:
115
diff
changeset
|
315 |
208 | 316 DataEx_call_helper_requests(); |
317 | |
318 //HAL_GPIO_WritePin(OSCILLOSCOPE2_GPIO_PORT,OSCILLOSCOPE2_PIN,GPIO_PIN_RESET); /* only for testing with Oscilloscope */ | |
319 | |
320 if(SusppressCom == 0) | |
321 { | |
322 HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_RESET); | |
323 | |
324 SPI_DMA_answer = HAL_SPI_TransmitReceive_DMA(&cpu2DmaSpi, (uint8_t *)&dataOut, (uint8_t *)&dataIn, EXCHANGE_BUFFERSIZE); | |
325 if(SPI_DMA_answer != HAL_OK) | |
326 { | |
327 DataEX_Error_Handler(SPI_DMA_answer); | |
328 } | |
329 } | |
330 } | |
104 | 331 // HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_SET); |
38 | 332 //HAL_Delay(3); |
333 //HAL_GPIO_WritePin(OSCILLOSCOPE2_GPIO_PORT,OSCILLOSCOPE2_PIN,GPIO_PIN_SET); /* only for testing with Oscilloscope */ | |
334 | |
335 return 1; | |
336 } | |
337 | |
82 | 338 |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
339 static uint32_t SPI_CALLBACKS; |
82 | 340 uint32_t get_num_SPI_CALLBACKS(void){ |
341 return SPI_CALLBACKS; | |
342 } | |
343 | |
344 SDataExchangeSlaveToMaster* get_dataInPointer(void){ | |
345 return &dataIn; | |
346 } | |
347 | |
348 void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) | |
349 { | |
350 if(hspi == &cpu2DmaSpi) | |
351 { | |
154 | 352 HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_SET); |
82 | 353 SPI_CALLBACKS+=1; |
354 } | |
355 } | |
356 | |
357 | |
38 | 358 void DateEx_copy_to_dataOut(void) |
359 { | |
360 const SDiveState * pStateReal = stateRealGetPointer(); | |
361 SSettings *settings = settingsGetPointer(); | |
362 | |
363 if(get_globalState() == StStop) | |
364 dataOut.mode = MODE_SHUTDOWN; | |
365 else | |
366 dataOut.mode = 0; | |
367 | |
368 dataOut.diveModeInfo = pStateReal->diveSettings.diveMode; // hw 170215 | |
369 | |
370 memcpy(&dataOut.data.DeviceData, stateDeviceGetPointer(), sizeof(SDevice)); | |
371 | |
372 dataOut.data.VPMconservatism = pStateReal->diveSettings.vpm_conservatism; | |
373 dataOut.data.actualGas = pStateReal->lifeData.actualGas; | |
374 dataOut.data.ambient_pressure_mbar_ceiling = (pStateReal->decolistBuehlmann.output_ceiling_meter * 100) + (pStateReal->lifeData.pressure_surface_bar * 1000); | |
375 dataOut.data.divetimeToCreateLogbook = settings->divetimeToCreateLogbook; | |
376 dataOut.data.timeoutDiveReachedZeroDepth = settings->timeoutDiveReachedZeroDepth; | |
377 | |
378 dataOut.data.offsetPressureSensor_mbar = settings->offsetPressure_mbar; | |
379 dataOut.data.offsetTemperatureSensor_centiDegree = settings->offsetTemperature_centigrad; | |
380 | |
381 if((hardwareDataGetPointer()->primarySerial <= 32) || (((hardwareDataGetPointer()->primarySerial == 72) && (hardwareDataGetPointer()->secondarySerial == 15)))) | |
382 { | |
383 dataOut.revisionHardware = 0x00; | |
384 dataOut.revisionCRCx0x7A = 0x7A; | |
385 } | |
386 else | |
387 if(hardwareDataGetPointer()->primarySerial < 0xFFFF) | |
388 { | |
389 dataOut.revisionHardware = hardwareDataGetPointer()->revision8bit; | |
390 dataOut.revisionCRCx0x7A = hardwareDataGetPointer()->revision8bit ^ 0x7A; | |
391 } | |
392 else | |
393 { | |
394 dataOut.revisionHardware = 0xFF; | |
395 dataOut.revisionCRCx0x7A = 0xFF; | |
396 } | |
397 | |
398 if(DataEX_check_header_and_footer_ok() && !told_reset_logik_alles_ok) | |
399 { | |
400 MX_tell_reset_logik_alles_ok(); | |
401 told_reset_logik_alles_ok = 1; | |
402 } | |
403 | |
404 if(DataEX_check_header_and_footer_ok() && (dataIn.power_on_reset == 1)) | |
405 { | |
406 if(!wasUpdateNotPowerOn) | |
407 wasPowerOn = 1; | |
408 | |
409 settingsHelperButtonSens_keepPercentageValues(settingsGetPointerStandard()->ButtonResponsiveness[3], settings->ButtonResponsiveness); | |
410 setButtonResponsiveness(settings->ButtonResponsiveness); | |
411 | |
412 // hw 160720 new lastKnownBatteryPercentage | |
413 if(!wasUpdateNotPowerOn) | |
414 { | |
415 // dataOut.data.newBatteryGaugePercentageFloat = settingsGetPointer()->lastKnownBatteryPercentage; | |
416 dataOut.data.newBatteryGaugePercentageFloat = 0; | |
417 dataOut.setBatteryGaugeNow = 1; | |
418 } | |
419 } | |
420 } | |
421 | |
422 | |
423 void DataEX_copy_to_deco(void) | |
424 { | |
425 SDiveState * pStateUsed; | |
426 if(decoLock == DECO_CALC_running) | |
427 return; | |
428 if(stateUsed == stateRealGetPointer()) | |
429 pStateUsed = stateRealGetPointerWrite(); | |
90 | 430 else{ |
38 | 431 pStateUsed = stateSimGetPointerWrite(); |
90 | 432 } |
38 | 433 |
434 if(decoLock == DECO_CALC_init_as_is_start_of_dive) | |
435 { | |
436 vpm_init(&pStateUsed->vpm, pStateUsed->diveSettings.vpm_conservatism, 0, 0); | |
437 buehlmann_init(); | |
438 timer_init(); | |
439 resetEvents(); | |
440 pStateUsed->diveSettings.internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero = 0; | |
441 /* | |
442 * ToDo by Peter | |
443 * copy VPM stuff etc. pp. | |
444 * was void initDiveState(SDiveSettings * pDiveSettings, SVpm * pVpm); | |
445 */ | |
446 } | |
447 | |
448 if(decoLock == DECO_CALC_FINSHED_Buehlmann) | |
449 { | |
450 | |
451 } | |
452 switch(decoLock) | |
453 { | |
454 | |
455 //Deco_calculation finished | |
456 case DECO_CALC_FINSHED_vpm: | |
457 memcpy(&pStateUsed->decolistVPM,&stateDeco.decolistVPM,sizeof(SDecoinfo)); | |
458 pStateUsed->decolistVPM.tickstamp = HAL_GetTick(); | |
459 pStateUsed->vpm.deco_zone_reached = stateDeco.vpm.deco_zone_reached; | |
460 for(int i = 0; i< 16; i++) | |
461 { | |
462 pStateUsed->vpm.adjusted_critical_radius_he[i] = stateDeco.vpm.adjusted_critical_radius_he[i]; | |
463 pStateUsed->vpm.adjusted_critical_radius_n2[i] = stateDeco.vpm.adjusted_critical_radius_n2[i]; | |
464 pStateUsed->vpm.adjusted_crushing_pressure_he[i] = stateDeco.vpm.adjusted_crushing_pressure_he[i]; | |
465 pStateUsed->vpm.adjusted_crushing_pressure_n2[i] = stateDeco.vpm.adjusted_crushing_pressure_n2[i]; | |
466 pStateUsed->vpm.initial_allowable_gradient_he[i] = stateDeco.vpm.initial_allowable_gradient_he[i]; | |
467 pStateUsed->vpm.initial_allowable_gradient_n2[i] = stateDeco.vpm.initial_allowable_gradient_n2[i]; | |
468 pStateUsed->vpm.max_actual_gradient[i] = stateDeco.vpm.max_actual_gradient[i]; | |
469 } | |
470 break; | |
471 case DECO_CALC_FINSHED_Buehlmann: | |
472 memcpy(&pStateUsed->decolistBuehlmann,&stateDeco.decolistBuehlmann,sizeof(SDecoinfo)); | |
473 pStateUsed->decolistBuehlmann.tickstamp = HAL_GetTick(); | |
474 //Copy Data to be stored if regular Buehlmann, not FutureBuehlmann | |
475 pStateUsed->diveSettings.internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero = stateDeco.diveSettings.internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero; | |
476 break; | |
477 case DECO_CALC_FINSHED_FutureBuehlmann: | |
478 memcpy(&pStateUsed->decolistFutureBuehlmann,&stateDeco.decolistFutureBuehlmann,sizeof(SDecoinfo)); | |
479 pStateUsed->decolistFutureBuehlmann.tickstamp = HAL_GetTick(); | |
480 break; | |
481 case DECO_CALC_FINSHED_Futurevpm: | |
482 memcpy(&pStateUsed->decolistFutureVPM,&stateDeco.decolistFutureVPM,sizeof(SDecoinfo)); | |
483 pStateUsed->decolistFutureVPM.tickstamp = HAL_GetTick(); | |
484 break; | |
485 } | |
486 | |
487 //Copy Inputdata from stateReal to stateDeco | |
488 memcpy(&stateDeco.lifeData,&pStateUsed->lifeData,sizeof(SLifeData)); | |
489 memcpy(&stateDeco.diveSettings,&pStateUsed->diveSettings,sizeof(SDiveSettings)); | |
490 | |
491 stateDeco.vpm.deco_zone_reached = pStateUsed->vpm.deco_zone_reached; | |
492 // memcpy(&stateDeco.vpm,&pStateUsed->vpm,sizeof(SVpm)); | |
493 for(int i = 0; i< 16; i++) | |
494 { | |
495 stateDeco.vpm.max_crushing_pressure_he[i] = pStateUsed->vpm.max_crushing_pressure_he[i]; | |
496 stateDeco.vpm.max_crushing_pressure_n2[i] = pStateUsed->vpm.max_crushing_pressure_n2[i]; | |
497 stateDeco.vpm.adjusted_critical_radius_he[i] = pStateUsed->vpm.adjusted_critical_radius_he[i]; | |
498 stateDeco.vpm.adjusted_critical_radius_n2[i] = pStateUsed->vpm.adjusted_critical_radius_n2[i]; | |
499 } | |
500 decoLock = DECO_CALC_ready; | |
501 } | |
502 | |
503 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
504 static void DataEX_helper_copy_deviceData(SDeviceLine *lineWrite, const SDeviceLine *lineRead) |
38 | 505 { |
506 lineWrite->date_rtc_dr = lineRead->date_rtc_dr; | |
507 lineWrite->time_rtc_tr = lineRead->time_rtc_tr; | |
508 lineWrite->value_int32 = lineRead->value_int32; | |
509 } | |
510 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
511 static void DataEX_helper_SetTime(RTC_TimeTypeDef inStimestructure, uint32_t *outTimetmpreg) |
38 | 512 { |
513 inStimestructure.TimeFormat = RTC_HOURFORMAT_24; | |
514 | |
515 *outTimetmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(inStimestructure.Hours) << 16U) | \ | |
516 ((uint32_t)RTC_ByteToBcd2(inStimestructure.Minutes) << 8U) | \ | |
517 ((uint32_t)RTC_ByteToBcd2(inStimestructure.Seconds)) | \ | |
518 (((uint32_t)inStimestructure.TimeFormat) << 16U)); | |
519 } | |
520 | |
521 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
522 static void DataEX_helper_SetDate(RTC_DateTypeDef inSdatestructure, uint32_t *outDatetmpreg) |
38 | 523 { |
524 *outDatetmpreg = (((uint32_t)RTC_ByteToBcd2(inSdatestructure.Year) << 16U) | \ | |
525 ((uint32_t)RTC_ByteToBcd2(inSdatestructure.Month) << 8U) | \ | |
526 ((uint32_t)RTC_ByteToBcd2(inSdatestructure.Date)) | \ | |
527 ((uint32_t)inSdatestructure.WeekDay << 13U)); | |
528 } | |
529 | |
530 | |
531 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
532 static void DataEX_helper_set_Unknown_Date_deviceData(SDeviceLine *lineWrite) |
38 | 533 { |
534 RTC_DateTypeDef sdatestructure; | |
535 RTC_TimeTypeDef stimestructure; | |
536 | |
537 stimestructure.Hours = 1; | |
538 stimestructure.Minutes = 0; | |
539 stimestructure.Seconds = 0; | |
540 | |
541 sdatestructure.Date = 1; | |
542 sdatestructure.Month = 1; | |
543 sdatestructure.Year = 16; | |
544 setWeekday(&sdatestructure); | |
545 | |
546 DataEX_helper_SetTime(stimestructure, &lineWrite->time_rtc_tr); | |
547 DataEX_helper_SetDate(sdatestructure, &lineWrite->date_rtc_dr); | |
548 } | |
549 | |
550 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
551 static uint8_t DataEX_helper_Check_And_Correct_Date_deviceData(SDeviceLine *lineWrite) |
38 | 552 { |
553 RTC_DateTypeDef sdatestructure; | |
554 RTC_TimeTypeDef stimestructure; | |
555 | |
556 // from lineWrite to structure | |
557 translateDate(lineWrite->date_rtc_dr, &sdatestructure); | |
558 translateTime(lineWrite->time_rtc_tr, &stimestructure); | |
559 | |
560 if( (sdatestructure.Year >= 15) | |
561 && (sdatestructure.Year <= 30) | |
562 && (sdatestructure.Month <= 12)) | |
563 return 0; | |
564 | |
565 | |
566 DataEX_helper_set_Unknown_Date_deviceData(lineWrite); | |
567 return 1; | |
568 } | |
569 | |
570 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
571 static uint8_t DataEX_helper_Check_And_Correct_Value_deviceData(SDeviceLine *lineWrite, int32_t from, int32_t to) |
38 | 572 { |
573 if(lineWrite->value_int32 >= from && lineWrite->value_int32 <= to) | |
574 return 0; | |
575 | |
576 if(lineWrite->value_int32 < from) | |
577 lineWrite->value_int32 = from; | |
578 else | |
579 lineWrite->value_int32 = to; | |
580 | |
581 DataEX_helper_set_Unknown_Date_deviceData(lineWrite); | |
582 return 0; | |
583 } | |
584 | |
585 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
586 static void DataEX_check_DeviceData(void) |
38 | 587 { |
588 SDevice *DeviceData = stateDeviceGetPointerWrite(); | |
589 | |
590 DataEX_helper_Check_And_Correct_Date_deviceData(&DeviceData->batteryChargeCompleteCycles); | |
591 DataEX_helper_Check_And_Correct_Date_deviceData(&DeviceData->batteryChargeCycles); | |
592 DataEX_helper_Check_And_Correct_Date_deviceData(&DeviceData->depthMaximum); | |
593 DataEX_helper_Check_And_Correct_Date_deviceData(&DeviceData->diveCycles); | |
594 DataEX_helper_Check_And_Correct_Date_deviceData(&DeviceData->hoursOfOperation); | |
595 DataEX_helper_Check_And_Correct_Date_deviceData(&DeviceData->temperatureMaximum); | |
596 DataEX_helper_Check_And_Correct_Date_deviceData(&DeviceData->temperatureMinimum); | |
597 DataEX_helper_Check_And_Correct_Date_deviceData(&DeviceData->voltageMinimum); | |
598 | |
599 DataEX_helper_Check_And_Correct_Value_deviceData(&DeviceData->batteryChargeCompleteCycles, 0, 10000); | |
600 DataEX_helper_Check_And_Correct_Value_deviceData(&DeviceData->batteryChargeCycles, 0, 20000); | |
601 DataEX_helper_Check_And_Correct_Value_deviceData(&DeviceData->depthMaximum, 0, (500*100)+1000); | |
602 DataEX_helper_Check_And_Correct_Value_deviceData(&DeviceData->diveCycles, 0, 20000); | |
603 DataEX_helper_Check_And_Correct_Value_deviceData(&DeviceData->hoursOfOperation, 0, 1000000); | |
604 DataEX_helper_Check_And_Correct_Value_deviceData(&DeviceData->temperatureMaximum, -30*100, 150*100); | |
605 DataEX_helper_Check_And_Correct_Value_deviceData(&DeviceData->temperatureMinimum, -30*100, 150*100); | |
606 DataEX_helper_Check_And_Correct_Value_deviceData(&DeviceData->voltageMinimum, -1*1000, 6*1000); | |
607 } | |
608 | |
609 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
610 static void DataEX_merge_DeviceData_and_store(void) |
38 | 611 { |
612 uint16_t dataLengthRead; | |
613 SDevice DeviceDataFlash; | |
614 SDevice *DeviceData = stateDeviceGetPointerWrite(); | |
615 | |
616 dataLengthRead = ext_flash_read_devicedata((uint8_t *)&DeviceDataFlash,sizeof(SDevice)); | |
617 | |
618 if(dataLengthRead == 0) | |
619 { | |
620 ext_flash_write_devicedata(); | |
621 return; | |
622 } | |
623 | |
624 /* max values */ | |
625 if(DeviceData->batteryChargeCompleteCycles.value_int32 < DeviceDataFlash.batteryChargeCompleteCycles.value_int32) | |
626 { | |
627 DataEX_helper_copy_deviceData(&DeviceData->batteryChargeCompleteCycles, &DeviceDataFlash.batteryChargeCompleteCycles); | |
628 } | |
629 if(DeviceData->batteryChargeCycles.value_int32 < DeviceDataFlash.batteryChargeCycles.value_int32) | |
630 { | |
631 DataEX_helper_copy_deviceData(&DeviceData->batteryChargeCycles, &DeviceDataFlash.batteryChargeCycles); | |
632 } | |
633 if(DeviceData->temperatureMaximum.value_int32 < DeviceDataFlash.temperatureMaximum.value_int32) | |
634 { | |
635 DataEX_helper_copy_deviceData(&DeviceData->temperatureMaximum, &DeviceDataFlash.temperatureMaximum); | |
636 } | |
637 if(DeviceData->depthMaximum.value_int32 < DeviceDataFlash.depthMaximum.value_int32) | |
638 { | |
639 DataEX_helper_copy_deviceData(&DeviceData->depthMaximum, &DeviceDataFlash.depthMaximum); | |
640 } | |
641 if(DeviceData->diveCycles.value_int32 < DeviceDataFlash.diveCycles.value_int32) | |
642 { | |
643 DataEX_helper_copy_deviceData(&DeviceData->diveCycles, &DeviceDataFlash.diveCycles); | |
644 } | |
645 | |
646 /* min values */ | |
647 if(DeviceData->temperatureMinimum.value_int32 > DeviceDataFlash.temperatureMinimum.value_int32) | |
648 { | |
649 DataEX_helper_copy_deviceData(&DeviceData->temperatureMinimum, &DeviceDataFlash.temperatureMinimum); | |
650 } | |
651 // Voltage minimum, keep limit to 2.0 Volt; hw 09.09.2015 | |
652 if(DeviceData->voltageMinimum.value_int32 > DeviceDataFlash.voltageMinimum.value_int32) | |
653 { | |
654 if(DeviceDataFlash.voltageMinimum.value_int32 > 2000) // do not copy back 2000 and below | |
655 DataEX_helper_copy_deviceData(&DeviceData->voltageMinimum, &DeviceDataFlash.voltageMinimum); | |
656 } | |
657 if(DeviceData->voltageMinimum.value_int32 < 2000) | |
658 DeviceData->voltageMinimum.value_int32 = 2000; | |
659 | |
660 DataEX_check_DeviceData (); | |
661 ext_flash_write_devicedata(); | |
662 } | |
663 | |
664 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
665 static void DataEX_copy_to_DeviceData(void) |
38 | 666 { |
667 SDataExchangeSlaveToMasterDeviceData * dataInDevice = (SDataExchangeSlaveToMasterDeviceData *)&dataIn; | |
668 SDevice * pDeviceState = stateDeviceGetPointerWrite(); | |
669 | |
670 memcpy(pDeviceState, &dataInDevice->DeviceData[dataInDevice->boolDeviceData], sizeof(SDevice)); | |
671 } | |
672 | |
673 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
674 static void DataEX_copy_to_VpmRepetitiveData(void) |
38 | 675 { |
676 SDataExchangeSlaveToMasterDeviceData * dataInDevice = (SDataExchangeSlaveToMasterDeviceData *)&dataIn; | |
677 SVpmRepetitiveData * pVpmState = stateVpmRepetitiveDataGetPointerWrite(); | |
678 | |
679 if(dataInDevice->boolVpmRepetitiveDataValid) | |
680 { | |
681 memcpy(pVpmState, &dataInDevice->VpmRepetitiveData, sizeof(SVpmRepetitiveData)); | |
682 pVpmState->is_data_from_RTE_CPU = 1; | |
683 } | |
684 } | |
685 | |
686 | |
687 void DataEX_control_connection_while_asking_for_sleep(void) | |
688 { | |
689 if(!DataEX_check_header_and_footer_ok()) | |
690 { | |
691 if(DataEX_check_header_and_footer_devicedata()) | |
692 { | |
693 data_old__lost_connection_to_slave_counter_retry = 0; | |
694 data_old__lost_connection_to_slave_counter_temp = 0; | |
695 stateRealGetPointerWrite()->data_old__lost_connection_to_slave = 0; | |
208 | 696 dataOut.header.checkCode[SPI_HEADER_INDEX_RX_STATE] = SPI_RX_STATE_OK; |
38 | 697 } |
698 else | |
699 { | |
700 stateRealGetPointerWrite()->data_old__lost_connection_to_slave = 1; | |
701 data_old__lost_connection_to_slave_counter_temp += 1; | |
702 data_old__lost_connection_to_slave_counter_total += 1; | |
703 } | |
704 } | |
705 } | |
706 | |
173
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
707 #define AVERAGE_COUNT 4 |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
708 static float getSampleDepth(SDataExchangeSlaveToMaster *d, SDiveState *ds) |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
709 { |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
710 static uint8_t c = 0; |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
711 static float ambient[AVERAGE_COUNT] = {0}; |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
712 static float surface[AVERAGE_COUNT]= {0}; |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
713 static float depth[AVERAGE_COUNT]= {0}; |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
714 |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
715 ambient[c] = d->data[d->boolPressureData].pressure_mbar / 1000.0f; |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
716 surface[c] = d->data[d->boolPressureData].surface_mbar / 1000.0f; |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
717 float density = ((float)( 100 + settingsGetPointer()->salinity)) / 100.0f; |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
718 |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
719 ds->lifeData.pressure_ambient_bar = (ambient[0] + ambient[1] + ambient[2] + ambient[3])/4.0f; |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
720 ds->lifeData.pressure_surface_bar = (surface[0] + surface[1] + surface[2] + surface[3])/4.0f; |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
721 depth[c] = (ambient[c] - surface[c]) / (0.09807f * density); |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
722 |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
723 c++; |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
724 if (c == AVERAGE_COUNT) c = 0; |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
725 |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
726 return (depth[0] + depth[1] + depth[2] + depth[3])/4.0f; |
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
727 } |
38 | 728 |
189
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
729 #define TEMP_AVERAGE_COUNT 3 |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
730 static float getTemperature(SDataExchangeSlaveToMaster *d) |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
731 { |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
732 static uint8_t c = 0; |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
733 static float temp[TEMP_AVERAGE_COUNT] = {0}; |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
734 |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
735 temp[c] = d->data[d->boolPressureData].temperature; |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
736 |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
737 c++; |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
738 if (c == TEMP_AVERAGE_COUNT) c = 0; |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
739 |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
740 return (temp[0] + temp[1] + temp[2])/3.0f; |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
741 } |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
742 |
38 | 743 void DataEX_copy_to_LifeData(_Bool *modeChangeFlag) |
744 { | |
173
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
745 SDiveState *pStateReal = stateRealGetPointerWrite(); |
38 | 746 static uint16_t getDeviceDataAfterStartOfMainCPU = 20; |
747 | |
748 /* internal sensor: HUD data | |
749 */ | |
750 for(int i=0;i<3;i++) | |
751 { | |
752 pStateReal->lifeData.ppO2Sensor_bar[i] = get_ppO2Sensor_bar(i); | |
753 pStateReal->lifeData.sensorVoltage_mV[i] = get_sensorVoltage_mV(i); | |
754 } | |
755 pStateReal->lifeData.HUD_battery_voltage_V = get_HUD_battery_voltage_V(); | |
756 | |
757 | |
758 // wireless - �ltere daten aufr�umen | |
51
8f8ea3a32e82
Resolved warnings pointing to possible invalid memory access
Ideenmodellierer
parents:
38
diff
changeset
|
759 for(int i=0;i<(2*NUM_GASES+1);i++) |
38 | 760 { |
761 if(pStateReal->lifeData.bottle_bar[i]) | |
762 { | |
763 if((pStateReal->lifeData.bottle_bar_age_MilliSeconds[i] == 0) || (pStateReal->lifeData.bottle_bar_age_MilliSeconds[i] > 60000)) | |
764 { | |
765 pStateReal->lifeData.bottle_bar_age_MilliSeconds[i] = 0; | |
766 pStateReal->lifeData.bottle_bar[i] = 0; | |
767 } | |
768 else | |
769 pStateReal->lifeData.bottle_bar_age_MilliSeconds[i] += 100; | |
770 } | |
771 } | |
772 | |
773 if(!DataEX_check_header_and_footer_ok()) | |
774 { | |
775 if(DataEX_check_header_and_footer_devicedata()) | |
776 { | |
777 DataEX_copy_to_DeviceData(); | |
778 DataEX_merge_DeviceData_and_store(); | |
779 DataEX_copy_to_VpmRepetitiveData(); | |
780 data_old__lost_connection_to_slave_counter_temp = 0; | |
781 data_old__lost_connection_to_slave_counter_retry = 0; | |
782 pStateReal->data_old__lost_connection_to_slave = 0; | |
208 | 783 dataOut.header.checkCode[SPI_HEADER_INDEX_RX_STATE] = SPI_RX_STATE_OK; |
38 | 784 } |
785 else | |
786 { | |
787 pStateReal->data_old__lost_connection_to_slave = 1; | |
788 data_old__lost_connection_to_slave_counter_temp += 1; | |
789 data_old__lost_connection_to_slave_counter_total += 1; | |
790 } | |
791 return; | |
792 } | |
141 | 793 else /* RX data OK */ |
794 { | |
795 data_old__lost_connection_to_slave_counter_temp = 0; | |
796 data_old__lost_connection_to_slave_counter_retry = 0; | |
797 pStateReal->data_old__lost_connection_to_slave = 0; | |
208 | 798 dataOut.header.checkCode[SPI_HEADER_INDEX_RX_STATE] = SPI_RX_STATE_OK; |
141 | 799 } |
38 | 800 |
801 if(getDeviceDataAfterStartOfMainCPU) | |
802 { | |
803 getDeviceDataAfterStartOfMainCPU--; | |
804 if(getDeviceDataAfterStartOfMainCPU == 0) | |
805 { | |
806 dataOut.getDeviceDataNow = 1; | |
141 | 807 getDeviceDataAfterStartOfMainCPU = 10*60*10; /* * 100ms = 60 second => update device data every 10 minutes */ |
38 | 808 } |
809 } | |
810 | |
811 /* new 151207 hw */ | |
812 if(requestNecessary.uw != 0) | |
813 { | |
814 if(((dataIn.confirmRequest.uw) & CRBUTTON) != 0) | |
815 { | |
816 requestNecessary.ub.button = 0; | |
817 } | |
818 | |
819 if(requestNecessary.ub.button == 1) | |
820 { | |
821 setButtonResponsiveness(settingsGetPointer()->ButtonResponsiveness); | |
822 } | |
823 } | |
824 requestNecessary.uw = 0; // clear all | |
825 | |
173
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
826 float meter = 0; |
38 | 827 SSettings *pSettings; |
149 | 828 |
38 | 829 /* uint8_t IAmStolenPleaseKillMe; |
830 */ | |
51
8f8ea3a32e82
Resolved warnings pointing to possible invalid memory access
Ideenmodellierer
parents:
38
diff
changeset
|
831 pSettings = settingsGetPointer(); |
8f8ea3a32e82
Resolved warnings pointing to possible invalid memory access
Ideenmodellierer
parents:
38
diff
changeset
|
832 |
8f8ea3a32e82
Resolved warnings pointing to possible invalid memory access
Ideenmodellierer
parents:
38
diff
changeset
|
833 if(pSettings->IAmStolenPleaseKillMe > 3) |
38 | 834 { |
835 pSettings->salinity = 0; | |
836 dataIn.data[dataIn.boolPressureData].surface_mbar = 999; | |
837 dataIn.data[dataIn.boolPressureData].pressure_mbar = 98971; | |
838 dataIn.mode = MODE_DIVE; | |
839 } | |
840 | |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
841 if(pStateReal->data_old__lost_connection_to_slave == 0) |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
842 { |
173
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
843 meter = getSampleDepth(&dataIn, pStateReal); |
38 | 844 |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
845 pStateReal->pressure_uTick_old = pStateReal->pressure_uTick_new; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
846 pStateReal->pressure_uTick_new = dataIn.data[dataIn.boolPressureData].pressure_uTick; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
847 pStateReal->pressure_uTick_local_new = HAL_GetTick(); |
38 | 848 |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
849 pStateReal->lifeData.dateBinaryFormat = dataIn.data[dataIn.boolTimeData].localtime_rtc_dr; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
850 pStateReal->lifeData.timeBinaryFormat = dataIn.data[dataIn.boolTimeData].localtime_rtc_tr; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
851 } |
38 | 852 dataOut.setAccidentFlag = 0; |
853 | |
141 | 854 if(pStateReal->data_old__lost_connection_to_slave == 0) |
38 | 855 { |
141 | 856 //Start of diveMode? |
857 if(pStateReal->mode != MODE_DIVE && dataIn.mode == MODE_DIVE) | |
858 { | |
859 if(modeChangeFlag) | |
860 { | |
861 *modeChangeFlag = 1; | |
862 } | |
863 if(stateUsed == stateSimGetPointer()) | |
38 | 864 { |
865 simulation_exit(); | |
866 } | |
141 | 867 // new 170508 |
38 | 868 settingsGetPointer()->bluetoothActive = 0; |
869 MX_Bluetooth_PowerOff(); | |
870 //Init dive Mode | |
141 | 871 decoLock = DECO_CALC_init_as_is_start_of_dive; |
872 pStateReal->lifeData.boolResetAverageDepth = 1; | |
873 pStateReal->lifeData.boolResetStopwatch = 1; | |
38 | 874 } |
141 | 875 |
197
c853f5d23bb7
cleanup: fix (harmless) use before assign
Jan Mulder <jlmulder@xs4all.nl>
parents:
189
diff
changeset
|
876 pStateReal->lifeData.cns = dataIn.data[dataIn.boolToxicData].cns; |
c853f5d23bb7
cleanup: fix (harmless) use before assign
Jan Mulder <jlmulder@xs4all.nl>
parents:
189
diff
changeset
|
877 pStateReal->lifeData.otu = dataIn.data[dataIn.boolToxicData].otu; |
c853f5d23bb7
cleanup: fix (harmless) use before assign
Jan Mulder <jlmulder@xs4all.nl>
parents:
189
diff
changeset
|
878 pStateReal->lifeData.no_fly_time_minutes = dataIn.data[dataIn.boolToxicData].no_fly_time_minutes; |
c853f5d23bb7
cleanup: fix (harmless) use before assign
Jan Mulder <jlmulder@xs4all.nl>
parents:
189
diff
changeset
|
879 pStateReal->lifeData.desaturation_time_minutes = dataIn.data[dataIn.boolToxicData].desaturation_time_minutes; |
c853f5d23bb7
cleanup: fix (harmless) use before assign
Jan Mulder <jlmulder@xs4all.nl>
parents:
189
diff
changeset
|
880 |
141 | 881 //End of diveMode? |
882 if(pStateReal->mode == MODE_DIVE && dataIn.mode != MODE_DIVE) | |
883 { | |
884 if(modeChangeFlag) | |
885 { | |
886 *modeChangeFlag = 1; | |
887 } | |
888 createDiveSettings(); | |
38 | 889 |
141 | 890 if(pStateReal->warnings.cnsHigh) |
891 { | |
892 if(pStateReal->lifeData.cns >= 130) | |
893 dataOut.setAccidentFlag += ACCIDENT_CNSLVL2; | |
894 else if(pStateReal->lifeData.cns >= 100) | |
895 dataOut.setAccidentFlag += ACCIDENT_CNS; | |
896 } | |
897 if(pStateReal->warnings.decoMissed) | |
898 dataOut.setAccidentFlag += ACCIDENT_DECOSTOP; | |
899 } | |
900 pStateReal->mode = dataIn.mode; | |
901 pStateReal->chargeStatus = dataIn.chargeStatus; | |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
902 |
141 | 903 if(is_ambient_pressure_close_to_surface(&pStateReal->lifeData)) |
904 { | |
905 pStateReal->lifeData.depth_meter = 0; | |
906 } | |
907 else | |
908 { | |
909 pStateReal->lifeData.depth_meter = meter; | |
910 } | |
911 | |
189
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
173
diff
changeset
|
912 pStateReal->lifeData.temperature_celsius = getTemperature(&dataIn); |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
913 pStateReal->lifeData.ascent_rate_meter_per_min = dataIn.data[dataIn.boolPressureData].ascent_rate_meter_per_min; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
914 if(pStateReal->mode != MODE_DIVE) |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
915 pStateReal->lifeData.max_depth_meter = 0; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
916 else |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
917 { |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
918 if(meter > pStateReal->lifeData.max_depth_meter) |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
919 pStateReal->lifeData.max_depth_meter = meter; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
920 } |
38 | 921 |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
922 if(dataIn.accidentFlags & ACCIDENT_DECOSTOP) |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
923 pStateReal->decoMissed_at_the_end_of_dive = 1; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
924 if(dataIn.accidentFlags & ACCIDENT_CNS) |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
925 pStateReal->cnsHigh_at_the_end_of_dive = 1; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
926 |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
927 pStateReal->lifeData.dive_time_seconds = (int32_t)dataIn.data[dataIn.boolTimeData].divetime_seconds; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
928 pStateReal->lifeData.dive_time_seconds_without_surface_time = (int32_t)dataIn.data[dataIn.boolTimeData].dive_time_seconds_without_surface_time; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
929 pStateReal->lifeData.counterSecondsShallowDepth = dataIn.data[dataIn.boolTimeData].counterSecondsShallowDepth; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
930 pStateReal->lifeData.surface_time_seconds = (int32_t)dataIn.data[dataIn.boolTimeData].surfacetime_seconds; |
38 | 931 |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
932 pStateReal->lifeData.compass_heading = dataIn.data[dataIn.boolCompassData].compass_heading; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
933 if(settingsGetPointer()->FlipDisplay) /* consider that diver is targeting into the opposite direction */ |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
934 { |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
935 pStateReal->lifeData.compass_heading -= 180.0; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
936 if (pStateReal->lifeData.compass_heading < 0) pStateReal->lifeData.compass_heading +=360.0; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
937 } |
109
65a6e352ce08
Consider computer heading in case of a flipped display
Ideenmodellierer
parents:
51
diff
changeset
|
938 |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
939 pStateReal->lifeData.compass_roll = dataIn.data[dataIn.boolCompassData].compass_roll; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
940 pStateReal->lifeData.compass_pitch = dataIn.data[dataIn.boolCompassData].compass_pitch; |
38 | 941 |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
942 pStateReal->lifeData.compass_DX_f = dataIn.data[dataIn.boolCompassData].compass_DX_f; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
943 pStateReal->lifeData.compass_DY_f = dataIn.data[dataIn.boolCompassData].compass_DY_f; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
944 pStateReal->lifeData.compass_DZ_f = dataIn.data[dataIn.boolCompassData].compass_DZ_f; |
38 | 945 |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
946 pStateReal->compass_uTick_old = pStateReal->compass_uTick_new; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
947 pStateReal->compass_uTick_new = dataIn.data[dataIn.boolCompassData].compass_uTick; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
948 pStateReal->compass_uTick_local_new = HAL_GetTick(); |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
949 |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
950 memcpy(pStateReal->lifeData.tissue_nitrogen_bar, dataIn.data[dataIn.boolTisssueData].tissue_nitrogen_bar,sizeof(pStateReal->lifeData.tissue_nitrogen_bar)); |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
951 memcpy(pStateReal->lifeData.tissue_helium_bar, dataIn.data[dataIn.boolTisssueData].tissue_helium_bar,sizeof(pStateReal->lifeData.tissue_helium_bar)); |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
952 |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
953 if(pStateReal->mode == MODE_DIVE) |
38 | 954 { |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
955 for(int i= 0; i <16; i++) |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
956 { |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
957 pStateReal->vpm.max_crushing_pressure_he[i] = dataIn.data[dataIn.boolCrushingData].max_crushing_pressure_he[i]; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
958 pStateReal->vpm.max_crushing_pressure_n2[i] = dataIn.data[dataIn.boolCrushingData].max_crushing_pressure_n2[i]; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
959 pStateReal->vpm.adjusted_critical_radius_he[i] = dataIn.data[dataIn.boolCrushingData].adjusted_critical_radius_he[i]; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
960 pStateReal->vpm.adjusted_critical_radius_n2[i] = dataIn.data[dataIn.boolCrushingData].adjusted_critical_radius_n2[i]; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
961 } |
38 | 962 } |
963 | |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
964 /* battery and ambient light sensors |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
965 */ |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
966 pStateReal->lifeData.ambient_light_level = dataIn.data[dataIn.boolAmbientLightData].ambient_light_level; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
967 pStateReal->lifeData.battery_charge = dataIn.data[dataIn.boolBatteryData].battery_charge; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
968 pStateReal->lifeData.battery_voltage = dataIn.data[dataIn.boolBatteryData].battery_voltage; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
969 } |
38 | 970 |
971 /* apnea specials | |
972 */ | |
973 if(pStateReal->diveSettings.diveMode == DIVEMODE_Apnea) | |
974 { | |
975 if(pStateReal->mode != MODE_DIVE) | |
976 { | |
977 pStateReal->lifeData.apnea_total_max_depth_meter = 0; | |
978 pStateReal->lifeData.apnea_last_dive_time_seconds = 0; | |
979 pStateReal->lifeData.apnea_last_max_depth_meter = 0; | |
980 } | |
981 else | |
982 { | |
983 if(pStateReal->lifeData.max_depth_meter > pStateReal->lifeData.apnea_total_max_depth_meter) | |
984 pStateReal->lifeData.apnea_total_max_depth_meter = pStateReal->lifeData.max_depth_meter; | |
985 } | |
986 | |
987 if(pStateReal->lifeData.dive_time_seconds > 15) | |
988 { | |
989 pStateReal->lifeData.apnea_last_dive_time_seconds = pStateReal->lifeData.dive_time_seconds; | |
990 } | |
991 | |
992 if(pStateReal->lifeData.counterSecondsShallowDepth) | |
993 { | |
994 if(pStateReal->lifeData.max_depth_meter > 1.5f) | |
995 { | |
996 pStateReal->lifeData.apnea_last_max_depth_meter = pStateReal->lifeData.max_depth_meter; | |
997 } | |
173
05c770dc2911
Bugfix: make max depth move with current depth (part 1)
Jan Mulder <jlmulder@xs4all.nl>
parents:
156
diff
changeset
|
998 // reset max_depth_meter, average_depth_meter and internal values |
38 | 999 pStateReal->lifeData.max_depth_meter = 0; |
1000 pStateReal->lifeData.boolResetAverageDepth = 1; | |
1001 pStateReal->lifeData.boolResetStopwatch = 1; | |
1002 } | |
1003 } | |
1004 | |
1005 /* average depth | |
1006 */ | |
1007 float *AvgDepthValue = &pStateReal->lifeData.average_depth_meter; | |
1008 float DepthNow = pStateReal->lifeData.depth_meter; | |
1009 uint32_t *AvgDepthCount = &pStateReal->lifeData.internal.average_depth_meter_Count; | |
1010 uint32_t *AvgDepthTimer = &pStateReal->lifeData.internal.average_depth_last_update_dive_time_seconds_without_surface_time; | |
1011 uint32_t AvgSecondsSinceLast; | |
1012 uint32_t DiveTime = pStateReal->lifeData.dive_time_seconds_without_surface_time; | |
1013 | |
1014 if(pStateReal->lifeData.boolResetAverageDepth) | |
1015 { | |
1016 *AvgDepthValue = DepthNow; | |
1017 *AvgDepthCount = 1; | |
1018 *AvgDepthTimer = DiveTime; | |
1019 pStateReal->lifeData.boolResetAverageDepth = 0; | |
1020 } | |
1021 else if (DiveTime > *AvgDepthTimer) | |
1022 { | |
1023 AvgSecondsSinceLast = DiveTime - *AvgDepthTimer; | |
1024 for(int i=0;i<AvgSecondsSinceLast;i++) | |
1025 { | |
1026 *AvgDepthValue = (*AvgDepthValue * *AvgDepthCount + DepthNow) / (*AvgDepthCount + 1); | |
1027 *AvgDepthCount += 1; | |
1028 } | |
1029 *AvgDepthTimer = DiveTime; | |
1030 } | |
1031 if(*AvgDepthCount == 0) | |
1032 *AvgDepthValue = 0; | |
1033 | |
1034 | |
1035 /* stop watch | |
1036 */ | |
1037 if(pStateReal->lifeData.boolResetStopwatch) | |
1038 { | |
1039 pStateReal->lifeData.internal.stopwatch_start_at_this_dive_time_seconds = pStateReal->lifeData.dive_time_seconds; | |
1040 pStateReal->lifeData.boolResetStopwatch = 0; | |
1041 } | |
1042 pStateReal->lifeData.stopwatch_seconds = pStateReal->lifeData.dive_time_seconds - pStateReal->lifeData.internal.stopwatch_start_at_this_dive_time_seconds; | |
1043 | |
1044 /* wireless data | |
1045 */ | |
1046 uint16_t wirelessData[4][3]; | |
1047 for(int i=0;i<4;i++) | |
1048 { | |
1049 pStateReal->lifeData.wireless_data[i].ageInMilliSeconds = dataIn.data[dataIn.boolWirelessData].wireless_data[i].ageInMilliSeconds; | |
1050 pStateReal->lifeData.wireless_data[i].status = dataIn.data[dataIn.boolWirelessData].wireless_data[i].status; | |
1051 pStateReal->lifeData.wireless_data[i].numberOfBytes = dataIn.data[dataIn.boolWirelessData].wireless_data[i].numberOfBytes; | |
1052 for(int j=0;j<12;j++) | |
1053 pStateReal->lifeData.wireless_data[i].data[j] = dataIn.data[dataIn.boolWirelessData].wireless_data[i].data[j]; | |
1054 } | |
1055 | |
1056 // neu 160412 | |
1057 for(int i=0;i<4;i++) | |
1058 { | |
1059 if(pStateReal->lifeData.wireless_data[i].numberOfBytes == 10) | |
1060 { | |
1061 wirelessData[i][0] = (pStateReal->lifeData.wireless_data[i].data[0] >> 4) & 0x7F; | |
1062 wirelessData[i][1] = 0; | |
1063 wirelessData[i][2] = pStateReal->lifeData.wireless_data[i].ageInMilliSeconds; | |
1064 } | |
1065 else | |
1066 { | |
1067 wirelessData[i][0] = 0; | |
1068 wirelessData[i][1] = 0; | |
1069 wirelessData[i][2] = 0; | |
1070 } | |
1071 } | |
1072 | |
1073 // aussortieren doppelte ids, j�ngster datensatz ist relevant | |
1074 for(int i=0;i<3;i++) | |
1075 { | |
1076 if(wirelessData[i][0]) | |
1077 { | |
1078 for(int j=i+1; j<4; j++) | |
1079 { | |
1080 if(wirelessData[i][0] == wirelessData[j][0]) | |
1081 { | |
1082 if(wirelessData[i][2] > wirelessData[j][2]) | |
1083 { | |
1084 wirelessData[i][0] = wirelessData[j][0]; | |
1085 wirelessData[i][1] = wirelessData[j][1]; | |
1086 wirelessData[i][2] = wirelessData[j][2]; | |
1087 } | |
1088 wirelessData[j][0] = 0; | |
1089 wirelessData[j][1] = 0; | |
1090 wirelessData[j][2] = 0; | |
1091 } | |
1092 } | |
1093 } | |
1094 } | |
1095 | |
1096 /* PIC data | |
1097 */ | |
1098 for(int i=0;i<4;i++) | |
1099 { | |
1100 pStateReal->lifeData.buttonPICdata[i] = dataIn.data[dataIn.boolPICdata].button_setting[i]; | |
1101 } | |
1102 | |
1103 /* sensorErrors | |
1104 */ | |
1105 pStateReal->sensorErrorsRTE = dataIn.sensorErrors; | |
1106 } | |
1107 | |
1108 | |
1109 uint8_t DataEX_check_RTE_version__needs_update(void) | |
1110 { | |
1111 if(data_old__lost_connection_to_slave_counter_retry > 10) | |
1112 return 1; | |
1113 else | |
1114 { | |
1115 if(stateRealGetPointer()->data_old__lost_connection_to_slave == 0) | |
1116 { | |
1117 setActualRTEversion(dataIn.RTE_VERSION_high, dataIn.RTE_VERSION_low); | |
1118 | |
1119 if(RTEminimum_required_high() < dataIn.RTE_VERSION_high) | |
1120 return 0; | |
1121 else | |
1122 if((RTEminimum_required_high() == dataIn.RTE_VERSION_high) && (RTEminimum_required_low() <= dataIn.RTE_VERSION_low)) | |
1123 return 0; | |
1124 else | |
1125 return 1; | |
1126 } | |
1127 else | |
1128 return 0; | |
1129 } | |
1130 } | |
1131 | |
1132 | |
1133 /* Private functions ---------------------------------------------------------*/ | |
1134 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
1135 /* Check if there is an empty frame provided by RTE (all 0) or even no data provided by RTE (all 0xFF) |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
1136 * If that is not the case the DMA is somehow not in sync |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
1137 */ |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
1138 static uint8_t DataEX_check_header_and_footer_shifted() |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
1139 { |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
1140 uint8_t ret = 1; |
141 | 1141 if((dataIn.footer.checkCode[0] == 0x00) |
1142 && (dataIn.footer.checkCode[1] == 0x00) | |
1143 && (dataIn.footer.checkCode[2] == 0x00) | |
1144 && (dataIn.footer.checkCode[3] == 0x00)) { ret = 0; } | |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
1145 |
141 | 1146 if((dataIn.footer.checkCode[0] == 0xff) |
1147 && (dataIn.footer.checkCode[1] == 0xff) | |
1148 && (dataIn.footer.checkCode[2] == 0xff) | |
1149 && (dataIn.footer.checkCode[3] == 0xff)) { ret = 0; } | |
137
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
1150 |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
1151 return ret; |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
1152 } |
9eda5a75c5fd
Only copy data if data connection to RTE is valid
Ideenmodellierer
parents:
133
diff
changeset
|
1153 |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
1154 static uint8_t DataEX_check_header_and_footer_ok(void) |
38 | 1155 { |
1156 if(dataIn.header.checkCode[0] != 0xA1) | |
1157 return 0; | |
141 | 1158 #if USE_OLD_HEADER_FORMAT |
38 | 1159 if(dataIn.header.checkCode[1] != 0xA2) |
1160 return 0; | |
1161 if(dataIn.header.checkCode[2] != 0xA3) | |
1162 return 0; | |
141 | 1163 #endif |
38 | 1164 if(dataIn.header.checkCode[3] != 0xA4) |
1165 return 0; | |
1166 if(dataIn.footer.checkCode[0] != 0xE1) | |
1167 return 0; | |
1168 if(dataIn.footer.checkCode[1] != 0xE2) | |
1169 return 0; | |
1170 if(dataIn.footer.checkCode[2] != 0xE3) | |
1171 return 0; | |
1172 if(dataIn.footer.checkCode[3] != 0xE4) | |
1173 return 0; | |
1174 | |
1175 return 1; | |
1176 } | |
1177 | |
198
878dc9e0dbc5
cleanup: another cleanup session (data_exchange_main.c)
Jan Mulder <jlmulder@xs4all.nl>
parents:
197
diff
changeset
|
1178 static uint8_t DataEX_check_header_and_footer_devicedata(void) |
38 | 1179 { |
1180 if(dataIn.header.checkCode[0] != 0xDF) | |
1181 return 0; | |
1182 if(dataIn.header.checkCode[1] != 0xDE) | |
1183 return 0; | |
1184 if(dataIn.header.checkCode[2] != 0xDD) | |
1185 return 0; | |
1186 if(dataIn.header.checkCode[3] != 0xDC) | |
1187 return 0; | |
1188 if(dataIn.footer.checkCode[0] != 0xE1) | |
1189 return 0; | |
1190 if(dataIn.footer.checkCode[1] != 0xE2) | |
1191 return 0; | |
1192 if(dataIn.footer.checkCode[2] != 0xE3) | |
1193 return 0; | |
1194 if(dataIn.footer.checkCode[3] != 0xE4) | |
1195 return 0; | |
1196 | |
1197 return 1; | |
1198 } |