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