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