Mercurial > public > ostc4
comparison Small_CPU/Src/pressure.c @ 981:c6c781a2e85b default
Merge into default
| author | heinrichsweikamp |
|---|---|
| date | Tue, 11 Feb 2025 18:12:00 +0100 |
| parents | 06aaccaf2e02 |
| children | 41136649b90d |
comparison
equal
deleted
inserted
replaced
| 871:f7318457df4d | 981:c6c781a2e85b |
|---|---|
| 47 #define CMD_PROM_RD 0xA0 // Prom read command | 47 #define CMD_PROM_RD 0xA0 // Prom read command |
| 48 | 48 |
| 49 /* remove comment to use a predefined profile for pressure changes instead of real world data */ | 49 /* remove comment to use a predefined profile for pressure changes instead of real world data */ |
| 50 /* #define SIMULATE_PRESSURE */ | 50 /* #define SIMULATE_PRESSURE */ |
| 51 | 51 |
| 52 | |
| 53 #define PRESSURE_SURFACE_MAX_MBAR (1060.0f) /* It is unlikely that pressure at surface is greater than this value => clip to it */ | 52 #define PRESSURE_SURFACE_MAX_MBAR (1060.0f) /* It is unlikely that pressure at surface is greater than this value => clip to it */ |
| 54 | 53 |
| 55 #define PRESSURE_MINIMUM (0.0f) | 54 #define PRESSURE_MINIMUM (0.0f) |
| 56 #define TEMPERATURE_MINIMUM (-100.0f) | 55 #define TEMPERATURE_MINIMUM (-100.0f) |
| 57 | 56 |
| 128 runningAvg = 0; | 127 runningAvg = 0; |
| 129 | 128 |
| 130 for(int i=0; i<PRESSURE_SURFACE_QUE; i++) | 129 for(int i=0; i<PRESSURE_SURFACE_QUE; i++) |
| 131 surface_ring_mbar[i] = ambient_pressure_mbar; | 130 surface_ring_mbar[i] = ambient_pressure_mbar; |
| 132 surface_pressure_mbar = ambient_pressure_mbar; | 131 surface_pressure_mbar = ambient_pressure_mbar; |
| 132 surface_pressure_stable_value = surface_pressure_mbar; | |
| 133 surface_pressure_writeIndex = 0; /* index of the oldest value in the ring buffer */ | 133 surface_pressure_writeIndex = 0; /* index of the oldest value in the ring buffer */ |
| 134 } | 134 } |
| 135 } | 135 } |
| 136 | 136 |
| 137 uint8_t is_surface_pressure_stable(void) | 137 uint8_t is_surface_pressure_stable(void) |
| 234 | 234 |
| 235 surface_pressure_mbar = surface_ring_mbar[surface_pressure_writeIndex]; /* 30 minutes old measurement */ | 235 surface_pressure_mbar = surface_ring_mbar[surface_pressure_writeIndex]; /* 30 minutes old measurement */ |
| 236 | 236 |
| 237 secondCounterSurfaceRing = 0; | 237 secondCounterSurfaceRing = 0; |
| 238 avgCount = 1; /* use the current value as starting point but restart the weight decrement of the measurements */ | 238 avgCount = 1; /* use the current value as starting point but restart the weight decrement of the measurements */ |
| 239 } | 239 |
| 240 evaluate_surface_pressure(); | 240 evaluate_surface_pressure(); |
| 241 } | |
| 241 } | 242 } |
| 242 } | 243 } |
| 243 | 244 |
| 244 #ifdef DEMOMODE | 245 #ifdef DEMOMODE |
| 245 float demo_modify_temperature_helper(float bottom_mbar_diff_to_surface) | 246 float demo_modify_temperature_helper(float bottom_mbar_diff_to_surface) |
| 527 return statusReturn; | 528 return statusReturn; |
| 528 } | 529 } |
| 529 | 530 |
| 530 | 531 |
| 531 #ifdef SIMULATE_PRESSURE | 532 #ifdef SIMULATE_PRESSURE |
| 533 | |
| 534 #define SECDIV 10 /* update every 100ms */ | |
| 535 | |
| 532 void pressure_simulation() | 536 void pressure_simulation() |
| 533 { | 537 { |
| 534 static uint32_t tickstart = 0; | 538 static uint32_t tickstart = 0; |
| 535 static float pressure_sim_mbar = 0; | 539 static float pressure_sim_mbar = 0; |
| 536 static uint32_t passedSecond = 0; | 540 static uint32_t passedSecond = 0; |
| 537 static uint32_t secondtick = 0; | 541 static uint32_t secondtick = 0; |
| 542 static uint32_t lastsecondtick = 0; | |
| 543 static float delta_mbar = 0.0; | |
| 538 | 544 |
| 539 uint32_t lasttick = 0; | 545 uint32_t lasttick = 0; |
| 540 | 546 |
| 541 | 547 |
| 542 | 548 |
| 546 secondtick = tickstart; | 552 secondtick = tickstart; |
| 547 pressure_sim_mbar = 1000; | 553 pressure_sim_mbar = 1000; |
| 548 } | 554 } |
| 549 | 555 |
| 550 lasttick = HAL_GetTick(); | 556 lasttick = HAL_GetTick(); |
| 551 if(time_elapsed_ms(secondtick,lasttick) > 1000) /* one second passed since last tick */ | 557 if(time_elapsed_ms(secondtick,lasttick) >= (1000 / SECDIV)) /* one second passed since last tick */ |
| 552 { | 558 { |
| 559 if(time_elapsed_ms(lastsecondtick,lasttick) > 1000) | |
| 560 { | |
| 561 passedSecond++; | |
| 562 lastsecondtick = lasttick; | |
| 563 } | |
| 553 secondtick = lasttick; | 564 secondtick = lasttick; |
| 554 passedSecond++; | 565 |
| 555 | 566 #define DIVE_EASY 1 |
| 556 #ifdef DIVE_AFTER_LANDING | 567 #ifdef DIVE_AFTER_LANDING |
| 557 if(passedSecond < 10) pressure_sim_mbar = 1000.0; /* stay stable for 10 seconds */ | 568 if(passedSecond < 10) pressure_sim_mbar = 1000.0; /* stay stable for 10 seconds */ |
| 558 else if(passedSecond < 300) pressure_sim_mbar -= 1.0; /* decrease pressure in 5 minutes target 770mbar => delta 330 */ | 569 else if(passedSecond < 300) pressure_sim_mbar -= 1.0; /* decrease pressure in 5 minutes target 770mbar => delta 330 */ |
| 559 else if(passedSecond < 900) pressure_sim_mbar += 0.0; /*stay stable 10 minutes*/ | 570 else if(passedSecond < 900) pressure_sim_mbar += 0.0; /*stay stable 10 minutes*/ |
| 560 else if(passedSecond < 1500) pressure_sim_mbar += 0.5; /* return to 1 bar in 10 Minutes*/ | 571 else if(passedSecond < 1500) pressure_sim_mbar += 0.5; /* return to 1 bar in 10 Minutes*/ |
| 561 else if(passedSecond < 1800) pressure_sim_mbar += 0.0; /* 5 minutes break */ | 572 else if(passedSecond < 1800) pressure_sim_mbar += 0.0; /* 5 minutes break */ |
| 562 else if(passedSecond < 2000) pressure_sim_mbar += 10.0; /* start dive */ | 573 else if(passedSecond < 2000) pressure_sim_mbar += 10.0; /* start dive */ |
| 563 else if(passedSecond < 2300) pressure_sim_mbar += 0.0; /* stay on depth */ | 574 else if(passedSecond < 2300) pressure_sim_mbar += 0.0; /* stay on depth */ |
| 564 else if(passedSecond < 2500) pressure_sim_mbar -= 10.0; /* return to surface */ | 575 else if(passedSecond < 2500) pressure_sim_mbar -= 10.0; /* return to surface */ |
| 565 else pressure_sim_mbar = 1000.0; /* final state */ | 576 else pressure_sim_mbar = 1000.0; /* final state */ |
| 566 #else /* short dive */ | 577 #endif |
| 578 #ifdef DIVE_EASY | |
| 579 if(passedSecond < 10) pressure_sim_mbar = 1000.0; /* stay stable for 10 seconds */ | |
| 580 else if(passedSecond < 120) pressure_sim_mbar += 1.0; /* decrease pressure in 2 minutes */ | |
| 581 else if(passedSecond < 240) pressure_sim_mbar += 0.0; /*stay stable 2 minutes*/ | |
| 582 else if(passedSecond < 360) pressure_sim_mbar -= 1.0; /* return to 1 bar in 2 Minutes*/ | |
| 583 else pressure_sim_mbar = 1000.0; /* final state */ | |
| 584 #endif | |
| 585 #if DIVE_AT_SPEED | |
| 586 if(passedSecond < 10) pressure_sim_mbar = 1000.0; /* stay stable for 10 seconds */ | |
| 587 else if(passedSecond < 20) delta_mbar = 200.0 / SECDIV; /* Start dive */ | |
| 588 else if(passedSecond < 30) delta_mbar = 0.0; /*stay on depth*/ | |
| 589 else if(passedSecond < 45) delta_mbar -= 0.2 / SECDIV; /* return to surface */ | |
| 590 else if(passedSecond < 40) delta_mbar -= 0.4 / SECDIV; /* stay */ | |
| 591 else if(passedSecond < 50) delta_mbar += 0.3 / SECDIV; /* get ready for second dive */ | |
| 592 else if(passedSecond < 60) delta_mbar -= 0.4; /*stay on depth*/ | |
| 593 else if(passedSecond < 70) delta_mbar = 0.2; | |
| 594 else if(passedSecond < 1060) pressure_sim_mbar -= 10.0/ SECDIV; /* return to surface */ | |
| 595 else if(passedSecond < 1200) pressure_sim_mbar += 0.0; /* stay */ | |
| 596 else { pressure_sim_mbar = 1000.0; delta_mbar = 0.0;} /* final state */ | |
| 597 | |
| 598 pressure_sim_mbar += delta_mbar; | |
| 599 if(pressure_sim_mbar < surface_pressure_mbar) | |
| 600 { | |
| 601 pressure_sim_mbar = surface_pressure_mbar; | |
| 602 } | |
| 603 #endif | |
| 604 #ifdef SHORTDIVE /* short dive */ | |
| 567 if(passedSecond < 10) pressure_sim_mbar = 1000.0; /* stay stable for 10 seconds */ | 605 if(passedSecond < 10) pressure_sim_mbar = 1000.0; /* stay stable for 10 seconds */ |
| 568 else if(passedSecond < 180) pressure_sim_mbar += 10.0; /* Start dive */ | 606 else if(passedSecond < 180) pressure_sim_mbar += 10.0; /* Start dive */ |
| 569 else if(passedSecond < 300) pressure_sim_mbar += 0.0; /*stay on depth*/ | 607 else if(passedSecond < 300) pressure_sim_mbar += 0.0; /*stay on depth*/ |
| 570 else if(passedSecond < 460) pressure_sim_mbar -= 10.0; /* return to surface */ | 608 else if(passedSecond < 460) pressure_sim_mbar -= 10.0; /* return to surface */ |
| 571 else if(passedSecond < 600) pressure_sim_mbar += 0.0; /* stay */ | 609 else if(passedSecond < 600) pressure_sim_mbar += 0.0; /* stay */ |
| 683 } | 721 } |
| 684 ambient_pressure_mbar = runningAvg; | 722 ambient_pressure_mbar = runningAvg; |
| 685 | 723 |
| 686 if(ambient_pressure_mbar < PRESSURE_MINIMUM) | 724 if(ambient_pressure_mbar < PRESSURE_MINIMUM) |
| 687 { | 725 { |
| 688 ambient_pressure_mbar = 1000.0; | 726 ambient_pressure_mbar = 1000.0 + pressure_offset; |
| 689 } | 727 } |
| 690 } | 728 } |
| 691 | 729 |
| 692 | 730 |
| 693 /* taken from AN520 by meas-spec.com dated 9. Aug. 2011 | 731 /* taken from AN520 by meas-spec.com dated 9. Aug. 2011 |
