Finished websockets screens. novnc

Tue, 07 May 2019 22:03:38 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Tue, 07 May 2019 22:03:38 +0200
branch
novnc
changeset 42
c6a1a6ca5437
parent 41
7639cfa6aec0
child 43
2079940c3989

Finished websockets screens.

image/files.list file | annotate | diff | comparison | revisions
image/version.txt file | annotate | diff | comparison | revisions
image/w/css/style.css file | annotate | diff | comparison | revisions
image/w/css/webui.css file | annotate | diff | comparison | revisions
image/w/index.html.gz file | annotate | diff | comparison | revisions
image/w/js/webui.js file | annotate | diff | comparison | revisions
image/w/webui.html file | annotate | diff | comparison | revisions
main/automation.c file | annotate | diff | comparison | revisions
main/brewboard.c file | annotate | diff | comparison | revisions
main/config.h file | annotate | diff | comparison | revisions
main/task_sound.c file | annotate | diff | comparison | revisions
main/task_tft.c file | annotate | diff | comparison | revisions
main/updates.c file | annotate | diff | comparison | revisions
sdkconfig file | annotate | diff | comparison | revisions
--- a/image/files.list	Sat May 04 21:18:51 2019 +0200
+++ b/image/files.list	Tue May 07 22:03:38 2019 +0200
@@ -4,7 +4,7 @@
 fonts/SmallFont.fon
 fonts/Ubuntu.fon
 w/css/web.css
-w/css/style.css
+w/css/webui.css
 w/js/Chart.min.js.gz
 w/js/ch-plug-anno.min.js.gz
 w/js/jquery-1.12.4.min.js.gz
--- a/image/version.txt	Sat May 04 21:18:51 2019 +0200
+++ b/image/version.txt	Tue May 07 22:03:38 2019 +0200
@@ -1,1 +1,1 @@
-0.1.av
+0.1.cp
--- a/image/w/css/style.css	Sat May 04 21:18:51 2019 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-
-body {
-    background: #ccc;
-    font-family: Verdana, Arial, sans-serif;
-    margin: 0px;
-}
-
-#webui_win {
-    width: 360px;
-    height: 270px;
-    background: #353536;
-    border: 2px solid;
-    border-color: #59b4d4;
-}
-
-#topline {
-    width: 100%;
-    height: 24px;
-    background: blue;
-    color: yellow;
-    text-align: center;
-    font-size: 18px;
-}
-
-#mltline,
-#hltline {
-    width: 100%;
-    height: 100px;
-}
-
-#midline {
-    width: 100%;
-    height: 45px;
-}
-
-#mlt_table {
-    width: 178px;
-    height: 90px;
-    margin: auto;
-    background: #303030;
-    border: 1px solid;
-    border-collapse: collapse;
-    color: white;
-    border-color: white;
-}
-
-#hlt_table {
-    width: 178px;
-    height: 90px;
-    margin: auto;
-    background: #3f3f40;
-    border: 1px solid;
-    border-collapse: collapse;
-    color: yellow;
-    border-color: yellow;
-}
-
-#prompt {
-    width: 100%;
-    float: left;
-    text-align: center;
-}
-
-.appbutton {
-    width: 60px;
-    height: 36px;
-    border-radius: 4px;
-    background-color: #e7e7e7; color: black;
-}
-
-.okbutton {
-    width: 60px;
-    height: 36px;
-    border-radius: 4px;
-    background-color: #575757; color: white;
-}
-
-.promptbutton {
-    width: 80px;
-    height: 40px;
-    border-radius: 4px;
-    background-color: #e7e7e7; color: black;
-}
-
-#timer {
-    color: white;
-    text-align: center;
-    font-family: "Courier New", "Lucida Console";
-    font-size: 34px;
-}
-
-/* LED */
-.LEDred {
-    margin: 5px auto;
-    width: 12px;
-    height: 12px;
-    background-color: #820;	/* On = #F40 */
-    border-radius: 50%;
-}
-
-.LEDgreen {
-    margin: 5px auto;
-    width: 12px;
-    height: 12px;
-    background-color: #270;	/* On = #5E0 */
-    border-radius: 50%;
-}
-
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/image/w/css/webui.css	Tue May 07 22:03:38 2019 +0200
@@ -0,0 +1,130 @@
+
+body {
+    background: #555;
+    font-family: Verdana, Arial, sans-serif;
+    margin: 0px;
+}
+
+#webui_win {
+    width: 360px;
+    height: 270px;
+    background: #353536;
+    border: 2px solid;
+    border-color: #59b4d4;
+}
+
+#topline {
+    width: 100%;
+    height: 24px;
+    background: blue;
+    color: yellow;
+    text-align: center;
+    font-size: 18px;
+}
+
+#mltline,
+#hltline {
+    width: 100%;
+    height: 100px;
+}
+
+#midline {
+    width: 100%;
+    height: 45px;
+}
+
+#mlt_table {
+    width: 178px;
+    height: 90px;
+    margin: auto;
+    background: #303030;
+    border: 1px solid;
+    border-collapse: collapse;
+    color: white;
+    border-color: white;
+}
+
+#hlt_table {
+    width: 178px;
+    height: 90px;
+    margin: auto;
+    background: #3f3f40;
+    border: 1px solid;
+    border-collapse: collapse;
+    color: yellow;
+    border-color: yellow;
+}
+
+#prompt {
+    width: 100%;
+    float: left;
+    text-align: center;
+}
+
+.appbutton {
+    width: 60px;
+    height: 36px;
+    border-radius: 4px;
+    background-color: #e7e7e7; color: black;
+}
+
+.okbutton {
+    width: 60px;
+    height: 36px;
+    border-radius: 4px;
+    background-color: #575757; color: white;
+    position: absolute;
+    left: 150px;
+    top: 230px;
+}
+
+.promptbutton {
+    width: 80px;
+    height: 40px;
+    border-radius: 4px;
+    background-color: #e7e7e7; color: black;
+}
+
+#timer {
+  color: white;
+  text-align: center;
+  font-family: "Courier New", "Lucida Console";
+  font-size: 34px;
+}
+
+/* LED */
+.LEDred {
+  margin: 5px auto;
+  width: 12px;
+  height: 12px;
+  background-color: #820;	/* On = #F40 */
+  border-radius: 50%;
+}
+
+.LEDgreen {
+  margin: 5px auto;
+  width: 12px;
+  height: 12px;
+  background-color: #270;	/* On = #5E0 */
+  border-radius: 50%;
+}
+
+.menu input[type=submit] {
+  background-color: #33b5e5;
+  border: none;
+  color: white;
+  font-weight: bold;
+  width: 250px;
+  padding: 15px 32px;
+  text-decoration: none;
+  font-size: 16px;
+  cursor: pointer;
+  margin: 8px;
+  text-align: center;
+  border-radius: 10px;
+}
+
+.menu input[type=submit]:hover {
+  background-color: #0099cc;
+}
+
Binary file image/w/index.html.gz has changed
--- a/image/w/js/webui.js	Sat May 04 21:18:51 2019 +0200
+++ b/image/w/js/webui.js	Tue May 07 22:03:38 2019 +0200
@@ -1,117 +1,250 @@
 document.getElementById("test").innerHTML = "WebSocket is not connected";
 
 var websocket = new WebSocket('ws://'+location.hostname+'/ws');
