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