Mercurial > public > ostc4
comparison Discovery/Src/check_warning.c @ 788:4abfb8a2a435
Define explicit setpoints for low / high / deco. Add an option to delay the switch to SPlow until all decompression has been cleared. (mikeller)
author | heinrichsweikamp |
---|---|
date | Tue, 04 Jul 2023 14:39:06 +0200 |
parents | 2c243233c999 |
children | da632300e7d4 fa431d42b5fb |
comparison
equal
deleted
inserted
replaced
787:aeb72882f30a | 788:4abfb8a2a435 |
---|---|
37 #include "data_exchange.h" | 37 #include "data_exchange.h" |
38 #include "check_warning.h" | 38 #include "check_warning.h" |
39 #include "settings.h" | 39 #include "settings.h" |
40 #include "decom.h" | 40 #include "decom.h" |
41 #include "tCCR.h" | 41 #include "tCCR.h" |
42 #include "tHome.h" | |
42 | 43 |
43 | 44 |
44 #define DEBOUNCE_FALLBACK_TIME_MS (5000u) /* set warning after 5 seconds of pending error condition */ | 45 #define DEBOUNCE_FALLBACK_TIME_MS (5000u) /* set warning after 5 seconds of pending error condition */ |
45 | 46 |
47 #define SETPOINT_DECO_START_RANGE_M 3.0 | |
48 #define SWITCH_DEPTH_LOW_MINIMUM_M 1.0 | |
46 | 49 |
47 /* Private variables with access ----------------------------------------------*/ | 50 /* Private variables with access ----------------------------------------------*/ |
48 static uint8_t betterGasId = 0; | 51 static uint8_t betterGasId = 0; |
49 static uint8_t betterBailoutGasId = 0; | 52 static uint8_t betterBailoutGasId = 0; |
50 static uint8_t betterSetpointId = 1; | 53 static uint8_t betterSetpointId = 1; |
287 } | 290 } |
288 | 291 |
289 | 292 |
290 uint8_t getSetpointLowId(void) | 293 uint8_t getSetpointLowId(void) |
291 { | 294 { |
295 SSettings *settings = settingsGetPointer(); | |
296 | |
297 if (settings->autoSetpoint) { | |
298 return SETPOINT_INDEX_AUTO_LOW; | |
299 } | |
300 | |
292 uint8_t setpointLowId = 0; | 301 uint8_t setpointLowId = 0; |
293 uint8_t setpointLowDepthM = UINT8_MAX; | 302 uint8_t setpointLowDepthM = UINT8_MAX; |
294 for (unsigned i = 1; i <= NUM_GASES; i++) { | 303 for (unsigned i = 1; i <= NUM_GASES; i++) { |
295 if (stateUsed->diveSettings.setpoint[i].depth_meter && stateUsed->diveSettings.setpoint[i].depth_meter < setpointLowDepthM) { | 304 if (stateUsed->diveSettings.setpoint[i].depth_meter && stateUsed->diveSettings.setpoint[i].depth_meter < setpointLowDepthM) { |
296 setpointLowId = i; | 305 setpointLowId = i; |
302 } | 311 } |
303 | 312 |
304 | 313 |
305 uint8_t getSetpointHighId(void) | 314 uint8_t getSetpointHighId(void) |
306 { | 315 { |
316 SSettings *settings = settingsGetPointer(); | |
317 | |
318 if (settings->autoSetpoint) { | |
319 return SETPOINT_INDEX_AUTO_HIGH; | |
320 } | |
321 | |
307 uint8_t setpointHighId = 0; | 322 uint8_t setpointHighId = 0; |
308 uint8_t setpointHighDepthM = 0; | 323 uint8_t setpointHighDepthM = 0; |
309 for (unsigned i = 1; i <= NUM_GASES; i++) { | 324 for (unsigned i = 1; i <= NUM_GASES; i++) { |
310 if (stateUsed->diveSettings.setpoint[i].depth_meter && stateUsed->diveSettings.setpoint[i].depth_meter >= setpointHighDepthM) { | 325 if (stateUsed->diveSettings.setpoint[i].depth_meter && stateUsed->diveSettings.setpoint[i].depth_meter >= setpointHighDepthM) { |
311 setpointHighId = i; | 326 setpointHighId = i; |
315 | 330 |
316 return setpointHighId; | 331 return setpointHighId; |
317 } | 332 } |
318 | 333 |
319 | 334 |
335 uint8_t getSetpointDecoId(void) | |
336 { | |
337 SSettings *settings = settingsGetPointer(); | |
338 | |
339 if (settings->autoSetpoint && stateUsed->diveSettings.setpoint[SETPOINT_INDEX_AUTO_DECO].note.ub.active) { | |
340 return SETPOINT_INDEX_AUTO_DECO; | |
341 } | |
342 | |
343 return 0; | |
344 } | |
345 | |
346 | |
320 /* check for better travel!!! setpoint hw 151210 | 347 /* check for better travel!!! setpoint hw 151210 |
321 */ | 348 */ |
322 static int8_t check_BetterSetpoint(SDiveState *diveState) | 349 static int8_t check_BetterSetpoint(SDiveState *diveState) |
323 { | 350 { |
324 diveState->warnings.betterSetpoint = 0; | 351 diveState->warnings.betterSetpoint = 0; |
330 } | 357 } |
331 | 358 |
332 SSettings *settings = settingsGetPointer(); | 359 SSettings *settings = settingsGetPointer(); |
333 | 360 |
334 float currentDepthM = diveState->lifeData.depth_meter; | 361 float currentDepthM = diveState->lifeData.depth_meter; |
335 if (settings->dive_mode == DIVEMODE_CCR && diveState->lifeData.lastSetpointChangeDepthM != currentDepthM) { | 362 float lastChangeDepthM = diveState->lifeData.lastSetpointChangeDepthM; |
336 float lastChangeDepthM = diveState->lifeData.lastSetpointChangeDepthM; | 363 if (settings->dive_mode == DIVEMODE_CCR && lastChangeDepthM != currentDepthM) { |
337 bool descending = currentDepthM > lastChangeDepthM; | 364 bool descending = currentDepthM > lastChangeDepthM; |
338 uint8_t setpointLowId = getSetpointLowId(); | |
339 uint8_t setpointHighId = getSetpointHighId(); | |
340 uint8_t betterSetpointIdLocal = 0; | 365 uint8_t betterSetpointIdLocal = 0; |
341 uint8_t betterSetpointSwitchDepthM = descending ? 0 : UINT8_MAX; | 366 |
342 | 367 if (settings->autoSetpoint) { |
343 for (unsigned i = 1; i <= NUM_GASES; i++) { | 368 bool decoSetpointEnabled = diveState->diveSettings.setpoint[SETPOINT_INDEX_AUTO_DECO].note.ub.active; |
344 uint8_t switchDepthM = diveState->diveSettings.setpoint[i].depth_meter; | 369 const SDecoinfo *decoInfo = getDecoInfo(); |
345 if (!switchDepthM || (descending && i == setpointLowId) || (!descending && i == setpointHighId)) { | 370 uint8_t nextDecoStopDepthM; |
346 continue; | 371 uint16_t nextDecoStopTimeRemainingS; |
347 } | 372 tHome_findNextStop(decoInfo->output_stop_length_seconds, &nextDecoStopDepthM, &nextDecoStopTimeRemainingS); |
348 | 373 |
349 if ((descending && lastChangeDepthM < switchDepthM && switchDepthM < currentDepthM && switchDepthM > betterSetpointSwitchDepthM) | 374 if (decoSetpointEnabled && nextDecoStopDepthM && currentDepthM < nextDecoStopDepthM + SETPOINT_DECO_START_RANGE_M && !diveState->lifeData.setpointDecoActivated) { |
350 || (!descending && lastChangeDepthM > switchDepthM && switchDepthM > currentDepthM && switchDepthM <= betterSetpointSwitchDepthM)) { | 375 betterSetpointIdLocal = SETPOINT_INDEX_AUTO_DECO; |
351 betterSetpointIdLocal = i; | 376 diveState->lifeData.setpointDecoActivated = true; |
352 betterSetpointSwitchDepthM = switchDepthM; | 377 } |
378 | |
379 if (descending) { | |
380 uint8_t switchDepthHighM = diveState->diveSettings.setpoint[SETPOINT_INDEX_AUTO_HIGH].depth_meter; | |
381 | |
382 if (lastChangeDepthM < switchDepthHighM && switchDepthHighM < currentDepthM && !diveState->lifeData.setpointDecoActivated) { | |
383 betterSetpointIdLocal = SETPOINT_INDEX_AUTO_HIGH; | |
384 } | |
385 } else { | |
386 uint8_t switchDepthLowM = diveState->diveSettings.setpoint[SETPOINT_INDEX_AUTO_LOW].depth_meter; | |
387 | |
388 if (lastChangeDepthM > SWITCH_DEPTH_LOW_MINIMUM_M && SWITCH_DEPTH_LOW_MINIMUM_M > currentDepthM) { | |
389 // Avoid draining the oxygen supply by surfacing with a setpoint >= 1.0 | |
390 betterSetpointIdLocal = SETPOINT_INDEX_AUTO_LOW; | |
391 diveState->lifeData.setpointLowDelayed = false; | |
392 } else if (lastChangeDepthM > switchDepthLowM && switchDepthLowM > currentDepthM) { | |
393 if (nextDecoStopDepthM && settings->delaySetpointLow) { | |
394 diveState->lifeData.setpointLowDelayed = true; | |
395 } else { | |
396 betterSetpointIdLocal = SETPOINT_INDEX_AUTO_LOW; | |
397 } | |
398 } | |
399 } | |
400 | |
401 if (!nextDecoStopDepthM) { | |
402 // Update the state when the decompression obligation ends | |
403 diveState->lifeData.setpointDecoActivated = false; | |
404 | |
405 if (diveState->lifeData.setpointLowDelayed) { | |
406 betterSetpointIdLocal = SETPOINT_INDEX_AUTO_LOW; | |
407 diveState->lifeData.setpointLowDelayed = false; | |
408 } | |
409 } | |
410 } else { | |
411 uint8_t setpointLowId = getSetpointLowId(); | |
412 uint8_t setpointHighId = getSetpointHighId(); | |
413 uint8_t betterSetpointSwitchDepthM = descending ? 0 : UINT8_MAX; | |
414 | |
415 for (unsigned i = 1; i <= NUM_GASES; i++) { | |
416 uint8_t switchDepthM = diveState->diveSettings.setpoint[i].depth_meter; | |
417 if (!switchDepthM || (descending && i == setpointLowId) || (!descending && i == setpointHighId)) { | |
418 continue; | |
419 } | |
420 | |
421 if ((descending && lastChangeDepthM < switchDepthM && switchDepthM < currentDepthM && switchDepthM > betterSetpointSwitchDepthM) | |
422 || (!descending && lastChangeDepthM > switchDepthM && switchDepthM > currentDepthM && switchDepthM <= betterSetpointSwitchDepthM)) { | |
423 betterSetpointIdLocal = i; | |
424 betterSetpointSwitchDepthM = switchDepthM; | |
425 } | |
353 } | 426 } |
354 } | 427 } |
355 | 428 |
356 if (betterSetpointIdLocal) { | 429 if (betterSetpointIdLocal) { |
357 betterSetpointId = betterSetpointIdLocal; | 430 betterSetpointId = betterSetpointIdLocal; |