-//var slider = document.getElementById("myRange");
 
+var Beep= new Audio( "data:audio/wav;base64,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 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=" );
 
 var BBScreen={
 
     Screen: -1,
+    Subscreen: 0,
+    setTimer: function(v){
+	$("#timer").text('');
+	if (v == 0) {
+            $("#timer").css("font-size", "18px");
+	    $("#timer").css("font-weight", "normal");
+	    $("#timer").css("font-family", "Verdana, Arial, sans-serif");
+	} else {
+	    $("#timer").css("font-size", "36px");
+	    $("#timer").css("font-weight", "bold");
+	    $("#timer").css("font-family", "Courier New, Lucida Console");
+	}
+    },
+    clearScreen: function(){
+	$("#mltline").hide();
+	$("#mlt_table").hide();
+	$("#mlt00").hide();
+        $("#mlt20").hide();
+        $("#mlt01").hide();
+        $("#mlt21").hide();
+        $("#midline").hide();
+	this.setTimer(0);
+        $("#mid00").hide();
+        $("#mid20").hide();
+	$("#mid00").css("background-color", "#e7e7e7");
+        $("#mid00").css("color", "black");
+        $("#hltline").hide();
+	$("#hlt_table").hide();
+	$("#hlt00").hide();
+        $("#hlt20").hide();
+        $("#hlt01").hide();
+        $("#hlt21").hide();
+	$("#hlt01").css("background-color", "#e7e7e7");
+        $("#hlt01").css("color", "black");
+	$("#row_info").hide();
+        $("#prompt").hide();
+	$("#button_nee").css("background-color", "#e7e7e7");
+        $("#button_nee").css("color", "black");
+        $("#note").hide();
+	$("#brew").hide();
+    },
     setScreen: function(s){
 	Screen = parseInt(s,10);
-	console.log("Screen:"+Screen);
 	switch (Screen) {
-            case 0:	$("#mltline").show();
+            case 0:	this.clearScreen();
+			$("#mltline").show();
 			$("#mlt_table").show();
 			$("#but00").text('Hand');
 			$("#but20").text('Auto');
 			$("#mlt00").show();
                 	$("#mlt20").show();
-			$("#mlt01").hide();
-			$("#mlt21").hide();
 			$("#midline").show();
-			$("#mid00").hide();
-                        $("#mid20").hide();
+			this.setTimer(0);
 			$("#hltline").show();
 			$("#hlt_table").show();
-			$("#hlt00").hide();
-                        $("#hlt20").hide();
 			$("#hlt01").show();
-                	$("#hlt21").show();
-			$("#hlt01").css("background-color", "#e7e7e7");
-                        $("#hlt01").css("color", "black");
 			$("#but04").text('Info');
-                        $("#but24").text('Tools');
-			$("#row_info").hide();
-			$("#prompt").hide();
+			// No tools button on the web.
 			break;
-	    case 2:     $("#mltline").hide();
-                        $("#midline").hide();
-                        $("#hltline").hide();
+	    case 2:     this.clearScreen();
                         $("#row_info").show();
-			$("#prompt").hide();
                         break;
-//	    case 21:	Automaat show recipe and Stop / Start
-//			Prompt
-//			Prompt
-	    case 100:
+	    case 96:	break;	// Automaat show recipe and Stop / Start
+	    case 98:	break;	// Delay start
+	    case 99:	this.clearScreen(); // heatup
+			$("#mltline").show();
+			$("#mlt_table").show();
+			$("#midline").show();
+			$("#hltline").show();
+                        $("#hlt_table").show();
+			break;
+	    case 100:	// All handled at Subscreen
             case 101:
             case 102:
             case 103:
             case 104:
             case 105:
             case 106:
-            case 107:	$("#mltline").show();
-			$("#but00").text('+sp');
-			$("#but20").text('-sp');
-                        $("#midline").show();
-                        $("#hltline").show();
-			$("#hlt01").hide();
-                        $("#hlt21").hide();
-                        $("#row_info").hide();
-			$("#prompt").hide();
-                        break;
-	    case 108:	$("#mltline").show();	// to boil
-			$("#midline").hide();
-                        $("#hltline").hide();
-			$("#prompt").hide();
+            case 107:	break;
+	    case 108:	this.clearScreen();
+			$("#mltline").show();	// to boil
+			$("#mlt_table").show();
+			$("#mlt00").show();
+                        $("#mlt20").show();
+                        $("#but00").text('+sp');
+                        $("#but20").text('-sp');
 			break;
-            case 109:	$("#mltline").show();	// boil
+            case 109:	this.clearScreen();
+			$("#mltline").show();	// boil
+			$("#mlt_table").show();
+			$("#mlt00").show();
+                        $("#mlt20").show();
+                        $("#but00").text('+sp');
+                        $("#but20").text('-sp');
 			$("#midline").show();
-			$("#hltline").hide();
-			$("#prompt").hide();
+			$("#mid00").show();
+                        $("#mid20").show();
+                        $("#but02").text('+%');
+                        $("#but22").text('-%');
+			this.setTimer(1);
+			$("#hltline").show();
+			$("#hlt01").show();
+                        $("#hlt21").show();
+                        $("#but04").text('+1m');
+                        $("#but24").text('-1m');
 			break;
-	    case 200:	$("#mltline").hide();
-                        $("#midline").hide();
-                        $("#hltline").hide();
-			$("#row_info").hide();
+	    case 110:	// whirlpool 9
+	    case 111:	// cooling H
+	    case 112:	// whirlpool 7
+	    case 113:	// cooling M
+	    case 114:	// whirlpool 6
+	    case 115:	// cooling C
+	    case 116:	// whirlpool 2
+			break;
+	    case 117:	this.clearScreen();
+                        $("#note").show();
+			$("#note_msg").text('Brouwen is gereed.');
+			break;
+	    case 118:	this.clearScreen();
+                        $("#note").show();
+                        $("#note_msg").text('Brouwen is afgebroken.');
+			break;
+	    case 97:
+	    case 200:	this.clearScreen();
 			$("#prompt").show();
 			break;
-	    case 201:	$("#mltline").show();
-			$("#mlt00").hide();
-                	$("#mlt20").hide();
-			$("#mlt01").hide();
-                        $("#mlt21").hide();
-			$("#mlt_table").hide();
+	    case 201:	this.clearScreen();
+			$("#mltline").show();
 			$("#but00").text('+sp');
 			$("#but20").text('-sp');
 			$("#but01").text('Pomp');
 			$("#but21").text('Aan');
 			$("#midline").show();
-                        $("#mid00").hide();
-                        $("#mid20").hide();
 			$("#hltline").show();
-			$("#hlt00").hide();
-                	$("#hlt20").hide();
-                	$("#hlt21").hide();
-			$("#hlt_table").hide();
 			$("#but03").text('+sp');
                         $("#but23").text('-sp');
                         $("#but04").text('Stop');
                         $("#but24").text('Aan');
+			$("#hlt01").show();
 			$("#hlt01").css("background-color", "#575757");
 			$("#hlt01").css("color", "white");
-                        $("#row_info").hide();
-			$("#prompt").hide();
 			break;
-            default:    $("#mltline").hide();
-			$("#midline").hide();
-                        $("#hltline").hide();
-			$("#prompt").hide();
+            default:    this.clearScreen();
                         console.log("this is default screen "+Screen);
                         break;
 	}
     },
+    setSubscreen: function(s){
+        Subscreen = parseInt(s,10);
+        console.log("Screen:"+Screen+" Sub:"+Subscreen);
+	if (Screen == 96) {
+	    this.clearScreen();
+	    if (Subscreen == 0) {
+		$("#prompt").show();
+                $("#button_ja").text('Ja');
+                $("#button_nee").text('Nee');
+	    } else if (Subscreen == 1) {
+		$("#brew").show();
+	    }
+	} else if ((Screen >= 100) && (Screen < 108)) {
+	    this.clearScreen();
+            $("#mltline").show();
+            $("#mlt_table").show();
+	    $("#midline").show();
+            $("#hltline").show();
+	    $("#hlt_table").show();
+            switch (Subscreen) {
+		case 0:	// MASH_NONE
+		case 1:	// MASH_WAITTEMP
+                        $("#mlt00").show();
+                        $("#mlt20").show();
+			$("#but00").text('+sp');
+                        $("#but20").text('-sp');
+                        break;
+		case 2:	// MASH_REST
+			this.setTimer(1);
+			$("#mid00").show();
+                        $("#mid20").show();
+                        $("#but02").text('+1m');
+                        $("#but22").text('-1m');
+			break;
+		case 3:	// MASH_ADD
+		case 4:	// MASH_IODINE
+		case 5:	// MASH_REMOVE
+		case 6:	// MASH_INFUSE
+			this.setTimer(0);
+			$("#mid00").show();
+			$("#mid00").css("background-color", "#575757");
+                        $("#mid00").css("color", "white");
+                        $("#mid20").show();
+			$("#but02").text('Halt');
+                        $("#but22").text('Ok');
+			break;
+	    };
+	} else if ((Screen == 111) || (Screen == 113) || (Screen == 115)) { // cooling H,M,C
+	    this.clearScreen();
+	    if (Subscreen == 0) {
+		$("#prompt").show();
+		$("#button_ja").text('Start');
+                $("#button_nee").text('Stop');
+		$("#button_nee").css("background-color", "#575757");
+                $("#button_nee").css("color", "white");
+	    } else if (Subscreen == 1) {
+		$("#mltline").show();
+                $("#mlt_table").show();
+                $("#mlt00").show();
+                $("#mlt20").show();
+                $("#but00").text('+1');
+                $("#but20").text('-1');
+                $("#hltline").show();
+		$("#hlt01").show();
+                $("#but04").text('Stop');
+		$("#hlt01").css("background-color", "#575757");
+                $("#hlt01").css("color", "white");
+	    }
+	} else if ((Screen == 110) || (Screen == 112) || (Screen == 114) || (Screen == 116)) { // whirlpools
+	    this.clearScreen();
+            if (Subscreen == 0) {
+        	$("#prompt").show();
+                $("#button_ja").text('Start');
+                $("#button_nee").text('Stop');
+		$("#button_nee").css("background-color", "#575757");
+                $("#button_nee").css("color", "white");
+	    } else if (Subscreen == 1) {
+		$("#mltline").show();
+                $("#mlt_table").show();
+		$("#midline").show();
+		this.setTimer(1);
+                $("#mid00").show();
+                $("#mid20").show();
+                $("#but02").text('-1m');
+                $("#but22").text('+1m');
+		$("#hltline").show();
+                $("#hlt21").show();
+                $("#but24").text('Pomp');
+            }
+	};
+    },
     MLT_pv: function(s) {
 	$("#mlt_pv").text(s);
     },
@@ -129,6 +262,13 @@
     },
     MLT_power: function(s) {
 	$("#mlt_power").text(s);
+	if (Screen == 201) {
+	    if (s != "") {
+		$("#but21").text('Uit');
+	    } else {
+		$("#but21").text('Aan');
+	    }
+	}
     },
     MLT_led: function(s) {
 	if (s == 0)
@@ -154,10 +294,17 @@
                 $("#hlt21").show();
 		$("#hlt_table").show();
             }
