diff code_part1/OSTC_code_c_part2/p2_deco.c @ 225:2dc4a7340510

BUGFIX Gas usage for unsorted gas list. + Fix detection of saturation (6553.5 l). + Better handling of unsorted gas list.
author JeanDo
date Thu, 03 Mar 2011 15:52:16 +0100
parents 49c90c5d9603
children 24cd6e256d61
line wrap: on
line diff
--- a/code_part1/OSTC_code_c_part2/p2_deco.c	Thu Mar 03 15:16:23 2011 +0100
+++ b/code_part1/OSTC_code_c_part2/p2_deco.c	Thu Mar 03 15:52:16 2011 +0100
@@ -194,11 +194,7 @@
 static float			float_deco_distance;	// new in v.101
 static char			    flag_in_divemode;		// new in v.108
 
-static unsigned char    deco_gas_change1;		// new in v.101
-static unsigned char    deco_gas_change2;		// new in v.109
-static unsigned char    deco_gas_change3;		// new in v.109
-static unsigned char    deco_gas_change4;		// new in v.109
-static unsigned char    deco_gas_change5;		// new in v.109
+static unsigned char    deco_gas_change[5];		// new in v.109
 
 //---- Bank 6 parameters -----------------------------------------------------
 #pragma udata bank6=0x600
@@ -319,7 +315,7 @@
 	DBG_deco_ppO2 = deco_ppO2;
 	DBG_deco_N2_ratio = char_I_deco_N2_ratio[0];
 	DBG_deco_He_ratio = char_I_deco_He_ratio[0];
-	DBG_deco_gas_change = deco_gas_change1;
+	DBG_deco_gas_change = deco_gas_change[0];
 	DBG_float_saturation_multiplier = float_saturation_multiplier;
 	DBG_float_desaturation_multiplier = float_desaturation_multiplier;
 	DBG_float_deco_distance = float_deco_distance;
@@ -427,7 +423,7 @@
 	if(DBG_deco_ppO2 != deco_ppO2)
 		temp_DBS |= DBG_C_DPPO2;
 
