Do not limit priorities for Boblight (#1269) (#1298)

* Do not limit priorities for Boblight (#1269)

* Boblight - Allow to exclude component from build

* Fix merge

* Amlogic - Correct Pixelformat reference

* Remove "wrong" Amlogic ifdef, which was not working before
This commit is contained in:
LordGrey 2021-09-15 10:32:19 +02:00 committed by GitHub
parent 8a785e70c8
commit da49f25b4e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 273 additions and 226 deletions

View File

@ -42,11 +42,15 @@ endif()
# Set build variables # Set build variables
SET ( DEFAULT_AMLOGIC OFF ) SET ( DEFAULT_AMLOGIC OFF )
SET ( DEFAULT_BOBLIGHT ON )
SET ( DEFAULT_DISPMANX OFF ) SET ( DEFAULT_DISPMANX OFF )
SET ( DEFAULT_DX OFF )
SET ( DEFAULT_MF OFF )
SET ( DEFAULT_OSX OFF ) SET ( DEFAULT_OSX OFF )
SET ( DEFAULT_QT ON ) SET ( DEFAULT_QT ON )
SET ( DEFAULT_X11 OFF ) SET ( DEFAULT_X11 OFF )
SET ( DEFAULT_XCB OFF ) SET ( DEFAULT_XCB OFF )
SET ( DEFAULT_V4L2 OFF )
SET ( DEFAULT_WS281XPWM OFF ) SET ( DEFAULT_WS281XPWM OFF )
SET ( DEFAULT_AVAHI ON ) SET ( DEFAULT_AVAHI ON )
SET ( DEFAULT_USE_SHARED_AVAHI_LIBS ON ) SET ( DEFAULT_USE_SHARED_AVAHI_LIBS ON )
@ -55,7 +59,7 @@ SET ( DEFAULT_USE_SYSTEM_PROTO_LIBS OFF )
SET ( DEFAULT_USE_SYSTEM_MBEDTLS_LIBS OFF ) SET ( DEFAULT_USE_SYSTEM_MBEDTLS_LIBS OFF )
SET ( DEFAULT_TESTS OFF ) SET ( DEFAULT_TESTS OFF )
SET ( DEFAULT_EXPERIMENTAL OFF ) SET ( DEFAULT_EXPERIMENTAL OFF )
SET ( DEFAULT_MF OFF ) SET ( DEFAULT_CEC OFF )
SET ( DEFAULT_DEPLOY_DEPENDENCIES ON ) SET ( DEFAULT_DEPLOY_DEPENDENCIES ON )
IF ( ${CMAKE_SYSTEM} MATCHES "Linux" ) IF ( ${CMAKE_SYSTEM} MATCHES "Linux" )
@ -159,6 +163,10 @@ STRING( REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}" )
ADD_DEFINITIONS( ${PLATFORM_DEFINE} ) ADD_DEFINITIONS( ${PLATFORM_DEFINE} )
# set the build options # set the build options
option(ENABLE_BOBLIGHT "Enable BOBLIGHT server" ${DEFAULT_BOBLIGHT} )
message(STATUS "ENABLE_BOBLIGHT = ${ENABLE_BOBLIGHT}")
option(ENABLE_AMLOGIC "Enable the AMLOGIC video grabber" ${DEFAULT_AMLOGIC} ) option(ENABLE_AMLOGIC "Enable the AMLOGIC video grabber" ${DEFAULT_AMLOGIC} )
message(STATUS "ENABLE_AMLOGIC = ${ENABLE_AMLOGIC}") message(STATUS "ENABLE_AMLOGIC = ${ENABLE_AMLOGIC}")

View File

@ -45,6 +45,9 @@
// Define to enable CEC // Define to enable CEC
#cmakedefine ENABLE_CEC #cmakedefine ENABLE_CEC
// Define to enable boblight server
#cmakedefine ENABLE_BOBLIGHT
// Define to enable the USB / HID devices // Define to enable the USB / HID devices
#cmakedefine ENABLE_USB_HID #cmakedefine ENABLE_USB_HID

View File

@ -1,91 +1,92 @@
$(document).ready( function() { $(document).ready(function () {
performTranslation(); performTranslation();
var conf_editor_net = null; var BOBLIGHT_ENABLED = window.comps.find(element => element.name == "BOBLIGHTSERVER");
var conf_editor_json = null;
var conf_editor_proto = null;
var conf_editor_fbs = null;
var conf_editor_bobl = null;
var conf_editor_forw = null;
if(window.showOptHelp) var conf_editor_net = null;
{ var conf_editor_json = null;
//network var conf_editor_proto = null;
$('#conf_cont').append(createRow('conf_cont_net')) var conf_editor_fbs = null;
$('#conf_cont_net').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_net_heading_title"), 'editor_container_net', 'btn_submit_net', 'panel-system')); var conf_editor_bobl = null;
$('#conf_cont_net').append(createHelpTable(window.schema.network.properties, $.i18n("edt_conf_net_heading_title"))); var conf_editor_forw = null;
//jsonserver if (window.showOptHelp) {
$('#conf_cont').append(createRow('conf_cont_json')) //network
$('#conf_cont_json').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_js_heading_title"), 'editor_container_jsonserver', 'btn_submit_jsonserver', 'panel-system')); $('#conf_cont').append(createRow('conf_cont_net'))
$('#conf_cont_json').append(createHelpTable(window.schema.jsonServer.properties, $.i18n("edt_conf_js_heading_title"))); $('#conf_cont_net').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_net_heading_title"), 'editor_container_net', 'btn_submit_net', 'panel-system'));
$('#conf_cont_net').append(createHelpTable(window.schema.network.properties, $.i18n("edt_conf_net_heading_title")));
//flatbufserver //jsonserver
$('#conf_cont').append(createRow('conf_cont_flatbuf')) $('#conf_cont').append(createRow('conf_cont_json'))
$('#conf_cont_flatbuf').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_fbs_heading_title"), 'editor_container_fbserver', 'btn_submit_fbserver', 'panel-system')); $('#conf_cont_json').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_js_heading_title"), 'editor_container_jsonserver', 'btn_submit_jsonserver', 'panel-system'));
$('#conf_cont_flatbuf').append(createHelpTable(window.schema.flatbufServer.properties, $.i18n("edt_conf_fbs_heading_title"),"flatbufServerHelpPanelId")); $('#conf_cont_json').append(createHelpTable(window.schema.jsonServer.properties, $.i18n("edt_conf_js_heading_title")));
//protoserver //flatbufserver
$('#conf_cont').append(createRow('conf_cont_proto')) $('#conf_cont').append(createRow('conf_cont_flatbuf'))
$('#conf_cont_proto').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_pbs_heading_title"), 'editor_container_protoserver', 'btn_submit_protoserver', 'panel-system')); $('#conf_cont_flatbuf').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_fbs_heading_title"), 'editor_container_fbserver', 'btn_submit_fbserver', 'panel-system'));
$('#conf_cont_proto').append(createHelpTable(window.schema.protoServer.properties, $.i18n("edt_conf_pbs_heading_title"),"protoServerHelpPanelId")); $('#conf_cont_flatbuf').append(createHelpTable(window.schema.flatbufServer.properties, $.i18n("edt_conf_fbs_heading_title"), "flatbufServerHelpPanelId"));
//boblight //protoserver
$('#conf_cont').append(createRow('conf_cont_bobl')) $('#conf_cont').append(createRow('conf_cont_proto'))
$('#conf_cont_bobl').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_bobls_heading_title"), 'editor_container_boblightserver', 'btn_submit_boblightserver', 'panel-system')); $('#conf_cont_proto').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_pbs_heading_title"), 'editor_container_protoserver', 'btn_submit_protoserver', 'panel-system'));
$('#conf_cont_bobl').append(createHelpTable(window.schema.boblightServer.properties, $.i18n("edt_conf_bobls_heading_title"), "boblightServerHelpPanelId")); $('#conf_cont_proto').append(createHelpTable(window.schema.protoServer.properties, $.i18n("edt_conf_pbs_heading_title"), "protoServerHelpPanelId"));
//forwarder //boblight
if(storedAccess != 'default') if (BOBLIGHT_ENABLED) {
{ $('#conf_cont').append(createRow('conf_cont_bobl'))
$('#conf_cont').append(createRow('conf_cont_fw')) $('#conf_cont_bobl').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_bobls_heading_title"), 'editor_container_boblightserver', 'btn_submit_boblightserver', 'panel-system'));
$('#conf_cont_fw').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_fw_heading_title"), 'editor_container_forwarder', 'btn_submit_forwarder', 'panel-system')); $('#conf_cont_bobl').append(createHelpTable(window.schema.boblightServer.properties, $.i18n("edt_conf_bobls_heading_title"), "boblightServerHelpPanelId"));
$('#conf_cont_fw').append(createHelpTable(window.schema.forwarder.properties, $.i18n("edt_conf_fw_heading_title"),"forwarderHelpPanelId")); }
}
}
else
{
$('#conf_cont').addClass('row');
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_net_heading_title"), 'editor_container_net', 'btn_submit_net'));
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_js_heading_title"), 'editor_container_jsonserver', 'btn_submit_jsonserver'));
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_fbs_heading_title"), 'editor_container_fbserver', 'btn_submit_fbserver'));
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_pbs_heading_title"), 'editor_container_protoserver', 'btn_submit_protoserver'));
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_bobls_heading_title"), 'editor_container_boblightserver', 'btn_submit_boblightserver'));
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_fw_heading_title"), 'editor_container_forwarder', 'btn_submit_forwarder'));
$("#conf_cont_tok").removeClass('row'); //forwarder
} if (storedAccess != 'default') {
$('#conf_cont').append(createRow('conf_cont_fw'))
$('#conf_cont_fw').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_fw_heading_title"), 'editor_container_forwarder', 'btn_submit_forwarder', 'panel-system'));
$('#conf_cont_fw').append(createHelpTable(window.schema.forwarder.properties, $.i18n("edt_conf_fw_heading_title"), "forwarderHelpPanelId"));
}
}
else {
$('#conf_cont').addClass('row');
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_net_heading_title"), 'editor_container_net', 'btn_submit_net'));
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_js_heading_title"), 'editor_container_jsonserver', 'btn_submit_jsonserver'));
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_fbs_heading_title"), 'editor_container_fbserver', 'btn_submit_fbserver'));
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_pbs_heading_title"), 'editor_container_protoserver', 'btn_submit_protoserver'));
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_bobls_heading_title"), 'editor_container_boblightserver', 'btn_submit_boblightserver'));
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_fw_heading_title"), 'editor_container_forwarder', 'btn_submit_forwarder'));
// net $("#conf_cont_tok").removeClass('row');
conf_editor_net = createJsonEditor('editor_container_net', { }
network : window.schema.network
}, true, true);
conf_editor_net.on('change',function() { // net
conf_editor_net.validate().length || window.readOnlyMode ? $('#btn_submit_net').attr('disabled', true) : $('#btn_submit_net').attr('disabled', false); conf_editor_net = createJsonEditor('editor_container_net', {
}); network: window.schema.network
}, true, true);
$('#btn_submit_net').off().on('click',function() { conf_editor_net.on('change', function () {
requestWriteConfig(conf_editor_net.getValue()); conf_editor_net.validate().length || window.readOnlyMode ? $('#btn_submit_net').attr('disabled', true) : $('#btn_submit_net').attr('disabled', false);
}); });
//json $('#btn_submit_net').off().on('click', function () {
conf_editor_json = createJsonEditor('editor_container_jsonserver', { requestWriteConfig(conf_editor_net.getValue());
jsonServer : window.schema.jsonServer });
}, true, true);
conf_editor_json.on('change',function() { //json
conf_editor_json.validate().length || window.readOnlyMode ? $('#btn_submit_jsonserver').attr('disabled', true) : $('#btn_submit_jsonserver').attr('disabled', false); conf_editor_json = createJsonEditor('editor_container_jsonserver', {
}); jsonServer: window.schema.jsonServer
}, true, true);
$('#btn_submit_jsonserver').off().on('click',function() { conf_editor_json.on('change', function () {
requestWriteConfig(conf_editor_json.getValue()); conf_editor_json.validate().length || window.readOnlyMode ? $('#btn_submit_jsonserver').attr('disabled', true) : $('#btn_submit_jsonserver').attr('disabled', false);
}); });
//flatbuffer $('#btn_submit_jsonserver').off().on('click', function () {
conf_editor_fbs = createJsonEditor('editor_container_fbserver', { requestWriteConfig(conf_editor_json.getValue());
flatbufServer : window.schema.flatbufServer });
}, true, true);
//flatbuffer
conf_editor_fbs = createJsonEditor('editor_container_fbserver', {
flatbufServer: window.schema.flatbufServer
}, true, true);
conf_editor_fbs.on('change', function () { conf_editor_fbs.on('change', function () {
var flatbufServerEnable = conf_editor_fbs.getEditor("root.flatbufServer.enable").getValue(); var flatbufServerEnable = conf_editor_fbs.getEditor("root.flatbufServer.enable").getValue();
@ -96,17 +97,17 @@ $(document).ready( function() {
showInputOptionsForKey(conf_editor_fbs, "flatbufServer", "enable", false); showInputOptionsForKey(conf_editor_fbs, "flatbufServer", "enable", false);
$('#flatbufServerHelpPanelId').hide(); $('#flatbufServerHelpPanelId').hide();
} }
conf_editor_fbs.validate().length || window.readOnlyMode ? $('#btn_submit_fbserver').attr('disabled', true) : $('#btn_submit_fbserver').attr('disabled', false); conf_editor_fbs.validate().length || window.readOnlyMode ? $('#btn_submit_fbserver').attr('disabled', true) : $('#btn_submit_fbserver').attr('disabled', false);
}); });
$('#btn_submit_fbserver').off().on('click',function() { $('#btn_submit_fbserver').off().on('click', function () {
requestWriteConfig(conf_editor_fbs.getValue()); requestWriteConfig(conf_editor_fbs.getValue());
}); });
//protobuffer //protobuffer
conf_editor_proto = createJsonEditor('editor_container_protoserver', { conf_editor_proto = createJsonEditor('editor_container_protoserver', {
protoServer : window.schema.protoServer protoServer: window.schema.protoServer
}, true, true); }, true, true);
conf_editor_proto.on('change', function () { conf_editor_proto.on('change', function () {
var protoServerEnable = conf_editor_proto.getEditor("root.protoServer.enable").getValue(); var protoServerEnable = conf_editor_proto.getEditor("root.protoServer.enable").getValue();
@ -117,40 +118,41 @@ $(document).ready( function() {
showInputOptionsForKey(conf_editor_proto, "protoServer", "enable", false); showInputOptionsForKey(conf_editor_proto, "protoServer", "enable", false);
$('#protoServerHelpPanelId').hide(); $('#protoServerHelpPanelId').hide();
} }
conf_editor_proto.validate().length || window.readOnlyMode ? $('#btn_submit_protoserver').attr('disabled', true) : $('#btn_submit_protoserver').attr('disabled', false); conf_editor_proto.validate().length || window.readOnlyMode ? $('#btn_submit_protoserver').attr('disabled', true) : $('#btn_submit_protoserver').attr('disabled', false);
}); });
$('#btn_submit_protoserver').off().on('click',function() { $('#btn_submit_protoserver').off().on('click', function () {
requestWriteConfig(conf_editor_proto.getValue()); requestWriteConfig(conf_editor_proto.getValue());
}); });
//boblight //boblight
conf_editor_bobl = createJsonEditor('editor_container_boblightserver', { if (BOBLIGHT_ENABLED) {
boblightServer : window.schema.boblightServer conf_editor_bobl = createJsonEditor('editor_container_boblightserver', {
}, true, true); boblightServer: window.schema.boblightServer
}, true, true);
conf_editor_bobl.on('change', function () { conf_editor_bobl.on('change', function () {
var boblightServerEnable = conf_editor_bobl.getEditor("root.boblightServer.enable").getValue(); var boblightServerEnable = conf_editor_bobl.getEditor("root.boblightServer.enable").getValue();
if (boblightServerEnable) { if (boblightServerEnable) {
showInputOptionsForKey(conf_editor_bobl, "boblightServer", "enable", true); showInputOptionsForKey(conf_editor_bobl, "boblightServer", "enable", true);
$('#boblightServerHelpPanelId').show(); $('#boblightServerHelpPanelId').show();
} else { } else {
showInputOptionsForKey(conf_editor_bobl, "boblightServer", "enable", false); showInputOptionsForKey(conf_editor_bobl, "boblightServer", "enable", false);
$('#boblightServerHelpPanelId').hide(); $('#boblightServerHelpPanelId').hide();
} }
conf_editor_bobl.validate().length || window.readOnlyMode ? $('#btn_submit_boblightserver').attr('disabled', true) : $('#btn_submit_boblightserver').attr('disabled', false); conf_editor_bobl.validate().length || window.readOnlyMode ? $('#btn_submit_boblightserver').attr('disabled', true) : $('#btn_submit_boblightserver').attr('disabled', false);
}); });
$('#btn_submit_boblightserver').off().on('click', function () { $('#btn_submit_boblightserver').off().on('click', function () {
requestWriteConfig(conf_editor_bobl.getValue()); requestWriteConfig(conf_editor_bobl.getValue());
}); });
}
if(storedAccess != 'default') if (storedAccess != 'default') {
{ //forwarder
//forwarder conf_editor_forw = createJsonEditor('editor_container_forwarder', {
conf_editor_forw = createJsonEditor('editor_container_forwarder', { forwarder: window.schema.forwarder
forwarder : window.schema.forwarder }, true, true);
}, true, true);
conf_editor_forw.on('change', function () { conf_editor_forw.on('change', function () {
var forwarderEnable = conf_editor_forw.getEditor("root.forwarder.enable").getValue(); var forwarderEnable = conf_editor_forw.getEditor("root.forwarder.enable").getValue();
@ -161,90 +163,88 @@ $(document).ready( function() {
showInputOptionsForKey(conf_editor_forw, "forwarder", "enable", false); showInputOptionsForKey(conf_editor_forw, "forwarder", "enable", false);
$('#forwarderHelpPanelId').hide(); $('#forwarderHelpPanelId').hide();
} }
conf_editor_forw.validate().length || window.readOnlyMode ? $('#btn_submit_forwarder').attr('disabled', true) : $('#btn_submit_forwarder').attr('disabled', false); conf_editor_forw.validate().length || window.readOnlyMode ? $('#btn_submit_forwarder').attr('disabled', true) : $('#btn_submit_forwarder').attr('disabled', false);
}); });
$('#btn_submit_forwarder').off().on('click',function() { $('#btn_submit_forwarder').off().on('click', function () {
requestWriteConfig(conf_editor_forw.getValue()); requestWriteConfig(conf_editor_forw.getValue());
}); });
} }
//create introduction //create introduction
if(window.showOptHelp) if (window.showOptHelp) {
{ createHint("intro", $.i18n('conf_network_net_intro'), "editor_container_net");
createHint("intro", $.i18n('conf_network_net_intro'), "editor_container_net"); createHint("intro", $.i18n('conf_network_json_intro'), "editor_container_jsonserver");
createHint("intro", $.i18n('conf_network_json_intro'), "editor_container_jsonserver"); createHint("intro", $.i18n('conf_network_fbs_intro'), "editor_container_fbserver");
createHint("intro", $.i18n('conf_network_fbs_intro'), "editor_container_fbserver"); createHint("intro", $.i18n('conf_network_proto_intro'), "editor_container_protoserver");
createHint("intro", $.i18n('conf_network_proto_intro'), "editor_container_protoserver"); if (BOBLIGHT_ENABLED) {
createHint("intro", $.i18n('conf_network_bobl_intro'), "editor_container_boblightserver"); createHint("intro", $.i18n('conf_network_bobl_intro'), "editor_container_boblightserver");
createHint("intro", $.i18n('conf_network_forw_intro'), "editor_container_forwarder"); }
createHint("intro", $.i18n('conf_network_tok_intro'), "tok_desc_cont"); createHint("intro", $.i18n('conf_network_forw_intro'), "editor_container_forwarder");
} createHint("intro", $.i18n('conf_network_tok_intro'), "tok_desc_cont");
}
// Token handling // Token handling
function buildTokenList() function buildTokenList() {
{ $('.tktbody').html("");
$('.tktbody').html(""); for (var key in tokenList) {
for(var key in tokenList) var lastUse = (tokenList[key].last_use) ? tokenList[key].last_use : "-";
{ var btn = '<button id="tok' + tokenList[key].id + '" type="button" class="btn btn-danger">' + $.i18n('general_btn_delete') + '</button>';
var lastUse = (tokenList[key].last_use) ? tokenList[key].last_use : "-"; $('.tktbody').append(createTableRow([tokenList[key].comment, lastUse, btn], false, true));
var btn = '<button id="tok'+tokenList[key].id+'" type="button" class="btn btn-danger">'+$.i18n('general_btn_delete')+'</button>'; $('#tok' + tokenList[key].id).off().on('click', handleDeleteToken);
$('.tktbody').append(createTableRow([tokenList[key].comment, lastUse, btn], false, true)); }
$('#tok'+tokenList[key].id).off().on('click', handleDeleteToken); }
}
}
createTable('tkthead', 'tktbody', 'tktable'); createTable('tkthead', 'tktbody', 'tktable');
$('.tkthead').html(createTableRow([$.i18n('conf_network_tok_cidhead'), $.i18n('conf_network_tok_lastuse'), $.i18n('general_btn_delete')], true, true)); $('.tkthead').html(createTableRow([$.i18n('conf_network_tok_cidhead'), $.i18n('conf_network_tok_lastuse'), $.i18n('general_btn_delete')], true, true));
buildTokenList(); buildTokenList();
function handleDeleteToken(e) function handleDeleteToken(e) {
{ var key = e.currentTarget.id.replace("tok", "");
var key = e.currentTarget.id.replace("tok",""); requestTokenDelete(key);
requestTokenDelete(key); $('#tok' + key).parent().parent().remove();
$('#tok'+key).parent().parent().remove(); // rm deleted token id
// rm deleted token id tokenList = tokenList.filter(function (obj) {
tokenList = tokenList.filter(function( obj ) { return obj.id !== key;
return obj.id !== key; });
}); }
}
$('#btn_create_tok').off().on('click',function() { $('#btn_create_tok').off().on('click', function () {
requestToken(encodeHTML($('#tok_comment').val())) requestToken(encodeHTML($('#tok_comment').val()))
$('#tok_comment').val("") $('#tok_comment').val("")
$('#btn_create_tok').attr('disabled', true) $('#btn_create_tok').attr('disabled', true)
}); });
$('#tok_comment').off().on('input',function(e) { $('#tok_comment').off().on('input', function (e) {
(e.currentTarget.value.length >= 10) ? $('#btn_create_tok').attr('disabled', false) : $('#btn_create_tok').attr('disabled', true); (e.currentTarget.value.length >= 10) ? $('#btn_create_tok').attr('disabled', false) : $('#btn_create_tok').attr('disabled', true);
if(10-e.currentTarget.value.length >= 1 && 10-e.currentTarget.value.length <= 9) if (10 - e.currentTarget.value.length >= 1 && 10 - e.currentTarget.value.length <= 9)
$('#tok_chars_needed').html(10-e.currentTarget.value.length + " " + $.i18n('general_chars_needed')) $('#tok_chars_needed').html(10 - e.currentTarget.value.length + " " + $.i18n('general_chars_needed'))
else else
$('#tok_chars_needed').html("<br />") $('#tok_chars_needed').html("<br />")
}); });
$(window.hyperion).off("cmd-authorize-createToken").on("cmd-authorize-createToken", function(event) { $(window.hyperion).off("cmd-authorize-createToken").on("cmd-authorize-createToken", function (event) {
var val = event.response.info; var val = event.response.info;
showInfoDialog("newToken",$.i18n('conf_network_tok_diaTitle'),$.i18n('conf_network_tok_diaMsg')+'<br><div style="font-weight:bold">'+val.token+'</div>') showInfoDialog("newToken", $.i18n('conf_network_tok_diaTitle'), $.i18n('conf_network_tok_diaMsg') + '<br><div style="font-weight:bold">' + val.token + '</div>')
tokenList.push(val) tokenList.push(val)
buildTokenList() buildTokenList()
}); });
//Reorder hardcoded token div after the general token setting div //Reorder hardcoded token div after the general token setting div
$("#conf_cont_tok").insertAfter("#conf_cont_net"); $("#conf_cont_tok").insertAfter("#conf_cont_net");
function checkApiTokenState(state) function checkApiTokenState(state) {
{ if (state == false)
if(state == false) $("#conf_cont_tok").attr('style', 'display:none')
$("#conf_cont_tok").attr('style', 'display:none') else
else $("#conf_cont_tok").removeAttr('style')
$("#conf_cont_tok").removeAttr('style') }
}
$('#root_network_apiAuth').change(function () { $('#root_network_apiAuth').change(function () {
var state = $(this).is(":checked"); var state = $(this).is(":checked");
checkApiTokenState(state); checkApiTokenState(state);
}) })
checkApiTokenState(window.serverConfig.network.apiAuth); checkApiTokenState(window.serverConfig.network.apiAuth);
removeOverlay(); removeOverlay();
}); });

