changeset 350:607099140a41

Merged in Ideenmodellierer/ostc4/FlightMode_Improvment (pull request #32) FlightMode Improvment
author heinrichsweikamp <bitbucket@heinrichsweikamp.com>
date Sun, 06 Oct 2019 11:58:36 +0000
parents 0756013e43b3 (current diff) 9d82411d0afa (diff)
children ba53ab77f059
files
diffstat 14 files changed, 288 insertions(+), 530 deletions(-) [+]
line wrap: on
line diff
--- a/Discovery/Inc/tStructure.h	Mon Aug 19 11:42:31 2019 +0000
+++ b/Discovery/Inc/tStructure.h	Sun Oct 06 11:58:36 2019 +0000
@@ -123,7 +123,6 @@
 #define StMOG_ChangeDepth		_MB(2,1,255,3,0)
 #define StMOG_SetToMOD			_MB(2,1,255,4,0)
 #define StMOG_Bottle				_MB(2,1,255,5,0)
-#define StMOG_Wireless			_MB(2,1,255,6,0)
 
 #define StMOG_MOD						_MB(2,1,255,9,0)
 
--- a/Discovery/Inc/text_multilanguage.h	Mon Aug 19 11:42:31 2019 +0000
+++ b/Discovery/Inc/text_multilanguage.h	Sun Oct 06 11:58:36 2019 +0000
@@ -166,6 +166,7 @@
 		TXT2BYTE_ResetStopwatch,
 		TXT2BYTE_SetMarker,
 		TXT2BYTE_CompassHeading,
+		TXT2BYTE_EndDiveMode,
 		/* */
 		TXT2BYTE_Simulator,
 		TXT2BYTE_StartSimulator,
@@ -237,8 +238,6 @@
 		TXT2BYTE_AmbientTemperature,
 		/* */
 		TXT2BYTE_Bottle,
-		TXT2BYTE_WirelessSender,
-		TXT2BYTE_WirelessDisconnect,
 		/* */
 		TXT2BYTE_Gaslist,
 		TXT2BYTE_Clock,
--- a/Discovery/Src/base.c	Mon Aug 19 11:42:31 2019 +0000
+++ b/Discovery/Src/base.c	Sun Oct 06 11:58:36 2019 +0000
@@ -525,6 +525,8 @@
 /// to be called
 ///
 //  ===============================================================================
+
+//#define NO_TIMEOUT
 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
 {
 #ifdef DEMOMODE
--- a/Discovery/Src/data_exchange_main.c	Mon Aug 19 11:42:31 2019 +0000
+++ b/Discovery/Src/data_exchange_main.c	Sun Oct 06 11:58:36 2019 +0000
@@ -693,40 +693,31 @@
 	}
 }
 
-#define AVERAGE_COUNT	4
 static float getSampleDepth(SDataExchangeSlaveToMaster *d, SDiveState *ds)
 {
-	static uint8_t c = 0;
-	static float ambient[AVERAGE_COUNT] = {0};
-	static float surface[AVERAGE_COUNT]= {0};
-	static float depth[AVERAGE_COUNT]= {0};
-
-	ambient[c] = d->data[d->boolPressureData].pressure_mbar / 1000.0f;
-	surface[c] = d->data[d->boolPressureData].surface_mbar / 1000.0f;
-	float density = ((float)( 100 + settingsGetPointer()->salinity)) / 100.0f;
+	float ambient = 0;
+	float surface = 0;
+	float depth = 0;
+	float density = 0;
 
-	ds->lifeData.pressure_ambient_bar = (ambient[0] + ambient[1] + ambient[2] + ambient[3])/4.0f;
-	ds->lifeData.pressure_surface_bar = (surface[0] + surface[1] + surface[2] + surface[3])/4.0f;
-	depth[c] = (ambient[c] - surface[c]) / (0.09807f * density);
+	ambient = d->data[d->boolPressureData].pressure_mbar / 1000.0f;
+	surface = d->data[d->boolPressureData].surface_mbar / 1000.0f;
+	density = ((float)( 100 + settingsGetPointer()->salinity)) / 100.0f;
 
-	c++;
-	if (c == AVERAGE_COUNT) c = 0;
+	ds->lifeData.pressure_ambient_bar = ambient;
+	ds->lifeData.pressure_surface_bar = surface;
+	depth = (ambient - surface) / (0.09807f * density);
+	ds->lifeData.bool_temp1 = d->data[d->boolPressureData].SPARE1;
 
-	return (depth[0] + depth[1] + depth[2] + depth[3])/4.0f;
+	return depth;
 }
 
-#define TEMP_AVERAGE_COUNT	3
 static float getTemperature(SDataExchangeSlaveToMaster *d)
 {
-	static uint8_t c = 0;
-	static float temp[TEMP_AVERAGE_COUNT] = {0};
-
-	temp[c] = d->data[d->boolPressureData].temperature;
+	float temp = 0;
+	temp = d->data[d->boolPressureData].temperature;
 
-	c++;
-	if (c == TEMP_AVERAGE_COUNT) c = 0;
-
-	return (temp[0] + temp[1] + temp[2])/3.0f;
+	return temp;
 }
 
 void DataEX_copy_to_LifeData(_Bool *modeChangeFlag)
--- a/Discovery/Src/t7.c	Mon Aug 19 11:42:31 2019 +0000
+++ b/Discovery/Src/t7.c	Sun Oct 06 11:58:36 2019 +0000
@@ -1144,73 +1144,8 @@
     draw_frame(0,0, CLUT_pluginboxSurface, CLUT_Font020);
 }
 