-        }
+	}
     },
     HLT_power: function(s) {
 	$("#hlt_power").text(s);
+	if (Screen == 201) {
+            if (s != "") {
+                $("#but24").text('Uit');
+            } else {
+                $("#but24").text('Aan');
+            }
+        }
     },
     HLT_led: function(s) {
 	if (s == 0)
@@ -171,6 +318,20 @@
     Timer: function(s) {
 	$("#timer").text(s);
     },
+    Brew1: function(s) {
+	$("#brew_msg1").text(s);
+    },
+    Brew2: function(s) {
+        $("#brew_msg2").text(s);
+    },
+    Beep: function(s) {
+	var loop = parseInt(s,10);
+	Beep.pause();
+	Beep.loop = false;
+	for (i = 0; i < loop; i++) {
+	    Beep.play();
+	}
+    },
 };
 
 var BrewBoard = {
@@ -182,6 +343,9 @@
 	    main: function(v){
 		BBScreen.setScreen(v)
 	    },
+	    sub: function(v){
+                BBScreen.setSubscreen(v)
+            },
 	    mlt_pv:function(v){
 		BBScreen.MLT_pv(v)
 	    },
@@ -215,8 +379,16 @@
 	    timer:function(v){
 		BBScreen.Timer(v)
 	    },
+	    beep:function(v){
+                BBScreen.Beep(v)
+            },
+	    brew1:function(v){
+		BBScreen.Brew1(v)
+	    },
+	    brew2:function(v){
+                BBScreen.Brew2(v)
+            },
 	};
