changeset 262:f4c16ea0354a

Merged in janlmulder/ostc4/bm-3 (pull request #19) Buelhmann cleanup , 2 small functional changes, and 1 bugfix
author heinrichsweikamp <bitbucket@heinrichsweikamp.com>
date Tue, 23 Apr 2019 14:21:32 +0000 (2019-04-23)
parents 1b9be6040d82 (current diff) cc2406b835ff (diff)
children cf6ad20380fb
files
diffstat 4 files changed, 122 insertions(+), 219 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgtags	Tue Apr 23 14:21:32 2019 +0000
@@ -0,0 +1,1 @@
+1b9be6040d8279117c7fc99d528790611638f10b V1.4.7 release
--- a/Discovery/Src/buehlmann.c	Sat Apr 13 14:36:33 2019 +0200
+++ b/Discovery/Src/buehlmann.c	Tue Apr 23 14:21:32 2019 +0000
@@ -9,30 +9,16 @@
 */
 
 #include <string.h>
-//#include "arm_math.h"
 #include <math.h>
 #include <stdbool.h>
 #include "buehlmann.h"
 #include "decom.h"
 
-
 extern const float buehlmann_N2_a[];
 extern const float buehlmann_N2_b[];
 extern const float buehlmann_He_a[];
 extern const float buehlmann_He_b[];
 
-
-/*
-typedef struct
-{
-	float *pointer_array_tissue_nitrogen_bar;
-	float *pointer_array_tissue_helium_bar;
-	char gf_value;
-
-	float output_ceiling_ambient_bar_or_input;
-	_Bool output_ceiling_tolerated_if_ceiling_used_as_input;
-}		tissue_test_tolerance_struct;
-*/
 typedef struct
 {
 	float depth;
@@ -47,74 +33,45 @@
 # define PRESSURE_THREE_METER 0.333334f
 # define PRESSURE_150_CM 0.15f
 # define PRESSURE_HALF_METER 0.05f
-/*
-# define PRESSURE_150_CM_MBAR 150
-# define PRESSURE_TWO_M_MBAR 200
-# define PRESSURE_FIVE_M_MBAR 500
-# define PRESSURE_TEN_M_MBAR 1000
-# define PRESSURE_120_METER 12.0
-*/
-/*
-_____________________________________________________________
-*/
-
-
-void buehlmann_backup_and_restore(_Bool backup_restore_otherwise);
-float tissue_tolerance(void);
-void ambient_bar_to_deco_stop_depth_bar(float ceiling);
-int ascend_with_all_gaschanges(float pressure_decrease);
-float next_stop_depth_input_is_actual_stop_id(int actual_id);
-float get_gf_at_pressure(float pressure);
-void buehlmann_calc_ndl(void);
-_Bool dive1_check_deco(void);
 
-/*
-_____________________________________________________________
-*/
+static void buehlmann_backup_and_restore(_Bool backup_restore_otherwise);
+static float tissue_tolerance(void);
+static void ambient_bar_to_deco_stop_depth_bar(SDiveSettings *pDiveSettings, float ceiling);
+static int ascend_with_all_gaschanges(SDiveSettings *pDiveSettings, float pressure_decrease);
+static float next_stop_depth_input_is_actual_stop_id(SDiveSettings *pDiveSettings, int actual_id);
+static float get_gf_at_pressure(SDiveSettings *pDiveSettings, float pressure);
+static int buehlmann_calc_ndl(SDiveSettings *pDiveSettings);
+static _Bool dive1_check_deco(SDiveSettings *pDiveSettings);
 
-SDecoinfo gDecotable;
-float gSurface_pressure_bar;
-float gPressure;
-int gGas_id;
-float gTTS;
-float gTissue_nitrogen_bar[16];
-float gTissue_helium_bar[16];
-float gGF_value;
-float gCNS;
-//float gMax_ceiling_bar = 0;
-int gNDL;
+static float gSurface_pressure_bar;
+static float gPressure;
+static int gGas_id;
+static float gTissue_nitrogen_bar[16];
+static float gTissue_helium_bar[16];
+static float gGF_value;
+static float gCNS;
 
-
-//SLifeData *pLifeData;
-SDiveSettings *pBuDiveSettings;
-SDecoinfo* pDecolistBuehlmann;
-//signed char gGaschange_decreasing_depth_gas_id[BUEHLMANN_STRUCT_MAX_GASES];
 float gGF_low_depth_bar;
 SStop gStop;
 
 void buehlmann_init(void)
 {
-  //gMax_ceiling_bar = 0;
 }
 
-void buehlmann_backup_and_restore(_Bool backup_restore_otherwise)
+static void buehlmann_backup_and_restore(_Bool backup_restore_otherwise)
 {
 	static float pressure;
 	static float gas_id;
-	static float tts;
 	static float tissue_nitrogen_bar[16];
 	static float tissue_helium_bar[16];
 	static float gf_value;
-	static int ndl;
 	static float cns;
 
 	if(backup_restore_otherwise)
 	{
 		pressure = gPressure;
 		gas_id = gGas_id;
-		tts = gTTS;
 		gf_value = gGF_value;
-		ndl = gNDL;
 		cns = gCNS;
 		memcpy(tissue_nitrogen_bar, gTissue_nitrogen_bar, (4*16));
 		memcpy(tissue_helium_bar, gTissue_helium_bar, (4*16));
@@ -123,32 +80,13 @@
 	{
 		gPressure = pressure;
 		gGas_id = gas_id;
-		gTTS = tts;
 		gGF_value = gf_value;
-		gNDL = ndl;
 		gCNS = cns;
 		memcpy(gTissue_nitrogen_bar, tissue_nitrogen_bar, (4*16));
 		memcpy(gTissue_helium_bar, tissue_helium_bar, (4*16));
 	}
 
 }
-/*void buehlmann__test__saturate_tissues(SBuehlmann *pInput,  int seconds)
-{
-	pBuehlmann = pInput;
-	pInput->dive_time_seconds += seconds;
-	// internal copying
-	gSurface_pressure_bar = pBuehlmann->pressure_surface_bar;
-
-	gPressure = pBuehlmann->pressure_ambient_bar;
-	gGas_id = pBuehlmann->actual_gas_id;
-	memcpy(gTissue_nitrogen_bar, pBuehlmann->tissue_nitrogen_bar, (4*16));
-	memcpy(gTissue_helium_bar, pBuehlmann->tissue_helium_bar, (4*16));
-
-	tissues_exposure_at_gPressure_seconds(seconds);
-
-	memcpy(pBuehlmann->tissue_nitrogen_bar, gTissue_nitrogen_bar, (4*16));
-	memcpy(pBuehlmann->tissue_helium_bar, gTissue_helium_bar, (4*16));
-}*/
 
 float buehlmann_get_gCNS(void)
 {
@@ -163,23 +101,17 @@
 	float pressure_delta;
 	float next_depth;
 	_Bool deco_reached = false;
-//	tissue_test_tolerance_struct tolerance_data;
 	unsigned short *stoplist;
 	int i;
-	
-   // decom_CreateGasChangeList(pDiveSettings, pLifeData);
 
 	gCNS = 0;
-  pDecoInfo->output_time_to_surface_seconds = 0;
+	pDecoInfo->output_time_to_surface_seconds = 0;
 	pDecoInfo->output_ndl_seconds = 0;
 	for(int i=0;i<DECOINFO_STRUCT_MAX_STOPS;i++)
 	{
 		pDecoInfo->output_stop_length_seconds[i] = 0;
 	}
-	/* make input available global*/
-	pBuDiveSettings = pDiveSettings;
 
-  pDecolistBuehlmann = pDecoInfo;
 	/* internal copying */
 	gSurface_pressure_bar = pLifeData->pressure_surface_bar;
 
@@ -187,59 +119,42 @@
 	gGas_id = 0;
 	memcpy(gTissue_nitrogen_bar, pLifeData->tissue_nitrogen_bar, (4*16));
 	memcpy(gTissue_helium_bar, pLifeData->tissue_helium_bar, (4*16));
-	gGF_value = ((float)pBuDiveSettings->gf_low) / 100.0f;
+	gGF_value = ((float)pDiveSettings->gf_low) / 100.0f;
 	
-	//
-	memcpy(&gDecotable, pDecolistBuehlmann, sizeof(SDecoinfo));
-	stoplist = gDecotable.output_stop_length_seconds;
+	stoplist = pDecoInfo->output_stop_length_seconds;
 
-
-  if(pLifeData->dive_time_seconds < 60)
-    return;
-	/* coupling */
-
-	/* functions */
+	if(pLifeData->dive_time_seconds < 60)
+		return;
 
 	// clean stop list
 	for(i = 0; i < DECOINFO_STRUCT_MAX_STOPS; i++)
 		stoplist[i] = 0;
-	gTTS = 0;
-	gNDL = 0;
 
-  if(pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero >= (gPressure - PRESSURE_150_CM))
-  {
-    deco_reached = true;
-  }
-
+	if(pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero >= (gPressure - PRESSURE_150_CM))
+	{
+		deco_reached = true;
+	}
 
-//ascend_with_all_gaschanges(gPressure - gSurface_pressure_bar);
-	gGF_value = ((float)pBuDiveSettings->gf_high) / 100.0f;
-	//iling = tissue_tolerance();
-	// includes backup for gGF_value
-	// NDL
-	buehlmann_backup_and_restore(true); // includes backup for gGF_value
-	if(!dive1_check_deco() )
+	gGF_value = ((float)pDiveSettings->gf_high) / 100.0f;
+	buehlmann_backup_and_restore(true);
+	if(!dive1_check_deco(pDiveSettings) )
 	{
-	  buehlmann_backup_and_restore(false);
+		buehlmann_backup_and_restore(false);
 		// no deco
-		pDecolistBuehlmann->output_time_to_surface_seconds = 0;
+	  	pDecoInfo->output_time_to_surface_seconds = 0;
 		for(i = 0; i < DECOINFO_STRUCT_MAX_STOPS; i++)
-			pDecolistBuehlmann->output_stop_length_seconds[i] = 0;
+			pDecoInfo->output_stop_length_seconds[i] = 0;
 		// calc NDL
-		buehlmann_calc_ndl();
-		pDecolistBuehlmann->output_ndl_seconds = gNDL;
+		pDecoInfo->output_ndl_seconds = buehlmann_calc_ndl(pDiveSettings);;
 		return;
 	}
 	buehlmann_backup_and_restore(false);
-	pDecolistBuehlmann->output_ndl_seconds = 0;
+	pDecoInfo->output_ndl_seconds = 0;
 
-  gGF_value = get_gf_at_pressure(gPressure);
+	gGF_value = get_gf_at_pressure(pDiveSettings, gPressure);
 	//current ceiling at actual position
 	ceiling = tissue_tolerance();
-	//if(ceiling < pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero)
-		//ambient_bar_to_deco_stop_depth_bar(pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero);
-	//else
-  ambient_bar_to_deco_stop_depth_bar(ceiling);
+	ambient_bar_to_deco_stop_depth_bar(pDiveSettings, ceiling);
 
 	// set the base for all upcoming parameters
 	ceiling = gStop.depth + gSurface_pressure_bar;
@@ -251,29 +166,27 @@
 		// ascend within 10 mtr to GF_low // speed 12 mtr/min -> 50 sec / 10 mtr;  15 sec / 3 mtr.
 		if(ceiling < (gPressure - PRESSURE_TEN_METER) )
 		{ do {
-				ascend_time = ascend_with_all_gaschanges(PRESSURE_TEN_METER);
+				ascend_time = ascend_with_all_gaschanges(pDiveSettings, PRESSURE_TEN_METER);
 				tts_seconds += ascend_time;
 				ceiling = tissue_tolerance();
 				if(tts_seconds > DECO_STOPS_MAX_TTS_CALCULATON_IN_SECONDS)
 			{
-				/* pInput == pBuehlmann */
-				pDecolistBuehlmann->output_time_to_surface_seconds = NINETY_NINE_MINUTES_IN_SECONDS;
+				pDecoInfo->output_time_to_surface_seconds = NINETY_NINE_MINUTES_IN_SECONDS;
 				return;// NINETY_NINE_MINUTES_IN_SECONDS;
 			}
 			} while ((ascend_time > 0 ) && ((gPressure - PRESSURE_TEN_METER ) > gSurface_pressure_bar) && (ceiling < (gPressure - PRESSURE_TEN_METER)));
 		}
 		do {
 			buehlmann_backup_and_restore(true);
-			ascend_time = ascend_with_all_gaschanges(PRESSURE_THREE_METER);
+			ascend_time = ascend_with_all_gaschanges(pDiveSettings, PRESSURE_THREE_METER);
 			tts_seconds += ascend_time;
 			ceiling = tissue_tolerance();
 			if(tts_seconds > DECO_STOPS_MAX_TTS_CALCULATON_IN_SECONDS)
 			{
-				/* pInput == pBuehlmann */
-				pDecolistBuehlmann->output_time_to_surface_seconds = NINETY_NINE_MINUTES_IN_SECONDS;
+				pDecoInfo->output_time_to_surface_seconds = NINETY_NINE_MINUTES_IN_SECONDS;
 				return;// NINETY_NINE_MINUTES_IN_SECONDS;
 			}
-			ambient_bar_to_deco_stop_depth_bar(ceiling);
+			ambient_bar_to_deco_stop_depth_bar(pDiveSettings, ceiling);
 		} while ((ascend_time > 0 ) &&  ((gStop.depth + gSurface_pressure_bar) < gPressure));
 
 		if(gStop.depth + gSurface_pressure_bar > gPressure)
@@ -290,28 +203,23 @@
 		// initial values, upper code might not be executed (is within 150 cm)
 	}
 
-
-
-
-  if(ceiling > gSurface_pressure_bar)
-  {
-
-    ceiling = gStop.depth + gSurface_pressure_bar;
-    // ascend the last meters to first stop (especially consider any gas changes around)
-    pressure_delta = gPressure - ceiling;
-    ascend_time = (int)ceil(pressure_delta * 50.0f);
-    tts_seconds += ascend_with_all_gaschanges(pressure_delta);
-  }
+	if (ceiling > gSurface_pressure_bar)
+	{
+		ceiling = gStop.depth + gSurface_pressure_bar;
+		// ascend the last meters to first stop (especially consider any gas changes around)
+		pressure_delta = gPressure - ceiling;
+		ascend_time = (int) ceil(pressure_delta * 50.0f);
+		tts_seconds += ascend_with_all_gaschanges(pDiveSettings, pressure_delta);
+	}
 	// NDL check
 	if(ceiling <= gSurface_pressure_bar)
 	{
-		/* pInput == pBuehlmann  same pointer*/
 		// NDL with GF_low
-		pDecolistBuehlmann->output_time_to_surface_seconds = 0;
+		pDecoInfo->output_time_to_surface_seconds = 0;
 		return;
 	}
-  if(ceiling >pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero)
-    pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero = ceiling;
+	if (ceiling > pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero)
+		pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero = ceiling;
 
 	// calc gf loop
 	if(deco_reached)
@@ -323,16 +231,16 @@
 	{
 		do
 		{
-			next_depth = next_stop_depth_input_is_actual_stop_id(gStop.id);
-      gGF_value = get_gf_at_pressure(next_depth + gSurface_pressure_bar);
+			next_depth = next_stop_depth_input_is_actual_stop_id(pDiveSettings, gStop.id);
+			gGF_value = get_gf_at_pressure(pDiveSettings, next_depth + gSurface_pressure_bar);
 			buehlmann_backup_and_restore(true);
-			ascend_time = ascend_with_all_gaschanges(gStop.depth - next_depth);
+			ascend_time = ascend_with_all_gaschanges(pDiveSettings, gStop.depth - next_depth);
 			ceiling = tissue_tolerance();
 			/* pre check actual limit */
-			if(gDecotable.output_stop_length_seconds[gStop.id] >= 999*60)
+			if(pDecoInfo->output_stop_length_seconds[gStop.id] >= 999*60)
 			{
-				tts_seconds -= 999*60 - gDecotable.output_stop_length_seconds[gStop.id];
-				gDecotable.output_stop_length_seconds[gStop.id] = 999*60;
+				tts_seconds -= 999*60 - pDecoInfo->output_stop_length_seconds[gStop.id];
+				pDecoInfo->output_stop_length_seconds[gStop.id] = 999*60;
 			}
 			else
 			/* more deco on the actual depth */
@@ -340,19 +248,19 @@
 			{
 				next_depth = -1;
 				buehlmann_backup_and_restore(false);
-				decom_tissues_exposure2(10, &pBuDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar); // some seconds at least at each stop
-				decom_oxygen_calculate_cns_exposure(10, &pBuDiveSettings->decogaslist[gGas_id], gPressure, &gCNS);
-        gDecotable.output_stop_length_seconds[gStop.id] += 10;
+				decom_tissues_exposure2(10, &pDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar); // some seconds at least at each stop
+				decom_oxygen_calculate_cns_exposure(10, &pDiveSettings->decogaslist[gGas_id], gPressure, &gCNS);
+				pDecoInfo->output_stop_length_seconds[gStop.id] += 10;
         tts_seconds += 10;
 			}
 		} while(next_depth == -1);
-    tts_seconds += ascend_time;
+		tts_seconds += ascend_time;
 		gStop.depth = next_depth;
     for(i = gGas_id + 1; i < BUEHLMANN_STRUCT_MAX_GASES; i++)
     {
-        if(pBuDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0)
+        if(pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0)
             break;
-        float pressureChange =  ((float)pBuDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero) / 10;
+        float pressureChange =  ((float)pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero) / 10;
         if(gStop.depth <= pressureChange + 0.00001f)
         {
             gGas_id = i;
@@ -365,12 +273,11 @@
 		gStop.id--;
 	}
 
-  gDecotable.output_time_to_surface_seconds = tts_seconds;
-	memcpy(pDecolistBuehlmann, &gDecotable, sizeof(SDecoinfo));
+	pDecoInfo->output_time_to_surface_seconds = tts_seconds;
 }
 
 
-float tissue_tolerance(void)
+static float tissue_tolerance(void)
 {
 	float tissue_inertgas_saturation;
 	float inertgas_a;
@@ -445,7 +352,7 @@
 }
 
 
-float buehlmann_tissue_test_tolerance(float depth_in_bar_absolute)
+static float buehlmann_tissue_test_tolerance(float depth_in_bar_absolute)
 {
 	float tissue_inertgas_saturation;
 	float inertgas_a;
@@ -477,7 +384,7 @@
 }
 
 
-void ambient_bar_to_deco_stop_depth_bar(float ceiling)
+static void ambient_bar_to_deco_stop_depth_bar(SDiveSettings *pDiveSettings, float ceiling)
 {
 	int i;
 
@@ -485,59 +392,56 @@
 
 	if(ceiling <= 0)
 	{
-		gStop.depth = pBuDiveSettings->last_stop_depth_bar;
+		gStop.depth = pDiveSettings->last_stop_depth_bar;
 		gStop.id = 0;
 		return;
 	}
 
-
-    //for(int i = 1; i < 10; i++)
-
-	if((ceiling -  pBuDiveSettings->last_stop_depth_bar) <= 0)
+	if((ceiling -  pDiveSettings->last_stop_depth_bar) <= 0)
 	{
-		gStop.depth =  pBuDiveSettings->last_stop_depth_bar;
+		gStop.depth =  pDiveSettings->last_stop_depth_bar;
 		gStop.id = 0;
 		return;
 	}
 
-	gStop.depth = pBuDiveSettings->input_second_to_last_stop_depth_bar;
+	gStop.depth = pDiveSettings->input_second_to_last_stop_depth_bar;
 	gStop.id = 1;
-	ceiling -= pBuDiveSettings->input_second_to_last_stop_depth_bar;
+	ceiling -= pDiveSettings->input_second_to_last_stop_depth_bar;
 
 	if(ceiling <= 0)
 		return;
 
 	for(i = 1; i < (DECOINFO_STRUCT_MAX_STOPS - 2); i++)
 	{
-		ceiling -= pBuDiveSettings->input_next_stop_increment_depth_bar;
+		ceiling -= pDiveSettings->input_next_stop_increment_depth_bar;
 		if(ceiling <= 0)
 			break;
 	}
-	gStop.depth += i * pBuDiveSettings->input_next_stop_increment_depth_bar;
+	gStop.depth += i * pDiveSettings->input_next_stop_increment_depth_bar;
 	gStop.id += i;
 	return;
 }
 
-float next_stop_depth_input_is_actual_stop_id(int actual_id)
+static float next_stop_depth_input_is_actual_stop_id(SDiveSettings *pDiveSettings, int actual_id)
 {
 	if(actual_id == 0)
 		return 0;
 
 	if(actual_id == 1)
-		return pBuDiveSettings->last_stop_depth_bar;
+		return pDiveSettings->last_stop_depth_bar;
 
 	actual_id -= 2;
-	return pBuDiveSettings->input_second_to_last_stop_depth_bar + (actual_id * pBuDiveSettings->input_next_stop_increment_depth_bar);
+	return pDiveSettings->input_second_to_last_stop_depth_bar + (actual_id * pDiveSettings->input_next_stop_increment_depth_bar);
 }
 
-int ascend_with_all_gaschanges(float pressure_decrease)
+static int ascend_with_all_gaschanges(SDiveSettings *pDiveSettings, float pressure_decrease)
 {
 	float pressureTop, pressureTop_tmp, pressureBottom, pressureChange, ascendrate_in_seconds_for_one_bar, pressure_difference;
 	int time_for_ascend = 0;
 	int seconds;
 	int i;
 
-	ascendrate_in_seconds_for_one_bar = 60 * 10 / pBuDiveSettings->ascentRate_meterperminute;
+	ascendrate_in_seconds_for_one_bar = 60 * 10 / pDiveSettings->ascentRate_meterperminute;
 
 	if(fabsf(gPressure - gSurface_pressure_bar) < PRESSURE_HALF_METER)
 	{
@@ -554,9 +458,9 @@
         pressureTop_tmp = pressureTop;
         for(i = gGas_id + 1; i < BUEHLMANN_STRUCT_MAX_GASES; i++)
         {
-            if(pBuDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0)
+            if(pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0)
                 break;
-            pressureChange = gSurface_pressure_bar + ((float)pBuDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero) / 10;
+            pressureChange = gSurface_pressure_bar + ((float)pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero) / 10;
             if(pressureBottom <= pressureChange)
             {
                 gGas_id = i;
@@ -569,9 +473,9 @@
         }
         for(i = gGas_id + 1; i < BUEHLMANN_STRUCT_MAX_GASES; i++)
         {
-            if(pBuDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0)
+            if(pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0)
                 break;
-            pressureChange = gSurface_pressure_bar + ((float)pBuDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero)/ 10;
+            pressureChange = gSurface_pressure_bar + ((float)pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero)/ 10;
             if((pressureChange < pressureBottom) && (pressureChange > pressureTop))
             {
                 pressureTop_tmp = pressureChange;
@@ -581,9 +485,9 @@
         if(pressure_difference > 0.0001f)
         {
           time_for_ascend = (int)ceilf(pressure_difference * ascendrate_in_seconds_for_one_bar);
-          decom_tissues_exposure_stage_schreiner(time_for_ascend, &pBuDiveSettings->decogaslist[gGas_id],
+          decom_tissues_exposure_stage_schreiner(time_for_ascend, &pDiveSettings->decogaslist[gGas_id],
                                               pressureBottom, pressureTop_tmp, gTissue_nitrogen_bar, gTissue_helium_bar);
-					decom_oxygen_calculate_cns_stage_SchreinerStyle(time_for_ascend,&pBuDiveSettings->decogaslist[gGas_id],
+					decom_oxygen_calculate_cns_stage_SchreinerStyle(time_for_ascend,&pDiveSettings->decogaslist[gGas_id],
                                               pressureBottom, pressureTop_tmp, &gCNS);
         }
         pressureBottom = pressureTop_tmp;
@@ -594,47 +498,46 @@
 }
 
 
-float get_gf_at_pressure(float pressure)
+static float get_gf_at_pressure(SDiveSettings *pDiveSettings, float pressure)
 {
 	float gfSteigung = 0.0f;
 
 	if(gGF_low_depth_bar < 0)
 			gGF_low_depth_bar = PRESSURE_THREE_METER; // just to prevent erratic behaviour if variable is not set
 
-    gfSteigung = ((float)(pBuDiveSettings->gf_high - pBuDiveSettings->gf_low))/ gGF_low_depth_bar;
+    gfSteigung = ((float)(pDiveSettings->gf_high - pDiveSettings->gf_low))/ gGF_low_depth_bar;
 
 
 	if((pressure - gSurface_pressure_bar) <= PRESSURE_HALF_METER)
-		return ((float)pBuDiveSettings->gf_high) / 100.0f;
+		return ((float)pDiveSettings->gf_high) / 100.0f;
 
 	if(pressure >= gSurface_pressure_bar + gGF_low_depth_bar)
-		return ((float)pBuDiveSettings->gf_low) / 100.0f;
+		return ((float)pDiveSettings->gf_low) / 100.0f;
 
-	return (pBuDiveSettings->gf_high - gfSteigung * (pressure - gSurface_pressure_bar) )/ 100.0f;
+	return (pDiveSettings->gf_high - gfSteigung * (pressure - gSurface_pressure_bar) )/ 100.0f;
 }
 
 
-void buehlmann_calc_ndl(void)
+static int buehlmann_calc_ndl(SDiveSettings *pDiveSettings)
 {
 	float local_tissue_nitrogen_bar[16];
 	float local_tissue_helium_bar[16];
 	int i;
+	int ndl = 0;
 
-	gNDL = 0;
 	//Check ndl always use gHigh
-  gGF_value = ((float)pBuDiveSettings->gf_high) / 100.0f;
+	gGF_value = ((float)pDiveSettings->gf_high) / 100.0f;
 	//10 minutes steps
-	while(gNDL < (300 * 60))
+	while(ndl < (300 * 60))
 	{
 		memcpy(local_tissue_nitrogen_bar, gTissue_nitrogen_bar, (4*16));
 		memcpy(local_tissue_helium_bar, gTissue_helium_bar, (4*16));
 		//
-		gNDL += 600;
-    decom_tissues_exposure2(600, &pBuDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar);
-		decom_oxygen_calculate_cns_exposure(600,&pBuDiveSettings->decogaslist[gGas_id],gPressure,&gCNS);
-		//tissues_exposure_at_gPressure_seconds(600);
+		ndl += 600;
+		decom_tissues_exposure2(600, &pDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar);
+		decom_oxygen_calculate_cns_exposure(600,&pDiveSettings->decogaslist[gGas_id],gPressure,&gCNS);
 		buehlmann_backup_and_restore(true);
-		if(dive1_check_deco() == true)
+		if(dive1_check_deco(pDiveSettings))
 		{
 			buehlmann_backup_and_restore(false);
 			break;
@@ -642,30 +545,29 @@
 		buehlmann_backup_and_restore(false);
 	}
 
-	if(gNDL < (300 * 60))
-		gNDL -= 600;
+	if(ndl < (300 * 60))
+		ndl -= 600;
 
-	if(gNDL > (150 * 60))
-		return;
+	if(ndl > (150 * 60))
+		return ndl;
 
 	// refine
 	memcpy(gTissue_nitrogen_bar, local_tissue_nitrogen_bar, (4*16));
 	memcpy(gTissue_helium_bar, local_tissue_helium_bar, (4*16));
 
 	//One minutes step
-	for(i = 0; i < 20; i++)
+	for(i = 0; i < 10; i++)
 	{
-		gNDL += 60;
+		ndl += 60;
 		//tissues_exposure_at_gPressure_seconds(60);
-		decom_tissues_exposure2(60, &pBuDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar);
-		decom_oxygen_calculate_cns_exposure(60,&pBuDiveSettings->decogaslist[gGas_id],gPressure,&gCNS);
+		decom_tissues_exposure2(60, &pDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar);
+		decom_oxygen_calculate_cns_exposure(60,&pDiveSettings->decogaslist[gGas_id],gPressure,&gCNS);
 		buehlmann_backup_and_restore(true);
-		if(dive1_check_deco() == true)
+		if(dive1_check_deco(pDiveSettings))
 			break;
 		buehlmann_backup_and_restore(false);
 	}
-	//gNDL -= 60;
-	return;
+	return ndl;
 }
 
 
@@ -674,7 +576,7 @@
 /// @brief	for NDL calculations
 ///					160614 using ceilingOther and not ceiling
 //  ===============================================================================
-_Bool dive1_check_deco(void)
+static _Bool dive1_check_deco(SDiveSettings *pDiveSettings)
 {
 	// gGF_value is set in call routine;
 	// internes Backup!
@@ -684,7 +586,7 @@
 	float ceilingOther; // new hw 160614
 
 	ceiling = tissue_tolerance();
-	ambient_bar_to_deco_stop_depth_bar(ceiling); // this will set gStop.depth :-) (and gStop.id)
+	ambient_bar_to_deco_stop_depth_bar(pDiveSettings, ceiling); // this will set gStop.depth :-) (and gStop.id)
 
 	// set the base for all upcoming parameters
 	ceilingOther = gStop.depth + gSurface_pressure_bar;
@@ -695,19 +597,16 @@
 		// ascend within 10 mtr to GF_low // speed 12 mtr/min -> 50 sec / 10 mtr;  15 sec / 3 mtr.
 		while(((gPressure - PRESSURE_TEN_METER ) > gSurface_pressure_bar) && (ceiling < (gPressure - PRESSURE_TEN_METER)))
 		{
-			ascend_with_all_gaschanges(PRESSURE_TEN_METER);
+			ascend_with_all_gaschanges(pDiveSettings, PRESSURE_TEN_METER);
 			ceiling = tissue_tolerance();
 		}
 		while(((gPressure - PRESSURE_THREE_METER )> gSurface_pressure_bar) && (ceiling < gPressure))
 		{
-			ascend_with_all_gaschanges(PRESSURE_THREE_METER);
+			ascend_with_all_gaschanges(pDiveSettings, PRESSURE_THREE_METER);
 			ceiling = tissue_tolerance();
 		}
 	}
-	if(ceiling <= gSurface_pressure_bar)
-		return false;
-	else
-		return true;
+	return ceiling > gSurface_pressure_bar;
 }
 
 // compute ceiling recursively, with a resolution of 10cm. Notice
@@ -731,6 +630,9 @@
 {
 	float ceiling;
 
+	memcpy(gTissue_nitrogen_bar, pLifeData->tissue_nitrogen_bar, (4*16));
+	memcpy(gTissue_helium_bar, pLifeData->tissue_helium_bar, (4*16));
+
 	// this is just performance optimizing. The code below runs just fine
 	// without this. There is never a ceiling in NDL deco state
 	if (!pDecoInfo->output_time_to_surface_seconds) {
@@ -738,9 +640,6 @@
 		return;
 	}
 
-	memcpy(gTissue_nitrogen_bar, pLifeData->tissue_nitrogen_bar, (4*16));
-	memcpy(gTissue_helium_bar, pLifeData->tissue_helium_bar, (4*16));
-
 	ceiling = compute_ceiling(pLifeData->pressure_surface_bar, 1.0f + pLifeData->max_depth_meter/10.0f);
 	pDecoInfo->output_ceiling_meter = (ceiling - pLifeData->pressure_surface_bar) * 10.0f;
 }
--- a/Discovery/Src/settings.c	Sat Apr 13 14:36:33 2019 +0200
+++ b/Discovery/Src/settings.c	Tue Apr 23 14:21:32 2019 +0000
@@ -1155,7 +1155,7 @@
 
 /*	uint8_t tX_userselectedLeftLowerCornerPrimary;
  */
-    if(Settings.tX_userselectedLeftLowerCornerPrimary > 7)
+    if(Settings.tX_userselectedLeftLowerCornerPrimary > 8)
     {
         Settings.tX_userselectedLeftLowerCornerPrimary = 1;
         corrections++;
--- a/Discovery/Src/tMenuEditSystem.c	Sat Apr 13 14:36:33 2019 +0200
+++ b/Discovery/Src/tMenuEditSystem.c	Tue Apr 23 14:21:32 2019 +0000
@@ -862,6 +862,9 @@
     case 7:
         text[4] = TXT_CNS;
         break;
+    case 8:
+    	text[4] = TXT_ActualGradient;
+    	break;
     /* none */
     case 0:
         text[4] = '-';
@@ -1008,7 +1011,7 @@
 
     value += 1;
 
-    if(value > 7)
+    if(value > 8)
         value = 0;
 
     settingsGetPointer()->tX_userselectedLeftLowerCornerPrimary = value;