-void t7_refresh_surface_debugmode_wireless_info(void)
-{
-    char text[400];
-    uint8_t colorDataLost = 0;
-    int txtPointer = 0;
-    uint8_t numberOfBytes = 0;
-
-    GFX_DrawCfgWindow textWindow =
-    {
-        .Image = &t7screen,
-        .WindowNumberOfTextLines = 5,
-        .WindowLineSpacing = 70,
-        .WindowTab = 220,
-        .WindowX0 = 10,
-        .WindowX1 = 790,
-        .WindowY0 = 10,
-        .WindowY1 = 380
-    };
-
-    Gfx_write_label_var(&t7screen,  10,600,  10,&FontT42,CLUT_DiveMainLabel,"Wireless Data");
-
-    if(stateUsed->data_old__lost_connection_to_slave)
-    {
-        Gfx_write_label_var(&t7screen, 600,800,10,&FontT42,CLUT_Font020,"CPU2?");
-        colorDataLost = 1;
-    }
-
-    txtPointer = 0;
-    for(int i=0;i<4;i++)
-    {
-        if((!stateUsed->lifeData.wireless_data[i].ageInMilliSeconds) || colorDataLost)
-            text[txtPointer++] = '\021';
-
-        numberOfBytes = stateUsed->lifeData.wireless_data[i].numberOfBytes;
-        if((numberOfBytes > 0) && (numberOfBytes <= 10))
-        {
-            txtPointer += snprintf(&text[txtPointer],20,"%02u s  %02u\t"
-                ,(stateUsed->lifeData.wireless_data[i].ageInMilliSeconds)/1000
-                ,stateUsed->lifeData.wireless_data[i].status
-            );
-            if(numberOfBytes > 8) ///< lifeData.wireless_data[i].data[j] has only size of 8
-                numberOfBytes = 8;
-            for(int j=0;j<numberOfBytes;j++)
-            {
-                txtPointer += snprintf(&text[txtPointer],4," %02X"
-                    ,stateUsed->lifeData.wireless_data[i].data[j]
-                );
-            }
-        }
-        text[txtPointer++] = '\n';
-        text[txtPointer++] = '\r';
-        text[txtPointer++] = '\020';
-        text[txtPointer] = 0;
-    }
-    GFX_write_string(&FontT48,&textWindow,text,1);
-
-}
-
-
 void t7_refresh_surface_debugmode(void)
 {
-    if(selection_customview%2 == 1)
-    {
-        t7_refresh_surface_debugmode_wireless_info();
-        return;
-    }
-
     // could be warning, now just to set RTE variables
     DataEX_check_RTE_version__needs_update();
 
@@ -1312,6 +1247,16 @@
 //	Gfx_write_label_var(&t7screen,  601,800,310,&FontT42,CLUT_DiveMainLabel,"Light");
 //	Gfx_write_label_var(&t7screen,  601,800,355,&FontT48,CLUT_Font020,TextL1);
 
+/* show surface pressure state */
+    if(stateUsed->lifeData.bool_temp1 )
+    {
+    	snprintf(TextL1,TEXTSIZE,"stable");
+    }
+    else
+    {
+    	snprintf(TextL1,TEXTSIZE,"unstable");
+    }
+    Gfx_write_label_var(&t7screen,  500,800,400,&FontT48,CLUT_Font020,TextL1);
 
 
     if(Sdate.Year < 15)
--- a/Discovery/Src/tMenuEditGasOC.c	Mon Aug 19 11:42:31 2019 +0000
+++ b/Discovery/Src/tMenuEditGasOC.c	Sun Oct 06 11:58:36 2019 +0000
@@ -44,19 +44,15 @@
     uint8_t setpoint;
 } SEditGasPage;
 
-#define MAX_SENDER_AT_ONCE 5
 
 /* Private variables ---------------------------------------------------------*/
 SEditGasPage editGasPage;
 
-uint16_t wirelessSender[MAX_SENDER_AT_ONCE];
-
 /* Private function prototypes -----------------------------------------------*/
 void create_text_with_u8(char *text, const char *text1, uint8_t inputU8, const char *text2);
 
 void openEdit_Gas(uint8_t line, uint8_t ccr);
 void openEdit_GasType(void);
-void openEdit_Wireless(void);
 
 void openEdit_DiveGasSelect(uint8_t line, uint8_t ccr);
 void openEdit_SpecialDiveGasMenu(uint8_t ccr);
