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