-	console.log(e);
 	$.each(a,function(k,v){
 	    if (typeof(c[k])!="undefined"){
 		c[k](v)
@@ -227,13 +399,13 @@
 
 
 function sendTouch(x, y) {
-	websocket.send('{"touch":{"x":'+x+',"y":'+y+'}}');
-	console.log('Sent {"touch":{"x":'+x+',"y":'+y+'}}');
+    websocket.send('{"touch":{"x":'+x+',"y":'+y+'}}');
 }
 
 
 /* Define keys in the screens and their actions. */
 $("#ok_info").click( function() { sendTouch(160,220); });
+$("#ok_note").click( function() { sendTouch(160,220); });
 $("#mlt00").click( function()   { sendTouch( 35, 46); });
 $("#mlt20").click( function()   { sendTouch(285, 46); });
 $("#mlt01").click( function()   { sendTouch( 35, 96); });
@@ -246,11 +418,12 @@
 $("#hlt21").click( function()   { sendTouch(285,220); });
 $("#button_ja").click( function()  { sendTouch( 80,120); });
 $("#button_nee").click( function() { sendTouch(240,120); });
-
+$("#button_stop").click( function()  { sendTouch( 35,220); });
+$("#button_start").click( function() { sendTouch(285,220); });
 
 websocket.onopen = function(evt) {
-	console.log('WebSocket connection opened');
-	document.getElementById("test").innerHTML = "WebSocket is connected!";
+  console.log('WebSocket connection opened');
+  document.getElementById("test").innerHTML = "";
 }
 
 /*
--- a/image/w/webui.html	Sat May 04 21:18:51 2019 +0200
+++ b/image/w/webui.html	Tue May 07 22:03:38 2019 +0200
@@ -4,9 +4,9 @@
   <title>Web User Interface</title>
   <meta charset="utf-8" />
   <meta http-equiv="X-UA-Compatible" content="IE=edge" />
-  <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.5" /> 
   <script src="js/jquery-1.12.4.min.js"></script>
-  <link rel="stylesheet" href="css/style.css">
+  <link rel="stylesheet" href="css/webui.css">
 </head>
 <body>
 
@@ -17,7 +17,7 @@
   <div id="mltline">
    <table style='width: 100%; padding: 0px;'>
     <col width="20%"><col width="60%"><col width="20%">
-    <tr>
+    <tr style="height: 50%;">
      <td style="margin-top: 5px;">
       <button style="float: left; margin-left: 5px;" type="button" class="appbutton" id="mlt00"><span id="but00">00</span></button>
      </td>
@@ -60,7 +60,7 @@
       <button style="float: left; margin-left: 5px;" type="button" class="appbutton" id="mid00"><span id="but02">02</span></button>
      </td>
      <td>
-      <td><div id="timer">01:23:45</div></td>
+      <div id="timer">01:23:45</div>
      </td>
      <td>
       <button style="float: left; margin-left: 5px;" type="button" class="appbutton" id="mid20"><span id="but22">22</span></button>
@@ -69,7 +69,7 @@
    </table>
   </div>
 
-  <div id="hltline">
+  <div id="hltline" style="margin-bottom: 0;">
    <table style='width: 100%; padding: 0px;'>
     <col width="20%"><col width="60%"><col width="20%">
     <tr>
@@ -96,7 +96,7 @@
       <button style="float: left; margin-left: 5px;" type="button" class="appbutton" id="hlt20"><span id="but23">23</span></button>
      </td>
     </tr>
-    <tr>
+    <tr style="height: 50%;">
      <td>
       <button style="float: left; margin-left: 5px;" type="button" class="appbutton" id="hlt01"><span id="but04">04</span></button>
      </td>
@@ -115,21 +115,40 @@
     <p />Parts are written by Chris Morgan, Brett Beauregard, Blake Felt, LoBo and David Antliff.
    </div>
    <div>
-    <button style="margin-left: 150px; margin-top: 50px;" type="button" class="okbutton" id="ok_info">Ok</button>
+    <button type="button" class="okbutton" id="ok_info">Ok</button>
    </div>
   </div>
 
   <div id="prompt">
-   <button style="margin-left: 40px; margin-top: 100px;" type="button" class="promptbutton" id="button_ja">Ja</button>
+   <button style="margin-top: 100px;" type="button" class="promptbutton" id="button_ja">Ja</button>
    <button style="margin-left: 80px; margin-top: 100px;" type="button" class="promptbutton" id="button_nee">Nee</button>
   </div>
 
+  <div id="note">
+   <div style="color: yellow; text-align: center; margin-top: 105px;"><span id="note_msg">nm</span></div>
+   <div>
+    <button type="button" class="okbutton" id="ok_note">Ok</button>
+   </div>
+  </div>
+
+  <div id="brew">
+   <div style="color: yellow; margin-top: 20px;">Installatie: <span id="brew_msg1"></span></div>
+   <div style="color: yellow;">Recept: <span id="brew_msg2"></span></div>
+   <div style="color: white; margin-top: 20px;">Zie het display voor de details.</span></div>
+   <div>
+    <button style="position: absolute; left: 5px; top: 230px;" type="button" class="appbutton" id="button_stop">Stop</button>
+    <button style="position: absolute; left: 295px; top: 230px;" type="button" class="appbutton" id="button_start">Start</button>
+   </div>
+  </div>
+
  </div> <!-- webui_win -->
 
  <br>
- <form action="index.html"><input type="submit" class="button" value="Hoofdmenu"></form>
+ <div class="menu" style="margin-left: 45px;">
+  <form action="index.html"><input type="submit" class="button" value="Hoofdmenu"></form>
+ </div>
 
-<p id="test"></p>
+<p id="test"></p><p id="output"></p>
 
 <script type="text/javascript" src="js/webui.js"></script>
 
--- a/main/automation.c	Sat May 04 21:18:51 2019 +0200
+++ b/main/automation.c	Tue May 07 22:03:38 2019 +0200
@@ -40,6 +40,7 @@
 extern bool			System_TimeOk;			///< System time is valid
 extern sButton			Buttons[MAXBUTTONS];		///< Buttons definitions
 extern int			Main_Screen;			///< Current screen
+extern int			Sub_Screen;			///< Sub screen during mash
 extern DS18B20_State            *ds18b20_state;			///< DS18B20 state
 extern DRIVER_State             *driver_state;			///< Relays driver state
 extern SemaphoreHandle_t        xSemaphoreDS18B20;		///< DS18B20 lock semaphore
@@ -64,8 +65,10 @@
  */
 bool Automation_Init(void)
 {
+    char	msg[64];
+
     switch (Main_Screen) {
-	case MAIN_AUTO_INIT:
+	case MAIN_AUTO_INIT1:
 #ifdef CONFIG_TEMP_SENSORS_SIMULATOR
 		Fake_MLT = recipe.MashStep[0].Temperature - 10;
 		Fake_HLT = recipe.SpargeTemp - 15;
@@ -136,7 +139,7 @@
                 runtime.UseHLT = _UseHLT = false;
 		runtime.TimeBrewing = 0;
                 TimeBrewing = 0;
-		runtime.StageResume = MAIN_AUTO_INIT;
+		runtime.StageResume = MAIN_AUTO_INIT1;
 		runtime.StageTimeLeft = 0;
 		runtime.HopAddition = 0;
 		runtime.Logfile[0] = '\0';
@@ -147,6 +150,7 @@
 		vTaskDelay(250 / portTICK_PERIOD_MS);	// Allow some time
                 break;
 
+	case MAIN_AUTO_INIT2:
 	case MAIN_AUTO_DELAYSTART:
 		break;
 
@@ -196,7 +200,9 @@
                         MaxMash = 75.0;
                     }
                 }
-                MashState = MASH_NONE;
+                MashState = Sub_Screen = MASH_NONE;
+		snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
+		ws_server_send_text_clients("/ws", msg, strlen(msg));
                 pumpTime = 0;
                 pumpRest = false;
 		runtime.StageResume = Main_Screen;
@@ -227,13 +233,14 @@
                 Buttons_Add(255,  30, 60, 40, "-sp",  1);
                 Buttons_Show();
                 ESP_LOGI(TAG, "Mash done, going to boil.");
+		Sub_Screen = 0;
                 break;
 
 	case MAIN_AUTO_BOILING:
                 if (Resume) {
                     TimeLeft = runtime.StageTimeLeft * 60;
                 } else {
-                    // +1 minute for flameout and 2 seconds for a smooth transition.
+                    // +1 minute for flameout and for a smooth transition.
                     runtime.StageTimeLeft = TimeLeft = (recipe.BoilTime * 60) + 60;
                     runtime.StageResume = Main_Screen;
                     runtime.HopAddition = 0;
@@ -257,6 +264,7 @@
                 Buttons_Show();
                 ESP_LOGI(TAG, "Boil temperature reached, boil %d minutes", (TimeLeft / 60) -1);
 		log_annotation(ANNOTATION_STAGE, "Koken");
+		Sub_Screen = 0;
                 break;
 
 	case MAIN_AUTO_COOLING_H:
@@ -373,16 +381,20 @@
 bool Automation_Loop(void)
 {
     static bool beeped = false;
-    char	tmp[32];
+    char	tmp[32], msg[256];
     uint16_t	y;
 
     switch (Main_Screen) {
 
-	case MAIN_AUTO_INIT:
+	case MAIN_AUTO_INIT1:
 		/*
 		 * Present selected equipment and recipe.
 		 */
+		Sub_Screen = 1;
 		read_recipe(config.RecipeRec);
+		snprintf(msg, 255, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\",\"brew1\":\"%s\",\"brew2\":\"%s\"}", 
+			Main_Screen, Sub_Screen, equipment.Name, recipe.Name);
+		ws_server_send_text_clients("/ws", msg, strlen(msg));
 		y = 28;
 		TopMessage("Automaat");
 		TFT_setFont(DEFAULT_FONT, NULL);
@@ -462,15 +474,17 @@
 					break;
 
 			case 1:         loop = false;
+					Main_Screen = MAIN_AUTO_INIT2;
 					break;
 
 			default:        break;
 		    }
 		    vTaskDelay(20 / portTICK_PERIOD_MS);
 		}
-		if (Main_Screen == MAIN_AUTO_ABORT)
-		    break;
+		Buttons_Clear();
+		break;
 
+	case MAIN_AUTO_INIT2:
                 _UseHLT = false;
 		_bg = TFT_BLACK;
 		TFT_fillScreen(_bg);
@@ -598,7 +612,9 @@
                         driver_state->mlt_mode = MLT_MODE_PID;
                         xSemaphoreGive(xSemaphoreDriver);
                     }
-                    MashState = MASH_WAITTEMP;
+                    MashState = Sub_Screen = MASH_WAITTEMP;
+		    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
+                    ws_server_send_text_clients("/ws", msg, strlen(msg));
                     ESP_LOGI(TAG, "Mash step %d type: %s time: %d temp: %4.1f  min: %4.1f max: %4.1f",
 				    Main_Screen - MAIN_AUTO_MASH_IN, mashTypes[recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Type],
                                     stageTime, stageTemp, MinMash, MaxMash);
@@ -632,7 +648,9 @@
 					recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Infusion_temp);
 			TFT_print(temp_buf, CENTER, 135);
 			SoundPlay(SOUND_Prompt);
-			MashState = MASH_INFUSE;
+			MashState = Sub_Screen = MASH_INFUSE;
+			snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"%s\"}", Main_Screen, Sub_Screen, temp_buf);
+                	ws_server_send_text_clients("/ws", msg, strlen(msg));
 			if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
 			    // No heating during the infusion.
 			    driver_state->mlt_sp = stageTemp;
@@ -654,7 +672,9 @@
                     if ((temp_MLT >= stageTemp) && (Steady > 10)) {
                         SoundPlay(SOUND_TempReached);
                         TempReached = true;
-                        MashState = MASH_REST;
+                        MashState = Sub_Screen = MASH_REST;
+			snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
+                	ws_server_send_text_clients("/ws", msg, strlen(msg));
                         if (Main_Screen == MAIN_AUTO_MASH_IN) {
                             TimerSet(0);
                         } else {
@@ -756,7 +776,9 @@
                             TFT_setFont(DEJAVU24_FONT, NULL);
                             TFT_print("Mout storten?", CENTER, 135);
                             SoundPlay(SOUND_Prompt);
-			    MashState = MASH_ADD;
+			    MashState = Sub_Screen = MASH_ADD;
+			    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout storten?\"}", Main_Screen, Sub_Screen);
+                	    ws_server_send_text_clients("/ws", msg, strlen(msg));
 			    ESP_LOGI(TAG, "Mash add prompt");
 			    break;
                         }
@@ -778,7 +800,9 @@
                             SoundPlay(SOUND_Prompt);
                             beeped = false;
                             TimerSet(config.IodineTime * 60);
-			    MashState = MASH_IODINE;
+			    MashState = Sub_Screen = MASH_IODINE;
+			    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Jodium test?\"}", Main_Screen, Sub_Screen);
+                	    ws_server_send_text_clients("/ws", msg, strlen(msg));
 			    ESP_LOGI(TAG, "Mash iodine test prompt");
 			    break;
                         }