@@ -70,16 +66,12 @@
 uint8_t OnAction_ChangeDepth	(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 uint8_t OnAction_SetToMOD		(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 uint8_t OnAction_BottleSize		(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
-uint8_t OnAction_Wireless		(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 
 uint8_t OnAction_First			(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 uint8_t OnAction_Deco			(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 uint8_t OnAction_Travel			(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 uint8_t OnAction_Inactive		(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 
-uint8_t OnAction_WirelessID		(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
-uint8_t OnAction_NoWireless		(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
-
 uint8_t OnAction_DM_Active		(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 uint8_t OnAction_DM_Mix			(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 
@@ -344,8 +336,7 @@
 /* surface mode */
 void openEdit_Gas(uint8_t line, uint8_t ccr)
 {
-    uint8_t gasID, oxygen, helium, depthDeco, active, first, depthMOD, deco, travel, inactive;//, bottleSizeLiter;, bottleWirelessStatus;
-    //uint16_t bottleWirelessId;//, bottleWirelessIdSmall;
+    uint8_t gasID, oxygen, helium, depthDeco, active, first, depthMOD, deco, travel, inactive;//, bottleSizeLiter;
 
     char text[32];
     char textMOD[32];
@@ -385,9 +376,6 @@
     travel = editGasPage.pGasLine[gasID].note.ub.travel;
 
     //bottleSizeLiter = editGasPage.pGasLine[gasID].bottle_size_liter;
-//	bottleWirelessStatus = editGasPage.pGasLine[gasID].bottle_wireless_status;
-    //bottleWirelessId = editGasPage.pGasLine[gasID].bottle_wireless_id;
-    //bottleWirelessIdSmall = bottleWirelessId & 0x0F;
 
     if(active)
         inactive = 0;
@@ -487,14 +475,6 @@
         write_label_var(  20 ,800, ME_Y_LINE5, &FontT48, text);
         write_field_2digit(StMOG_Bottle,		600, 710, ME_Y_LINE5, &FontT48,"## ltr", (uint32_t)bottleSizeLiter, 0, 0, 0);
 
-        txtptr = 0;
-        text[txtptr++] = TXT_2BYTE;
-        text[txtptr++] = TXT2BYTE_WirelessSender;
-        text[txtptr++] = ' ';
-        if(!bottleWirelessId)
-            text[txtptr++] = '\021';
-        txtptr += snprintf(&text[txtptr],20,"%u (%04X)",bottleWirelessIdSmall, bottleWirelessId);
-        write_field_button(StMOG_Wireless,	20, 710, ME_Y_LINE6, &FontT48, text);
 */
         stop_cursor_fields();
 
@@ -522,7 +502,6 @@
         }
 /*
         setEvent(StMOG_Bottle, 				(uint32_t)OnAction_BottleSize);
-        setEvent(StMOG_Wireless,			(uint32_t)OnAction_Wireless);
 */
         write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext);
     }
@@ -606,205 +585,6 @@
     return UNSPECIFIC_RETURN;
 }
 
-void openEdit_Wireless(void)
-{
-    uint8_t gasID, wirelessSenderAvailable, isNotMatched, isMatchedWithThis, wirelessSenderActive[MAX_SENDER_AT_ONCE], senderCount, isInList; //, wirelessStatus;
-    uint16_t wirelessId, wirelessSenderIdSmall, wirelessIdTemp;
-    char text[32];
-    uint8_t txtptr;
-
-    if(editGasPage.ccr)
-    {
-        resetMenuEdit(CLUT_MenuPageGasCC);
-        setBackMenu((uint32_t)openEdit_GasCC, editGasPage.gasID - NUM_OFFSET_DILUENT, 5);
-    }
-    else
-    {
-        resetMenuEdit(CLUT_MenuPageGasOC);
-        setBackMenu((uint32_t)openEdit_GasOC, editGasPage.gasID, 5);
-    }
-
-    gasID = editGasPage.gasID;
-    wirelessId = editGasPage.pGasLine[gasID].bottle_wireless_id;
-//	wirelessStatus = editGasPage.pGasLine[gasID].bottle_wireless_status;
-
-
-    /* header */
-    int i = 0;
-    if(gasID >= 10)
-    {
-        i = 1;
-        strcpy(text, "\001" "Gas #10 X");
-    }
-    else
-        strcpy(text, "\001" "Gas #0 X");
-
-    if(editGasPage.ccr)
-        text[8+i] = TXT_Diluent_Gas_Edit;
-    else
-        text[8+i] = TXT_OC_Gas_Edit;
-
-    if(gasID >= 10)
-        text[6+i] += gasID - 10;
-    else
-        text[6+i] += gasID;
-    write_topline(text);
-
-    senderCount = 0;
-    wirelessSenderAvailable = 0;
-    if(wirelessId)
-    {
-        wirelessSender[senderCount] = wirelessId;
-        wirelessSenderActive[senderCount] = 0;
-        wirelessSenderAvailable++;
-        senderCount++;
-    }
-
-    for(int i=0;i<4;i++)
-    {
-        if((stateUsed->lifeData.wireless_data[i].ageInMilliSeconds) && (stateUsed->lifeData.wireless_data[i].ageInMilliSeconds <= 60000) && ((stateUsed->lifeData.wireless_data[i].data[1] & 0x0F) != 0))
-        {
-            wirelessIdTemp = stateUsed->lifeData.wireless_data[i].data[0] * 256;
-            wirelessIdTemp += stateUsed->lifeData.wireless_data[i].data[1];
-            if(wirelessId && (wirelessId == wirelessIdTemp))
-                wirelessSenderActive[0] = 1;
-            else
-            {
-                isInList = 0;
-                for(int j=0;j<wirelessSenderAvailable;j++)
-                {
-                    if(wirelessSender[j] == wirelessIdTemp)
-                    {
-                        isInList = 1;
-                        break;
-                    }
-                }
-                if(!isInList)
-                {
-                    wirelessSender[senderCount] = wirelessIdTemp;
-                    wirelessSenderActive[senderCount] = 1;
-                    wirelessSenderAvailable++;
-                    senderCount++;
-                }
-            }
-        }
-    }
-
-    if(wirelessSenderAvailable > MAX_SENDER_AT_ONCE)
-        wirelessSenderAvailable = MAX_SENDER_AT_ONCE;
-
-    isNotMatched = 1;
-
-    for(int i=0;i<wirelessSenderAvailable;i++)
-    {
-        wirelessSenderIdSmall = wirelessSender[i] & 0x0F;
-
-        txtptr = 0;
-        if(!wirelessSenderActive[i])
-            text[txtptr++] = '\021';
-        txtptr += snprintf(&text[txtptr],10,"%u (%04X)",wirelessSenderIdSmall, wirelessSender[i]);
-
-        if(wirelessId == wirelessSender[i])
-        {
-            isMatchedWithThis = 1;
-            isNotMatched = 0;
-        }
-        else
-        {
-            isMatchedWithThis = 0;
-            for(int j=1; j <= 2*NUM_GASES; j++)
-            {
-                if((gasID != j) && (settingsGetPointer()->gas[j].bottle_wireless_id == wirelessSender[i]))
-                {
-                    txtptr += snprintf(&text[txtptr],20,"  used by Gas #%i",i);
-                    break;
-                }
-            }
-        }
-        write_field_on_off(StMOG_Transmitter1 + i,  30, 710, ME_Y_LINE1 + (i * ME_Y_LINE_STEP), &FontT48, text, isMatchedWithThis);
-    }
-
-
-    txtptr = 0;
-    text[txtptr++] = TXT_2BYTE;
-    text[txtptr++] = TXT2BYTE_WirelessDisconnect;
-    text[txtptr++] = 0;
-    write_field_on_off(StMOG_NoTransmitter,  30, 400, ME_Y_LINE6, &FontT48, text, isNotMatched);
-
-    // setEvent has to be _after_ all fields are written
-    for(int i=0;i<wirelessSenderAvailable;i++)
-        setEvent(StMOG_Transmitter1 + i,	(uint32_t)OnAction_WirelessID);
-
-    setEvent(StMOG_NoTransmitter, (uint32_t)OnAction_NoWireless);
-}
-
-
-uint8_t OnAction_Wireless(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
-{
-    openEdit_Wireless();
-    return UNSPECIFIC_RETURN;
-}
-
-
-uint8_t OnAction_WirelessID		(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
-{
-    if((editId < StMOG_Transmitter1) || (editId > StMOG_Transmitter5))
-        return UNSPECIFIC_RETURN;
-
-    uint8_t line, isMatched;
-
-    line = editId - StMOG_Transmitter1;
-
-
-    if(editGasPage.pGasLine[editGasPage.gasID].bottle_wireless_id == wirelessSender[line])
-        isMatched = 1;
-    else
-        isMatched = 0;
-
-    editGasPage.pGasLine[editGasPage.gasID].bottle_wireless_id = wirelessSender[line];
-//	editGasPage.pGasLine[editGasPage.gasID].bottle_wireless_status = 0;
-
-    for(int i=0;i<5;i++)
-    {
-        if((StMOG_Transmitter1 + i) != editId)
-            tMenuEdit_set_on_off(StMOG_Transmitter1 + i, 0);
-    }
-    tMenuEdit_set_on_off(editId, 1);
-    tMenuEdit_set_on_off(StMOG_NoTransmitter, 0);
-
-    if(!isMatched)
-        return UPDATE_DIVESETTINGS;
-    else
-        return UPDATE_AND_EXIT_TO_MENU;
-}
-
-
-uint8_t OnAction_NoWireless		(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
-{
-    uint8_t isNotMatched;
-
-    if(editGasPage.pGasLine[editGasPage.gasID].bottle_wireless_id == 0)
-        isNotMatched = 1;
-    else
-        isNotMatched = 1;
-
-    editGasPage.pGasLine[editGasPage.gasID].bottle_wireless_id = 0;
-//	editGasPage.pGasLine[editGasPage.gasID].bottle_wireless_status = 0;
-
-    tMenuEdit_set_on_off(StMOG_Transmitter1, 0);
-    tMenuEdit_set_on_off(StMOG_Transmitter2, 0);
-    tMenuEdit_set_on_off(StMOG_Transmitter3, 0);
-    tMenuEdit_set_on_off(StMOG_Transmitter4, 0);
-    tMenuEdit_set_on_off(StMOG_Transmitter5, 0);
-    tMenuEdit_set_on_off(StMOG_NoTransmitter, 1);
-
-    if(!isNotMatched)
-        return UPDATE_DIVESETTINGS;
-    else
-        return UPDATE_AND_EXIT_TO_MENU;
-}
-
-
 uint8_t OnAction_Mix(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
 {
     uint8_t digitContentNew;
--- a/Discovery/Src/tMenuEditSystem.c	Mon Aug 19 11:42:31 2019 +0000
+++ b/Discovery/Src/tMenuEditSystem.c	Sun Oct 06 11:58:36 2019 +0000
@@ -35,11 +35,16 @@
 #include "ostc.h"
 #include "settings.h" // for getLicence()
 #include "tHome.h"  // for enum CUSTOMVIEWS and init_t7_compass()
+#include "tMenu.h"
 #include "tMenuEdit.h"
+#include "tMenuSystem.h"
+#include "t7.h"
+
+/* uncomment to activate debug view option */
+/*#define HAVE_DEBUG_VIEW */
 
 /* Private variables ---------------------------------------------------------*/
-
-uint8_t infoPage = 0;
+static uint8_t infoPage = 0;
 
 /* Private function prototypes -----------------------------------------------*/
 void openEdit_DateTime(void);
@@ -576,10 +581,14 @@
 
     write_field_button(StMSYS3_Units,			400, 700, ME_Y_LINE1,  &FontT48, "");
     write_field_button(StMSYS3_Colors,		400, 700, ME_Y_LINE2,  &FontT48, "");
-//	write_field_button(StMSYS3_Debug,			400, 700, ME_Y_LINE3,  &FontT48, "");
+#ifdef HAVE_DEBUG_VIEW
+	write_field_button(StMSYS3_Debug,			400, 700, ME_Y_LINE3,  &FontT48, "");
+#endif
     setEvent(StMSYS3_Units,		(uint32_t)OnAction_Units);
     setEvent(StMSYS3_Colors,	(uint32_t)OnAction_Colorscheme);
-//	setEvent(StMSYS3_Debug,		(uint32_t)OnAction_DebugInfo);
+#ifdef HAVE_DEBUG_VIEW
+	setEvent(StMSYS3_Debug,		(uint32_t)OnAction_DebugInfo);
+#endif
 }
 
 
@@ -620,7 +629,7 @@
     text[1] = 0;
     write_label_var( 400, 700, ME_Y_LINE2, &FontT48, text);
 
-/*
+#ifdef HAVE_DEBUG_VIEW
     // specials
     text[0] = TXT_2BYTE;
     text[1] = TXT2BYTE_ShowDebug;
@@ -633,7 +642,7 @@
         text[0] = '\006';
     text[1] = 0;
     write_label_var( 400, 700, ME_Y_LINE3, &FontT48, text);
-*/
+#endif
 
     // design
     text[0] = TXT_Depth;
@@ -732,7 +741,7 @@
     write_field_button(StMSYS4_CViewStandard,		400, 700, ME_Y_LINE2,  &FontT48, "");
 
     write_field_button(StMSYS4_CornerTimeout,		400, 700, ME_Y_LINE3,  &FontT48, "");
-    write_field_button(StMSYS4_CornerStandard,	400, 700, ME_Y_LINE4,  &FontT48, "");
+    write_field_button(StMSYS4_CornerStandard,		400, 700, ME_Y_LINE4,  &FontT48, "");
 
     write_field_button(StMSYS4_ExtraDisplay,		400, 700, ME_Y_LINE5,  &FontT48, "");
 
--- a/Discovery/Src/tMenuEditXtra.c	Mon Aug 19 11:42:31 2019 +0000
+++ b/Discovery/Src/tMenuEditXtra.c	Sun Oct 06 11:58:36 2019 +0000
@@ -33,12 +33,15 @@
 #include "simulation.h"
 #include "timer.h"
 #include "tMenuEdit.h"
+#include "data_exchange_main.h"
+
 
 /* Private function prototypes -----------------------------------------------*/
 void openEdit_CompassHeading(void);
 void openEdit_ResetStopwatch(void);
 void openEdit_SimFollowDecostops(void);
 void openEdit_SetManualMarker(void);
+void openEdit_SetEndDive(void);
 
 /* Announced function prototypes -----------------------------------------------*/
 uint8_t OnAction_CompassHeading	(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
@@ -63,7 +66,14 @@
         openEdit_SetManualMarker();
         break;
     case 4:
-        openEdit_SimFollowDecostops();
+    	if(is_stateUsedSetToSim())
+    	{
+    		 openEdit_SimFollowDecostops();
+    	}
+    	else
+    	{
+    		openEdit_SetEndDive();
+    	}
         break;
     }
 }
@@ -81,6 +91,12 @@
     exitMenuEdit_to_Home();
 }
 
+void openEdit_SetEndDive(void)
+{
+	dataOutGetPointer()->setEndDive = 1;
+    exitMenuEdit_to_Home();
+}
+
 void openEdit_SimFollowDecostops(void)
 {
     simulation_set_heed_decostops(!simulation_get_heed_decostops());
--- a/Discovery/Src/tMenuGas.c	Mon Aug 19 11:42:31 2019 +0000
+++ b/Discovery/Src/tMenuGas.c	Sun Oct 06 11:58:36 2019 +0000
@@ -74,7 +74,7 @@
 {
     const SGasLine * pGasLine;
 
-    uint8_t  gasId, oxygen, helium, depthUp, active, first, typeDeco, wirelessId;
+    uint8_t  gasId, oxygen, helium, depthUp, active, first, typeDeco;
     float fPpO2limitHigh = 0;
     float fPpO2ofGasAtThisDepth = 0;
     //uint8_t senderCode, depthDown,;
@@ -142,7 +142,6 @@
             typeDeco = pGasLine[gasId].note.ub.deco;
             mod = calc_MOD(gasId);
             ltr = pGasLine[gasId].bottle_size_liter;
-            wirelessId = pGasLine[gasId].bottle_wireless_id;
             //bar = stateUsed->lifeData.bottle_bar[gasId];
 
             if(active)
@@ -224,12 +223,6 @@
                     if(ltr)
                         color[2] = '\020';
                     /* bar */
-                    if(wirelessId)
-                        color[3] = '\020';
-                    /* wireless */
-                    if(wirelessId)
-                        color[4] = '\020';
-                    /* ltr, bar  */
 
                     if(mod < depthUp)
                     {
@@ -302,18 +295,6 @@
                     color[3], bar
                 );
 */
-                /* wireless */
-/*
-                if(wirelessId)
-                {
-                    textPointer += snprintf(&text[textPointer], 8,\
-                        "%c"
-                        "  *"
-                        "%u",
-                        color[4], (wirelessId%0x0F)
-                    );
-                }
-*/
                 text[textPointer++] = '\035';
                 text[textPointer++] = '\n';
                 text[textPointer++] = '\r';
--- a/Discovery/Src/tMenuXtra.c	Mon Aug 19 11:42:31 2019 +0000
+++ b/Discovery/Src/tMenuXtra.c	Sun Oct 06 11:58:36 2019 +0000
@@ -94,6 +94,16 @@
         strcpy(&text[textPointer],"\n\r");
         textPointer += 2;
     }
+    else
+    {
+    	if((line == 0) || (line == 4))		/* end dive mode only used during real dives */
+    	    {
+    	        text[textPointer++] = TXT_2BYTE;
+    	        text[textPointer++] = TXT2BYTE_EndDiveMode;
+    	    }
+    	strcpy(&text[textPointer],"\n\r");
+    	textPointer += 2;
+    }
 
     return StMXTRA;
 }
--- a/Discovery/Src/text_multilanguage.c	Mon Aug 19 11:42:31 2019 +0000
+++ b/Discovery/Src/text_multilanguage.c	Sun Oct 06 11:58:36 2019 +0000
@@ -1,4 +1,4 @@
-///////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
 /// -*- coding: UTF-8 -*-
 ///
 /// \file   Discovery/Src/text_multilanguage.c
@@ -722,6 +722,13 @@
 static uint8_t text_IT_CompassHeading[] = "Direzione bussola";
 static uint8_t text_ES_CompassHeading[] = "Rumbo brújula";
 
+// Dive Menu
+static uint8_t text_EN_EndDiveMode[] = "End dive";
+static uint8_t text_DE_EndDiveMode[] = "Tauchgang beenden";
+static uint8_t text_FR_EndDiveMode[] = "End dive";
+static uint8_t text_IT_EndDiveMode[] = "End dive";
+static uint8_t text_ES_EndDiveMode[] = "End dive";
+
 // Menu SIM
 static uint8_t text_EN_Simulator[] = "Simulator";
 static uint8_t text_DE_Simulator[] = "";
@@ -1505,18 +1512,6 @@
 static uint8_t text_IT_GasVorrat[] = "";
 static uint8_t text_ES_GasVorrat[] = "";
 
-static uint8_t text_EN_WirelessSender[] = "wireless id";
-static uint8_t text_DE_WirelessSender[] = "Sender ID";
-static uint8_t text_FR_WirelessSender[] = "";
-static uint8_t text_IT_WirelessSender[] = "Numero di serie";
-static uint8_t text_ES_WirelessSender[] = "wireless id";
-
-static uint8_t text_EN_WirelessDisconnect[] = "Disconnect";
-static uint8_t text_DE_WirelessDisconnect[] = "Nicht verbunden";
-static uint8_t text_FR_WirelessDisconnect[] = "";
-static uint8_t text_IT_WirelessDisconnect[] = "Disconnesso";
-static uint8_t text_ES_WirelessDisconnect[] = "Desconectado";
-
 static uint8_t text_EN_FlipDisplay[] = "Flip display";
 static uint8_t text_DE_FlipDisplay[] = "Anzeige spiegeln";
 static uint8_t text_FR_FlipDisplay[] = "";
@@ -1622,7 +1617,8 @@
     {(uint8_t)TXT2BYTE_ResetStopwatch,  {text_EN_ResetStopwatch, text_DE_ResetStopwatch, text_FR_ResetStopwatch, text_IT_ResetStopwatch, text_ES_ResetStopwatch}},
     {(uint8_t)TXT2BYTE_SetMarker,		{text_EN_SetMarker, text_DE_SetMarker, text_FR_SetMarker, text_IT_SetMarker, text_ES_SetMarker}},
     {(uint8_t)TXT2BYTE_CompassHeading,  {text_EN_CompassHeading, text_DE_CompassHeading, text_FR_CompassHeading, text_IT_CompassHeading, text_ES_CompassHeading}},
-    {(uint8_t)TXT2BYTE_Simulator,		{text_EN_Simulator, text_DE_Simulator, text_FR_Simulator, text_IT_Simulator, text_ES_Simulator}},
+    {(uint8_t)TXT2BYTE_EndDiveMode,		{text_EN_EndDiveMode, text_DE_EndDiveMode, text_FR_EndDiveMode, text_IT_EndDiveMode, text_ES_EndDiveMode}},
+	{(uint8_t)TXT2BYTE_Simulator,		{text_EN_Simulator, text_DE_Simulator, text_FR_Simulator, text_IT_Simulator, text_ES_Simulator}},
     {(uint8_t)TXT2BYTE_StartSimulator,  {text_EN_StartSimulator, text_DE_StartSimulator, text_FR_StartSimulator, text_IT_StartSimulator, text_ES_StartSimulator}},
     {(uint8_t)TXT2BYTE_Intervall,		{text_EN_Intervall, text_DE_Intervall, text_FR_Intervall, text_IT_Intervall, text_ES_Intervall}},
     {(uint8_t)TXT2BYTE_SimDiveTime,		{text_EN_SimDiveTime, text_DE_SimDiveTime, text_FR_SimDiveTime, text_IT_SimDiveTime, text_ES_SimDiveTime}},
@@ -1684,8 +1680,6 @@
     {(uint8_t)TXT2BYTE_NumberOfDives,	{text_EN_NumberOfDives, text_DE_NumberOfDives, text_FR_NumberOfDives, text_IT_NumberOfDives, text_ES_NumberOfDives}},
     {(uint8_t)TXT2BYTE_AmbientTemperature,{text_EN_AmbientTemperature, text_DE_AmbientTemperature, text_FR_AmbientTemperature, text_IT_AmbientTemperature, text_ES_AmbientTemperature}},
     {(uint8_t)TXT2BYTE_Bottle,			{text_EN_Bottle, text_DE_Bottle, text_FR_Bottle, text_IT_Bottle, text_ES_Bottle}},
-    {(uint8_t)TXT2BYTE_WirelessSender,{text_EN_WirelessSender, text_DE_WirelessSender, text_FR_WirelessSender, text_IT_WirelessSender, text_ES_WirelessSender}},
-    {(uint8_t)TXT2BYTE_WirelessDisconnect,{text_EN_WirelessDisconnect, text_DE_WirelessDisconnect, text_FR_WirelessDisconnect, text_IT_WirelessDisconnect, text_ES_WirelessDisconnect}},
     {(uint8_t)TXT2BYTE_Gaslist,			{text_EN_Gaslist, text_DE_Gaslist, text_FR_Gaslist, text_IT_Gaslist, text_ES_Gaslist}},
     {(uint8_t)TXT2BYTE_Clock,			{text_EN_Clock, text_DE_Clock, text_FR_Clock, text_IT_Clock, text_ES_Clock}},
     {(uint8_t)TXT2BYTE_Sunday,			{text_EN_Sunday, text_DE_Sunday, text_FR_Sunday, text_IT_Sunday, text_ES_Sunday}},
--- a/Small_CPU/Inc/pressure.h	Mon Aug 19 11:42:31 2019 +0000
+++ b/Small_CPU/Inc/pressure.h	Sun Oct 06 11:58:36 2019 +0000
@@ -20,6 +20,9 @@
 float get_pressure_mbar(void);
 float get_surface_mbar(void);
 
+uint8_t is_surface_pressure_stable(void);
+float set_last_surface_pressure_stable(void);
+
 void init_surface_ring(uint8_t force);
 void update_surface_pressure(uint8_t call_rhythm_seconds);
 
--- a/Small_CPU/Src/pressure.c	Mon Aug 19 11:42:31 2019 +0000
+++ b/Small_CPU/Src/pressure.c	Sun Oct 06 11:58:36 2019 +0000
@@ -46,11 +46,20 @@
 #define CMD_ADC_4096 0x08 // ADC OSR=4096
 #define CMD_PROM_RD 0xA0 // Prom read command
 
-#define PRESSURE_SURFACE_MAX_MBAR		(1070.0f)		/* It is very unlikely that pressure at surface is greater than this value => clip to it */
-#define PRESSURE_HISTORY_SIZE			(8u)
-#define PRESSURE_JUMP_VALID_MBAR	    (500.0f)		/* values are measure several times a second => jumps > 5m very unlikely */
+/* remove comment to use a predefined profile for pressure changes instead of real world data */
+/* #define SIMULATE_PRESSURE */
+
+#define PRESSURE_SURFACE_MAX_MBAR			(1070.0f)		/* It is very unlikely that pressure at surface is greater than this value => clip to it */
+#define PRESSURE_HISTORY_SIZE				(8u)
+#define PRESSURE_JUMP_VALID_MBAR	    	(500.0f)		/* values are measure several times a second => jumps > 5m very unlikely */
 
-#define PRESSURE_SURFACE_QUE			(30u)			/* history buffer [minutes] for past pressure measurements */
+#define PRESSURE_SURFACE_QUE					(30u)			/* history buffer [minutes] for past pressure measurements */
+#define PRESSURE_SURFACE_EVA_WINDOW				(15u)			/* Number of entries evaluated during instability test. Used to avoid detection while dive enters water */
+#define PRESSURE_SURFACE_STABLE_LIMIT			(10u)			/* Define pressure as stable if delta (mBar) is below this value */
+#define PRESSURE_SURFACE_DETECT_STABLE_CNT		(5u)			/* Event count to detect stable condition */
+#define PRESSURE_SURFACE_UNSTABLE_LIMIT			(50u)			/* Define pressure as not stable if delta (mBar) is larger than this value */
+#define PRESSURE_SURFACE_DETECT_UNSTABLE_CNT	(3u)			/* Event count to detect unstable condition */
+
 
 static uint16_t get_ci_by_coef_num(uint8_t coef_num);
 //void pressure_calculation_new(void);
@@ -86,6 +95,10 @@
 static float surface_pressure_mbar = 1000.0;
 static float surface_ring_mbar[PRESSURE_SURFACE_QUE] = { 0 };
 
+static uint8_t surface_pressure_writeIndex = 0;
+static float surface_pressure_stable_value = 0;
+static uint8_t surface_pressure_stable = 0;
+
 static float pressure_history_mbar[PRESSURE_HISTORY_SIZE];
 
 static uint8_t secondCounterSurfaceRing = 0;
@@ -119,6 +132,7 @@
 		for(int i=0; i<PRESSURE_SURFACE_QUE; i++)
 			surface_ring_mbar[i] = ambient_pressure_mbar;
 		surface_pressure_mbar = ambient_pressure_mbar;
+		surface_pressure_writeIndex = 0;			/* index of the oldest value in the ring buffer */
 	}
 }
 
@@ -130,10 +144,81 @@
 	}
 }
 
+uint8_t is_surface_pressure_stable(void)
+{
+	return surface_pressure_stable;
+}
 
+float set_last_surface_pressure_stable(void)
+{
+	surface_pressure_mbar = surface_pressure_stable_value;
+	return surface_pressure_stable_value;
+}
+
+/* iterate backward through the history memory and evaluate the changes pressure changes during the last 30 minutes */
+void evaluate_surface_pressure()
+{
+	uint8_t index;
+	float lastvalue;
+	uint8_t stablecnt = 0;
+	uint8_t unstablecnt = 0;
+	uint8_t EvaluationWindow = PRESSURE_SURFACE_QUE - PRESSURE_SURFACE_EVA_WINDOW;	/* do not use the latest 15 values to avoid unstable condition due to something like fin handling */
+	uint8_t EvaluatedValues = 0;
+
+	lastvalue = surface_ring_mbar[surface_pressure_writeIndex];
+	surface_pressure_stable_value = surface_ring_mbar[surface_pressure_writeIndex]; /* default: if no stable value is found return the oldest value */
+	index = surface_pressure_writeIndex;
+	surface_pressure_stable = 1;
+
+	if(index == 0)
+	{
+		index = PRESSURE_SURFACE_QUE - 1;
+	}
+	else
+	{
+		index = index - 1;
+	}
+	do
+	{
+		if((EvaluatedValues < EvaluationWindow) &&
+			(fabs(surface_pressure_stable_value - surface_ring_mbar[index]) > PRESSURE_SURFACE_UNSTABLE_LIMIT)) /* unusual change during last 30 minutes */
+		{
+			unstablecnt++;
+			if(unstablecnt > PRESSURE_SURFACE_DETECT_UNSTABLE_CNT)
+			{
+				surface_pressure_stable = 0;
+			}
+		}
+	/* search for a value which does not change for several iterations */
+		if (fabs(lastvalue - surface_ring_mbar[index]) < PRESSURE_SURFACE_STABLE_LIMIT)
+		{
+			stablecnt++;
+		}
+		else
+		{
+			stablecnt = 0;
+		}
+		if ((stablecnt >= PRESSURE_SURFACE_DETECT_STABLE_CNT) && (surface_pressure_stable == 0)&&(surface_pressure_stable_value == surface_ring_mbar[surface_pressure_writeIndex])) /* pressure is unstable => search for new stable value */
+		{
+			surface_pressure_stable_value = surface_ring_mbar[index];
+			unstablecnt = 0;
+		}
+
+		lastvalue = surface_ring_mbar[index];
+
+		if(index == 0)
+		{
+			index = PRESSURE_SURFACE_QUE - 1;
+		}
+		else
+		{
+			index = index - 1;
+		}
+		EvaluatedValues++;
+	} while (index != surface_pressure_writeIndex);
+}
 void update_surface_pressure(uint8_t call_rhythm_seconds)
 {
-	static uint8_t writeIndex = 0;		/* Reinitialization will reset all entries to the same value => no need to reinit write index */
 
 
 	if(is_init_pressure_done())
@@ -146,24 +231,25 @@
 		{
 			if(runningAvg < PRESSURE_SURFACE_MAX_MBAR)
 			{
-				surface_ring_mbar[writeIndex] = runningAvg;
+				surface_ring_mbar[surface_pressure_writeIndex] = runningAvg;
 			}
 			else
 			{
-				surface_ring_mbar[writeIndex] =	PRESSURE_SURFACE_MAX_MBAR;
+				surface_ring_mbar[surface_pressure_writeIndex] =	PRESSURE_SURFACE_MAX_MBAR;
 			}
-			writeIndex++; /* the write index is now pointing to the oldest value in the buffer which will be overwritten next time */
+			surface_pressure_writeIndex++; /* the write index is now pointing to the oldest value in the buffer which will be overwritten next time */
 
-			if(writeIndex == PRESSURE_SURFACE_QUE)
+			if(surface_pressure_writeIndex == PRESSURE_SURFACE_QUE)
 			{
-				writeIndex = 0;
+				surface_pressure_writeIndex = 0;
 			}
 
-			surface_pressure_mbar = surface_ring_mbar[writeIndex]; /* 30 minutes old measurement */
+			surface_pressure_mbar = surface_ring_mbar[surface_pressure_writeIndex]; /* 30 minutes old measurement */
 
 			secondCounterSurfaceRing = 0;
 			avgCount = 1;	/* use the current value as starting point but restart the weight decrement of the measurements */
 		}
+		evaluate_surface_pressure();
 	}
 }
 
@@ -425,12 +511,74 @@
 }
 
 
+#ifdef SIMULATE_PRESSURE
+void pressure_simulation()
+{
+	static uint32_t tickstart = 0;
+	static float pressure_sim_mbar = 0;
+	static uint32_t passedSecond = 0;
+	static uint32_t secondtick = 0;
+
+	uint32_t lasttick = 0;
+
+
+
+	if( tickstart == 0)
+	{
+		tickstart = HAL_GetTick(); /* init time stamp */
+		secondtick = tickstart;
+		pressure_sim_mbar = 1000;
+	}
+
+	lasttick = HAL_GetTick();
+	if(time_elapsed_ms(secondtick,lasttick) > 1000) /* one second passed since last tick */
+	{
+		secondtick = lasttick;
+		passedSecond++;
+
+#ifdef DIVE_AFTER_LANDING
+		if(passedSecond < 10) pressure_sim_mbar = 1000.0;	 /* stay stable for 10 seconds */
+		else if(passedSecond < 300) pressure_sim_mbar -= 1.0; /* decrease pressure in 5 minutes target 770mbar => delta 330 */
+		else if(passedSecond < 900) pressure_sim_mbar += 0.0;	/*stay stable 10 minutes*/
+		else if(passedSecond < 1500) pressure_sim_mbar += 0.5;	/* return to 1 bar in 10 Minutes*/
+		else if(passedSecond < 1800) pressure_sim_mbar += 0.0;	/* 5 minutes break */
+		else if(passedSecond < 2000) pressure_sim_mbar += 10.0; /* start dive */
+		else if(passedSecond < 2300) pressure_sim_mbar += 0.0;  /* stay on depth */
+		else if(passedSecond < 2500) pressure_sim_mbar -= 10.0; /* return to surface */
+		else pressure_sim_mbar = 1000.0;					/* final state */
+#else	/* short dive */
+		if(passedSecond < 10) pressure_sim_mbar = 1000.0;	   /* stay stable for 10 seconds */
+		else if(passedSecond < 180) pressure_sim_mbar += 10.0; /* Start dive */
+		else if(passedSecond < 300) pressure_sim_mbar += 0.0;	/*stay on depth*/
+		else if(passedSecond < 460) pressure_sim_mbar -= 10.0;	/* return to surface */
+		else if(passedSecond < 600) pressure_sim_mbar += 0.0;   /* stay */
+		else if(passedSecond < 610) pressure_sim_mbar = 1000.0; /* get ready for second dive */
+		else if(passedSecond < 780) pressure_sim_mbar += 10.0; /* Start dive */
+		else if(passedSecond < 900) pressure_sim_mbar += 0.0;	/*stay on depth*/
+		else if(passedSecond < 1060) pressure_sim_mbar -= 10.0;	/* return to surface */
+		else if(passedSecond < 1200) pressure_sim_mbar += 0.0;   /* stay */
+		else pressure_sim_mbar = 1000.0;					/* final state */
+#endif
+	}
+
+
+	ambient_pressure_mbar = pressure_sim_mbar;
+	ambient_temperature = 25.0;
+	return;
+}
+
+#endif
+
 void pressure_calculation(void)
 {
 	if(global.I2C_SystemStatus != HAL_OK)
 		return;
-	
+
+#ifdef SIMULATE_PRESSURE
+	pressure_simulation();
+#else
 	pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015();
+#endif
 }
 
 static uint8_t pressure_plausible(float pressurevalue)
@@ -554,156 +702,6 @@
 }
 
 
-/*
-void pressure_calculation_new(void)
-{
-#define POW2_8	(256)
-#define POW2_17	(131072)
-#define POW2_6	(64)
-#define POW2_16	(65536)
-#define POW2_7	(128)
-#define POW2_23	(8388608)
-#define POW2_21	(2097152)
-#define POW2_15	(32768)
-#define POW2_13	(8192)
-#define POW2_37	(137438953472)
-#define POW2_4	(16)
-#define POW2_33	(8589934592)
-#define POW2_3	(8)
-	
-	int32_t	P; // compensated pressure value
-	int32_t T; // compensated temperature value
-	int32_t dT; // difference between actual and measured temperature
-	int64_t OFF; // offset at actual temperature
-	int64_t SENS;
-
-	int32_t T2;
-	int64_t OFF2;
-	int64_t SENS2;
-	
-	dT 		= ((int32_t)D2) - ((int32_t)C[5]) * POW2_8;
-	OFF 	= ((int64_t)C[2]) * POW2_16 + ((int64_t)dT) * ((int64_t)C[4]) / POW2_7;
-	SENS 	= ((int64_t)C[1]) * POW2_15 + ((int64_t)dT) * ((int64_t)C[3]) / POW2_8;
-
-	T	= 2000 + (dT * ((int32_t)C[6])) / POW2_23;
-
-
-if(T < 2000) // low temperature
-	{
-		T2 = 3 * dT * dT;
-		T2 /= POW2_33;
-		OFF2 = ((int64_t)T) - 2000;
-		OFF2 *= OFF2;
-		OFF2 *= 3;
-		OFF2 /= 2;
-		SENS2 = ((int64_t)T) - 2000;
-		SENS2 *= SENS2;
-		SENS2 *= 5;
-		SENS2 /= POW2_3;
-	}
-	else // high temperature
-	{
-		T2 = 7 * dT * dT;
-		T2 /= POW2_37;
-		OFF2 = ((int64_t)T) - 2000;
-		OFF2 *= OFF2;
-		OFF2 /= POW2_4;
-		SENS2 = 0;
-	}
-
-	T = T - T2;
-	OFF = OFF - OFF2;
-	SENS = SENS - SENS2;
-	
-	P = (int32_t)(((((int64_t)D1) * SENS) / POW2_21 - OFF) / POW2_13);
-	
-	ambient_temperature 	= ((float)T) / 100;
-	ambient_pressure_mbar	= ((float)P) / 10;
-}
-*/
-
-/*
-void pressure_calculation_old(void) {
-	//
-	double ambient_temperature_centigrad = 0;
-	double ambient_pressure_decimbar = 0;
-	
-	// static for debug
-	static int64_t dt = 0;
-	static int64_t temp = 0;
-	static int64_t ms_off = 0;
-	static int64_t sens = 0;
-	//
-	static int64_t ms_off2 = 0;
-	static int64_t sens2 = 0;
-	static int64_t t2 = 0;
-
-	if((D2 == 0) || (D1 == 0))
-		return;
-	//
-
-	// dT = D2 - C[5] * POW2_8;
-	// T	= 2000 + (dT * C[6]) / POW2_23;
-	dt = (int64_t)D2 - C5_x_2p8;
-	//temp ; // in 10 milliGrad Celcius
-	ambient_temperature_centigrad = 2000 + dt * C[6] / 8388608;
-	
-
-	if(ambient_temperature_centigrad < 2000) // low temperature
-		{
-			t2 = 3 * dt;
-			t2 *= dt;
-			t2 /= 8589934592;
-			ms_off2 = ambient_temperature_centigrad - 2000;
-			ms_off2 *= ms_off2;
-			sens2 = ms_off2;
-			ms_off2 *= 3;
-			ms_off2 /= 2;
-			sens2 *= 5;
-			sens2 /= 8;
-		}
-		else // high temperature
-		{
-			t2 = 7 * dt;
-			t2 *= dt;
-			t2 /= 137438953472;
-			ms_off2 = ambient_temperature_centigrad - 2000;
-			ms_off2 *= ms_off2;
-			ms_off2 /= 16;
-			sens2 = 0;
-		}
-	
-	
-	//
-
-	// pressure
-	// OFF 	= C[2] * POW2_16 + dT * C[4] / POW2_7;
-	// SENS = C[1] * POW2_15 + dT * C[3] / POW2_8;
-	ms_off =  C[4] * dt;
-	ms_off /= 128;
-	ms_off += C2_x_2p16;
-	//
-	sens =  C[3] * dt;
-	sens /= 256;
-	sens += C1_x_2p15;
-
-	// 2nd order correction
-	ambient_temperature_centigrad -= t2;
-	ms_off -= ms_off2;
-	sens -= sens2;
-
-	ambient_temperature = ambient_temperature_centigrad / 100;
-		// P = (D1 * SENS / POW2_21 - OFF) / POW2_13;
-	temp = D1 * sens;
-	temp /= 2097152;
-	temp -= ms_off;
-	temp /= 8192;
-	ambient_pressure_decimbar = temp; // to float/double
-	ambient_pressure_mbar = ambient_pressure_decimbar / 10;
-}
-*/
-
-
 /* taken from AN520 by meas-spec.com dated 9. Aug. 2011
  * short and int are both 16bit according to AVR/GCC google results
  */
--- a/Small_CPU/Src/scheduler.c	Mon Aug 19 11:42:31 2019 +0000
+++ b/Small_CPU/Src/scheduler.c	Sun Oct 06 11:58:36 2019 +0000
@@ -57,6 +57,8 @@
 uint8_t deviceDataSubSeconds = 0;
 
 /* Private variables ---------------------------------------------------------*/
+static uint16_t ManualExitDiveCounter = 0;   /* The computer will exit dive mode in shallow area immediately. Increase depth to restart dive while counter is active */
+
 /* can be lost while in sleep */
 uint8_t clearDecoNow = 0;
 uint8_t setButtonsNow = 0;
@@ -262,6 +264,11 @@
 		}
 	}		
 
+	if(global.dataSendToSlave.setEndDive)
+	{
+		ManualExitDiveCounter = 30 * 60; /* This will cause the computer to leave dive mode if in shallow area and increase the depth to enter dive mode for the next 30 minutes */
+	}
+
 	if((global.mode == MODE_SURFACE) && (global.dataSendToSlave.mode == MODE_SHUTDOWN))
 	{
 		global.mode = MODE_SHUTDOWN;
@@ -461,6 +468,14 @@
 	scheduleSetDate(&global.deviceData.diveCycles);
 	global.lifeData.counterSecondsShallowDepth = 0;
 
+	/* Get the last stable value in case of an unstable surface history condition */
+	if(!is_surface_pressure_stable())
+	{
+		set_last_surface_pressure_stable();
+	}
+	global.lifeData.pressure_surface_bar = get_surface_mbar() / 1000.0f;
+	ManualExitDiveCounter = 0;	/* reset early exit request */
+
 	Scheduler.tickstart = HAL_GetTick();
 	while(global.mode == MODE_DIVE)
 	{
@@ -556,11 +571,12 @@
 						global.demo_mode = 0;
 					}
 				}
-				
+
 				if(is_ambient_pressure_close_to_surface(&global.lifeData))
 				{
 					global.lifeData.counterSecondsShallowDepth++;
-					if((global.lifeData.counterSecondsShallowDepth >= global.settings.timeoutDiveReachedZeroDepth) || ((global.lifeData.dive_time_seconds < 60) && (global.demo_mode == 0)) || (global.dataSendToSlave.setEndDive))
+					if((global.lifeData.counterSecondsShallowDepth >= global.settings.timeoutDiveReachedZeroDepth) || ((global.lifeData.dive_time_seconds < 60) && (global.demo_mode == 0))
+							|| (ManualExitDiveCounter))
 					{
 						global.seconds_since_last_dive = 1; // start counter
 						schedule_update_timer_helper(0); // zum starten :-)
@@ -600,7 +616,7 @@
 					{
 						global.lifeData.dive_time_seconds = 0; // this apnea dive ends here
 					}
-					if((global.lifeData.counterSecondsShallowDepth >= global.settings.timeoutDiveReachedZeroDepth) || (global.dataSendToSlave.setEndDive))
+					if((global.lifeData.counterSecondsShallowDepth >= global.settings.timeoutDiveReachedZeroDepth) || (ManualExitDiveCounter))
 					{
 						global.dataSendToMaster.mode = MODE_ENDDIVE;
 						global.deviceDataSendToMaster.mode = MODE_ENDDIVE;
@@ -814,6 +830,11 @@
 				clearDecoNow = 0;
 			}
 
+			if(ManualExitDiveCounter)
+			{
+				ManualExitDiveCounter--;
+			}
+
 			if(global.seconds_since_last_dive)
 			{
 				schedule_update_timer_helper(-1);
@@ -1381,6 +1402,7 @@
 	global.dataSendToMaster.data[boolPressureData].ascent_rate_meter_per_min = global.lifeData.ascent_rate_meter_per_min;
 	global.dataSendToMaster.data[boolPressureData].pressure_uTick = HAL_GetTick();
 	global.dataSendToMaster.boolPressureData = boolPressureData;
+	global.dataSendToMaster.data[boolPressureData].SPARE1 = is_surface_pressure_stable();
 }
 
 
@@ -1587,16 +1609,25 @@
 /* same as in data_central.c */
 _Bool is_ambient_pressure_close_to_surface(SLifeData *lifeData)
 {
-	if(lifeData->pressure_ambient_bar == INVALID_PREASURE_VALUE)	/* as long as no valid data is available expect we are close to surface */
+	_Bool retval = true;
+
+	if(lifeData->pressure_ambient_bar != INVALID_PREASURE_VALUE)	/* as long as no valid data is available expect we are close to surface */
 	{
-		return true;
+		/* this will e.g. apply in case of a significant pressure change during last 30 minutes => use increased offset for surface detection */
+		if (lifeData->pressure_ambient_bar > START_DIVE_IMMEDIATLY_BAR)
+		{
+			retval = false;
+		}
+		else if(is_surface_pressure_stable())		/* this is the expected start condition */
+		{
+			if((lifeData->pressure_ambient_bar >= (lifeData->pressure_surface_bar + 0.1f))
+					&& (ManualExitDiveCounter == 0))		/* only if diver did not request to exit dive mode */
+			{
+				retval = false;
+			}
+		}
 	}
-	if (lifeData->pressure_ambient_bar > START_DIVE_IMMEDIATLY_BAR)
-		return false;
-	else if(lifeData->pressure_ambient_bar < (lifeData->pressure_surface_bar + 0.1f)) // hw 161121 now 1 mter, before 0.04f
-		return true;
-	else
-		return false;
+	return retval;
 }