changeset 1078:082825daccb5 Icon_Integration tip

Added control views for HUD: The HUD implementation may now be activated by the compile switch ENABLE_HUD_SUPPORT. The HUD will become visible onces detected in the CvOpt overview menu. The first implementation is for testing only => The LEDs may be operated by a number field. Positiv values activate the red, negativ the green LEDs. Depending on the value blink sequences will be scheduled. At the moment no dive specific data is mapped to the LED operation (like e.g. warnings).
author Ideenmodellierer
date Mon, 02 Mar 2026 17:30:38 +0100
parents bd8ab302ef4a
children
files Common/Inc/configuration.h Common/Inc/data_central.h Common/Inc/data_exchange.h Discovery/Inc/tMenuCvOptionText.h Discovery/Inc/tMenuEditHardware.h Discovery/Src/data_exchange_main.c Discovery/Src/tInfoSensor.c Discovery/Src/tMenuCvOptionText.c Discovery/Src/tMenuEditCvOption.c Discovery/Src/tMenuEditHardware.c
diffstat 10 files changed, 248 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/Common/Inc/configuration.h	Mon Mar 02 17:22:25 2026 +0100
+++ b/Common/Inc/configuration.h	Mon Mar 02 17:30:38 2026 +0100
@@ -113,5 +113,7 @@
 
 /* Enable to have advanced gas information lite bottle size and pressure available */
 /* #define ENABLE_ADVANCED_GAS */
+/* Enable to have protocol support for external HUD */
+/* #define ENABLE_HUD_SUPPORT */
 
 #endif
--- a/Common/Inc/data_central.h	Mon Mar 02 17:22:25 2026 +0100
+++ b/Common/Inc/data_central.h	Mon Mar 02 17:30:38 2026 +0100
@@ -48,6 +48,8 @@
 #define EXT_INTERFACE_BUZZER_PING_TIME_MS (1000u)	/* max time the buzzer should be active for single ping */
 #define EXT_INTERFACE_BUZZER_STABLE_TIME_MS (500u)	/* min time a state (ON / OFF) should be stable before it may be changed */
 
+#define EXT_INTERFACE_HUD_LED_MAX	(16u)			/* max number of supported LED for HUD operation */
+
 
 /* Helper structs ------------------------------------------------------------*/
 
@@ -215,7 +217,7 @@
 typedef struct
 {
 	/* from Small CPU */
-	uint8_t extIf_sensor_data[3][32]; /* The external sensor may contain a 64 bit ID. It has been placed at the beginning of the structure to avoid problems in alignment */
+	uint8_t extIf_sensor_data[EXT_INTERFACE_SENSOR_CNT][32]; /* The external sensor may contain a 64 bit ID. It has been placed at the beginning of the structure to avoid problems in alignment */
 	uint8_t extIf_sensor_map[EXT_INTERFACE_SENSOR_CNT];
 
 	int32_t dive_time_seconds;
@@ -292,6 +294,9 @@
 /*	 last GF_Surf when shallow area was entered */
 	 uint8_t gf_surf_log;
 
+/* HUD control data */
+	uint8_t HUD_led_sequence[EXT_INTERFACE_HUD_LED_MAX];
+	uint8_t HUD_led_brightness;
 } 	SLifeData;
 
 
@@ -516,6 +521,7 @@
 	 SENSOR_CO2M,
 	 SENSOR_GNSS,
 	 SENSOR_GNSSM,
+	 SENSOR_HUD,
 	 SENSOR_MUX,
 	 SENSOR_END
 } externalInterfaceSensorType;
--- a/Common/Inc/data_exchange.h	Mon Mar 02 17:22:25 2026 +0100
+++ b/Common/Inc/data_exchange.h	Mon Mar 02 17:30:38 2026 +0100
@@ -34,8 +34,7 @@
 /* Command definitions for control of external interface */
 /* 1st nibble binary on/off states */
 /* 2nd nibble target sensor ID (if sensor command is active) */
-/* 3rd nibble sensor commands */
-/* 4th nibble control channel */
+/* 3 + 4th nibble control channel */
 #define EXT_INTERFACE_33V_ON		(0x8000u)	/* Bit set to enable 3.3V power interface */
 #define EXT_INTERFACE_ADC_ON		(0x4000u)	/* Bit set to enable ADC conversion */
 #define EXT_INTERFACE_BUZZER_ON		(0x2000u)	/* Bit set to enable the buzzer */