@@ -798,7 +822,9 @@
                             TFT_setFont(DEJAVU18_FONT, NULL);
                             TFT_print("Mout verwijderen?", CENTER, 135);
                             SoundPlay(SOUND_Prompt);
-			    MashState = MASH_REMOVE;
+			    MashState = Sub_Screen = MASH_REMOVE;
+			    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout verwijderen?\"}", Main_Screen, Sub_Screen);
+                	    ws_server_send_text_clients("/ws", msg, strlen(msg));
 			    ESP_LOGI(TAG, "Mash remove prompt");
 			    break;
                         }
@@ -851,7 +877,9 @@
 		    switch (Buttons_Scan()) {
 			case 0:     Main_Screen = MAIN_AUTO_ABORT;
 				    break;
-			case 1:	    MashState = MASH_WAITTEMP;
+			case 1:	    MashState = Sub_Screen = MASH_WAITTEMP;
+				    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
+                		    ws_server_send_text_clients("/ws", msg, strlen(msg));
 				    if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
 					// Start PID again.
 					driver_state->mlt_sp = stageTemp;
@@ -1018,6 +1046,7 @@
 			 */
 			Buttons_Clear();
 			TFT_fillScreen(_bg);
+			Sub_Screen = 1;
 			if (Main_Screen == MAIN_AUTO_COOLING_H) {
 			    stageTemp = 77.0;
 			} else if (Main_Screen == MAIN_AUTO_COOLING_M) {
@@ -1025,6 +1054,8 @@
 			} else {
 			    stageTemp = recipe.CoolTemp;
 			}
+			snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
+                        ws_server_send_text_clients("/ws", msg, strlen(msg));
 			CoolBeep = false;
 			ESP_LOGI(TAG, "Start cooling from %6.2f to %4.1f", ds18b20_state->mlt_temperature, stageTemp);
 			if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
@@ -1146,6 +1177,7 @@
                     	if (driver_state->mlt_pv <= driver_state->mlt_sp) {
                             SoundPlay(SOUND_TempReached);
                             Main_Screen++;
+			    Sub_Screen = 0;
                     	}
                     	xSemaphoreGive(xSemaphoreDriver);
                     }
