changeset 949:c6b858f2e025 Evo_2_23 tip

GNSS UTC in Date-Time menu: The UTC time provided by the gnss module is not shown in the date-time settings menu. If a valid time signal is available then the OSTC RTC may be set to it by selecting the UTC menu entry. The time zone has to be selected manually. This is possible using a separate edit line.
author Ideenmodellierer
date Sun, 22 Dec 2024 21:19:21 +0100
parents abdd72c8b567
children
files Common/Inc/data_central.h Common/Inc/data_exchange.h Common/Inc/settings.h Discovery/Inc/tMenuEdit.h Discovery/Inc/tMenuEditSystem.h Discovery/Inc/tStructure.h Discovery/Inc/text_multilanguage.h Discovery/Src/data_central.c Discovery/Src/settings.c Discovery/Src/t7.c Discovery/Src/tMenuEdit.c Discovery/Src/tMenuEditHardware.c Discovery/Src/tMenuEditSystem.c Discovery/Src/text_multilanguage.c
diffstat 14 files changed, 304 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/Common/Inc/data_central.h	Sun Dec 22 21:15:05 2024 +0100
+++ b/Common/Inc/data_central.h	Sun Dec 22 21:19:21 2024 +0100
@@ -171,6 +171,17 @@
 	float fLon;
 }SGnssCoord;
 
+
+typedef struct
+{
+	uint8_t year;
+	uint8_t month;
+	uint8_t day;
+	uint8_t hour;
+	uint8_t min;
+	uint8_t sec;
+}SDateTime;
+
 typedef struct
 {
 	SGnssCoord coord;
@@ -178,6 +189,7 @@
 	uint8_t fixType;
 	uint8_t numSat;			/* number of available satellites */
 	uint8_t signalQual[4];	/* signal quality indicator for x sats */
+	SDateTime DateTime;		/* UTC time information */
 } SGnssInfo;
 
 typedef enum
@@ -577,6 +589,7 @@
 
 void convertStringOfDate_DDMMYY(char* pString, uint8_t strLen, uint8_t day, uint8_t month, uint8_t year);
 void getStringOfFormat_DDMMYY(char* pString, uint8_t strLen);
+void convertUTCToLocal(uint8_t utcHours, uint8_t utcMinutes, uint8_t* pLocalHours, uint8_t* pLocalMinutes);
 
 uint8_t calculateSlowExit(uint16_t* pCountDownSec, float* pExitDepthMeter, uint8_t* pColor);
 
--- a/Common/Inc/data_exchange.h	Sun Dec 22 21:15:05 2024 +0100
+++ b/Common/Inc/data_exchange.h	Sun Dec 22 21:19:21 2024 +0100
@@ -53,6 +53,9 @@
 #define CO2_WARNING_LEVEL_PPM		(2000u)	    /* Early warning to indicate unexpected high co2 concentration (yellow) */
 #define CO2_ALARM_LEVEL_PPM			(5000u)		/* starting by this level CO2 has a negative impact on health (long exposure) */
 
+#define GNSS_ALIVE_STATE_ALIVE		(0x01u)		/* Communication to module active */
+#define GNSS_ALIVE_STATE_TIME		(0x02u)		/* Time information valid */
+
 enum MODE
 {
 	MODE_SURFACE	= 0,
--- a/Common/Inc/settings.h	Sun Dec 22 21:15:05 2024 +0100
+++ b/Common/Inc/settings.h	Sun Dec 22 21:19:21 2024 +0100
@@ -184,6 +184,14 @@
 	uint8_t Corrections;
 } SSettingsStatus;
 
+
+typedef struct
+{
+	int8_t hours;
+	uint8_t minutes;
+} StimeZone;
+
+
 /* SSettings
 	 * gas[0] and setpoint[0] are the special ones configurable during the dive
 	 */
@@ -314,6 +322,8 @@
 	uint8_t ext_sensor_map[8];		/* redefined in 0xFFFF0027 */
 	uint8_t cvAutofocus;
 	uint8_t slowExitTime;
+	/* new in 0xFFFF002c */
+	StimeZone timeZone;
 } SSettings;
 
 typedef struct
--- a/Discovery/Inc/tMenuEdit.h	Sun Dec 22 21:15:05 2024 +0100
+++ b/Discovery/Inc/tMenuEdit.h	Sun Dec 22 21:19:21 2024 +0100
@@ -78,6 +78,7 @@
 void clean_content(uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle,  const tFont *Font);
 void write_content(uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle,  const tFont *Font, const char *text, uint8_t color);
 