@@ -44,7 +43,9 @@
 #define EXT_INTERFACE_AUTODETECT 	(0x0001u)	/* Start auto detection of connected sensors	*/
 #define EXT_INTERFACE_COPY_SENSORMAP (0x0002u)	/* Use the sensor map provided by master for internal operations */
 #define EXT_INTERFACE_CO2_CALIB 	(0x0010u)	/* Request calibration of CO2Sensor */
-#define EXT_INTERFACE_O2_INDICATE	(0x0020u)	/* Request LED to blink*/
+#define EXT_INTERFACE_O2_INDICATE	(0x0020u)	/* Request LED to blink */
+#define EXT_INTERFACE_HUD_UPDATE	(0x0030u)	/* Update status sequence */
+#define EXT_INTERFACE_HUD_ABORT		(0x0031u)	/* Abort status sequence */
 
 #define DATA_BUFFER_ADC				(0x01u)
 #define DATA_BUFFER_CO2				(0x02u)
@@ -222,7 +223,10 @@
 
 		uint8_t externalInterface_SensorMap[EXT_INTERFACE_SENSOR_CNT];
 
-		float UNUSED1[16-1];//VPM_adjusted_critical_radius_he[16];
+		uint8_t externalInterface_HUD_Update[EXT_INTERFACE_HUD_LED_MAX];
+		uint8_t externalInterface_HUD_Brightness;
+		uint8_t UNUSED0[3];
+		float UNUSED1[16-6];//VPM_adjusted_critical_radius_he[16]; => Reuse HUD_Update
 		float UNUSED2[16];//VPM_adjusted_critical_radius_n2[16];
 		float UNUSED3[16];//VPM_adjusted_crushing_pressure_he[16];
 		float UNUSED4[16];//VPM_adjusted_crushing_pressure_n2[16];
