changeset 1026:5fedf7ba2392 GasConsumption

Added text based edit item: In previous version only numbers could be entered as data field. This changes introduces a edit field for entering text in upper characters. '_' are used for seperation because simple white spaces (' ') would cause problems in the handling of the edit field. String length is limited to eigth charecters.
author Ideenmodellierer
date Sun, 07 Sep 2025 18:55:45 +0200
parents 6e11f7327efd
children 158100a84ebd
files Discovery/Inc/tMenuEdit.h Discovery/Src/tMenuEdit.c
diffstat 2 files changed, 163 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/Discovery/Inc/tMenuEdit.h	Sat Aug 30 12:52:52 2025 +0200
+++ b/Discovery/Inc/tMenuEdit.h	Sun Sep 07 18:55:45 2025 +0200
@@ -68,7 +68,10 @@
 void tMenuEdit_select(uint32_t editID);
 
 void evaluateNewString	(uint32_t editID, uint32_t *pNewValue1, uint32_t *pNewValue2, uint32_t *pNewValue3, uint32_t *pNewValue4);
+void evaluateNewStringText(uint32_t editID, uint8_t *pNewString);
+
 void tMenuEdit_newInput	(uint32_t editID, uint32_t int1, uint32_t int2, uint32_t int3, uint32_t int4);
+void tMenuEdit_newInputText(uint32_t editID, uint8_t* ptext);
 void tMenuEdit_newButtonText(uint32_t editID, char *text);
 void tMenuEdit_set_on_off(uint32_t editID, uint32_t int1);
 
@@ -91,6 +94,7 @@
 void write_field_toggle(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint8_t int1,  uint8_t int2);
 void write_field_on_off(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint8_t int1);
 void write_field_fpoint(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, float input);
+void write_field_text(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint8_t* pInput);
 
 void stop_cursor_fields(void);
 
--- a/Discovery/Src/tMenuEdit.c	Sat Aug 30 12:52:52 2025 +0200
+++ b/Discovery/Src/tMenuEdit.c	Sun Sep 07 18:55:45 2025 +0200
@@ -46,6 +46,9 @@
 /* Private types -------------------------------------------------------------*/
 #define TEXTSIZE 16
 
+#define IDENT_MAY_INPUT_NUM		4	/* legacy value of ident.input struct */
+#define IDENT_MAX_INPUT_TEXT	9	/* 8 data items + 0 for string operations */
+
 typedef struct
 {
     uint32_t pEventFunction;
@@ -63,9 +66,9 @@
 {
     char orgText[32];
     char newText[32];
-    uint32_t input[4];
+    uint32_t input[IDENT_MAX_INPUT_TEXT];
     uint16_t coord[3];
-    int8_t begin[4], size[4];
+    int8_t begin[IDENT_MAX_INPUT_TEXT], size[IDENT_MAX_INPUT_TEXT];
     tFont *fontUsed;
     uint32_t callerID;
     uint8_t maintype;
@@ -85,6 +88,7 @@
     FIELD_3DIGIT,
     FIELD_SDIGIT,
     FIELD_FLOAT,
+	FIELD_TEXT,
     FIELD_END
 } SField;
 
@@ -284,7 +288,7 @@
     {
     	reset_SettingWarning();
         GFX_logoAutoOff();
-        ext_flash_write_settings(0);
+        ext_flash_write_settings(EF_SETTINGS,0);
         WriteSettings = 0;
     }
 }
@@ -442,7 +446,7 @@
         return 1;
     }
 
-    if(((block + 1) < 4) && (ident[actualId].size[block+1] > 0))
+    if((((block + 1) < 4) || ((ident[actualId].maintype == FIELD_TEXT) && ((block + 1) < IDENT_MAX_INPUT_TEXT)))  && (ident[actualId].size[block+1] > 0))
     {
         block++;
         subBlockPosition = 0;
@@ -476,7 +480,7 @@
         content += ident[actualId].newText[ident[actualId].begin[block] + 1];
     }
     else
-    if(ident[actualId].maintype == FIELD_NUMBERS)
+    if((ident[actualId].maintype == FIELD_NUMBERS) || (ident[actualId].maintype == FIELD_TEXT))
         content = ident[actualId].newText[ident[actualId].begin[block] + subBlockPosition];
     else
     if((ident[actualId].maintype == FIELD_ON_OFF) || (ident[actualId].maintype == FIELD_TOGGLE))
@@ -495,7 +499,7 @@
     if(event[actualevid].callerID != ident[actualId].callerID)
         return;
 
