In some of my applications I get ongoing data from websockets and I want some visual indication that the websocket is connected and receiving data, so I added an LED indicator much like a network router or switch would have.
Whereever I want the LED, I add div to show the LED.
<div class="led" id="ws-led"> <div class="led-red-off"> </div> </div>
then add some CSS rules to make it look like an LED indicator
div.led{
display : inline-block;
vertical-align : bottom;
}
div.led-red-off,
div.led-red-on,
div.led-green-off,
div.led-green-on {
border : 0;
border-radius : 50%;
height : 1em;
width : 1em;
vertical-align : middle;
background-repeat : no-repeat;
display : inline-block;
}
div.led-red-on {
background : #F44336; opacity: 1;
}
div.led-green-on {
background : #4CAF50; opacity: 1;
}
div.led-red-off {
background : #F44336; opacity: .5;
}
div.led-green-off {
background : #4CAF50; opacity: .5;
}
and finally, some JS code to make them blink.
var wsLED = document.getElementById('ws-led');
// connected to the Websocket server (general)
function connected(greeting) {
// change the LED from initial red to green
if (wsLED) wsLED.firstChild.setAttribute("class", "led-green-off");
}
// connection to Websocket server lost
function disconnected() {
// if we loose the websocket connection, change the LED to red
if (wsLED) wsLED.firstChild.setAttribute("class", "led-red-on");
}
/**
* logWSActivity
*
* log some WS activity
*/
function logWSActivity(...args) {
console.log(...args);
flashLED(wsLED);
}
/**
* flashLEDs
*
* The visual effect of the flashing LEDs is done by switching the
* CSS class for a 10th of a second per activity. If a new
* activity happens within that time, the timeout to turn it back
* off is reset to a new 10th of a second.
*/
var ledOffTimeout;
function flashLED(led) {
// flash activity LED
if (led) {
if (ledOffTimeout) { clearTimeout(ledOffTimeout); }
led.firstChild.setAttribute("class", "led-green-on");
ledOffTimeout = setTimeout(function() {
led.firstChild.setAttribute("class", "led-green-off"); }, 100);
}
}
No comments:
Post a Comment