Mercurial > public > ostc4
annotate Small_CPU/Src/scheduler.c @ 331:b4c578caaafb I2C_Improvment
Added plausibility check for pressure values
In case of I2C communication problems at startup the dc jumped into dive mode with depth up to 300m. As no CRC is applied a bit flip may also occure during normal operation without detection => added a plausibility check if last measured value fits to the last measurements
author | ideenmodellierer |
---|---|
date | Wed, 17 Jul 2019 22:43:51 +0200 |
parents | 95928ef3986f |
children | b6a59e93cc91 |
rev | line source |
---|---|
38 | 1 /** |
2 ****************************************************************************** | |
3 * @file scheduler.c | |
4 * @author heinrichs weikamp gmbh | |
5 * @date 27-March-2014 | |
6 * @version V0.0.6 | |
7 * @since 18-June-2015 | |
8 * @brief the main part except for base.c | |
9 * | |
10 @verbatim | |
11 ============================================================================== | |
12 ##### How to use ##### | |
13 ============================================================================== | |
14 @endverbatim | |
15 ****************************************************************************** | |
16 * @attention | |
17 * | |
18 * <h2><center>© COPYRIGHT(c) 2015 heinrichs weikamp</center></h2> | |
19 * | |
20 ****************************************************************************** | |
21 */ | |
22 | |
23 | |
24 //#define DEBUGMODE | |
25 | |
26 /* Includes ------------------------------------------------------------------*/ | |
27 #include <string.h> | |
28 #include "baseCPU2.h" | |
29 #include "stm32f4xx_hal.h" | |
30 #include "i2c.h" | |
31 #include "scheduler.h" | |
32 #include "pressure.h" | |
33 #include "compass.h" | |
34 #include "batteryGasGauge.h" | |
35 #include "batteryCharger.h" | |
36 #include "spi.h" | |
37 #include "rtc.h" | |
38 #include "dma.h" | |
39 #include "adc.h" | |
40 #include "calc_crush.h" | |
41 #include "stm32f4xx_hal_rtc_ex.h" | |
42 #include "decom.h" | |
43 #include "tm_stm32f4_otp.h" | |
44 | |
45 | |
135 | 46 #define INVALID_PREASURE_VALUE (100.0F) |
47 | |
38 | 48 /* Private types -------------------------------------------------------------*/ |
49 const SGas Air = {79,0,0,0,0}; | |
50 | |
51 /* Exported variables --------------------------------------------------------*/ | |
52 SGlobal global; | |
53 SDevice DeviceDataFlash; | |
54 uint8_t deviceDataFlashValid = 0; | |
55 uint8_t deviceDataSubSeconds = 0; | |
56 | |
57 /* Private variables ---------------------------------------------------------*/ | |
58 /* can be lost while in sleep */ | |
59 uint8_t clearDecoNow = 0; | |
60 uint8_t setButtonsNow = 0; | |
61 | |
62 /* has to be in SRAM2 */ | |
63 uint8_t secondsCount = 0; | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
64 |
207 | 65 static uint8_t dospisync = SPI_SYNC_METHOD_NONE; |
66 | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
67 SScheduleCtrl Scheduler; |
38 | 68 |
69 /* Private function prototypes -----------------------------------------------*/ | |
70 | |
71 _Bool vpm_crush2(void); | |
72 void scheduleUpdateDeviceData(void); | |
73 long get_nofly_time_minutes(void); | |
74 void copyActualGas(SGas gas); | |
75 void copyPressureData(void); | |
76 void copyCnsAndOtuData(void); | |
77 void copyTimeData(void); | |
78 void copyCompassData(void); | |
79 void copyCompassDataDuringCalibration(int16_t dx, int16_t dy, int16_t dz); | |
80 void copyAmbientLightData(void); | |
81 void copyTissueData(void); | |
82 void copyVpmCrushingData(void); | |
83 void copyDeviceData(void); | |
84 void copyPICdata(void); | |
230
3973208c4a20
cleanup: make return void when never used
Jan Mulder <jlmulder@xs4all.nl>
parents:
220
diff
changeset
|
85 static void schedule_update_timer_helper(int8_t thisSeconds); |
38 | 86 uint32_t time_elapsed_ms(uint32_t ticksstart,uint32_t ticksnow); |
87 | |
88 void scheduleSetDate(SDeviceLine *line); | |
89 | |
90 /* Exported functions --------------------------------------------------------*/ | |
91 | |
92 void initGlobals(void) | |
93 { | |
231
f6961efb3794
cleanup: do not re-implement a standard function
Jan Mulder <jlmulder@xs4all.nl>
parents:
230
diff
changeset
|
94 bzero(&global, sizeof(SGlobal)); |
38 | 95 |
96 global.dataSendToSlavePending = 0; | |
97 global.dataSendToSlaveIsValid = 1; | |
98 global.dataSendToSlaveIsNotValidCount = 0; | |
99 | |
100 global.mode = MODE_POWERUP; | |
101 global.repetitive_dive = 0; | |
102 global.conservatism = 0; | |
103 global.whichGas = 0; | |
104 global.aktualGas[0] = Air; | |
105 global.lifeData.actualGas = global.aktualGas[0]; | |
106 | |
172
c659fda83e44
Minor: Button defaults, release date adjusted, use SPI_SHOW_SYNC_STATS
heinrichsweikamp
parents:
155
diff
changeset
|
107 const uint8_t button_standard_sensitivity = 85; |
38 | 108 global.ButtonResponsiveness[0] = button_standard_sensitivity; |
109 global.ButtonResponsiveness[1] = button_standard_sensitivity; | |
110 global.ButtonResponsiveness[2] = button_standard_sensitivity; | |
111 global.ButtonResponsiveness[3] = button_standard_sensitivity; | |
112 | |
113 global.ButtonPICdata[0] = 0xFF; | |
114 global.ButtonPICdata[1] = 0xFF; | |
115 global.ButtonPICdata[2] = 0xFF; | |
116 global.ButtonPICdata[3] = 0xFF; | |
117 | |
240
625d20070261
Improvement SPI stability/recoverability
Jan Mulder <jlmulder@xs4all.nl>
parents:
231
diff
changeset
|
118 global.I2C_SystemStatus = HAL_ERROR; // 0x00 would be everything working |
38 | 119 |
135 | 120 global.lifeData.pressure_ambient_bar = INVALID_PREASURE_VALUE; |
121 global.lifeData.pressure_surface_bar = INVALID_PREASURE_VALUE; | |
38 | 122 decom_reset_with_1000mbar(&global.lifeData); |
123 | |
124 global.demo_mode = 0; | |
125 | |
126 for(int i = 0; i < MAX_SENSORS; i++) | |
127 { | |
128 global.sensorError[i] = HAL_OK; // HAL_OK = 0; | |
129 } | |
130 | |
131 global.dataSendToMaster.RTE_VERSION_high = firmwareVersionHigh();//RTE_VERSION_HIGH;; | |
132 global.dataSendToMaster.RTE_VERSION_low = firmwareVersionLow();//RTE_VERSION_LOW;; | |
133 global.dataSendToMaster.chargeStatus = 0; | |
134 | |
135 global.dataSendToMaster.power_on_reset = 1; | |
136 global.dataSendToMaster.header.checkCode[0] = 0xA1; | |
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
137 global.dataSendToMaster.header.checkCode[1] = SPI_RX_STATE_OFFLINE; |
38 | 138 global.dataSendToMaster.header.checkCode[2] = 0xA3; |
139 global.dataSendToMaster.header.checkCode[3] = 0xA4; | |
140 global.dataSendToMaster.footer.checkCode[3] = 0xE4; | |
141 global.dataSendToMaster.footer.checkCode[2] = 0xE3; | |
142 global.dataSendToMaster.footer.checkCode[1] = 0xE2; | |
143 global.dataSendToMaster.footer.checkCode[0] = 0xE1; | |
144 global.dataSendToMaster.sensorErrors = 0; | |
145 | |
146 global.sync_error_count = 0; | |
147 global.check_sync_not_running = 0; | |
148 | |
149 global.deviceDataSendToMaster.RTE_VERSION_high = firmwareVersionHigh();//RTE_VERSION_HIGH; | |
150 global.deviceDataSendToMaster.RTE_VERSION_low = firmwareVersionLow();//RTE_VERSION_LOW; | |
151 global.deviceDataSendToMaster.chargeStatus = 0; | |
152 | |
153 global.deviceDataSendToMaster.power_on_reset = 1; | |
154 global.deviceDataSendToMaster.header.checkCode[0] = 0xDF; | |
155 global.deviceDataSendToMaster.header.checkCode[1] = 0xDE; | |
156 global.deviceDataSendToMaster.header.checkCode[2] = 0xDD; | |
157 global.deviceDataSendToMaster.header.checkCode[3] = 0xDC; | |
158 global.deviceDataSendToMaster.footer.checkCode[3] = 0xE4; | |
159 global.deviceDataSendToMaster.footer.checkCode[2] = 0xE3; | |
160 global.deviceDataSendToMaster.footer.checkCode[1] = 0xE2; | |
161 global.deviceDataSendToMaster.footer.checkCode[0] = 0xE1; | |
162 | |
163 global.dataSendToSlave.getDeviceDataNow = 0; | |
164 | |
165 global.deviceData.batteryChargeCompleteCycles.value_int32 = 0; | |
166 global.deviceData.batteryChargeCycles.value_int32 = 0; | |
167 global.deviceData.depthMaximum.value_int32 = 0; | |
168 global.deviceData.diveCycles.value_int32 = 0; | |
169 global.deviceData.hoursOfOperation.value_int32 = 0; | |
170 global.deviceData.temperatureMaximum.value_int32 = INT32_MIN; | |
171 global.deviceData.temperatureMinimum.value_int32 = INT32_MAX; | |
172 global.deviceData.voltageMinimum.value_int32 = INT32_MAX; | |
148
ee744c7160ce
Use SPI TX callback to synchronize to main CPU
Ideenmodellierer
parents:
142
diff
changeset
|
173 |
265
a91d99265884
Increase SPI com timeout for cold start and wake up
ideenmodellierer
parents:
264
diff
changeset
|
174 Scheduler.communicationTimeout = SPI_COM_TIMEOUT_START; |
207 | 175 Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_HARD); |
38 | 176 } |
177 | |
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
178 void reinitGlobals(void) |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
179 { |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
180 global.dataSendToSlavePending = 0; |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
181 global.dataSendToSlaveIsValid = 0; |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
182 global.dataSendToSlaveIsNotValidCount = 0; |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
183 global.sync_error_count = 0; |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
184 global.check_sync_not_running = 0; |
265
a91d99265884
Increase SPI com timeout for cold start and wake up
ideenmodellierer
parents:
264
diff
changeset
|
185 Scheduler.communicationTimeout = SPI_COM_TIMEOUT_START; |
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
186 } |
38 | 187 |
188 void scheduleSpecial_Evaluate_DataSendToSlave(void) | |
189 { | |
104 | 190 //TEMPORARY fix for compass calibration. |
191 //TODO: Fix I2C timeout for complete solving problem. | |
192 if(global.mode==MODE_CALIB){ | |
193 return; | |
194 } | |
90 | 195 |
88 | 196 global.dataSendToSlavePending = 0; |
197 if(!global.dataSendToSlaveIsValid) return; | |
38 | 198 |
199 global.dataSendToMaster.confirmRequest.uw = 0; | |
200 | |
201 if(TM_OTP_Read(0,0) == 0xFF) | |
202 { | |
203 if(global.dataSendToSlave.revisionHardware == (global.dataSendToSlave.revisionCRCx0x7A ^ 0x7A)) | |
204 TM_OTP_Write(0,0,global.dataSendToSlave.revisionHardware); | |
205 } | |
206 | |
207 if(global.dataSendToSlave.setAccidentFlag) | |
208 { | |
209 global.dataSendToMaster.confirmRequest.ub.accident = 1; | |
210 global.deviceData.diveAccident.value_int32 = global.dataSendToSlave.setAccidentFlag; | |
211 scheduleSetDate(&global.deviceData.diveAccident); | |
212 global.accidentFlag |= global.dataSendToSlave.setAccidentFlag; | |
213 if(global.accidentFlag == ACCIDENT_CNS) // LVL1 | |
214 global.accidentRemainingSeconds = 2*60*60; | |
215 else | |
216 global.accidentRemainingSeconds = 24*60*60; | |
217 } | |
218 | |
219 if(global.dataSendToSlave.setTimeNow) | |
220 { | |
221 global.dataSendToMaster.confirmRequest.ub.time = 1; | |
222 RTC_SetTime(global.dataSendToSlave.data.newTime); | |
223 schedule_update_timer_helper(0); | |
224 } | |
225 | |
226 if(global.dataSendToSlave.setDateNow) | |
227 { | |
228 global.dataSendToMaster.confirmRequest.ub.date = 1; | |
229 RTC_SetDate(global.dataSendToSlave.data.newDate); | |
230 schedule_update_timer_helper(0); | |
231 } | |
232 | |
233 if(global.dataSendToSlave.calibrateCompassNow) | |
234 { | |
235 global.dataSendToMaster.confirmRequest.ub.compass = 1; | |
236 global.mode = MODE_CALIB; | |
237 } | |
238 | |
239 if(global.dataSendToSlave.clearDecoNow) | |
240 { | |
241 global.dataSendToMaster.confirmRequest.ub.clearDeco = 1; | |
242 clearDecoNow = 1; | |
243 } | |
244 | |
245 if(global.dataSendToSlave.setButtonSensitivityNow) | |
246 { | |
247 global.dataSendToMaster.confirmRequest.ub.button = 1; | |
248 global.ButtonResponsiveness[0] = global.dataSendToSlave.data.buttonResponsiveness[0]; | |
249 global.ButtonResponsiveness[1] = global.dataSendToSlave.data.buttonResponsiveness[1]; | |
250 global.ButtonResponsiveness[2] = global.dataSendToSlave.data.buttonResponsiveness[2]; | |
251 global.ButtonResponsiveness[3] = global.dataSendToSlave.data.buttonResponsiveness[3]; | |
252 setButtonsNow = 1; | |
253 } | |
254 | |
255 if(global.dataSendToSlave.setBatteryGaugeNow) | |
256 { | |
104 | 257 if(global.mode!=MODE_CALIB){ |
38 | 258 global.dataSendToMaster.confirmRequest.ub.batterygauge = 1; |
259 battery_gas_gauge_set(global.dataSendToSlave.data.newBatteryGaugePercentageFloat); | |
104 | 260 } |
38 | 261 } |
262 | |
263 if((global.mode == MODE_SURFACE) && (global.dataSendToSlave.mode == MODE_SHUTDOWN)) | |
264 { | |
265 global.mode = MODE_SHUTDOWN; | |
266 } | |
267 | |
268 if(global.mode == MODE_DIVE) | |
269 { | |
270 copyActualGas(global.dataSendToSlave.data.actualGas); | |
271 } | |
272 else | |
273 { | |
274 copyActualGas(Air); | |
275 global.settings.divetimeToCreateLogbook = global.dataSendToSlave.data.divetimeToCreateLogbook; | |
276 global.settings.timeoutDiveReachedZeroDepth = global.dataSendToSlave.data.timeoutDiveReachedZeroDepth; | |
277 } | |
278 | |
279 /* for simulation / testing */ | |
280 global.ceiling_from_main_CPU_mbar = global.dataSendToSlave.data.ambient_pressure_mbar_ceiling; | |
281 | |
88 | 282 /* for device data updates */ |
283 deviceDataFlashValid = 0; | |
284 memcpy(&DeviceDataFlash, &global.dataSendToSlave.data.DeviceData, sizeof(SDevice)); | |
285 deviceDataFlashValid = 1; | |
89 | 286 |
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
287 #if 0 |
104 | 288 //TODO: Temporary placed here. Duration ~210 ms. |
289 if (global.I2C_SystemStatus != HAL_OK) { | |
290 MX_I2C1_TestAndClear(); | |
291 MX_I2C1_Init(); | |
292 // init_pressure(); | |
293 // compass_init(0, 7); | |
294 // accelerator_init(); | |
295 } | |
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
296 #endif /* already called once a second */ |
38 | 297 } |
298 | |
299 | |
300 /** | |
301 ****************************************************************************** | |
302 * @brief schedule_time_compare_helper. | |
303 * @author heinrichs weikamp gmbh | |
304 * @version V0.0.1 | |
305 * @date 20-Oct-2016 | |
306 ****************************************************************************** | |
307 */ | |
308 | |
309 uint8_t RtcBugFixChsw(uint8_t inStupidTime) | |
310 { | |
311 uint8_t multiplesOf16 = 0; | |
312 | |
313 multiplesOf16 = inStupidTime / 16; | |
314 | |
315 inStupidTime -= multiplesOf16 * 16; | |
316 | |
317 return (10 * multiplesOf16) + inStupidTime; | |
318 } | |
319 | |
320 uint32_t schedule_time_compare_helper(RTC_TimeTypeDef timeNow, RTC_DateTypeDef dateNow, RTC_TimeTypeDef timeLast, RTC_DateTypeDef dateLast) | |
321 { | |
322 uint32_t nowInSeconds; | |
323 uint32_t lastInSeconds; | |
324 uint32_t resultDiff; | |
325 | |
326 nowInSeconds = (uint32_t)RtcBugFixChsw(timeNow.Hours) * 3600; | |
327 nowInSeconds += (uint32_t)RtcBugFixChsw(timeNow.Minutes) * 60; | |
328 nowInSeconds += (uint32_t)RtcBugFixChsw(timeNow.Seconds); | |
329 | |
330 lastInSeconds = (uint32_t)RtcBugFixChsw(timeLast.Hours) * 3600; | |
331 lastInSeconds += (uint32_t)RtcBugFixChsw(timeLast.Minutes) * 60; | |
332 lastInSeconds += (uint32_t)RtcBugFixChsw(timeLast.Seconds); | |
333 | |
334 if(dateNow.Date != dateLast.Date) | |
335 { | |
336 resultDiff = 86400 + nowInSeconds - lastInSeconds; | |
337 } | |
338 else | |
339 { | |
340 resultDiff = nowInSeconds - lastInSeconds; | |
341 } | |
342 return resultDiff; | |
343 } | |
344 | |
345 | |
346 | |
347 /** | |
348 ****************************************************************************** | |
349 * @brief schedule_update_timer_helper. | |
350 * @author heinrichs weikamp gmbh | |
351 * @version V0.0.1 | |
352 * @date 20-Oct-2016 | |
353 * @brief use 0 for init | |
354 use -1 for RTC controlled | |
355 use >= 1 for manual control | |
356 ****************************************************************************** | |
357 */ | |
358 extern RTC_HandleTypeDef RTCHandle; | |
359 | |
230
3973208c4a20
cleanup: make return void when never used
Jan Mulder <jlmulder@xs4all.nl>
parents:
220
diff
changeset
|
360 static void schedule_update_timer_helper(int8_t thisSeconds) |
38 | 361 { |
362 static RTC_TimeTypeDef sTimeLast; | |
363 static RTC_DateTypeDef sDateLast; | |
364 RTC_TimeTypeDef sTimeNow; | |
365 RTC_DateTypeDef sDateNow; | |
366 uint32_t secondsPast; | |
367 | |
368 HAL_RTC_GetTime(&RTCHandle, &sTimeNow, RTC_FORMAT_BCD); | |
369 HAL_RTC_GetDate(&RTCHandle, &sDateNow, RTC_FORMAT_BCD); | |
370 | |
230
3973208c4a20
cleanup: make return void when never used
Jan Mulder <jlmulder@xs4all.nl>
parents:
220
diff
changeset
|
371 if(thisSeconds != 0) // otherwise just store sTimeLast, sDateLast |
38 | 372 { |
373 if(thisSeconds > 0) // use this value instead, good for pre-loading sTimeLast and sDateLast | |
374 { | |
375 secondsPast = thisSeconds; | |
230
3973208c4a20
cleanup: make return void when never used
Jan Mulder <jlmulder@xs4all.nl>
parents:
220
diff
changeset
|
376 } else { |
3973208c4a20
cleanup: make return void when never used
Jan Mulder <jlmulder@xs4all.nl>
parents:
220
diff
changeset
|
377 // thisSeconds < 0 and not <= ! |
3973208c4a20
cleanup: make return void when never used
Jan Mulder <jlmulder@xs4all.nl>
parents:
220
diff
changeset
|
378 secondsPast = schedule_time_compare_helper(sTimeNow, sDateNow, sTimeLast, sDateLast); |
38 | 379 } |
380 | |
381 if(global.seconds_since_last_dive) | |
382 { | |
383 if(secondsPast >= 777900) | |
384 { | |
385 global.seconds_since_last_dive = 0; | |
386 } | |
387 else | |
388 { | |
230
3973208c4a20
cleanup: make return void when never used
Jan Mulder <jlmulder@xs4all.nl>
parents:
220
diff
changeset
|
389 uint32_t tempNewValue = ((uint32_t)global.seconds_since_last_dive) + secondsPast; |
38 | 390 if(tempNewValue > 777900) // a bit more than nine days [seconds] |
391 global.seconds_since_last_dive = 0; | |
392 else | |
393 global.seconds_since_last_dive = (long)tempNewValue; | |
394 } | |
395 } | |
396 } | |
397 | |
398 sTimeLast = sTimeNow; | |
399 sDateLast = sDateNow; | |
400 } | |
401 | |
402 /** | |
403 ****************************************************************************** | |
404 * @brief schedule_check_resync. | |
405 * @author heinrichs weikamp gmbh | |
406 * @version V0.0.2 | |
407 * @date 18-June-2015 | |
408 ****************************************************************************** | |
409 */ | |
135 | 410 |
38 | 411 void schedule_check_resync(void) |
412 { | |
155
4fd8bbc7d841
Do hard sync after communication timeout > 1 second
Ideenmodellierer
parents:
148
diff
changeset
|
413 /* counter is incremented in cyclic 100ms loop and reset to 0 if the transmission complete callback is called */ |
265
a91d99265884
Increase SPI com timeout for cold start and wake up
ideenmodellierer
parents:
264
diff
changeset
|
414 if((global.check_sync_not_running >= Scheduler.communicationTimeout)) |
38 | 415 { |
89 | 416 // global.dataSendToSlaveIsNotValidCount = 0; |
135 | 417 global.check_sync_not_running = 0; |
418 global.sync_error_count++; | |
419 | |
420 /* Try to start communication again. If exchange is stuck during execution for some reason the TX will be aborted by the | |
421 * function error handler | |
422 */ | |
277 | 423 HAL_SPI_TransmitReceive_DMA(&hspi1,(uint8_t*) &(global.dataSendToMaster),(uint8_t*) &(global.dataSendToSlave), EXCHANGE_BUFFERSIZE); |
265
a91d99265884
Increase SPI com timeout for cold start and wake up
ideenmodellierer
parents:
264
diff
changeset
|
424 Scheduler.communicationTimeout = SPI_COM_TIMEOUT_COMMON; /* Reduce error detection time */ |
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
425 Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_HARD); |
155
4fd8bbc7d841
Do hard sync after communication timeout > 1 second
Ideenmodellierer
parents:
148
diff
changeset
|
426 } |
38 | 427 } |
428 | |
429 | |
430 /** | |
431 ****************************************************************************** | |
432 * @brief scheduleDiveMode. / Dive Mode: Main Loop | |
433 * @author Peter Ryser | |
434 * @version V0.0.1 | |
435 * @date 22-April-2014 | |
436 ****************************************************************************** | |
437 */ | |
438 void scheduleDiveMode(void) | |
439 { | |
440 uint32_t ticksdiff = 0; | |
441 uint32_t lasttick = 0; | |
442 uint8_t counterAscentRate = 0; | |
443 float lastPressure_bar = 0.0f; | |
444 global.dataSendToMaster.mode = MODE_DIVE; | |
445 global.deviceDataSendToMaster.mode = MODE_DIVE; | |
446 uint8_t counter_exit = 0; | |
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
447 |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
448 Scheduler.counterSPIdata100msec = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
449 Scheduler.counterCompass100msec = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
450 Scheduler.counterPressure100msec = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
451 Scheduler.counterAmbientLight100msec = 0; |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
452 Scheduler.tick_execute1second = SCHEDULER_TICK_EXE1SEC; |
38 | 453 |
454 global.deviceData.diveCycles.value_int32++; | |
455 scheduleSetDate(&global.deviceData.diveCycles); | |
456 global.lifeData.counterSecondsShallowDepth = 0; | |
457 | |
240
625d20070261
Improvement SPI stability/recoverability
Jan Mulder <jlmulder@xs4all.nl>
parents:
231
diff
changeset
|
458 Scheduler.tickstart = HAL_GetTick(); |
38 | 459 while(global.mode == MODE_DIVE) |
460 { | |
461 lasttick = HAL_GetTick(); | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
462 ticksdiff = time_elapsed_ms(Scheduler.tickstart,lasttick); |
38 | 463 |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
464 if(ticksdiff >= Scheduler.counterSPIdata100msec * 100 + 10) |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
465 { |
277 | 466 if(SPI_Evaluate_RX_Data()!=0) /* did we receive something ? */ |
467 { | |
468 Scheduler.counterSPIdata100msec++; | |
469 } | |
470 schedule_check_resync(); | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
471 } |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
472 |
38 | 473 //Evaluate pressure at 20 ms, 120 ms, 220 ms,.... |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
474 if(ticksdiff >= Scheduler.counterPressure100msec * 100 + 20) |
38 | 475 { |
476 global.check_sync_not_running++; | |
277 | 477 pressure_update_alternating(); |
135 | 478 scheduleUpdateDeviceData(); |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
181
diff
changeset
|
479 #ifdef DEMOMODE |
38 | 480 if(global.demo_mode) |
481 { | |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
181
diff
changeset
|
482 int turbo_seconds = demo_modify_temperature_and_pressure(global.lifeData.dive_time_seconds, Scheduler.counterPressure100msec, global.ceiling_from_main_CPU_mbar); |
38 | 483 if(turbo_seconds) |
484 { | |
485 global.lifeData.dive_time_seconds += turbo_seconds; | |
486 decom_tissues_exposure((int)(turbo_seconds), &global.lifeData); | |
487 copyTissueData(); | |
488 } | |
489 if((global.lifeData.counterSecondsShallowDepth > 1) && (global.lifeData.counterSecondsShallowDepth < (global.settings.timeoutDiveReachedZeroDepth - 10))) | |
490 global.lifeData.counterSecondsShallowDepth = (global.settings.timeoutDiveReachedZeroDepth - 10); | |
491 } | |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
181
diff
changeset
|
492 #endif |
38 | 493 |
494 //Calc ascentrate every two second (20 * 100 ms) | |
495 counterAscentRate++; | |
496 if(counterAscentRate == 20) | |
497 { | |
498 global.lifeData.pressure_ambient_bar = get_pressure_mbar() / 1000.0f; | |
499 if(lastPressure_bar >= 0) | |
500 { | |
501 //2 seconds * 30 == 1 minute, bar * 10 = meter | |
502 global.lifeData.ascent_rate_meter_per_min = (lastPressure_bar - global.lifeData.pressure_ambient_bar) * 30 * 10; | |
503 } | |
504 lastPressure_bar = global.lifeData.pressure_ambient_bar; | |
505 counterAscentRate = 0; | |
506 } | |
135 | 507 copyPressureData(); |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
508 Scheduler.counterPressure100msec++; |
38 | 509 } |
510 //evaluate compass data at 50 ms, 150 ms, 250 ms,.... | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
511 if(ticksdiff >= Scheduler.counterCompass100msec * 100 + 50) |
135 | 512 { |
513 compass_read(); | |
514 acceleration_read(); | |
515 compass_calc(); | |
516 copyCompassData(); | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
517 Scheduler.counterCompass100msec++; |
135 | 518 } |
38 | 519 |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
520 if(ticksdiff >= Scheduler.counterAmbientLight100msec * 100 + 70) |
38 | 521 { |
522 adc_ambient_light_sensor_get_data(); | |
523 copyAmbientLightData(); | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
524 Scheduler.counterAmbientLight100msec++; |
38 | 525 } |
526 | |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
527 //Evaluate tissues, toxic data, vpm, etc. once a second |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
528 if(ticksdiff >= Scheduler.tick_execute1second) |
38 | 529 { |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
530 Scheduler.tick_execute1second = 0xFFFFFFFF; /* execute once only in the second cycle */ |
38 | 531 if(global.dataSendToSlave.diveModeInfo != DIVEMODE_Apnea) |
532 { | |
533 scheduleUpdateLifeData(0); // includes tissues | |
534 global.lifeData.dive_time_seconds++; // there is dive_time_seconds_without_surface_time too | |
535 global.lifeData.ppO2 = decom_calc_ppO2(global.lifeData.pressure_ambient_bar, &global.lifeData.actualGas); | |
536 decom_oxygen_calculate_cns(&global.lifeData.cns,global.lifeData.ppO2); | |
537 decom_oxygen_calculate_otu(&global.lifeData.otu,global.lifeData.ppO2); | |
88 | 538 battery_gas_gauge_get_data(); |
38 | 539 |
540 | |
541 /** counter_exit allows safe exit via button for testing | |
542 * and demo_mode is exited too if aplicable. | |
543 */ | |
544 if(global.dataSendToMaster.mode == MODE_ENDDIVE) | |
545 { | |
546 counter_exit++; | |
547 if(counter_exit >= 2) | |
548 { | |
549 global.mode = MODE_SURFACE; | |
550 global.demo_mode = 0; | |
551 } | |
552 } | |
553 | |
554 if(is_ambient_pressure_close_to_surface(&global.lifeData)) | |
555 { | |
556 global.lifeData.counterSecondsShallowDepth++; | |
557 if((global.lifeData.counterSecondsShallowDepth >= global.settings.timeoutDiveReachedZeroDepth) || ((global.lifeData.dive_time_seconds < 60) && (global.demo_mode == 0)) || (global.dataSendToSlave.setEndDive)) | |
558 { | |
559 global.seconds_since_last_dive = 1; // start counter | |
560 schedule_update_timer_helper(0); // zum starten :-) | |
561 global.dataSendToMaster.mode = MODE_ENDDIVE; | |
562 global.deviceDataSendToMaster.mode = MODE_ENDDIVE; | |
563 } | |
564 } | |
565 else | |
566 { | |
567 global.lifeData.counterSecondsShallowDepth = 0; | |
568 global.lifeData.dive_time_seconds_without_surface_time++; | |
569 } | |
570 vpm_crush2(); | |
571 } | |
572 else // DIVEMODE_Apnea | |
573 { | |
574 global.lifeData.dive_time_seconds++; | |
575 | |
576 // exit dive mode | |
577 if(global.dataSendToMaster.mode == MODE_ENDDIVE) | |
578 { | |
579 counter_exit++; | |
580 if(counter_exit >= 2) | |
581 { | |
582 scheduleUpdateLifeData(-1); // 'restart' tissue calculations without calculating time during apnea mode | |
583 global.lifeData.dive_time_seconds = 0; // use backup noflytime and desaturation time | |
584 global.mode = MODE_SURFACE; | |
585 global.demo_mode = 0; | |
586 } | |
587 } | |
588 | |
589 // surface break | |
590 if(is_ambient_pressure_close_to_surface(&global.lifeData)) | |
591 { | |
592 global.lifeData.counterSecondsShallowDepth++; | |
593 if(global.lifeData.counterSecondsShallowDepth > 3) // time for main cpu to copy to apnea_last_dive_time_seconds | |
594 { | |
595 global.lifeData.dive_time_seconds = 0; // this apnea dive ends here | |
596 } | |
597 if((global.lifeData.counterSecondsShallowDepth >= global.settings.timeoutDiveReachedZeroDepth) || (global.dataSendToSlave.setEndDive)) | |
598 { | |
599 global.dataSendToMaster.mode = MODE_ENDDIVE; | |
600 global.deviceDataSendToMaster.mode = MODE_ENDDIVE; | |
601 } | |
602 } | |
603 else | |
604 { | |
605 global.lifeData.counterSecondsShallowDepth = 0; | |
606 global.lifeData.dive_time_seconds_without_surface_time++; | |
607 } | |
608 } // standard dive or DIVEMODE_Apnea | |
609 | |
88 | 610 copyVpmCrushingData(); |
611 copyTimeData(); | |
612 copyCnsAndOtuData(); | |
613 copyBatteryData(); | |
38 | 614 |
88 | 615 // new hw 170523 |
616 if(global.I2C_SystemStatus != HAL_OK) | |
617 { | |
618 MX_I2C1_TestAndClear(); | |
619 MX_I2C1_Init(); | |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
620 init_pressure(); |
88 | 621 } |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
622 } |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
623 if(ticksdiff >= 1000) |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
624 { |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
625 /* reset counter */ |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
626 Scheduler.tickstart = HAL_GetTick(); |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
627 Scheduler.counterSPIdata100msec = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
628 Scheduler.counterCompass100msec = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
629 Scheduler.counterPressure100msec = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
630 Scheduler.counterAmbientLight100msec = 0; |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
631 Scheduler.tick_execute1second = SCHEDULER_TICK_EXE1SEC; |
38 | 632 } |
633 } | |
634 } | |
635 | |
636 | |
637 /** | |
638 ****************************************************************************** | |
639 * @brief scheduleSurfaceMode / surface mode: Main Loop | |
640 * @author Peter Ryser | |
641 * @version V0.0.1 | |
642 * @date 22-April-2014 | |
643 ****************************************************************************** | |
644 */ | |
645 | |
646 | |
647 // =============================================================================== | |
648 // scheduleTestMode | |
649 /// @brief included for sealed hardware with permanent RTE update message | |
650 // =============================================================================== | |
651 void scheduleTestMode(void) | |
652 { | |
653 uint32_t ticksdiff = 0; | |
654 uint32_t lasttick = 0; | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
655 Scheduler.tickstart = HAL_GetTick(); |
38 | 656 |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
657 Scheduler.counterPressure100msec = 0; |
38 | 658 |
659 float temperature_carousel = 0.0f; | |
660 float temperature_changer = 0.1f; | |
661 | |
662 while(global.mode == MODE_TEST) | |
663 { | |
664 lasttick = HAL_GetTick(); | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
665 ticksdiff = time_elapsed_ms(Scheduler.tickstart,lasttick); |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
666 |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
667 //Evaluate received data at 10 ms, 110 ms, 210 ms,... |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
668 if(ticksdiff >= Scheduler.counterSPIdata100msec * 100 + 10) |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
669 { |
277 | 670 if(SPI_Evaluate_RX_Data()!=0) /* did we receive something ? */ |
671 { | |
672 Scheduler.counterSPIdata100msec++; | |
673 } | |
674 schedule_check_resync(); | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
675 } |
38 | 676 |
677 //Evaluate pressure at 20 ms, 120 ms, 220 ms,... | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
678 if(ticksdiff >= Scheduler.counterPressure100msec * 100 + 20) |
38 | 679 { |
680 global.check_sync_not_running++; | |
681 | |
277 | 682 pressure_update_alternating(); |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
683 scheduleUpdateDeviceData(); |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
684 global.lifeData.ascent_rate_meter_per_min = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
685 copyPressureData(); |
38 | 686 |
687 if(temperature_carousel > 20.0f) | |
688 { | |
689 temperature_carousel = 20.0f; | |
690 temperature_changer = -0.1f; | |
691 } | |
692 else | |
693 if(temperature_carousel < 0) | |
694 { | |
695 temperature_carousel = 0; | |
696 temperature_changer = +0.1f; | |
697 } | |
698 | |
699 temperature_carousel += temperature_changer; | |
700 | |
701 uint8_t boolPressureData = !global.dataSendToMaster.boolPressureData; | |
702 | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
703 global.dataSendToMaster.data[boolPressureData].pressure_mbar = get_pressure_mbar(); |
38 | 704 |
705 global.dataSendToMaster.data[boolPressureData].temperature = temperature_carousel; | |
706 global.dataSendToMaster.data[boolPressureData].pressure_uTick = HAL_GetTick(); | |
707 global.dataSendToMaster.boolPressureData = boolPressureData; | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
708 Scheduler.counterPressure100msec++; |
38 | 709 } |
710 | |
711 if(ticksdiff >= 1000) | |
712 { | |
713 //Set back tick counter | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
714 Scheduler.tickstart = HAL_GetTick(); |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
715 Scheduler.counterPressure100msec = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
716 Scheduler.counterSPIdata100msec = 0; |
38 | 717 } |
718 }; | |
719 } | |
720 | |
721 | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
722 |
38 | 723 void scheduleSurfaceMode(void) |
724 { | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
725 |
38 | 726 uint32_t ticksdiff = 0; |
727 uint32_t lasttick = 0; | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
728 Scheduler.tickstart = HAL_GetTick(); |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
729 Scheduler.counterSPIdata100msec = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
730 Scheduler.counterCompass100msec = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
731 Scheduler.counterPressure100msec = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
732 Scheduler.counterAmbientLight100msec = 0; |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
733 Scheduler.tick_execute1second = SCHEDULER_TICK_EXE1SEC; |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
734 |
38 | 735 global.dataSendToMaster.mode = MODE_SURFACE; |
736 global.deviceDataSendToMaster.mode = MODE_SURFACE; | |
737 | |
738 while(global.mode == MODE_SURFACE) | |
739 { | |
277 | 740 |
38 | 741 lasttick = HAL_GetTick(); |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
742 ticksdiff = time_elapsed_ms(Scheduler.tickstart,lasttick); |
38 | 743 |
744 if(setButtonsNow == 1) | |
745 { | |
746 if(scheduleSetButtonResponsiveness()) | |
747 setButtonsNow = 0; | |
748 } | |
749 | |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
750 /* Evaluate received data at 10 ms, 110 ms, 210 ms,... duration ~<1ms */ |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
751 if(ticksdiff >= Scheduler.counterSPIdata100msec * 100 + 10) |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
752 { |
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
753 if(SPI_Evaluate_RX_Data()!=0) /* did we receive something ? */ |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
754 { |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
755 Scheduler.counterSPIdata100msec++; |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
756 } |
277 | 757 schedule_check_resync(); |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
758 } |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
759 |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
760 /* Evaluate pressure at 20 ms, 120 ms, 220 ms,... duration ~22ms] */ |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
761 if(ticksdiff >= Scheduler.counterPressure100msec * 100 + 20) |
38 | 762 { |
763 global.check_sync_not_running++; | |
277 | 764 pressure_update_alternating(); |
135 | 765 scheduleUpdateDeviceData(); |
38 | 766 global.lifeData.ascent_rate_meter_per_min = 0; |
135 | 767 copyPressureData(); |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
768 Scheduler.counterPressure100msec++; |
135 | 769 |
301
a09b1855d656
cleanup, RTE: factor out scheduleCheck_pressure_reached_dive_mode_level
Jan Mulder <jlmulder@xs4all.nl>
parents:
277
diff
changeset
|
770 if (!is_ambient_pressure_close_to_surface(&global.lifeData)) |
38 | 771 global.mode = MODE_DIVE; |
772 } | |
773 | |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
774 /* Evaluate compass data at 50 ms, 150 ms, 250 ms,... duration ~5ms */ |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
775 if(ticksdiff >= Scheduler.counterCompass100msec * 100 + 50) |
135 | 776 { |
777 compass_read(); | |
778 acceleration_read(); | |
779 compass_calc(); | |
780 copyCompassData(); | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
781 Scheduler.counterCompass100msec++; |
135 | 782 } |
38 | 783 |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
784 /* evaluate compass data at 70 ms, 170 ms, 270 ms,... duration <1ms */ |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
785 if(ticksdiff >= Scheduler.counterAmbientLight100msec * 100 + 70) |
38 | 786 { |
787 adc_ambient_light_sensor_get_data(); | |
788 copyAmbientLightData(); | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
789 Scheduler.counterAmbientLight100msec++; |
38 | 790 } |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
791 |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
792 |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
793 |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
794 /* Evaluate tissues, toxic data, etc. once a second... duration ~1ms */ |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
795 if(ticksdiff >= Scheduler.tick_execute1second) |
38 | 796 { |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
797 Scheduler.tick_execute1second = 0xFFFFFFFF; |
38 | 798 if(clearDecoNow) |
799 { | |
800 decom_reset_with_1000mbar(&global.lifeData); ///< this should almost reset desaturation time | |
801 // new 160215 hw | |
802 global.repetitive_dive = 0; | |
803 global.seconds_since_last_dive = 0; ///< this will reset OTU and CNS as well | |
804 global.no_fly_time_minutes = 0; | |
805 global.accidentFlag = 0; | |
806 global.accidentRemainingSeconds = 0; | |
807 vpm_init(&global.vpm, global.conservatism, global.repetitive_dive, global.seconds_since_last_dive); | |
808 clearDecoNow = 0; | |
809 } | |
89 | 810 |
38 | 811 if(global.seconds_since_last_dive) |
812 { | |
813 schedule_update_timer_helper(-1); | |
814 } | |
89 | 815 |
38 | 816 if(global.accidentRemainingSeconds) |
817 { | |
818 global.accidentRemainingSeconds--; | |
819 if(!global.accidentRemainingSeconds) | |
820 global.accidentFlag = 0; | |
821 } | |
822 global.dataSendToMaster.accidentFlags = global.accidentFlag; | |
89 | 823 |
38 | 824 update_surface_pressure(1); |
825 scheduleUpdateLifeData(0); | |
826 decom_oxygen_calculate_otu_degrade(&global.lifeData.otu, global.seconds_since_last_dive); | |
827 decom_oxygen_calculate_cns_degrade(&global.lifeData.cns, global.seconds_since_last_dive); | |
135 | 828 |
829 /* start desaturation calculation after first valid measurement has been done */ | |
830 if(global.lifeData.pressure_surface_bar != INVALID_PREASURE_VALUE) | |
831 { | |
832 global.lifeData.desaturation_time_minutes = decom_calc_desaturation_time(global.lifeData.tissue_nitrogen_bar,global.lifeData.tissue_helium_bar,global.lifeData.pressure_surface_bar); | |
833 } | |
834 else | |
835 { | |
836 global.lifeData.desaturation_time_minutes = 0; | |
837 } | |
38 | 838 battery_charger_get_status_and_contral_battery_gas_gauge(0); |
88 | 839 battery_gas_gauge_get_data(); |
89 | 840 |
88 | 841 copyCnsAndOtuData(); |
842 copyTimeData(); | |
843 copyBatteryData(); | |
844 copyDeviceData(); | |
38 | 845 |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
846 /* check if I2C is not up an running and try to reactivate if necessary. Also do initialization if problem occured during startup */ |
88 | 847 if(global.I2C_SystemStatus != HAL_OK) |
848 { | |
849 MX_I2C1_TestAndClear(); | |
850 MX_I2C1_Init(); | |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
851 if(global.I2C_SystemStatus == HAL_OK) |
88 | 852 { |
853 init_pressure(); | |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
854 if(is_init_pressure_done()) /* Init surface data with initial measurement */ |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
855 { |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
856 init_surface_ring(); |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
857 } |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
858 |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
859 if(!battery_gas_gauge_CheckConfigOK()) |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
860 { |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
861 init_battery_gas_gauge(); |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
862 } |
88 | 863 } |
864 } | |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
865 } |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
866 |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
867 if(ticksdiff >= 1000) |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
868 { |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
869 //Set back tick counter |
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
870 Scheduler.tickstart = HAL_GetTick(); |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
871 Scheduler.counterSPIdata100msec = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
872 Scheduler.counterCompass100msec = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
873 Scheduler.counterPressure100msec = 0; |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
874 Scheduler.counterAmbientLight100msec = 0; |
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
875 Scheduler.tick_execute1second = SCHEDULER_TICK_EXE1SEC; |
38 | 876 } |
877 } | |
878 } | |
879 | |
207 | 880 inline void Scheduler_Request_sync_with_SPI(uint8_t SyncMethod) |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
881 { |
207 | 882 if( SyncMethod < SPI_SYNC_METHOD_INVALID) |
883 { | |
884 dospisync = SyncMethod; | |
885 } | |
886 } | |
887 | |
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
888 void Scheduler_SyncToSPI(uint8_t TXtick) |
207 | 889 { |
890 uint32_t deltatick = 0; | |
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
891 int8_t TXcompensation; |
207 | 892 |
893 switch(dospisync) | |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
894 { |
207 | 895 case SPI_SYNC_METHOD_HARD: |
896 //Set back tick counter | |
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
897 Scheduler.tickstart = HAL_GetTick() - 4; /* consider 4ms offset for transfer */ |
207 | 898 Scheduler.counterSPIdata100msec = 0; |
899 Scheduler.counterCompass100msec = 0; | |
900 Scheduler.counterPressure100msec = 0; | |
901 Scheduler.counterAmbientLight100msec = 0; | |
902 dospisync = SPI_SYNC_METHOD_NONE; | |
903 break; | |
904 case SPI_SYNC_METHOD_SOFT: | |
905 deltatick = time_elapsed_ms(Scheduler.tickstart,HAL_GetTick()); | |
906 deltatick %= 100; /* clip to 100ms window */ | |
907 if(Scheduler.tickstart - deltatick >= 0) /* adjust start time to the next 100ms window */ | |
908 { | |
909 Scheduler.tickstart -= deltatick; | |
910 } | |
911 else | |
912 { | |
913 Scheduler.tickstart = 0xFFFFFFFF- (deltatick - Scheduler.tickstart); | |
914 } | |
915 dospisync = SPI_SYNC_METHOD_NONE; | |
916 break; | |
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
917 default: /* continous sync activity */ |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
918 if(TXtick < 100) /* do not handle unexpected jump length > 100ms */ |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
919 { |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
920 TXtick += 4; /* add 4ms TX time to offset of 100ms time stamp */ |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
921 deltatick = time_elapsed_ms(Scheduler.tickstart,HAL_GetTick()); |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
922 deltatick %= 100; |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
923 if(deltatick > 50) |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
924 { |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
925 TXcompensation = deltatick - 100; /* neg drift */ |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
926 } |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
927 else |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
928 { |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
929 TXcompensation = deltatick; /* pos drift */ |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
930 } |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
931 TXcompensation = TXtick - TXcompensation; |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
932 Scheduler.tickstart -= TXcompensation; |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
933 } |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
934 else |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
935 { |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
936 Scheduler_Request_sync_with_SPI(SPI_SYNC_METHOD_SOFT); /* A large shift in 100ms cycle occured => clip to 100ms in next sync call */ |
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
937 } |
207 | 938 break; |
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
939 } |
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
940 } |
38 | 941 |
942 /** | |
943 ****************************************************************************** | |
944 * @brief scheduleCompassCalibrationMode | |
945 * @author heinrichs weikamp gmbh | |
946 * @version V0.0.1 | |
947 * @since 31-March-2015 | |
948 * @date 31-March-2015 | |
949 ****************************************************************************** | |
950 */ | |
951 void scheduleCompassCalibrationMode(void) | |
952 { | |
953 compass_init(1,7); // fast mode, max gain | |
954 compass_calib(); // duration : 1 minute! | |
955 compass_init(0,7); // back to normal mode | |
956 | |
957 if(global.seconds_since_last_dive) | |
958 { | |
959 schedule_update_timer_helper(-1); | |
960 } | |
961 | |
962 scheduleUpdateLifeData(0); | |
963 global.mode = MODE_SURFACE; | |
964 } | |
965 | |
966 | |
967 /** | |
968 ****************************************************************************** | |
969 * @brief scheduleSleepMode / sleep mode: Main Loop | |
970 * @author heinrichs weikamp gmbh | |
971 * @version V0.0.2 | |
972 * @since 31-March-2015 | |
973 * @date 22-April-2014 | |
974 ****************************************************************************** | |
975 */ | |
976 | |
977 void scheduleSleepMode(void) | |
978 { | |
979 global.dataSendToMaster.mode = 0; | |
980 global.deviceDataSendToMaster.mode = 0; | |
981 | |
982 /* prevent button wake up problem while in sleep_prepare | |
983 * sleep prepare does I2C_DeInit() | |
984 */ | |
985 if(global.mode != MODE_SLEEP) | |
986 MX_I2C1_Init(); | |
987 else | |
988 do | |
989 { | |
990 I2C_DeInit(); | |
991 | |
992 #ifdef DEBUGMODE | |
993 HAL_Delay(2000); | |
994 #else | |
995 RTC_StopMode_2seconds(); | |
996 #endif | |
997 | |
998 | |
999 | |
1000 if(global.mode == MODE_SLEEP) | |
1001 secondsCount += 2; | |
1002 | |
1003 MX_I2C1_Init(); | |
1004 pressure_sensor_get_pressure_raw(); | |
1005 | |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1006 /* check if I2C is not up an running and try to reactivate if necessary. Also do initialization if problem occured during startup */ |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1007 if(global.I2C_SystemStatus != HAL_OK) |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1008 { |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1009 MX_I2C1_TestAndClear(); |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1010 MX_I2C1_Init(); |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1011 if(global.I2C_SystemStatus == HAL_OK) |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1012 { |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1013 init_pressure(); |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1014 } |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1015 } |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1016 |
38 | 1017 if(secondsCount >= 30) |
1018 { | |
1019 pressure_sensor_get_temperature_raw(); | |
1020 battery_gas_gauge_get_data(); | |
1021 // ReInit_battery_charger_status_pins(); | |
1022 battery_charger_get_status_and_contral_battery_gas_gauge(1); | |
1023 // DeInit_battery_charger_status_pins(); | |
1024 secondsCount = 0; | |
1025 } | |
1026 | |
1027 pressure_calculation(); | |
1028 | |
1029 scheduleUpdateDeviceData(); | |
1030 update_surface_pressure(2); | |
1031 | |
1032 if(global.seconds_since_last_dive) | |
1033 { | |
1034 schedule_update_timer_helper(-1); | |
1035 } | |
1036 | |
1037 if(global.accidentRemainingSeconds) | |
1038 { | |
1039 if(global.accidentRemainingSeconds > 2) | |
1040 global.accidentRemainingSeconds -= 2; | |
1041 else | |
1042 { | |
1043 global.accidentRemainingSeconds = 0; | |
1044 global.accidentFlag = 0; | |
1045 } | |
1046 } | |
1047 | |
301
a09b1855d656
cleanup, RTE: factor out scheduleCheck_pressure_reached_dive_mode_level
Jan Mulder <jlmulder@xs4all.nl>
parents:
277
diff
changeset
|
1048 if (!is_ambient_pressure_close_to_surface(&global.lifeData)) |
38 | 1049 global.mode = MODE_BOOT; |
1050 | |
1051 scheduleUpdateLifeData(2000); | |
1052 } | |
1053 while(global.mode == MODE_SLEEP); | |
1054 /* new section for system after Standby */ | |
1055 scheduleUpdateLifeData(-1); | |
1056 clearDecoNow = 0; | |
1057 setButtonsNow = 0; | |
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
1058 reinitGlobals(); |
38 | 1059 } |
1060 | |
1061 | |
1062 | |
1063 /* Private functions ---------------------------------------------------------*/ | |
1064 | |
1065 /** | |
1066 ****************************************************************************** | |
1067 * @brief scheduleUpdateLifeData / calculates tissues | |
1068 * @author Peter Ryser | |
1069 * @version V0.0.1 | |
1070 * @date 22-April-2014 | |
1071 ****************************************************************************** | |
1072 */ | |
1073 | |
1074 | |
1075 void scheduleUpdateLifeData(int32_t asynchron_milliseconds_since_last) | |
1076 { | |
1077 static _Bool first = 1; | |
1078 static uint32_t tickstart = 0; | |
1079 static uint32_t ticksrest = 0; | |
1080 | |
1081 uint32_t ticksdiff = 0; | |
1082 uint32_t ticksnow = 0; | |
1083 uint32_t time_seconds = 0; | |
1084 uint8_t whichGasTmp = 0; | |
1085 | |
135 | 1086 uint8_t updateTissueData = 0; |
1087 | |
1088 | |
1089 if(global.lifeData.pressure_surface_bar == INVALID_PREASURE_VALUE) | |
1090 { | |
1091 updateTissueData = 1; | |
1092 } | |
1093 | |
38 | 1094 if(asynchron_milliseconds_since_last < 0) |
1095 { | |
1096 first = 1; | |
1097 tickstart = 0; | |
1098 ticksrest = 0; | |
1099 return; | |
1100 } | |
1101 | |
1102 if(!asynchron_milliseconds_since_last && first) | |
1103 { | |
1104 tickstart = HAL_GetTick(); | |
1105 first = 0; | |
1106 return; | |
1107 } | |
1108 | |
1109 whichGasTmp = global.whichGas; | |
1110 global.lifeData.actualGas = global.aktualGas[whichGasTmp]; | |
1111 global.lifeData.pressure_ambient_bar = get_pressure_mbar() / 1000.0f; | |
1112 global.lifeData.pressure_surface_bar = get_surface_mbar() / 1000.0f; | |
1113 | |
135 | 1114 if(updateTissueData) |
1115 { | |
1116 decom_reset_with_ambientmbar(global.lifeData.pressure_surface_bar,&global.lifeData); | |
1117 } | |
1118 | |
38 | 1119 if(!asynchron_milliseconds_since_last) |
1120 { | |
1121 ticksnow = HAL_GetTick(); | |
1122 ticksdiff = time_elapsed_ms(tickstart,ticksnow); | |
1123 } | |
1124 else | |
1125 { | |
1126 first = 1; | |
1127 ticksdiff = asynchron_milliseconds_since_last; | |
1128 } | |
1129 | |
1130 if(ticksrest > 1000) // whatever happens after standby with STM32L476 | |
1131 ticksrest = 0; // maybe move static to SRAM2 | |
1132 | |
1133 ticksdiff += ticksrest; | |
1134 time_seconds = ticksdiff/ 1000; | |
1135 ticksrest = ticksdiff - time_seconds * 1000; | |
1136 tickstart = ticksnow; | |
1137 | |
1138 decom_tissues_exposure((int)time_seconds, &global.lifeData); | |
1139 if(global.demo_mode) | |
1140 decom_tissues_exposure((int)(3*time_seconds), &global.lifeData); | |
1141 copyTissueData(); | |
1142 } | |
1143 | |
1144 | |
1145 /** | |
1146 ****************************************************************************** | |
1147 * @brief scheduleUpdateDeviceData | |
1148 * @author heinrichs weikamp gmbh | |
1149 * @version V0.0.1 | |
1150 * @date 16-March-2015 | |
1151 * | |
1152 * two step process | |
1153 * first compare with data from main CPU == externalLogbookFlash | |
1154 * second update with new sensor data | |
1155 ****************************************************************************** | |
1156 */ | |
1157 void scheduleSetDate(SDeviceLine *line) | |
1158 { | |
1159 extern RTC_HandleTypeDef RTCHandle; | |
1160 | |
1161 line->date_rtc_dr = (uint32_t)(RTCHandle.Instance->DR & RTC_DR_RESERVED_MASK); | |
1162 line->time_rtc_tr = (uint32_t)(RTCHandle.Instance->TR & RTC_TR_RESERVED_MASK); | |
1163 } | |
1164 | |
1165 | |
1166 void scheduleCopyDeviceData(SDeviceLine *lineWrite, const SDeviceLine *lineRead) | |
1167 { | |
1168 lineWrite->date_rtc_dr = lineRead->date_rtc_dr; | |
1169 lineWrite->time_rtc_tr = lineRead->time_rtc_tr; | |
1170 lineWrite->value_int32 = lineRead->value_int32; | |
1171 } | |
1172 | |
1173 | |
1174 void scheduleUpdateDeviceData(void) | |
1175 { | |
1176 /* first step, main CPU */ | |
1177 | |
1178 if(deviceDataFlashValid) | |
1179 { | |
1180 /* max values */ | |
1181 if(global.deviceData.batteryChargeCompleteCycles.value_int32 < DeviceDataFlash.batteryChargeCompleteCycles.value_int32) | |
1182 { | |
1183 scheduleCopyDeviceData(&global.deviceData.batteryChargeCompleteCycles, &DeviceDataFlash.batteryChargeCompleteCycles); | |
1184 } | |
1185 if(global.deviceData.batteryChargeCycles.value_int32 < DeviceDataFlash.batteryChargeCycles.value_int32) | |
1186 { | |
1187 scheduleCopyDeviceData(&global.deviceData.batteryChargeCycles, &DeviceDataFlash.batteryChargeCycles); | |
1188 } | |
1189 if(global.deviceData.temperatureMaximum.value_int32 < DeviceDataFlash.temperatureMaximum.value_int32) | |
1190 { | |
1191 scheduleCopyDeviceData(&global.deviceData.temperatureMaximum, &DeviceDataFlash.temperatureMaximum); | |
1192 } | |
1193 if(global.deviceData.depthMaximum.value_int32 < DeviceDataFlash.depthMaximum.value_int32) | |
1194 { | |
1195 scheduleCopyDeviceData(&global.deviceData.depthMaximum, &DeviceDataFlash.depthMaximum); | |
1196 } | |
1197 if(global.deviceData.diveCycles.value_int32 < DeviceDataFlash.diveCycles.value_int32) | |
1198 { | |
1199 scheduleCopyDeviceData(&global.deviceData.diveCycles, &DeviceDataFlash.diveCycles); | |
1200 } | |
1201 if(global.deviceData.hoursOfOperation.value_int32 < DeviceDataFlash.hoursOfOperation.value_int32) | |
1202 { | |
1203 scheduleCopyDeviceData(&global.deviceData.hoursOfOperation, &DeviceDataFlash.hoursOfOperation); | |
1204 } | |
1205 | |
1206 /* min values */ | |
1207 if(global.deviceData.temperatureMinimum.value_int32 > DeviceDataFlash.temperatureMinimum.value_int32) | |
1208 { | |
1209 scheduleCopyDeviceData(&global.deviceData.temperatureMinimum, &DeviceDataFlash.temperatureMinimum); | |
1210 } | |
1211 if(global.deviceData.voltageMinimum.value_int32 > DeviceDataFlash.voltageMinimum.value_int32) | |
1212 { | |
1213 scheduleCopyDeviceData(&global.deviceData.voltageMinimum, &DeviceDataFlash.voltageMinimum); | |
1214 } | |
1215 } | |
1216 | |
1217 /* second step, sensor data */ | |
1218 int32_t temperature_centigrad_int32; | |
1219 int32_t pressure_mbar_int32; | |
1220 int32_t voltage_mvolt_int32; | |
1221 | |
1222 temperature_centigrad_int32 = (int32_t)(get_temperature() * 100); | |
1223 if(temperature_centigrad_int32 < global.deviceData.temperatureMinimum.value_int32) | |
1224 { | |
1225 global.deviceData.temperatureMinimum.value_int32 = temperature_centigrad_int32; | |
88 | 1226 scheduleSetDate(&global.deviceData.temperatureMinimum); |
38 | 1227 } |
1228 | |
1229 if(temperature_centigrad_int32 > global.deviceData.temperatureMaximum.value_int32) | |
1230 { | |
1231 global.deviceData.temperatureMaximum.value_int32 = temperature_centigrad_int32; | |
88 | 1232 scheduleSetDate(&global.deviceData.temperatureMaximum); |
38 | 1233 } |
1234 | |
1235 pressure_mbar_int32 = (int32_t)get_pressure_mbar(); | |
1236 if(pressure_mbar_int32 > global.deviceData.depthMaximum.value_int32) | |
1237 { | |
1238 global.deviceData.depthMaximum.value_int32 = pressure_mbar_int32; | |
88 | 1239 scheduleSetDate(&global.deviceData.depthMaximum); |
38 | 1240 } |
1241 | |
1242 voltage_mvolt_int32 = (int32_t)(get_voltage() * 1000); | |
1243 if(voltage_mvolt_int32 < global.deviceData.voltageMinimum.value_int32) | |
1244 { | |
1245 global.deviceData.voltageMinimum.value_int32 = voltage_mvolt_int32; | |
88 | 1246 scheduleSetDate(&global.deviceData.voltageMinimum); |
38 | 1247 } |
1248 | |
1249 /* third step, counter */ | |
1250 switch (global.mode) | |
1251 { | |
1252 case MODE_SURFACE: | |
1253 case MODE_DIVE: | |
1254 default: | |
1255 deviceDataSubSeconds++; | |
1256 if(deviceDataSubSeconds > 10) | |
1257 { | |
1258 deviceDataSubSeconds = 0; | |
1259 global.deviceData.hoursOfOperation.value_int32++; | |
1260 } | |
1261 break; | |
1262 | |
1263 case MODE_SLEEP: | |
1264 case MODE_SHUTDOWN: | |
1265 break; | |
1266 } | |
1267 } | |
1268 | |
1269 | |
1270 void scheduleUpdateDeviceDataChargerFull(void) | |
1271 { | |
1272 global.deviceData.batteryChargeCompleteCycles.value_int32++; | |
88 | 1273 scheduleSetDate(&global.deviceData.batteryChargeCompleteCycles); |
38 | 1274 } |
1275 | |
1276 | |
1277 void scheduleUpdateDeviceDataChargerCharging(void) | |
1278 { | |
1279 global.deviceData.batteryChargeCycles.value_int32++; | |
88 | 1280 scheduleSetDate(&global.deviceData.batteryChargeCycles); |
38 | 1281 } |
1282 | |
1283 | |
1284 /** | |
1285 ****************************************************************************** | |
1286 * @brief vpm_crush / calls vpm calc_crushing_pressure every four seconds during descend | |
1287 * @author Peter Ryser | |
1288 * @version V0.0.1 | |
1289 * @date 22-April-2014 | |
1290 ****************************************************************************** | |
1291 */ | |
1292 _Bool vpm_crush2(void) | |
1293 { | |
1294 int i = 0; | |
1295 static float starting_ambient_pressure = 0; | |
1296 static float ending_ambient_pressure = 0; | |
1297 static float time_calc_begin = -1; | |
1298 static float initial_helium_pressure[16]; | |
1299 static float initial_nitrogen_pressure[16]; | |
1300 ending_ambient_pressure = global.lifeData.pressure_ambient_bar * 10; | |
1301 | |
1302 if((global.lifeData.dive_time_seconds <= 4) || (starting_ambient_pressure >= ending_ambient_pressure)) | |
1303 { | |
1304 time_calc_begin = global.lifeData.dive_time_seconds; | |
1305 starting_ambient_pressure = global.lifeData.pressure_ambient_bar * 10; | |
1306 for( i = 0; i < 16; i++) | |
1307 { | |
1308 initial_helium_pressure[i] = global.lifeData.tissue_helium_bar[i] * 10; | |
1309 initial_nitrogen_pressure[i] = global.lifeData.tissue_nitrogen_bar[i] * 10; | |
1310 } | |
1311 return 0; | |
1312 } | |
1313 if(global.lifeData.dive_time_seconds - time_calc_begin >= 4) | |
1314 { | |
1315 if(ending_ambient_pressure > starting_ambient_pressure + 0.5f) | |
1316 { | |
1317 float rate = (ending_ambient_pressure - starting_ambient_pressure) * 60 / 4; | |
1318 calc_crushing_pressure(&global.lifeData, &global.vpm, initial_helium_pressure, initial_nitrogen_pressure, starting_ambient_pressure, rate); | |
1319 | |
1320 time_calc_begin = global.lifeData.dive_time_seconds; | |
1321 starting_ambient_pressure = global.lifeData.pressure_ambient_bar * 10; | |
1322 for( i = 0; i < 16; i++) | |
1323 { | |
1324 initial_helium_pressure[i] = global.lifeData.tissue_helium_bar[i] * 10; | |
1325 initial_nitrogen_pressure[i] = global.lifeData.tissue_nitrogen_bar[i] * 10; | |
1326 } | |
1327 | |
1328 return 1; | |
1329 } | |
1330 | |
1331 } | |
1332 return 0; | |
1333 } | |
1334 | |
1335 | |
1336 long get_nofly_time_minutes(void) | |
1337 { | |
1338 | |
1339 if(global.no_fly_time_minutes <= 0) | |
1340 return 0; | |
1341 | |
1342 long minutes_since_last_dive = global.seconds_since_last_dive/60; | |
1343 | |
1344 if((global.seconds_since_last_dive > 0) && (global.no_fly_time_minutes > minutes_since_last_dive)) | |
1345 { | |
1346 return (global.no_fly_time_minutes - minutes_since_last_dive); | |
1347 } | |
1348 else | |
1349 { | |
1350 global.no_fly_time_minutes = 0; | |
1351 return 0; | |
1352 } | |
1353 } | |
1354 | |
1355 | |
1356 //Supports threadsave copying!!! | |
1357 void copyActualGas(SGas gas) | |
1358 { | |
1359 uint8_t whichGas = !global.whichGas; | |
1360 global.aktualGas[whichGas] = gas; | |
1361 global.whichGas = whichGas; | |
1362 } | |
1363 | |
1364 | |
1365 //Supports threadsave copying!!! | |
1366 void copyPressureData(void) | |
1367 { | |
240
625d20070261
Improvement SPI stability/recoverability
Jan Mulder <jlmulder@xs4all.nl>
parents:
231
diff
changeset
|
1368 global.dataSendToMaster.sensorErrors = global.I2C_SystemStatus; |
38 | 1369 uint8_t boolPressureData = !global.dataSendToMaster.boolPressureData; |
1370 global.dataSendToMaster.data[boolPressureData].temperature = get_temperature(); | |
1371 global.dataSendToMaster.data[boolPressureData].pressure_mbar = get_pressure_mbar(); | |
1372 global.dataSendToMaster.data[boolPressureData].surface_mbar = get_surface_mbar(); | |
1373 global.dataSendToMaster.data[boolPressureData].ascent_rate_meter_per_min = global.lifeData.ascent_rate_meter_per_min; | |
1374 global.dataSendToMaster.data[boolPressureData].pressure_uTick = HAL_GetTick(); | |
1375 global.dataSendToMaster.boolPressureData = boolPressureData; | |
1376 } | |
1377 | |
1378 | |
1379 //Supports threadsave copying!!! | |
1380 void copyCnsAndOtuData(void) | |
1381 { | |
1382 //uint8_t dataSendToMaster. | |
1383 uint8_t boolToxicData = !global.dataSendToMaster.boolToxicData; | |
1384 global.dataSendToMaster.data[boolToxicData].cns = global.lifeData.cns; | |
1385 global.dataSendToMaster.data[boolToxicData].otu = global.lifeData.otu; | |
1386 global.dataSendToMaster.data[boolToxicData].desaturation_time_minutes = global.lifeData.desaturation_time_minutes; | |
1387 global.dataSendToMaster.data[boolToxicData].no_fly_time_minutes = get_nofly_time_minutes(); | |
1388 global.dataSendToMaster.boolToxicData = boolToxicData; | |
1389 } | |
1390 | |
1391 | |
1392 //Supports threadsave copying!!! | |
1393 void copyTimeData(void) | |
1394 { | |
1395 extern RTC_HandleTypeDef RTCHandle; | |
1396 | |
1397 uint8_t boolTimeData = !global.dataSendToMaster.boolTimeData; | |
1398 global.dataSendToMaster.data[boolTimeData].localtime_rtc_tr = (uint32_t)(RTCHandle.Instance->TR & RTC_TR_RESERVED_MASK); | |
1399 global.dataSendToMaster.data[boolTimeData].localtime_rtc_dr = (uint32_t)(RTCHandle.Instance->DR & RTC_DR_RESERVED_MASK); | |
1400 global.dataSendToMaster.data[boolTimeData].divetime_seconds = (uint32_t)global.lifeData.dive_time_seconds; | |
1401 global.dataSendToMaster.data[boolTimeData].dive_time_seconds_without_surface_time = (uint32_t)global.lifeData.dive_time_seconds_without_surface_time; | |
1402 global.dataSendToMaster.data[boolTimeData].surfacetime_seconds = (uint32_t)global.seconds_since_last_dive; | |
1403 global.dataSendToMaster.data[boolTimeData].counterSecondsShallowDepth = (uint32_t)global.lifeData.counterSecondsShallowDepth; | |
1404 global.dataSendToMaster.boolTimeData = boolTimeData; | |
1405 } | |
1406 | |
1407 | |
1408 //Supports threadsave copying!!! | |
1409 void copyCompassData(void) | |
1410 { | |
1411 extern float compass_heading; | |
1412 extern float compass_roll; | |
1413 extern float compass_pitch; | |
1414 //uint8_t dataSendToMaster. | |
1415 uint8_t boolCompassData = !global.dataSendToMaster.boolCompassData; | |
1416 global.dataSendToMaster.data[boolCompassData].compass_heading = compass_heading; | |
1417 global.dataSendToMaster.data[boolCompassData].compass_roll = compass_roll; | |
1418 global.dataSendToMaster.data[boolCompassData].compass_pitch = compass_pitch; | |
1419 global.dataSendToMaster.data[boolCompassData].compass_DX_f = 0; | |
1420 global.dataSendToMaster.data[boolCompassData].compass_DY_f = 0; | |
1421 global.dataSendToMaster.data[boolCompassData].compass_DZ_f = 0; | |
1422 global.dataSendToMaster.data[boolCompassData].compass_uTick = HAL_GetTick(); | |
1423 global.dataSendToMaster.boolCompassData = boolCompassData; | |
1424 } | |
1425 | |
1426 | |
1427 void copyCompassDataDuringCalibration(int16_t dx, int16_t dy, int16_t dz) | |
1428 { | |
1429 extern float compass_heading; | |
1430 extern float compass_roll; | |
1431 extern float compass_pitch; | |
1432 //uint8_t dataSendToMaster. | |
1433 uint8_t boolCompassData = !global.dataSendToMaster.boolCompassData; | |
1434 global.dataSendToMaster.data[boolCompassData].compass_heading = compass_heading; | |
1435 global.dataSendToMaster.data[boolCompassData].compass_roll = compass_roll; | |
1436 global.dataSendToMaster.data[boolCompassData].compass_pitch = compass_pitch; | |
1437 global.dataSendToMaster.data[boolCompassData].compass_DX_f = dx; | |
1438 global.dataSendToMaster.data[boolCompassData].compass_DY_f = dy; | |
1439 global.dataSendToMaster.data[boolCompassData].compass_DZ_f = dz; | |
1440 global.dataSendToMaster.boolCompassData = boolCompassData; | |
1441 } | |
1442 | |
1443 | |
1444 //Supports threadsave copying!!! | |
1445 void copyBatteryData(void) | |
1446 { | |
1447 uint8_t boolBatteryData = !global.dataSendToMaster.boolBatteryData; | |
1448 global.dataSendToMaster.data[boolBatteryData].battery_voltage = get_voltage(); | |
1449 global.dataSendToMaster.data[boolBatteryData].battery_charge= get_charge(); | |
1450 global.dataSendToMaster.boolBatteryData = boolBatteryData; | |
1451 } | |
1452 | |
1453 | |
1454 //Supports threadsave copying!!! | |
1455 void copyAmbientLightData(void) | |
1456 { | |
1457 uint8_t boolAmbientLightData = !global.dataSendToMaster.boolAmbientLightData; | |
1458 global.dataSendToMaster.data[boolAmbientLightData].ambient_light_level = get_ambient_light_level(); | |
1459 global.dataSendToMaster.boolAmbientLightData = boolAmbientLightData; | |
1460 } | |
1461 | |
1462 | |
1463 //Supports threadsave copying!!! | |
1464 void copyTissueData(void) | |
1465 { | |
1466 //uint8_t dataSendToMaster. | |
1467 uint8_t boolTisssueData = !global.dataSendToMaster.boolTisssueData; | |
1468 for(int i = 0; i < 16; i++) | |
1469 { | |
1470 global.dataSendToMaster.data[boolTisssueData].tissue_nitrogen_bar[i] = global.lifeData.tissue_nitrogen_bar[i]; | |
1471 global.dataSendToMaster.data[boolTisssueData].tissue_helium_bar[i] = global.lifeData.tissue_helium_bar[i]; | |
1472 } | |
1473 global.dataSendToMaster.boolTisssueData = boolTisssueData; | |
1474 } | |
1475 | |
1476 | |
1477 //Supports threadsave copying!!! | |
1478 void copyVpmCrushingData(void) | |
1479 { | |
1480 //uint8_t dataSendToMaster. | |
1481 uint8_t boolCrushingData = !global.dataSendToMaster.boolCrushingData; | |
1482 for(int i = 0; i < 16; i++) | |
1483 { | |
1484 global.dataSendToMaster.data[boolCrushingData].max_crushing_pressure_n2[i] = global.vpm.max_crushing_pressure_n2[i]; | |
1485 global.dataSendToMaster.data[boolCrushingData].max_crushing_pressure_he[i] = global.vpm.max_crushing_pressure_he[i]; | |
1486 global.dataSendToMaster.data[boolCrushingData].adjusted_critical_radius_he[i] = global.vpm.adjusted_critical_radius_he[i]; | |
1487 global.dataSendToMaster.data[boolCrushingData].adjusted_critical_radius_n2[i] = global.vpm.adjusted_critical_radius_n2[i]; | |
1488 } | |
1489 global.dataSendToMaster.boolCrushingData = boolCrushingData; | |
1490 } | |
1491 | |
1492 | |
1493 void copyDeviceData(void) | |
1494 { | |
1495 uint8_t boolDeviceData = !global.deviceDataSendToMaster.boolDeviceData; | |
1496 memcpy(&global.deviceDataSendToMaster.DeviceData[boolDeviceData], &global.deviceData,sizeof(SDevice)); | |
1497 global.deviceDataSendToMaster.boolDeviceData = boolDeviceData; | |
1498 | |
1499 global.deviceDataSendToMaster.boolVpmRepetitiveDataValid = 0; | |
1500 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.adjusted_critical_radius_he, &global.vpm.adjusted_critical_radius_he, sizeof(16*4)); | |
1501 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.adjusted_critical_radius_n2, &global.vpm.adjusted_critical_radius_n2, sizeof(16*4)); | |
1502 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.adjusted_crushing_pressure_he, &global.vpm.adjusted_crushing_pressure_he, sizeof(16*4)); | |
1503 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.adjusted_crushing_pressure_n2, &global.vpm.adjusted_crushing_pressure_n2, sizeof(16*4)); | |
1504 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.initial_allowable_gradient_he, &global.vpm.initial_allowable_gradient_he, sizeof(16*4)); | |
1505 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.initial_allowable_gradient_n2, &global.vpm.initial_allowable_gradient_n2, sizeof(16*4)); | |
1506 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.max_actual_gradient, &global.vpm.max_actual_gradient, sizeof(16*4)); | |
1507 global.deviceDataSendToMaster.VpmRepetitiveData.repetitive_variables_not_valid = global.vpm.repetitive_variables_not_valid; | |
1508 global.deviceDataSendToMaster.boolVpmRepetitiveDataValid = 1; | |
1509 } | |
1510 | |
1511 /* copyPICdata(); is used in spi.c */ | |
1512 void copyPICdata(void) | |
1513 { | |
1514 uint8_t boolPICdata = !global.dataSendToMaster.boolPICdata; | |
1515 for(int i = 0; i < 3; i++) | |
1516 { | |
1517 global.dataSendToMaster.data[boolPICdata].button_setting[i] = global.ButtonPICdata[i]; | |
1518 } | |
1519 global.dataSendToMaster.boolPICdata = boolPICdata; | |
1520 } | |
1521 | |
1522 | |
1523 typedef enum | |
1524 { | |
1525 SPI3_OK = 0x00, | |
1526 SPI3_DEINIT = 0x01, | |
1527 } SPI3_StatusTypeDef; | |
1528 /* if spi3 is running and the SPI3_ButtonAdjust call returns OK, all is fine | |
1529 if the SPI3_ButtonAdjust call returns error, the spi3 is DeInit | |
1530 and will be init the next call of scheduleSetButtonResponsiveness() | |
1531 and data will be send again on the third call | |
1532 therefore on return 0 of scheduleSetButtonResponsiveness() the caller flag should kept active | |
1533 */ | |
1534 uint8_t scheduleSetButtonResponsiveness(void) | |
1535 { | |
1536 static uint8_t SPI3status = SPI3_OK; | |
1537 | |
1538 if((SPI3status == SPI3_OK) && (SPI3_ButtonAdjust(global.ButtonResponsiveness, global.ButtonPICdata))) | |
1539 { | |
1540 copyPICdata(); | |
1541 return 1; | |
1542 } | |
1543 else | |
1544 { | |
1545 for(int i=0;i<3;i++) | |
1546 { | |
1547 global.ButtonPICdata[i] = 0xFF; | |
1548 } | |
1549 copyPICdata(); | |
1550 | |
1551 if(SPI3status == SPI3_OK) | |
1552 { | |
1553 MX_SPI3_DeInit(); | |
1554 SPI3status = SPI3_DEINIT; | |
1555 } | |
1556 else | |
1557 { | |
1558 MX_SPI3_Init(); | |
1559 SPI3status = SPI3_OK; | |
1560 } | |
1561 return 0; | |
1562 } | |
1563 } | |
1564 | |
1565 | |
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
181
diff
changeset
|
1566 //save time difference |
38 | 1567 uint32_t time_elapsed_ms(uint32_t ticksstart,uint32_t ticksnow) |
1568 { | |
1569 if(ticksstart <= ticksnow) | |
1570 { | |
1571 return ticksnow - ticksstart; | |
1572 } | |
1573 else | |
1574 { | |
1575 return 0xFFFFFFFF - ticksstart + ticksnow; | |
1576 } | |
1577 } | |
1578 | |
1579 /* same as in data_central.c */ | |
310
95928ef3986f
Make dive mode detection more advanced
Jan Mulder <jlmulder@xs4all.nl>
parents:
301
diff
changeset
|
1580 _Bool is_ambient_pressure_close_to_surface(SLifeData *lifeData) |
38 | 1581 { |
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1582 if(lifeData->pressure_ambient_bar == INVALID_PREASURE_VALUE) /* as long as no valid data is available expect we are close to surface */ |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1583 { |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1584 return true; |
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1585 } |
310
95928ef3986f
Make dive mode detection more advanced
Jan Mulder <jlmulder@xs4all.nl>
parents:
301
diff
changeset
|
1586 if (lifeData->pressure_ambient_bar > 1.16) |
95928ef3986f
Make dive mode detection more advanced
Jan Mulder <jlmulder@xs4all.nl>
parents:
301
diff
changeset
|
1587 return false; |
95928ef3986f
Make dive mode detection more advanced
Jan Mulder <jlmulder@xs4all.nl>
parents:
301
diff
changeset
|
1588 else if(lifeData->pressure_ambient_bar < (lifeData->pressure_surface_bar + 0.1f)) // hw 161121 now 1 mter, before 0.04f |
38 | 1589 return true; |
1590 else | |
1591 return false; | |
1592 } | |
1593 | |
1594 | |
1595 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ | |
1596 |