|
|
|
@ -7,11 +7,16 @@ |
|
|
|
|
<link rel="stylesheet" href="custom.css"> |
|
|
|
|
|
|
|
|
|
<script type="text/javascript"> |
|
|
|
|
const hexToRgb = hex => |
|
|
|
|
hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i |
|
|
|
|
,(m, r, g, b) => '#' + r + r + g + g + b + b) |
|
|
|
|
.substring(1).match(/.{2}/g) |
|
|
|
|
.map(x => parseInt(x, 16)); |
|
|
|
|
'use strict'; |
|
|
|
|
function hexToRgb(value) { |
|
|
|
|
var aRgbHex = value.substring(1).match(/.{1,2}/g); |
|
|
|
|
var aRgb = [ |
|
|
|
|
parseInt(aRgbHex[0], 16), |
|
|
|
|
parseInt(aRgbHex[1], 16), |
|
|
|
|
parseInt(aRgbHex[2], 16) |
|
|
|
|
]; |
|
|
|
|
return aRgb; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function show_loading(visible) { |
|
|
|
|
document.getElementById('loading').style.visibility = visible ? 'visible' : 'hidden'; |
|
|
|
@ -21,9 +26,11 @@ |
|
|
|
|
show_loading(true); |
|
|
|
|
var http = new XMLHttpRequest(); |
|
|
|
|
http.open('GET', url, true); |
|
|
|
|
http.setRequestHeader('accept', 'application/json'); |
|
|
|
|
http.onreadystatechange = function() { |
|
|
|
|
if (http.readyState == 4 && http.status == 200) { |
|
|
|
|
show_loading(false); |
|
|
|
|
updateStatus(http.responseText); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
http.send(); |
|
|
|
@ -34,6 +41,7 @@ |
|
|
|
|
var http = new XMLHttpRequest(); |
|
|
|
|
http.open('POST', url, true); |
|
|
|
|
http.setRequestHeader('Content-Type', 'application/json'); |
|
|
|
|
http.setRequestHeader('accept', 'application/json'); |
|
|
|
|
http.onreadystatechange = function() { |
|
|
|
|
if (http.readyState == 4 && http.status == 200) { |
|
|
|
|
show_loading(false); |
|
|
|
@ -43,9 +51,33 @@ |
|
|
|
|
http.send(json); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function updateStatus(json) { |
|
|
|
|
let status = JSON.parse(json); |
|
|
|
|
document.getElementById('tempo').value = status.features.tempo.bpm; |
|
|
|
|
let regions = status.features.region; |
|
|
|
|
for (let i = 0, len = regions.length; i < len; i++) { |
|
|
|
|
if (regions[i]) { |
|
|
|
|
document.getElementById('region_' + i).classList.remove('region_off'); |
|
|
|
|
} else { |
|
|
|
|
document.getElementById('region_' + i).classList.add('region_off'); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
let programs = document.getElementsByName('program_select'); |
|
|
|
|
for (var i = 0, len = programs.length; i < len; i++) { |
|
|
|
|
if (programs[i].value === status.features.program) { |
|
|
|
|
programs[i].checked = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function getProgramSelection() { |
|
|
|
|
let select = document.getElementById('program'); |
|
|
|
|
return select.value; |
|
|
|
|
let radios = document.getElementsByName('program_select'); |
|
|
|
|
for (var i = 0, length = radios.length; i < length; i++) { |
|
|
|
|
if (radios[i].checked) { |
|
|
|
|
return radios[i].value; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function isLoop() { |
|
|
|
@ -81,38 +113,53 @@ |
|
|
|
|
<div class="spacer-row"></div> |
|
|
|
|
<div class="container"> |
|
|
|
|
<div class="row"> |
|
|
|
|
<button onclick="send_get('/status')">get</button> |
|
|
|
|
<button onclick="doInit()">intro</button> |
|
|
|
|
<button onclick="doCancel()">halt</button> |
|
|
|
|
<button onclick="doBlind()">leds off</button> |
|
|
|
|
|
|
|
|
|
<label><input type="checkbox" id="looping" /><b> loop</b></label> |
|
|
|
|
<label><input type="checkbox" id="looping" checked/><b> loop</b></label> |
|
|
|
|
</div> |
|
|
|
|
<div class="row"> |
|
|
|
|
<input id="tempo" type="number" step="0.1" onchange="send_get('/tempo/set/' + parseFloat(this.value).toFixed(2))" value="{{ status.features.tempo.bpm }}"> |
|
|
|
|
<button onclick="send_get('/tempo/sync')">sync</button> |
|
|
|
|
</div> |
|
|
|
|
<div class="row"> |
|
|
|
|
<p>Zone switch</p> |
|
|
|
|
{% for region in regions %} |
|
|
|
|
<button onclick="switchRegion({{ region }})">zone {{ region }}</button> |
|
|
|
|
{% set region_off = '' %} |
|
|
|
|
{% if not status.features.region[region] %} |
|
|
|
|
{% set region_off = ' region_off' %} |
|
|
|
|
{% endif %} |
|
|
|
|
<button id="region_{{ region }}" class="region{{ region_off }}" onclick="switchRegion({{ region }})">zone {{ region }}</button> |
|
|
|
|
{% endfor %} |
|
|
|
|
</div> |
|
|
|
|
<div class="row" id='loading' style="visibility: hidden"><b>LOADING!</b></div> |
|
|
|
|
<div class="section-rgb"> |
|
|
|
|
<div class="row"> |
|
|
|
|
<div class="one-third column"> |
|
|
|
|
<select id="program" size="10"> |
|
|
|
|
{% for group in programs %} |
|
|
|
|
<optgroup label="{{ group.group }}"> |
|
|
|
|
{% for program in group.programs %} |
|
|
|
|
<option value="{{ program.prg }}">{{ program.name }}</option> |
|
|
|
|
{% endfor %} |
|
|
|
|
</optgroup> |
|
|
|
|
<div class="row"> |
|
|
|
|
<div class="program_select one-half column"> |
|
|
|
|
{% for group in programs %} |
|
|
|
|
<ul> |
|
|
|
|
<li>{{ group.group }}</li> |
|
|
|
|
{% for program in group.programs %} |
|
|
|
|
{% set pr_checked = '' %} |
|
|
|
|
{% if status.features.program == program.prg %} |
|
|
|
|
{% set pr_checked = ' checked' %} |
|
|
|
|
{% endif %} |
|
|
|
|
<li> |
|
|
|
|
<label> |
|
|
|
|
<input type="radio" name="program_select" value="{{ program.prg }}"{{ pr_checked }}> |
|
|
|
|
{{ program.name }} |
|
|
|
|
</label> |
|
|
|
|
</li> |
|
|
|
|
{% endfor %} |
|
|
|
|
</select> |
|
|
|
|
</div> |
|
|
|
|
</ul> |
|
|
|
|
{% endfor %} |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="row"> |
|
|
|
|
<div class ="one-third column"> |
|
|
|
|
<input class="colorpicker" type="color" value="#ff0000" oninput="isChanged(this.value)"> |
|
|
|
|
<input id="colorpicker" class="colorpicker" type="color" value="#ff0000" oninput="isChanged(this.value)"> |
|
|
|
|
</div> |
|
|
|
|
<button onclick="isChanged(document.getElementById('colorpicker').value)">Set</button> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</body> |
|
|
|
|