+uint8_t togglePlusMinus(uint8_t input);
 void write_topline( char *text);
 void write_buttonTextline( uint8_t left2ByteCode, char middle2ByteCode, char right2ByteCode);
 void write_field_udigit(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint32_t int1,  uint32_t int2,  uint32_t int3,  uint32_t int4);
--- a/Discovery/Inc/tMenuEditSystem.h	Sun Dec 22 21:15:05 2024 +0100
+++ b/Discovery/Inc/tMenuEditSystem.h	Sun Dec 22 21:19:21 2024 +0100
@@ -38,5 +38,6 @@
 void refresh_InformationPage(void);
 void refresh_Design(void);
 void refresh_Customviews(void);
+void refresh_DateTime(void);
 
 #endif /* TMENU_EDIT_SYSTEM_H */
--- a/Discovery/Inc/tStructure.h	Sun Dec 22 21:15:05 2024 +0100
+++ b/Discovery/Inc/tStructure.h	Sun Dec 22 21:19:21 2024 +0100
@@ -316,8 +316,9 @@
 #define StMSYS1_DDMMYY	_MB(2,8,1,3,1)
 #define StMSYS1_MMDDYY	_MB(2,8,1,3,2)
 #define StMSYS1_YYMMDD	_MB(2,8,1,3,3)
-#define StMSYS1_DST		_MB(2,8,1,4,0)
-#define StMSYS1_12HR    _MB(2,8,1,5,0)
+#define StMSYS1_12HR    _MB(2,8,1,4,0)
+#define StMSYS1_GNSSDT  _MB(2,8,1,5,0)
+#define StMSYS1_ZONE	_MB(2,8,1,6,0)
 
 #define StMSYS_Timer	_MB(2,8,2,1,0)
 
--- a/Discovery/Inc/text_multilanguage.h	Sun Dec 22 21:15:05 2024 +0100
+++ b/Discovery/Inc/text_multilanguage.h	Sun Dec 22 21:19:21 2024 +0100
@@ -391,6 +391,7 @@
 		TXT2BYTE_DDMMYY,
 		TXT2BYTE_MMDDYY,
 		TXT2BYTE_YYMMDD,
+		TXT2BYTE_TIMEZONE,
 
 		TXT2BYTE_END,
 };
--- a/Discovery/Src/data_central.c	Sun Dec 22 21:15:05 2024 +0100
+++ b/Discovery/Src/data_central.c	Sun Dec 22 21:19:21 2024 +0100
@@ -1095,3 +1095,31 @@
 	*pColor = color;
 	return drawingActive;
 }
+
+void convertUTCToLocal(uint8_t utcHours, uint8_t utcMinutes, uint8_t* pLocalHours, uint8_t* pLocalMinutes)
+{
+    int8_t localHours = 0;
+    int8_t localMinutes = 0;
+    SSettings* pSettings = settingsGetPointer();
+
+	localHours = utcHours + pSettings->timeZone.hours;
+	if(localHours < 0)
+	{
+		localHours += 24;
+	}
+	if(localHours > 24)
+	{
+		localHours -= 24;
+	}
+	localMinutes = utcMinutes + pSettings->timeZone.minutes;
+	if(localMinutes < 0)
+	{
+		localMinutes += 60;
+	}
+	if(localMinutes > 60)
+	{
+		localMinutes -= 60;
+	}
+	*pLocalHours = localHours;
+	*pLocalMinutes = localMinutes;
+}
--- a/Discovery/Src/settings.c	Sun Dec 22 21:15:05 2024 +0100
+++ b/Discovery/Src/settings.c	Sun Dec 22 21:19:21 2024 +0100
@@ -89,7 +89,7 @@
  * There might even be entries with fixed values that have no range
  */
 const SSettings SettingsStandard = {
-    .header = 0xFFFF002B,
+    .header = 0xFFFF002C,
     .warning_blink_dsec = 8 * 2,
     .lastDiveLogId = 0,
     .logFlashNextSampleStartAddress = SAMPLESTART,
@@ -340,7 +340,9 @@
     .delaySetpointLow = false,
     .timerDurationS = 180,
 	.cvAutofocus = 0,
-	.slowExitTime = 0
+	.slowExitTime = 0,
+	.timeZone.hours = 0,
+	.timeZone.minutes = 0
 };
 
 /* Private function prototypes -----------------------------------------------*/
@@ -603,6 +605,10 @@
     case 0xFFFF002A:
     	Settings.slowExitTime = 0;
     	// no break;