-    if(ident[actualId].maintype == FIELD_NUMBERS)
+    if((ident[actualId].maintype == FIELD_NUMBERS) || (ident[actualId].maintype == FIELD_TEXT))
     {
         oneCharText[0] = ident[actualId].newText[ident[actualId].begin[oldblock] + oldsubblockpos];
         oneCharText[1] = 0;
@@ -552,7 +556,7 @@
     if(event[actualevid].callerID != ident[actualId].callerID)
         return;
 
-    if(ident[actualId].maintype == FIELD_NUMBERS)
+    if((ident[actualId].maintype == FIELD_NUMBERS) || (ident[actualId].maintype == FIELD_TEXT))
     {
         oneCharText[0] = ident[actualId].newText[ident[actualId].begin[block] + subBlockPosition];
         oneCharText[1] = 0;
@@ -582,7 +586,7 @@
     block = 0;
     subBlockPosition = 0;
 
-    if(ident[actualId].maintype == FIELD_NUMBERS)
+    if((ident[actualId].maintype == FIELD_NUMBERS) || (ident[actualId].maintype == FIELD_TEXT))
     {
         change_CLUT_entry(CLUT_MenuEditLineSelected, CLUT_MenuEditCursor);
         // old stuff? hw 150916, reactivated 150923, this shows which digit will be changed now as it marks the other grey/black
@@ -690,7 +694,13 @@
         break;
     case FIELD_SELECT:
         write_buttonTextline(TXT2BYTE_ButtonMinus, TXT2BYTE_ButtonEnter, TXT2BYTE_ButtonPlus);
+        break;
+    case FIELD_TEXT:
+    	write_buttonTextline(TXT2BYTE_ButtonMinus, TXT2BYTE_ButtonEnter, TXT2BYTE_ButtonPlus);
+        if((newContent >= 'A') && (newContent <= '_'))
+            ident[actualId].newText[ident[actualId].begin[block] + subBlockPosition] = newContent;
 
+        mark_new_digit_of_actual_id_block_and_subBlock();
         break;
     }
 }
@@ -815,6 +825,9 @@
     else
     if((ident[actualId].maintype == FIELD_NUMBERS) && (action == ACTION_BUTTON_ENTER) && (newContent >= '0') && (newContent <= '9'))
         ident[actualId].newText[ident[actualId].begin[block] + subBlockPosition] = newContent;
+    else
+        if((ident[actualId].maintype == FIELD_TEXT) && (action == ACTION_BUTTON_ENTER) && (newContent >= '0') && (newContent <= '9'))
+            ident[actualId].newText[ident[actualId].begin[block] + subBlockPosition] = newContent;
 
     if(action == ACTION_BUTTON_ENTER)
     {
@@ -911,6 +924,10 @@
         ident[actualId].newText[ident[actualId].begin[block] + subBlockPosition] = newContent;
     }
 
+    if ((ident[actualId].maintype == FIELD_TEXT) && (newContent >= 'A' && newContent <= '_'))
+    {
+        ident[actualId].newText[ident[actualId].begin[block] + subBlockPosition] = newContent;
+    }
     mark_new_digit_of_actual_id_block_and_subBlock();
 }
 
@@ -950,6 +967,9 @@
     } else if (ident[actualId].maintype == FIELD_NUMBERS && newContent >= '0' && newContent <= '9') {
         ident[actualId].newText[ident[actualId].begin[block] + subBlockPosition] = newContent;
     }
+    if ((ident[actualId].maintype == FIELD_TEXT) && (newContent >= 'A' && newContent <= '_')) {
+        ident[actualId].newText[ident[actualId].begin[block] + subBlockPosition] = newContent;
+    }
 
     mark_new_digit_of_actual_id_block_and_subBlock();
 }
@@ -1018,7 +1038,27 @@
     *pNewValue3 = sum[2];
     *pNewValue4 = sum[3];
 }
+void evaluateNewStringText(uint32_t editID, uint8_t *pNewString)
+{
+    if(editID != ident[actualId].callerID)
+        return;
 
+    uint8_t i, digitCount;
+	uint8_t digit = '_';
+
+    memset(pNewString, 0 , IDENT_MAX_INPUT_TEXT);
+
+    i = 0;
+    while( ident[actualId].size[i] && (i < IDENT_MAX_INPUT_TEXT - 1))
+    {
+        for(digitCount = 0; digitCount < ident[actualId].size[i]; digitCount++)
+        {
+            digit = ident[actualId].newText[ident[actualId].begin[i] + digitCount];
+        }
+        pNewString[i] = digit;
+        i++;
+    }
+}
 
 uint8_t get_id_of(uint32_t editID)
 {
@@ -1156,7 +1196,38 @@
 
     id = backup_id;
 }
