Mercurial > public > mk2
diff code_part1/OSTC_code_c_part2/p2_deco.c @ 260:bde83cac971f
BUGFIX bb13 : deco_calc_desaturation_time() should reset TBLPTR Upper register.
author | JeanDo |
---|---|
date | Sun, 10 Apr 2011 18:19:42 +0200 |
parents | abbf9a2c2c48 |
children | 9d4ab7c96885 |
line wrap: on
line diff
--- a/code_part1/OSTC_code_c_part2/p2_deco.c Sun Apr 10 15:22:34 2011 +0200 +++ b/code_part1/OSTC_code_c_part2/p2_deco.c Sun Apr 10 18:19:42 2011 +0200 @@ -1887,6 +1887,17 @@ assert( 800 < int_I_pres_surface && int_I_pres_surface < 1100 ); assert( 0 < char_I_desaturation_multiplier && char_I_desaturation_multiplier <= 100 ); +#ifndef CROSS_COMPILE + // Note: we don't use far rom pointer, because the + // 24 bits is to complex, hence we have to set + // the UPPER page ourself... + // --> Set zero if tables are moved to lower pages ! + _asm + movlw 1 + movwf TBLPTRU,0 + _endasm +#endif + N2_ratio = 0.7902; // FIXED sum as stated in bühlmann pres_surface = int_I_pres_surface * 0.001; ppN2 = N2_ratio * (pres_surface - ppWVapour); @@ -1901,16 +1912,12 @@ overlay float temp3; overlay float temp4; - overlay float var_N2_halftime = buhlmann_ht[ci]; - overlay float var_He_halftime = (buhlmann_ht+16)[ci]; - // saturation_time (for flight) and N2_saturation in multiples of halftime // version v.100: 1.1 = 10 percent distance to totally clean (totally clean is not possible, would take infinite time ) // new in version v.101: 1.07 = 7 percent distance to totally clean (totally clean is not possible, would take infinite time ) - // changes in v.101: 1.05 = 5 percent dist to totally clean is new desaturation point for display and noFly calculations + // changes in v.101: 1.05 = 5 percent dist to totally clean is new desaturation point for display and NoFly calculations // N2 - temp1 = 1.05 * ppN2; - temp1 = temp1 - pres_tissue[ci]; + temp1 = 1.05 * ppN2 - pres_tissue[ci]; temp2 = ppN2 - pres_tissue[ci]; if (temp2 >= 0.0) { @@ -1921,14 +1928,14 @@ temp1 = temp1 / temp2; if( 0.0 < temp1 && temp1 < 1.0 ) { - temp1 = log(1.0 - temp1); - temp1 = temp1 / -0.6931; // temp1 is the multiples of half times necessary. - // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested. - // minus because log is negative - temp2 = var_N2_halftime * temp1 / float_desaturation_multiplier; // time necessary (in minutes ) for complete desaturation (see comment about 10 percent) , new in v.101: float_desaturation_multiplier + overlay float var_N2_halftime = buhlmann_ht[ci]; + assert( 4.0 <= var_N2_halftime && var_N2_halftime <= 635.0 ); - // HERE ==> This assert fails during simulated dives, and should not.... - assert( temp2 < 28800.0 ); // 480h !! + // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested. + // minus because log is negative. + temp1 = log(1.0 - temp1) / -0.6931; // temp1 is the multiples of half times necessary. + temp2 = var_N2_halftime * temp1 / float_desaturation_multiplier; // time necessary (in minutes ) for complete desaturation (see comment about 5 percent) , new in v.101: float_desaturation_multiplier + } else { @@ -1944,11 +1951,13 @@ temp4 = 0.0; } else - temp3 = -1.0 * temp3 / (pres_tissue+16)[ci]; + temp3 = - temp3 / (pres_tissue+16)[ci]; if( 0.0 < temp3 && temp3 < 1.0 ) { - temp3 = log(1.0 - temp3); - temp3 = temp3 / -0.6931; // temp1 is the multiples of half times necessary. + overlay float var_He_halftime = (buhlmann_ht+16)[ci]; + assert( 1.51 <= var_N2_halftime && var_N2_halftime <= 240.03 ); + + temp3 = log(1.0 - temp3) / -0.6931; // temp1 is the multiples of half times necessary. // 0.6931 is ln(2), because the math function log() calculates with a base of e not 2 as requested. // minus because log is negative temp4 = var_He_halftime * temp3 / float_desaturation_multiplier; // time necessary (in minutes ) for "complete" desaturation, new in v.101 float_desaturation_multiplier