Mercurial > public > ostc4
annotate Small_CPU/Src/scheduler.c @ 346:73325a78c907 FlightMode_Improvment
Added function to support manuel exit of dive mode
In some special cases the diver might want to exit the divemode manually. To avoid immediate return to dive mode the limit for starting next dive is increased for 30 minutes
author | ideenmodellierer |
---|---|
date | Thu, 03 Oct 2019 21:30:16 +0200 |
parents | b6a59e93cc91 |
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 |