diff --git a/CMakeLists.txt b/CMakeLists.txt index f4a733cd..7241f354 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,11 +42,15 @@ endif() # Set build variables SET ( DEFAULT_AMLOGIC OFF ) +SET ( DEFAULT_BOBLIGHT ON ) SET ( DEFAULT_DISPMANX OFF ) +SET ( DEFAULT_DX OFF ) +SET ( DEFAULT_MF OFF ) SET ( DEFAULT_OSX OFF ) SET ( DEFAULT_QT ON ) SET ( DEFAULT_X11 OFF ) SET ( DEFAULT_XCB OFF ) +SET ( DEFAULT_V4L2 OFF ) SET ( DEFAULT_WS281XPWM OFF ) SET ( DEFAULT_AVAHI 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_TESTS OFF ) SET ( DEFAULT_EXPERIMENTAL OFF ) -SET ( DEFAULT_MF OFF ) +SET ( DEFAULT_CEC OFF ) SET ( DEFAULT_DEPLOY_DEPENDENCIES ON ) IF ( ${CMAKE_SYSTEM} MATCHES "Linux" ) @@ -159,6 +163,10 @@ STRING( REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}" ) ADD_DEFINITIONS( ${PLATFORM_DEFINE} ) # 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} ) message(STATUS "ENABLE_AMLOGIC = ${ENABLE_AMLOGIC}") diff --git a/HyperionConfig.h.in b/HyperionConfig.h.in index 4933ad00..1f4c0ccd 100644 --- a/HyperionConfig.h.in +++ b/HyperionConfig.h.in @@ -45,6 +45,9 @@ // Define to enable CEC #cmakedefine ENABLE_CEC +// Define to enable boblight server +#cmakedefine ENABLE_BOBLIGHT + // Define to enable the USB / HID devices #cmakedefine ENABLE_USB_HID diff --git a/assets/webconfig/js/content_network.js b/assets/webconfig/js/content_network.js index 8397a01c..fb96119a 100644 --- a/assets/webconfig/js/content_network.js +++ b/assets/webconfig/js/content_network.js @@ -1,91 +1,92 @@ -$(document).ready( function() { - performTranslation(); +$(document).ready(function () { + performTranslation(); - var conf_editor_net = null; - 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; + var BOBLIGHT_ENABLED = window.comps.find(element => element.name == "BOBLIGHTSERVER"); - if(window.showOptHelp) - { - //network - $('#conf_cont').append(createRow('conf_cont_net')) - $('#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"))); + var conf_editor_net = null; + 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; - //jsonserver - $('#conf_cont').append(createRow('conf_cont_json')) - $('#conf_cont_json').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_js_heading_title"), 'editor_container_jsonserver', 'btn_submit_jsonserver', 'panel-system')); - $('#conf_cont_json').append(createHelpTable(window.schema.jsonServer.properties, $.i18n("edt_conf_js_heading_title"))); + if (window.showOptHelp) { + //network + $('#conf_cont').append(createRow('conf_cont_net')) + $('#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 - $('#conf_cont').append(createRow('conf_cont_flatbuf')) - $('#conf_cont_flatbuf').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_fbs_heading_title"), 'editor_container_fbserver', 'btn_submit_fbserver', 'panel-system')); - $('#conf_cont_flatbuf').append(createHelpTable(window.schema.flatbufServer.properties, $.i18n("edt_conf_fbs_heading_title"),"flatbufServerHelpPanelId")); + //jsonserver + $('#conf_cont').append(createRow('conf_cont_json')) + $('#conf_cont_json').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_js_heading_title"), 'editor_container_jsonserver', 'btn_submit_jsonserver', 'panel-system')); + $('#conf_cont_json').append(createHelpTable(window.schema.jsonServer.properties, $.i18n("edt_conf_js_heading_title"))); - //protoserver - $('#conf_cont').append(createRow('conf_cont_proto')) - $('#conf_cont_proto').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_pbs_heading_title"), 'editor_container_protoserver', 'btn_submit_protoserver', 'panel-system')); - $('#conf_cont_proto').append(createHelpTable(window.schema.protoServer.properties, $.i18n("edt_conf_pbs_heading_title"),"protoServerHelpPanelId")); + //flatbufserver + $('#conf_cont').append(createRow('conf_cont_flatbuf')) + $('#conf_cont_flatbuf').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_fbs_heading_title"), 'editor_container_fbserver', 'btn_submit_fbserver', 'panel-system')); + $('#conf_cont_flatbuf').append(createHelpTable(window.schema.flatbufServer.properties, $.i18n("edt_conf_fbs_heading_title"), "flatbufServerHelpPanelId")); - //boblight - $('#conf_cont').append(createRow('conf_cont_bobl')) - $('#conf_cont_bobl').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_bobls_heading_title"), 'editor_container_boblightserver', 'btn_submit_boblightserver', 'panel-system')); - $('#conf_cont_bobl').append(createHelpTable(window.schema.boblightServer.properties, $.i18n("edt_conf_bobls_heading_title"), "boblightServerHelpPanelId")); + //protoserver + $('#conf_cont').append(createRow('conf_cont_proto')) + $('#conf_cont_proto').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_pbs_heading_title"), 'editor_container_protoserver', 'btn_submit_protoserver', 'panel-system')); + $('#conf_cont_proto').append(createHelpTable(window.schema.protoServer.properties, $.i18n("edt_conf_pbs_heading_title"), "protoServerHelpPanelId")); - //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')); + //boblight + if (BOBLIGHT_ENABLED) { + $('#conf_cont').append(createRow('conf_cont_bobl')) + $('#conf_cont_bobl').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_bobls_heading_title"), 'editor_container_boblightserver', 'btn_submit_boblightserver', 'panel-system')); + $('#conf_cont_bobl').append(createHelpTable(window.schema.boblightServer.properties, $.i18n("edt_conf_bobls_heading_title"), "boblightServerHelpPanelId")); + } - $("#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_editor_net = createJsonEditor('editor_container_net', { - network : window.schema.network - }, true, true); + $("#conf_cont_tok").removeClass('row'); + } - conf_editor_net.on('change',function() { - conf_editor_net.validate().length || window.readOnlyMode ? $('#btn_submit_net').attr('disabled', true) : $('#btn_submit_net').attr('disabled', false); - }); + // net + conf_editor_net = createJsonEditor('editor_container_net', { + network: window.schema.network + }, true, true); - $('#btn_submit_net').off().on('click',function() { - requestWriteConfig(conf_editor_net.getValue()); - }); + conf_editor_net.on('change', function () { + conf_editor_net.validate().length || window.readOnlyMode ? $('#btn_submit_net').attr('disabled', true) : $('#btn_submit_net').attr('disabled', false); + }); - //json - conf_editor_json = createJsonEditor('editor_container_jsonserver', { - jsonServer : window.schema.jsonServer - }, true, true); + $('#btn_submit_net').off().on('click', function () { + requestWriteConfig(conf_editor_net.getValue()); + }); - conf_editor_json.on('change',function() { - conf_editor_json.validate().length || window.readOnlyMode ? $('#btn_submit_jsonserver').attr('disabled', true) : $('#btn_submit_jsonserver').attr('disabled', false); - }); + //json + conf_editor_json = createJsonEditor('editor_container_jsonserver', { + jsonServer: window.schema.jsonServer + }, true, true); - $('#btn_submit_jsonserver').off().on('click',function() { - requestWriteConfig(conf_editor_json.getValue()); - }); + conf_editor_json.on('change', function () { + conf_editor_json.validate().length || window.readOnlyMode ? $('#btn_submit_jsonserver').attr('disabled', true) : $('#btn_submit_jsonserver').attr('disabled', false); + }); - //flatbuffer - conf_editor_fbs = createJsonEditor('editor_container_fbserver', { - flatbufServer : window.schema.flatbufServer - }, true, true); + $('#btn_submit_jsonserver').off().on('click', function () { + requestWriteConfig(conf_editor_json.getValue()); + }); + + //flatbuffer + conf_editor_fbs = createJsonEditor('editor_container_fbserver', { + flatbufServer: window.schema.flatbufServer + }, true, true); conf_editor_fbs.on('change', function () { var flatbufServerEnable = conf_editor_fbs.getEditor("root.flatbufServer.enable").getValue(); @@ -96,17 +97,17 @@ $(document).ready( function() { showInputOptionsForKey(conf_editor_fbs, "flatbufServer", "enable", false); $('#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() { - requestWriteConfig(conf_editor_fbs.getValue()); - }); + $('#btn_submit_fbserver').off().on('click', function () { + requestWriteConfig(conf_editor_fbs.getValue()); + }); - //protobuffer - conf_editor_proto = createJsonEditor('editor_container_protoserver', { - protoServer : window.schema.protoServer - }, true, true); + //protobuffer + conf_editor_proto = createJsonEditor('editor_container_protoserver', { + protoServer: window.schema.protoServer + }, true, true); conf_editor_proto.on('change', function () { var protoServerEnable = conf_editor_proto.getEditor("root.protoServer.enable").getValue(); @@ -117,40 +118,41 @@ $(document).ready( function() { showInputOptionsForKey(conf_editor_proto, "protoServer", "enable", false); $('#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() { - requestWriteConfig(conf_editor_proto.getValue()); - }); + $('#btn_submit_protoserver').off().on('click', function () { + requestWriteConfig(conf_editor_proto.getValue()); + }); - //boblight - conf_editor_bobl = createJsonEditor('editor_container_boblightserver', { - boblightServer : window.schema.boblightServer - }, true, true); + //boblight + if (BOBLIGHT_ENABLED) { + conf_editor_bobl = createJsonEditor('editor_container_boblightserver', { + boblightServer: window.schema.boblightServer + }, true, true); - conf_editor_bobl.on('change', function () { - var boblightServerEnable = conf_editor_bobl.getEditor("root.boblightServer.enable").getValue(); - if (boblightServerEnable) { - showInputOptionsForKey(conf_editor_bobl, "boblightServer", "enable", true); - $('#boblightServerHelpPanelId').show(); - } else { - showInputOptionsForKey(conf_editor_bobl, "boblightServer", "enable", false); - $('#boblightServerHelpPanelId').hide(); - } - conf_editor_bobl.validate().length || window.readOnlyMode ? $('#btn_submit_boblightserver').attr('disabled', true) : $('#btn_submit_boblightserver').attr('disabled', false); - }); + conf_editor_bobl.on('change', function () { + var boblightServerEnable = conf_editor_bobl.getEditor("root.boblightServer.enable").getValue(); + if (boblightServerEnable) { + showInputOptionsForKey(conf_editor_bobl, "boblightServer", "enable", true); + $('#boblightServerHelpPanelId').show(); + } else { + showInputOptionsForKey(conf_editor_bobl, "boblightServer", "enable", false); + $('#boblightServerHelpPanelId').hide(); + } + 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 () { - requestWriteConfig(conf_editor_bobl.getValue()); - }); + $('#btn_submit_boblightserver').off().on('click', function () { + requestWriteConfig(conf_editor_bobl.getValue()); + }); + } - if(storedAccess != 'default') - { - //forwarder - conf_editor_forw = createJsonEditor('editor_container_forwarder', { - forwarder : window.schema.forwarder - }, true, true); + if (storedAccess != 'default') { + //forwarder + conf_editor_forw = createJsonEditor('editor_container_forwarder', { + forwarder: window.schema.forwarder + }, true, true); conf_editor_forw.on('change', function () { var forwarderEnable = conf_editor_forw.getEditor("root.forwarder.enable").getValue(); @@ -161,90 +163,88 @@ $(document).ready( function() { showInputOptionsForKey(conf_editor_forw, "forwarder", "enable", false); $('#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() { - requestWriteConfig(conf_editor_forw.getValue()); - }); - } + $('#btn_submit_forwarder').off().on('click', function () { + requestWriteConfig(conf_editor_forw.getValue()); + }); + } - //create introduction - if(window.showOptHelp) - { - 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_fbs_intro'), "editor_container_fbserver"); - createHint("intro", $.i18n('conf_network_proto_intro'), "editor_container_protoserver"); - 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"); - } + //create introduction + if (window.showOptHelp) { + 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_fbs_intro'), "editor_container_fbserver"); + 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_forw_intro'), "editor_container_forwarder"); + createHint("intro", $.i18n('conf_network_tok_intro'), "tok_desc_cont"); + } - // Token handling - function buildTokenList() - { - $('.tktbody').html(""); - for(var key in tokenList) - { - var lastUse = (tokenList[key].last_use) ? tokenList[key].last_use : "-"; - var btn = ''; - $('.tktbody').append(createTableRow([tokenList[key].comment, lastUse, btn], false, true)); - $('#tok'+tokenList[key].id).off().on('click', handleDeleteToken); - } - } + // Token handling + function buildTokenList() { + $('.tktbody').html(""); + for (var key in tokenList) { + var lastUse = (tokenList[key].last_use) ? tokenList[key].last_use : "-"; + var btn = ''; + $('.tktbody').append(createTableRow([tokenList[key].comment, lastUse, btn], false, true)); + $('#tok' + tokenList[key].id).off().on('click', handleDeleteToken); + } + } - createTable('tkthead', 'tktbody', 'tktable'); - $('.tkthead').html(createTableRow([$.i18n('conf_network_tok_cidhead'), $.i18n('conf_network_tok_lastuse'), $.i18n('general_btn_delete')], true, true)); - buildTokenList(); + createTable('tkthead', 'tktbody', 'tktable'); + $('.tkthead').html(createTableRow([$.i18n('conf_network_tok_cidhead'), $.i18n('conf_network_tok_lastuse'), $.i18n('general_btn_delete')], true, true)); + buildTokenList(); - function handleDeleteToken(e) - { - var key = e.currentTarget.id.replace("tok",""); - requestTokenDelete(key); - $('#tok'+key).parent().parent().remove(); - // rm deleted token id - tokenList = tokenList.filter(function( obj ) { - return obj.id !== key; - }); - } + function handleDeleteToken(e) { + var key = e.currentTarget.id.replace("tok", ""); + requestTokenDelete(key); + $('#tok' + key).parent().parent().remove(); + // rm deleted token id + tokenList = tokenList.filter(function (obj) { + return obj.id !== key; + }); + } - $('#btn_create_tok').off().on('click',function() { + $('#btn_create_tok').off().on('click', function () { requestToken(encodeHTML($('#tok_comment').val())) - $('#tok_comment').val("") - $('#btn_create_tok').attr('disabled', true) - }); - $('#tok_comment').off().on('input',function(e) { - (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) - $('#tok_chars_needed').html(10-e.currentTarget.value.length + " " + $.i18n('general_chars_needed')) - else - $('#tok_chars_needed').html("
") - }); - $(window.hyperion).off("cmd-authorize-createToken").on("cmd-authorize-createToken", function(event) { - var val = event.response.info; - showInfoDialog("newToken",$.i18n('conf_network_tok_diaTitle'),$.i18n('conf_network_tok_diaMsg')+'
'+val.token+'
') - tokenList.push(val) - buildTokenList() - }); + $('#tok_comment').val("") + $('#btn_create_tok').attr('disabled', true) + }); + $('#tok_comment').off().on('input', function (e) { + (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) + $('#tok_chars_needed').html(10 - e.currentTarget.value.length + " " + $.i18n('general_chars_needed')) + else + $('#tok_chars_needed').html("
") + }); + $(window.hyperion).off("cmd-authorize-createToken").on("cmd-authorize-createToken", function (event) { + var val = event.response.info; + showInfoDialog("newToken", $.i18n('conf_network_tok_diaTitle'), $.i18n('conf_network_tok_diaMsg') + '
' + val.token + '
') + tokenList.push(val) + buildTokenList() + }); - //Reorder hardcoded token div after the general token setting div - $("#conf_cont_tok").insertAfter("#conf_cont_net"); + //Reorder hardcoded token div after the general token setting div + $("#conf_cont_tok").insertAfter("#conf_cont_net"); - function checkApiTokenState(state) - { - if(state == false) - $("#conf_cont_tok").attr('style', 'display:none') - else - $("#conf_cont_tok").removeAttr('style') - } + function checkApiTokenState(state) { + if (state == false) + $("#conf_cont_tok").attr('style', 'display:none') + else + $("#conf_cont_tok").removeAttr('style') + } - $('#root_network_apiAuth').change(function () { - var state = $(this).is(":checked"); - checkApiTokenState(state); - }) + $('#root_network_apiAuth').change(function () { + var state = $(this).is(":checked"); + checkApiTokenState(state); + }) - checkApiTokenState(window.serverConfig.network.apiAuth); + checkApiTokenState(window.serverConfig.network.apiAuth); - removeOverlay(); + removeOverlay(); }); + diff --git a/include/hyperion/Hyperion.h b/include/hyperion/Hyperion.h index 07f2d750..93730e1f 100644 --- a/include/hyperion/Hyperion.h +++ b/include/hyperion/Hyperion.h @@ -46,7 +46,9 @@ class ColorAdjustment; class SettingsManager; class BGEffectHandler; class CaptureCont; +#if defined(ENABLE_BOBLIGHT) class BoblightServer; +#endif class LedDeviceWrapper; class Logger; @@ -545,8 +547,10 @@ private: VideoMode _currVideoMode = VideoMode::VIDEO_2D; +#if defined(ENABLE_BOBLIGHT) /// Boblight instance BoblightServer* _boblightServer; +#endif bool _readOnlyMode; }; diff --git a/include/utils/Components.h b/include/utils/Components.h index 9910d7e8..8e95c388 100644 --- a/include/utils/Components.h +++ b/include/utils/Components.h @@ -1,6 +1,8 @@ #pragma once #include +#include "HyperionConfig.h" + namespace hyperion { @@ -14,7 +16,9 @@ enum Components COMP_SMOOTHING, COMP_BLACKBORDER, COMP_FORWARDER, +#if defined(ENABLE_BOBLIGHT) COMP_BOBLIGHTSERVER, +#endif COMP_GRABBER, COMP_V4L, COMP_COLOR, @@ -33,7 +37,9 @@ inline const char* componentToString(Components c) case COMP_SMOOTHING: return "Smoothing"; case COMP_BLACKBORDER: return "Blackborder detector"; case COMP_FORWARDER: return "Json/Proto forwarder"; +#if defined(ENABLE_BOBLIGHT) case COMP_BOBLIGHTSERVER:return "Boblight server"; +#endif case COMP_GRABBER: return "Framegrabber"; case COMP_V4L: return "V4L capture device"; case COMP_COLOR: return "Solid color"; @@ -54,7 +60,9 @@ inline const char* componentToIdString(Components c) case COMP_SMOOTHING: return "SMOOTHING"; case COMP_BLACKBORDER: return "BLACKBORDER"; case COMP_FORWARDER: return "FORWARDER"; +#if defined(ENABLE_BOBLIGHT) case COMP_BOBLIGHTSERVER:return "BOBLIGHTSERVER"; +#endif case COMP_GRABBER: return "GRABBER"; case COMP_V4L: return "V4L"; case COMP_COLOR: return "COLOR"; @@ -74,7 +82,9 @@ inline Components stringToComponent(const QString& component) if (cmp == "SMOOTHING") return COMP_SMOOTHING; if (cmp == "BLACKBORDER") return COMP_BLACKBORDER; if (cmp == "FORWARDER") return COMP_FORWARDER; +#if defined(ENABLE_BOBLIGHT) if (cmp == "BOBLIGHTSERVER")return COMP_BOBLIGHTSERVER; +#endif if (cmp == "GRABBER") return COMP_GRABBER; if (cmp == "V4L") return COMP_V4L; if (cmp == "COLOR") return COMP_COLOR; diff --git a/libsrc/CMakeLists.txt b/libsrc/CMakeLists.txt index 523b8f76..58438e33 100644 --- a/libsrc/CMakeLists.txt +++ b/libsrc/CMakeLists.txt @@ -10,7 +10,9 @@ add_subdirectory(jsonserver) add_subdirectory(flatbufserver) add_subdirectory(protoserver) add_subdirectory(ssdp) -add_subdirectory(boblightserver) +if(ENABLE_BOBLIGHT) + add_subdirectory(boblightserver) +endif() add_subdirectory(leddevice) add_subdirectory(utils) add_subdirectory(effectengine) diff --git a/libsrc/boblightserver/BoblightClientConnection.cpp b/libsrc/boblightserver/BoblightClientConnection.cpp index 833ba94f..b6fd89ac 100644 --- a/libsrc/boblightserver/BoblightClientConnection.cpp +++ b/libsrc/boblightserver/BoblightClientConnection.cpp @@ -21,11 +21,19 @@ #include "HyperionConfig.h" #include #include +#include // project includes #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() , _locale(QLocale::C) , _socket(socket) @@ -47,8 +55,8 @@ BoblightClientConnection::BoblightClientConnection(Hyperion* hyperion, QTcpSocke BoblightClientConnection::~BoblightClientConnection() { - // clear the current channel - if (_priority != 0 && _priority >= 128 && _priority < 254) + // clear the current channel + if (_priority != 0 && _priority >= BOBLIGHT_MIN_PRIORITY && _priority <= BOBLIGHT_MAX_PRIORITY) _hyperion->clear(_priority); delete _socket; @@ -59,7 +67,7 @@ void BoblightClientConnection::readData() _receiveBuffer.append(_socket->readAll()); int bytes = _receiveBuffer.indexOf('\n') + 1; - while(bytes > 0) + while (bytes > 0) { // create message string (strip the newline) const QString message = readMessage(_receiveBuffer.data(), bytes); @@ -71,7 +79,7 @@ void BoblightClientConnection::readData() _receiveBuffer.remove(0, bytes); // 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)"); _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 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) 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; @@ -109,15 +117,15 @@ QString BoblightClientConnection::readMessage(const char *data, const size_t siz void BoblightClientConnection::socketClosed() { - // clear the current channel - if (_priority >= 128 && _priority < 254) + // clear the current channel + if (_priority >= BOBLIGHT_MIN_PRIORITY && _priority <= BOBLIGHT_MAX_PRIORITY) _hyperion->clear(_priority); emit connectionClosed(this); } -void BoblightClientConnection::handleMessage(const QString & message) +void BoblightClientConnection::handleMessage(const QString& message) { //std::cout << "boblight message: " << message.toStdString() << std::endl; const QVector messageParts = QStringUtils::splitRef(message, ' ', QStringUtils::SplitBehavior::SkipEmptyParts); @@ -166,16 +174,16 @@ void BoblightClientConnection::handleMessage(const QString & message) if (rc1 && rc2 && rc3) { - ColorRgb & rgb = _ledColors[ledIndex]; + ColorRgb& rgb = _ledColors[ledIndex]; rgb.red = red; rgb.green = green; rgb.blue = blue; - if (_priority == 0 || _priority < 128 || _priority >= 254) + if (_priority == 0 || _priority < BOBLIGHT_MIN_PRIORITY || _priority > BOBLIGHT_MAX_PRIORITY) return; // 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); } @@ -183,10 +191,10 @@ void BoblightClientConnection::handleMessage(const QString & message) return; } } - else if(messageParts[3] == "speed" || - messageParts[3] == "interpolation" || - messageParts[3] == "use" || - messageParts[3] == "singlechange") + else if (messageParts[3] == "speed" || + messageParts[3] == "interpolation" || + messageParts[3] == "use" || + messageParts[3] == "singlechange") { // these message are ignored by Hyperion return; @@ -202,16 +210,17 @@ void BoblightClientConnection::handleMessage(const QString & message) if (_priority != 0 && _hyperion->getPriorityInfo(_priority).componentId == hyperion::COMP_BOBLIGHTSERVER) _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)) { _priority += 1; } // 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) _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") { - if ( _priority >= 128 && _priority < 254) + if (_priority >= BOBLIGHT_MIN_PRIORITY && _priority <= BOBLIGHT_MAX_PRIORITY) _hyperion->setInput(_priority, _ledColors); // send current color values to hyperion return; @@ -248,9 +257,9 @@ const float ipows[] = { 1.0f / 100000.0f, 1.0f / 1000000.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 const char MIN_DIGIT = '0'; @@ -331,7 +340,7 @@ float BoblightClientConnection::parseFloat(const QStringRef& s, bool *ok) const return f; } -unsigned BoblightClientConnection::parseUInt(const QStringRef& s, bool *ok) const +unsigned BoblightClientConnection::parseUInt(const QStringRef& s, bool* ok) const { // We parse radix 10 const char MIN_DIGIT = '0'; @@ -363,7 +372,7 @@ unsigned BoblightClientConnection::parseUInt(const QStringRef& s, bool *ok) cons 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 HI = 255; @@ -389,7 +398,7 @@ void BoblightClientConnection::sendLightMessage() for (int i = 0; i < _hyperion->getLedCount(); ++i) { _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)); } } diff --git a/libsrc/grabber/framebuffer/FramebufferFrameGrabber.cpp b/libsrc/grabber/framebuffer/FramebufferFrameGrabber.cpp index f9c32c92..882f9fc9 100644 --- a/libsrc/grabber/framebuffer/FramebufferFrameGrabber.cpp +++ b/libsrc/grabber/framebuffer/FramebufferFrameGrabber.cpp @@ -176,13 +176,8 @@ bool FramebufferFrameGrabber::getScreenInfo() break; case 24: _pixelFormat = PixelFormat::BGR24; break; -#ifdef ENABLE_AMLOGIC - case 32: _pixelFormat = PixelFormat::PIXELFORMAT_RGB32; - break; -#else case 32: _pixelFormat = PixelFormat::BGR32; break; -#endif default: rc= false; QString errorReason = QString ("Unknown pixel format: %1 bits per pixel").arg(static_cast(_varInfo.bits_per_pixel)); diff --git a/libsrc/hyperion/CMakeLists.txt b/libsrc/hyperion/CMakeLists.txt index 244ed7d7..1430c0c0 100644 --- a/libsrc/hyperion/CMakeLists.txt +++ b/libsrc/hyperion/CMakeLists.txt @@ -22,12 +22,15 @@ target_link_libraries(hyperion flatbufserver flatbuffers leddevice - boblightserver effectengine database ${QT_LIBRARIES} ) +if(ENABLE_BOBLIGHT) + target_link_libraries(hyperion boblightserver) +endif() + if (ENABLE_AVAHI) target_link_libraries(hyperion bonjour) endif () diff --git a/libsrc/hyperion/ComponentRegister.cpp b/libsrc/hyperion/ComponentRegister.cpp index a57dd0bd..84cf1895 100644 --- a/libsrc/hyperion/ComponentRegister.cpp +++ b/libsrc/hyperion/ComponentRegister.cpp @@ -11,7 +11,12 @@ ComponentRegister::ComponentRegister(Hyperion* hyperion) { // init all comps to false QVector 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) { _componentStates.emplace(e, (e == COMP_ALL)); diff --git a/libsrc/hyperion/Hyperion.cpp b/libsrc/hyperion/Hyperion.cpp index 69d02e09..61ce9424 100644 --- a/libsrc/hyperion/Hyperion.cpp +++ b/libsrc/hyperion/Hyperion.cpp @@ -37,7 +37,9 @@ #include // Boblight +#if defined(ENABLE_BOBLIGHT) #include +#endif Hyperion::Hyperion(quint8 instance, bool readonlyMode) : QObject() @@ -58,7 +60,9 @@ Hyperion::Hyperion(quint8 instance, bool readonlyMode) , _BGEffectHandler(nullptr) , _captureCont(nullptr) , _ledBuffer(_ledString.leds().size(), ColorRgb::BLACK) +#if defined(ENABLE_BOBLIGHT) , _boblightServer(nullptr) +#endif , _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) update(); +#if defined(ENABLE_BOBLIGHT) // boblight, can't live in global scope as it depends on layout _boblightServer = new BoblightServer(this, getSetting(settings::BOBLSERVER)); connect(this, &Hyperion::settingsChanged, _boblightServer, &BoblightServer::handleSettingsUpdate); +#endif // instance initiated, enter thread event loop emit started(); @@ -168,7 +174,9 @@ void Hyperion::freeObjects() clear(-1,true); // delete components on exit of hyperion core +#if defined(ENABLE_BOBLIGHT) delete _boblightServer; +#endif delete _captureCont; delete _effectEngine; delete _raw2ledAdjustment; diff --git a/libsrc/hyperion/schema/schema-boblightServer.json b/libsrc/hyperion/schema/schema-boblightServer.json index c5817732..22fb24c9 100644 --- a/libsrc/hyperion/schema/schema-boblightServer.json +++ b/libsrc/hyperion/schema/schema-boblightServer.json @@ -23,8 +23,8 @@ { "type" : "integer", "title" : "edt_conf_general_priority_title", - "minimum" : 100, - "maximum" : 254, + "minimum" : 2, + "maximum" : 253, "default" : 128, "propertyOrder" : 3 } diff --git a/src/hyperion-remote/JsonConnection.h b/src/hyperion-remote/JsonConnection.h index 08e6ff5d..9663d093 100644 --- a/src/hyperion-remote/JsonConnection.h +++ b/src/hyperion-remote/JsonConnection.h @@ -108,7 +108,7 @@ public: /// /// 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] /// void setComponentState(const QString & component, bool state); diff --git a/src/hyperion-remote/hyperion-remote.cpp b/src/hyperion-remote/hyperion-remote.cpp index 29be812a..60e471a3 100644 --- a/src/hyperion-remote/hyperion-remote.cpp +++ b/src/hyperion-remote/hyperion-remote.cpp @@ -103,8 +103,8 @@ int main(int argc, char * argv[]) BooleanOption & argSysInfo = parser.add('s', "sysinfo" , "show system info"); BooleanOption & argClear = parser.add('x', "clear" , "Clear data for the priority channel provided by the -p option"); BooleanOption & argClearAll = parser.add(0x0, "clearall" , "Clear data for all active priority channels"); - Option & argEnableComponent = parser.add