2019-03-19 08:34:16 +00:00
const UI _INITIAL _GUI = 200 ; 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 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 ; 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 "" ; } }
2018-11-26 17:25:10 +00:00
var websock ; var websockConnected = false ; 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 } ) ; }
2018-11-19 21:23:10 +00:00
function handleVisibilityChange ( ) { if ( ! websockConnected && ! document . hidden ) { restart ( ) ; } }
2019-03-08 21:22:01 +00:00
function start ( ) { document . addEventListener ( "visibilitychange" , handleVisibilityChange , false ) ; 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 ) { var data = JSON . parse ( evt . data ) ; var e = document . body ; var center = "" ; switch ( data . type ) { case UI _INITIAL _GUI : data . controls . forEach ( element => { var fauxEvent = { data : JSON . stringify ( element ) } ; handleEvent ( fauxEvent ) ; } ) ; 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" ) }
2019-03-19 08:34:16 +00:00
parent . append ( "<div id='id" + data . id + "' class='two columns card tcenter " + colorClass ( data . color ) + "'>" +
2019-03-08 21:22:01 +00:00
"<h5>" + data . label + "</h5><hr/>" +
"<span id='l" + data . id + "' class='label label-wrap'>" + data . value + "</span>" +
"</div>" ) ; break ; case UI _BUTTON : var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) }
2019-03-19 08:34:16 +00:00
parent . append ( "<div id='id" + data . id + "' class='one columns card tcenter " + colorClass ( data . color ) + "'>" +
2019-03-08 21:22:01 +00:00
"<h5>" + data . label + "</h5><hr/>" +
"<button id='btn" + data . id + "' " +
"onmousedown='buttonclick(" + data . id + ", true)' " +
"onmouseup='buttonclick(" + data . id + ", false)'>" +
2018-11-26 17:25:10 +00:00
data . value +
2019-03-08 21:22:01 +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" ) }
2019-03-19 08:34:16 +00:00
parent . append ( "<div id='id" + data . id + "' class='one columns card tcenter " + colorClass ( data . color ) + "'>" +
2019-03-08 21:22:01 +00:00
"<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>" +
2018-10-28 11:33:43 +00:00
"</label>" +
2019-03-08 21:22:01 +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" ) }
2019-03-19 08:34:16 +00:00
parent . append ( "<div id='id" + data . id + "' class='two columns card tcenter " + colorClass ( data . color ) + "'>" +
2019-03-08 21:22:01 +00:00
"<h5>" + data . label + "</h5><hr/>" +
2018-10-28 11:33:43 +00:00
"<nav class='control'>" +
"<ul>" +
2019-03-08 21:22:01 +00:00
"<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>" +
2018-10-28 11:33:43 +00:00
"</ul>" +
2019-03-08 21:22:01 +00:00
( ( 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>" : "" ) +
2018-10-28 11:33:43 +00:00
"</nav>" +
2019-03-08 21:22:01 +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" ) }
2019-03-19 08:34:16 +00:00
parent . append ( "<div id='id" + data . id + "' class='two columns card tcenter card-slider " + colorClass ( data . color ) + "'>" +
2019-03-08 21:22:01 +00:00
"<h5>" + data . label + "</h5><hr/>" +
2019-03-19 08:34:16 +00:00
"<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>" +
2018-10-28 11:33:43 +00:00
"</div>" +
2019-03-19 08:34:16 +00:00
"</div>" ) ; rangeSlider ( ) ; break ; case UI _NUMBER : var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) }
parent . append ( "<div id='id" + data . id + "' class='two columns card tcenter " + colorClass ( data . color ) + "'>" +
2019-03-08 21:22:01 +00:00
"<h5>" + data . label + "</h5><hr/>" +
"<input style='color:black;' id='num" + data . id + "' type='number' value='" + data . value + "' onchange='numberchange(" + data . id + ")' />" +
"</div>" ) ; break ; case UI _TEXT _INPUT : var parent ; if ( data . parentControl ) { parent = $ ( "#tab" + data . parentControl ) ; } else { parent = $ ( "#row" ) }
2019-03-19 08:34:16 +00:00
parent . append ( "<div id='id" + data . id + "' class='two columns card tcenter " + colorClass ( data . color ) + "'>" +
2019-03-08 21:22:01 +00:00
"<h5>" + data . label + "</h5><hr/>" +
"<input style='color:black;' id='text" + data . id + "' value='" + data . value + "' onchange='textchange(" + data . id + ")' />" +
"</div>" ) ; break ; case UI _TAB : $ ( "#tabsnav" ) . append ( "<li><a 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" ) }
2019-03-19 08:34:16 +00:00
parent . append ( "<div id='id" + data . id + "' class='two columns card tcenter " + colorClass ( data . color ) + "'>" +
2019-03-08 21:22:01 +00:00
"<h5>" + data . label + "</h5><hr/>" +
"<select style='color:black;' id='select" + data . id + "' onchange='selectchange(" + data . id + ")' />" +
"</div>" ) ; break ; case UI _OPTION : if ( data . parentControl ) { var parent = $ ( "#select" + data . parentControl ) ; parent . append ( "<option id='option" + data . id + "' value='" + data . value + "' " + data . selected + ">" + data . label + "</option>" ) ; }
2019-03-19 08:34:16 +00:00
break ; case UI _MIN : if ( data . parentControl ) { var parent = $ ( "#id" + data . parentControl + " input" ) ; if ( parent . size ( ) ) { console . log ( "MIN" + data . value ) ; parent . attr ( "min" , data . value ) ; } }
break ; case UI _MAX : if ( data . parentControl ) { var parent = $ ( "#id" + data . parentControl + " input" ) ; if ( parent . size ( ) ) { console . log ( "MAX" + data . value ) ; parent . attr ( "max" , data . value ) ; } }
break ; case UI _STEP : if ( data . parentControl ) { var parent = $ ( "#id" + data . parentControl + " input" ) ; if ( parent . size ( ) ) { console . log ( "STEP" + data . value ) ; parent . attr ( "step" , data . value ) ; } }
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 ( $ ( "#sl" + 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 ; default : console . error ( "Unknown type or event" ) ; break ; }
if ( data . type >= UPDATE _OFFSET && data . type < UI _INITIAL _GUI ) { var element = $ ( '#id' + data . id ) ; element . removeClass ( "turquoise emerald peterriver wetasphalt sunflower carrot alizarin" ) ; element . addClass ( colorClass ( data . color ) ) ; } } ; websock . onmessage = handleEvent ; }
function sliderchange ( number ) { var val = $ ( "#sl" + number ) . val ( ) ; console . log ( "slvalue:" + val + ":" + number ) ; websock . send ( "slvalue:" + val + ":" + number ) ; }
2019-03-08 21:22:01 +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 selectchange ( number ) { var val = $ ( "#select" + number ) . val ( ) ; websock . send ( "svalue:" + val + ":" + number ) ; }
2018-10-28 11:33:43 +00:00
function buttonclick ( number , isdown ) { if ( isdown ) websock . send ( "bdown:" + number ) ; else websock . send ( "bup:" + number ) ; }
2019-03-08 21:22:01 +00:00
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 ; } }
2019-03-19 08:34:16 +00:00
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 ) ; } }
var rangeSlider = function ( ) { 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 ) ; } ) ; range . on ( { 'input' : function ( ) { $ ( this ) . next ( ) . html ( this . value ) ; } , 'change' : function ( ) { sliderchange ( $ ( this ) . attr ( 'id' ) . replace ( /^\D+/g , '' ) ) ; } } ) ; } ) ; } ;