Mercurial > public > hwos_code
comparison src/p2_deco.c @ 608:d866684249bd
work on 2.99 stable
author | heinrichsweikamp |
---|---|
date | Mon, 07 Jan 2019 21:13:43 +0100 |
parents | ca4556fb60b9 |
children | 7b3903536213 |
comparison
equal
deleted
inserted
replaced
607:c5151a490d88 | 608:d866684249bd |
---|---|
1 // *************************************************************************** | 1 // *************************************************************************** |
2 // p2_deco.c REFACTORED VERSION V2.99e | 2 // p2_deco.c REFACTORED VERSION V2.99f |
3 // | 3 // |
4 // Created on: 12.05.2009 | 4 // Created on: 12.05.2009 |
5 // Author: heinrichs weikamp, contributions by Ralph Lembcke and others | 5 // Author: heinrichs weikamp, contributions by Ralph Lembcke and others |
6 // | 6 // |
7 // *************************************************************************** | 7 // *************************************************************************** |
312 static float sim_CNS_fraction; // CNS after predicted ascent, 0.01 = 1%, as float | 312 static float sim_CNS_fraction; // CNS after predicted ascent, 0.01 = 1%, as float |
313 | 313 |
314 static unsigned int int_sim_CNS_fraction; // CNS after predicted ascent, 1 = 1%, as integer | 314 static unsigned int int_sim_CNS_fraction; // CNS after predicted ascent, 1 = 1%, as integer |
315 | 315 |
316 static unsigned char sim_depth_limit; // depth of next stop in meters, used in deco calculations | 316 static unsigned char sim_depth_limit; // depth of next stop in meters, used in deco calculations |
317 static unsigned char NDL_lead_tissue; // used to cache the tissue to start with when calculating the NDL | 317 static unsigned char NDL_lead_tissue_norm; // used to cache the tissue to start with when calculating the NDL |
318 static unsigned char NDL_lead_tissue_alt; // used to cache the tissue to start with when calculating the NDL | |
318 | 319 |
319 | 320 |
320 // result values from calculation functions | 321 // result values from calculation functions |
321 | 322 |
322 static float ceiling; // minimum tolerated relative pressure (i.e. without surface pressure) | 323 static float ceiling; // minimum tolerated relative pressure (i.e. without surface pressure) |
357 static float float_pSCR_factor; // pre-computed factor for pSCR ppO2 drop calculation | 358 static float float_pSCR_factor; // pre-computed factor for pSCR ppO2 drop calculation |
358 static float calc_pres_tissue_N2; // auxiliary variable to buffer tissue N2 pressure | 359 static float calc_pres_tissue_N2; // auxiliary variable to buffer tissue N2 pressure |
359 static float calc_pres_tissue_He; // auxiliary variable to buffer tissue He pressure | 360 static float calc_pres_tissue_He; // auxiliary variable to buffer tissue He pressure |
360 static float pres_tissue; // auxiliary variable to buffer total tissue pressure | 361 static float pres_tissue; // auxiliary variable to buffer total tissue pressure |
361 | 362 |
362 // 11 byte free space left in this bank (4 bytes per float, 2 bytes per int/short, 1 byte per char) | 363 // 10 byte free space left in this bank (4 bytes per float, 2 bytes per int/short, 1 byte per char) |
363 | 364 |
364 | 365 |
365 //---- Bank 6 parameters ----------------------------------------------------- | 366 //---- Bank 6 parameters ----------------------------------------------------- |
366 #ifndef UNIX | 367 #ifndef UNIX |
367 # pragma udata bank6=0x600 | 368 # pragma udata bank6=0x600 |
1104 } | 1105 } |
1105 else | 1106 else |
1106 { | 1107 { |
1107 // yes - set flag for stop needed to 'no' | 1108 // yes - set flag for stop needed to 'no' |
1108 need_stop = 0; | 1109 need_stop = 0; |
1109 | 1110 |
1110 // set depth we can ascent to as 0 = surface | 1111 // set depth we can ascent to as 0 = surface |
1111 sim_depth_limit = 0; | 1112 sim_depth_limit = 0; |
1112 } | 1113 } |
1113 } | 1114 } |
1114 | 1115 |
2012 int_O_alternate_ascenttime = 0; // reset ascent time for the alternative plan | 2013 int_O_alternate_ascenttime = 0; // reset ascent time for the alternative plan |
2013 char_O_deco_warnings = 0; // reset all deco warnings | 2014 char_O_deco_warnings = 0; // reset all deco warnings |
2014 char_O_deco_info = 0; // reset all deco infos | 2015 char_O_deco_info = 0; // reset all deco infos |
2015 deco_tissue_vector = 0; // reset tissue deco vector | 2016 deco_tissue_vector = 0; // reset tissue deco vector |
2016 IBCD_tissue_vector = 0; // reset tissue IBCD vector | 2017 IBCD_tissue_vector = 0; // reset tissue IBCD vector |
2017 NDL_lead_tissue = 0; // reset first tissue to look at during NDL calculation | 2018 NDL_lead_tissue_norm = 0; // reset first tissue to look at during NDL calculation |
2019 NDL_lead_tissue_alt = 0; // reset first tissue to look at during NDL calculation | |
2018 | 2020 |
2019 // tag desaturation time as invalid (it will not be computed during a dive) | 2021 // tag desaturation time as invalid (it will not be computed during a dive) |
2020 int_O_desaturation_time = 65535; | 2022 int_O_desaturation_time = 65535; |
2021 | 2023 |
2022 // initialize values for first stop depth and GF slope | 2024 // initialize values for first stop depth and GF slope |
2728 // Modified: | 2730 // Modified: |
2729 // char_O_deco_warnings : for IBCD, microbubbles and outside warning (only in real tissues context) | 2731 // char_O_deco_warnings : for IBCD, microbubbles and outside warning (only in real tissues context) |
2730 // | 2732 // |
2731 static void calc_limit(PARAMETER float GF_parameter) | 2733 static void calc_limit(PARAMETER float GF_parameter) |
2732 { | 2734 { |
2733 overlay float lead_tissue_limit = 0.0; | 2735 overlay float lead_tissue_limit = 0.0; |
2734 | 2736 |
2735 | 2737 |
2736 // set leading tissue number to not yet computed | 2738 // set leading tissue number to not yet computed |
2737 lead_number = 0; | 2739 lead_number = 0; |
2738 | 2740 |
2779 | 2781 |
2780 // next calculations are only relevant when invoked on the real tissues | 2782 // next calculations are only relevant when invoked on the real tissues |
2781 if( tissue_increment & TISSUE_FLAG ) | 2783 if( tissue_increment & TISSUE_FLAG ) |
2782 { | 2784 { |
2783 overlay float supersat; | 2785 overlay float supersat; |
2784 overlay float limit_warning; | 2786 overlay float baseline_threshold; |
2785 | 2787 |
2786 // calculate current supersaturation value (1.0 = 100%) of this tissue according to straight Buhlmann | 2788 // calculate current supersaturation value (1.0 = 100%) of this tissue according to straight Buhlmann |
2787 supersat = (pres_tissue - real_pres_respiration) / (pres_tissue - pres_min); | 2789 supersat = (pres_tissue - real_pres_respiration) / (pres_tissue - pres_min); |
2788 | 2790 |
2789 // check if tissue is in supersaturation | 2791 // check if tissue is in supersaturation |
2790 if( supersat > 0.0 ) | 2792 if( supersat > 0.0 ) |
2791 { | 2793 { |
2792 // memorize highest supersaturation found | 2794 // memorize highest supersaturation found |
2793 if( supersat > lead_supersat ) lead_supersat = supersat; | 2795 if( supersat > lead_supersat ) lead_supersat = supersat; |
2794 | 2796 |
2795 // limit value for micro bubbles and outside warnings | 2797 // tissue-dependent baseline threshold for micro bubbles and outside warnings |
2796 limit_warning = 0.02 * ci + 0.9; | 2798 baseline_threshold = 0.02 * ci + 1.0; |
2797 | 2799 |
2798 // micro bubbles warning: supersaturation >= limit_warning OR >= 1.0 | 2800 // micro bubbles warning: supersaturation > baseline threshold |
2799 if( (supersat >= limit_warning) || (supersat >= 1.0) ) | 2801 if( supersat > baseline_threshold ) |
2800 char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock); | 2802 char_O_deco_warnings |= (DECO_WARNING_MBUBBLES + DECO_WARNING_MBUBBLES_lock); |
2801 | 2803 |
2802 // outside warning: supersaturation >= limit_warning AND >= 1.0 | 2804 // outside warning: supersaturation > baseline threshold + additional 5% margin |
2803 if( (supersat >= limit_warning) && (supersat >= 1.0) ) | 2805 if( supersat > baseline_threshold + 0.05 ) |
2804 char_O_deco_warnings |= (DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock ); | 2806 char_O_deco_warnings |= (DECO_WARNING_OUTSIDE + DECO_WARNING_OUTSIDE_lock ); |
2805 } | 2807 } |
2806 } | 2808 } |
2807 | 2809 |
2808 // Apply the Eric Baker's varying gradient factor correction if the GF-Model is selected. | 2810 // Apply the Eric Baker's varying gradient factor correction if the GF-Model is selected. |
2871 // select gradient factor to use | 2873 // select gradient factor to use |
2872 GF_factor = (char_I_deco_model != 0) ? GF_high : 1.0; | 2874 GF_factor = (char_I_deco_model != 0) ? GF_high : 1.0; |
2873 | 2875 |
2874 // the fastest way to find out if already being beyond NDL is to start with | 2876 // the fastest way to find out if already being beyond NDL is to start with |
2875 // the tissue that was the leading one during the last NDL computation... | 2877 // the tissue that was the leading one during the last NDL computation... |
2876 ci = i + NDL_lead_tissue; | 2878 ci = (char_O_deco_status & DECO_PLAN_ALTERNATE) ? (NDL_lead_tissue_alt + i) : (NDL_lead_tissue_norm + i); |
2877 | 2879 |
2878 // wrap around after the 16th tissue | 2880 // wrap around after the 16th tissue |
2879 if( ci >= NUM_COMP ) ci -= NUM_COMP; | 2881 if( ci >= NUM_COMP ) ci -= NUM_COMP; |
2880 | 2882 |
2881 // read the loading factors for 10 minute iterations | 2883 // read the loading factors for 10 minute iterations |
2986 // If NDL found to be overrun, outer loop will be terminated by means of the i = NUM_COMP statement. | 2988 // If NDL found to be overrun, outer loop will be terminated by means of the i = NUM_COMP statement. |
2987 | 2989 |
2988 } // outer for-loop iterating over all tissues | 2990 } // outer for-loop iterating over all tissues |
2989 | 2991 |
2990 // store the NDL dominating tissue for to start with in the next NDL calculation | 2992 // store the NDL dominating tissue for to start with in the next NDL calculation |
2991 NDL_lead_tissue = new_NDL_lead_tissue; | 2993 if( char_O_deco_status & DECO_PLAN_ALTERNATE ) NDL_lead_tissue_alt = new_NDL_lead_tissue; |
2994 else NDL_lead_tissue_norm = new_NDL_lead_tissue; | |
2992 } | 2995 } |
2993 | 2996 |
2994 | 2997 |
2995 ////////////////////////////////////////////////////////////////////////////// | 2998 ////////////////////////////////////////////////////////////////////////////// |
2996 // calc_ascenttime | 2999 // calc_ascenttime |
3705 | 3708 |
3706 // volumes are only calculated for gases 1-5, but not the manually configured one | 3709 // volumes are only calculated for gases 1-5, but not the manually configured one |
3707 if( stop_gas ) | 3710 if( stop_gas ) |
3708 { | 3711 { |
3709 // compute distance between bottom and first stop | 3712 // compute distance between bottom and first stop |
3710 float_depth = (float)(char_bottom_depth - stop_depth); | 3713 float_depth = (float)char_bottom_depth - (float)stop_depth; |
3711 | 3714 |
3712 // initial ascent exists only if ascent distance is > 0 | 3715 // initial ascent exists only if ascent distance is > 0 |
3713 if( float_depth > 0.0 ) | 3716 if( float_depth > 0.0 ) |
3714 { | 3717 { |
3715 // compute ascent time | 3718 // compute ascent time |
3984 int_O_gradient_factor = (unsigned int)(100 * lead_supersat + 0.5); | 3987 int_O_gradient_factor = (unsigned int)(100 * lead_supersat + 0.5); |
3985 | 3988 |
3986 if( char_I_deco_model != 0 ) | 3989 if( char_I_deco_model != 0 ) |
3987 { | 3990 { |
3988 // GF factors enabled | 3991 // GF factors enabled |
3989 if( int_O_gradient_factor >= char_I_GF_High_percentage ) | 3992 if ( int_O_gradient_factor > 99 ) |
3993 { | |
3994 int_O_gradient_factor |= INT_FLAG_WARNING; // make GF factor shown in red | |
3995 } | |
3996 else if( int_O_gradient_factor > char_I_GF_High_percentage ) | |
3990 { | 3997 { |
3991 int_O_gradient_factor |= INT_FLAG_ATTENTION; // make GF factor shown in yellow | 3998 int_O_gradient_factor |= INT_FLAG_ATTENTION; // make GF factor shown in yellow |
3992 char_O_deco_warnings |= DECO_ATTENTION_OUTSIDE; // make depth blink in yellow | 3999 char_O_deco_warnings |= DECO_ATTENTION_OUTSIDE; // make depth blink in yellow |
3993 } | 4000 } |
3994 | 4001 } |
3995 if( int_O_gradient_factor >= 100 ) | 4002 else |
4003 { | |
4004 // straight Buhlmann | |
4005 if ( int_O_gradient_factor > 100 ) | |
3996 int_O_gradient_factor |= INT_FLAG_WARNING; // make GF factor shown in red | 4006 int_O_gradient_factor |= INT_FLAG_WARNING; // make GF factor shown in red |
3997 } | 4007 |
3998 else | 4008 else if ( int_O_gradient_factor > 99 ) |
3999 { | |
4000 // straight Buhlmann | |
4001 if ( int_O_gradient_factor >= 100 ) | |
4002 int_O_gradient_factor |= INT_FLAG_WARNING; // make GF factor shown in red | |
4003 | |
4004 else if ( int_O_gradient_factor >= 90 ) | |
4005 { | 4009 { |
4006 int_O_gradient_factor |= INT_FLAG_ATTENTION; // make GF factor shown in yellow | 4010 int_O_gradient_factor |= INT_FLAG_ATTENTION; // make GF factor shown in yellow |
4007 char_O_deco_warnings |= DECO_ATTENTION_OUTSIDE; // make depth blink in yellow | 4011 char_O_deco_warnings |= DECO_ATTENTION_OUTSIDE; // make depth blink in yellow |
4008 } | 4012 } |
4009 } | 4013 } |