-	if( DBG_deco_gas_change != deco_gas_change1
+	if( DBG_deco_gas_change != deco_gas_change[0]
 	 || DBG_deco_N2_ratio != char_I_deco_N2_ratio[0]
 	 || DBG_deco_He_ratio != char_I_deco_He_ratio[0] )
 		temp_DBS |= DBG_C_DGAS;
@@ -861,7 +857,7 @@
 //////////////////////////////////////////////////////////////////////////////
 // Find deepest available gas.
 // 
-// Input:  deco_gas_change*
+// Input:  deco_gas_change[]
 //         sim_gas_delay, sim_gas_last_used, sim_dive_mins.
 //
 // Output: temp_depth_limit, sim_gas_delay, sim_gas_last_used IFF the is a switch.
@@ -873,33 +869,18 @@
 
     if (char_I_const_ppO2 == 0)
     {
-        // Keep selecting the best gas during the ascent simulation.
-        // Add a one meter margin in depth comparaison.
-		if( deco_gas_change1 && ((temp_depth_limit-1) <= deco_gas_change1))
-		{
-            temp_gas_switch = 1;
-            switch_deco = deco_gas_change1;
-    	} 
-        else if(deco_gas_change2 && ((temp_depth_limit-1) <= deco_gas_change2))
-		{
-            temp_gas_switch = 2;
-            switch_deco = deco_gas_change2;
-    	} 
-		else if(deco_gas_change3 && ((temp_depth_limit-1) <= deco_gas_change3))
-		{
-            temp_gas_switch = 3;
-            switch_deco = deco_gas_change3;
-    	}
-		else if(deco_gas_change4 && ((temp_depth_limit-1) <= deco_gas_change4))
-		{
-            temp_gas_switch = 4;
-            switch_deco = deco_gas_change4;
-    	}
-		else if(deco_gas_change5 && ((temp_depth_limit-1) <= deco_gas_change5))
-		{
-            temp_gas_switch = 5;
-            switch_deco = deco_gas_change5;
-    	}
+        overlay unsigned char j;
+
+        // Loop over all enabled gas, to find the deepest enabled one above us.
+        for(temp_gas_switch=j=0; j<5; ++j)
+        {
+            if( temp_depth_limit <= deco_gas_change[j] )
+                if( (temp_gas_switch == 0) || (switch_deco < deco_gas_change[j]) )
+                {
+                    temp_gas_switch = j+1;
+                    switch_deco = deco_gas_change[j];
+                }
+        }
     }
 
     // If there is a better gas available
@@ -942,33 +923,18 @@
 
     if (char_I_const_ppO2 == 0)
     {
-        // Keep selecting the best gas during the ascent simulation.
-        // Add a one meter margin in depth comparaison.
-		if( deco_gas_change5 && ((temp_depth_limit-1) <= deco_gas_change5))
-		{
-            temp_gas_switch = 5;
-            switch_deco = deco_gas_change5;
-    	} 
-        else if(deco_gas_change4 && ((temp_depth_limit-1) <= deco_gas_change4))
-		{
-            temp_gas_switch = 4;
-            switch_deco = deco_gas_change4;
-    	} 
-		else if(deco_gas_change3 && ((temp_depth_limit-1) <= deco_gas_change3))
-		{
-            temp_gas_switch = 3;
-            switch_deco = deco_gas_change3;
-    	}
-		else if(deco_gas_change2 && ((temp_depth_limit-1) <= deco_gas_change2))
-		{
-            temp_gas_switch = 2;
-            switch_deco = deco_gas_change2;
-    	}
-		else if(deco_gas_change1 && ((temp_depth_limit-1) <= deco_gas_change1))
-		{
-            temp_gas_switch = 1;
-            switch_deco = deco_gas_change1;
-    	}
+        overlay unsigned char j;
+
+        // Loop over all enabled gas, to find the shallowest enabled one above us.
+        for(temp_gas_switch=j=0; j<5; ++j)
+        {
+            if( temp_depth_limit <= deco_gas_change[j] )
+                if( (temp_gas_switch == 0) || (switch_deco > deco_gas_change[j]) )
+                {
+                    temp_gas_switch = j+1;
+                    switch_deco = deco_gas_change[j];
+                }
+        }
     }
 
     // If there is a better gas available
@@ -1233,37 +1199,37 @@
     int_temp = (int_I_pres_respiration - int_I_pres_surface)
              + MBAR_REACH_GASCHANGE_AUTO_CHANGE_OFF;
     
-    deco_gas_change1 = 0;
-    deco_gas_change2 = 0;
-    deco_gas_change3 = 0;
-    deco_gas_change4 = 0;
-    deco_gas_change5 = 0;
+    deco_gas_change[0] = 0;
+    deco_gas_change[1] = 0;
+    deco_gas_change[2] = 0;
+    deco_gas_change[3] = 0;
+    deco_gas_change[4] = 0;
 
     // Gas are selectable if we did not pass the change depth by more than 1.50m:
     if(char_I_deco_gas_change[0])
     {
         if( int_temp > 100 *(short)char_I_deco_gas_change[0] )
-        	deco_gas_change1 = char_I_deco_gas_change[0];
+        	deco_gas_change[0] = char_I_deco_gas_change[0];
     }
     if(char_I_deco_gas_change[1])
     {
         if( int_temp > 100 *(short)char_I_deco_gas_change[1] )
-        	deco_gas_change2 = char_I_deco_gas_change[1];
+        	deco_gas_change[1] = char_I_deco_gas_change[1];
     }
     if(char_I_deco_gas_change[2])
     {
         if( int_temp > 100 *(short)char_I_deco_gas_change[2] )
-        	deco_gas_change3 = char_I_deco_gas_change[2];
+        	deco_gas_change[2] = char_I_deco_gas_change[2];
     }
     if(char_I_deco_gas_change[3])
     {
         if( int_temp > 100 *(short)char_I_deco_gas_change[3] )
-        	deco_gas_change4 = char_I_deco_gas_change[3];
+        	deco_gas_change[3] = char_I_deco_gas_change[3];
     }
     if(char_I_deco_gas_change[4])
     {
         if( int_temp > 100 *(short)char_I_deco_gas_change[4] )
-        	deco_gas_change5 = char_I_deco_gas_change[4];
+        	deco_gas_change[4] = char_I_deco_gas_change[4];
     }
 
     const_ppO2 = char_I_const_ppO2 * 0.01;
@@ -2197,7 +2163,7 @@
     {
         overlay unsigned char j, gas;
         // Gas switch depth ?
-        for(gas=j=0; j<4; ++j)
+        for(gas=j=0; j<5; ++j)
         {
             if( char_O_deco_depth[i] <= char_I_deco_gas_change[j] )
                 if( (gas == 0) || (char_I_deco_gas_change[gas] > char_I_deco_gas_change[j]) )
@@ -2206,13 +2172,13 @@
 
         // usage during stop:
         // Note: because first gas is not in there, increment gas+1
-        volumes[gas+1] += (char_O_deco_depth[i]*0.1 + 1.0)// Use Psurface = 1.0 bar.
-                        * char_O_deco_time[i]               // in minutes.
-                        * ascent_usage
+        volumes[gas] += (char_O_deco_depth[i]*0.1 + 1.0)// Use Psurface = 1.0 bar.
+                      * char_O_deco_time[i]               // in minutes.
+                      * ascent_usage
         // Plus usage during ascent to the next stop, at 10m/min.
-                        + (char_O_deco_depth[i]*0.1  + 1.0)
-                        * (char_O_deco_depth[i] - char_O_deco_depth[i+1]) * 0.1
-                        * ascent_usage;
+                      + (char_O_deco_depth[i]*0.1  + 1.0)
+                      * (char_O_deco_depth[i] - char_O_deco_depth[i+1]) * 0.1
+                      * ascent_usage;
     }
 
     //---- convert results for the ASM interface -----------------------------