Mercurial > public > ostc4
annotate Small_CPU/Src/scheduler.c @ 386:39c147e47c1c MotionDetection
Added key direction awarness to t3, t5 and t6 views:
In case of big font views the handling of motion events were not considered, As results all events caused a menu change in th same direction.
| author | ideenmodellierer |
|---|---|
| date | Mon, 21 Oct 2019 21:16:53 +0200 |
| parents | 9d82411d0afa |
| children | cb3870f79e9d |
| 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 { | |
| 554 scheduleUpdateLifeData(0); // includes tissues | |
| 555 global.lifeData.dive_time_seconds++; // there is dive_time_seconds_without_surface_time too | |
| 556 global.lifeData.ppO2 = decom_calc_ppO2(global.lifeData.pressure_ambient_bar, &global.lifeData.actualGas); | |
| 557 decom_oxygen_calculate_cns(&global.lifeData.cns,global.lifeData.ppO2); | |
| 558 decom_oxygen_calculate_otu(&global.lifeData.otu,global.lifeData.ppO2); | |
| 88 | 559 battery_gas_gauge_get_data(); |
| 38 | 560 |
| 561 | |
| 562 /** counter_exit allows safe exit via button for testing | |
| 563 * and demo_mode is exited too if aplicable. | |
| 564 */ | |
| 565 if(global.dataSendToMaster.mode == MODE_ENDDIVE) | |
| 566 { | |
| 567 counter_exit++; | |
| 568 if(counter_exit >= 2) | |
| 569 { | |
| 570 global.mode = MODE_SURFACE; | |
| 571 global.demo_mode = 0; | |
| 572 } | |
| 573 } | |
|
346
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
574 |
| 38 | 575 if(is_ambient_pressure_close_to_surface(&global.lifeData)) |
| 576 { | |
| 577 global.lifeData.counterSecondsShallowDepth++; | |
|
346
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
578 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
|
579 || (ManualExitDiveCounter)) |
| 38 | 580 { |
| 581 global.seconds_since_last_dive = 1; // start counter | |
| 582 schedule_update_timer_helper(0); // zum starten :-) | |
| 583 global.dataSendToMaster.mode = MODE_ENDDIVE; | |
| 584 global.deviceDataSendToMaster.mode = MODE_ENDDIVE; | |
| 585 } | |
| 586 } | |
| 587 else | |
| 588 { | |
| 589 global.lifeData.counterSecondsShallowDepth = 0; | |
| 590 global.lifeData.dive_time_seconds_without_surface_time++; | |
| 591 } | |
| 592 vpm_crush2(); | |
| 593 } | |
| 594 else // DIVEMODE_Apnea | |
| 595 { | |
| 596 global.lifeData.dive_time_seconds++; | |
| 597 | |
| 598 // exit dive mode | |
| 599 if(global.dataSendToMaster.mode == MODE_ENDDIVE) | |
| 600 { | |
| 601 counter_exit++; | |
| 602 if(counter_exit >= 2) | |
| 603 { | |
| 604 scheduleUpdateLifeData(-1); // 'restart' tissue calculations without calculating time during apnea mode | |
| 605 global.lifeData.dive_time_seconds = 0; // use backup noflytime and desaturation time | |
| 606 global.mode = MODE_SURFACE; | |
| 607 global.demo_mode = 0; | |
| 608 } | |
| 609 } | |
| 610 | |
| 611 // surface break | |
| 612 if(is_ambient_pressure_close_to_surface(&global.lifeData)) | |
| 613 { | |
| 614 global.lifeData.counterSecondsShallowDepth++; | |
| 615 if(global.lifeData.counterSecondsShallowDepth > 3) // time for main cpu to copy to apnea_last_dive_time_seconds | |
| 616 { | |
| 617 global.lifeData.dive_time_seconds = 0; // this apnea dive ends here | |
| 618 } | |
|
346
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
619 if((global.lifeData.counterSecondsShallowDepth >= global.settings.timeoutDiveReachedZeroDepth) || (ManualExitDiveCounter)) |
| 38 | 620 { |
| 621 global.dataSendToMaster.mode = MODE_ENDDIVE; | |
| 622 global.deviceDataSendToMaster.mode = MODE_ENDDIVE; | |
| 623 } | |
| 624 } | |
| 625 else | |
| 626 { | |
| 627 global.lifeData.counterSecondsShallowDepth = 0; | |
| 628 global.lifeData.dive_time_seconds_without_surface_time++; | |
| 629 } | |
| 630 } // standard dive or DIVEMODE_Apnea | |
| 631 | |
| 88 | 632 copyVpmCrushingData(); |
| 633 copyTimeData(); | |
| 634 copyCnsAndOtuData(); | |
| 635 copyBatteryData(); | |
| 38 | 636 |
| 88 | 637 // new hw 170523 |
| 638 if(global.I2C_SystemStatus != HAL_OK) | |
| 639 { | |
| 640 MX_I2C1_TestAndClear(); | |
| 641 MX_I2C1_Init(); | |
|
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
642 init_pressure(); |
| 88 | 643 } |
|
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
644 } |
|
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
645 if(ticksdiff >= 1000) |
|
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
646 { |
|
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
647 /* reset counter */ |
|
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
648 Scheduler.tickstart = HAL_GetTick(); |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
649 Scheduler.counterSPIdata100msec = 0; |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
650 Scheduler.counterCompass100msec = 0; |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
651 Scheduler.counterPressure100msec = 0; |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
652 Scheduler.counterAmbientLight100msec = 0; |
|
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
653 Scheduler.tick_execute1second = SCHEDULER_TICK_EXE1SEC; |
| 38 | 654 } |
| 655 } | |
| 656 } | |
| 657 | |
| 658 | |
| 659 /** | |
| 660 ****************************************************************************** | |
| 661 * @brief scheduleSurfaceMode / surface mode: Main Loop | |
| 662 * @author Peter Ryser | |
| 663 * @version V0.0.1 | |
| 664 * @date 22-April-2014 | |
| 665 ****************************************************************************** | |
| 666 */ | |
| 667 | |
| 668 | |
| 669 // =============================================================================== | |
| 670 // scheduleTestMode | |
| 671 /// @brief included for sealed hardware with permanent RTE update message | |
| 672 // =============================================================================== | |
| 673 void scheduleTestMode(void) | |
| 674 { | |
| 675 uint32_t ticksdiff = 0; | |
| 676 uint32_t lasttick = 0; | |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
677 Scheduler.tickstart = HAL_GetTick(); |
| 38 | 678 |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
679 Scheduler.counterPressure100msec = 0; |
| 38 | 680 |
| 681 float temperature_carousel = 0.0f; | |
| 682 float temperature_changer = 0.1f; | |
| 683 | |
| 684 while(global.mode == MODE_TEST) | |
| 685 { | |
| 686 lasttick = HAL_GetTick(); | |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
687 ticksdiff = time_elapsed_ms(Scheduler.tickstart,lasttick); |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
688 |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
689 //Evaluate received data at 10 ms, 110 ms, 210 ms,... |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
690 if(ticksdiff >= Scheduler.counterSPIdata100msec * 100 + 10) |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
691 { |
| 277 | 692 if(SPI_Evaluate_RX_Data()!=0) /* did we receive something ? */ |
| 693 { | |
| 694 Scheduler.counterSPIdata100msec++; | |
| 695 } | |
| 696 schedule_check_resync(); | |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
697 } |
| 38 | 698 |
| 699 //Evaluate pressure at 20 ms, 120 ms, 220 ms,... | |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
700 if(ticksdiff >= Scheduler.counterPressure100msec * 100 + 20) |
| 38 | 701 { |
| 702 global.check_sync_not_running++; | |
| 703 | |
| 277 | 704 pressure_update_alternating(); |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
705 scheduleUpdateDeviceData(); |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
706 global.lifeData.ascent_rate_meter_per_min = 0; |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
707 copyPressureData(); |
| 38 | 708 |
| 709 if(temperature_carousel > 20.0f) | |
| 710 { | |
| 711 temperature_carousel = 20.0f; | |
| 712 temperature_changer = -0.1f; | |
| 713 } | |
| 714 else | |
| 715 if(temperature_carousel < 0) | |
| 716 { | |
| 717 temperature_carousel = 0; | |
| 718 temperature_changer = +0.1f; | |
| 719 } | |
| 720 | |
| 721 temperature_carousel += temperature_changer; | |
| 722 | |
| 723 uint8_t boolPressureData = !global.dataSendToMaster.boolPressureData; | |
| 724 | |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
725 global.dataSendToMaster.data[boolPressureData].pressure_mbar = get_pressure_mbar(); |
| 38 | 726 |
| 727 global.dataSendToMaster.data[boolPressureData].temperature = temperature_carousel; | |
| 728 global.dataSendToMaster.data[boolPressureData].pressure_uTick = HAL_GetTick(); | |
| 729 global.dataSendToMaster.boolPressureData = boolPressureData; | |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
730 Scheduler.counterPressure100msec++; |
| 38 | 731 } |
| 732 | |
| 733 if(ticksdiff >= 1000) | |
| 734 { | |
| 735 //Set back tick counter | |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
736 Scheduler.tickstart = HAL_GetTick(); |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
737 Scheduler.counterPressure100msec = 0; |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
738 Scheduler.counterSPIdata100msec = 0; |
| 38 | 739 } |
| 740 }; | |
| 741 } | |
| 742 | |
| 743 | |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
744 |
| 38 | 745 void scheduleSurfaceMode(void) |
| 746 { | |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
747 |
| 38 | 748 uint32_t ticksdiff = 0; |
| 749 uint32_t lasttick = 0; | |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
750 Scheduler.tickstart = HAL_GetTick(); |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
751 Scheduler.counterSPIdata100msec = 0; |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
752 Scheduler.counterCompass100msec = 0; |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
753 Scheduler.counterPressure100msec = 0; |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
754 Scheduler.counterAmbientLight100msec = 0; |
|
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
755 Scheduler.tick_execute1second = SCHEDULER_TICK_EXE1SEC; |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
756 |
| 38 | 757 global.dataSendToMaster.mode = MODE_SURFACE; |
| 758 global.deviceDataSendToMaster.mode = MODE_SURFACE; | |
| 759 | |
| 760 while(global.mode == MODE_SURFACE) | |
| 761 { | |
| 277 | 762 |
| 38 | 763 lasttick = HAL_GetTick(); |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
764 ticksdiff = time_elapsed_ms(Scheduler.tickstart,lasttick); |
| 38 | 765 |
| 766 if(setButtonsNow == 1) | |
| 767 { | |
| 768 if(scheduleSetButtonResponsiveness()) | |
| 769 setButtonsNow = 0; | |
| 770 } | |
| 771 | |
|
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
772 /* 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
|
773 if(ticksdiff >= Scheduler.counterSPIdata100msec * 100 + 10) |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
774 { |
|
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
775 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
|
776 { |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
777 Scheduler.counterSPIdata100msec++; |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
778 } |
| 277 | 779 schedule_check_resync(); |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
780 } |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
781 |
|
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
782 /* 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
|
783 if(ticksdiff >= Scheduler.counterPressure100msec * 100 + 20) |
| 38 | 784 { |
| 785 global.check_sync_not_running++; | |
| 277 | 786 pressure_update_alternating(); |
| 135 | 787 scheduleUpdateDeviceData(); |
| 38 | 788 global.lifeData.ascent_rate_meter_per_min = 0; |
| 135 | 789 copyPressureData(); |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
790 Scheduler.counterPressure100msec++; |
| 135 | 791 |
|
301
a09b1855d656
cleanup, RTE: factor out scheduleCheck_pressure_reached_dive_mode_level
Jan Mulder <jlmulder@xs4all.nl>
parents:
277
diff
changeset
|
792 if (!is_ambient_pressure_close_to_surface(&global.lifeData)) |
| 38 | 793 global.mode = MODE_DIVE; |
| 794 } | |
| 795 | |
|
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
796 /* 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
|
797 if(ticksdiff >= Scheduler.counterCompass100msec * 100 + 50) |
| 135 | 798 { |
| 799 compass_read(); | |
| 800 acceleration_read(); | |
| 801 compass_calc(); | |
| 802 copyCompassData(); | |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
803 Scheduler.counterCompass100msec++; |
| 135 | 804 } |
| 38 | 805 |
|
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
806 /* 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
|
807 if(ticksdiff >= Scheduler.counterAmbientLight100msec * 100 + 70) |
| 38 | 808 { |
| 809 adc_ambient_light_sensor_get_data(); | |
| 810 copyAmbientLightData(); | |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
811 Scheduler.counterAmbientLight100msec++; |
| 38 | 812 } |
|
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
813 |
|
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
814 |
|
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
815 |
|
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
816 /* 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
|
817 if(ticksdiff >= Scheduler.tick_execute1second) |
| 38 | 818 { |
|
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
819 Scheduler.tick_execute1second = 0xFFFFFFFF; |
| 38 | 820 if(clearDecoNow) |
| 821 { | |
| 822 decom_reset_with_1000mbar(&global.lifeData); ///< this should almost reset desaturation time | |
| 823 // new 160215 hw | |
| 824 global.repetitive_dive = 0; | |
| 825 global.seconds_since_last_dive = 0; ///< this will reset OTU and CNS as well | |
| 826 global.no_fly_time_minutes = 0; | |
| 827 global.accidentFlag = 0; | |
| 828 global.accidentRemainingSeconds = 0; | |
| 829 vpm_init(&global.vpm, global.conservatism, global.repetitive_dive, global.seconds_since_last_dive); | |
| 830 clearDecoNow = 0; | |
| 831 } | |
| 89 | 832 |
|
349
9d82411d0afa
Decrease ManualExitDiveCounter in surface mode
ideenmodellierer
parents:
346
diff
changeset
|
833 if(ManualExitDiveCounter) |
|
9d82411d0afa
Decrease ManualExitDiveCounter in surface mode
ideenmodellierer
parents:
346
diff
changeset
|
834 { |
|
9d82411d0afa
Decrease ManualExitDiveCounter in surface mode
ideenmodellierer
parents:
346
diff
changeset
|
835 ManualExitDiveCounter--; |
|
9d82411d0afa
Decrease ManualExitDiveCounter in surface mode
ideenmodellierer
parents:
346
diff
changeset
|
836 } |
|
9d82411d0afa
Decrease ManualExitDiveCounter in surface mode
ideenmodellierer
parents:
346
diff
changeset
|
837 |
| 38 | 838 if(global.seconds_since_last_dive) |
| 839 { | |
| 840 schedule_update_timer_helper(-1); | |
| 841 } | |
| 89 | 842 |
| 38 | 843 if(global.accidentRemainingSeconds) |
| 844 { | |
| 845 global.accidentRemainingSeconds--; | |
| 846 if(!global.accidentRemainingSeconds) | |
| 847 global.accidentFlag = 0; | |
| 848 } | |
| 849 global.dataSendToMaster.accidentFlags = global.accidentFlag; | |
| 89 | 850 |
| 38 | 851 update_surface_pressure(1); |
| 852 scheduleUpdateLifeData(0); | |
| 853 decom_oxygen_calculate_otu_degrade(&global.lifeData.otu, global.seconds_since_last_dive); | |
| 854 decom_oxygen_calculate_cns_degrade(&global.lifeData.cns, global.seconds_since_last_dive); | |
| 135 | 855 |
| 856 /* start desaturation calculation after first valid measurement has been done */ | |
| 857 if(global.lifeData.pressure_surface_bar != INVALID_PREASURE_VALUE) | |
| 858 { | |
| 859 global.lifeData.desaturation_time_minutes = decom_calc_desaturation_time(global.lifeData.tissue_nitrogen_bar,global.lifeData.tissue_helium_bar,global.lifeData.pressure_surface_bar); | |
| 860 } | |
| 861 else | |
| 862 { | |
| 863 global.lifeData.desaturation_time_minutes = 0; | |
| 864 } | |
| 38 | 865 battery_charger_get_status_and_contral_battery_gas_gauge(0); |
| 88 | 866 battery_gas_gauge_get_data(); |
| 89 | 867 |
| 88 | 868 copyCnsAndOtuData(); |
| 869 copyTimeData(); | |
| 870 copyBatteryData(); | |
| 871 copyDeviceData(); | |
| 38 | 872 |
|
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
873 /* check if I2C is not up an running and try to reactivate if necessary. Also do initialization if problem occured during startup */ |
| 88 | 874 if(global.I2C_SystemStatus != HAL_OK) |
| 875 { | |
| 876 MX_I2C1_TestAndClear(); | |
| 877 MX_I2C1_Init(); | |
|
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
878 if(global.I2C_SystemStatus == HAL_OK) |
| 88 | 879 { |
| 880 init_pressure(); | |
|
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
881 if(is_init_pressure_done()) /* Init surface data with initial measurement */ |
|
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
882 { |
|
338
b6a59e93cc91
Added function to avoid divemode activation during Landing:
ideenmodellierer
parents:
331
diff
changeset
|
883 init_surface_ring(0); |
|
331
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 |
|
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
886 if(!battery_gas_gauge_CheckConfigOK()) |
|
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
887 { |
|
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
888 init_battery_gas_gauge(); |
|
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
889 } |
| 88 | 890 } |
| 891 } | |
|
220
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 |
|
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
894 if(ticksdiff >= 1000) |
|
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
895 { |
|
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
896 //Set back tick counter |
|
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
897 Scheduler.tickstart = HAL_GetTick(); |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
898 Scheduler.counterSPIdata100msec = 0; |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
899 Scheduler.counterCompass100msec = 0; |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
900 Scheduler.counterPressure100msec = 0; |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
901 Scheduler.counterAmbientLight100msec = 0; |
|
220
e524a824d8f2
Added schedule point for functions executed once in a second
ideenmodellierer
parents:
207
diff
changeset
|
902 Scheduler.tick_execute1second = SCHEDULER_TICK_EXE1SEC; |
| 38 | 903 } |
| 904 } | |
| 905 } | |
| 906 | |
| 207 | 907 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
|
908 { |
| 207 | 909 if( SyncMethod < SPI_SYNC_METHOD_INVALID) |
| 910 { | |
| 911 dospisync = SyncMethod; | |
| 912 } | |
| 913 } | |
| 914 | |
|
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
915 void Scheduler_SyncToSPI(uint8_t TXtick) |
| 207 | 916 { |
| 917 uint32_t deltatick = 0; | |
|
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
918 int8_t TXcompensation; |
| 207 | 919 |
| 920 switch(dospisync) | |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
921 { |
| 207 | 922 case SPI_SYNC_METHOD_HARD: |
| 923 //Set back tick counter | |
|
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
924 Scheduler.tickstart = HAL_GetTick() - 4; /* consider 4ms offset for transfer */ |
| 207 | 925 Scheduler.counterSPIdata100msec = 0; |
| 926 Scheduler.counterCompass100msec = 0; | |
| 927 Scheduler.counterPressure100msec = 0; | |
| 928 Scheduler.counterAmbientLight100msec = 0; | |
| 929 dospisync = SPI_SYNC_METHOD_NONE; | |
| 930 break; | |
| 931 case SPI_SYNC_METHOD_SOFT: | |
| 932 deltatick = time_elapsed_ms(Scheduler.tickstart,HAL_GetTick()); | |
| 933 deltatick %= 100; /* clip to 100ms window */ | |
| 934 if(Scheduler.tickstart - deltatick >= 0) /* adjust start time to the next 100ms window */ | |
| 935 { | |
| 936 Scheduler.tickstart -= deltatick; | |
| 937 } | |
| 938 else | |
| 939 { | |
| 940 Scheduler.tickstart = 0xFFFFFFFF- (deltatick - Scheduler.tickstart); | |
| 941 } | |
| 942 dospisync = SPI_SYNC_METHOD_NONE; | |
| 943 break; | |
|
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
944 default: /* continous sync activity */ |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
945 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
|
946 { |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
947 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
|
948 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
|
949 deltatick %= 100; |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
950 if(deltatick > 50) |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
951 { |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
952 TXcompensation = deltatick - 100; /* neg drift */ |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
953 } |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
954 else |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
955 { |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
956 TXcompensation = deltatick; /* pos drift */ |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
957 } |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
958 TXcompensation = TXtick - TXcompensation; |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
959 Scheduler.tickstart -= TXcompensation; |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
960 } |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
961 else |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
962 { |
|
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
963 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
|
964 } |
| 207 | 965 break; |
|
142
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
966 } |
|
69f4b8067daa
Use one global structure for all schedule counters
Ideenmodellierer
parents:
135
diff
changeset
|
967 } |
| 38 | 968 |
| 969 /** | |
| 970 ****************************************************************************** | |
| 971 * @brief scheduleCompassCalibrationMode | |
| 972 * @author heinrichs weikamp gmbh | |
| 973 * @version V0.0.1 | |
| 974 * @since 31-March-2015 | |
| 975 * @date 31-March-2015 | |
| 976 ****************************************************************************** | |
| 977 */ | |
| 978 void scheduleCompassCalibrationMode(void) | |
| 979 { | |
| 980 compass_init(1,7); // fast mode, max gain | |
| 981 compass_calib(); // duration : 1 minute! | |
| 982 compass_init(0,7); // back to normal mode | |
| 983 | |
| 984 if(global.seconds_since_last_dive) | |
| 985 { | |
| 986 schedule_update_timer_helper(-1); | |
| 987 } | |
| 988 | |
| 989 scheduleUpdateLifeData(0); | |
| 990 global.mode = MODE_SURFACE; | |
| 991 } | |
| 992 | |
| 993 | |
| 994 /** | |
| 995 ****************************************************************************** | |
| 996 * @brief scheduleSleepMode / sleep mode: Main Loop | |
| 997 * @author heinrichs weikamp gmbh | |
| 998 * @version V0.0.2 | |
| 999 * @since 31-March-2015 | |
| 1000 * @date 22-April-2014 | |
| 1001 ****************************************************************************** | |
| 1002 */ | |
| 1003 | |
| 1004 void scheduleSleepMode(void) | |
| 1005 { | |
| 1006 global.dataSendToMaster.mode = 0; | |
| 1007 global.deviceDataSendToMaster.mode = 0; | |
| 1008 | |
| 1009 /* prevent button wake up problem while in sleep_prepare | |
| 1010 * sleep prepare does I2C_DeInit() | |
| 1011 */ | |
| 1012 if(global.mode != MODE_SLEEP) | |
| 1013 MX_I2C1_Init(); | |
| 1014 else | |
| 1015 do | |
| 1016 { | |
| 1017 I2C_DeInit(); | |
| 1018 | |
| 1019 #ifdef DEBUGMODE | |
| 1020 HAL_Delay(2000); | |
| 1021 #else | |
| 1022 RTC_StopMode_2seconds(); | |
| 1023 #endif | |
| 1024 | |
| 1025 | |
| 1026 | |
| 1027 if(global.mode == MODE_SLEEP) | |
| 1028 secondsCount += 2; | |
| 1029 | |
| 1030 MX_I2C1_Init(); | |
| 1031 pressure_sensor_get_pressure_raw(); | |
| 1032 | |
|
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1033 /* 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
|
1034 if(global.I2C_SystemStatus != HAL_OK) |
|
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1035 { |
|
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1036 MX_I2C1_TestAndClear(); |
|
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1037 MX_I2C1_Init(); |
|
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1038 if(global.I2C_SystemStatus == HAL_OK) |
|
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1039 { |
|
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1040 init_pressure(); |
|
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 } |
|
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1043 |
| 38 | 1044 if(secondsCount >= 30) |
| 1045 { | |
| 1046 pressure_sensor_get_temperature_raw(); | |
| 1047 battery_gas_gauge_get_data(); | |
| 1048 // ReInit_battery_charger_status_pins(); | |
| 1049 battery_charger_get_status_and_contral_battery_gas_gauge(1); | |
| 1050 // DeInit_battery_charger_status_pins(); | |
| 1051 secondsCount = 0; | |
| 1052 } | |
| 1053 | |
| 1054 pressure_calculation(); | |
| 1055 | |
| 1056 scheduleUpdateDeviceData(); | |
| 1057 update_surface_pressure(2); | |
| 1058 | |
| 1059 if(global.seconds_since_last_dive) | |
| 1060 { | |
| 1061 schedule_update_timer_helper(-1); | |
| 1062 } | |
| 1063 | |
| 1064 if(global.accidentRemainingSeconds) | |
| 1065 { | |
| 1066 if(global.accidentRemainingSeconds > 2) | |
| 1067 global.accidentRemainingSeconds -= 2; | |
| 1068 else | |
| 1069 { | |
| 1070 global.accidentRemainingSeconds = 0; | |
| 1071 global.accidentFlag = 0; | |
| 1072 } | |
| 1073 } | |
| 1074 | |
|
338
b6a59e93cc91
Added function to avoid divemode activation during Landing:
ideenmodellierer
parents:
331
diff
changeset
|
1075 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
|
1076 || (global.lifeData.pressure_ambient_bar > START_DIVE_IMMEDIATLY_BAR)) |
|
b6a59e93cc91
Added function to avoid divemode activation during Landing:
ideenmodellierer
parents:
331
diff
changeset
|
1077 { |
| 38 | 1078 global.mode = MODE_BOOT; |
|
338
b6a59e93cc91
Added function to avoid divemode activation during Landing:
ideenmodellierer
parents:
331
diff
changeset
|
1079 } |
| 38 | 1080 scheduleUpdateLifeData(2000); |
| 1081 } | |
| 1082 while(global.mode == MODE_SLEEP); | |
| 1083 /* new section for system after Standby */ | |
| 1084 scheduleUpdateLifeData(-1); | |
| 1085 clearDecoNow = 0; | |
| 1086 setButtonsNow = 0; | |
|
264
b3685fbada3b
Sync to Main 100ms time stamp & added Reinitialization of globals after startup
ideenmodellierer
parents:
240
diff
changeset
|
1087 reinitGlobals(); |
| 38 | 1088 } |
| 1089 | |
| 1090 | |
| 1091 | |
| 1092 /* Private functions ---------------------------------------------------------*/ | |
| 1093 | |
| 1094 /** | |
| 1095 ****************************************************************************** | |
| 1096 * @brief scheduleUpdateLifeData / calculates tissues | |
| 1097 * @author Peter Ryser | |
| 1098 * @version V0.0.1 | |
| 1099 * @date 22-April-2014 | |
| 1100 ****************************************************************************** | |
| 1101 */ | |
| 1102 | |
| 1103 | |
| 1104 void scheduleUpdateLifeData(int32_t asynchron_milliseconds_since_last) | |
| 1105 { | |
| 1106 static _Bool first = 1; | |
| 1107 static uint32_t tickstart = 0; | |
| 1108 static uint32_t ticksrest = 0; | |
| 1109 | |
| 1110 uint32_t ticksdiff = 0; | |
| 1111 uint32_t ticksnow = 0; | |
| 1112 uint32_t time_seconds = 0; | |
| 1113 uint8_t whichGasTmp = 0; | |
| 1114 | |
| 135 | 1115 uint8_t updateTissueData = 0; |
| 1116 | |
| 1117 | |
| 1118 if(global.lifeData.pressure_surface_bar == INVALID_PREASURE_VALUE) | |
| 1119 { | |
| 1120 updateTissueData = 1; | |
| 1121 } | |
| 1122 | |
| 38 | 1123 if(asynchron_milliseconds_since_last < 0) |
| 1124 { | |
| 1125 first = 1; | |
| 1126 tickstart = 0; | |
| 1127 ticksrest = 0; | |
| 1128 return; | |
| 1129 } | |
| 1130 | |
| 1131 if(!asynchron_milliseconds_since_last && first) | |
| 1132 { | |
| 1133 tickstart = HAL_GetTick(); | |
| 1134 first = 0; | |
| 1135 return; | |
| 1136 } | |
| 1137 | |
| 1138 whichGasTmp = global.whichGas; | |
| 1139 global.lifeData.actualGas = global.aktualGas[whichGasTmp]; | |
| 1140 global.lifeData.pressure_ambient_bar = get_pressure_mbar() / 1000.0f; | |
| 1141 global.lifeData.pressure_surface_bar = get_surface_mbar() / 1000.0f; | |
| 1142 | |
| 135 | 1143 if(updateTissueData) |
| 1144 { | |
| 1145 decom_reset_with_ambientmbar(global.lifeData.pressure_surface_bar,&global.lifeData); | |
| 1146 } | |
| 1147 | |
| 38 | 1148 if(!asynchron_milliseconds_since_last) |
| 1149 { | |
| 1150 ticksnow = HAL_GetTick(); | |
| 1151 ticksdiff = time_elapsed_ms(tickstart,ticksnow); | |
| 1152 } | |
| 1153 else | |
| 1154 { | |
| 1155 first = 1; | |
| 1156 ticksdiff = asynchron_milliseconds_since_last; | |
| 1157 } | |
| 1158 | |
| 1159 if(ticksrest > 1000) // whatever happens after standby with STM32L476 | |
| 1160 ticksrest = 0; // maybe move static to SRAM2 | |
| 1161 | |
| 1162 ticksdiff += ticksrest; | |
| 1163 time_seconds = ticksdiff/ 1000; | |
| 1164 ticksrest = ticksdiff - time_seconds * 1000; | |
| 1165 tickstart = ticksnow; | |
| 1166 | |
| 1167 decom_tissues_exposure((int)time_seconds, &global.lifeData); | |
| 1168 if(global.demo_mode) | |
| 1169 decom_tissues_exposure((int)(3*time_seconds), &global.lifeData); | |
| 1170 copyTissueData(); | |
| 1171 } | |
| 1172 | |
| 1173 | |
| 1174 /** | |
| 1175 ****************************************************************************** | |
| 1176 * @brief scheduleUpdateDeviceData | |
| 1177 * @author heinrichs weikamp gmbh | |
| 1178 * @version V0.0.1 | |
| 1179 * @date 16-March-2015 | |
| 1180 * | |
| 1181 * two step process | |
| 1182 * first compare with data from main CPU == externalLogbookFlash | |
| 1183 * second update with new sensor data | |
| 1184 ****************************************************************************** | |
| 1185 */ | |
| 1186 void scheduleSetDate(SDeviceLine *line) | |
| 1187 { | |
| 1188 extern RTC_HandleTypeDef RTCHandle; | |
| 1189 | |
| 1190 line->date_rtc_dr = (uint32_t)(RTCHandle.Instance->DR & RTC_DR_RESERVED_MASK); | |
| 1191 line->time_rtc_tr = (uint32_t)(RTCHandle.Instance->TR & RTC_TR_RESERVED_MASK); | |
| 1192 } | |
| 1193 | |
| 1194 | |
| 1195 void scheduleCopyDeviceData(SDeviceLine *lineWrite, const SDeviceLine *lineRead) | |
| 1196 { | |
| 1197 lineWrite->date_rtc_dr = lineRead->date_rtc_dr; | |
| 1198 lineWrite->time_rtc_tr = lineRead->time_rtc_tr; | |
| 1199 lineWrite->value_int32 = lineRead->value_int32; | |
| 1200 } | |
| 1201 | |
| 1202 | |
| 1203 void scheduleUpdateDeviceData(void) | |
| 1204 { | |
| 1205 /* first step, main CPU */ | |
| 1206 | |
| 1207 if(deviceDataFlashValid) | |
| 1208 { | |
| 1209 /* max values */ | |
| 1210 if(global.deviceData.batteryChargeCompleteCycles.value_int32 < DeviceDataFlash.batteryChargeCompleteCycles.value_int32) | |
| 1211 { | |
| 1212 scheduleCopyDeviceData(&global.deviceData.batteryChargeCompleteCycles, &DeviceDataFlash.batteryChargeCompleteCycles); | |
| 1213 } | |
| 1214 if(global.deviceData.batteryChargeCycles.value_int32 < DeviceDataFlash.batteryChargeCycles.value_int32) | |
| 1215 { | |
| 1216 scheduleCopyDeviceData(&global.deviceData.batteryChargeCycles, &DeviceDataFlash.batteryChargeCycles); | |
| 1217 } | |
| 1218 if(global.deviceData.temperatureMaximum.value_int32 < DeviceDataFlash.temperatureMaximum.value_int32) | |
| 1219 { | |
| 1220 scheduleCopyDeviceData(&global.deviceData.temperatureMaximum, &DeviceDataFlash.temperatureMaximum); | |
| 1221 } | |
| 1222 if(global.deviceData.depthMaximum.value_int32 < DeviceDataFlash.depthMaximum.value_int32) | |
| 1223 { | |
| 1224 scheduleCopyDeviceData(&global.deviceData.depthMaximum, &DeviceDataFlash.depthMaximum); | |
| 1225 } | |
| 1226 if(global.deviceData.diveCycles.value_int32 < DeviceDataFlash.diveCycles.value_int32) | |
| 1227 { | |
| 1228 scheduleCopyDeviceData(&global.deviceData.diveCycles, &DeviceDataFlash.diveCycles); | |
| 1229 } | |
| 1230 if(global.deviceData.hoursOfOperation.value_int32 < DeviceDataFlash.hoursOfOperation.value_int32) | |
| 1231 { | |
| 1232 scheduleCopyDeviceData(&global.deviceData.hoursOfOperation, &DeviceDataFlash.hoursOfOperation); | |
| 1233 } | |
| 1234 | |
| 1235 /* min values */ | |
| 1236 if(global.deviceData.temperatureMinimum.value_int32 > DeviceDataFlash.temperatureMinimum.value_int32) | |
| 1237 { | |
| 1238 scheduleCopyDeviceData(&global.deviceData.temperatureMinimum, &DeviceDataFlash.temperatureMinimum); | |
| 1239 } | |
| 1240 if(global.deviceData.voltageMinimum.value_int32 > DeviceDataFlash.voltageMinimum.value_int32) | |
| 1241 { | |
| 1242 scheduleCopyDeviceData(&global.deviceData.voltageMinimum, &DeviceDataFlash.voltageMinimum); | |
| 1243 } | |
| 1244 } | |
| 1245 | |
| 1246 /* second step, sensor data */ | |
| 1247 int32_t temperature_centigrad_int32; | |
| 1248 int32_t pressure_mbar_int32; | |
| 1249 int32_t voltage_mvolt_int32; | |
| 1250 | |
| 1251 temperature_centigrad_int32 = (int32_t)(get_temperature() * 100); | |
| 1252 if(temperature_centigrad_int32 < global.deviceData.temperatureMinimum.value_int32) | |
| 1253 { | |
| 1254 global.deviceData.temperatureMinimum.value_int32 = temperature_centigrad_int32; | |
| 88 | 1255 scheduleSetDate(&global.deviceData.temperatureMinimum); |
| 38 | 1256 } |
| 1257 | |
| 1258 if(temperature_centigrad_int32 > global.deviceData.temperatureMaximum.value_int32) | |
| 1259 { | |
| 1260 global.deviceData.temperatureMaximum.value_int32 = temperature_centigrad_int32; | |
| 88 | 1261 scheduleSetDate(&global.deviceData.temperatureMaximum); |
| 38 | 1262 } |
| 1263 | |
| 1264 pressure_mbar_int32 = (int32_t)get_pressure_mbar(); | |
| 1265 if(pressure_mbar_int32 > global.deviceData.depthMaximum.value_int32) | |
| 1266 { | |
| 1267 global.deviceData.depthMaximum.value_int32 = pressure_mbar_int32; | |
| 88 | 1268 scheduleSetDate(&global.deviceData.depthMaximum); |
| 38 | 1269 } |
| 1270 | |
| 1271 voltage_mvolt_int32 = (int32_t)(get_voltage() * 1000); | |
| 1272 if(voltage_mvolt_int32 < global.deviceData.voltageMinimum.value_int32) | |
| 1273 { | |
| 1274 global.deviceData.voltageMinimum.value_int32 = voltage_mvolt_int32; | |
| 88 | 1275 scheduleSetDate(&global.deviceData.voltageMinimum); |
| 38 | 1276 } |
| 1277 | |
| 1278 /* third step, counter */ | |
| 1279 switch (global.mode) | |
| 1280 { | |
| 1281 case MODE_SURFACE: | |
| 1282 case MODE_DIVE: | |
| 1283 default: | |
| 1284 deviceDataSubSeconds++; | |
| 1285 if(deviceDataSubSeconds > 10) | |
| 1286 { | |
| 1287 deviceDataSubSeconds = 0; | |
| 1288 global.deviceData.hoursOfOperation.value_int32++; | |
| 1289 } | |
| 1290 break; | |
| 1291 | |
| 1292 case MODE_SLEEP: | |
| 1293 case MODE_SHUTDOWN: | |
| 1294 break; | |
| 1295 } | |
| 1296 } | |
| 1297 | |
| 1298 | |
| 1299 void scheduleUpdateDeviceDataChargerFull(void) | |
| 1300 { | |
| 1301 global.deviceData.batteryChargeCompleteCycles.value_int32++; | |
| 88 | 1302 scheduleSetDate(&global.deviceData.batteryChargeCompleteCycles); |
| 38 | 1303 } |
| 1304 | |
| 1305 | |
| 1306 void scheduleUpdateDeviceDataChargerCharging(void) | |
| 1307 { | |
| 1308 global.deviceData.batteryChargeCycles.value_int32++; | |
| 88 | 1309 scheduleSetDate(&global.deviceData.batteryChargeCycles); |
| 38 | 1310 } |
| 1311 | |
| 1312 | |
| 1313 /** | |
| 1314 ****************************************************************************** | |
| 1315 * @brief vpm_crush / calls vpm calc_crushing_pressure every four seconds during descend | |
| 1316 * @author Peter Ryser | |
| 1317 * @version V0.0.1 | |
| 1318 * @date 22-April-2014 | |
| 1319 ****************************************************************************** | |
| 1320 */ | |
| 1321 _Bool vpm_crush2(void) | |
| 1322 { | |
| 1323 int i = 0; | |
| 1324 static float starting_ambient_pressure = 0; | |
| 1325 static float ending_ambient_pressure = 0; | |
| 1326 static float time_calc_begin = -1; | |
| 1327 static float initial_helium_pressure[16]; | |
| 1328 static float initial_nitrogen_pressure[16]; | |
| 1329 ending_ambient_pressure = global.lifeData.pressure_ambient_bar * 10; | |
| 1330 | |
| 1331 if((global.lifeData.dive_time_seconds <= 4) || (starting_ambient_pressure >= ending_ambient_pressure)) | |
| 1332 { | |
| 1333 time_calc_begin = global.lifeData.dive_time_seconds; | |
| 1334 starting_ambient_pressure = global.lifeData.pressure_ambient_bar * 10; | |
| 1335 for( i = 0; i < 16; i++) | |
| 1336 { | |
| 1337 initial_helium_pressure[i] = global.lifeData.tissue_helium_bar[i] * 10; | |
| 1338 initial_nitrogen_pressure[i] = global.lifeData.tissue_nitrogen_bar[i] * 10; | |
| 1339 } | |
| 1340 return 0; | |
| 1341 } | |
| 1342 if(global.lifeData.dive_time_seconds - time_calc_begin >= 4) | |
| 1343 { | |
| 1344 if(ending_ambient_pressure > starting_ambient_pressure + 0.5f) | |
| 1345 { | |
| 1346 float rate = (ending_ambient_pressure - starting_ambient_pressure) * 60 / 4; | |
| 1347 calc_crushing_pressure(&global.lifeData, &global.vpm, initial_helium_pressure, initial_nitrogen_pressure, starting_ambient_pressure, rate); | |
| 1348 | |
| 1349 time_calc_begin = global.lifeData.dive_time_seconds; | |
| 1350 starting_ambient_pressure = global.lifeData.pressure_ambient_bar * 10; | |
| 1351 for( i = 0; i < 16; i++) | |
| 1352 { | |
| 1353 initial_helium_pressure[i] = global.lifeData.tissue_helium_bar[i] * 10; | |
| 1354 initial_nitrogen_pressure[i] = global.lifeData.tissue_nitrogen_bar[i] * 10; | |
| 1355 } | |
| 1356 | |
| 1357 return 1; | |
| 1358 } | |
| 1359 | |
| 1360 } | |
| 1361 return 0; | |
| 1362 } | |
| 1363 | |
| 1364 | |
| 1365 long get_nofly_time_minutes(void) | |
| 1366 { | |
| 1367 | |
| 1368 if(global.no_fly_time_minutes <= 0) | |
| 1369 return 0; | |
| 1370 | |
| 1371 long minutes_since_last_dive = global.seconds_since_last_dive/60; | |
| 1372 | |
| 1373 if((global.seconds_since_last_dive > 0) && (global.no_fly_time_minutes > minutes_since_last_dive)) | |
| 1374 { | |
| 1375 return (global.no_fly_time_minutes - minutes_since_last_dive); | |
| 1376 } | |
| 1377 else | |
| 1378 { | |
| 1379 global.no_fly_time_minutes = 0; | |
| 1380 return 0; | |
| 1381 } | |
| 1382 } | |
| 1383 | |
| 1384 | |
| 1385 //Supports threadsave copying!!! | |
| 1386 void copyActualGas(SGas gas) | |
| 1387 { | |
| 1388 uint8_t whichGas = !global.whichGas; | |
| 1389 global.aktualGas[whichGas] = gas; | |
| 1390 global.whichGas = whichGas; | |
| 1391 } | |
| 1392 | |
| 1393 | |
| 1394 //Supports threadsave copying!!! | |
| 1395 void copyPressureData(void) | |
| 1396 { | |
|
240
625d20070261
Improvement SPI stability/recoverability
Jan Mulder <jlmulder@xs4all.nl>
parents:
231
diff
changeset
|
1397 global.dataSendToMaster.sensorErrors = global.I2C_SystemStatus; |
| 38 | 1398 uint8_t boolPressureData = !global.dataSendToMaster.boolPressureData; |
| 1399 global.dataSendToMaster.data[boolPressureData].temperature = get_temperature(); | |
| 1400 global.dataSendToMaster.data[boolPressureData].pressure_mbar = get_pressure_mbar(); | |
| 1401 global.dataSendToMaster.data[boolPressureData].surface_mbar = get_surface_mbar(); | |
| 1402 global.dataSendToMaster.data[boolPressureData].ascent_rate_meter_per_min = global.lifeData.ascent_rate_meter_per_min; | |
| 1403 global.dataSendToMaster.data[boolPressureData].pressure_uTick = HAL_GetTick(); | |
| 1404 global.dataSendToMaster.boolPressureData = boolPressureData; | |
|
346
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1405 global.dataSendToMaster.data[boolPressureData].SPARE1 = is_surface_pressure_stable(); |
| 38 | 1406 } |
| 1407 | |
| 1408 | |
| 1409 //Supports threadsave copying!!! | |
| 1410 void copyCnsAndOtuData(void) | |
| 1411 { | |
| 1412 //uint8_t dataSendToMaster. | |
| 1413 uint8_t boolToxicData = !global.dataSendToMaster.boolToxicData; | |
| 1414 global.dataSendToMaster.data[boolToxicData].cns = global.lifeData.cns; | |
| 1415 global.dataSendToMaster.data[boolToxicData].otu = global.lifeData.otu; | |
| 1416 global.dataSendToMaster.data[boolToxicData].desaturation_time_minutes = global.lifeData.desaturation_time_minutes; | |
| 1417 global.dataSendToMaster.data[boolToxicData].no_fly_time_minutes = get_nofly_time_minutes(); | |
| 1418 global.dataSendToMaster.boolToxicData = boolToxicData; | |
| 1419 } | |
| 1420 | |
| 1421 | |
| 1422 //Supports threadsave copying!!! | |
| 1423 void copyTimeData(void) | |
| 1424 { | |
| 1425 extern RTC_HandleTypeDef RTCHandle; | |
| 1426 | |
| 1427 uint8_t boolTimeData = !global.dataSendToMaster.boolTimeData; | |
| 1428 global.dataSendToMaster.data[boolTimeData].localtime_rtc_tr = (uint32_t)(RTCHandle.Instance->TR & RTC_TR_RESERVED_MASK); | |
| 1429 global.dataSendToMaster.data[boolTimeData].localtime_rtc_dr = (uint32_t)(RTCHandle.Instance->DR & RTC_DR_RESERVED_MASK); | |
| 1430 global.dataSendToMaster.data[boolTimeData].divetime_seconds = (uint32_t)global.lifeData.dive_time_seconds; | |
| 1431 global.dataSendToMaster.data[boolTimeData].dive_time_seconds_without_surface_time = (uint32_t)global.lifeData.dive_time_seconds_without_surface_time; | |
| 1432 global.dataSendToMaster.data[boolTimeData].surfacetime_seconds = (uint32_t)global.seconds_since_last_dive; | |
| 1433 global.dataSendToMaster.data[boolTimeData].counterSecondsShallowDepth = (uint32_t)global.lifeData.counterSecondsShallowDepth; | |
| 1434 global.dataSendToMaster.boolTimeData = boolTimeData; | |
| 1435 } | |
| 1436 | |
| 1437 | |
| 1438 //Supports threadsave copying!!! | |
| 1439 void copyCompassData(void) | |
| 1440 { | |
| 1441 extern float compass_heading; | |
| 1442 extern float compass_roll; | |
| 1443 extern float compass_pitch; | |
| 1444 //uint8_t dataSendToMaster. | |
| 1445 uint8_t boolCompassData = !global.dataSendToMaster.boolCompassData; | |
| 1446 global.dataSendToMaster.data[boolCompassData].compass_heading = compass_heading; | |
| 1447 global.dataSendToMaster.data[boolCompassData].compass_roll = compass_roll; | |
| 1448 global.dataSendToMaster.data[boolCompassData].compass_pitch = compass_pitch; | |
| 1449 global.dataSendToMaster.data[boolCompassData].compass_DX_f = 0; | |
| 1450 global.dataSendToMaster.data[boolCompassData].compass_DY_f = 0; | |
| 1451 global.dataSendToMaster.data[boolCompassData].compass_DZ_f = 0; | |
| 1452 global.dataSendToMaster.data[boolCompassData].compass_uTick = HAL_GetTick(); | |
| 1453 global.dataSendToMaster.boolCompassData = boolCompassData; | |
| 1454 } | |
| 1455 | |
| 1456 | |
| 1457 void copyCompassDataDuringCalibration(int16_t dx, int16_t dy, int16_t dz) | |
| 1458 { | |
| 1459 extern float compass_heading; | |
| 1460 extern float compass_roll; | |
| 1461 extern float compass_pitch; | |
| 1462 //uint8_t dataSendToMaster. | |
| 1463 uint8_t boolCompassData = !global.dataSendToMaster.boolCompassData; | |
| 1464 global.dataSendToMaster.data[boolCompassData].compass_heading = compass_heading; | |
| 1465 global.dataSendToMaster.data[boolCompassData].compass_roll = compass_roll; | |
| 1466 global.dataSendToMaster.data[boolCompassData].compass_pitch = compass_pitch; | |
| 1467 global.dataSendToMaster.data[boolCompassData].compass_DX_f = dx; | |
| 1468 global.dataSendToMaster.data[boolCompassData].compass_DY_f = dy; | |
| 1469 global.dataSendToMaster.data[boolCompassData].compass_DZ_f = dz; | |
| 1470 global.dataSendToMaster.boolCompassData = boolCompassData; | |
| 1471 } | |
| 1472 | |
| 1473 | |
| 1474 //Supports threadsave copying!!! | |
| 1475 void copyBatteryData(void) | |
| 1476 { | |
| 1477 uint8_t boolBatteryData = !global.dataSendToMaster.boolBatteryData; | |
| 1478 global.dataSendToMaster.data[boolBatteryData].battery_voltage = get_voltage(); | |
| 1479 global.dataSendToMaster.data[boolBatteryData].battery_charge= get_charge(); | |
| 1480 global.dataSendToMaster.boolBatteryData = boolBatteryData; | |
| 1481 } | |
| 1482 | |
| 1483 | |
| 1484 //Supports threadsave copying!!! | |
| 1485 void copyAmbientLightData(void) | |
| 1486 { | |
| 1487 uint8_t boolAmbientLightData = !global.dataSendToMaster.boolAmbientLightData; | |
| 1488 global.dataSendToMaster.data[boolAmbientLightData].ambient_light_level = get_ambient_light_level(); | |
| 1489 global.dataSendToMaster.boolAmbientLightData = boolAmbientLightData; | |
| 1490 } | |
| 1491 | |
| 1492 | |
| 1493 //Supports threadsave copying!!! | |
| 1494 void copyTissueData(void) | |
| 1495 { | |
| 1496 //uint8_t dataSendToMaster. | |
| 1497 uint8_t boolTisssueData = !global.dataSendToMaster.boolTisssueData; | |
| 1498 for(int i = 0; i < 16; i++) | |
| 1499 { | |
| 1500 global.dataSendToMaster.data[boolTisssueData].tissue_nitrogen_bar[i] = global.lifeData.tissue_nitrogen_bar[i]; | |
| 1501 global.dataSendToMaster.data[boolTisssueData].tissue_helium_bar[i] = global.lifeData.tissue_helium_bar[i]; | |
| 1502 } | |
| 1503 global.dataSendToMaster.boolTisssueData = boolTisssueData; | |
| 1504 } | |
| 1505 | |
| 1506 | |
| 1507 //Supports threadsave copying!!! | |
| 1508 void copyVpmCrushingData(void) | |
| 1509 { | |
| 1510 //uint8_t dataSendToMaster. | |
| 1511 uint8_t boolCrushingData = !global.dataSendToMaster.boolCrushingData; | |
| 1512 for(int i = 0; i < 16; i++) | |
| 1513 { | |
| 1514 global.dataSendToMaster.data[boolCrushingData].max_crushing_pressure_n2[i] = global.vpm.max_crushing_pressure_n2[i]; | |
| 1515 global.dataSendToMaster.data[boolCrushingData].max_crushing_pressure_he[i] = global.vpm.max_crushing_pressure_he[i]; | |
| 1516 global.dataSendToMaster.data[boolCrushingData].adjusted_critical_radius_he[i] = global.vpm.adjusted_critical_radius_he[i]; | |
| 1517 global.dataSendToMaster.data[boolCrushingData].adjusted_critical_radius_n2[i] = global.vpm.adjusted_critical_radius_n2[i]; | |
| 1518 } | |
| 1519 global.dataSendToMaster.boolCrushingData = boolCrushingData; | |
| 1520 } | |
| 1521 | |
| 1522 | |
| 1523 void copyDeviceData(void) | |
| 1524 { | |
| 1525 uint8_t boolDeviceData = !global.deviceDataSendToMaster.boolDeviceData; | |
| 1526 memcpy(&global.deviceDataSendToMaster.DeviceData[boolDeviceData], &global.deviceData,sizeof(SDevice)); | |
| 1527 global.deviceDataSendToMaster.boolDeviceData = boolDeviceData; | |
| 1528 | |
| 1529 global.deviceDataSendToMaster.boolVpmRepetitiveDataValid = 0; | |
| 1530 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.adjusted_critical_radius_he, &global.vpm.adjusted_critical_radius_he, sizeof(16*4)); | |
| 1531 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.adjusted_critical_radius_n2, &global.vpm.adjusted_critical_radius_n2, sizeof(16*4)); | |
| 1532 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.adjusted_crushing_pressure_he, &global.vpm.adjusted_crushing_pressure_he, sizeof(16*4)); | |
| 1533 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.adjusted_crushing_pressure_n2, &global.vpm.adjusted_crushing_pressure_n2, sizeof(16*4)); | |
| 1534 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.initial_allowable_gradient_he, &global.vpm.initial_allowable_gradient_he, sizeof(16*4)); | |
| 1535 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.initial_allowable_gradient_n2, &global.vpm.initial_allowable_gradient_n2, sizeof(16*4)); | |
| 1536 memcpy(&global.deviceDataSendToMaster.VpmRepetitiveData.max_actual_gradient, &global.vpm.max_actual_gradient, sizeof(16*4)); | |
| 1537 global.deviceDataSendToMaster.VpmRepetitiveData.repetitive_variables_not_valid = global.vpm.repetitive_variables_not_valid; | |
| 1538 global.deviceDataSendToMaster.boolVpmRepetitiveDataValid = 1; | |
| 1539 } | |
| 1540 | |
| 1541 /* copyPICdata(); is used in spi.c */ | |
| 1542 void copyPICdata(void) | |
| 1543 { | |
| 1544 uint8_t boolPICdata = !global.dataSendToMaster.boolPICdata; | |
| 1545 for(int i = 0; i < 3; i++) | |
| 1546 { | |
| 1547 global.dataSendToMaster.data[boolPICdata].button_setting[i] = global.ButtonPICdata[i]; | |
| 1548 } | |
| 1549 global.dataSendToMaster.boolPICdata = boolPICdata; | |
| 1550 } | |
| 1551 | |
| 1552 | |
| 1553 typedef enum | |
| 1554 { | |
| 1555 SPI3_OK = 0x00, | |
| 1556 SPI3_DEINIT = 0x01, | |
| 1557 } SPI3_StatusTypeDef; | |
| 1558 /* if spi3 is running and the SPI3_ButtonAdjust call returns OK, all is fine | |
| 1559 if the SPI3_ButtonAdjust call returns error, the spi3 is DeInit | |
| 1560 and will be init the next call of scheduleSetButtonResponsiveness() | |
| 1561 and data will be send again on the third call | |
| 1562 therefore on return 0 of scheduleSetButtonResponsiveness() the caller flag should kept active | |
| 1563 */ | |
| 1564 uint8_t scheduleSetButtonResponsiveness(void) | |
| 1565 { | |
| 1566 static uint8_t SPI3status = SPI3_OK; | |
| 1567 | |
| 1568 if((SPI3status == SPI3_OK) && (SPI3_ButtonAdjust(global.ButtonResponsiveness, global.ButtonPICdata))) | |
| 1569 { | |
| 1570 copyPICdata(); | |
| 1571 return 1; | |
| 1572 } | |
| 1573 else | |
| 1574 { | |
| 1575 for(int i=0;i<3;i++) | |
| 1576 { | |
| 1577 global.ButtonPICdata[i] = 0xFF; | |
| 1578 } | |
| 1579 copyPICdata(); | |
| 1580 | |
| 1581 if(SPI3status == SPI3_OK) | |
| 1582 { | |
| 1583 MX_SPI3_DeInit(); | |
| 1584 SPI3status = SPI3_DEINIT; | |
| 1585 } | |
| 1586 else | |
| 1587 { | |
| 1588 MX_SPI3_Init(); | |
| 1589 SPI3status = SPI3_OK; | |
| 1590 } | |
| 1591 return 0; | |
| 1592 } | |
| 1593 } | |
| 1594 | |
| 1595 | |
|
186
f11f0bf6ef2d
cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents:
181
diff
changeset
|
1596 //save time difference |
| 38 | 1597 uint32_t time_elapsed_ms(uint32_t ticksstart,uint32_t ticksnow) |
| 1598 { | |
| 1599 if(ticksstart <= ticksnow) | |
| 1600 { | |
| 1601 return ticksnow - ticksstart; | |
| 1602 } | |
| 1603 else | |
| 1604 { | |
| 1605 return 0xFFFFFFFF - ticksstart + ticksnow; | |
| 1606 } | |
| 1607 } | |
| 1608 | |
| 1609 /* same as in data_central.c */ | |
|
310
95928ef3986f
Make dive mode detection more advanced
Jan Mulder <jlmulder@xs4all.nl>
parents:
301
diff
changeset
|
1610 _Bool is_ambient_pressure_close_to_surface(SLifeData *lifeData) |
| 38 | 1611 { |
|
346
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1612 _Bool retval = true; |
|
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1613 |
|
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1614 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
|
1615 { |
|
346
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1616 /* 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
|
1617 if (lifeData->pressure_ambient_bar > START_DIVE_IMMEDIATLY_BAR) |
|
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1618 { |
|
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1619 retval = false; |
|
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1620 } |
|
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1621 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
|
1622 { |
|
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1623 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
|
1624 && (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
|
1625 { |
|
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1626 retval = false; |
|
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1627 } |
|
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1628 } |
|
331
b4c578caaafb
Added plausibility check for pressure values
ideenmodellierer
parents:
310
diff
changeset
|
1629 } |
|
346
73325a78c907
Added function to support manuel exit of dive mode
ideenmodellierer
parents:
338
diff
changeset
|
1630 return retval; |
| 38 | 1631 } |
| 1632 | |
| 1633 | |
| 1634 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ | |
| 1635 |