+void tMenuEdit_newInputText(uint32_t editID, uint8_t* ptext)
+{
+    uint8_t backup_id, temp_id;
+    uint8_t index = 0;
 
+    temp_id = get_id_of(editID);
+    if(temp_id == 255)
+        return;
+
+    backup_id = id;
+    id = temp_id;
+
+    if(editID != ident[id].callerID)
+    {
+        temp_id = 0;
+        while((temp_id < IDENT_MAX_INPUT_TEXT) && (editID != ident[temp_id].callerID))
+            temp_id++;
+        if(editID != ident[temp_id].callerID)
+            return;
+        id = temp_id;
+    }
+    for(index = 0; index < IDENT_MAX_INPUT_TEXT; index++)
+    {
+    	ident[id].input[index] = *ptext++;
+    }
+    create_newText_for_Id(id);
+    if(id <= idLast)
+        change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditFieldRegular);
+    write_content_of_Id(id);
+
+    id = backup_id;
+}
 
 void resetEnterPressedToStateBeforeButtonAction(void)
 {
@@ -1257,6 +1328,20 @@
     }
 }
 
+void create_newText_for_Id_and_field_text(int8_t localId)
+{
+    uint8_t i;
+
+    i = 0;
+    while( ident[localId].size[i] && (i < 9))
+    {
+        if(ident[localId].input[i])
+            ident[localId].newText[ident[localId].begin[i]] = ident[localId].input[i];
+        i++;
+    }
+}
+
+
 void create_newText_for_actual_Id_and_field_select(void)
 {
 	create_newText_for_Id_and_field_select(actualId);
@@ -1276,6 +1361,12 @@
         return;
     }
 
+    if(	ident[localId].maintype == FIELD_TEXT)
+    {
+        create_newText_for_Id_and_field_text(localId);
+        return;
+    }
+
 	while( ident[localId].size[i] && (i < 4))
 	{
 		bool isNegative = false;
@@ -1443,6 +1534,66 @@
     write_field_udigit_and_2digit(FIELD_SDIGIT, editID, XleftGimpStyle, XrightGimpStyle, YtopGimpStyle, Font, text, ((input_u)int1).uint32, ((input_u)int2).uint32, ((input_u)int3).uint32, ((input_u)int4).uint32);
 }
 
+void write_field_text(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint8_t* pInput)
+{
+    if(id >= 9)
+        return;
+
+    int8_t beginTmp;
+
+    ident[id].maintype = FIELD_TEXT;
+    ident[id].subtype  = FIELD_TEXT;
+
+    ident[id].coord[0] = XleftGimpStyle;
+    ident[id].coord[1] = XrightGimpStyle;
+    ident[id].coord[2] = YtopGimpStyle;
+    ident[id].fontUsed = (tFont *)Font;
+    ident[id].callerID = editID;
+
+    strncpy(ident[id].orgText, text, 32);
+    strncpy(ident[id].newText, text, 32);
+    ident[id].orgText[31] = 0;
+    ident[id].newText[31] = 0;
+
+    for(int i=0;i < IDENT_MAX_INPUT_TEXT -1;i++)
+    {
+    	ident[id].input[i] = pInput[i];
+        ident[id].size[i] = 0;
+    }
+    pInput[8] = 0;
+
+    beginTmp = 0;
+    for(int i=0;i < IDENT_MAX_INPUT_TEXT;i++)
+    {
+        while((ident[id].orgText[beginTmp] != '#')&& ident[id].orgText[beginTmp])
+            beginTmp++;
+
+        if(ident[id].orgText[beginTmp] == '#')
+        {
+
+            ident[id].begin[i] = beginTmp;
+            ident[id].size[i] = 1;
+            beginTmp = ident[id].begin[i] + ident[id].size[i];
+        }
+        else
+            break;
+    }
+
+    change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditFieldRegular);
+
+    create_newText_for_Id(id);
+
+    if(editID == 0)
+    	write_content_without_Id();
+    else
+    {
+        write_content_of_Id(id);
+        if(!tME_stop)
+            idLast = id;
+        id++;
+    }
+}
+
 
 void write_field_select(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint8_t int1,  uint8_t int2,  uint8_t int3,  uint8_t int4)
 {