2021-02-05 22:03:02 +00:00
const UI _INITIAL _GUI = 200 ; const UI _RELOAD = 201 ; const UPDATE _OFFSET = 100 ; const UI _TITEL = 0 ; const UI _PAD = 1 ; const UPDATE _PAD = 101 ; const UI _CPAD = 2 ; const UPDATE _CPAD = 102 ; const UI _BUTTON = 3 ; const UPDATE _BUTTON = 103 ; const UI _LABEL = 4 ; const UPDATE _LABEL = 104 ; const UI _SWITCHER = 5 ; const UPDATE _SWITCHER = 105 ; const UI _SLIDER = 6 ; const UPDATE _SLIDER = 106 ; const UI _NUMBER = 7 ; const UPDATE _NUMBER = 107 ; const UI _TEXT _INPUT = 8 ; const UPDATE _TEXT _INPUT = 108 ; const UI _GRAPH = 9 ; const ADD _GRAPH _POINT = 10 ; const CLEAR _GRAPH = 109 ; const UI _TAB = 11 ; const UPDATE _TAB = 111 ; const UI _SELECT = 12 ; const UPDATE _SELECT = 112 ; const UI _OPTION = 13 ; const UPDATE _OPTION = 113 ; const UI _MIN = 14 ; const UPDATE _MIN = 114 ; const UI _MAX = 15 ; const UPDATE _MAX = 115 ; const UI _STEP = 16 ; const UPDATE _STEP = 116 ; const UI _GAUGE = 17 ; const UPDATE _GAUGE = 117 ; const UI _ACCEL = 18 ; const UPTDATE _ACCEL = 117 ; const UP = 0 ; const DOWN = 1 ; const LEFT = 2 ; const RIGHT = 3 ; const CENTER = 4 ; const C _TURQUOISE = 0 ; const C _EMERALD = 1 ; const C _PETERRIVER = 2 ; const C _WETASPHALT = 3 ; const C _SUNFLOWER = 4 ; const C _CARROT = 5 ; const C _ALIZARIN = 6 ; const C _DARK = 7 ; const C _NONE = 255 ; var graphData = new Array ( ) ; var hasAccel = false ; var sliderContinuous = false ; function colorClass ( colorId ) { colorId = Number ( colorId ) ; switch ( colorId ) { case C _TURQUOISE : return "turquoise" ; case C _EMERALD : return "emerald" ; case C _PETERRIVER : return "peterriver" ; case C _WETASPHALT : return "wetasphalt" ; case C _SUNFLOWER : return "sunflower" ; case C _CARROT : return "carrot" ; case C _ALIZARIN : return "alizarin" ; case C _NONE : return "dark" ; default : return "" ; } }
var websock ; var websockConnected = false ; function requestOrientationPermission ( ) { }
function saveGraphData ( ) { localStorage . setItem ( "espuigraphs" , JSON . stringify ( graphData ) ) ; }
function restoreGraphData ( id ) { var savedData = localStorage . getItem ( "espuigraphs" , graphData ) ; if ( savedData != null ) { savedData = JSON . parse ( savedData ) ; return savedData [ id ] ; }
return [ ] ; }
function restart ( ) { $ ( document ) . add ( "*" ) . off ( ) ; $ ( "#row" ) . html ( "" ) ; websock . close ( ) ; start ( ) ; }
function conStatusError ( ) { websockConnected = false ; $ ( "#conStatus" ) . removeClass ( "color-green" ) ; $ ( "#conStatus" ) . addClass ( "color-red" ) ; $ ( "#conStatus" ) . html ( "Error / No Connection ↻" ) ; $ ( "#conStatus" ) . off ( ) ; $ ( "#conStatus" ) . on ( { click : restart , } ) ; }
function handleVisibilityChange ( ) { if ( ! websockConnected && ! document . hidden ) { restart ( ) ; } }
function start ( ) { document . addEventListener ( "visibilitychange" , handleVisibilityChange , false ) ; if ( window . location . port != "" || window . location . port != 80 || window . location . port != 443 ) { websock = new WebSocket ( "ws://" + window . location . hostname + ":" + window . location . port + "/ws" ) ; } else { websock = new WebSocket ( "ws://" + window . location . hostname + "/ws" ) ; }
websock . onopen = function ( evt ) { console . log ( "websock open" ) ; $ ( "#conStatus" ) . addClass ( "color-green" ) ; $ ( "#conStatus" ) . text ( "Connected" ) ; websockConnected = true ; } ; websock . onclose = function ( evt ) { console . log ( "websock close" ) ; conStatusError ( ) ; } ; websock . onerror = function ( evt ) { console . log ( evt ) ; conStatusError ( ) ; } ; var handleEvent = function ( evt ) { console . log ( evt ) ; var data = JSON . parse ( evt . data ) ; var e = document . body ; var center = "" ; switch ( data . type ) { case UI _INITIAL _GUI : $ ( "#row" ) . html ( "" ) ; $ ( "#tabsnav" ) . html ( "" ) ; $ ( "#tabscontent" ) . html ( "" ) ; if ( data . sliderContinuous ) { sliderContinuous = data . sliderContinuous ; }
data . controls . forEach ( element => { var fauxEvent = { data : JSON . stringify ( element ) , } ; handleEvent ( fauxEvent ) ; } ) ; break ; case UI _RELOAD : window . location . reload ( ) ; break ; case UI _TITEL : document . title = data . label ; $ ( "#mainHeader" ) . html ( data . label ) ; break ; case UI _LABEL : var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) ; }
2021-08-01 16:45:49 +00:00
if ( data . visible ) { parent . append ( "<div id='id" +
2021-02-05 22:03:02 +00:00
data . id +
"' class='two columns card tcenter " +
colorClass ( data . color ) +
"'>" +
"<h5>" +
data . label +
"</h5><hr/>" +
"<span id='l" +
data . id +
"' class='label label-wrap'>" +
data . value +
"</span>" +
2021-08-01 16:45:49 +00:00
"</div>" ) ; }
break ; case UI _BUTTON : var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) ; }
if ( data . visible ) { parent . append ( "<div id='id" +
2021-02-05 22:03:02 +00:00
data . id +
"' class='one columns card tcenter " +
colorClass ( data . color ) +
"'>" +
"<h5>" +
data . label +
"</h5><hr/>" +
"<button id='btn" +
data . id +
"' " +
"onmousedown='buttonclick(" +
data . id +
", true)' " +
"onmouseup='buttonclick(" +
data . id +
", false)'>" +
data . value +
2021-08-01 16:45:49 +00:00
"</button></div>" ) ; $ ( "#btn" + data . id ) . on ( { touchstart : function ( e ) { e . preventDefault ( ) ; buttonclick ( data . id , true ) ; } , touchend : function ( e ) { e . preventDefault ( ) ; buttonclick ( data . id , false ) ; } , } ) ; }
break ; case UI _SWITCHER : var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) ; }
if ( data . visible ) { parent . append ( "<div id='id" +
2021-02-05 22:03:02 +00:00
data . id +
"' class='one columns card tcenter " +
colorClass ( data . color ) +
"'>" +
"<h5>" +
data . label +
"</h5><hr/>" +
"<label id='sl" +
data . id +
"' class='switch " +
( data . value == "1" ? "checked" : "" ) +
"'>" +
"<div class='in'><input type='checkbox' id='s" +
data . id +
"' onClick='switcher(" +
data . id +
",null)' " +
( data . value == "1" ? "checked" : "" ) +
"/></div>" +
"</label>" +
2021-08-01 16:45:49 +00:00
"</div>" ) ; switcher ( data . id , data . value ) ; }
break ; case UI _CPAD : case UI _PAD : var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) ; }
if ( data . visible ) { parent . append ( "<div id='id" +
2021-02-05 22:03:02 +00:00
data . id +
"' class='two columns card tcenter " +
colorClass ( data . color ) +
"'>" +
"<h5>" +
data . label +
"</h5><hr/>" +
"<nav class='control'>" +
"<ul>" +
"<li><a onmousedown='padclick(UP, " +
data . id +
", true)' onmouseup='padclick(UP, " +
data . id +
", false)' id='pf" +
data . id +
"'>▲</a></li>" +
"<li><a onmousedown='padclick(RIGHT, " +
data . id +
", true)' onmouseup='padclick(RIGHT, " +
data . id +
", false)' id='pr" +
data . id +
"'>▲</a></li>" +
"<li><a onmousedown='padclick(LEFT, " +
data . id +
", true)' onmouseup='padclick(LEFT, " +
data . id +
", false)' id='pl" +
data . id +
"'>▲</a></li>" +
"<li><a onmousedown='padclick(DOWN, " +
data . id +
", true)' onmouseup='padclick(DOWN, " +
data . id +
", false)' id='pb" +
data . id +
"'>▲</a></li>" +
"</ul>" +
( data . type == UI _CPAD ? "<a class='confirm' onmousedown='padclick(CENTER," +
data . id +
", true)' onmouseup='padclick(CENTER, " +
data . id +
", false)' id='pc" +
data . id +
"'>OK</a>" : "" ) +
"</nav>" +
2021-08-01 16:45:49 +00:00
"</div>" ) ; $ ( "#pf" + data . id ) . on ( { touchstart : function ( e ) { e . preventDefault ( ) ; padclick ( UP , data . id , true ) ; } , touchend : function ( e ) { e . preventDefault ( ) ; padclick ( UP , data . id , false ) ; } , } ) ; $ ( "#pl" + data . id ) . on ( { touchstart : function ( e ) { e . preventDefault ( ) ; padclick ( LEFT , data . id , true ) ; } , touchend : function ( e ) { e . preventDefault ( ) ; padclick ( LEFT , data . id , false ) ; } , } ) ; $ ( "#pr" + data . id ) . on ( { touchstart : function ( e ) { e . preventDefault ( ) ; padclick ( RIGHT , data . id , true ) ; } , touchend : function ( e ) { e . preventDefault ( ) ; padclick ( RIGHT , data . id , false ) ; } , } ) ; $ ( "#pb" + data . id ) . on ( { touchstart : function ( e ) { e . preventDefault ( ) ; padclick ( DOWN , data . id , true ) ; } , touchend : function ( e ) { e . preventDefault ( ) ; padclick ( DOWN , data . id , false ) ; } , } ) ; $ ( "#pc" + data . id ) . on ( { touchstart : function ( e ) { e . preventDefault ( ) ; padclick ( CENTER , data . id , true ) ; } , touchend : function ( e ) { e . preventDefault ( ) ; padclick ( CENTER , data . id , false ) ; } , } ) ; }
break ; case UI _SLIDER : var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) ; }
if ( data . visible ) { parent . append ( "<div id='id" +
2021-02-05 22:03:02 +00:00
data . id +
"' class='two columns card tcenter card-slider " +
colorClass ( data . color ) +
"'>" +
"<h5>" +
data . label +
"</h5><hr/>" +
"<div class='range-slider'>" +
"<input id='sl" +
data . id +
"' type='range' min='0' max='100' value='" +
data . value +
"' class='range-slider__range'>" +
"<span class='range-slider__value'>" +
data . value +
"</span>" +
"</div>" +
2021-08-01 16:45:49 +00:00
"</div>" ) ; rangeSlider ( ! sliderContinuous ) ; }
break ; case UI _NUMBER : var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) ; }
if ( data . visible ) { parent . append ( "<div id='id" +
2021-02-05 22:03:02 +00:00
data . id +
"' class='two columns card tcenter " +
colorClass ( data . color ) +
"'>" +
"<h5>" +
data . label +
"</h5><hr/>" +
"<input style='color:black;' id='num" +
data . id +
"' type='number' value='" +
data . value +
"' onchange='numberchange(" +
data . id +
")' />" +
2021-08-01 16:45:49 +00:00
"</div>" ) ; }
break ; case UI _TEXT _INPUT : var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) ; }
if ( data . visible ) { parent . append ( "<div id='id" +
2021-02-05 22:03:02 +00:00
data . id +
"' class='two columns card tcenter " +
colorClass ( data . color ) +
"'>" +
"<h5>" +
data . label +
"</h5><hr/>" +
"<input style='color:black;' id='text" +
data . id +
"' value='" +
data . value +
"' onchange='textchange(" +
data . id +
")' />" +
2021-08-01 16:45:49 +00:00
"</div>" ) ; }
break ; case UI _TAB : if ( data . visible ) { $ ( "#tabsnav" ) . append ( "<li><a onmouseup='tabclick(" + data . id + ")' href='#tab" + data . id + "'>" + data . value + "</a></li>" ) ; $ ( "#tabscontent" ) . append ( "<div id='tab" + data . id + "'></div>" ) ; tabs = $ ( ".tabscontent" ) . tabbedContent ( { loop : true } ) . data ( "api" ) ; $ ( "a" ) . filter ( function ( ) { return $ ( this ) . attr ( "href" ) === "#click-to-switch" ; } ) . on ( "click" , function ( e ) { var tab = prompt ( "Tab to switch to (number or id)?" ) ; if ( ! tabs . switchTab ( tab ) ) { alert ( "That tab does not exist :\\" ) ; }
e . preventDefault ( ) ; } ) ; }
break ; case UI _SELECT : var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) ; }
if ( data . visible ) { parent . append ( "<div id='id" +
2021-02-05 22:03:02 +00:00
data . id +
"' class='two columns card tcenter " +
colorClass ( data . color ) +
"'>" +
"<h5>" +
data . label +
"</h5><hr/>" +
"<select style='color:black;' id='select" +
data . id +
"' onchange='selectchange(" +
data . id +
")' />" +
2021-08-01 16:45:49 +00:00
"</div>" ) ; }
break ; case UI _OPTION : if ( data . parentControl ) { var parent = $ ( "#select" + data . parentControl ) ; parent . append ( "<option id='option" +
2021-02-05 22:03:02 +00:00
data . id +
"' value='" +
data . value +
"' " +
data . selected +
">" +
data . label +
"</option>" ) ; }
break ; case UI _MIN : if ( data . parentControl ) { var parent = $ ( "#id" + data . parentControl + " input" ) ; if ( parent . size ( ) ) { parent . attr ( "min" , data . value ) ; } }
break ; case UI _MAX : if ( data . parentControl ) { var parent = $ ( "#id" + data . parentControl + " input" ) ; if ( parent . size ( ) ) { parent . attr ( "max" , data . value ) ; } }
break ; case UI _STEP : if ( data . parentControl ) { var parent = $ ( "#id" + data . parentControl + " input" ) ; if ( parent . size ( ) ) { parent . attr ( "step" , data . value ) ; } }
break ; case UI _GRAPH : var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) ; }
2021-08-01 16:45:49 +00:00
if ( data . visible ) { parent . append ( "<div id='id" +
2021-02-05 22:03:02 +00:00
data . id +
"' class='two columns card tcenter " +
colorClass ( data . color ) +
"'>" +
"<h5>" +
data . label +
"</h5><hr/>" +
"<figure id='graph" +
data . id +
"'>" +
"<figcaption>" +
data . label +
"</figcaption>" +
"</figure>" +
2021-08-01 16:45:49 +00:00
"</div>" ) ; graphData [ data . id ] = restoreGraphData ( data . id ) ; renderGraphSvg ( graphData [ data . id ] , "graph" + data . id ) ; }
break ; case ADD _GRAPH _POINT : var ts = Math . round ( new Date ( ) . getTime ( ) / 1000 ) ; graphData [ data . id ] . push ( { x : ts , y : data . value } ) ; saveGraphData ( ) ; renderGraphSvg ( graphData [ data . id ] , "graph" + data . id ) ; break ; case CLEAR _GRAPH : graphData [ data . id ] = [ ] ; saveGraphData ( ) ; renderGraphSvg ( graphData [ data . id ] , "graph" + data . id ) ; break ; case UI _GAUGE : var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) ; }
if ( data . visible ) { parent . append ( "<div id='id" +
2021-02-05 22:03:02 +00:00
data . id +
"' class='two columns card tcenter " +
colorClass ( data . color ) +
"'>" +
"<h5>" +
data . label +
"</h5><hr/>" +
"WILL BE A GAUGE <input style='color:black;' id='gauge" +
data . id +
"' type='number' value='" +
data . value +
"' onchange='numberchange(" +
data . id +
")' />" +
2021-08-01 16:45:49 +00:00
"</div>" ) ; }
break ; case UI _ACCEL : if ( hasAccel ) break ; var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) ; }
hasAccel = true ; if ( data . visible ) { parent . append ( "<div id='id" +
2021-02-05 22:03:02 +00:00
data . id +
"' class='two columns card tcenter " +
colorClass ( data . color ) +
"'>" +
"<h5>" +
data . label +
"</h5><hr/>" +
"ACCEL // Not implemented fully!<div class='accelerometer' id='accel" +
data . id +
"' ><div class='ball" +
data . id +
"'></div><pre class='accelerometeroutput" +
data . id +
"'></pre>" +
2021-08-01 16:45:49 +00:00
"</div>" ) ; requestOrientationPermission ( ) ; }
break ; case UPDATE _LABEL : $ ( "#l" + data . id ) . html ( data . value ) ; break ; case UPDATE _SWITCHER : switcher ( data . id , data . value == "0" ? 0 : 1 ) ; break ; case UPDATE _SLIDER : slider _move ( $ ( "#id" + data . id ) , data . value , "100" , false ) ; break ; case UPDATE _NUMBER : $ ( "#num" + data . id ) . val ( data . value ) ; break ; case UPDATE _TEXT _INPUT : $ ( "#text" + data . id ) . val ( data . value ) ; break ; case UPDATE _SELECT : $ ( "#select" + data . id ) . val ( data . value ) ; break ; case UPDATE _BUTTON : case UPDATE _PAD : case UPDATE _CPAD : break ; case UPDATE _GAUGE : $ ( "#gauge" + data . id ) . val ( data . value ) ; break ; case UPDATE _ACCEL : break ; default : console . error ( "Unknown type or event" ) ; break ; }
2021-02-05 22:03:02 +00:00
if ( data . type >= UPDATE _OFFSET && data . type < UI _INITIAL _GUI ) { var element = $ ( "#id" + data . id ) ; if ( data . type == UPDATE _SLIDER ) { element . removeClass ( "slider-turquoise slider-emerald slider-peterriver slider-wetasphalt slider-sunflower slider-carrot slider-alizarin" ) ; element . addClass ( "slider-" + colorClass ( data . color ) ) ; } else { element . removeClass ( "turquoise emerald peterriver wetasphalt sunflower carrot alizarin" ) ; element . addClass ( colorClass ( data . color ) ) ; } } } ; websock . onmessage = handleEvent ; }
2021-08-01 16:45:49 +00:00
function sliderchange ( number ) { var val = $ ( "#sl" + number ) . val ( ) ; websock . send ( "slvalue:" + val + ":" + number ) ; }
2021-02-05 22:03:02 +00:00
function numberchange ( number ) { var val = $ ( "#num" + number ) . val ( ) ; websock . send ( "nvalue:" + val + ":" + number ) ; }
function textchange ( number ) { var val = $ ( "#text" + number ) . val ( ) ; websock . send ( "tvalue:" + val + ":" + number ) ; }
function tabclick ( number ) { var val = $ ( "#tab" + number ) . val ( ) ; websock . send ( "tabvalue:" + val + ":" + number ) ; }
function selectchange ( number ) { var val = $ ( "#select" + number ) . val ( ) ; websock . send ( "svalue:" + val + ":" + number ) ; }
function buttonclick ( number , isdown ) { if ( isdown ) websock . send ( "bdown:" + number ) ; else websock . send ( "bup:" + number ) ; }
function padclick ( type , number , isdown ) { switch ( type ) { case CENTER : if ( isdown ) websock . send ( "pcdown:" + number ) ; else websock . send ( "pcup:" + number ) ; break ; case UP : if ( isdown ) websock . send ( "pfdown:" + number ) ; else websock . send ( "pfup:" + number ) ; break ; case DOWN : if ( isdown ) websock . send ( "pbdown:" + number ) ; else websock . send ( "pbup:" + number ) ; break ; case LEFT : if ( isdown ) websock . send ( "pldown:" + number ) ; else websock . send ( "plup:" + number ) ; break ; case RIGHT : if ( isdown ) websock . send ( "prdown:" + number ) ; else websock . send ( "prup:" + number ) ; break ; } }
function switcher ( number , state ) { if ( state == null ) { if ( $ ( "#s" + number ) . is ( ":checked" ) ) { websock . send ( "sactive:" + number ) ; $ ( "#sl" + number ) . addClass ( "checked" ) ; } else { websock . send ( "sinactive:" + number ) ; $ ( "#sl" + number ) . removeClass ( "checked" ) ; } } else if ( state == 1 ) { $ ( "#sl" + number ) . addClass ( "checked" ) ; $ ( "#sl" + number ) . prop ( "checked" , true ) ; } else if ( state == 0 ) { $ ( "#sl" + number ) . removeClass ( "checked" ) ; $ ( "#sl" + number ) . prop ( "checked" , false ) ; } }
2021-08-01 16:45:49 +00:00
var rangeSlider = function ( isDiscrete ) { var slider = $ ( ".range-slider" ) , range = $ ( ".range-slider__range" ) , value = $ ( ".range-slider__value" ) ; slider . each ( function ( ) { value . each ( function ( ) { var value = $ ( this ) . prev ( ) . attr ( "value" ) ; $ ( this ) . html ( value ) ; } ) ; if ( ! isDiscrete ) { range . on ( { input : function ( ) { sliderchange ( $ ( this ) . attr ( "id" ) . replace ( /^\D+/g , "" ) ) ; } , } ) ; } else { range . on ( { input : function ( ) { $ ( this ) . next ( ) . html ( this . value ) ; } , change : function ( ) { sliderchange ( $ ( this ) . attr ( "id" ) . replace ( /^\D+/g , "" ) ) ; } , } ) ; } } ) ; } ;