--- a/Discovery/Inc/tMenuCvOptionText.h	Mon Mar 02 17:22:25 2026 +0100
+++ b/Discovery/Inc/tMenuCvOptionText.h	Mon Mar 02 17:30:38 2026 +0100
@@ -37,6 +37,7 @@
 enum CVOPTIONS						/* the order defines the priority as well */
 {
 		CVOPT_Compass = 0,
+		CVOPT_HUD,
 		CVOPT_O2_Sensor,
 		CVOPT_CO2_Sensor,
 		CVOPT_Pressure_Sensor,
--- a/Discovery/Inc/tMenuEditHardware.h	Mon Mar 02 17:22:25 2026 +0100
+++ b/Discovery/Inc/tMenuEditHardware.h	Mon Mar 02 17:30:38 2026 +0100
@@ -38,6 +38,7 @@
 void openEdit_Hardware(uint8_t line);
 void openEdit_SensorsO2();
 void openEdit_SensorsCO2();
+void openEdit_SensorsHUD();
 
 void refresh_O2Sensors(void);
 void refresh_CompassEdit(void);
--- a/Discovery/Src/data_exchange_main.c	Mon Mar 02 17:22:25 2026 +0100
+++ b/Discovery/Src/data_exchange_main.c	Mon Mar 02 17:30:38 2026 +0100
@@ -470,7 +470,10 @@
 	{
 		dataOut.displayVersion = 1;
 	}
-
+#ifdef ENABLE_HUD_SUPPORT
+	memcpy (dataOut.data.externalInterface_HUD_Update, pStateReal->lifeData.HUD_led_sequence, EXT_INTERFACE_HUD_LED_MAX);
+	dataOut.data.externalInterface_HUD_Brightness =  pStateReal->lifeData.HUD_led_brightness;
+#endif
 	if(DataEX_check_header_and_footer_ok() && !told_reset_logik_alles_ok)
 	{
 		MX_tell_reset_logik_alles_ok();
@@ -1032,9 +1035,8 @@
 	if(pStateReal->data_old__lost_connection_to_slave == 0)
 	{
 		pStateReal->lifeData.extIf_sensor_Id = dataIn.data[(dataIn.boolADCO2Data && DATA_BUFFER_ADC)].externalInterface_SensorID;
-		if(pStateReal->lifeData.extIf_sensor_Id < 3)
+		if(pStateReal->lifeData.extIf_sensor_Id < EXT_INTERFACE_SENSOR_CNT)
 		{
-
 			memcpy(pStateReal->lifeData.extIf_sensor_data[pStateReal->lifeData.extIf_sensor_Id], dataIn.data[(dataIn.boolADCO2Data && DATA_BUFFER_ADC)].sensor_data, 32);
 		}
 		memcpy(pStateReal->lifeData.extIf_sensor_map, dataIn.data[(dataIn.boolADCO2Data && DATA_BUFFER_ADC)].sensor_map, EXT_INTERFACE_SENSOR_CNT);
--- a/Discovery/Src/tInfoSensor.c	Mon Mar 02 17:22:25 2026 +0100
+++ b/Discovery/Src/tInfoSensor.c	Mon Mar 02 17:30:38 2026 +0100
@@ -202,6 +202,20 @@
 
 	tInfo_write_buttonTextline_simple(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_O2Calib);
 }
+
+static void refreshInfo_SensorHUD(GFX_DrawCfgScreen s)
+{
+	const SDiveState *pStateReal = stateRealGetPointer();
+    char text[50];
+
+    snprintf(text,50,"%s",pStateReal->lifeData.extIf_sensor_data[activeSensorId]);
+    tInfo_write_content_simple(  30, 770, ME_Y_LINE1, &FontT48, text, CLUT_Font020);
+
+	tInfo_write_buttonTextline_simple(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,0);
+}
+
+
+
 //  ===============================================================================
 void refreshInfo_Sensor(GFX_DrawCfgScreen s)
 {
@@ -222,7 +236,9 @@
 		case SENSOR_DIGO2M:	refreshInfo_SensorO2(s);
 			break;
 		case SENSOR_CO2:
-		case SENSOR_CO2M: refreshInfo_SensorCo2(s);
+		case SENSOR_CO2M: 	refreshInfo_SensorCo2(s);
+			break;
+		case SENSOR_HUD:	refreshInfo_SensorHUD(s);
 			break;
 	}
 }
--- a/Discovery/Src/tMenuCvOptionText.c	Mon Mar 02 17:22:25 2026 +0100
+++ b/Discovery/Src/tMenuCvOptionText.c	Mon Mar 02 17:30:38 2026 +0100
@@ -147,6 +147,13 @@
 	return strlen(pText);
 }
 
+uint8_t tMCvOptText_refreshHUD(char* pText)
+{
+	uint8_t textPointer = 0;
+	textPointer += snprintf(&pText[textPointer],20,"HUD");
+	pText[textPointer] = 0;
+	return strlen(pText);
+}
 
 uint8_t tMCvOptText_BuildDynamicContentList()
 {
@@ -174,6 +181,10 @@
 			case SENSOR_GNSS:	SensorActive[SENSOR_GNSS] = 1;
 				break;
 #endif
+#ifdef ENABLE_HUD_SUPPORT
+			case SENSOR_HUD:	SensorActive[SENSOR_HUD] = 1;
+				break;
+#endif
 			default:
 				break;
 		}
@@ -207,7 +218,13 @@
 										refreshFctPointerTable[activeLines] = tMCvOptText_refreshCO2;
 										CvOptAvailable = 1;
 									}
-						break;
+				break;
+			case CVOPT_HUD:			if(SensorActive[SENSOR_HUD])
+									{
+										refreshFctPointerTable[activeLines] = tMCvOptText_refreshHUD;
+										CvOptAvailable = 1;
+									}
+				break;
 			default:
 				break;
 		}
--- a/Discovery/Src/tMenuEditCvOption.c	Mon Mar 02 17:22:25 2026 +0100
+++ b/Discovery/Src/tMenuEditCvOption.c	Mon Mar 02 17:30:38 2026 +0100
@@ -72,7 +72,9 @@
 			case CVOPT_O2_Sensor: openFctPointerTable[index] = openEdit_SensorsO2;
 				break;
 			case CVOPT_CO2_Sensor: openFctPointerTable[index] = openEdit_SensorsCO2;
