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 ( 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}")

View File

@ -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

View File

@ -1,6 +1,8 @@
$(document).ready(function () {
performTranslation();
var BOBLIGHT_ENABLED = window.comps.find(element => element.name == "BOBLIGHTSERVER");
var conf_editor_net = null;
var conf_editor_json = null;
var conf_editor_proto = null;
@ -8,8 +10,7 @@ $(document).ready( function() {
var conf_editor_bobl = null;
var conf_editor_forw = null;
if(window.showOptHelp)
{
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'));
@ -31,20 +32,20 @@ $(document).ready( function() {
$('#conf_cont_proto').append(createHelpTable(window.schema.protoServer.properties, $.i18n("edt_conf_pbs_heading_title"), "protoServerHelpPanelId"));
//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"));
}
//forwarder
if(storedAccess != 'default')
{
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
{
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'));
@ -125,6 +126,7 @@ $(document).ready( function() {
});
//boblight
if (BOBLIGHT_ENABLED) {
conf_editor_bobl = createJsonEditor('editor_container_boblightserver', {
boblightServer: window.schema.boblightServer
}, true, true);
@ -144,9 +146,9 @@ $(document).ready( function() {
$('#btn_submit_boblightserver').off().on('click', function () {
requestWriteConfig(conf_editor_bobl.getValue());
});
}
if(storedAccess != 'default')
{
if (storedAccess != 'default') {
//forwarder
conf_editor_forw = createJsonEditor('editor_container_forwarder', {
forwarder: window.schema.forwarder
@ -170,23 +172,22 @@ $(document).ready( function() {
}
//create introduction
if(window.showOptHelp)
{
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()
{
function buildTokenList() {
$('.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>';
$('.tktbody').append(createTableRow([tokenList[key].comment, lastUse, btn], false, true));
@ -198,8 +199,7 @@ $(document).ready( function() {
$('.tkthead').html(createTableRow([$.i18n('conf_network_tok_cidhead'), $.i18n('conf_network_tok_lastuse'), $.i18n('general_btn_delete')], true, true));
buildTokenList();
function handleDeleteToken(e)
{
function handleDeleteToken(e) {
var key = e.currentTarget.id.replace("tok", "");
requestTokenDelete(key);
$('#tok' + key).parent().parent().remove();
@ -231,8 +231,7 @@ $(document).ready( function() {
//Reorder hardcoded token div after the general token setting div
$("#conf_cont_tok").insertAfter("#conf_cont_net");
function checkApiTokenState(state)
{
function checkApiTokenState(state) {
if (state == false)
$("#conf_cont_tok").attr('style', 'display:none')
else
@ -248,3 +247,4 @@ $(document).ready( function() {
removeOverlay();
});

View File

@ -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;
};

View File

@ -1,6 +1,8 @@
#pragma once
#include <QString>
#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;

View File

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

View File

@ -21,10 +21,18 @@
#include "HyperionConfig.h"
#include <hyperion/Hyperion.h>
#include <utils/QStringUtils.h>
#include <hyperion/PriorityMuxer.h>
// project includes
#include "BoblightClientConnection.h"
// 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)
@ -48,7 +56,7 @@ BoblightClientConnection::BoblightClientConnection(Hyperion* hyperion, QTcpSocke
BoblightClientConnection::~BoblightClientConnection()
{
// 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);
delete _socket;
@ -110,7 +118,7 @@ QString BoblightClientConnection::readMessage(const char *data, const size_t siz
void BoblightClientConnection::socketClosed()
{
// clear the current channel
if (_priority >= 128 && _priority < 254)
if (_priority >= BOBLIGHT_MIN_PRIORITY && _priority <= BOBLIGHT_MAX_PRIORITY)
_hyperion->clear(_priority);
emit connectionClosed(this);
@ -171,7 +179,7 @@ void BoblightClientConnection::handleMessage(const QString & message)
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
@ -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;

View File

@ -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<int>(_varInfo.bits_per_pixel));

View File

@ -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 ()

View File

@ -11,7 +11,12 @@ ComponentRegister::ComponentRegister(Hyperion* hyperion)
{
// init all comps to false
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)
{
_componentStates.emplace(e, (e == COMP_ALL));

View File

@ -37,7 +37,9 @@
#include <hyperion/CaptureCont.h>
// Boblight
#if defined(ENABLE_BOBLIGHT)
#include <boblightserver/BoblightServer.h>
#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;

View File

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

View File

@ -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);

View File

@ -103,8 +103,8 @@ int main(int argc, char * argv[])
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 & 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 & 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 & 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, BOBLIGHTSERVER, GRABBER, V4L, LEDDEVICE]");
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 & argBrightnessC = parser.add<IntOption> (0x0, "brightnessCompensation" , "Set the brightness compensation");