2024-11-10 01:27:36 +00:00
|
|
|
<!DOCTYPE html>
|
|
|
|
<html lang="de">
|
|
|
|
<head>
|
|
|
|
<meta charset="utf-8">
|
|
|
|
<title>Pixelserver Interface</title>
|
|
|
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=1, viewport-fit=auto"/>
|
|
|
|
<link rel="apple-touch-icon" sizes="180x180" href="/icons/apple-touch-icon.png">
|
|
|
|
<link rel="icon" type="image/png" sizes="32x32" href="/icons/favicon-32x32.png">
|
|
|
|
<link rel="icon" type="image/png" sizes="16x16" href="/icons/favicon-16x16.png">
|
|
|
|
<link rel="manifest" href="/site.webmanifest">
|
|
|
|
|
|
|
|
<style>
|
|
|
|
.main {
|
|
|
|
display: grid;
|
|
|
|
grid-gap: 1rem;
|
|
|
|
align-items: stretch;
|
|
|
|
}
|
|
|
|
|
|
|
|
@media only screen {
|
|
|
|
.main {
|
|
|
|
grid-template-columns: repeat(1, 1fr);
|
|
|
|
}
|
|
|
|
}
|
2024-10-29 20:42:04 +00:00
|
|
|
|
2024-11-10 01:27:36 +00:00
|
|
|
@media only screen and (min-width: 800px) {
|
|
|
|
.main {
|
|
|
|
grid-template-columns: repeat(2, 1fr);
|
|
|
|
}
|
|
|
|
}
|
2018-08-26 20:07:06 +00:00
|
|
|
|
2024-11-10 01:27:36 +00:00
|
|
|
@media only screen and (min-width: 1111px) {
|
|
|
|
.main {
|
|
|
|
grid-template-columns: repeat(3, 1fr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.col {
|
|
|
|
min-width: 300px;
|
|
|
|
/*max-width: 350px;*/
|
|
|
|
}
|
|
|
|
|
|
|
|
.just, .just-col {
|
|
|
|
display: flex;
|
|
|
|
}
|
|
|
|
|
|
|
|
.just > * {
|
|
|
|
flex: 1;
|
|
|
|
margin: 0 1rem;
|
|
|
|
}
|
|
|
|
|
|
|
|
.just-col {
|
|
|
|
flex-direction: column;
|
|
|
|
}
|
|
|
|
|
|
|
|
.just-col > * {
|
|
|
|
flex: 1;
|
|
|
|
margin: 2px 1rem;
|
|
|
|
}
|
|
|
|
|
|
|
|
#gammaform span {
|
|
|
|
display: inline-block;
|
|
|
|
width: 4rem;
|
|
|
|
}
|
|
|
|
|
|
|
|
.logging {
|
|
|
|
max-width: 500px;
|
|
|
|
}
|
|
|
|
|
|
|
|
.options {
|
|
|
|
max-width: 350px;
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<h1 style="text-align: center;">Andreas <i>production-ready</i> Interface</h1>
|
|
|
|
<div class="main">
|
|
|
|
<div class="col">
|
2018-08-26 20:07:06 +00:00
|
|
|
<h2>Kommando:</h2>
|
2024-11-10 01:27:36 +00:00
|
|
|
<form id="in" class="just" onSubmit="return request()">
|
2019-01-01 11:51:34 +00:00
|
|
|
<select id="list"></select>
|
2024-11-10 01:27:36 +00:00
|
|
|
<input id="args"/>
|
2019-01-01 11:51:34 +00:00
|
|
|
<button id="execute">Ausführen</button>
|
|
|
|
</form>
|
2018-08-26 20:07:06 +00:00
|
|
|
|
2019-01-01 11:51:34 +00:00
|
|
|
<h2>Intensität:</h2>
|
2024-11-10 01:27:36 +00:00
|
|
|
<form id="brightnessform" class="just" onSubmit="return setbrightness()">
|
|
|
|
<input id="brightness" value="1.0"><br/>
|
2019-01-01 11:51:34 +00:00
|
|
|
<button id="sendbrightness">Setzen</button>
|
|
|
|
</form>
|
2024-10-28 17:10:03 +00:00
|
|
|
</div>
|
2024-11-10 01:27:36 +00:00
|
|
|
<div class="options col">
|
2018-10-21 13:55:12 +00:00
|
|
|
<h2>Gamma:</h2>
|
2024-11-10 01:27:36 +00:00
|
|
|
<form id="gammaform" class="just-col" onSubmit="return setgamma()">
|
|
|
|
<label><span>Rot: </span><input id="gammar" value="2.8"/></label><br/>
|
|
|
|
<label><span>Grün: </span><input id="gammag" value="2.65"/></label><br/>
|
|
|
|
<label><span>Blau: </span><input id="gammab" value="2.65"/></label><br/>
|
|
|
|
<label><span>Weiß: </span><input id="gammaw" value="2.65"/></label><br/>
|
2019-01-01 11:51:34 +00:00
|
|
|
<button id="sendgamma">Setzen</button>
|
|
|
|
</form>
|
2018-10-21 13:55:12 +00:00
|
|
|
|
2024-10-28 17:10:03 +00:00
|
|
|
<h2>Flip:</h2>
|
2024-11-10 01:27:36 +00:00
|
|
|
<form id="flipform" class="just" onSubmit="return setFlip()">
|
|
|
|
<label><input id="flipx" type="checkbox"/> Flip X</label>
|
|
|
|
<label><input id="flipy" type="checkbox"/> Flip Y</label>
|
2024-10-28 17:10:03 +00:00
|
|
|
<button id="sendflip">Setzen</button>
|
|
|
|
</form>
|
|
|
|
|
|
|
|
<h2>Filterimage:</h2>
|
2024-11-10 01:27:36 +00:00
|
|
|
<form id="filterform" class="just" onSubmit="return setFilter()">
|
|
|
|
<input id="filtername" value="test">
|
|
|
|
<button id="filterflip">Setzen</button>
|
2024-10-28 17:10:03 +00:00
|
|
|
</form>
|
|
|
|
|
|
|
|
<h2>Filter expression:</h2>
|
2024-11-10 01:27:36 +00:00
|
|
|
<form id="filterexprform" class="just" onSubmit="return setFilterExpr()">
|
|
|
|
<input id="filterexpr" value="0.5+0.25*sin(x/3+t)">
|
|
|
|
<button>Setzen</button>
|
2024-10-28 17:10:03 +00:00
|
|
|
</form>
|
|
|
|
</div>
|
2024-11-10 01:27:36 +00:00
|
|
|
<div class="logging col">
|
|
|
|
<h2>Crash Log:
|
|
|
|
<button id="crashlogbtn" type="button" onclick="return enableCrashLog()">start</button>
|
|
|
|
</h2>
|
|
|
|
<textarea readonly id="crashlogs" style="width: 500px; height: 300px; display: none;"></textarea>
|
|
|
|
|
|
|
|
<h2>Log:
|
|
|
|
<button id="logbtn" type="button" onclick="return enableLog()">start</button>
|
|
|
|
</h2>
|
|
|
|
<textarea readonly id="logs" style="width: 500px; height: 300px; display: none;"></textarea>
|
2024-10-28 17:10:03 +00:00
|
|
|
</div>
|
2024-11-10 01:27:36 +00:00
|
|
|
<script>
|
|
|
|
function getRaw(url, callback) {
|
|
|
|
const xhttp = new XMLHttpRequest();
|
|
|
|
xhttp.onreadystatechange = function () {
|
|
|
|
if (this.readyState === 4 && this.status === 200)
|
|
|
|
if (callback) callback(xhttp.responseText);
|
|
|
|
};
|
|
|
|
xhttp.open("GET", url, true);
|
|
|
|
xhttp.send();
|
|
|
|
}
|
|
|
|
|
|
|
|
function getJSON(url, callback) {
|
|
|
|
getRaw(url, function (text) {
|
|
|
|
callback(JSON.parse(text));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function post(url, data) {
|
|
|
|
const formdata = new FormData();
|
|
|
|
for (const key in data)
|
|
|
|
formdata.append(key, data[key]);
|
|
|
|
|
|
|
|
const xhttp = new XMLHttpRequest();
|
|
|
|
// xhttp.onreadystatechange = function () {
|
|
|
|
// if (this.readyState === 4 && this.status === 200) {}
|
|
|
|
// };
|
|
|
|
xhttp.open("POST", url, true);
|
|
|
|
xhttp.send(formdata);
|
|
|
|
}
|
|
|
|
|
|
|
|
function populateForm(parameters) {
|
|
|
|
const list = document.getElementById("list");
|
|
|
|
|
|
|
|
for (const i in parameters) {
|
|
|
|
const app = parameters[i];
|
|
|
|
const name = app["name"];
|
|
|
|
const guiname = app["guiname"];
|
|
|
|
const persistent = app["persistent"];
|
|
|
|
const element = document.createElement("option");
|
|
|
|
element.value = name;
|
|
|
|
element.innerHTML = guiname;
|
|
|
|
element.dataset.persistent = persistent;
|
|
|
|
list.appendChild(element);
|
2018-08-26 20:07:06 +00:00
|
|
|
}
|
|
|
|
|
2024-11-10 01:27:36 +00:00
|
|
|
list.onchange = function () {
|
|
|
|
const app = document.getElementById('list');
|
|
|
|
const persistent = app.options[app.selectedIndex].dataset.persistent;
|
|
|
|
if (persistent == "true") {
|
|
|
|
document.getElementById("args").style.display = "none";
|
|
|
|
} else {
|
|
|
|
document.getElementById("args").style.display = "inline";
|
2018-08-26 20:07:06 +00:00
|
|
|
}
|
2024-11-10 01:27:36 +00:00
|
|
|
};
|
|
|
|
list.onchange();
|
|
|
|
document.getElementById("container").style.display = "block";
|
|
|
|
}
|
|
|
|
|
|
|
|
function request() {
|
|
|
|
let app = document.getElementById('list');
|
|
|
|
let val = app.options[app.selectedIndex].value;
|
|
|
|
let parameter = document.getElementById('args').value;
|
|
|
|
post("/apps/start/" + val, {"param": parameter});
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
function setgamma() {
|
|
|
|
const r = document.getElementById('gammar').value;
|
|
|
|
const g = document.getElementById('gammag').value;
|
|
|
|
const b = document.getElementById('gammab').value;
|
|
|
|
const w = document.getElementById('gammaw').value;
|
|
|
|
getRaw(`/setgamma/${r}/${g}/${b}/${w}`);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
function setbrightness() {
|
|
|
|
const i = document.getElementById('brightness').value;
|
|
|
|
getRaw("/setbrightness/" + i);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
function setFlip() {
|
|
|
|
const x = document.getElementById('flipx').checked;
|
|
|
|
const y = document.getElementById('flipy').checked;
|
|
|
|
getRaw("/filter/flipx/" + x);
|
|
|
|
getRaw("/filter/flipy/" + y);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
function setFilter() {
|
|
|
|
const i = document.getElementById('filtername').value;
|
|
|
|
getRaw("/filter/img/" + i);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
function setFilterExpr() {
|
|
|
|
const expr = document.getElementById('filterexpr').value;
|
|
|
|
post("/filter/expr/", {"expr": expr});
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
function updateLog() {
|
|
|
|
getRaw("/apps/log", function (text) {
|
|
|
|
document.getElementById('logs').value = text;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function updateCrashLog() {
|
|
|
|
getRaw("/apps/crashlog", function (text) {
|
|
|
|
document.getElementById('crashlogs').value = text;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function enableCrashLog() {
|
|
|
|
document.getElementById("crashlogbtn").remove();
|
|
|
|
document.getElementById("crashlogs").style.display = "block";
|
|
|
|
updateCrashLog();
|
|
|
|
setInterval(updateCrashLog, 1000);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
function enableLog() {
|
|
|
|
document.getElementById("logbtn").remove();
|
|
|
|
document.getElementById("logs").style.display = "block";
|
|
|
|
updateLog();
|
|
|
|
setInterval(updateLog, 1000);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
getJSON("/apps/list", populateForm);
|
|
|
|
</script>
|
|
|
|
</div>
|
|
|
|
</body>
|
2018-10-21 13:55:12 +00:00
|
|
|
</html>
|