+    case 0xFFFF002B:
+    	Settings.timeZone.hours = 0;
+    	Settings.timeZone.minutes = 0;
+    	// no break;
     default:
         pSettings->header = pStandard->header;
         break; // no break before!!
@@ -1854,6 +1860,15 @@
     	 Settings.cvAutofocus = 0;
     }
     parameterId++;
+    if((Settings.timeZone.hours > 14)
+    		|| (Settings.timeZone.hours < -12)
+			|| (Settings.timeZone.minutes > 45))
+    {
+    	Settings.timeZone.hours = 0;
+    	Settings.timeZone.minutes = 0;
+    	 corrections++;
+    }
+	parameterId++;
     if(corrections)
     {
     	settingsWarning = 1;
--- a/Discovery/Src/t7.c	Sun Dec 22 21:15:05 2024 +0100
+++ b/Discovery/Src/t7.c	Sun Dec 22 21:19:21 2024 +0100
@@ -4040,7 +4040,7 @@
     if(stateUsed->lifeData.gnssData.fixType < 2)
     {
     	textpointer += snprintf(&text[textpointer],50,"\001Satellites\n\r");
-    	if(stateUsed->lifeData.gnssData.alive)
+    	if(stateUsed->lifeData.gnssData.alive & GNSS_ALIVE_STATE_TIME)
     	{
     		textpointer += snprintf(&text[textpointer],50,"\001\020Status\n\r");
     	}
--- a/Discovery/Src/tMenuEdit.c	Sun Dec 22 21:15:05 2024 +0100
+++ b/Discovery/Src/tMenuEdit.c	Sun Dec 22 21:19:21 2024 +0100
@@ -242,6 +242,8 @@
 	 	 case (StMHARD5_Button1 & MaskFieldDigit): // will not be executed in EditFieldMode as global state is different
 						refreshFct = refresh_ButtonValuesFromPIC;
 	 	 	 break;
+	 	 case StMSYS1_DateTime: refreshFct = refresh_DateTime;
+		 	 break;
 	 	 case (StMSYS3_Units & MaskFieldDigit): refreshFct = refresh_Design;
 	 	 	 break;
 	 	 case (StMCustom1_CViewTimeout & MaskFieldDigit):refreshFct = refresh_Customviews;
@@ -1339,6 +1341,15 @@
 	clean_content_of_Id(actualId);
 }
 
+uint8_t togglePlusMinus(uint8_t input)
+{
+    if (input == '+') {
+        return '-';
+    } else {
+        return '+';
+    }
+}
+
 void write_field_udigit_and_2digit(uint8_t subtype, uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint32_t int1,  uint32_t int2,  uint32_t int3,  uint32_t int4)
 {
     if(id >= 9)
--- a/Discovery/Src/tMenuEditHardware.c	Sun Dec 22 21:15:05 2024 +0100
+++ b/Discovery/Src/tMenuEditHardware.c	Sun Dec 22 21:19:21 2024 +0100
@@ -159,17 +159,6 @@
     exitMenuEdit_to_Home();
 }
 
-
-static uint8_t togglePlusMinus(uint8_t input)
-{
-    if (input == '+') {
-        return '-';
-    } else {
-        return '+';
-    }
-}
-
-
 static uint8_t OnAction_CompassDeclination(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
 {
     SSettings *settings = settingsGetPointer();
--- a/Discovery/Src/tMenuEditSystem.c	Sun Dec 22 21:15:05 2024 +0100
+++ b/Discovery/Src/tMenuEditSystem.c	Sun Dec 22 21:19:21 2024 +0100
@@ -66,6 +66,8 @@
 uint8_t OnAction_MMDDYY				(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 uint8_t OnAction_YYMMDD				(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 uint8_t OnAction_DST					(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
+uint8_t OnAction_UTC				(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
+uint8_t OnAction_SetGnss			(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 uint8_t OnAction_English			(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 uint8_t OnAction_German				(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 uint8_t OnAction_French				(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
@@ -235,15 +237,104 @@
 /* Private functions ---------------------------------------------------------*/
 
 
+void refresh_DateTime()
+{
+    RTC_DateTypeDef Sdate;
+    RTC_TimeTypeDef Stime;
+    uint8_t day,month,year,hour,minute;
+    char text[32];
+    char formatStr[20];
+    SSettings *pSettings;
+    const SFirmwareData *pFirmwareInfo;
+#if defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2
+    uint8_t localHours = 0;
+    uint8_t localMinutes = 0;
+#endif
+    pFirmwareInfo = firmwareDataGetPointer();
+    const SDiveState * pStateReal = stateRealGetPointer();
+
+    pSettings = settingsGetPointer();
+
+    translateDate(pStateReal->lifeData.dateBinaryFormat, &Sdate);
+    translateTime(pStateReal->lifeData.timeBinaryFormat, &Stime);
+    year = Sdate.Year;
+    month = Sdate.Month;
+    day = Sdate.Date;
+    hour = Stime.Hours;
+    minute= Stime.Minutes;
+
+    if(year < pFirmwareInfo->release_year)
+        year = pFirmwareInfo->release_year;
+
+    if(month < 1)
+        month = 1;
+
+    if(day < 1)
+        day = 1;
+
+    getStringOfFormat_DDMMYY(formatStr, 20);
+
+    text[0] = '\001';
+    text[1] = TXT_DateAndTime;
+    text[2] = 0;
+
+    write_topline(text);
+
+    write_label_fix(  20, 340, ME_Y_LINE1, &FontT42, TXT_TimeConfig);
+    write_label_fix(  20, 340, ME_Y_LINE2, &FontT42, TXT_Format);
+    write_label_fix(  20, 340, ME_Y_LINE3, &FontT42, TXT_DateConfig);
+    write_label_fix(  20, 790, ME_Y_LINE4, &FontT42, TXT_Format);
+#if defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2
+    write_label_var(  20, 340, ME_Y_LINE5, &FontT42, "GNSS");
+    snprintf(text, 32, "%c%c", TXT_2BYTE, TXT2BYTE_TIMEZONE);
+    write_label_var(  20, 340, ME_Y_LINE6, &FontT42, text);
+#endif
+
+
+    tMenuEdit_newInput(StMSYS1_Time, hour, minute, 0, 0);
+    tMenuEdit_set_on_off(StMSYS1_12HR, pSettings->amPMTime);
+
+    switch(pSettings->date_format)
+    {
+    	default:
+    	case DDMMYY:  tMenuEdit_newInput(StMSYS1_Date, day, month, year, 0);
+    		break;
+    	case MMDDYY:  tMenuEdit_newInput(StMSYS1_Date, month, day, year, 0);
+    		break;
+    	case YYMMDD:  tMenuEdit_newInput(StMSYS1_Date, year, month, day, 0);
+    		break;
+    }
+    tMenuEdit_newButtonText(StMSYS1_FORMAT, formatStr);
+
+#if defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2
+    if(pStateReal->lifeData.gnssData.alive & GNSS_ALIVE_STATE_TIME)
+    {
+        convertUTCToLocal(pStateReal->lifeData.gnssData.DateTime.hour, pStateReal->lifeData.gnssData.DateTime.min, &localHours, &localMinutes);
+        convertStringOfDate_DDMMYY(formatStr, 20, pStateReal->lifeData.gnssData.DateTime.day
+        										, pStateReal->lifeData.gnssData.DateTime.month
+    											, pStateReal->lifeData.gnssData.DateTime.year);
+        snprintf(text, 32, "%02d:%02d - %s", localHours, localMinutes, formatStr);
+        tMenuEdit_newButtonText(StMSYS1_GNSSDT, text);
+    }
+    else
+    {
+    	snprintf(text, 32, "--:--");
+    	write_label_var(  320, 790, ME_Y_LINE5, &FontT42, text);
+    }
+    tMenuEdit_newInput(StMSYS1_ZONE, pSettings->timeZone.hours, pSettings->timeZone.minutes, 0, 0);
+#endif
+    write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext);
+}
 void openEdit_DateTime(void)
 {
     RTC_DateTypeDef Sdate;
     RTC_TimeTypeDef Stime;
     uint8_t day,month,year,hour,minute;
     char text[32];
-    char formatStr[10];
+    char formatStr[20];
     SSettings *pSettings;
     const SFirmwareData *pFirmwareInfo;
+
     pFirmwareInfo = firmwareDataGetPointer();
     const SDiveState * pStateReal = stateRealGetPointer();
 
@@ -269,18 +360,7 @@
     if(day < 1)
         day = 1;
 
-//	daylightsaving = Stime.DayLightSaving;
-
-    switch(pSettings->date_format)
-    {
-    	default:
-    	case DDMMYY: snprintf(formatStr,10,"DDMMYY");
-    		break;
-    	case MMDDYY: snprintf(formatStr,10,"MMDDYY");
-    		break;
-    	case YYMMDD: snprintf(formatStr,10,"YYMMDD");
-    	    break;
-    };
+    getStringOfFormat_DDMMYY(formatStr, 20);
 
     text[0] = '\001';
     text[1] = TXT_DateAndTime;
@@ -292,6 +372,11 @@
     write_label_fix(  20, 340, ME_Y_LINE2, &FontT42, TXT_Format);
     write_label_fix(  20, 340, ME_Y_LINE3, &FontT42, TXT_DateConfig);
     write_label_fix(  20, 790, ME_Y_LINE4, &FontT42, TXT_Format);
+#if defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2
+    write_label_var(  20, 340, ME_Y_LINE5, &FontT42, "GNSS");
+    snprintf(text, 32, "%c%c", TXT_2BYTE, TXT2BYTE_TIMEZONE);
+    write_label_var(  20, 340, ME_Y_LINE6, &FontT42, text);
+#endif
 
     write_field_2digit(StMSYS1_Time,		320, 780, ME_Y_LINE1,  &FontT48, "##:##", (uint32_t)hour, (uint32_t)minute, 0, 0);
     write_field_on_off(StMSYS1_12HR,		320, 790, ME_Y_LINE2,  &FontT48, "12 HR", pSettings->amPMTime);
@@ -307,15 +392,22 @@
     		break;
     }
 
+    write_field_button(StMSYS1_FORMAT, 320, 790, ME_Y_LINE4,  &FontT48, formatStr);
 
-    write_field_button(StMSYS1_FORMAT, 320, 790, ME_Y_LINE4,  &FontT48, formatStr);
+#if defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2
+	snprintf(text, 32, "--:--");
+	write_field_button(StMSYS1_GNSSDT, 320, 790, ME_Y_LINE5,  &FontT48, text);
+    write_field_sdigit(StMSYS1_ZONE, 320, 780, ME_Y_LINE6,  &FontT48, "UTC: ###:###", pSettings->timeZone.hours, pSettings->timeZone.minutes,0,0);
+#endif
 
     setEvent(StMSYS1_Date, 		(uint32_t)OnAction_Date);
     setEvent(StMSYS1_Time, 		(uint32_t)OnAction_Time);
     setEvent(StMSYS1_12HR,      (uint32_t)OnAction_12HR);
     setEvent(StMSYS1_FORMAT,	(uint32_t)OnAction_Format);
-//	setEvent(StMSYS1_DST,			(uint32_t)OnAction_DST);
-
+#if defined ENABLE_GNSS_SUPPORT || defined ENABLE_GPIO_V2
+   	setEvent(StMSYS1_GNSSDT, (uint32_t)OnAction_SetGnss);
+	setEvent(StMSYS1_ZONE,		(uint32_t)OnAction_UTC);
+#endif
     write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext);
 }
 
@@ -552,6 +644,32 @@
     return UNSPECIFIC_RETURN;
 }
 
+uint8_t OnAction_SetGnss(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
+{
+    RTC_DateTypeDef sdatestructure;
+    RTC_TimeTypeDef stimestructure;
+    uint8_t localHours = 0;
+    uint8_t localMinutes = 0;
+
+    const SDiveState * pStateReal = stateRealGetPointer();
+
+    if(pStateReal->lifeData.gnssData.alive & GNSS_ALIVE_STATE_TIME)
+    {
+        convertUTCToLocal(pStateReal->lifeData.gnssData.DateTime.hour, pStateReal->lifeData.gnssData.DateTime.min, &localHours, &localMinutes);
+        stimestructure.Hours = localHours;
+        stimestructure.Minutes = localMinutes;
+        stimestructure.Seconds = 0;
+        setTime(stimestructure);
+
+        sdatestructure.Date = pStateReal->lifeData.gnssData.DateTime.day;
+        sdatestructure.Month = pStateReal->lifeData.gnssData.DateTime.month;
+        sdatestructure.Year = pStateReal->lifeData.gnssData.DateTime.year;
+        setWeekday(&sdatestructure);
+        setDate(sdatestructure);
+    }
+    return UNSPECIFIC_RETURN;
+}
+
 void openEdit_DateFormat(void)
 {
     char text[32];
@@ -649,6 +767,81 @@
     return UNSPECIFIC_RETURN;
 }
 
+uint8_t OnAction_UTC(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
+{
+    SSettings *settings = settingsGetPointer();
+    const SDiveState * pStateReal = stateRealGetPointer();
+    int32_t utcHour;
+    uint32_t utcMinutes;
+    uint8_t digitContentNew;
+    uint8_t localHours = 0;
+    uint8_t localMinutes = 0;
+    char text[32];
+    char timeStr[20];
+
+    switch (action) {
+    case ACTION_BUTTON_ENTER:
+
+        return digitContent;
+    case ACTION_BUTTON_ENTER_FINAL:
+        {
+
+            evaluateNewString(editId, (uint32_t *)&utcHour, &utcMinutes, NULL, NULL);
+
+            if (utcHour > 14) {
+            	utcHour = 14;
+            } else if (utcHour < -12) {
+            	utcHour = -12;
+            }
+
+            if (utcMinutes % 15 != 0)
+            {
+            	utcMinutes = (utcMinutes / 15) * 15;
+            }
+            if(utcMinutes > 45)
+            {
+            	utcMinutes = 45;
+            } else if (utcMinutes < 0) {
+            	utcMinutes = 0;
+            }
+            settings->timeZone.hours = utcHour;
+            settings->timeZone.minutes = utcMinutes;
+
+            tMenuEdit_newInput(editId, ((input_u)utcHour).uint32, utcMinutes, 0, 0);
+            convertUTCToLocal(pStateReal->lifeData.gnssData.DateTime.hour, pStateReal->lifeData.gnssData.DateTime.min, &localHours, &localMinutes);
+            convertStringOfDate_DDMMYY(timeStr, 20, pStateReal->lifeData.gnssData.DateTime.day
+            										, pStateReal->lifeData.gnssData.DateTime.month
+        											, pStateReal->lifeData.gnssData.DateTime.year);
+            snprintf(text, 32, "%2d:%2d - %s", localHours, localMinutes, timeStr);
+            tMenuEdit_newButtonText(StMSYS1_GNSSDT, text);
+        }
+
+        break;
+    case ACTION_BUTTON_NEXT:
+        if ((blockNumber == 0) && (digitNumber == 0)) {
+            digitContentNew = togglePlusMinus(digitContent);
+        } else {
+            digitContentNew = digitContent + 1;
+            if (digitContentNew > '9') {
+                digitContentNew = '0';
+            }
+        }
+
+        return digitContentNew;
+    case ACTION_BUTTON_BACK:
+    	if ((blockNumber == 0) && (digitNumber == 0)) {
+            digitContentNew = togglePlusMinus(digitContent);
+        } else {
+            digitContentNew = digitContent - 1;
+            if (digitContentNew < '0') {
+                digitContentNew = '9';
+            }
+        }
+        return digitContentNew;
+    }
+    return UNSPECIFIC_RETURN;
+}
+
 
 uint8_t OnAction_DST(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
 {
--- a/Discovery/Src/text_multilanguage.c	Sun Dec 22 21:15:05 2024 +0100
+++ b/Discovery/Src/text_multilanguage.c	Sun Dec 22 21:19:21 2024 +0100
@@ -1987,7 +1987,11 @@
 static uint8_t text_IT_YYMMDD[] = "";
 static uint8_t text_ES_YYMMDD[] = "";
 
-
+static uint8_t text_EN_TIMEZONE[] = "Time zone";
+static uint8_t text_DE_TIMEZONE[] = "Zeitzone";
+static uint8_t text_FR_TIMEZONE[] = "";
+static uint8_t text_IT_TIMEZONE[] = "";
+static uint8_t text_ES_TIMEZONE[] = "";
 
 /* Lookup Table -------------------------------------------------------------*/
 
@@ -2295,6 +2299,7 @@
 	{(uint8_t)TXT2BYTE_DDMMYY, 			{text_EN_DDMMYY, text_DE_DDMMYY, text_FR_DDMMYY, text_IT_DDMMYY, text_ES_DDMMYY}},
 	{(uint8_t)TXT2BYTE_MMDDYY, 			{text_EN_MMDDYY, text_DE_MMDDYY, text_FR_MMDDYY, text_IT_MMDDYY, text_ES_MMDDYY}},
 	{(uint8_t)TXT2BYTE_YYMMDD, 			{text_EN_YYMMDD, text_DE_YYMMDD, text_FR_YYMMDD, text_IT_YYMMDD, text_ES_YYMMDD}},
+	{(uint8_t)TXT2BYTE_TIMEZONE, 		{text_EN_TIMEZONE, text_DE_TIMEZONE, text_FR_TIMEZONE, text_IT_TIMEZONE, text_ES_TIMEZONE}},