Added reconnect-websocket javascript. Removed some debugging log messages.

Sat, 06 Jun 2020 16:52:44 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 06 Jun 2020 16:52:44 +0200
changeset 78
b58e0c9897e1
parent 77
66c77497d86d
child 79
cb5c73a8ae90

Added reconnect-websocket javascript. Removed some debugging log messages.

image/files.list file | annotate | diff | comparison | revisions
image/version.txt file | annotate | diff | comparison | revisions
image/w/js/reconnecting-ws.min.js file | annotate | diff | comparison | revisions
image/w/js/reconnecting-ws.min.js.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
--- a/image/files.list	Sat Jun 06 13:28:46 2020 +0200
+++ b/image/files.list	Sat Jun 06 16:52:44 2020 +0200
@@ -8,6 +8,7 @@
 w/js/Chart.min.js.gz
 w/js/ch-plug-anno.min.js.gz
 w/js/jquery-1.12.4.min.js.gz
+w/js/reconnecting-ws.min.js.gz
 w/js/webui.js
 w/chart.html
 w/index.html.gz
--- a/image/version.txt	Sat Jun 06 13:28:46 2020 +0200
+++ b/image/version.txt	Sat Jun 06 16:52:44 2020 +0200
@@ -1,1 +1,1 @@
-0.3.7b
+0.3.7i
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/image/w/js/reconnecting-ws.min.js	Sat Jun 06 16:52:44 2020 +0200
@@ -0,0 +1,1 @@
+!function(a,b){"function"==typeof define&&define.amd?define([],b):"undefined"!=typeof module&&module.exports?module.exports=b():a.ReconnectingWebSocket=b()}(this,function(){function a(b,c,d){function l(a,b){var c=document.createEvent("CustomEvent");return c.initCustomEvent(a,!1,!1,b),c}var e={debug:!1,automaticOpen:!0,reconnectInterval:1e3,maxReconnectInterval:3e4,reconnectDecay:1.5,timeoutInterval:2e3};d||(d={});for(var f in e)this[f]="undefined"!=typeof d[f]?d[f]:e[f];this.url=b,this.reconnectAttempts=0,this.readyState=WebSocket.CONNECTING,this.protocol=null;var h,g=this,i=!1,j=!1,k=document.createElement("div");k.addEventListener("open",function(a){g.onopen(a)}),k.addEventListener("close",function(a){g.onclose(a)}),k.addEventListener("connecting",function(a){g.onconnecting(a)}),k.addEventListener("message",function(a){g.onmessage(a)}),k.addEventListener("error",function(a){g.onerror(a)}),this.addEventListener=k.addEventListener.bind(k),this.removeEventListener=k.removeEventListener.bind(k),this.dispatchEvent=k.dispatchEvent.bind(k),this.open=function(b){h=new WebSocket(g.url,c||[]),b||k.dispatchEvent(l("connecting")),(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","attempt-connect",g.url);var d=h,e=setTimeout(function(){(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","connection-timeout",g.url),j=!0,d.close(),j=!1},g.timeoutInterval);h.onopen=function(){clearTimeout(e),(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","onopen",g.url),g.protocol=h.protocol,g.readyState=WebSocket.OPEN,g.reconnectAttempts=0;var d=l("open");d.isReconnect=b,b=!1,k.dispatchEvent(d)},h.onclose=function(c){if(clearTimeout(e),h=null,i)g.readyState=WebSocket.CLOSED,k.dispatchEvent(l("close"));else{g.readyState=WebSocket.CONNECTING;var d=l("connecting");d.code=c.code,d.reason=c.reason,d.wasClean=c.wasClean,k.dispatchEvent(d),b||j||((g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","onclose",g.url),k.dispatchEvent(l("close")));var e=g.reconnectInterval*Math.pow(g.reconnectDecay,g.reconnectAttempts);setTimeout(function(){g.reconnectAttempts++,g.open(!0)},e>g.maxReconnectInterval?g.maxReconnectInterval:e)}},h.onmessage=function(b){(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","onmessage",g.url,b.data);var c=l("message");c.data=b.data,k.dispatchEvent(c)},h.onerror=function(b){(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","onerror",g.url,b),k.dispatchEvent(l("error"))}},1==this.automaticOpen&&this.open(!1),this.send=function(b){if(h)return(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","send",g.url,b),h.send(b);throw"INVALID_STATE_ERR : Pausing to reconnect websocket"},this.close=function(a,b){"undefined"==typeof a&&(a=1e3),i=!0,h&&h.close(a,b)},this.refresh=function(){h&&h.close()}}return a.prototype.onopen=function(){},a.prototype.onclose=function(){},a.prototype.onconnecting=function(){},a.prototype.onmessage=function(){},a.prototype.onerror=function(){},a.debugAll=!1,a.CONNECTING=WebSocket.CONNECTING,a.OPEN=WebSocket.OPEN,a.CLOSING=WebSocket.CLOSING,a.CLOSED=WebSocket.CLOSED,a});
Binary file image/w/js/reconnecting-ws.min.js.gz has changed
--- a/image/w/js/webui.js	Sat Jun 06 13:28:46 2020 +0200
+++ b/image/w/js/webui.js	Sat Jun 06 16:52:44 2020 +0200
@@ -1,6 +1,6 @@
-document.getElementById("test").innerHTML = "WebSocket is not connected";
+document.getElementById("wsstatus").innerHTML = "WebSocket is not connected";
 
-var websocket = new WebSocket('ws://'+location.hostname+'/ws');
+var websocket = new ReconnectingWebSocket('ws://'+location.hostname+'/ws');
 
 var Beep= new Audio( "data:audio/wav;base64,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 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=" );
 
@@ -417,7 +417,7 @@
 
 websocket.onopen = function(evt) {
   console.log('WebSocket connection opened');
-  document.getElementById("test").innerHTML = "";
+  document.getElementById("wsstatus").innerHTML = "";
 }
 
 /*
@@ -438,12 +438,12 @@
 
 websocket.onclose = function(evt) {
 	console.log('Websocket connection closed');
-	document.getElementById("test").innerHTML = "WebSocket closed";
+	document.getElementById("wsstatus").innerHTML = "WebSocket closed";
 }
 
 websocket.onerror = function(evt) {
 	console.log('Websocket error: ' + evt);
-	document.getElementById("test").innerHTML = "WebSocket error????!!!1!!";
+	document.getElementById("wsstatus").innerHTML = "WebSocket error????!!!1!!";
 }
 
 
--- a/image/w/webui.html	Sat Jun 06 13:28:46 2020 +0200
+++ b/image/w/webui.html	Sat Jun 06 16:52:44 2020 +0200
@@ -6,6 +6,7 @@
   <meta http-equiv="X-UA-Compatible" content="IE=edge" />
   <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>
+  <script src="js/reconnecting-ws.min.js"></script>
   <link rel="stylesheet" href="css/webui.css">
 </head>
 <body>
@@ -148,7 +149,7 @@
   <form action="index.html"><input type="submit" class="button" value="Hoofdmenu"></form>
  </div>
 
-<p id="test"></p><p id="output"></p>
+<p id="wsstatus"></p><p id="output"></p>
 
 <script type="text/javascript" src="js/webui.js"></script>
 
--- a/main/automation.c	Sat Jun 06 13:28:46 2020 +0200
+++ b/main/automation.c	Sat Jun 06 16:52:44 2020 +0200
@@ -228,9 +228,8 @@
 			MaxMash = 74.75;
                 }
                 MashState = Sub_Screen = MASH_NONE;
-		snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"step\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen, runtime.MashStep);
+		snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
 		ws_server_send_text_clients((char *)"/ws", msg, strlen(msg));
-		ESP_LOGI(TAG, "%s", msg);
                 pumpTime = 0;
                 pumpRest = false;
 		runtime.StageResume = Main_Screen;
@@ -649,8 +648,7 @@
                         xSemaphoreGive(xSemaphoreDriver);
                     }
                     MashState = Sub_Screen = MASH_WAITTEMP;
-		    ESP_LOGI(TAG, "** Step %d Stage %d Malt %s", runtime.MashStep, MashState, runtime.MaltAdded ? (char *)"yes":(char *)"no");
-		    snprintf(msg, 255, "{\"main\":\"%d\",\"sub\":\"%d\",\"step\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen, runtime.MashStep);
+		    snprintf(msg, 255, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
                     ws_server_send_text_clients((char *)"/ws", msg, strlen(msg));
                     log_msg(TAG, "Mash step %d type: %s time: %d sp: %6.4f  sv: %6.4f",
 				    runtime.MashStep, mashTypes[recipe.MashStep[runtime.MashStep].Type],
@@ -667,7 +665,7 @@
 		    }
 
 		    if (! runtime.MaltAdded) {
-			TopMessage((char *)"Opwarmen MLT");
+			TopMessage((char *)"Maischwater opwarmen");
                     } else if (strlen(recipe.MashStep[runtime.MashStep].Name)) {
                         TopMessage(recipe.MashStep[runtime.MashStep].Name);
                     } else {
@@ -696,8 +694,7 @@
 			}
 			TFT_print(temp_buf, CENTER, 135);
 			SoundPlay(SOUND_Prompt);
-			snprintf(msg, 255, "{\"main\":\"%d\",\"sub\":\"%d\",\"step\":\"%d\",\"timer\":\"%s\"}",
-					Main_Screen, Sub_Screen, runtime.MashStep, temp_buf);
+			snprintf(msg, 255, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"%s\"}", Main_Screen, Sub_Screen, temp_buf);
                 	ws_server_send_text_clients((char *)"/ws", msg, strlen(msg));
 			if (recipe.MashStep[runtime.MashStep].Type == MASHTYPE_INFUSION) {
 			    if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
@@ -722,8 +719,7 @@
                         SoundPlay(SOUND_TempReached);
                         TempReached = true;
                         MashState = Sub_Screen = MASH_REST;
-			ESP_LOGI(TAG, "** Step %d Stage %d Malt %s", runtime.MashStep, MashState, runtime.MaltAdded ? (char *)"yes":(char *)"no");
-			snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"step\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen, runtime.MashStep);
+			snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
                 	ws_server_send_text_clients((char *)"/ws", msg, strlen(msg));
                         if (! runtime.MaltAdded && runtime.MashStep == 0) {
                             TimerSet(0);
@@ -796,7 +792,6 @@
                     }
 
                     if (TimeLeft == 0) {
-			ESP_LOGI(TAG, "** Step %d Stage %d Malt %s", runtime.MashStep, MashState, runtime.MaltAdded ? (char *)"yes":(char *)"no");
 			runtime.StageTimeLeft = 0;
 			updateRuntime = true;
                         if (runtime.MashStep == 0 && ! runtime.MaltAdded && config.AskAdd) {
@@ -821,8 +816,7 @@
                             TFT_print((char *)"Mout storten?", CENTER, 135);
                             SoundPlay(SOUND_Prompt);
 			    MashState = Sub_Screen = MASH_ADD;
-			    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"step\":\"%d\",\"timer\":\"Mout storten?\"}",
-						Main_Screen, Sub_Screen, runtime.MashStep);
+			    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout storten?\"}", Main_Screen, Sub_Screen);
                 	    ws_server_send_text_clients((char *)"/ws", msg, strlen(msg));
 			    log_msg(TAG, "Mash add prompt");
 			    break;
@@ -846,9 +840,7 @@
                             beeped = false;
                             TimerSet(config.IodineTime * 60);
 			    MashState = Sub_Screen = MASH_IODINE;
-		ESP_LOGI(TAG, "** Step %d Stage %d Malt %s", runtime.MashStep, MashState, runtime.MaltAdded ? (char *)"yes":(char *)"no");
-			    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"step\":\"%d\",\"timer\":\"Jodium test?\"}",
-						Main_Screen, Sub_Screen, runtime.MashStep);
+			    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Jodium test?\"}", Main_Screen, Sub_Screen);
                 	    ws_server_send_text_clients((char *)"/ws", msg, strlen(msg));
 			    log_msg(TAG, "Mash iodine test prompt");
 			    break;
@@ -870,9 +862,7 @@
                             TFT_print((char *)"Mout verwijderen?", CENTER, 135);
                             SoundPlay(SOUND_Prompt);
 			    MashState = Sub_Screen = MASH_REMOVE;
-		ESP_LOGI(TAG, "** Step %d Stage %d Malt %s", runtime.MashStep, MashState, runtime.MaltAdded ? (char *)"yes":(char *)"no");
-			    snprintf(msg, 127, "{\"main\":\"%d\",\"sub\":\"%d\",\"step\":\"%d\",\"timer\":\"Mout verwijderen?\"}",
-						Main_Screen, Sub_Screen, runtime.MashStep);
+			    snprintf(msg, 127, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout verwijderen?\"}", Main_Screen, Sub_Screen);
                 	    ws_server_send_text_clients((char *)"/ws", msg, strlen(msg));
 			    log_msg(TAG, "Mash remove prompt");
 			    break;
@@ -922,7 +912,6 @@
 				    }
 				    TFT_fillRect(0, 120, 320, 50, TFT_BLACK);
 				    Buttons_Clear();
-		ESP_LOGI(TAG, "** Step %d Stage %d Malt %s", runtime.MashStep, MashState, runtime.MaltAdded ? (char *)"yes":(char *)"no");	
 				    break;
 			default:    break;
 		    }
@@ -969,8 +958,7 @@
 					log_annotation(ANNOTATION_EVENT, (char *)"Eind decoctie");
 				    }
 				    MashState = Sub_Screen = MASH_WAITTEMP;
-				    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"step\":\"%d\",\"timer\":\"\"}",
-							Main_Screen, Sub_Screen, runtime.MashStep);
+				    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
                                     ws_server_send_text_clients((char *)"/ws", msg, strlen(msg));
 				    break;
 			default:    break;

mercurial