@@ -1179,6 +1211,9 @@
 			 */
 			Buttons_Clear();
 			TFT_fillScreen(_bg);
+			Sub_Screen = 1;
+                        snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
+                        ws_server_send_text_clients("/ws", msg, strlen(msg));
 			if (Main_Screen == MAIN_AUTO_WHIRLPOOL9) {
 			    TimeWhirlPool = recipe.Whirlpool9;
 			    if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
@@ -1227,7 +1262,7 @@
 			ESP_LOGI(TAG, "Whirlpool %d minutes, sp %4.1f", TimeWhirlPool, driver_state->mlt_sp);
 			Buttons_Add(255, 120, 60, 40, "+1m", 0);
 			Buttons_Add(  5, 120, 60, 40, "-1m", 1);
-			Buttons_Add(130, 200, 60, 40, "Pomp",  2);
+			Buttons_Add(255, 200, 60, 40, "Pomp",  2);
 			Buttons_Show();
 		    }
 		} else {
--- a/main/brewboard.c	Sat May 04 21:18:51 2019 +0200
+++ b/main/brewboard.c	Tue May 07 22:03:38 2019 +0200
@@ -21,6 +21,7 @@
 
 int 				Main_Screen = MAIN_MODE_UNKNOWN;	///< Screen number
 int				Old_Screen = MAIN_MODE_UNKNOWN;		///< Previous screen number
+int				Sub_Screen = 0;				///< Subscreen during mash
 bool				System_TimeOk = false;			///< System time status
 const esp_app_desc_t		*app_desc = NULL;
 
--- a/main/config.h	Sat May 04 21:18:51 2019 +0200
+++ b/main/config.h	Tue May 07 22:03:38 2019 +0200
@@ -107,7 +107,8 @@
     MAIN_TOOLS_FILES_RESTORE,		///< Main files restore.
     MAIN_TOOLS_FILES_BACKUP,		///< Main files backup.
     MAIN_TOOLS_UPDATES,			///< Main Updates.
-    MAIN_AUTO_INIT,			///< Automatic start
+    MAIN_AUTO_INIT1 = 96,		///< Automatic start part 1
+    MAIN_AUTO_INIT2,			///< Automatic start part 2
     MAIN_AUTO_DELAYSTART,		///< Delayed start
     MAIN_AUTO_HEATUP,			///< Heatup the system
     MAIN_AUTO_MASH_IN = 100,		///< Mash-in
--- a/main/task_sound.c	Sat May 04 21:18:51 2019 +0200
+++ b/main/task_sound.c	Tue May 07 22:03:38 2019 +0200
@@ -43,14 +43,26 @@
  */
 void BuzzerPlay(const uint16_t *sound)
 {
+    char	msg[16];
+
     for (int i = 1; i <= sound[0]; i += 2) {
 	gpio_set_level(PIEZO_BUZZER, 1);
+	if (sound != _sound_Startup) {
+	    snprintf(msg, 15, "{\"beep\":\"1\"}");
+    	    ws_server_send_text_clients("/ws", msg, strlen(msg));
+	}
 	vTaskDelay(sound[i] / portTICK_PERIOD_MS);
 	gpio_set_level(PIEZO_BUZZER, 0);
+//	if (sound != _sound_Startup) {
+  //          snprintf(msg, 15, "{\"beep\":\"0\"}");
+  //          ws_server_send_text_clients("/ws", msg, strlen(msg));
+//        }
 	vTaskDelay(sound[i+1] / portTICK_PERIOD_MS);
     }
 
     gpio_set_level(PIEZO_BUZZER, 0);	// Just make sure the sound is off.
+//    snprintf(msg, 15, "{\"beep\":\"0\"}");
+//    ws_server_send_text_clients("/ws", msg, strlen(msg));
 }
 
 
--- a/main/task_tft.c	Sat May 04 21:18:51 2019 +0200
+++ b/main/task_tft.c	Tue May 07 22:03:38 2019 +0200
@@ -13,8 +13,9 @@
 spi_lobo_device_handle_t	tsspi = NULL;			///< Touchscreen SPI handler
 extern sButton			Buttons[MAXBUTTONS];		///< 40 buttons on a screen.
 time_t				now;				///< Current time
+time_t				last = 0;			///< Last time
 struct tm			timeinfo;			///< Current time structure
-char				s_timer[10];			///< Timer sctring buffer
+char				s_timer[10];			///< Timer string buffer
 char				s_top_msg[64];			///< Top message string buffer
 
 extern float			stageTemp;
@@ -37,6 +38,7 @@
 #define SPI_BUS			TFT_HSPI_HOST			///< SPI bus for the TFT, TFT_VSPI_HOST or TFT_HSPI_HOST
 
 extern int			Main_Screen;
+extern int			Sub_Screen;
 extern int			Old_Screen;
 extern int			MLT_pin;
 extern int			HLT_pin;
@@ -471,10 +473,10 @@
 	    hlt_sp[0] = '\0';
 	    hlt_power[0] = '\0';
 	}
