2019-03-03 22:22:01 +00:00
const UI _INITIAL _GUI = 200 ; const UI _TITEL = 0 ; const UI _BUTTON = 1 ; const UI _PAD = 2 ; const UI _CPAD = 3 ; 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 FOR = 0 ; const BACK = 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-03 22: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 element ; if ( data . parentControl ) { element = $ ( "#tab" + data . parentControl ) ; } else { element = $ ( "#row" ) }
element . append ( "<div class='two columns card tcenter " +
2018-11-26 17:25:10 +00:00
colorClass ( data . color ) +
"'><h5 id='" +
data . id +
"'>" +
data . label +
"</h5><hr /><span id='l" +
data . id +
"' class='label label-wrap'>" +
data . value +
2019-03-03 22:22:01 +00:00
"</span></div>" ) ; break ; case UI _BUTTON : var element ; if ( data . parentControl ) { element = $ ( "#tab" + data . parentControl ) ; } else { element = $ ( "#row" ) }
element . append ( "<div class='one columns card tcenter " +
2018-11-26 17:25:10 +00:00
colorClass ( data . color ) +
"'><h5>" +
data . label +
"</h5><hr/><button onmousedown='buttonclick(" +
data . id +
", true)' onmouseup='buttonclick(" +
data . id +
", false)' id='" +
data . id +
"'>" +
data . value +
"</button></div>" ) ; $ ( "#" + data . id ) . on ( { touchstart : function ( e ) { e . preventDefault ( ) ; buttonclick ( data . id , true ) ; } } ) ; $ ( "#" + data . id ) . on ( { touchend : function ( e ) { e . preventDefault ( ) ; buttonclick ( data . id , false ) ; } } ) ; break ; case UI _SWITCHER : var label = "<label id='sl" + data . id + "' class='switch checked'>" ; var input = "<div class='in'><input type='checkbox' id='s" +
data . id +
"' onClick='switcher(" +
data . id +
",null)' checked></div>" ; if ( data . value == "0" ) { label = "<label id='sl" + data . id + "' class='switch'>" ; input = "<div class='in'><input type='checkbox' id='s" +
data . id +
"' onClick='switcher(" +
data . id +
",null)' ></div>" ; }
2019-03-03 22:22:01 +00:00
var element ; if ( data . parentControl ) { element = $ ( "#tab" + data . parentControl ) ; } else { element = $ ( "#row" ) }
element . append ( "<div id='" +
2018-11-26 17:25:10 +00:00
data . id +
"' class='one columns card tcenter " +
colorClass ( data . color ) +
"'><h5>" +
data . label +
"</h5><hr/>" +
label +
input +
2018-10-28 11:33:43 +00:00
"</label>" +
2018-11-26 17:25:10 +00:00
"</div>" ) ; break ; case UI _CPAD : center = "<a class='confirm' onmousedown='padclick(CENTER, " +
data . id +
", true)' onmouseup='padclick(CENTER, " +
data . id +
", false)' href='#' id='pc" +
data . id +
2019-03-03 22:22:01 +00:00
"'>OK</a>" ; case UI _PAD : var element ; if ( data . parentControl ) { element = $ ( "#tab" + data . parentControl ) ; } else { element = $ ( "#row" ) }
element . append ( "<div class='two columns card tcenter " +
2018-11-26 17:25:10 +00:00
colorClass ( data . color ) +
"'><h5>" +
data . label +
"</h5><hr/>" +
2018-10-28 11:33:43 +00:00
"<nav class='control'>" +
"<ul>" +
2018-11-26 17:25:10 +00:00
"<li><a onmousedown='padclick(FOR, " +
data . id +
", true)' onmouseup='padclick(FOR, " +
data . id +
", false)' href='#' id='pf" +
data . id +
"'>▲</a></li>" +
"<li><a onmousedown='padclick(RIGHT, " +
data . id +
", true)' onmouseup='padclick(RIGHT, " +
data . id +
", false)' href='#' id='pr" +
data . id +
"'>▲</a></li>" +
"<li><a onmousedown='padclick(LEFT, " +
data . id +
", true)' onmouseup='padclick(LEFT, " +
data . id +
", false)' href='#' id='pl" +
data . id +
"'>▲</a></li>" +
"<li><a onmousedown='padclick(BACK, " +
data . id +
", true)' onmouseup='padclick(BACK, " +
data . id +
", false)' href='#' id='pb" +
data . id +
"'>▲</a></li>" +
2018-10-28 11:33:43 +00:00
"</ul>" +
center +
"</nav>" +
2019-03-03 22:22:01 +00:00
"</div>" ) ; $ ( "#pf" + data . id ) . on ( { touchstart : function ( e ) { e . preventDefault ( ) ; padclick ( FOR , data . id , true ) ; } , touchend : function ( e ) { e . preventDefault ( ) ; padclick ( FOR , 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 ( BACK , data . id , true ) ; } , touchend : function ( e ) { e . preventDefault ( ) ; padclick ( BACK , 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 UPDATE _LABEL : $ ( "#l" + data . id ) . html ( data . value ) ; break ; case UPDATE _SWITCHER : if ( data . value == "0" ) switcher ( data . id , 0 ) ; else switcher ( data . id , 1 ) ; break ; case UI _SLIDER : var element ; if ( data . parentControl ) { element = $ ( "#tab" + data . parentControl ) ; } else { element = $ ( "#row" ) }
element . append ( "<div class='two columns card tcenter card-slider " +
2018-11-26 17:25:10 +00:00
colorClass ( data . color ) +
"'>" +
"<h5 id='" +
data . id +
"'>" +
data . label +
"</h5><hr />" +
"<div id='sl" +
data . id +
"' class='rkmd-slider slider-discrete slider-" +
colorClass ( data . color ) +
"'>" +
"<input type='range' min='0' max='100' value='" +
data . value +
"'>" +
2018-10-28 11:33:43 +00:00
"</div>" +
2019-03-03 22:22:01 +00:00
"</div>" ) ; var element ; if ( data . parentControl ) { element = $ ( "#tab" + data . parentControl ) ; } else { element = $ ( "#row" ) }
element . append ( "<script>" + "rkmd_rangeSlider('#sl" + data . id + "');" + "</script>" ) ; break ; case UPDATE _SLIDER : slider _move ( $ ( "#sl" + data . id ) , data . value , "100" , false ) ; break ; case UI _NUMBER : var element ; if ( data . parentControl ) { element = $ ( "#tab" + data . parentControl ) ; } else { element = $ ( "#row" ) }
element . append ( "<div class='two columns card tcenter " +
2018-11-26 17:25:10 +00:00
colorClass ( data . color ) +
"'>" +
"<h5 id='" +
data . id +
"'>" +
data . label +
"</h5><hr />" +
"<input style='color:black;' id='num" +
data . id +
"' type='number' value='" +
data . value +
"' onchange='numberchange(" +
data . id +
")' />" +
2019-03-03 22:22:01 +00:00
"</div>" ) ; break ; case UPDATE _NUMBER : $ ( "#num" + data . id ) . val ( data . value ) ; break ; case UI _TEXT _INPUT : var element ; if ( data . parentControl ) { element = $ ( "#tab" + data . parentControl ) ; } else { element = $ ( "#row" ) }
element . append ( "<div class='two columns card tcenter " +
2018-11-26 17:25:10 +00:00
colorClass ( data . color ) +
"'>" +
"<h5 id='" +
data . id +
"'>" +
data . label +
"</h5><hr />" +
"<input style='color:black;' id='text" +
data . id +
"' value='" +
data . value +
"' onchange='textchange(" +
data . id +
")' />" +
2019-03-03 22:22:01 +00:00
"</div>" ) ; break ; case UPDATE _TEXT _INPUT : $ ( "#text" + data . id ) . val ( data . value ) ; 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 ; default : console . error ( "Unknown type or event" ) ; break ; } } ; websock . onmessage = handleEvent ; }
2018-11-26 17:25:10 +00:00
function numberchange ( number ) { var val = $ ( "#num" + number ) . val ( ) ; websock . send ( "nvalue:" + val + ":" + number ) ; console . log ( val ) ; }
function textchange ( number ) { var val = $ ( "#text" + number ) . val ( ) ; websock . send ( "tvalue:" + val + ":" + number ) ; console . log ( val ) ; }
2018-10-28 11:33:43 +00:00
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 FOR : if ( isdown ) websock . send ( "pfdown:" + number ) ; else websock . send ( "pfup:" + number ) ; break ; case BACK : 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 ; } }
2018-11-26 17:25:10 +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 ) ; } }