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