Breaking Change: ledLayout, ledColorsStream (#614)

* Remove clone & index in ledConfig

* Additional index correction

* Rename ledsConfig maximum and minimum in max and min

* Rename ledsConfig hscan and vscan with h and v

* Optimize ledColorsStream

* tiny correction
This commit is contained in:
brindosch 2019-08-25 16:32:19 +02:00 committed by GitHub
parent 24495bbc65
commit b1fa085d64
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 466 additions and 624 deletions

View File

@ -24,12 +24,12 @@ function createLedPreview(leds, origin){
$('#previewcreator').html($.i18n('conf_leds_layout_preview_originMA')); $('#previewcreator').html($.i18n('conf_leds_layout_preview_originMA'));
$('#leds_preview').css("padding-top", "100%"); $('#leds_preview').css("padding-top", "100%");
} }
$('#previewledcount').html($.i18n('conf_leds_layout_preview_totalleds', leds.length)); $('#previewledcount').html($.i18n('conf_leds_layout_preview_totalleds', leds.length));
$('#previewledpower').html($.i18n('conf_leds_layout_preview_ledpower', ((leds.length * 0.06)*1.1).toFixed(1))); $('#previewledpower').html($.i18n('conf_leds_layout_preview_ledpower', ((leds.length * 0.06)*1.1).toFixed(1)));
$('.st_helper').css("border", "8px solid grey"); $('.st_helper').css("border", "8px solid grey");
var canvas_height = $('#leds_preview').innerHeight(); var canvas_height = $('#leds_preview').innerHeight();
var canvas_width = $('#leds_preview').innerWidth(); var canvas_width = $('#leds_preview').innerWidth();
@ -39,17 +39,17 @@ function createLedPreview(leds, origin){
var led = leds[idx]; var led = leds[idx];
var led_id='ledc_'+[idx]; var led_id='ledc_'+[idx];
var bgcolor = "background-color:hsl("+(idx*360/leds.length)+",100%,50%);"; var bgcolor = "background-color:hsl("+(idx*360/leds.length)+",100%,50%);";
var pos = "left:"+(led.hscan.minimum * canvas_width)+"px;"+ var pos = "left:"+(led.h.min * canvas_width)+"px;"+
"top:"+(led.vscan.minimum * canvas_height)+"px;"+ "top:"+(led.v.min * canvas_height)+"px;"+
"width:"+((led.hscan.maximum-led.hscan.minimum) * (canvas_width-1))+"px;"+ "width:"+((led.h.max-led.h.min) * (canvas_width-1))+"px;"+
"height:"+((led.vscan.maximum-led.vscan.minimum) * (canvas_height-1))+"px;"; "height:"+((led.v.max-led.v.min) * (canvas_height-1))+"px;";
leds_html += '<div id="'+led_id+'" class="led" style="'+bgcolor+pos+'" title="'+led.index+'"><span id="'+led_id+'_num" class="led_prev_num">'+led.index+'</span></div>'; leds_html += '<div id="'+led_id+'" class="led" style="'+bgcolor+pos+'" title="'+idx+'"><span id="'+led_id+'_num" class="led_prev_num">'+idx+'</span></div>';
} }
$('#leds_preview').html(leds_html); $('#leds_preview').html(leds_html);
$('#ledc_0').css({"background-color":"black","z-index":"12"}); $('#ledc_0').css({"background-color":"black","z-index":"12"});
$('#ledc_1').css({"background-color":"grey","z-index":"11"}); $('#ledc_1').css({"background-color":"grey","z-index":"11"});
$('#ledc_2').css({"background-color":"#A9A9A9","z-index":"10"}); $('#ledc_2').css({"background-color":"#A9A9A9","z-index":"10"});
if($('#leds_prev_toggle_num').hasClass('btn-success')) if($('#leds_prev_toggle_num').hasClass('btn-success'))
$('.led_prev_num').css("display", "inline"); $('.led_prev_num').css("display", "inline");
@ -65,14 +65,14 @@ function createClassicLeds(){
var ledsgpos = parseInt($("#ip_cl_gpos").val()); var ledsgpos = parseInt($("#ip_cl_gpos").val());
var position = parseInt($("#ip_cl_position").val()); var position = parseInt($("#ip_cl_position").val());
var reverse = $("#ip_cl_reverse").is(":checked"); var reverse = $("#ip_cl_reverse").is(":checked");
//advanced values //advanced values
var ledsVDepth = parseInt($("#ip_cl_vdepth").val())/100; var ledsVDepth = parseInt($("#ip_cl_vdepth").val())/100;
var ledsHDepth = parseInt($("#ip_cl_hdepth").val())/100; var ledsHDepth = parseInt($("#ip_cl_hdepth").val())/100;
var edgeVGap = parseInt($("#ip_cl_edgegap").val())/100/2; var edgeVGap = parseInt($("#ip_cl_edgegap").val())/100/2;
//var cornerVGap = parseInt($("#ip_cl_cornergap").val())/100/2; //var cornerVGap = parseInt($("#ip_cl_cornergap").val())/100/2;
var overlap = $("#ip_cl_overlap").val()/4000; var overlap = $("#ip_cl_overlap").val()/4000;
//helper //helper
var edgeHGap = edgeVGap/(16/9); var edgeHGap = edgeVGap/(16/9);
//var cornerHGap = cornerVGap/(16/9); //var cornerHGap = cornerVGap/(16/9);
@ -83,15 +83,15 @@ function createClassicLeds(){
var Hdiff = Hmax-Hmin; var Hdiff = Hmax-Hmin;
var Vdiff = Vmax-Vmin; var Vdiff = Vmax-Vmin;
var ledArray = []; var ledArray = [];
function createFinalArray(array){ function createFinalArray(array){
finalLedArray = []; finalLedArray = [];
for(var i = 0; i<array.length; i++){ for(var i = 0; i<array.length; i++){
var hmin = array[i].hscan.minimum; var hmin = array[i].h.min;
var hmax = array[i].hscan.maximum; var hmax = array[i].h.max;
var vmin = array[i].vscan.minimum; var vmin = array[i].v.min;
var vmax = array[i].vscan.maximum; var vmax = array[i].v.max;
finalLedArray[i] = { "index" : i, "hscan": { "maximum" : hmax, "minimum" : hmin }, "vscan": { "maximum": vmax, "minimum": vmin}} finalLedArray[i] = { "h": { "max" : hmax, "min" : hmin }, "v": { "max": vmax, "min": vmin}}
} }
createLedPreview(finalLedArray, 'classic'); createLedPreview(finalLedArray, 'classic');
} }
@ -111,7 +111,7 @@ function createClassicLeds(){
return array; return array;
} }
} }
function valScan(val) function valScan(val)
{ {
if(val > 1) if(val > 1)
@ -120,7 +120,7 @@ function createClassicLeds(){
return 0; return 0;
return val; return val;
} }
function ovl(scan,val) function ovl(scan,val)
{ {
if(scan == "+") if(scan == "+")
@ -128,15 +128,15 @@ function createClassicLeds(){
else else
return valScan(val -= overlap); return valScan(val -= overlap);
} }
function createLedArray(hmin, hmax, vmin, vmax){ function createLedArray(hmin, hmax, vmin, vmax){
hmin = round(hmin); hmin = round(hmin);
hmax = round(hmax); hmax = round(hmax);
vmin = round(vmin); vmin = round(vmin);
vmax = round(vmax); vmax = round(vmax);
ledArray.push( { "hscan" : { "minimum" : hmin, "maximum" : hmax }, "vscan": { "minimum": vmin, "maximum": vmax }} ); ledArray.push( { "h" : { "min" : hmin, "max" : hmax }, "v": { "min": vmin, "max": vmax }} );
} }
function createTopLeds(){ function createTopLeds(){
var step=(Hmax-Hmin)/ledstop; var step=(Hmax-Hmin)/ledstop;
//if(cornerVGap != '0') //if(cornerVGap != '0')
@ -148,9 +148,9 @@ function createClassicLeds(){
var hmin = ovl("-",(Hdiff/ledstop*Number([i]))+edgeHGap); var hmin = ovl("-",(Hdiff/ledstop*Number([i]))+edgeHGap);
var hmax = ovl("+",(Hdiff/ledstop*Number([i]))+step+edgeHGap); var hmax = ovl("+",(Hdiff/ledstop*Number([i]))+step+edgeHGap);
createLedArray(hmin, hmax, vmin, vmax); createLedArray(hmin, hmax, vmin, vmax);
} }
} }
function createLeftLeds(){ function createLeftLeds(){
var step=(Vmax-Vmin)/ledsleft; var step=(Vmax-Vmin)/ledsleft;
//if(cornerVGap != '0') //if(cornerVGap != '0')
@ -164,7 +164,7 @@ function createClassicLeds(){
createLedArray(hmin, hmax, vmin, vmax); createLedArray(hmin, hmax, vmin, vmax);
} }
} }
function createRightLeds(){ function createRightLeds(){
var step=(Vmax-Vmin)/ledsright; var step=(Vmax-Vmin)/ledsright;
//if(cornerVGap != '0') //if(cornerVGap != '0')
@ -175,15 +175,15 @@ function createClassicLeds(){
for (var i = 0; i<ledsright; i++){ for (var i = 0; i<ledsright; i++){
var vmin = ovl("-",(Vdiff/ledsright*Number([i]))+edgeVGap); var vmin = ovl("-",(Vdiff/ledsright*Number([i]))+edgeVGap);
var vmax = ovl("+",(Vdiff/ledsright*Number([i]))+step+edgeVGap); var vmax = ovl("+",(Vdiff/ledsright*Number([i]))+step+edgeVGap);
createLedArray(hmin, hmax, vmin, vmax); createLedArray(hmin, hmax, vmin, vmax);
} }
} }
function createBottomLeds(){ function createBottomLeds(){
var step=(Hmax-Hmin)/ledsbottom; var step=(Hmax-Hmin)/ledsbottom;
//if(cornerVGap != '0') //if(cornerVGap != '0')
// step=(Hmax-Hmin-(cornerHGap*2))/ledsbottom; // step=(Hmax-Hmin-(cornerHGap*2))/ledsbottom;
var vmax=Vmax; var vmax=Vmax;
var vmin=vmax-ledsHDepth; var vmin=vmax-ledsHDepth;
for (var i = ledsbottom-1; i>-1; i--){ for (var i = ledsbottom-1; i>-1; i--){
@ -192,7 +192,7 @@ function createClassicLeds(){
createLedArray(hmin, hmax, vmin, vmax); createLedArray(hmin, hmax, vmin, vmax);
} }
} }
createTopLeds(); createTopLeds();
createRightLeds(); createRightLeds();
createBottomLeds(); createBottomLeds();
@ -205,25 +205,25 @@ function createClassicLeds(){
$('#ip_cl_ledsgpos').val(mpos); $('#ip_cl_ledsgpos').val(mpos);
ledsgpos = mpos; ledsgpos = mpos;
} }
//check led gap length //check led gap length
if(ledsglength >= ledArray.length) if(ledsglength >= ledArray.length)
{ {
$('#ip_cl_ledsglength').val(ledArray.length-1); $('#ip_cl_ledsglength').val(ledArray.length-1);
ledsglength = ledArray.length-ledsglength-1; ledsglength = ledArray.length-ledsglength-1;
} }
if(ledsglength != 0){ if(ledsglength != 0){
ledArray.splice(ledsgpos, ledsglength); ledArray.splice(ledsgpos, ledsglength);
} }
if (position != 0){ if (position != 0){
rotateArray(ledArray, position); rotateArray(ledArray, position);
} }
if (reverse) if (reverse)
ledArray.reverse(); ledArray.reverse();
createFinalArray(ledArray); createFinalArray(ledArray);
} }
@ -239,7 +239,6 @@ function createMatrixLeds(){
var start = $("#ip_ma_start").val(); var start = $("#ip_ma_start").val();
var parallel = false var parallel = false
var index = 0
var leds = [] var leds = []
var hblock = 1.0 / ledshoriz var hblock = 1.0 / ledshoriz
var vblock = 1.0 / ledsvert var vblock = 1.0 / ledsvert
@ -250,11 +249,10 @@ function createMatrixLeds(){
/** /**
* Adds led to the hyperion config led array * Adds led to the hyperion config led array
* @param {Number} index Index of the led
* @param {Number} x Horizontal position in matrix * @param {Number} x Horizontal position in matrix
* @param {Number} y Vertical position in matrix * @param {Number} y Vertical position in matrix
*/ */
function addLed (index, x, y) { function addLed (x, y) {
var hscanMin = x * hblock var hscanMin = x * hblock
var hscanMax = (x + 1) * hblock var hscanMax = (x + 1) * hblock
var vscanMin = y * vblock var vscanMin = y * vblock
@ -264,16 +262,15 @@ function createMatrixLeds(){
hscanMax = round(hscanMax); hscanMax = round(hscanMax);
vscanMin = round(vscanMin); vscanMin = round(vscanMin);
vscanMax = round(vscanMax); vscanMax = round(vscanMax);
leds.push({ leds.push({
index: index, h: {
hscan: { min: hscanMin,
minimum: hscanMin, max: hscanMax
maximum: hscanMax
}, },
vscan: { v: {
minimum: vscanMin, min: vscanMin,
maximum: vscanMax max: vscanMax
} }
}) })
} }
@ -291,8 +288,7 @@ function createMatrixLeds(){
for (y = startY; downward && y <= endY || !downward && y >= endY; y += downward ? 1 : -1) { for (y = startY; downward && y <= endY || !downward && y >= endY; y += downward ? 1 : -1) {
for (x = startX; forward && x <= endX || !forward && x >= endX; x += forward ? 1 : -1) { for (x = startX; forward && x <= endX || !forward && x >= endX; x += forward ? 1 : -1) {
addLed(index, x, y) addLed(x, y)
index++
} }
if (!parallel) { if (!parallel) {
forward = !forward forward = !forward
@ -309,7 +305,7 @@ function createMatrixLeds(){
$(document).ready(function() { $(document).ready(function() {
// translate // translate
performTranslation(); performTranslation();
//add intros //add intros
if(window.showOptHelp) if(window.showOptHelp)
{ {
@ -317,9 +313,9 @@ $(document).ready(function() {
createHintH("intro", $.i18n('conf_leds_layout_intro'), "layout_intro"); createHintH("intro", $.i18n('conf_leds_layout_intro'), "layout_intro");
$('#led_vis_help').html('<div><div class="led_ex" style="background-color:black;margin-right:5px;margin-top:3px"></div><div style="display:inline-block;vertical-align:top">'+$.i18n('conf_leds_layout_preview_l1')+'</div></div><div class="led_ex" style="background-color:grey;margin-top:3px;margin-right:2px"></div><div class="led_ex" style="background-color: rgb(169, 169, 169);margin-right:5px;margin-top:3px;"></div><div style="display:inline-block;vertical-align:top">'+$.i18n('conf_leds_layout_preview_l2')+'</div>'); $('#led_vis_help').html('<div><div class="led_ex" style="background-color:black;margin-right:5px;margin-top:3px"></div><div style="display:inline-block;vertical-align:top">'+$.i18n('conf_leds_layout_preview_l1')+'</div></div><div class="led_ex" style="background-color:grey;margin-top:3px;margin-right:2px"></div><div class="led_ex" style="background-color: rgb(169, 169, 169);margin-right:5px;margin-top:3px;"></div><div style="display:inline-block;vertical-align:top">'+$.i18n('conf_leds_layout_preview_l2')+'</div>');
} }
var slConfig = window.serverConfig.ledConfig; var slConfig = window.serverConfig.ledConfig;
//restore ledConfig //restore ledConfig
for(var key in slConfig) for(var key in slConfig)
{ {
@ -343,7 +339,7 @@ $(document).ready(function() {
} }
setTimeout(requestWriteConfig, 100, {ledConfig}); setTimeout(requestWriteConfig, 100, {ledConfig});
} }
// check access level and adjust ui // check access level and adjust ui
if(storedAccess == "default") if(storedAccess == "default")
{ {
@ -357,10 +353,10 @@ $(document).ready(function() {
$('#btn_ma_save').toggle(false); $('#btn_ma_save').toggle(false);
$('#btn_cl_save').toggle(false); $('#btn_cl_save').toggle(false);
} }
//Wiki link //Wiki link
$('#leds_wl').append('<p style="font-weight:bold">'+$.i18n('general_wiki_moreto',$.i18n('conf_leds_nav_label_ledlayout'))+buildWL("user/moretopics/ledarea","Wiki")+'</p>'); $('#leds_wl').append('<p style="font-weight:bold">'+$.i18n('general_wiki_moreto',$.i18n('conf_leds_nav_label_ledlayout'))+buildWL("user/moretopics/ledarea","Wiki")+'</p>');
// bind change event to all inputs // bind change event to all inputs
$('.ledCLconstr').bind("change", function() { $('.ledCLconstr').bind("change", function() {
valValue(this.id,this.value,this.min,this.max); valValue(this.id,this.value,this.min,this.max);
@ -373,7 +369,7 @@ $(document).ready(function() {
}); });
// v4 of json schema with diff required assignment - remove when hyperion schema moved to v4 // v4 of json schema with diff required assignment - remove when hyperion schema moved to v4
var ledschema = {"items":{"additionalProperties":false,"required":["hscan","vscan","index"],"properties":{"clone":{"type":"integer"},"colorOrder":{"enum":["rgb","bgr","rbg","brg","gbr","grb"],"type":"string"},"hscan":{"additionalProperties":false,"properties":{"maximum":{"maximum":1,"minimum":0,"type":"number"},"minimum":{"maximum":1,"minimum":0,"type":"number"}},"type":"object"},"index":{"type":"integer"},"vscan":{"additionalProperties":false,"properties":{"maximum":{"maximum":1,"minimum":0,"type":"number"},"minimum":{"maximum":1,"minimum":0,"type":"number"}},"type":"object"}},"type":"object"},"type":"array"}; var ledschema = {"items":{"additionalProperties":false,"required":["h","v"],"properties":{"colorOrder":{"enum":["rgb","bgr","rbg","brg","gbr","grb"],"type":"string"},"h":{"additionalProperties":false,"properties":{"max":{"maximum":1,"minimum":0,"type":"number"},"min":{"maximum":1,"minimum":0,"type":"number"}},"type":"object"},"v":{"additionalProperties":false,"properties":{"max":{"maximum":1,"minimum":0,"type":"number"},"min":{"maximum":1,"minimum":0,"type":"number"}},"type":"object"}},"type":"object"},"type":"array"};
//create jsonace editor //create jsonace editor
var aceEdt = new JSONACEEditor(document.getElementById("aceedit"),{ var aceEdt = new JSONACEEditor(document.getElementById("aceedit"),{
mode: 'code', mode: 'code',
@ -387,7 +383,7 @@ $(document).ready(function() {
{ {
success = false; success = false;
} }
if(success) if(success)
{ {
$('#leds_custom_updsim').attr("disabled", false); $('#leds_custom_updsim').attr("disabled", false);
@ -400,7 +396,7 @@ $(document).ready(function() {
} }
} }
}, window.serverConfig.leds); }, window.serverConfig.leds);
//TODO: HACK! No callback for schema validation - Add it! //TODO: HACK! No callback for schema validation - Add it!
setInterval(function(){ setInterval(function(){
if($('#aceedit table').hasClass('jsoneditor-text-errors')) if($('#aceedit table').hasClass('jsoneditor-text-errors'))
@ -409,23 +405,23 @@ $(document).ready(function() {
$('#leds_custom_save').attr("disabled", true); $('#leds_custom_save').attr("disabled", true);
} }
},1000); },1000);
$('.jsoneditor-menu').toggle(); $('.jsoneditor-menu').toggle();
// leds to finalLedArray // leds to finalLedArray
finalLedArray = window.serverConfig.leds; finalLedArray = window.serverConfig.leds;
// cl/ma leds push to textfield // cl/ma leds push to textfield
$('#btn_cl_generate, #btn_ma_generate').off().on("click", function(e) { $('#btn_cl_generate, #btn_ma_generate').off().on("click", function(e) {
if(e.currentTarget.id == "btn_cl_generate") if(e.currentTarget.id == "btn_cl_generate")
$('#collapse1').collapse('hide'); $('#collapse1').collapse('hide');
else else
$('#collapse2').collapse('hide'); $('#collapse2').collapse('hide');
aceEdt.set(finalLedArray); aceEdt.set(finalLedArray);
$('#collapse4').collapse('show'); $('#collapse4').collapse('show');
}); });
// create and update editor // create and update editor
$("#leddevices").off().on("change", function() { $("#leddevices").off().on("change", function() {
var generalOptions = window.serverSchema.properties.device; var generalOptions = window.serverSchema.properties.device;
@ -437,7 +433,7 @@ $(document).ready(function() {
generalOptions : generalOptions, generalOptions : generalOptions,
specificOptions : specificOptions, specificOptions : specificOptions,
}); });
var values_general = {}; var values_general = {};
var values_specific = {}; var values_specific = {};
var isCurrentDevice = (window.serverInfo.ledDevices.active == $(this).val()); var isCurrentDevice = (window.serverInfo.ledDevices.active == $(this).val());
@ -457,10 +453,10 @@ $(document).ready(function() {
conf_editor.getEditor("root.specificOptions").setValue( values_specific ); conf_editor.getEditor("root.specificOptions").setValue( values_specific );
}; };
// change save button state based on validation result // change save button state based on validation result
conf_editor.validate().length ? $('#btn_submit_controller').attr('disabled', true) : $('#btn_submit_controller').attr('disabled', false); conf_editor.validate().length ? $('#btn_submit_controller').attr('disabled', true) : $('#btn_submit_controller').attr('disabled', false);
// led controller sepecific wizards // led controller sepecific wizards
if($(this).val() == "philipshue") if($(this).val() == "philipshue")
{ {
@ -473,7 +469,7 @@ $(document).ready(function() {
$('#btn_led_device_wiz').off(); $('#btn_led_device_wiz').off();
} }
}); });
// create led device selection // create led device selection
var ledDevices = window.serverInfo.ledDevices.available; var ledDevices = window.serverInfo.ledDevices.available;
var devRPiSPI = ['apa102', 'apa104', 'ws2801', 'lpd6803', 'lpd8806', 'p9813', 'sk6812spi', 'sk6822spi', 'ws2812spi']; var devRPiSPI = ['apa102', 'apa104', 'ws2801', 'lpd6803', 'lpd8806', 'p9813', 'sk6812spi', 'sk6822spi', 'ws2812spi'];
@ -481,14 +477,14 @@ $(document).ready(function() {
var devRPiGPIO = ['piblaster']; var devRPiGPIO = ['piblaster'];
var devNET = ['atmoorb', 'fadecandy', 'philipshue', 'nanoleaf', 'tinkerforge', 'tpm2net', 'udpe131', 'udpartnet', 'udph801', 'udpraw']; var devNET = ['atmoorb', 'fadecandy', 'philipshue', 'nanoleaf', 'tinkerforge', 'tpm2net', 'udpe131', 'udpartnet', 'udph801', 'udpraw'];
var devUSB = ['adalight', 'dmx', 'atmo', 'hyperionusbasp', 'lightpack', 'multilightpack', 'paintpack', 'rawhid', 'sedu', 'tpm2', 'karate']; var devUSB = ['adalight', 'dmx', 'atmo', 'hyperionusbasp', 'lightpack', 'multilightpack', 'paintpack', 'rawhid', 'sedu', 'tpm2', 'karate'];
var optArr = [[]]; var optArr = [[]];
optArr[1]=[]; optArr[1]=[];
optArr[2]=[]; optArr[2]=[];
optArr[3]=[]; optArr[3]=[];
optArr[4]=[]; optArr[4]=[];
optArr[5]=[]; optArr[5]=[];
for (var idx=0; idx<ledDevices.length; idx++) for (var idx=0; idx<ledDevices.length; idx++)
{ {
if($.inArray(ledDevices[idx], devRPiSPI) != -1) if($.inArray(ledDevices[idx], devRPiSPI) != -1)
@ -504,7 +500,7 @@ $(document).ready(function() {
else else
optArr[5].push(ledDevices[idx]); optArr[5].push(ledDevices[idx]);
} }
$("#leddevices").append(createSel(optArr[0], $.i18n('conf_leds_optgroup_RPiSPI'))); $("#leddevices").append(createSel(optArr[0], $.i18n('conf_leds_optgroup_RPiSPI')));
$("#leddevices").append(createSel(optArr[1], $.i18n('conf_leds_optgroup_RPiPWM'))); $("#leddevices").append(createSel(optArr[1], $.i18n('conf_leds_optgroup_RPiPWM')));
$("#leddevices").append(createSel(optArr[2], $.i18n('conf_leds_optgroup_RPiGPIO'))); $("#leddevices").append(createSel(optArr[2], $.i18n('conf_leds_optgroup_RPiGPIO')));
@ -518,13 +514,13 @@ $(document).ready(function() {
$("#leds_custom_updsim").off().on("click", function() { $("#leds_custom_updsim").off().on("click", function() {
createLedPreview(aceEdt.get(), 'text'); createLedPreview(aceEdt.get(), 'text');
}); });
// save led config and saveValues - passing textfield // save led config and saveValues - passing textfield
$("#btn_ma_save, #btn_cl_save").off().on("click", function() { $("#btn_ma_save, #btn_cl_save").off().on("click", function() {
requestWriteConfig({"leds" :finalLedArray}); requestWriteConfig({"leds" :finalLedArray});
saveValues(); saveValues();
}); });
// save led config from textfield // save led config from textfield
$("#leds_custom_save").off().on("click", function() { $("#leds_custom_save").off().on("click", function() {
requestWriteConfig(JSON.parse('{"leds" :'+aceEdt.getText()+'}')); requestWriteConfig(JSON.parse('{"leds" :'+aceEdt.getText()+'}'));
@ -536,13 +532,13 @@ $(document).ready(function() {
$('.led_prev_num').toggle(); $('.led_prev_num').toggle();
toggleClass('#leds_prev_toggle_num', "btn-danger", "btn-success"); toggleClass('#leds_prev_toggle_num', "btn-danger", "btn-success");
}); });
// open checklist // open checklist
$('#leds_prev_checklist').off().on("click", function() { $('#leds_prev_checklist').off().on("click", function() {
var liList = [$.i18n('conf_leds_layout_checkp1'),$.i18n('conf_leds_layout_checkp3'),$.i18n('conf_leds_layout_checkp2'),$.i18n('conf_leds_layout_checkp4')]; var liList = [$.i18n('conf_leds_layout_checkp1'),$.i18n('conf_leds_layout_checkp3'),$.i18n('conf_leds_layout_checkp2'),$.i18n('conf_leds_layout_checkp4')];
var ul = document.createElement("ul"); var ul = document.createElement("ul");
ul.className = "checklist" ul.className = "checklist"
for(var i = 0; i<liList.length; i++) for(var i = 0; i<liList.length; i++)
{ {
var li = document.createElement("li"); var li = document.createElement("li");
@ -551,7 +547,7 @@ $(document).ready(function() {
} }
showInfoDialog('checklist', "", ul); showInfoDialog('checklist', "", ul);
}); });
// nav // nav
$('#leds_cfg_nav a[data-toggle="tab"]').off().on('shown.bs.tab', function (e) { $('#leds_cfg_nav a[data-toggle="tab"]').off().on('shown.bs.tab', function (e) {
var target = $(e.target).attr("href") // activated tab var target = $(e.target).attr("href") // activated tab
@ -561,13 +557,13 @@ $(document).ready(function() {
ledsCustomCfgInitialized = true; ledsCustomCfgInitialized = true;
} }
}); });
// save led device config // save led device config
$("#btn_submit_controller").off().on("click", function(event) { $("#btn_submit_controller").off().on("click", function(event) {
var ledDevice = $("#leddevices").val(); var ledDevice = $("#leddevices").val();
var result = {device:{}}; var result = {device:{}};
var general = conf_editor.getEditor("root.generalOptions").getValue(); var general = conf_editor.getEditor("root.generalOptions").getValue();
var specific = conf_editor.getEditor("root.specificOptions").getValue(); var specific = conf_editor.getEditor("root.specificOptions").getValue();
for(var key in general){ for(var key in general){

View File

@ -22,7 +22,7 @@ $(document).ready(function() {
for(var idx=0; idx<leds.length; idx++) for(var idx=0; idx<leds.length; idx++)
{ {
var led = leds[idx]; var led = leds[idx];
twoDPaths.push( build2DPath(led.hscan.minimum * canvas_width, led.vscan.minimum * canvas_height, (led.hscan.maximum-led.hscan.minimum) * canvas_width, (led.vscan.maximum-led.vscan.minimum) * canvas_height, 5) ); twoDPaths.push( build2DPath(led.h.min * canvas_width, led.v.min * canvas_height, (led.h.max-led.h.min) * canvas_width, (led.v.max-led.v.min) * canvas_height, 5) );
} }
} }
@ -131,18 +131,23 @@ $(document).ready(function() {
return; return;
var useColor = false; var useColor = false;
var cPos = 0;
ledsCanvasNodeCtx.clear(); ledsCanvasNodeCtx.clear();
if(typeof colors != "undefined") if(typeof colors != "undefined")
useColor = true; useColor = true;
// check size of ledcolors with leds length
if(colors && colors.length/3 < leds.length)
return;
for(var idx=0; idx<leds.length; idx++) for(var idx=0; idx<leds.length; idx++)
{ {
var led = leds[idx]; var led = leds[idx];
// can be used as fallback when Path2D is not available // can be used as fallback when Path2D is not available
//roundRect(ledsCanvasNodeCtx, led.hscan.minimum * canvas_width, led.vscan.minimum * canvas_height, (led.hscan.maximum-led.hscan.minimum) * canvas_width, (led.vscan.maximum-led.vscan.minimum) * canvas_height, 4, true, colors[idx]) //roundRect(ledsCanvasNodeCtx, led.h.min * canvas_width, led.v.min * canvas_height, (led.h.max-led.h.min) * canvas_width, (led.v.max-led.v.min) * canvas_height, 4, true, colors[idx])
//ledsCanvasNodeCtx.fillRect(led.hscan.minimum * canvas_width, led.vscan.minimum * canvas_height, (led.hscan.maximum-led.hscan.minimum) * canvas_width, (led.vscan.maximum-led.vscan.minimum) * canvas_height); //ledsCanvasNodeCtx.fillRect(led.h.min * canvas_width, led.v.min * canvas_height, (led.h.max-led.h.min) * canvas_width, (led.v.max-led.v.min) * canvas_height);
ledsCanvasNodeCtx.fillStyle = (useColor) ? "rgba("+colors[idx].red+","+colors[idx].green+","+colors[idx].blue+",0.9)" : "hsl("+(idx*360/leds.length)+",100%,50%)"; ledsCanvasNodeCtx.fillStyle = (useColor) ? "rgba("+colors[cPos]+","+colors[cPos+1]+","+colors[cPos+2]+",0.9)" : "hsl("+(idx*360/leds.length)+",100%,50%)";
ledsCanvasNodeCtx.fill(twoDPaths[idx]); ledsCanvasNodeCtx.fill(twoDPaths[idx]);
ledsCanvasNodeCtx.stroke(twoDPaths[idx]); ledsCanvasNodeCtx.stroke(twoDPaths[idx]);
@ -150,8 +155,11 @@ $(document).ready(function() {
{ {
ledsCanvasNodeCtx.fillStyle = "blue"; ledsCanvasNodeCtx.fillStyle = "blue";
ledsCanvasNodeCtx.textAlign = "center"; ledsCanvasNodeCtx.textAlign = "center";
ledsCanvasNodeCtx.fillText(idx, (led.hscan.minimum * canvas_width) + ( ((led.hscan.maximum-led.hscan.minimum) * canvas_width) / 2), (led.vscan.minimum * canvas_height) + ( ((led.vscan.maximum-led.vscan.minimum) * canvas_height) / 2)); ledsCanvasNodeCtx.fillText(idx, (led.h.min * canvas_width) + ( ((led.h.max-led.h.min) * canvas_width) / 2), (led.v.min * canvas_height) + ( ((led.v.max-led.v.min) * canvas_height) / 2));
} }
// increment colorsPosition
cPos += 3;
} }
} }

View File

@ -518,11 +518,11 @@ $('#btn_wizard_colorcalibration').off().on('click', startWizardCC);
var hueIPs = []; var hueIPs = [];
var hueIPsinc = 0; var hueIPsinc = 0;
var lightIDs = null; var lightIDs = null;
var huePosTop = {hscan: {maximum: 0.85,minimum: 0.15},index: 0,vscan: {maximum: 0.2,minimum: 0}}; var huePosTop = {h: {max: 0.85, min: 0.15}, v: {max: 0.2, min: 0}};
var huePosBottom = {hscan: {maximum: 0.85,minimum: 0.15},index: 2,vscan: {maximum: 1,minimum: 0.8}}; var huePosBottom = {h: {max: 0.85, min: 0.15}, v: {max: 1, min: 0.8}};
var huePosLeft = {hscan: {maximum: 0.15,minimum: 0},index: 1,vscan: {maximum: 0.85,minimum: 0.15}}; var huePosLeft = {h: {max: 0.15, min: 0}, v: {max: 0.85, min: 0.15}};
var huePosRight = {hscan: {maximum: 1,minimum: 0.85},index: 3,vscan: {maximum: 0.85,minimum: 0.15}}; var huePosRight = {h: {max: 1, min: 0.85}, v: {max: 0.85, min: 0.15}};
var huePosEntire = {hscan: {maximum: 1.0,minimum: 0.0},index: 0,vscan: {maximum: 1.0,minimum: 0.0}}; var huePosEntire = {h: {max: 1.0, min: 0.0}, v: {max: 1.0, min: 0.0}};
function startWizardPhilipsHue() function startWizardPhilipsHue()
{ {
@ -620,9 +620,9 @@ function checkBridgeResult(reply){
} }
}; };
function assignHuePos(id, pos, inc) function assignHuePos(id, pos)
{ {
var i = null; var i = null;
if(pos == "top") if(pos == "top")
i = huePosTop; i = huePosTop;
@ -635,9 +635,8 @@ function assignHuePos(id, pos, inc)
else else
i = huePosEntire; i = huePosEntire;
i.index = inc; return i;
return i; }
}
function identHueId(id, off) function identHueId(id, off)
{ {
@ -706,23 +705,14 @@ function beginWizardHue()
checkHueBridge(checkUserResult,$('#user').val() ? $('#user').val() : "newdeveloper"); checkHueBridge(checkUserResult,$('#user').val() ? $('#user').val() : "newdeveloper");
}); });
$('#wiz_hue_create_user').off().on('click',function() { //create hue led config
createHueUser(); for(var key in lightIDs)
});
$('#btn_wiz_save').off().on("click", function(){
var hueLedConfig = [];
var finalLightIds = [];
//create hue led config
var incC = 0;
for(var key in lightIDs)
{
if($('#hue_'+key).val() != "disabled")
{ {
hueLedConfig.push(assignHuePos(key, $('#hue_'+key).val(), incC)); if($('#hue_'+key).val() != "disabled")
finalLightIds.push(parseInt(key)); {
incC++; hueLedConfig.push(assignHuePos(key, $('#hue_'+key).val()));
finalLightIds.push(parseInt(key));
}
} }
} }
@ -774,17 +764,17 @@ function createHueUser()
connectionRetries--; connectionRetries--;
$("#connectionTime").html(connectionRetries); $("#connectionTime").html(connectionRetries);
if(connectionRetries == 0) if(connectionRetries == 0)
{ {
abortConnection(UserInterval); abortConnection(UserInterval);
} }
else else
{ {
if (typeof r[0].error != 'undefined') if (typeof r[0].error != 'undefined')
{ {
console.log(connectionRetries+": link not pressed"); console.log(connectionRetries+": link not pressed");
} }
if (typeof r[0].success != 'undefined') if (typeof r[0].success != 'undefined')
{ {
$('#wizp1').toggle(false); $('#wizp1').toggle(false);
$('#wizp2').toggle(true); $('#wizp2').toggle(true);

View File

@ -335,299 +335,271 @@
/// The configuration for each individual led. This contains the specification of the area /// The configuration for each individual led. This contains the specification of the area
/// averaged of an input image for each led to determine its color. Each item in the list /// averaged of an input image for each led to determine its color. Each item in the list
/// contains the following fields: /// contains the following fields:
/// * index: The index of the led. This determines its location in the string of leds; zero /// * h: The fractional part of the image along the horizontal used for the averaging
/// being the first led. /// (min and max inclusive)
/// * hscan: The fractional part of the image along the horizontal used for the averaging /// * v: The fractional part of the image along the vertical used for the averaging
/// (minimum and maximum inclusive) /// (min and max inclusive)
/// * vscan: The fractional part of the image along the vertical used for the averaging
/// (minimum and maximum inclusive)
"leds": "leds":
[ [
{ {
"hscan": { "h": {
"maximum": 0.125, "max": 0.125,
"minimum": 0 "min": 0
}, },
"index": 0, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.25, "max": 0.25,
"minimum": 0.125 "min": 0.125
}, },
"index": 1, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.375, "max": 0.375,
"minimum": 0.25 "min": 0.25
}, },
"index": 2, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.5, "max": 0.5,
"minimum": 0.375 "min": 0.375
}, },
"index": 3, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.625, "max": 0.625,
"minimum": 0.5 "min": 0.5
}, },
"index": 4, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.75, "max": 0.75,
"minimum": 0.625 "min": 0.625
}, },
"index": 5, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.875, "max": 0.875,
"minimum": 0.75 "min": 0.75
}, },
"index": 6, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.875 "min": 0.875
}, },
"index": 7, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.95 "min": 0.95
}, },
"index": 8, "v": {
"vscan": { "max": 0.2,
"maximum": 0.2, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.95 "min": 0.95
}, },
"index": 9, "v": {
"vscan": { "max": 0.4,
"maximum": 0.4, "min": 0.2
"minimum": 0.2
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.95 "min": 0.95
}, },
"index": 10, "v": {
"vscan": { "max": 0.6,
"maximum": 0.6, "min": 0.4
"minimum": 0.4
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.95 "min": 0.95
}, },
"index": 11, "v": {
"vscan": { "max": 0.8,
"maximum": 0.8, "min": 0.6
"minimum": 0.6
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.95 "min": 0.95
}, },
"index": 12, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.8
"minimum": 0.8
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.875 "min": 0.875
}, },
"index": 13, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.875, "max": 0.875,
"minimum": 0.75 "min": 0.75
}, },
"index": 14, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.75, "max": 0.75,
"minimum": 0.625 "min": 0.625
}, },
"index": 15, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.625, "max": 0.625,
"minimum": 0.5 "min": 0.5
}, },
"index": 16, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.5, "max": 0.5,
"minimum": 0.375 "min": 0.375
}, },
"index": 17, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.375, "max": 0.375,
"minimum": 0.25 "min": 0.25
}, },
"index": 18, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.25, "max": 0.25,
"minimum": 0.125 "min": 0.125
}, },
"index": 19, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.125, "max": 0.125,
"minimum": 0 "min": 0
}, },
"index": 20, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.05, "max": 0.05,
"minimum": 0 "min": 0
}, },
"index": 21, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.8
"minimum": 0.8
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.05, "max": 0.05,
"minimum": 0 "min": 0
}, },
"index": 22, "v": {
"vscan": { "max": 0.8,
"maximum": 0.8, "min": 0.6
"minimum": 0.6
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.05, "max": 0.05,
"minimum": 0 "min": 0
}, },
"index": 23, "v": {
"vscan": { "max": 0.6,
"maximum": 0.6, "min": 0.4
"minimum": 0.4
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.05, "max": 0.05,
"minimum": 0 "min": 0
}, },
"index": 24, "v": {
"vscan": { "max": 0.4,
"maximum": 0.4, "min": 0.2
"minimum": 0.2
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.05, "max": 0.05,
"minimum": 0 "min": 0
}, },
"index": 25, "v": {
"vscan": { "max": 0.2,
"maximum": 0.2, "min": 0
"minimum": 0
} }
} }
] ]

View File

@ -203,289 +203,263 @@
"leds": "leds":
[ [
{ {
"hscan": { "h": {
"maximum": 0.125, "max": 0.125,
"minimum": 0 "min": 0
}, },
"index": 0, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.25, "max": 0.25,
"minimum": 0.125 "min": 0.125
}, },
"index": 1, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.375, "max": 0.375,
"minimum": 0.25 "min": 0.25
}, },
"index": 2, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.5, "max": 0.5,
"minimum": 0.375 "min": 0.375
}, },
"index": 3, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.625, "max": 0.625,
"minimum": 0.5 "min": 0.5
}, },
"index": 4, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.75, "max": 0.75,
"minimum": 0.625 "min": 0.625
}, },
"index": 5, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.875, "max": 0.875,
"minimum": 0.75 "min": 0.75
}, },
"index": 6, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.875 "min": 0.875
}, },
"index": 7, "v": {
"vscan": { "max": 0.08,
"maximum": 0.08, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.95 "min": 0.95
}, },
"index": 8, "v": {
"vscan": { "max": 0.2,
"maximum": 0.2, "min": 0
"minimum": 0
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.95 "min": 0.95
}, },
"index": 9, "v": {
"vscan": { "max": 0.4,
"maximum": 0.4, "min": 0.2
"minimum": 0.2
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.95 "min": 0.95
}, },
"index": 10, "v": {
"vscan": { "max": 0.6,
"maximum": 0.6, "min": 0.4
"minimum": 0.4
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.95 "min": 0.95
}, },
"index": 11, "v": {
"vscan": { "max": 0.8,
"maximum": 0.8, "min": 0.6
"minimum": 0.6
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.95 "min": 0.95
}, },
"index": 12, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.8
"minimum": 0.8
} }
}, },
{ {
"hscan": { "h": {
"maximum": 1, "max": 1,
"minimum": 0.875 "min": 0.875
}, },
"index": 13, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.875, "max": 0.875,
"minimum": 0.75 "min": 0.75
}, },
"index": 14, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.75, "max": 0.75,
"minimum": 0.625 "min": 0.625
}, },
"index": 15, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.625, "max": 0.625,
"minimum": 0.5 "min": 0.5
}, },
"index": 16, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.5, "max": 0.5,
"minimum": 0.375 "min": 0.375
}, },
"index": 17, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.375, "max": 0.375,
"minimum": 0.25 "min": 0.25
}, },
"index": 18, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.25, "max": 0.25,
"minimum": 0.125 "min": 0.125
}, },
"index": 19, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.125, "max": 0.125,
"minimum": 0 "min": 0
}, },
"index": 20, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.92
"minimum": 0.92
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.05, "max": 0.05,
"minimum": 0 "min": 0
}, },
"index": 21, "v": {
"vscan": { "max": 1,
"maximum": 1, "min": 0.8
"minimum": 0.8
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.05, "max": 0.05,
"minimum": 0 "min": 0
}, },
"index": 22, "v": {
"vscan": { "max": 0.8,
"maximum": 0.8, "min": 0.6
"minimum": 0.6
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.05, "max": 0.05,
"minimum": 0 "min": 0
}, },
"index": 23, "v": {
"vscan": { "max": 0.6,
"maximum": 0.6, "min": 0.4
"minimum": 0.4
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.05, "max": 0.05,
"minimum": 0 "min": 0
}, },
"index": 24, "v": {
"vscan": { "max": 0.4,
"maximum": 0.4, "min": 0.2
"minimum": 0.2
} }
}, },
{ {
"hscan": { "h": {
"maximum": 0.05, "max": 0.05,
"minimum": 0 "min": 0
}, },
"index": 25, "v": {
"vscan": { "max": 0.2,
"maximum": 0.2, "min": 0
"minimum": 0
} }
} }
] ]

