main/buttons.c

changeset 0
b74b0e4902c3
child 1
ad2c8b13eb88
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/buttons.c	Sat Oct 20 13:23:15 2018 +0200
@@ -0,0 +1,999 @@
+/**
+ * @file buttons.c
+ * @brief The touch buttons.
+ */
+
+#include "config.h"
+
+
+sButton				Buttons[MAXBUTTONS];	// 40 buttons on a screen.
+int				level = 1;		// Keyboard level.
+
+extern uint8_t			VNC_pointer_button;
+extern uint16_t			VNC_pointer_x;
+extern uint16_t			VNC_pointer_y;
+
+//static const char		*TAG = "buttons";
+
+#define	EDIT_TYPE_TEXT		0
+#define	EDIT_TYPE_INT		1
+#define	EDIT_TYPE_FLOAT		2
+
+
+/***************************************************************************/
+
+
+void WaitTouchReleased(void)
+{
+    int		tx, ty;
+
+    // Do raw reads.
+    while (TFT_read_touch(&tx, &ty, 1) == 1) {
+	vTaskDelay(50 / portTICK_PERIOD_MS);
+    }
+}
+
+
+
+void Buttons_Clear(void)
+{
+    int		i;
+
+    for (i = 0; i < MAXBUTTONS; i++) {
+	if ((Buttons[i].x != -1) && strlen(Buttons[i].text)) {
+	    TFT_fillRect(Buttons[i].x, Buttons[i].y, Buttons[i].w, Buttons[i].h, TFT_BLACK);
+	}
+	Buttons[i].x = -1;
+    }
+}
+
+
+
+void Buttons_Add(int x, int y, int w, int h, char *txt, int order)
+{
+    Buttons[order].x = x;
+    Buttons[order].y = y;
+    Buttons[order].w = w;
+    Buttons[order].h = h;
+    strncpy(Buttons[order].text, txt, 11);
+    Buttons[order].dark = Buttons[order].small = false;
+}
+
+
+
+void Buttons_Show(void)
+{
+    int		i;
+    const color_t KEY_NORM        = { 191, 191, 191};
+    const color_t KEY_DARK        = {  95,  95,  95};
+    const color_t KEY_LOCK        = { 127, 127, 255};
+
+    _fg = TFT_BLACK;
+
+    for (i = 0; i < MAXBUTTONS; i++) {
+	if (Buttons[i].x != -1) {
+
+	    if (Buttons[i].lock) {
+		_fg = TFT_BLACK;
+		TFT_fillRoundRect(Buttons[i].x, Buttons[i].y, Buttons[i].w, Buttons[i].h, 5, KEY_LOCK);
+	    } else if (Buttons[i].dark) {
+		_fg = TFT_WHITE;
+		TFT_fillRoundRect(Buttons[i].x, Buttons[i].y, Buttons[i].w, Buttons[i].h, 5, KEY_DARK);
+	    } else {
+		_fg = TFT_BLACK;
+	    	TFT_fillRoundRect(Buttons[i].x, Buttons[i].y, Buttons[i].w, Buttons[i].h, 5, KEY_NORM);
+	    }
+	    TFT_drawRoundRect(Buttons[i].x, Buttons[i].y, Buttons[i].w, Buttons[i].h, 5, TFT_LIGHTGREY);
+	    if (Buttons[i].small)
+		TFT_setFont(DEFAULT_FONT, NULL);	// DEF_SMALL_FONT
+	    else
+		TFT_setFont(DEJAVU18_FONT, NULL);
+	    font_transparent = 1;
+	    TFT_print(Buttons[i].text, 
+		      Buttons[i].x + ((Buttons[i].w - TFT_getStringWidth(Buttons[i].text)) / 2), 
+		      Buttons[i].y + 1 + ((Buttons[i].h - TFT_getfontheight()) / 2));
+	}
+    }
+
+    font_transparent = 0;
+}
+
+
+
+int Buttons_Search(int x, int y)
+{
+    int		i;
+
+    for (i = 0; i < MAXBUTTONS; i++) {
+	if (Buttons[i].x != -1) {
+	    if ((x >= Buttons[i].x) && (x <= (Buttons[i].x + Buttons[i].w)) &&
+		(y >= Buttons[i].y) && (y <= (Buttons[i].y + Buttons[i].h))) {
+		return i;
+	    }
+	}
+    }
+
+    return -1;
+}
+
+
+
+int Buttons_Scan(void)
+{
+    int		tx, ty, rc;
+    static int	ox = -1, oy = -1, vx = -1, vy = -1;
+    static bool t_pressed = false, v_pressed = false;
+
+    if (TFT_read_touch(&tx, &ty, 0)) {
+	t_pressed = true;
+	ox = tx;
+	oy = ty;
+	return -1;
+    } else if (t_pressed) {
+	rc = Buttons_Search(ox, oy);
+	t_pressed = false;
+	ox = oy = -1;
+	return rc;
+    }
+
+    if (VNC_pointer_button & 0x07) {
+	v_pressed = true;
+	vx = VNC_pointer_x;
+	vy = VNC_pointer_y;
+	return -1;
+    } else if (v_pressed) {
+	rc = Buttons_Search(vx, vy);
+	v_pressed = false;
+	vx = vy = -1;
+	return rc;
+    }
+
+    return -1;
+}
+
+
+
+static const uint8_t alphalow_tab[] = { 'q','w','e','r','t','y','u','i','o','p',
+					'a','s','d','f','g','h','j','k','l',
+					'z','x','c','v','b','n','m' };
+
+/* Level 1 keys */
+void B_AlphaLow(void)
+{
+    Buttons_Clear();
+
+    Buttons_Add(  2, 80,28,36,"q", 0);
+    Buttons_Add( 34, 80,28,36,"w", 1);
+    Buttons_Add( 66, 80,28,36,"e", 2);
+    Buttons_Add( 98, 80,28,36,"r", 3);
+    Buttons_Add(130, 80,28,36,"t", 4);
+    Buttons_Add(162, 80,28,36,"y", 5);
+    Buttons_Add(194, 80,28,36,"u", 6);
+    Buttons_Add(226, 80,28,36,"i", 7);
+    Buttons_Add(258, 80,28,36,"o", 8);
+    Buttons_Add(290, 80,28,36,"p", 9);
+
+    Buttons_Add( 18,120,28,36,"a",10);
+    Buttons_Add( 50,120,28,36,"s",11);
+    Buttons_Add( 82,120,28,36,"d",12);
+    Buttons_Add(114,120,28,36,"f",13);
+    Buttons_Add(146,120,28,36,"g",14);
+    Buttons_Add(178,120,28,36,"h",15);
+    Buttons_Add(210,120,28,36,"j",16);
+    Buttons_Add(242,120,28,36,"k",17);
+    Buttons_Add(274,120,28,36,"l",18);
+
+    Buttons_Add( 50,160,28,36,"z",19);
+    Buttons_Add( 82,160,28,36,"x",20);
+    Buttons_Add(114,160,28,36,"c",21);
+    Buttons_Add(146,160,28,36,"v",22);
+    Buttons_Add(178,160,28,36,"b",23);
+    Buttons_Add(210,160,28,36,"n",24);
+    Buttons_Add(242,160,28,36,"m",25);
+
+    Buttons_Add(  2,160,42,36,"caps",26);
+    Buttons[26].dark = true;
+    Buttons[26].small = true;
+    Buttons[26].lock = false;
+    Buttons_Add(276,160,42,36,"del",27);
+    Buttons[27].dark = true;
+    Buttons[27].small = true;
+
+    Buttons_Add(  2,200,60,36,"123",28);
+    Buttons[28].dark = true;
+    Buttons_Add( 72,200,28,36,"/",29);
+    Buttons_Add(108,200,104,36," ",30);
+    Buttons_Add(220,200,28,36,".",31);
+    Buttons_Add(258,200,60,36,"Ok",32);
+    Buttons[32].dark = true;
+
+    Buttons_Show();
+}
+
+
+
+static const uint8_t alphacaps_tab[] = { 'Q','W','E','R','T','Y','U','I','O','P',
+					 'A','S','D','F','G','H','J','K','L',
+					 'Z','X','C','V','B','N','M' };
+
+/* Level 2 and 3 keys */
+void B_AlphaCaps(int level)
+{
+    Buttons_Clear();
+
+    Buttons_Add(  2, 80,28,36,"Q", 0);
+    Buttons_Add( 34, 80,28,36,"W", 1);
+    Buttons_Add( 66, 80,28,36,"E", 2);
+    Buttons_Add( 98, 80,28,36,"R", 3);
+    Buttons_Add(130, 80,28,36,"T", 4);
+    Buttons_Add(162, 80,28,36,"Y", 5);
+    Buttons_Add(194, 80,28,36,"U", 6);
+    Buttons_Add(226, 80,28,36,"I", 7);
+    Buttons_Add(258, 80,28,36,"O", 8);
+    Buttons_Add(290, 80,28,36,"P", 9);
+
+    Buttons_Add( 18,120,28,36,"A",10);
+    Buttons_Add( 50,120,28,36,"S",11);
+    Buttons_Add( 82,120,28,36,"D",12);
+    Buttons_Add(114,120,28,36,"F",13);
+    Buttons_Add(146,120,28,36,"G",14);
+    Buttons_Add(178,120,28,36,"H",15);
+    Buttons_Add(210,120,28,36,"J",16);
+    Buttons_Add(242,120,28,36,"K",17);
+    Buttons_Add(274,120,28,36,"L",18);
+
+    Buttons_Add( 50,160,28,36,"Z",19);
+    Buttons_Add( 82,160,28,36,"X",20);
+    Buttons_Add(114,160,28,36,"C",21);
+    Buttons_Add(146,160,28,36,"V",22);
+    Buttons_Add(178,160,28,36,"B",23);
+    Buttons_Add(210,160,28,36,"N",24);
+    Buttons_Add(242,160,28,36,"M",25);
+
+    Buttons_Add(  2,160,42,36,"caps",26);
+    Buttons[26].dark = true;
+    Buttons[26].small = true;
+    if (level == 3)
+	Buttons[26].lock = true;
+    else
+	Buttons[26].lock = false;
+    Buttons_Add(276,160,42,36,"del",27);
+    Buttons[27].dark = true;
+    Buttons[27].small = true;
+
+    Buttons_Add(  2,200,60,36,"123",28);
+    Buttons[28].dark = true;
+    Buttons_Add( 72,200,28,36,"/",29);
+    Buttons_Add(108,204,100,36," ",30);
+    Buttons_Add(220,200,28,36,".",31);
+    Buttons_Add(258,200,60,36,"Ok",32);
+    Buttons[32].dark = true;
+
+    Buttons_Show();
+}
+
+
+
+static const uint8_t nums1_tab[] = { '1','2','3','4','5','6','7','8','9','0', 
+				     '!','@','#','$','/','^','&','*','(',')', 
+				     '-','\'','\"',':',';',',','?' };
+
+/* Level 4 keys */
+void B_Nums1(void)
+{
+    Buttons_Clear();
+
+    Buttons_Add(  2, 80,28,36,"1", 0);
+    Buttons_Add( 34, 80,28,36,"2", 1);
+    Buttons_Add( 66, 80,28,36,"3", 2);
+    Buttons_Add( 98, 80,28,36,"4", 3);
+    Buttons_Add(130, 80,28,36,"5", 4);
+    Buttons_Add(162, 80,28,36,"6", 5);
+    Buttons_Add(194, 80,28,36,"7", 6);
+    Buttons_Add(226, 80,28,36,"8", 7);
+    Buttons_Add(258, 80,28,36,"9", 8);
+    Buttons_Add(290, 80,28,36,"0", 9);
+
+    Buttons_Add(  2,120,28,36,"!",10);
+    Buttons_Add( 34,120,28,36,"@",11);
+    Buttons_Add( 66,120,28,36,"#",12);
+    Buttons_Add( 98,120,28,36,"$",13);
+    Buttons_Add(130,120,28,36,"/",14);
+    Buttons_Add(162,120,28,36,"^",15);
+    Buttons_Add(194,120,28,36,"&",16);
+    Buttons_Add(226,120,28,36,"*",17);
+    Buttons_Add(258,120,28,36,"(",18);
+    Buttons_Add(290,120,28,36,")",19);
+
+    Buttons_Add( 50,160,28,36,"-",20);
+    Buttons_Add( 82,160,28,36,"'",21);
+    Buttons_Add(114,160,28,36,"\"",22);
+    Buttons_Add(146,160,28,36,":",23);
+    Buttons_Add(178,160,28,36,";",24);
+    Buttons_Add(210,160,28,36,",",25);
+    Buttons_Add(242,160,28,36,"?",26);
+
+    Buttons_Add(  2,160,42,36,"1/2",27);
+    Buttons[27].dark = true;
+    Buttons_Add(276,160,42,36,"del",28);
+    Buttons[28].dark = true;
+    Buttons[28].small = true;
+
+    Buttons_Add(  2,200,60,36,"ABC",29);
+    Buttons[29].dark = true;
+    Buttons_Add( 72,200,28,36,"/",30);
+    Buttons_Add(108,204,100,36," ",31);
+    Buttons_Add(220,200,28,36,".",32);
+    Buttons_Add(258,200,60,36,"Ok",33);
+    Buttons[33].dark = true;
+
+    Buttons_Show();
+}
+
+
+static const uint8_t nums2_tab[] = { '+','*','/','=','<','>','{','}','[',']',
+	                             ' ',' ',' ',' ','%','~','`',' ',' ',' ',
+				     '_','\\','|',' ',' ',' ',' ' };
+
+/* Level 5 */
+void B_Nums2(void)
+{
+    Buttons_Clear();
+
+    Buttons_Add(  2, 80,28,36,"+", 0);
+    Buttons_Add( 34, 80,28,36,"*", 1);
+    Buttons_Add( 66, 80,28,36,"/", 2);
+    Buttons_Add( 98, 80,28,36,"=", 3);
+    Buttons_Add(130, 80,28,36,"<", 4);
+    Buttons_Add(162, 80,28,36,">", 5);
+    Buttons_Add(194, 80,28,36,"{", 6);
+    Buttons_Add(226, 80,28,36,"}", 7);
+    Buttons_Add(258, 80,28,36,"[", 8);
+    Buttons_Add(290, 80,28,36,"]", 9);
+
+    Buttons_Add(  2,120,28,36," ",10);
+    Buttons_Add( 34,120,28,36," ",11);
+    Buttons_Add( 66,120,28,36," ",12);
+    Buttons_Add( 98,120,28,36," ",13);
+    Buttons_Add(130,120,28,36,"%",14);
+    Buttons_Add(162,120,28,36,"~",15);
+    Buttons_Add(194,120,28,36,"`",16);
+    Buttons_Add(226,120,28,36," ",17);
+    Buttons_Add(258,120,28,36," ",18);
+    Buttons_Add(290,120,28,36," ",19);
+
+    Buttons_Add( 50,160,28,36,"_",20);
+    Buttons_Add( 82,160,28,36,"\\",21);
+    Buttons_Add(114,160,28,36,"|",22);
+    Buttons_Add(146,160,28,36," ",23);
+    Buttons_Add(178,160,28,36," ",24);
+    Buttons_Add(210,160,28,36," ",25);
+    Buttons_Add(242,160,28,36," ",26);
+
+    Buttons_Add(  2,160,42,36,"2/2",27);
+    Buttons[27].dark = true;
+    Buttons_Add(276,160,42,36,"del",28);
+    Buttons[28].dark = true;
+    Buttons[28].small = true;
+
+    Buttons_Add(  2,200,60,36,"ABC",29);
+    Buttons[29].dark = true;
+    Buttons_Add( 72,200,28,36,"/",30);
+    Buttons_Add(108,204,100,36," ",31);
+    Buttons_Add(220,200,28,36,".",32);
+    Buttons_Add(258,200,60,36,"Ok",33);
+    Buttons[33].dark = true;
+
+    Buttons_Show();
+}
+
+
+static const uint8_t digits_tab[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '+', '-', '.' };
+
+void B_Digits(void)
+{
+    Buttons_Clear();
+
+    Buttons_Add( 61,200,147,36,"0", 9);
+
+    Buttons_Add( 61,160,47,36,"1", 0);
+    Buttons_Add(111,160,47,36,"2", 1);
+    Buttons_Add(161,160,47,36,"3", 2);
+    Buttons_Add(211,160,47,36,"+",10);
+    Buttons[10].dark = true;
+
+    Buttons_Add( 61,120,47,36,"4", 3);
+    Buttons_Add(111,120,47,36,"5", 4);
+    Buttons_Add(161,120,47,36,"6", 5);
+    Buttons_Add(211,120,47,36,"-",11);
+    Buttons[11].dark = true;
+
+    Buttons_Add( 61, 80,47,36,"7", 6);
+    Buttons_Add(111, 80,47,36,"8", 7);
+    Buttons_Add(161, 80,47,36,"9", 8);
+    Buttons_Add(211, 80,47,36,".",12);
+    Buttons[12].dark = true;
+
+    Buttons_Add(211,200,47,36,"del",13);
+    Buttons[13].dark = true;
+    Buttons[13].small = true;
+
+    Buttons_Add(271,200,47,36,"Ok",14);
+    Buttons[14].dark = true;
+
+    Buttons_Show();
+}
+
+
+
+int KeyBoardAll(void)
+{
+    int		key;
+
+    key = Buttons_Scan();
+    if (key == -1)
+	return -1;
+
+    switch (level) {
+	    case 1:	if (key >= 0 && key <= 25) {
+			    key = alphalow_tab[key];
+	    		} else if (key == 26) {
+			    level = 2;
+			    B_AlphaCaps(level);
+			} else if (key == 27) {
+			    key = 127;
+			} else if (key == 28) {
+			    level = 4;
+			    B_Nums1();
+			} else if (key == 29) {
+			    key = '/';
+			} else if (key == 30) {
+			    key = ' ';
+			} else if (key == 31) {
+			    key = '.';
+			} else if (key == 32) {
+			    key = 0;
+			}
+			break;
+	    case 2:
+	    case 3:	if (key >= 0 && key <= 25) {
+			    key = alphacaps_tab[key];
+			    if (level == 2) {
+				level = 1;
+				B_AlphaLow();
+			    }
+			} else if (key == 26 && level == 3) {
+			    level = 1;
+			    B_AlphaLow();
+			} else if (key == 26 && level == 2) {
+			    level = 3;
+			    B_AlphaCaps(level);
+			} else if (key == 27) {
+			    key = 127;
+			} else if (key == 28) {
+			    level = 4;
+			    B_Nums1();
+			} else if (key == 29) {
+			    key = '/';
+			} else if (key == 30) {
+			    key = ' ';
+			} else if (key == 31) {
+			    key = '.';
+			} else if (key == 32) {
+			    key = 0;
+			}
+			break;
+	    case 4:	if (key >= 0 && key <= 26) {
+			    key = nums1_tab[key];
+			} else if (key == 27) {
+			    level = 5;
+			    B_Nums2();
+			} else if (key == 28) {
+			    key = 127;
+			} else if (key == 29) {
+			    level = 1;
+			    B_AlphaLow();
+			} else if (key == 30) {
+			    key = '/';
+			} else if (key == 31) {
+			    key = ' ';
+			} else if (key == 32) {
+			    key = '.';
+			} else if (key == 33) {
+			    key = 0;
+			}
+			break;
+	    case 5:	if (key >= 0 && key <= 26) {
+			    key = nums2_tab[key];
+			} else if (key == 27) {
+			    level = 4;
+			    B_Nums1();
+			} else if (key == 28) {
+			    key = 127;
+			} else if (key == 29) {
+			    level = 1;
+			    B_AlphaLow();
+			} else if (key == 30) {
+			    key = '/';
+			} else if (key == 31) {
+			    key = ' ';
+			} else if (key == 32) {
+			    key = '.';
+			} else if (key == 33) {
+			    key = 0;
+			}
+			break;
+    }
+
+    return key;
+}
+
+
+int KeyBoardDigits(void)
+{
+    int         key;
+
+    key = Buttons_Scan();
+    if (key == -1)
+	return -1;
+
+    if (key >= 0 && key <= 12) {
+	key = digits_tab[key];
+    } else if (key == 13) {
+	key = 127;
+    } else if  (key == 14) {
+	key = 0;
+    }
+
+    return key;
+}
+
+
+
+/**************************************************************************/
+/*
+ *  Data show and edit functions.
+ */
+
+void ShowText(uint16_t x, uint16_t y, char *label, char *txt)
+{
+    _fg = TFT_LIGHTGREY;
+    TFT_print(label, x, y);
+    _fg = TFT_YELLOW;
+    TFT_print(" ", LASTX, LASTY);
+    TFT_print(txt, LASTX, LASTY);
+}
+
+
+
+void ShowInteger(uint16_t x, uint16_t y, char *label, char *suffix, int val)
+{
+    char        tmp[32];
+
+    _fg = TFT_LIGHTGREY;
+    TFT_print(label, x, y);
+    _fg = TFT_YELLOW;
+   sprintf(tmp, " %d", val);
+   TFT_print(tmp, LASTX, LASTY);
+   if (suffix) {
+        _fg = TFT_LIGHTGREY;
+        TFT_print(suffix, LASTX, LASTY);
+   }
+}
+
+
+
+void ShowBool(uint16_t x, uint16_t y, char *label, bool val)
+{
+    _fg = TFT_LIGHTGREY;
+    TFT_print(label, x, y);
+    _fg = TFT_YELLOW;
+    if (val)
+        TFT_print(" J", LASTX, LASTY);
+    else
+        TFT_print(" N", LASTX, LASTY);
+}
+
+
+
+void ShowSSR2(uint16_t x, uint16_t y, int val)
+{
+    _fg = TFT_LIGHTGREY;
+    TFT_print("SSR2 ", x, y);
+   _fg = TFT_YELLOW;
+   TFT_clearStringRect(TFT_X, TFT_Y, "HLT en MLT");
+
+   switch (val) {
+	case SSR2_OFF:		TFT_print("Uit", LASTX, LASTY);
+				break;
+	case SSR2_HLT_SHARE:	TFT_print("HLT of MLT", LASTX, LASTY);
+				break;
+
+	case SSR2_HLT_IND:	TFT_print("HLT en MLT", LASTX, LASTY);
+				break;
+
+	case SSR2_ON_IDLE:	TFT_print("Idle", LASTX, LASTY);
+				break;
+
+	default:		TFT_print("N/A", LASTX, LASTY);
+   }
+}
+
+
+
+void ShowFloat(uint16_t x, uint16_t y, char *label, char *suffix, float val, int decimals)
+{
+    char        tmp[32];
+
+    _fg = TFT_LIGHTGREY;
+    TFT_print(label, x, y);
+    _fg = TFT_YELLOW;
+    sprintf(tmp, " %.*f", decimals, val);
+    TFT_print(tmp, LASTX, LASTY);
+    if (suffix) {
+        _fg = TFT_LIGHTGREY;
+        TFT_print(suffix, LASTX, LASTY);
+    }
+}
+
+
+
+void ShowDouble(uint16_t x, uint16_t y, char *label, char *suffix, double val, int decimals)
+{
+    char        tmp[32];
+
+    _fg = TFT_LIGHTGREY;
+    TFT_print(label, x, y);
+    _fg = TFT_YELLOW;
+    sprintf(tmp, " %.*f", decimals, val);
+    TFT_print(tmp, LASTX, LASTY);
+    if (suffix) {
+	_fg = TFT_LIGHTGREY;
+	TFT_print(suffix, LASTX, LASTY);
+    }
+}
+
+
+
+void Editer(char *label, char *txt, char *errmsg, int len, int type)
+{
+    int		key;
+
+    _bg = TFT_BLACK;
+    TFT_fillScreen(_bg);
+    TFT_resetclipwin();
+    TopMessage("Wijzigen");
+    _fg = TFT_LIGHTGREY;
+    TFT_setFont(DEFAULT_FONT, NULL);
+    TFT_print(label, 2, 28);
+    if (strlen(errmsg)) {
+	_fg = TFT_RED;
+	TFT_print(errmsg, 2, 60);
+    }
+    TFT_fillRect(2, 40, 10 * len, 14, TFT_BLUE);
+    _fg = TFT_YELLOW;
+    _bg = TFT_BLUE;
+    TFT_print(txt, 2, 41);
+    TFT_fillRect(TFT_X, 50, 10, 4, TFT_GREEN);
+
+    switch(type) {
+	case EDIT_TYPE_INT:	
+			B_Digits();
+			break;
+
+	default:	level = 1;
+			B_AlphaLow();
+			break;
+    }
+
+    while (1) {
+	switch (type) {
+	   case  EDIT_TYPE_INT:
+		   	key = KeyBoardDigits();
+			break;
+
+	    default:	key = KeyBoardAll();
+			break;
+	}
+
+	if (key != -1) {
+
+	    if (key >= 32 && key <= 126 && strlen(txt) < len) {
+	    	// Append key
+		txt[strlen(txt) + 1] = '\0';
+	    	txt[strlen(txt)] = key;
+	    } else if (key == 127 && strlen(txt)) {
+	    	// Delete key
+	    	txt[strlen(txt) - 1] = '\0';
+	    }
+
+	    _fg = TFT_YELLOW;
+	    _bg = TFT_BLACK;
+	    TFT_setFont(DEFAULT_FONT, NULL);
+	    TFT_fillRect(2, 40, 10 * len, 14, TFT_BLUE);
+	    TFT_print(txt, 2, 41);
+	    TFT_fillRect(TFT_X, 50, 10, 4, TFT_GREEN);
+	}
+
+	if (key == 0)
+	    break;
+
+	vTaskDelay(20 / portTICK_PERIOD_MS);
+    }
+}
+
+
+
+void EditText(char *label, char *txt, int len)
+{
+    char		errmsg[40];
+
+    errmsg[0] = '\0';
+    while (1) {
+    	Editer(label, txt, errmsg, len, EDIT_TYPE_TEXT);
+	if (strlen(txt))
+	    break;
+	sprintf(errmsg, "Tekst veld mag niet leeg zijn");
+    }
+}
+
+
+
+void EditTextMin(char *label, char *txt, int len, int min)
+{
+    char                errmsg[40];
+
+    errmsg[0] = '\0';
+    while (1) {
+	Editer(label, txt, errmsg, len, EDIT_TYPE_TEXT);
+	if (strlen(txt) >= min)
+	    break;
+	sprintf(errmsg, "Tekst veld moet tussen %d en %d lang zijn", min, len);
+    }
+}
+
+
+
+void EditInt(char *label, int *val, int min, int max)
+{
+    char	*valstr, errmsg[40];
+    int		newval;
+
+    errmsg[0] = '\0';
+    valstr = malloc(20);
+    sprintf(valstr, "%d", *val);
+
+    while (1) {
+	Editer(label, valstr, errmsg, 8, EDIT_TYPE_INT);
+	newval = atoi(valstr);
+	if (newval < min || newval > max) {
+	    sprintf(errmsg, "De waarde moet tussen %d en %d zijn.", min, max);
+	} else {
+	    break;
+	}
+    }
+
+    *val = newval;
+    free(valstr);
+}
+
+
+
+void EditUint8(char *label, uint8_t *val, uint8_t min, uint8_t max)
+{
+    char        *valstr, errmsg[40];
+    uint8_t	newval;
+
+    errmsg[0] = '\0';
+    valstr = malloc(20);
+    sprintf(valstr, "%d", *val);
+
+    while (1) {
+	Editer(label, valstr, errmsg, 5, EDIT_TYPE_INT);
+	newval = atoi(valstr);
+	if (newval < min || newval > max) {
+	    sprintf(errmsg, "De waarde moet tussen %d en %d zijn.", min, max);
+	} else {
+	    break;
+	}
+    }
+
+    *val = newval;
+    free(valstr);
+}
+
+
+
+void EditUint16(char *label, uint16_t *val, uint16_t min, uint16_t max)
+{   
+    char        *valstr, errmsg[40];
+    uint16_t     newval;
+
+    errmsg[0] = '\0';
+    valstr = malloc(20);
+    sprintf(valstr, "%d", *val);
+
+    while (1) {
+	Editer(label, valstr, errmsg, 5, EDIT_TYPE_INT);
+	newval = atoi(valstr);
+	if (newval < min || newval > max) {
+	    sprintf(errmsg, "De waarde moet tussen %d en %d zijn.", min, max);
+	} else {
+	    break;
+	}
+    }
+
+    *val = newval;
+    free(valstr);
+}
+
+
+
+void EditFloat(char *label, float *val, float min, float max, int decimals)
+{
+    char        *valstr, errmsg[40];
+    float	newval;
+
+    errmsg[0] = '\0';
+    valstr = malloc(30);
+    sprintf(valstr, " %.*f", decimals, *val);
+
+    while (1) {
+	Editer(label, valstr, errmsg, 25, EDIT_TYPE_INT);
+	newval = atof(valstr);
+	if (newval < min || newval > max) {
+	    sprintf(errmsg, "De waarde moet tussen %.2f en %.2f zijn.", min, max);
+	} else {
+	    break;
+	}
+    }
+
+    *val = newval;
+    free(valstr);
+}
+
+
+
+void EditDouble(char *label, double *val, double min, double max, int decimals)
+{
+    char        *valstr, errmsg[40];
+    double	newval;
+
+    errmsg[0] = '\0';
+    valstr = malloc(30);
+    sprintf(valstr, " %.*f", decimals, *val);
+
+    while (1) {
+	Editer(label, valstr, errmsg, 25, EDIT_TYPE_INT);
+	newval = atof(valstr);
+	if (newval < min || newval > max) {
+	    sprintf(errmsg, "De waarde moet tussen %.2f en %.2f zijn.", min, max);
+	} else {
+	    break;
+	}
+    }
+
+    *val = newval;
+    free(valstr);
+}
+
+
+
+void EditBool(char *label, bool *val)
+{
+    bool	loop = true, value = *val;
+    int		curpos;
+
+    _bg = TFT_BLACK;
+    TFT_fillScreen(_bg);
+    TFT_resetclipwin();
+    TopMessage("Wijzigen");
+    _fg = TFT_LIGHTGREY;
+    TFT_setFont(DEFAULT_FONT, NULL);
+    TFT_print(label, 2, 28);
+    curpos = TFT_X;
+    _fg = TFT_YELLOW;
+    (value) ? TFT_print(" J ", curpos, 28) : TFT_print(" N ", curpos, 28);
+
+    Buttons_Clear();
+    Buttons_Add( 40, 100, 80, 40, "J/N", 0);
+    Buttons_Add(200, 100, 80, 40, "Ok",  1);
+    Buttons_Show();
+
+    while (loop) {
+	switch (Buttons_Scan()) {
+	    case 0:	TFT_setFont(DEFAULT_FONT, NULL);
+			_fg = TFT_YELLOW;
+		    	if (value) {
+			    value = false;
+			    TFT_print(" N ", curpos, 28);
+			} else {
+			    value = true;
+			    TFT_print(" J ", curpos, 28);
+			}
+			break;
+
+	    case 1:	loop = false;
+			break;
+
+	    default:	break;
+	}
+	vTaskDelay(20 / portTICK_PERIOD_MS);
+    }
+    *val = value;
+}
+
+
+
+void EditSSR2(int *val)
+{
+    bool        loop = true;
+    int		value = *val;
+    int		key;
+
+    _bg = TFT_BLACK;
+    TFT_fillScreen(_bg);
+    TFT_resetclipwin();
+    TopMessage("Wijzigen");
+    TFT_setFont(DEFAULT_FONT, NULL);
+    ShowSSR2(2, 28, value);
+
+    Buttons_Clear();
+    Buttons_Add( 20,  60,120, 40, "Uit", 0);
+    Buttons_Add(180,  60,120, 40, "HLT of MLT",  1);
+    Buttons_Add( 20, 130,120, 40, "HLT en MLT",  2);
+    Buttons_Add(180, 130,120, 40, "Idle",  3);
+    Buttons_Add(120, 200, 80, 40, "Ok",  4);
+    Buttons_Show();
+
+    while (loop) {
+	key = Buttons_Scan();
+
+	if (key >= 0 && key <= 3) {
+	    value = key;
+	    TFT_setFont(DEFAULT_FONT, NULL);
+	    ShowSSR2(2, 28, value);
+	} else if (key == 4) {
+	    loop = false;
+	}
+        vTaskDelay(20 / portTICK_PERIOD_MS);
+    }
+    *val = value;
+}
+
+
+
+int Confirm(char *top, char *ack, char *nak)
+{
+    int		rc = false;
+    bool	loop = true;
+
+    TFT_fillScreen(TFT_BLACK);
+    TopMessage(top);
+    Buttons_Clear();
+    Buttons_Add( 40, 100, 80, 40, ack, 0);
+    Buttons_Add(200, 100, 80, 40, nak, 1);
+    Buttons_Show();
+    SoundPlay(SOUND_Prompt);
+
+    while (loop) {
+	switch (Buttons_Scan()) {
+	    case 0:	loop = false;
+			rc = true;
+			break;
+
+	    case 1:	loop = false;
+			rc = false;
+			break;
+
+	    default:
+			break;
+	}
+	vTaskDelay(50 / portTICK_PERIOD_MS);
+    }
+
+    Buttons_Clear();
+    return rc;
+}
+
+

mercurial