View File

@ -46,7 +46,9 @@ class ColorAdjustment;
class SettingsManager; class SettingsManager;
class BGEffectHandler; class BGEffectHandler;
class CaptureCont; class CaptureCont;
#if defined(ENABLE_BOBLIGHT)
class BoblightServer; class BoblightServer;
#endif
class LedDeviceWrapper; class LedDeviceWrapper;
class Logger; class Logger;
@ -545,8 +547,10 @@ private:
VideoMode _currVideoMode = VideoMode::VIDEO_2D; VideoMode _currVideoMode = VideoMode::VIDEO_2D;
#if defined(ENABLE_BOBLIGHT)
/// Boblight instance /// Boblight instance
BoblightServer* _boblightServer; BoblightServer* _boblightServer;
#endif
bool _readOnlyMode; bool _readOnlyMode;
}; };

View File

@ -1,6 +1,8 @@
#pragma once #pragma once
#include <QString> #include <QString>
#include "HyperionConfig.h"
namespace hyperion namespace hyperion
{ {
@ -14,7 +16,9 @@ enum Components
COMP_SMOOTHING, COMP_SMOOTHING,
COMP_BLACKBORDER, COMP_BLACKBORDER,
COMP_FORWARDER, COMP_FORWARDER,
#if defined(ENABLE_BOBLIGHT)
COMP_BOBLIGHTSERVER, COMP_BOBLIGHTSERVER,
#endif
COMP_GRABBER, COMP_GRABBER,
COMP_V4L, COMP_V4L,
COMP_COLOR, COMP_COLOR,
@ -33,7 +37,9 @@ inline const char* componentToString(Components c)
case COMP_SMOOTHING: return "Smoothing"; case COMP_SMOOTHING: return "Smoothing";
case COMP_BLACKBORDER: return "Blackborder detector"; case COMP_BLACKBORDER: return "Blackborder detector";
case COMP_FORWARDER: return "Json/Proto forwarder"; case COMP_FORWARDER: return "Json/Proto forwarder";
#if defined(ENABLE_BOBLIGHT)
case COMP_BOBLIGHTSERVER:return "Boblight server"; case COMP_BOBLIGHTSERVER:return "Boblight server";
#endif
case COMP_GRABBER: return "Framegrabber"; case COMP_GRABBER: return "Framegrabber";
case COMP_V4L: return "V4L capture device"; case COMP_V4L: return "V4L capture device";
case COMP_COLOR: return "Solid color"; case COMP_COLOR: return "Solid color";
@ -54,7 +60,9 @@ inline const char* componentToIdString(Components c)
case COMP_SMOOTHING: return "SMOOTHING"; case COMP_SMOOTHING: return "SMOOTHING";
case COMP_BLACKBORDER: return "BLACKBORDER"; case COMP_BLACKBORDER: return "BLACKBORDER";
case COMP_FORWARDER: return "FORWARDER"; case COMP_FORWARDER: return "FORWARDER";
#if defined(ENABLE_BOBLIGHT)
case COMP_BOBLIGHTSERVER:return "BOBLIGHTSERVER"; case COMP_BOBLIGHTSERVER:return "BOBLIGHTSERVER";
#endif
case COMP_GRABBER: return "GRABBER"; case COMP_GRABBER: return "GRABBER";
case COMP_V4L: return "V4L"; case COMP_V4L: return "V4L";
case COMP_COLOR: return "COLOR"; case COMP_COLOR: return "COLOR";
@ -74,7 +82,9 @@ inline Components stringToComponent(const QString& component)
if (cmp == "SMOOTHING") return COMP_SMOOTHING; if (cmp == "SMOOTHING") return COMP_SMOOTHING;
if (cmp == "BLACKBORDER") return COMP_BLACKBORDER; if (cmp == "BLACKBORDER") return COMP_BLACKBORDER;
if (cmp == "FORWARDER") return COMP_FORWARDER; if (cmp == "FORWARDER") return COMP_FORWARDER;
#if defined(ENABLE_BOBLIGHT)
if (cmp == "BOBLIGHTSERVER")return COMP_BOBLIGHTSERVER; if (cmp == "BOBLIGHTSERVER")return COMP_BOBLIGHTSERVER;
#endif
if (cmp == "GRABBER") return COMP_GRABBER; if (cmp == "GRABBER") return COMP_GRABBER;
if (cmp == "V4L") return COMP_V4L; if (cmp == "V4L") return COMP_V4L;
if (cmp == "COLOR") return COMP_COLOR; if (cmp == "COLOR") return COMP_COLOR;

View File

@ -10,7 +10,9 @@ add_subdirectory(jsonserver)
add_subdirectory(flatbufserver) add_subdirectory(flatbufserver)
add_subdirectory(protoserver) add_subdirectory(protoserver)
add_subdirectory(ssdp) add_subdirectory(ssdp)
add_subdirectory(boblightserver) if(ENABLE_BOBLIGHT)
add_subdirectory(boblightserver)
endif()
add_subdirectory(leddevice) add_subdirectory(leddevice)
add_subdirectory(utils) add_subdirectory(utils)
add_subdirectory(effectengine) add_subdirectory(effectengine)

View File

@ -21,11 +21,19 @@
#include "HyperionConfig.h" #include "HyperionConfig.h"
#include <hyperion/Hyperion.h> #include <hyperion/Hyperion.h>
#include <utils/QStringUtils.h> #include <utils/QStringUtils.h>
#include <hyperion/PriorityMuxer.h>
// project includes // project includes
#include "BoblightClientConnection.h" #include "BoblightClientConnection.h"
BoblightClientConnection::BoblightClientConnection(Hyperion* hyperion, QTcpSocket *socket, int priority) // Constants
namespace {
const int BOBLIGHT_DEFAULT_PRIORITY = 128;
const int BOBLIGHT_MIN_PRIORITY = PriorityMuxer::FG_PRIORITY+1;
const int BOBLIGHT_MAX_PRIORITY = PriorityMuxer::BG_PRIORITY-1;
} //End of constants
BoblightClientConnection::BoblightClientConnection(Hyperion* hyperion, QTcpSocket* socket, int priority)
: QObject() : QObject()
, _locale(QLocale::C) , _locale(QLocale::C)
, _socket(socket) , _socket(socket)
@ -47,8 +55,8 @@ BoblightClientConnection::BoblightClientConnection(Hyperion* hyperion, QTcpSocke
BoblightClientConnection::~BoblightClientConnection() BoblightClientConnection::~BoblightClientConnection()
{ {
// clear the current channel // clear the current channel
if (_priority != 0 && _priority >= 128 && _priority < 254) if (_priority != 0 && _priority >= BOBLIGHT_MIN_PRIORITY && _priority <= BOBLIGHT_MAX_PRIORITY)
_hyperion->clear(_priority); _hyperion->clear(_priority);
delete _socket; delete _socket;
@ -59,7 +67,7 @@ void BoblightClientConnection::readData()
_receiveBuffer.append(_socket->readAll()); _receiveBuffer.append(_socket->readAll());
int bytes = _receiveBuffer.indexOf('\n') + 1; int bytes = _receiveBuffer.indexOf('\n') + 1;
while(bytes > 0) while (bytes > 0)
{ {
// create message string (strip the newline) // create message string (strip the newline)
const QString message = readMessage(_receiveBuffer.data(), bytes); const QString message = readMessage(_receiveBuffer.data(), bytes);
@ -71,7 +79,7 @@ void BoblightClientConnection::readData()
_receiveBuffer.remove(0, bytes); _receiveBuffer.remove(0, bytes);
// drop messages if the buffer is too full // drop messages if the buffer is too full
if (_receiveBuffer.size() > 100*1024) if (_receiveBuffer.size() > 100 * 1024)
{ {
Debug(_log, "server drops messages (buffer full)"); Debug(_log, "server drops messages (buffer full)");
_receiveBuffer.clear(); _receiveBuffer.clear();
@ -82,9 +90,9 @@ void BoblightClientConnection::readData()
} }
} }
QString BoblightClientConnection::readMessage(const char *data, const size_t size) const QString BoblightClientConnection::readMessage(const char* data, const size_t size) const
{ {
char *end = (char *)data + size - 1; char* end = (char*)data + size - 1;
// Trim left // Trim left
while (data < end && std::isspace(*data)) while (data < end && std::isspace(*data))
@ -100,7 +108,7 @@ QString BoblightClientConnection::readMessage(const char *data, const size_t siz
// create message string (strip the newline) // create message string (strip the newline)
const int len = end - data + 1; const int len = end - data + 1;
const QString message = QString::fromLatin1(data, len); const QString message = QString::fromLatin1(data, len);
//std::cout << bytes << ": \"" << message.toUtf8().constData() << "\"" << std::endl; //std::cout << bytes << ": \"" << message.toUtf8().constData() << "\"" << std::endl;
@ -109,15 +117,15 @@ QString BoblightClientConnection::readMessage(const char *data, const size_t siz
void BoblightClientConnection::socketClosed() void BoblightClientConnection::socketClosed()
{ {
// clear the current channel // clear the current channel
if (_priority >= 128 && _priority < 254) if (_priority >= BOBLIGHT_MIN_PRIORITY && _priority <= BOBLIGHT_MAX_PRIORITY)
_hyperion->clear(_priority); _hyperion->clear(_priority);
emit connectionClosed(this); emit connectionClosed(this);
} }
void BoblightClientConnection::handleMessage(const QString & message) void BoblightClientConnection::handleMessage(const QString& message)
{ {
//std::cout << "boblight message: " << message.toStdString() << std::endl; //std::cout << "boblight message: " << message.toStdString() << std::endl;
const QVector<QStringRef> messageParts = QStringUtils::splitRef(message, ' ', QStringUtils::SplitBehavior::SkipEmptyParts); const QVector<QStringRef> messageParts = QStringUtils::splitRef(message, ' ', QStringUtils::SplitBehavior::SkipEmptyParts);
@ -166,16 +174,16 @@ void BoblightClientConnection::handleMessage(const QString & message)
if (rc1 && rc2 && rc3) if (rc1 && rc2 && rc3)
{ {
ColorRgb & rgb = _ledColors[ledIndex]; ColorRgb& rgb = _ledColors[ledIndex];
rgb.red = red; rgb.red = red;
rgb.green = green; rgb.green = green;
rgb.blue = blue; rgb.blue = blue;
if (_priority == 0 || _priority < 128 || _priority >= 254) if (_priority == 0 || _priority < BOBLIGHT_MIN_PRIORITY || _priority > BOBLIGHT_MAX_PRIORITY)
return; return;
// send current color values to hyperion if this is the last led assuming leds values are send in order of id // send current color values to hyperion if this is the last led assuming leds values are send in order of id
if (ledIndex == _ledColors.size() -1) if (ledIndex == _ledColors.size() - 1)
{ {
_hyperion->setInput(_priority, _ledColors); _hyperion->setInput(_priority, _ledColors);
} }
@ -183,10 +191,10 @@ void BoblightClientConnection::handleMessage(const QString & message)
return; return;
} }
} }
else if(messageParts[3] == "speed" || else if (messageParts[3] == "speed" ||
messageParts[3] == "interpolation" || messageParts[3] == "interpolation" ||
messageParts[3] == "use" || messageParts[3] == "use" ||
messageParts[3] == "singlechange") messageParts[3] == "singlechange")
{ {
// these message are ignored by Hyperion // these message are ignored by Hyperion
return; return;
@ -202,16 +210,17 @@ void BoblightClientConnection::handleMessage(const QString & message)
if (_priority != 0 && _hyperion->getPriorityInfo(_priority).componentId == hyperion::COMP_BOBLIGHTSERVER) if (_priority != 0 && _hyperion->getPriorityInfo(_priority).componentId == hyperion::COMP_BOBLIGHTSERVER)
_hyperion->clear(_priority); _hyperion->clear(_priority);
if (prio < 128 || prio >= 254) if (prio < BOBLIGHT_MIN_PRIORITY || prio > BOBLIGHT_MAX_PRIORITY)
{ {
_priority = 128; _priority = BOBLIGHT_DEFAULT_PRIORITY;
while (_hyperion->getActivePriorities().contains(_priority)) while (_hyperion->getActivePriorities().contains(_priority))
{ {
_priority += 1; _priority += 1;
} }
// warn against invalid priority // warn against invalid priority
Warning(_log, "The priority %i is not in the priority range between 128 and 253. Priority %i is used instead.", prio, _priority); Warning(_log, "The priority %i is not in the priority range of [%d-%d]. Priority %i is used instead.",
prio, BOBLIGHT_MIN_PRIORITY, BOBLIGHT_MAX_PRIORITY, _priority);
// register new priority (previously modified) // register new priority (previously modified)
_hyperion->registerInput(_priority, hyperion::COMP_BOBLIGHTSERVER, QString("Boblight@%1").arg(_socket->peerAddress().toString())); _hyperion->registerInput(_priority, hyperion::COMP_BOBLIGHTSERVER, QString("Boblight@%1").arg(_socket->peerAddress().toString()));
} }
@ -228,7 +237,7 @@ void BoblightClientConnection::handleMessage(const QString & message)
} }
else if (messageParts[0] == "sync") else if (messageParts[0] == "sync")
{ {
if ( _priority >= 128 && _priority < 254) if (_priority >= BOBLIGHT_MIN_PRIORITY && _priority <= BOBLIGHT_MAX_PRIORITY)
_hyperion->setInput(_priority, _ledColors); // send current color values to hyperion _hyperion->setInput(_priority, _ledColors); // send current color values to hyperion
return; return;
@ -248,9 +257,9 @@ const float ipows[] = {
1.0f / 100000.0f, 1.0f / 100000.0f,
1.0f / 1000000.0f, 1.0f / 1000000.0f,
1.0f / 10000000.0f, 1.0f / 10000000.0f,
1.0f / 100000000.0f}; 1.0f / 100000000.0f };
float BoblightClientConnection::parseFloat(const QStringRef& s, bool *ok) const float BoblightClientConnection::parseFloat(const QStringRef& s, bool* ok) const
{ {
// We parse radix 10 // We parse radix 10
const char MIN_DIGIT = '0'; const char MIN_DIGIT = '0';
@ -331,7 +340,7 @@ float BoblightClientConnection::parseFloat(const QStringRef& s, bool *ok) const
return f; return f;
} }
unsigned BoblightClientConnection::parseUInt(const QStringRef& s, bool *ok) const unsigned BoblightClientConnection::parseUInt(const QStringRef& s, bool* ok) const
{ {
// We parse radix 10 // We parse radix 10
const char MIN_DIGIT = '0'; const char MIN_DIGIT = '0';
@ -363,7 +372,7 @@ unsigned BoblightClientConnection::parseUInt(const QStringRef& s, bool *ok) cons
return n; return n;
} }
uint8_t BoblightClientConnection::parseByte(const QStringRef& s, bool *ok) const uint8_t BoblightClientConnection::parseByte(const QStringRef& s, bool* ok) const
{ {
const int LO = 0; const int LO = 0;
const int HI = 255; const int HI = 255;
@ -389,7 +398,7 @@ void BoblightClientConnection::sendLightMessage()
for (int i = 0; i < _hyperion->getLedCount(); ++i) for (int i = 0; i < _hyperion->getLedCount(); ++i)
{ {
_imageProcessor->getScanParameters(i, h0, h1, v0, v1); _imageProcessor->getScanParameters(i, h0, h1, v0, v1);
n = snprintf(buffer, sizeof(buffer), "light %03d scan %f %f %f %f\n", i, 100*v0, 100*v1, 100*h0, 100*h1); n = snprintf(buffer, sizeof(buffer), "light %03d scan %f %f %f %f\n", i, 100 * v0, 100 * v1, 100 * h0, 100 * h1);
sendMessage(QByteArray(buffer, n)); sendMessage(QByteArray(buffer, n));
} }
} }

View File

@ -176,13 +176,8 @@ bool FramebufferFrameGrabber::getScreenInfo()
break; break;
case 24: _pixelFormat = PixelFormat::BGR24; case 24: _pixelFormat = PixelFormat::BGR24;
break; break;
#ifdef ENABLE_AMLOGIC
case 32: _pixelFormat = PixelFormat::PIXELFORMAT_RGB32;
break;
#else
case 32: _pixelFormat = PixelFormat::BGR32; case 32: _pixelFormat = PixelFormat::BGR32;
break; break;
#endif
default: default:
rc= false; rc= false;
QString errorReason = QString ("Unknown pixel format: %1 bits per pixel").arg(static_cast<int>(_varInfo.bits_per_pixel)); QString errorReason = QString ("Unknown pixel format: %1 bits per pixel").arg(static_cast<int>(_varInfo.bits_per_pixel));

View File

@ -22,12 +22,15 @@ target_link_libraries(hyperion
flatbufserver flatbufserver
flatbuffers flatbuffers
leddevice leddevice
boblightserver
effectengine effectengine
database database
${QT_LIBRARIES} ${QT_LIBRARIES}
) )
if(ENABLE_BOBLIGHT)
target_link_libraries(hyperion boblightserver)
endif()
if (ENABLE_AVAHI) if (ENABLE_AVAHI)
target_link_libraries(hyperion bonjour) target_link_libraries(hyperion bonjour)
endif () endif ()

View File

@ -11,7 +11,12 @@ ComponentRegister::ComponentRegister(Hyperion* hyperion)
{ {
// init all comps to false // init all comps to false
QVector<hyperion::Components> vect; QVector<hyperion::Components> vect;
vect << COMP_ALL << COMP_SMOOTHING << COMP_BLACKBORDER << COMP_FORWARDER << COMP_BOBLIGHTSERVER << COMP_GRABBER << COMP_V4L << COMP_LEDDEVICE; vect << COMP_ALL << COMP_SMOOTHING << COMP_BLACKBORDER << COMP_FORWARDER << COMP_GRABBER << COMP_V4L << COMP_LEDDEVICE;
#if defined(ENABLE_BOBLIGHT)
vect << COMP_BOBLIGHTSERVER;
#endif
for(auto e : vect) for(auto e : vect)
{ {
_componentStates.emplace(e, (e == COMP_ALL)); _componentStates.emplace(e, (e == COMP_ALL));

View File

@ -37,7 +37,9 @@
#include <hyperion/CaptureCont.h> #include <hyperion/CaptureCont.h>
// Boblight // Boblight
#if defined(ENABLE_BOBLIGHT)
#include <boblightserver/BoblightServer.h> #include <boblightserver/BoblightServer.h>
#endif
Hyperion::Hyperion(quint8 instance, bool readonlyMode) Hyperion::Hyperion(quint8 instance, bool readonlyMode)
: QObject() : QObject()
@ -58,7 +60,9 @@ Hyperion::Hyperion(quint8 instance, bool readonlyMode)
, _BGEffectHandler(nullptr) , _BGEffectHandler(nullptr)
, _captureCont(nullptr) , _captureCont(nullptr)
, _ledBuffer(_ledString.leds().size(), ColorRgb::BLACK) , _ledBuffer(_ledString.leds().size(), ColorRgb::BLACK)
#if defined(ENABLE_BOBLIGHT)
, _boblightServer(nullptr) , _boblightServer(nullptr)
#endif
, _readOnlyMode(readonlyMode) , _readOnlyMode(readonlyMode)
{ {
@ -148,9 +152,11 @@ void Hyperion::start()
// if there is no startup / background effect and no sending capture interface we probably want to push once BLACK (as PrioMuxer won't emit a priority change) // if there is no startup / background effect and no sending capture interface we probably want to push once BLACK (as PrioMuxer won't emit a priority change)
update(); update();
#if defined(ENABLE_BOBLIGHT)
// boblight, can't live in global scope as it depends on layout // boblight, can't live in global scope as it depends on layout
_boblightServer = new BoblightServer(this, getSetting(settings::BOBLSERVER)); _boblightServer = new BoblightServer(this, getSetting(settings::BOBLSERVER));
connect(this, &Hyperion::settingsChanged, _boblightServer, &BoblightServer::handleSettingsUpdate); connect(this, &Hyperion::settingsChanged, _boblightServer, &BoblightServer::handleSettingsUpdate);
#endif
// instance initiated, enter thread event loop // instance initiated, enter thread event loop
emit started(); emit started();
@ -168,7 +174,9 @@ void Hyperion::freeObjects()
clear(-1,true); clear(-1,true);
// delete components on exit of hyperion core // delete components on exit of hyperion core
#if defined(ENABLE_BOBLIGHT)
delete _boblightServer; delete _boblightServer;
#endif
delete _captureCont; delete _captureCont;
delete _effectEngine; delete _effectEngine;
delete _raw2ledAdjustment; delete _raw2ledAdjustment;

View File

@ -23,8 +23,8 @@
{ {
"type" : "integer", "type" : "integer",
"title" : "edt_conf_general_priority_title", "title" : "edt_conf_general_priority_title",
"minimum" : 100, "minimum" : 2,
"maximum" : 254, "maximum" : 253,
"default" : 128, "default" : 128,
"propertyOrder" : 3 "propertyOrder" : 3
} }

View File

@ -108,7 +108,7 @@ public:
/// ///
/// Enable/Disable components during runtime /// Enable/Disable components during runtime
/// ///
/// @param component The component [SMOOTHING, BLACKBORDER, FORWARDER, BOBLIGHT_SERVER, GRABBER] /// @param component The component [SMOOTHING, BLACKBORDER, FORWARDER, BOBLIGHTSERVER, GRABBER]
/// @param state The state of the component [true | false] /// @param state The state of the component [true | false]
/// ///
void setComponentState(const QString & component, bool state); void setComponentState(const QString & component, bool state);

View File

@ -103,8 +103,8 @@ int main(int argc, char * argv[])
BooleanOption & argSysInfo = parser.add<BooleanOption>('s', "sysinfo" , "show system info"); BooleanOption & argSysInfo = parser.add<BooleanOption>('s', "sysinfo" , "show system info");
BooleanOption & argClear = parser.add<BooleanOption>('x', "clear" , "Clear data for the priority channel provided by the -p option"); BooleanOption & argClear = parser.add<BooleanOption>('x', "clear" , "Clear data for the priority channel provided by the -p option");
BooleanOption & argClearAll = parser.add<BooleanOption>(0x0, "clearall" , "Clear data for all active priority channels"); BooleanOption & argClearAll = parser.add<BooleanOption>(0x0, "clearall" , "Clear data for all active priority channels");
Option & argEnableComponent = parser.add<Option> ('E', "enable" , "Enable the Component with the given name. Available Components are [SMOOTHING, BLACKBORDER, FORWARDER, BOBLIGHT_SERVER, GRABBER, V4L, LEDDEVICE]"); Option & argEnableComponent = parser.add<Option> ('E', "enable" , "Enable the Component with the given name. Available Components are [SMOOTHING, BLACKBORDER, FORWARDER, BOBLIGHTSERVER, GRABBER, V4L, LEDDEVICE]");
Option & argDisableComponent = parser.add<Option> ('D', "disable" , "Disable the Component with the given name. Available Components are [SMOOTHING, BLACKBORDER, FORWARDER, BOBLIGHT_SERVER, GRABBER, V4L, LEDDEVICE]"); Option & argDisableComponent = parser.add<Option> ('D', "disable" , "Disable the Component with the given name. Available Components are [SMOOTHING, BLACKBORDER, FORWARDER, BOBLIGHTSERVER, GRABBER, V4L, LEDDEVICE]");
Option & argId = parser.add<Option> ('q', "qualifier" , "Identifier(qualifier) of the adjustment to set"); Option & argId = parser.add<Option> ('q', "qualifier" , "Identifier(qualifier) of the adjustment to set");
IntOption & argBrightness = parser.add<IntOption> ('L', "brightness" , "Set the brightness gain of the LEDs"); IntOption & argBrightness = parser.add<IntOption> ('L', "brightness" , "Set the brightness gain of the LEDs");
IntOption & argBrightnessC = parser.add<IntOption> (0x0, "brightnessCompensation" , "Set the brightness compensation"); IntOption & argBrightnessC = parser.add<IntOption> (0x0, "brightnessCompensation" , "Set the brightness compensation");