View File

@ -489,9 +489,6 @@ private:
/// The specifiation of the led frame construction and picture integration /// The specifiation of the led frame construction and picture integration
LedString _ledString; LedString _ledString;
/// specifiation of cloned leds
LedString _ledStringClone;
/// Image Processor /// Image Processor
ImageProcessor* _imageProcessor; ImageProcessor* _imageProcessor;

View File

@ -88,9 +88,6 @@ inline ColorOrder stringToColorOrder(const QString & order)
/// ///
struct Led struct Led
{ {
/// The index of the led
unsigned index;
/// The minimum vertical scan line included for this leds color /// The minimum vertical scan line included for this leds color
double minX_frac; double minX_frac;
/// The maximum vertical scan line included for this leds color /// The maximum vertical scan line included for this leds color
@ -99,8 +96,6 @@ struct Led
double minY_frac; double minY_frac;
/// The maximum horizontal scan line included for this leds color /// The maximum horizontal scan line included for this leds color
double maxY_frac; double maxY_frac;
/// id to clone
int clone;
/// the color order /// the color order
ColorOrder colorOrder; ColorOrder colorOrder;
}; };

View File

@ -192,86 +192,32 @@ namespace hyperion {
{ {
LedString ledString; LedString ledString;
const QString deviceOrderStr = colorOrderToString(deviceOrder); const QString deviceOrderStr = colorOrderToString(deviceOrder);
int maxLedId = ledConfigArray.size();
for (signed i = 0; i < ledConfigArray.size(); ++i) for (signed i = 0; i < ledConfigArray.size(); ++i)
{ {
const QJsonObject& index = ledConfigArray[i].toObject(); const QJsonObject& index = ledConfigArray[i].toObject();
Led led; Led led;
led.index = index["index"].toInt();
led.clone = index["clone"].toInt(-1); const QJsonObject& hscanConfig = ledConfigArray[i].toObject()["h"].toObject();
if ( led.clone < -1 || led.clone >= maxLedId ) const QJsonObject& vscanConfig = ledConfigArray[i].toObject()["v"].toObject();
led.minX_frac = qMax(0.0, qMin(1.0, hscanConfig["min"].toDouble()));
led.maxX_frac = qMax(0.0, qMin(1.0, hscanConfig["max"].toDouble()));
led.minY_frac = qMax(0.0, qMin(1.0, vscanConfig["min"].toDouble()));
led.maxY_frac = qMax(0.0, qMin(1.0, vscanConfig["max"].toDouble()));
// Fix if the user swapped min and max
if (led.minX_frac > led.maxX_frac)
{ {
//Warning(_log, "LED %d: clone index of %d is out of range, clone ignored", led.index, led.clone); std::swap(led.minX_frac, led.maxX_frac);
led.clone = -1; }
if (led.minY_frac > led.maxY_frac)
{
std::swap(led.minY_frac, led.maxY_frac);
} }
if ( led.clone < 0 ) // Get the order of the rgb channels for this led (default is device order)
{ led.colorOrder = stringToColorOrder(index["colorOrder"].toString(deviceOrderStr));
const QJsonObject& hscanConfig = ledConfigArray[i].toObject()["hscan"].toObject(); ledString.leds().push_back(led);
const QJsonObject& vscanConfig = ledConfigArray[i].toObject()["vscan"].toObject();
led.minX_frac = qMax(0.0, qMin(1.0, hscanConfig["minimum"].toDouble()));
led.maxX_frac = qMax(0.0, qMin(1.0, hscanConfig["maximum"].toDouble()));
led.minY_frac = qMax(0.0, qMin(1.0, vscanConfig["minimum"].toDouble()));
led.maxY_frac = qMax(0.0, qMin(1.0, vscanConfig["maximum"].toDouble()));
// Fix if the user swapped min and max
if (led.minX_frac > led.maxX_frac)
{
std::swap(led.minX_frac, led.maxX_frac);
}
if (led.minY_frac > led.maxY_frac)
{
std::swap(led.minY_frac, led.maxY_frac);
}
// Get the order of the rgb channels for this led (default is device order)
led.colorOrder = stringToColorOrder(index["colorOrder"].toString(deviceOrderStr));
ledString.leds().push_back(led);
}
} }
// Make sure the leds are sorted (on their indices)
std::sort(ledString.leds().begin(), ledString.leds().end(), [](const Led& lhs, const Led& rhs){ return lhs.index < rhs.index; });
return ledString;
}
LedString createLedStringClone(const QJsonArray& ledConfigArray, const ColorOrder deviceOrder)
{
LedString ledString;
const QString deviceOrderStr = colorOrderToString(deviceOrder);
int maxLedId = ledConfigArray.size();
for (signed i = 0; i < ledConfigArray.size(); ++i)
{
const QJsonObject& index = ledConfigArray[i].toObject();
Led led;
led.index = index["index"].toInt();
led.clone = index["clone"].toInt(-1);
if ( led.clone < -1 || led.clone >= maxLedId )
{
//Warning(_log, "LED %d: clone index of %d is out of range, clone ignored", led.index, led.clone);
led.clone = -1;
}
if ( led.clone >= 0 )
{
//Debug(_log, "LED %d: clone from led %d", led.index, led.clone);
led.minX_frac = 0;
led.maxX_frac = 0;
led.minY_frac = 0;
led.maxY_frac = 0;
// Get the order of the rgb channels for this led (default is device order)
led.colorOrder = stringToColorOrder(index["colorOrder"].toString(deviceOrderStr));
ledString.leds().push_back(led);
}
}
// Make sure the leds are sorted (on their indices)
std::sort(ledString.leds().begin(), ledString.leds().end(), [](const Led& lhs, const Led& rhs){ return lhs.index < rhs.index; });
return ledString; return ledString;
} }
@ -282,30 +228,26 @@ namespace hyperion {
for (signed i = 0; i < ledConfigArray.size(); ++i) for (signed i = 0; i < ledConfigArray.size(); ++i)
{ {
const QJsonObject& index = ledConfigArray[i].toObject(); const QJsonObject& hscanConfig = ledConfigArray[i].toObject()["h"].toObject();
const QJsonObject& vscanConfig = ledConfigArray[i].toObject()["v"].toObject();
if (index["clone"].toInt(-1) < 0 ) double minX_frac = qMax(0.0, qMin(1.0, hscanConfig["min"].toDouble()));
double maxX_frac = qMax(0.0, qMin(1.0, hscanConfig["max"].toDouble()));
double minY_frac = qMax(0.0, qMin(1.0, vscanConfig["min"].toDouble()));
double maxY_frac = qMax(0.0, qMin(1.0, vscanConfig["max"].toDouble()));
// Fix if the user swapped min and max
if (minX_frac > maxX_frac)
{ {
const QJsonObject& hscanConfig = ledConfigArray[i].toObject()["hscan"].toObject(); std::swap(minX_frac, maxX_frac);
const QJsonObject& vscanConfig = ledConfigArray[i].toObject()["vscan"].toObject();
double minX_frac = qMax(0.0, qMin(1.0, hscanConfig["minimum"].toDouble()));
double maxX_frac = qMax(0.0, qMin(1.0, hscanConfig["maximum"].toDouble()));
double minY_frac = qMax(0.0, qMin(1.0, vscanConfig["minimum"].toDouble()));
double maxY_frac = qMax(0.0, qMin(1.0, vscanConfig["maximum"].toDouble()));
// Fix if the user swapped min and max
if (minX_frac > maxX_frac)
{
std::swap(minX_frac, maxX_frac);
}
if (minY_frac > maxY_frac)
{
std::swap(minY_frac, maxY_frac);
}
// calculate mid point and make grid calculation
midPointsX.push_back( int(1000.0*(minX_frac + maxX_frac) / 2.0) );
midPointsY.push_back( int(1000.0*(minY_frac + maxY_frac) / 2.0) );
} }
if (minY_frac > maxY_frac)
{
std::swap(minY_frac, maxY_frac);
}
// calculate mid point and make grid calculation
midPointsX.push_back( int(1000.0*(minX_frac + maxX_frac) / 2.0) );
midPointsY.push_back( int(1000.0*(minY_frac + maxY_frac) / 2.0) );
} }
// remove duplicates // remove duplicates
@ -315,7 +257,7 @@ namespace hyperion {
midPointsY.erase(std::unique(midPointsY.begin(), midPointsY.end()), midPointsY.end()); midPointsY.erase(std::unique(midPointsY.begin(), midPointsY.end()), midPointsY.end());
QSize gridSize( midPointsX.size(), midPointsY.size() ); QSize gridSize( midPointsX.size(), midPointsY.size() );
//Debug(_log, "led layout grid: %dx%d", gridSize.width(), gridSize.height()); //Debug(_log, "LED layout grid size: %dx%d", gridSize.width(), gridSize.height());
return gridSize; return gridSize;
} }

View File

@ -1464,14 +1464,9 @@ void JsonAPI::streamLedcolorsUpdate(const std::vector<ColorRgb>& ledColors)
QJsonObject result; QJsonObject result;
QJsonArray leds; QJsonArray leds;
for(auto color = ledColors.begin(); color != ledColors.end(); ++color) for(const auto & color : ledColors)
{ {
QJsonObject item; leds << QJsonValue(color.red) << QJsonValue(color.green) << QJsonValue(color.blue);
item["index"] = int(color - ledColors.begin());
item["red"] = color->red;
item["green"] = color->green;
item["blue"] = color->blue;
leds.append(item);
} }
result["leds"] = leds; result["leds"] = leds;

View File

@ -46,7 +46,6 @@ Hyperion::Hyperion(const quint8& instance)
, _settingsManager(new SettingsManager(instance, this)) , _settingsManager(new SettingsManager(instance, this))
, _componentRegister(this) , _componentRegister(this)
, _ledString(hyperion::createLedString(getSetting(settings::LEDS).array(), hyperion::createColorOrder(getSetting(settings::DEVICE).object()))) , _ledString(hyperion::createLedString(getSetting(settings::LEDS).array(), hyperion::createColorOrder(getSetting(settings::DEVICE).object())))
, _ledStringClone(hyperion::createLedStringClone(getSetting(settings::LEDS).array(), hyperion::createColorOrder(getSetting(settings::DEVICE).object())))
, _imageProcessor(new ImageProcessor(_ledString, this)) , _imageProcessor(new ImageProcessor(_ledString, this))
, _muxer(_ledString.leds().size()) , _muxer(_ledString.leds().size())
, _raw2ledAdjustment(hyperion::createLedColorsAdjustment(_ledString.leds().size(), getSetting(settings::COLOR).object())) , _raw2ledAdjustment(hyperion::createLedColorsAdjustment(_ledString.leds().size(), getSetting(settings::COLOR).object()))
@ -87,10 +86,6 @@ void Hyperion::start()
{ {
_ledStringColorOrder.push_back(led.colorOrder); _ledStringColorOrder.push_back(led.colorOrder);
} }
for (Led& led : _ledStringClone.leds())
{
_ledStringColorOrder.insert(_ledStringColorOrder.begin() + led.index, led.colorOrder);
}
// connect Hyperion::update with Muxer visible priority changes as muxer updates independent // connect Hyperion::update with Muxer visible priority changes as muxer updates independent
connect(&_muxer, &PriorityMuxer::visiblePriorityChanged, this, &Hyperion::update); connect(&_muxer, &PriorityMuxer::visiblePriorityChanged, this, &Hyperion::update);
@ -202,9 +197,8 @@ void Hyperion::handleSettingsUpdate(const settings::type& type, const QJsonDocum
// stop and cache all running effects, as effects depend heavily on ledlayout // stop and cache all running effects, as effects depend heavily on ledlayout
_effectEngine->cacheRunningEffects(); _effectEngine->cacheRunningEffects();
// ledstring, clone, img processor, muxer, ledGridSize (eff engine image based effects), _ledBuffer and ByteOrder of ledstring // ledstring, img processor, muxer, ledGridSize (eff engine image based effects), _ledBuffer and ByteOrder of ledstring
_ledString = hyperion::createLedString(leds, hyperion::createColorOrder(getSetting(settings::DEVICE).object())); _ledString = hyperion::createLedString(leds, hyperion::createColorOrder(getSetting(settings::DEVICE).object()));
_ledStringClone = hyperion::createLedStringClone(leds, hyperion::createColorOrder(getSetting(settings::DEVICE).object()));
_imageProcessor->setLedString(_ledString); _imageProcessor->setLedString(_ledString);
_muxer.updateLedColorsLength(_ledString.leds().size()); _muxer.updateLedColorsLength(_ledString.leds().size());
_ledGridSize = hyperion::getLedLayoutGridSize(leds); _ledGridSize = hyperion::getLedLayoutGridSize(leds);
@ -217,10 +211,6 @@ void Hyperion::handleSettingsUpdate(const settings::type& type, const QJsonDocum
{ {
_ledStringColorOrder.push_back(led.colorOrder); _ledStringColorOrder.push_back(led.colorOrder);
} }
for (Led& led : _ledStringClone.leds())
{
_ledStringColorOrder.insert(_ledStringColorOrder.begin() + led.index, led.colorOrder);
}
// handle hwLedCount update // handle hwLedCount update
_hwLedCount = qMax(unsigned(getSetting(settings::DEVICE).object()["hardwareLedCount"].toInt(getLedCount())), getLedCount()); _hwLedCount = qMax(unsigned(getSetting(settings::DEVICE).object()["hardwareLedCount"].toInt(getLedCount())), getLedCount());
@ -244,7 +234,6 @@ void Hyperion::handleSettingsUpdate(const settings::type& type, const QJsonDocum
if(_ledDeviceWrapper->getColorOrder() != dev["colorOrder"].toString("rgb")) if(_ledDeviceWrapper->getColorOrder() != dev["colorOrder"].toString("rgb"))
{ {
_ledString = hyperion::createLedString(getSetting(settings::LEDS).array(), hyperion::createColorOrder(dev)); _ledString = hyperion::createLedString(getSetting(settings::LEDS).array(), hyperion::createColorOrder(dev));
_ledStringClone = hyperion::createLedStringClone(getSetting(settings::LEDS).array(), hyperion::createColorOrder(dev));
_imageProcessor->setLedString(_ledString); _imageProcessor->setLedString(_ledString);
} }
@ -542,12 +531,6 @@ void Hyperion::update()
_raw2ledAdjustment->applyAdjustment(_ledBuffer); _raw2ledAdjustment->applyAdjustment(_ledBuffer);
// insert cloned leds into buffer
for (Led& led : _ledStringClone.leds())
{
_ledBuffer.insert(_ledBuffer.begin() + led.index, _ledBuffer.at(led.clone));
}
int i = 0; int i = 0;
for (ColorRgb& color : _ledBuffer) for (ColorRgb& color : _ledBuffer)
{ {

View File

@ -8,23 +8,13 @@
"required" : true, "required" : true,
"properties": "properties":
{ {
"index": "h":
{
"type":"integer",
"required":true,
"default" : 0
},
"clone":
{
"type":"integer"
},
"hscan":
{ {
"type":"object", "type":"object",
"required" : true, "required" : true,
"properties": "properties":
{ {
"minimum": "min":
{ {
"type":"number", "type":"number",
"minimum" : 0, "minimum" : 0,
@ -32,7 +22,7 @@
"required":true, "required":true,
"default" : 0 "default" : 0
}, },
"maximum": "max":
{ {
"type":"number", "type":"number",
"minimum" : 0, "minimum" : 0,
@ -43,13 +33,13 @@
}, },
"additionalProperties" : false "additionalProperties" : false
}, },
"vscan": "v":
{ {
"type":"object", "type":"object",
"required" : true, "required" : true,
"properties": "properties":
{ {
"minimum": "min":
{ {
"type":"number", "type":"number",
"minimum" : 0, "minimum" : 0,
@ -57,7 +47,7 @@
"required":true, "required":true,
"default" : 0 "default" : 0
}, },
"maximum": "max":
{ {
"type":"number", "type":"number",
"minimum" : 0, "minimum" : 0,