-    	snprintf(msg, 1023, "{\"main\":\"%d\",\"mlt_led\":\"%d\",\"mlt_pv\":\"%7.3f\",\"mlt_sp\":\"%s\",\"mlt_power\":\"%s\"" \
+    	snprintf(msg, 1023, "{\"main\":\"%d\",\"sub\":\"%d\",\"mlt_led\":\"%d\",\"mlt_pv\":\"%7.3f\",\"mlt_sp\":\"%s\",\"mlt_power\":\"%s\"" \
 		    ",\"pump_led\":\"%d\",\"hlt_led\":\"%d\",\"hlt_pv\":\"%7.3f\",\"hlt_sp\":\"%s\",\"hlt_power\":\"%s\"" \
 		    ",\"timer\":\"%s\",\"top_msg\":\"%s\"}",
-		    Main_Screen, (MLT_pin) ? 1:0, driver_state->mlt_pv, mlt_sp, mlt_power,
+		    Main_Screen, Sub_Screen, (MLT_pin) ? 1:0, driver_state->mlt_pv, mlt_sp, mlt_power,
 		    (Pump_pin) ? 1:0, (HLT_pin) ? 1:0, driver_state->hlt_pv, hlt_sp, hlt_power,
 		    s_timer, s_top_msg);
 
@@ -488,7 +490,7 @@
 
 void task_tft(void *pvParameter)
 {
-    char	msg[32];
+    char	msg[64];
 
     ESP_LOGI(TAG, "Initialize TFT/Touch task");
 
@@ -529,7 +531,8 @@
 	    /*
 	     * With each screenchange, remove the timer too.
 	     */
-	    snprintf(msg, 31, "{\"main\":\"%d\",\"timer\":\"\"}", Main_Screen);
+	    Sub_Screen = 0;
+	    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
 	    ws_server_send_text_clients("/ws", msg, strlen(msg));
 
 	    ESP_LOGI(TAG, "Change screen %d to %d", Old_Screen, Main_Screen);
@@ -619,7 +622,8 @@
 			Updates_Init();
 			break;
 
-		case MAIN_AUTO_INIT:
+		case MAIN_AUTO_INIT1:
+		case MAIN_AUTO_INIT2:
 		case MAIN_AUTO_DELAYSTART:
 		case MAIN_AUTO_HEATUP:
 		case MAIN_AUTO_MASH_IN:
@@ -667,17 +671,20 @@
 		}
 		switch (Buttons_Scan()) {
 		    case 0:	Main_Screen = MAIN_MANUAL_INIT;	break;
-		    case 1:	Main_Screen = MAIN_AUTO_INIT;	break;
-		    case 2:	Main_Screen = MAIN_INFO;		break;
-		    case 3:	Main_Screen = MAIN_TOOLS;		break;
+		    case 1:	Main_Screen = MAIN_AUTO_INIT1;	break;
+		    case 2:	Main_Screen = MAIN_INFO;	break;
+		    case 3:	Main_Screen = MAIN_TOOLS;	break;
 		    default:	break;
 		}
-		if (System_TimeOk) {
+		if (System_TimeOk && (now != last)) {
+		    last = now;
 		    strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
 		    TFT_setFont(DEJAVU18_FONT, NULL);
 		    _bg = TFT_BLACK;
 		    _fg = TFT_ORANGE;
 		    TFT_print(strftime_buf, CENTER, 125);
+		    snprintf(msg, 63, "{\"timer\":\"%s\"}", strftime_buf);	// Fix string termination and only send once/second.
+		    ws_server_send_text_clients("/ws", msg, strlen(msg));
 		}
 		break;
 
@@ -736,7 +743,8 @@
 		}
 		break;
 
-	    case MAIN_AUTO_INIT:
+	    case MAIN_AUTO_INIT1:
+	    case MAIN_AUTO_INIT2:
 	    case MAIN_AUTO_DELAYSTART:
 	    case MAIN_AUTO_HEATUP:
 	    case MAIN_AUTO_MASH_IN:
--- a/main/updates.c	Sat May 04 21:18:51 2019 +0200
+++ b/main/updates.c	Tue May 07 22:03:38 2019 +0200
@@ -219,7 +219,7 @@
 	} else if (data_read == 0) {
 	    break;
 	}
-	vTaskDelay(5 / portTICK_PERIOD_MS);
+	vTaskDelay(10 / portTICK_PERIOD_MS);
     }
     fclose(f);
 
@@ -278,8 +278,6 @@
 	fgets(v2, 11, f);
 	fclose(f);
     }
-//    ESP_LOG_BUFFER_HEXDUMP(TAG, v1, strlen(v1), ESP_LOG_INFO);
-//    ESP_LOG_BUFFER_HEXDUMP(TAG, v2, strlen(v2), ESP_LOG_INFO);
     if (strcmp(v1, v2) == 0) {
 	ESP_LOGI(TAG, "/spiffs is up to date");
 	TFT_print("Ok\r\n", LASTX, LASTY);
--- a/sdkconfig	Sat May 04 21:18:51 2019 +0200
+++ b/sdkconfig	Tue May 07 22:03:38 2019 +0200
@@ -224,7 +224,7 @@
 CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32
 # CONFIG_ESP32_WIFI_DEBUG_LOG_ENABLE is not set
 CONFIG_ESP32_WIFI_IRAM_OPT=y
-CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y
+# CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE is not set
 # CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set
 CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20
 CONFIG_ESP32_PHY_MAX_TX_POWER=20

mercurial