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