130 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE html>
 | |
| <html>
 | |
| 	<head>
 | |
| 		<meta charset="utf-8">
 | |
| 		<meta name="viewport" content="width=device-width, user-scalable=no">
 | |
| 		<link rel="stylesheet" type="text/css" href="css/siimple.min.css">
 | |
| 		<link rel="stylesheet" type="text/css" href="css/style.css">
 | |
| 		<link rel="shortcut icon" href="img/favicon.png">
 | |
| 		<title>HTTP Server</title>
 | |
| 	</head>
 | |
| 	<body>
 | |
| 		<ul class="navbar">
 | |
| 			<li><a href="/">Home</a></li>
 | |
| 			<li><a class="active" href="websockets">WebSockets</a></li>
 | |
| 			<li><a href="about">About</a></li>
 | |
| 		</ul>
 | |
| 
 | |
| 		<div class="grid main">
 | |
| 			<h1>WebSockets Demo</h1>
 | |
| 			<div id="status_box" class="alert alert-info">Loading..</div>
 | |
| 			<p>This page is similar to the home page but uses WebSockets for real-time updates.</p>
 | |
| 			<div class="cover" align="center">
 | |
| 				<canvas id="chartCanvas" width="512" height="100"></canvas>
 | |
| 				<p/>
 | |
| 				<p>LED Control</p>
 | |
| 				<div class="onoffswitch">
 | |
| 					<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="led-switch" onclick="gpio()">
 | |
| 					<label class="onoffswitch-label" for="led-switch">
 | |
| 						<span class="onoffswitch-inner"></span>
 | |
| 						<span class="onoffswitch-switch"></span>
 | |
| 					</label>
 | |
| 				</div>
 | |
| 			</div>
 | |
| 
 | |
| 			<h1>Server Status</h1>
 | |
| 			<table class="table table-striped">
 | |
| 				<tr>
 | |
| 					<td><b>Uptime:</b></td>
 | |
| 					<td id="uptime"></td>
 | |
| 				</tr>
 | |
| 				<tr>
 | |
| 					<td><b>Free heap:</b></td>
 | |
| 					<td id="heap"></td>
 | |
| 				</tr>
 | |
| 				<tr>
 | |
| 					<td><b>LED state:</b></td>
 | |
| 					<td id="led"></td>
 | |
| 				</tr>
 | |
| 			</table>
 | |
| 
 | |
| 			<h1>How it works</h1>
 | |
| 			<p>This demo uses 2 WebScokets. Status parameters are streamed by the server in JSON format every 2 seconds.
 | |
| 				A <code>websocket_task</code> is created each time a specific URI is requested.</p>
 | |
| 			<p>ADC values are being continuously polled by the client (i.e. your browser).
 | |
| 				Each time a WebSocket frame is received on the server side, <code>websocket_cb</code> function is being called.</p>
 | |
| 		</div>
 | |
| 
 | |
| 		<script type="text/javascript" src="js/smoothie_min.js"></script>
 | |
| 		<script>
 | |
| 			var ws;
 | |
| 			var retries;
 | |
| 			var series = new TimeSeries();
 | |
| 			window.onload = function() {
 | |
| 				wsOpen();
 | |
| 				startPolling();
 | |
| 			}
 | |
| 			function setMsg(cls, text) {
 | |
| 				sbox = document.getElementById('status_box');
 | |
| 				sbox.className = "alert alert-" + cls;
 | |
| 				sbox.innerHTML = text;
 | |
| 				console.log(text);
 | |
| 			}
 | |
| 			function startPolling() {
 | |
| 				var chart = new SmoothieChart({millisPerPixel:11,grid:{fillStyle:'#ffffff',strokeStyle:'#ffffff',borderVisible:false},
 | |
| 					labels:{fillStyle:'#000000'},maxValue:1024,minValue:0});
 | |
| 				chart.addTimeSeries(series, {lineWidth:2,strokeStyle:'#03a9f4',fillStyle:'#f1f5fa'});
 | |
| 				chart.streamTo(document.getElementById("chartCanvas"), 500);
 | |
| 				setInterval(function() { wsWrite('A'); }, 500);
 | |
| 			}
 | |
| 			function onMessage(evt) {
 | |
| 				retries = 0;
 | |
| 				var dv = new DataView(evt.data);
 | |
| 				var val = dv.getUint16(0);
 | |
| 				if (val == 0xBEEF || val == 0xDEAD)
 | |
| 					console.log("LED switched");
 | |
| 				else
 | |
| 					series.append(new Date().getTime(), val);
 | |
| 			}
 | |
| 			function wsOpen() {
 | |
| 				if (ws === undefined || ws.readyState != 0) {
 | |
| 					if (retries)
 | |
| 						setMsg("error", "WebSocket timeout, retrying..");
 | |
| 					else
 | |
| 						setMsg("info", "Opening WebSocket..");
 | |
| 					ws = new WebSocket("ws://" + location.host);
 | |
| 					ws.binaryType = 'arraybuffer';
 | |
| 					ws.onopen = function(evt) { retries = 0; setMsg("done", "WebSocket is open."); };
 | |
| 					ws.onerror = function(evt) { setMsg("error", "WebSocket error!"); };
 | |
| 					ws.onmessage = function(evt) { onMessage(evt); };
 | |
| 					wsOpenStream();
 | |
| 					retries = 0;
 | |
| 				}
 | |
| 			}
 | |
| 			function wsOpenStream() {
 | |
| 				var uri = "/stream"
 | |
| 				var ws = new WebSocket("ws://" + location.host + uri);
 | |
| 				ws.onmessage = function(evt) {
 | |
| 					console.log(evt.data);
 | |
| 					var stats = JSON.parse(evt.data);
 | |
| 					console.log(stats);
 | |
| 					document.getElementById('uptime').innerHTML = stats.uptime + ' seconds';
 | |
| 					document.getElementById('heap').innerHTML = stats.heap + ' bytes';
 | |
| 					document.getElementById('led').innerHTML = (stats.led == 1) ? 'On' : 'Off';
 | |
| 				};
 | |
| 			}
 | |
| 			function wsWrite(data) {
 | |
| 				if (ws.readyState == 3 || retries++ > 5)
 | |
| 					wsOpen();
 | |
| 				else if (ws.readyState == 1)
 | |
| 					ws.send(data);
 | |
| 			}
 | |
| 			function gpio() {
 | |
| 				if (document.getElementById('led-switch').checked)
 | |
| 					wsWrite('E');
 | |
| 				else
 | |
| 					wsWrite('D');
 | |
| 			}
 | |
| 		</script>
 | |
| 	</body>
 | |
| </html>
 |