-							break;
+				break;
+			case CVOPT_HUD: openFctPointerTable[index] = openEdit_SensorsHUD;
+				break;
 			default:
 				break;
 		}
--- a/Discovery/Src/tMenuEditHardware.c	Mon Mar 02 17:22:25 2026 +0100
+++ b/Discovery/Src/tMenuEditHardware.c	Mon Mar 02 17:30:38 2026 +0100
@@ -66,7 +66,8 @@
 uint8_t OnAction_Button			(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 uint8_t OnAction_ButtonBalance	(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 uint8_t OnAction_ButtonLock		(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
-
+uint8_t OnAction_LedSequence	(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
+uint8_t OnAction_LedBrightness	(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 /* Exported functions --------------------------------------------------------*/
 
 
@@ -143,11 +144,13 @@
 
 void refresh_O2Sensors(void)
 {
-    char strSensorId[20];
-    char strSensorValue[20];
+	static uint8_t HUD_cmdUpdateCnt = 20;
+
+	char strSensorId[20];
+    char strSensorValue[30];
     uint16_t y_line;
     uint8_t index = 0;
-
+    uint8_t uartSensorCnt = 0;
 
     const SDiveState *pStateReal = stateRealGetPointer();
     SSettings *pSettings = settingsGetPointer();
@@ -213,6 +216,7 @@
 	strSensorId[2] = 0;
 	write_topline(strSensorId);
 
+	memset(strSensorId,0,20);
 	strSensorId[0] = TXT_2BYTE;
 	strSensorId[1] = TXT2BYTE_Sensor;
 	strSensorId[2] = ' ';
@@ -253,6 +257,10 @@
 				case SENSOR_GNSSM:		strSensorId[3] = 'G';
 	 	 	 	   	   	   	   	   	    strSensorId[4] = 'N';
 					break;
+				case SENSOR_HUD:  	strSensorId[3] = 'H';
+									strSensorId[4] = 'U';
+									strSensorId[5] = 'D';
+								break;
 				default:
 									  strSensorId[5] = 0;
 					break;
@@ -270,6 +278,17 @@
 		{
 			snprintf(strSensorValue, 20,"%ld ppm",  pStateReal->lifeData.CO2_data.CO2_ppm);
 		}
+		else if(localSensorMap[index] == SENSOR_HUD)
+		{
+			write_label_var(  30, 340, ME_Y_LINE2, &FontT48, "LED Sequence:");
+			tMenuEdit_newInput(StMHARD3_O2_Sensor2,	pStateReal->lifeData.HUD_led_sequence[0] - pStateReal->lifeData.HUD_led_sequence[1],
+													pStateReal->lifeData.HUD_led_sequence[2] - pStateReal->lifeData.HUD_led_sequence[3],
+													pStateReal->lifeData.HUD_led_sequence[4] - pStateReal->lifeData.HUD_led_sequence[5],
+													pStateReal->lifeData.HUD_led_sequence[6]);
+			snprintf(strSensorValue, 30,"LED Brightness:  %d",pStateReal->lifeData.HUD_led_brightness);
+			write_label_var(  30, 340, ME_Y_LINE3, &FontT48, strSensorValue);
+			snprintf(strSensorValue, 20,"o o o \023o");
+		}
 		y_line = ME_Y_LINE1 + (index * ME_Y_LINE_STEP);
 		if(strSensorValue[0] != 0)
 		{
@@ -311,6 +330,21 @@
 		}
 
 	}
+	if(sensorFilter == SENSOR_NONE)
+	{
+		for(index = EXT_INTERFACE_MUX_OFFSET; index < EXT_INTERFACE_SENSOR_CNT; index++)
+		{
+			if(pSettings->ext_sensor_map[index] != SENSOR_NONE)
+			{
+				uartSensorCnt++;
+			}
+		}
+		if(uartSensorCnt != 0)
+		{
+			snprintf(strSensorId, 20,"%c: %d", TXT_o2Sensors, uartSensorCnt);
+			write_label_var(  30, 340, ME_Y_LINE5, &FontT48, strSensorId);
+		}
+	}
    	if((DataEX_external_ADC_Present()) && (sensorFilter == SENSOR_NONE))
    	{
 		strSensorId[0] = TXT_2BYTE;
@@ -341,6 +375,24 @@
     {
     	write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext);
     }
+
+    if(localSensorMap[0] == SENSOR_HUD)
+    {
+		HUD_cmdUpdateCnt--;
+		if(HUD_cmdUpdateCnt == 0)
+		{
+			HUD_cmdUpdateCnt = 20;
+			for(index = EXT_INTERFACE_MUX_OFFSET; index < EXT_INTERFACE_SENSOR_CNT; index++)
+			{
+				if(pSettings->ext_sensor_map[index] == SENSOR_HUD)
+				{
+					DataEX_setExtInterface_Cmd(EXT_INTERFACE_HUD_UPDATE, index);
+					break;
+				}
+			}
+
+		}
+    }
 }
 
 
@@ -348,6 +400,7 @@
 {
 	static externalInterfaceSensorType lastFilter;
 	SSettings *pSettings = settingsGetPointer();
+	const SDiveState* pRealState = stateRealGetPointer();
     uint8_t sensorActive[3];
     uint8_t index = 0;
     char text[3];
@@ -387,7 +440,7 @@
 				sensorActive[index] = 1;
 			}
 		}
-		if(sensorFilter != SENSOR_CO2)
+		if((sensorFilter == SENSOR_NONE) || (sensorFilter == SENSOR_DIGO2))
 		{
 			if(((pSettings->ext_sensor_map[0] < SENSOR_OPTIC) || (pSettings->ext_sensor_map[0] >= SENSOR_TYPE_O2_END)))
 			{
@@ -438,9 +491,15 @@
 				}
 			}
 		}
-		else
+		else	/* single, none O2 sensors */
 		{
-			write_field_on_off(StMHARD3_O2_Sensor1,	 30, 95, ME_Y_LINE1,  &FontT48, "", pSettings->co2_sensor_active);	/* only one CO2 supporterd => show at first line */
+			switch(sensorFilter)
+			{
+				case SENSOR_CO2:	write_field_on_off(StMHARD3_O2_Sensor1,	 30, 95, ME_Y_LINE1,  &FontT48, "", pSettings->co2_sensor_active);	/* only one CO2 supporterd => show at first line */
+					break;
+				default:			write_field_button(StMHARD3_O2_Sensor1,	 30, 95, ME_Y_LINE1,  &FontT48, "");
+					break;
+			}
 			firstSensorId = StMHARD3_O2_Sensor1;
 		}
 		stateRealGetPointerWrite()->diveSettings.ppo2sensors_deactivated = pSettings->ppo2sensors_deactivated;
@@ -519,6 +578,21 @@
 			case SENSOR_CO2:	setEvent(StMHARD3_O2_Sensor1, (uint32_t)OnAction_Sensor1);
 								localSensorMap[0] = SENSOR_CO2M;
 				break;
+			case SENSOR_HUD:    write_label_var(  30, 340, ME_Y_LINE2, &FontT48, "LED Sequence:");
+								write_field_sdigit(StMHARD3_O2_Sensor2, 400, 800, ME_Y_LINE2, &FontT48, "###  ###  ###  ###",
+								pRealState->lifeData.HUD_led_sequence[0] - pRealState->lifeData.HUD_led_sequence[1],
+								pRealState->lifeData.HUD_led_sequence[2] - pRealState->lifeData.HUD_led_sequence[3],
+								pRealState->lifeData.HUD_led_sequence[4] - pRealState->lifeData.HUD_led_sequence[5],
+								pRealState->lifeData.HUD_led_sequence[6]);
+
+								write_field_button(StMHARD3_O2_Sensor3,	400, 800, ME_Y_LINE3, &FontT48, "");
+
+								setEvent(StMHARD3_O2_Sensor1, (uint32_t)OnAction_Sensor1);
+								setEvent(StMHARD3_O2_Sensor2, (uint32_t)OnAction_LedSequence);
+								setEvent(StMHARD3_O2_Sensor3, (uint32_t)OnAction_LedBrightness);
+
+								localSensorMap[0] = SENSOR_HUD;
+				break;
 		}
 
 		if (sensorFilter == SENSOR_CO2)
@@ -563,11 +637,14 @@
 {
 	openEdit_Sensors(SENSOR_CO2);
 }
-
+void openEdit_SensorsHUD()
+{
+	openEdit_Sensors(SENSOR_HUD);
+}
 
 uint8_t OnAction_Sensor1(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
 {
-	if((localSensorMap[0] == SENSOR_DIGO2M) || (localSensorMap[0] == SENSOR_CO2M) || (localSensorMap[0] == SENSOR_CO2M))
+	if((localSensorMap[0] == SENSOR_DIGO2M) || (localSensorMap[0] == SENSOR_CO2M) || (localSensorMap[0] == SENSOR_CO2M) || (localSensorMap[0] == SENSOR_HUD))
 	{
 		openInfo_SetSensorType(localSensorMap[0]);
 		return EXIT_TO_INFO_SENSOR;
@@ -966,3 +1043,103 @@
 
     return UNSPECIFIC_RETURN;
 }
+
+
+uint8_t OnAction_LedBrightness(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
+{
+	 SDiveState * pStateReal = stateRealGetPointerWrite();
+
+    if(pStateReal->lifeData.HUD_led_brightness == 0)
+    {
+    	pStateReal->lifeData.HUD_led_brightness = 0xFF;
+    }
+    else
+    {
+    	pStateReal->lifeData.HUD_led_brightness = 0;
+    }
+
+    return UNSPECIFIC_RETURN;
+}
+
+uint8_t OnAction_LedSequence(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
+{
+    SDiveState * pStateReal = stateRealGetPointerWrite();
+    int32_t ledSeq[4];
+    uint8_t digitContentNew;
+    uint8_t index = 0;
+
+
+    switch (action) {
+    case ACTION_BUTTON_ENTER:
+
+        return digitContent;
+    case ACTION_BUTTON_ENTER_FINAL:
+        {
+            evaluateNewString(editId, (uint32_t*) &ledSeq[0], (uint32_t*)&ledSeq[1], (uint32_t*)&ledSeq[2], (uint32_t*)&ledSeq[3]);
+
+            for(index = 0; index < 3; index++)
+            {
+				if (ledSeq[index] > 16)
+				{
+					ledSeq[index] = 16;
+				} else if (ledSeq[index] < -16)
+				{
+					ledSeq[index] = -16;
+				}
+				pStateReal->lifeData.HUD_led_sequence[(index*2)] = 0;		/* every value handles 2 LEDs depending on +/- sign */
+				pStateReal->lifeData.HUD_led_sequence[(index*2)+1] = 0;
+				if(ledSeq[index] > 0)
+				{
+					pStateReal->lifeData.HUD_led_sequence[(index*2)] = ledSeq[index];
+				}
+				else
+				{
+					pStateReal->lifeData.HUD_led_sequence[(index*2 + 1)] = ledSeq[index] * -1;
+				}
+            }
+            pStateReal->lifeData.HUD_led_sequence[6] = ledSeq[3];
+            tMenuEdit_newInput(editId, ledSeq[0], ledSeq[1], ledSeq[2], ledSeq[3]);
+        }
+
+        break;
+    case ACTION_BUTTON_NEXT:
+        if ((blockNumber < 3) && (digitNumber == 0))
+        {
+            digitContentNew = togglePlusMinus(digitContent);
+        } else if (digitNumber == 1)
+        {
+            digitContentNew = digitContent + 1;
+            if (digitContentNew > '1') {
+                digitContentNew = '0';
+            }
+        } else
+        {
+            digitContentNew = digitContent + 1;
+            if (digitContentNew > '9') {
+                digitContentNew = '0';
+            }
+        }
+
+        return digitContentNew;
+    case ACTION_BUTTON_BACK:
+    	if ((blockNumber < 3) && (digitNumber == 0))
+    	{
+            digitContentNew = togglePlusMinus(digitContent);
+        } else if (digitNumber == 1)
+        {
+            digitContentNew = digitContent - 1;
+            if (digitContentNew < '0') {
+                digitContentNew = '1';
+            }
+        }else
+        {
+            digitContentNew = digitContent - 1;
+            if (digitContentNew < '0') {
+                digitContentNew = '9';
+            }
+        }
+        return digitContentNew;
+    }
+    return UNSPECIFIC_RETURN;
+}
+