2019-03-03 20:13:45 +00:00
|
|
|
const UI_INITIAL_GUI = 200;
|
2019-03-08 21:22:01 +00:00
|
|
|
const UPDATE_OFFSET = 100;
|
2018-05-27 09:47:53 +00:00
|
|
|
|
2019-03-03 20:13:45 +00:00
|
|
|
const UI_TITEL = 0;
|
2019-03-08 21:22:01 +00:00
|
|
|
|
|
|
|
const UI_PAD = 1;
|
|
|
|
const UPDATE_PAD = 101;
|
|
|
|
|
|
|
|
const UI_CPAD = 2;
|
|
|
|
const UPDATE_CPAD = 102;
|
|
|
|
|
|
|
|
const UI_BUTTON = 3;
|
|
|
|
const UPDATE_BUTTON = 103;
|
2018-05-27 09:47:53 +00:00
|
|
|
|
2019-03-03 20:13:45 +00:00
|
|
|
const UI_LABEL = 4;
|
|
|
|
const UPDATE_LABEL = 104;
|
2018-05-27 09:47:53 +00:00
|
|
|
|
2019-03-03 20:13:45 +00:00
|
|
|
const UI_SWITCHER = 5;
|
|
|
|
const UPDATE_SWITCHER = 105;
|
2018-05-27 09:47:53 +00:00
|
|
|
|
2019-03-03 20:13:45 +00:00
|
|
|
const UI_SLIDER = 6;
|
|
|
|
const UPDATE_SLIDER = 106;
|
2017-10-19 11:46:47 +00:00
|
|
|
|
2019-03-03 20:13:45 +00:00
|
|
|
const UI_NUMBER = 7;
|
|
|
|
const UPDATE_NUMBER = 107;
|
2018-05-27 09:47:53 +00:00
|
|
|
|
2019-03-03 20:13:45 +00:00
|
|
|
const UI_TEXT_INPUT = 8;
|
|
|
|
const UPDATE_TEXT_INPUT = 108;
|
2018-05-27 09:47:53 +00:00
|
|
|
|
2019-03-03 20:13:45 +00:00
|
|
|
const UI_GRAPH = 9;
|
|
|
|
const ADD_GRAPH_POINT = 10;
|
|
|
|
const CLEAR_GRAPH = 109;
|
2018-05-27 09:47:53 +00:00
|
|
|
|
2019-03-03 22:22:01 +00:00
|
|
|
const UI_TAB = 11;
|
|
|
|
const UPDATE_TAB = 111;
|
|
|
|
|
2019-03-04 20:07:39 +00:00
|
|
|
const UI_SELECT = 12;
|
|
|
|
const UPDATE_SELECT = 112;
|
2019-03-19 08:34:16 +00:00
|
|
|
|
2019-03-04 20:07:39 +00:00
|
|
|
const UI_OPTION = 13;
|
|
|
|
const UPDATE_OPTION = 113;
|
2019-03-19 08:34:16 +00:00
|
|
|
const UI_MIN = 14;
|
|
|
|
const UPDATE_MIN = 114;
|
|
|
|
const UI_MAX = 15;
|
|
|
|
const UPDATE_MAX = 115;
|
|
|
|
const UI_STEP = 16;
|
|
|
|
const UPDATE_STEP = 116;
|
2019-03-04 20:07:39 +00:00
|
|
|
|
2019-03-26 15:22:21 +00:00
|
|
|
const UI_GAUGE = 17;
|
|
|
|
const UPTDATE_GAUGE = 117;
|
|
|
|
const UI_ACCEL = 18;
|
|
|
|
const UPTDATE_ACCEL = 117;
|
|
|
|
|
2019-03-08 21:22:01 +00:00
|
|
|
const UP = 0;
|
|
|
|
const DOWN = 1;
|
2017-10-19 11:46:47 +00:00
|
|
|
const LEFT = 2;
|
|
|
|
const RIGHT = 3;
|
|
|
|
const CENTER = 4;
|
|
|
|
|
2017-11-14 11:09:52 +00:00
|
|
|
// Colors
|
|
|
|
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;
|
2019-03-03 20:13:45 +00:00
|
|
|
const C_DARK = 7;
|
|
|
|
const C_NONE = 255;
|
2017-11-14 11:09:52 +00:00
|
|
|
|
2019-04-15 13:32:14 +00:00
|
|
|
var graphData = new Array();
|
|
|
|
|
2019-12-27 14:36:54 +00:00
|
|
|
var hasAccel = false;
|
|
|
|
|
2017-11-14 11:14:59 +00:00
|
|
|
function colorClass(colorId) {
|
2018-11-26 17:25:10 +00:00
|
|
|
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:
|
2019-02-26 11:08:37 +00:00
|
|
|
return "dark";
|
2018-11-26 17:25:10 +00:00
|
|
|
default:
|
|
|
|
return "";
|
|
|
|
}
|
2017-11-14 11:09:52 +00:00
|
|
|
}
|
|
|
|
|
2017-10-17 09:55:25 +00:00
|
|
|
var websock;
|
2018-11-19 21:23:10 +00:00
|
|
|
var websockConnected = false;
|
2017-10-19 15:30:32 +00:00
|
|
|
|
2019-12-27 14:36:54 +00:00
|
|
|
function requestOrientationPermission() {
|
|
|
|
/*
|
|
|
|
// Currently this fails, since it needs secure context on IOS safari
|
|
|
|
if (typeof DeviceMotionEvent.requestPermission === "function") {
|
|
|
|
DeviceOrientationEvent.requestPermission()
|
|
|
|
.then(response => {
|
|
|
|
if (response == "granted") {
|
|
|
|
window.addEventListener("deviceorientation", handleOrientation);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.catch(console.error);
|
|
|
|
} else {
|
|
|
|
// Non IOS 13
|
|
|
|
window.addEventListener("deviceorientation", handleOrientation);
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
function handleOrientation(event) {
|
|
|
|
var x = event.beta; // In degree in the range [-180,180]
|
|
|
|
var y = event.gamma; // In degree in the range [-90,90]
|
|
|
|
|
|
|
|
var output = document.querySelector(".output");
|
|
|
|
output.innerHTML = "beta : " + x + "\n";
|
|
|
|
output.innerHTML += "gamma: " + y + "\n";
|
|
|
|
|
|
|
|
// Because we don't want to have the device upside down
|
|
|
|
// We constrain the x value to the range [-90,90]
|
|
|
|
if (x > 90) {
|
|
|
|
x = 90;
|
|
|
|
}
|
|
|
|
if (x < -90) {
|
|
|
|
x = -90;
|
|
|
|
}
|
|
|
|
|
|
|
|
// To make computation easier we shift the range of
|
|
|
|
// x and y to [0,180]
|
|
|
|
x += 90;
|
|
|
|
y += 90;
|
|
|
|
|
|
|
|
// 10 is half the size of the ball
|
|
|
|
// It center the positioning point to the center of the ball
|
|
|
|
var ball = document.querySelector(".ball");
|
|
|
|
var garden = document.querySelector(".garden");
|
|
|
|
var maxX = garden.clientWidth - ball.clientWidth;
|
|
|
|
var maxY = garden.clientHeight - ball.clientHeight;
|
|
|
|
ball.style.top = (maxY * y) / 180 - 10 + "px";
|
|
|
|
ball.style.left = (maxX * x) / 180 - 10 + "px";
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
2019-12-27 15:57:11 +00:00
|
|
|
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 [];
|
|
|
|
}
|
|
|
|
|
2018-10-28 11:33:43 +00:00
|
|
|
function restart() {
|
2018-11-26 17:25:10 +00:00
|
|
|
$(document)
|
|
|
|
.add("*")
|
|
|
|
.off();
|
|
|
|
$("#row").html("");
|
|
|
|
websock.close();
|
|
|
|
start();
|
2018-10-28 11:33:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function conStatusError() {
|
2018-11-26 17:25:10 +00:00
|
|
|
websockConnected = false;
|
|
|
|
$("#conStatus").removeClass("color-green");
|
|
|
|
$("#conStatus").addClass("color-red");
|
|
|
|
$("#conStatus").html("Error / No Connection ↻");
|
|
|
|
$("#conStatus").off();
|
|
|
|
$("#conStatus").on({
|
|
|
|
click: restart
|
|
|
|
});
|
2018-10-28 11:33:43 +00:00
|
|
|
}
|
|
|
|
|
2018-11-19 21:23:10 +00:00
|
|
|
function handleVisibilityChange() {
|
2018-11-26 17:25:10 +00:00
|
|
|
if (!websockConnected && !document.hidden) {
|
|
|
|
restart();
|
|
|
|
}
|
2018-11-19 21:23:10 +00:00
|
|
|
}
|
|
|
|
|
2017-10-17 09:55:25 +00:00
|
|
|
function start() {
|
2018-11-26 17:25:10 +00:00
|
|
|
document.addEventListener("visibilitychange", handleVisibilityChange, false);
|
|
|
|
websock = new WebSocket("ws://" + window.location.hostname + "/ws");
|
2019-02-26 15:04:41 +00:00
|
|
|
websock.onopen = function(evt) {
|
2018-11-26 17:25:10 +00:00
|
|
|
console.log("websock open");
|
|
|
|
$("#conStatus").addClass("color-green");
|
|
|
|
$("#conStatus").text("Connected");
|
|
|
|
websockConnected = true;
|
|
|
|
};
|
2018-12-26 11:35:35 +00:00
|
|
|
|
2019-02-26 15:04:41 +00:00
|
|
|
websock.onclose = function(evt) {
|
2018-11-26 17:25:10 +00:00
|
|
|
console.log("websock close");
|
|
|
|
conStatusError();
|
|
|
|
};
|
2018-12-26 11:35:35 +00:00
|
|
|
|
2019-02-26 15:04:41 +00:00
|
|
|
websock.onerror = function(evt) {
|
2018-11-26 17:25:10 +00:00
|
|
|
console.log(evt);
|
|
|
|
conStatusError();
|
|
|
|
};
|
2018-12-26 11:35:35 +00:00
|
|
|
|
2019-02-26 15:04:41 +00:00
|
|
|
var handleEvent = function(evt) {
|
2018-12-26 11:35:35 +00:00
|
|
|
//console.log(evt);
|
2018-11-26 17:25:10 +00:00
|
|
|
var data = JSON.parse(evt.data);
|
|
|
|
var e = document.body;
|
|
|
|
var center = "";
|
|
|
|
switch (data.type) {
|
2018-12-26 11:35:35 +00:00
|
|
|
case UI_INITIAL_GUI:
|
2019-12-27 14:36:54 +00:00
|
|
|
data.controls.forEach(element => {
|
2018-12-26 11:35:35 +00:00
|
|
|
var fauxEvent = {
|
|
|
|
data: JSON.stringify(element)
|
|
|
|
};
|
|
|
|
handleEvent(fauxEvent);
|
|
|
|
});
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2018-11-26 17:25:10 +00:00
|
|
|
case UI_TITEL:
|
|
|
|
document.title = data.label;
|
|
|
|
$("#mainHeader").html(data.label);
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2018-11-26 17:25:10 +00:00
|
|
|
case UI_LABEL:
|
2019-03-08 21:22:01 +00:00
|
|
|
var parent;
|
2019-03-26 15:22:21 +00:00
|
|
|
if (data.parentControl) {
|
|
|
|
parent = $("#tab" + data.parentControl);
|
2019-03-03 22:22:01 +00:00
|
|
|
} else {
|
2019-03-26 15:22:21 +00:00
|
|
|
parent = $("#row");
|
2019-03-03 22:22:01 +00:00
|
|
|
}
|
2019-03-08 21:22:01 +00:00
|
|
|
parent.append(
|
2019-03-26 15:22:21 +00:00
|
|
|
"<div id='id" +
|
|
|
|
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>" +
|
|
|
|
"</div>"
|
2018-11-26 17:25:10 +00:00
|
|
|
);
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2018-11-26 17:25:10 +00:00
|
|
|
case UI_BUTTON:
|
2019-03-08 21:22:01 +00:00
|
|
|
var parent;
|
2019-03-26 15:22:21 +00:00
|
|
|
if (data.parentControl) {
|
|
|
|
parent = $("#tab" + data.parentControl);
|
2019-03-03 22:22:01 +00:00
|
|
|
} else {
|
2019-03-26 15:22:21 +00:00
|
|
|
parent = $("#row");
|
2019-03-03 22:22:01 +00:00
|
|
|
}
|
2019-03-08 21:22:01 +00:00
|
|
|
parent.append(
|
2019-03-26 15:22:21 +00:00
|
|
|
"<div id='id" +
|
|
|
|
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)'>" +
|
2019-02-26 15:04:41 +00:00
|
|
|
data.value +
|
2019-03-26 15:22:21 +00:00
|
|
|
"</button></div>"
|
2018-11-26 17:25:10 +00:00
|
|
|
);
|
2019-03-08 21:22:01 +00:00
|
|
|
$("#btn" + data.id).on({
|
2019-02-26 15:04:41 +00:00
|
|
|
touchstart: function(e) {
|
2018-11-26 17:25:10 +00:00
|
|
|
e.preventDefault();
|
|
|
|
buttonclick(data.id, true);
|
2019-03-08 21:22:01 +00:00
|
|
|
},
|
2019-02-26 15:04:41 +00:00
|
|
|
touchend: function(e) {
|
2018-11-26 17:25:10 +00:00
|
|
|
e.preventDefault();
|
|
|
|
buttonclick(data.id, false);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2018-11-26 17:25:10 +00:00
|
|
|
case UI_SWITCHER:
|
2019-03-08 21:22:01 +00:00
|
|
|
var parent;
|
2019-03-26 15:22:21 +00:00
|
|
|
if (data.parentControl) {
|
|
|
|
parent = $("#tab" + data.parentControl);
|
2019-03-03 22:22:01 +00:00
|
|
|
} else {
|
2019-03-26 15:22:21 +00:00
|
|
|
parent = $("#row");
|
2019-03-03 22:22:01 +00:00
|
|
|
}
|
2019-03-08 21:22:01 +00:00
|
|
|
parent.append(
|
2019-03-26 15:22:21 +00:00
|
|
|
"<div id='id" +
|
|
|
|
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>" +
|
2019-02-26 15:04:41 +00:00
|
|
|
"</label>" +
|
2019-03-26 15:22:21 +00:00
|
|
|
"</div>"
|
2018-11-26 17:25:10 +00:00
|
|
|
);
|
2019-03-08 21:22:01 +00:00
|
|
|
switcher(data.id, data.value);
|
2018-11-26 17:25:10 +00:00
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2018-11-26 17:25:10 +00:00
|
|
|
case UI_CPAD:
|
|
|
|
case UI_PAD:
|
2019-03-08 21:22:01 +00:00
|
|
|
var parent;
|
2019-03-26 15:22:21 +00:00
|
|
|
if (data.parentControl) {
|
|
|
|
parent = $("#tab" + data.parentControl);
|
2019-03-03 22:22:01 +00:00
|
|
|
} else {
|
2019-03-26 15:22:21 +00:00
|
|
|
parent = $("#row");
|
2019-03-03 22:22:01 +00:00
|
|
|
}
|
2019-03-08 21:22:01 +00:00
|
|
|
parent.append(
|
2019-03-26 15:22:21 +00:00
|
|
|
"<div id='id" +
|
|
|
|
data.id +
|
|
|
|
"' class='two columns card tcenter " +
|
|
|
|
colorClass(data.color) +
|
|
|
|
"'>" +
|
|
|
|
"<h5>" +
|
|
|
|
data.label +
|
|
|
|
"</h5><hr/>" +
|
2019-02-26 15:04:41 +00:00
|
|
|
"<nav class='control'>" +
|
|
|
|
"<ul>" +
|
2019-03-26 15:22:21 +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>" +
|
2019-02-26 15:04:41 +00:00
|
|
|
"</ul>" +
|
2019-03-26 15:22:21 +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>"
|
|
|
|
: "") +
|
2019-02-26 15:04:41 +00:00
|
|
|
"</nav>" +
|
|
|
|
"</div>"
|
2018-11-26 17:25:10 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
$("#pf" + data.id).on({
|
2019-02-26 15:04:41 +00:00
|
|
|
touchstart: function(e) {
|
2018-11-26 17:25:10 +00:00
|
|
|
e.preventDefault();
|
2019-03-08 21:22:01 +00:00
|
|
|
padclick(UP, data.id, true);
|
2019-03-03 22:22:01 +00:00
|
|
|
},
|
2019-02-26 15:04:41 +00:00
|
|
|
touchend: function(e) {
|
2018-11-26 17:25:10 +00:00
|
|
|
e.preventDefault();
|
2019-03-08 21:22:01 +00:00
|
|
|
padclick(UP, data.id, false);
|
2018-11-26 17:25:10 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
$("#pl" + data.id).on({
|
2019-02-26 15:04:41 +00:00
|
|
|
touchstart: function(e) {
|
2018-11-26 17:25:10 +00:00
|
|
|
e.preventDefault();
|
|
|
|
padclick(LEFT, data.id, true);
|
2019-03-03 22:22:01 +00:00
|
|
|
},
|
2019-02-26 15:04:41 +00:00
|
|
|
touchend: function(e) {
|
2018-11-26 17:25:10 +00:00
|
|
|
e.preventDefault();
|
|
|
|
padclick(LEFT, data.id, false);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
$("#pr" + data.id).on({
|
2019-02-26 15:04:41 +00:00
|
|
|
touchstart: function(e) {
|
2018-11-26 17:25:10 +00:00
|
|
|
e.preventDefault();
|
|
|
|
padclick(RIGHT, data.id, true);
|
2019-03-03 22:22:01 +00:00
|
|
|
},
|
2019-02-26 15:04:41 +00:00
|
|
|
touchend: function(e) {
|
2018-11-26 17:25:10 +00:00
|
|
|
e.preventDefault();
|
|
|
|
padclick(RIGHT, data.id, false);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
$("#pb" + data.id).on({
|
2019-02-26 15:04:41 +00:00
|
|
|
touchstart: function(e) {
|
2018-11-26 17:25:10 +00:00
|
|
|
e.preventDefault();
|
2019-03-08 21:22:01 +00:00
|
|
|
padclick(DOWN, data.id, true);
|
2019-03-03 22:22:01 +00:00
|
|
|
},
|
2019-02-26 15:04:41 +00:00
|
|
|
touchend: function(e) {
|
2018-11-26 17:25:10 +00:00
|
|
|
e.preventDefault();
|
2019-03-08 21:22:01 +00:00
|
|
|
padclick(DOWN, data.id, false);
|
2018-11-26 17:25:10 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
$("#pc" + data.id).on({
|
2019-02-26 15:04:41 +00:00
|
|
|
touchstart: function(e) {
|
2018-11-26 17:25:10 +00:00
|
|
|
e.preventDefault();
|
|
|
|
padclick(CENTER, data.id, true);
|
2019-03-03 22:22:01 +00:00
|
|
|
},
|
2019-02-26 15:04:41 +00:00
|
|
|
touchend: function(e) {
|
2018-11-26 17:25:10 +00:00
|
|
|
e.preventDefault();
|
|
|
|
padclick(CENTER, data.id, false);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
|
|
|
//https://codepen.io/seanstopnik/pen/CeLqA
|
2018-11-26 17:25:10 +00:00
|
|
|
case UI_SLIDER:
|
2019-03-08 21:22:01 +00:00
|
|
|
var parent;
|
2019-03-26 15:22:21 +00:00
|
|
|
if (data.parentControl) {
|
|
|
|
parent = $("#tab" + data.parentControl);
|
2019-03-03 22:22:01 +00:00
|
|
|
} else {
|
2019-03-26 15:22:21 +00:00
|
|
|
parent = $("#row");
|
|
|
|
}
|
2019-03-08 21:22:01 +00:00
|
|
|
parent.append(
|
2019-03-26 15:22:21 +00:00
|
|
|
"<div id='id" +
|
|
|
|
data.id +
|
|
|
|
"' class='two columns card tcenter card-slider " +
|
|
|
|
colorClass(data.color) +
|
|
|
|
"'>" +
|
|
|
|
"<h5>" +
|
|
|
|
data.label +
|
|
|
|
"</h5><hr/>" +
|
2019-03-19 08:34:16 +00:00
|
|
|
"<div class='range-slider'>" +
|
2019-03-26 15:22:21 +00:00
|
|
|
"<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>" +
|
2019-02-26 15:04:41 +00:00
|
|
|
"</div>" +
|
2019-03-26 15:22:21 +00:00
|
|
|
"</div>"
|
2018-11-26 17:25:10 +00:00
|
|
|
);
|
2019-03-19 08:34:16 +00:00
|
|
|
rangeSlider();
|
2018-11-26 17:25:10 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case UI_NUMBER:
|
2019-03-08 21:22:01 +00:00
|
|
|
var parent;
|
2019-03-26 15:22:21 +00:00
|
|
|
if (data.parentControl) {
|
|
|
|
parent = $("#tab" + data.parentControl);
|
2019-03-03 22:22:01 +00:00
|
|
|
} else {
|
2019-03-26 15:22:21 +00:00
|
|
|
parent = $("#row");
|
2019-03-03 22:22:01 +00:00
|
|
|
}
|
2019-03-08 21:22:01 +00:00
|
|
|
parent.append(
|
2019-03-26 15:22:21 +00:00
|
|
|
"<div id='id" +
|
|
|
|
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 +
|
|
|
|
")' />" +
|
|
|
|
"</div>"
|
2018-11-26 17:25:10 +00:00
|
|
|
);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case UI_TEXT_INPUT:
|
2019-03-08 21:22:01 +00:00
|
|
|
var parent;
|
2019-03-26 15:22:21 +00:00
|
|
|
if (data.parentControl) {
|
|
|
|
parent = $("#tab" + data.parentControl);
|
2019-03-03 22:22:01 +00:00
|
|
|
} else {
|
2019-03-26 15:22:21 +00:00
|
|
|
parent = $("#row");
|
2019-03-03 22:22:01 +00:00
|
|
|
}
|
2019-03-08 21:22:01 +00:00
|
|
|
parent.append(
|
2019-03-26 15:22:21 +00:00
|
|
|
"<div id='id" +
|
|
|
|
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 +
|
|
|
|
")' />" +
|
|
|
|
"</div>"
|
2018-11-26 17:25:10 +00:00
|
|
|
);
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2019-03-03 22:22:01 +00:00
|
|
|
case UI_TAB:
|
|
|
|
$("#tabsnav").append(
|
|
|
|
"<li><a href='#tab" + data.id + "'>" + data.value + "</a></li>"
|
|
|
|
);
|
2019-03-26 15:22:21 +00:00
|
|
|
$("#tabscontent").append("<div id='tab" + data.id + "'></div>");
|
|
|
|
|
|
|
|
tabs = $(".tabscontent")
|
|
|
|
.tabbedContent({ loop: true })
|
|
|
|
.data("api");
|
|
|
|
// switch to tab...
|
|
|
|
$("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();
|
|
|
|
});
|
2019-03-03 22:22:01 +00:00
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2019-03-04 20:07:39 +00:00
|
|
|
case UI_SELECT:
|
2019-03-08 21:22:01 +00:00
|
|
|
var parent;
|
2019-03-26 15:22:21 +00:00
|
|
|
if (data.parentControl) {
|
|
|
|
parent = $("#tab" + data.parentControl);
|
2019-03-04 20:07:39 +00:00
|
|
|
} else {
|
2019-03-26 15:22:21 +00:00
|
|
|
parent = $("#row");
|
2019-03-04 20:07:39 +00:00
|
|
|
}
|
2019-03-08 21:22:01 +00:00
|
|
|
parent.append(
|
2019-03-26 15:22:21 +00:00
|
|
|
"<div id='id" +
|
|
|
|
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 +
|
|
|
|
")' />" +
|
|
|
|
"</div>"
|
2019-03-04 20:07:39 +00:00
|
|
|
);
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2019-03-04 20:07:39 +00:00
|
|
|
case UI_OPTION:
|
2019-03-26 15:22:21 +00:00
|
|
|
if (data.parentControl) {
|
|
|
|
var parent = $("#select" + data.parentControl);
|
2019-03-08 21:22:01 +00:00
|
|
|
parent.append(
|
2019-03-26 15:22:21 +00:00
|
|
|
"<option id='option" +
|
|
|
|
data.id +
|
|
|
|
"' value='" +
|
|
|
|
data.value +
|
|
|
|
"' " +
|
|
|
|
data.selected +
|
|
|
|
">" +
|
|
|
|
data.label +
|
|
|
|
"</option>"
|
2019-03-04 20:07:39 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2019-03-19 08:34:16 +00:00
|
|
|
case UI_MIN:
|
2019-03-26 15:22:21 +00:00
|
|
|
if (data.parentControl) {
|
|
|
|
var parent = $("#id" + data.parentControl + " input");
|
|
|
|
if (parent.size()) {
|
2019-03-19 08:34:16 +00:00
|
|
|
console.log("MIN" + data.value);
|
|
|
|
parent.attr("min", data.value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2019-03-19 08:34:16 +00:00
|
|
|
case UI_MAX:
|
2019-03-26 15:22:21 +00:00
|
|
|
if (data.parentControl) {
|
|
|
|
var parent = $("#id" + data.parentControl + " input");
|
|
|
|
if (parent.size()) {
|
2019-03-19 08:34:16 +00:00
|
|
|
console.log("MAX" + data.value);
|
|
|
|
parent.attr("max", data.value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2019-03-19 08:34:16 +00:00
|
|
|
case UI_STEP:
|
2019-03-26 15:22:21 +00:00
|
|
|
if (data.parentControl) {
|
|
|
|
var parent = $("#id" + data.parentControl + " input");
|
|
|
|
if (parent.size()) {
|
2019-03-19 08:34:16 +00:00
|
|
|
console.log("STEP" + data.value);
|
|
|
|
parent.attr("step", data.value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
case UI_GRAPH:
|
|
|
|
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) +
|
|
|
|
"'>" +
|
|
|
|
"<h5>" +
|
|
|
|
data.label +
|
|
|
|
"</h5><hr/>" +
|
2019-04-15 13:32:14 +00:00
|
|
|
"<figure id='graph" +
|
2019-03-26 15:22:21 +00:00
|
|
|
data.id +
|
2019-04-15 13:32:14 +00:00
|
|
|
"'>" +
|
|
|
|
"<figcaption>" +
|
|
|
|
data.label +
|
|
|
|
"</figcaption>" +
|
|
|
|
"</figure>" +
|
2019-03-26 15:22:21 +00:00
|
|
|
"</div>"
|
|
|
|
);
|
2019-12-27 15:57:11 +00:00
|
|
|
graphData[data.id] = restoreGraphData(data.id);
|
2019-04-15 13:32:14 +00:00
|
|
|
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 });
|
2019-12-27 15:57:11 +00:00
|
|
|
saveGraphData();
|
2019-04-15 13:32:14 +00:00
|
|
|
renderGraphSvg(graphData[data.id], "graph" + data.id);
|
|
|
|
break;
|
|
|
|
case CLEAR_GRAPH:
|
|
|
|
graphData[data.id] = [];
|
2019-12-27 15:57:11 +00:00
|
|
|
saveGraphData();
|
2019-04-15 13:32:14 +00:00
|
|
|
renderGraphSvg(graphData[data.id], "graph" + data.id);
|
2019-03-26 15:22:21 +00:00
|
|
|
break;
|
|
|
|
case UI_GAUGE:
|
|
|
|
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) +
|
|
|
|
"'>" +
|
|
|
|
"<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 +
|
|
|
|
")' />" +
|
|
|
|
"</div>"
|
|
|
|
);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case UI_ACCEL:
|
2019-12-27 14:36:54 +00:00
|
|
|
if (hasAccel) break;
|
2019-03-26 15:22:21 +00:00
|
|
|
var parent;
|
|
|
|
if (data.parentControl) {
|
|
|
|
parent = $("#tab" + data.parentControl);
|
|
|
|
} else {
|
|
|
|
parent = $("#row");
|
|
|
|
}
|
2019-12-27 14:36:54 +00:00
|
|
|
hasAccel = true;
|
2019-03-26 15:22:21 +00:00
|
|
|
parent.append(
|
|
|
|
"<div id='id" +
|
|
|
|
data.id +
|
|
|
|
"' class='two columns card tcenter " +
|
|
|
|
colorClass(data.color) +
|
|
|
|
"'>" +
|
|
|
|
"<h5>" +
|
|
|
|
data.label +
|
|
|
|
"</h5><hr/>" +
|
2019-12-27 14:36:54 +00:00
|
|
|
"ACCEL // Not implemented fully!<div class='accelerometer' id='accel" +
|
2019-03-26 15:22:21 +00:00
|
|
|
data.id +
|
|
|
|
"' ><div class='ball" +
|
|
|
|
data.id +
|
|
|
|
"'></div><pre class='accelerometeroutput" +
|
|
|
|
data.id +
|
|
|
|
"'></pre>" +
|
|
|
|
"</div>"
|
|
|
|
);
|
2019-12-27 14:36:54 +00:00
|
|
|
|
|
|
|
requestOrientationPermission();
|
2019-03-26 15:22:21 +00:00
|
|
|
break;
|
|
|
|
|
2019-03-08 21:22:01 +00:00
|
|
|
case UPDATE_LABEL:
|
|
|
|
$("#l" + data.id).html(data.value);
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2019-03-08 21:22:01 +00:00
|
|
|
case UPDATE_SWITCHER:
|
2019-03-26 15:22:21 +00:00
|
|
|
switcher(data.id, data.value == "0" ? 0 : 1);
|
2019-03-08 21:22:01 +00:00
|
|
|
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;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2019-03-04 20:07:39 +00:00
|
|
|
case UPDATE_SELECT:
|
|
|
|
$("#select" + data.id).val(data.value);
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2019-03-08 21:22:01 +00:00
|
|
|
case UPDATE_BUTTON:
|
|
|
|
case UPDATE_PAD:
|
|
|
|
case UPDATE_CPAD:
|
|
|
|
break;
|
2019-03-26 15:22:21 +00:00
|
|
|
case UPDATE_GAUGE:
|
|
|
|
$("#gauge" + data.id).val(data.value);
|
|
|
|
break;
|
|
|
|
case UPDATE_ACCEL:
|
|
|
|
break;
|
2018-11-26 17:25:10 +00:00
|
|
|
|
|
|
|
default:
|
|
|
|
console.error("Unknown type or event");
|
|
|
|
break;
|
|
|
|
}
|
2019-03-26 15:22:21 +00:00
|
|
|
|
|
|
|
if (data.type >= UPDATE_OFFSET && data.type < UI_INITIAL_GUI) {
|
|
|
|
var element = $("#id" + data.id);
|
|
|
|
// FIXME: Test sliderupdate
|
|
|
|
// 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));
|
|
|
|
// }
|
2019-03-08 21:22:01 +00:00
|
|
|
}
|
2018-11-26 17:25:10 +00:00
|
|
|
};
|
2019-03-26 15:22:21 +00:00
|
|
|
|
2018-12-26 11:35:35 +00:00
|
|
|
websock.onmessage = handleEvent;
|
2017-10-17 09:55:25 +00:00
|
|
|
}
|
|
|
|
|
2019-03-19 08:34:16 +00:00
|
|
|
function sliderchange(number) {
|
|
|
|
var val = $("#sl" + number).val();
|
|
|
|
console.log("slvalue:" + val + ":" + number);
|
|
|
|
websock.send("slvalue:" + val + ":" + number);
|
|
|
|
}
|
|
|
|
|
2018-05-27 09:47:53 +00:00
|
|
|
function numberchange(number) {
|
2018-11-26 17:25:10 +00:00
|
|
|
var val = $("#num" + number).val();
|
|
|
|
websock.send("nvalue:" + val + ":" + number);
|
2018-05-27 09:47:53 +00:00
|
|
|
}
|
|
|
|
|
2018-11-26 17:25:10 +00:00
|
|
|
function textchange(number) {
|
|
|
|
var val = $("#text" + number).val();
|
|
|
|
websock.send("tvalue:" + val + ":" + number);
|
2019-03-04 20:07:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function selectchange(number) {
|
|
|
|
var val = $("#select" + number).val();
|
|
|
|
websock.send("svalue:" + val + ":" + number);
|
2018-11-26 17:25:10 +00:00
|
|
|
}
|
2017-10-19 11:46:47 +00:00
|
|
|
|
|
|
|
function buttonclick(number, isdown) {
|
2018-11-26 17:25:10 +00:00
|
|
|
if (isdown) websock.send("bdown:" + number);
|
|
|
|
else websock.send("bup:" + number);
|
2017-10-19 11:46:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function padclick(type, number, isdown) {
|
2018-11-26 17:25:10 +00:00
|
|
|
switch (type) {
|
|
|
|
case CENTER:
|
|
|
|
if (isdown) websock.send("pcdown:" + number);
|
|
|
|
else websock.send("pcup:" + number);
|
|
|
|
break;
|
2019-03-08 21:22:01 +00:00
|
|
|
case UP:
|
2018-11-26 17:25:10 +00:00
|
|
|
if (isdown) websock.send("pfdown:" + number);
|
|
|
|
else websock.send("pfup:" + number);
|
|
|
|
break;
|
2019-03-08 21:22:01 +00:00
|
|
|
case DOWN:
|
2018-11-26 17:25:10 +00:00
|
|
|
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;
|
|
|
|
}
|
2017-10-17 09:55:25 +00:00
|
|
|
}
|
2017-10-19 15:30:32 +00:00
|
|
|
|
2017-11-14 11:14:59 +00:00
|
|
|
function switcher(number, state) {
|
2018-11-26 17:25:10 +00:00
|
|
|
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");
|
2017-10-19 15:30:32 +00:00
|
|
|
}
|
2018-11-26 17:25:10 +00:00
|
|
|
} 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);
|
|
|
|
}
|
2019-02-26 15:04:41 +00:00
|
|
|
}
|
2019-03-19 08:34:16 +00:00
|
|
|
|
2019-03-26 15:22:21 +00:00
|
|
|
var rangeSlider = function() {
|
|
|
|
var slider = $(".range-slider"),
|
|
|
|
range = $(".range-slider__range"),
|
|
|
|
value = $(".range-slider__value");
|
2019-03-19 08:34:16 +00:00
|
|
|
|
2019-03-26 15:22:21 +00:00
|
|
|
slider.each(function() {
|
|
|
|
value.each(function() {
|
|
|
|
var value = $(this)
|
|
|
|
.prev()
|
|
|
|
.attr("value");
|
2019-03-19 08:34:16 +00:00
|
|
|
$(this).html(value);
|
|
|
|
});
|
|
|
|
|
|
|
|
range.on({
|
2019-03-26 15:22:21 +00:00
|
|
|
input: function() {
|
|
|
|
$(this)
|
|
|
|
.next()
|
|
|
|
.html(this.value);
|
2019-03-19 08:34:16 +00:00
|
|
|
},
|
2019-03-26 15:22:21 +00:00
|
|
|
change: function() {
|
|
|
|
sliderchange(
|
|
|
|
$(this)
|
|
|
|
.attr("id")
|
|
|
|
.replace(/^\D+/g, "")
|
|
|
|
);
|
2019-03-19 08:34:16 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|