diff --git a/assets/webconfig/select/index.html b/assets/webconfig/select/index.html new file mode 100644 index 00000000..82924b24 --- /dev/null +++ b/assets/webconfig/select/index.html @@ -0,0 +1,98 @@ + + + + + + + + Hyperion web control + + + + + + + + + + + + + + + + +
+
+
+
+
+ + + + + + diff --git a/assets/webconfig/select/starter-template.css b/assets/webconfig/select/starter-template.css new file mode 100644 index 00000000..e83f68ad --- /dev/null +++ b/assets/webconfig/select/starter-template.css @@ -0,0 +1,8 @@ +body { + padding-top: 50px; +} +.starter-template { + padding: 40px 15px; + text-align: center; +} + diff --git a/config/hyperion.config.json.commented b/config/hyperion.config.json.commented index 52816c88..3b689754 100644 --- a/config/hyperion.config.json.commented +++ b/config/hyperion.config.json.commented @@ -268,18 +268,18 @@ }, /// Initial Effect sets a "booteffect" or "color" (foreground-effect) and optional set a "effect" or "color" during inactive grabbers and network receivers (background-effect) - /// * background-effect : 2 options: set a effect (example: "Rainbow swirl fast") or set a color (RGB) (example: [255,134,0]) + /// * background-effect : 2 options: set a effect (example: ["Rainbow swirl fast"]) or set a color (RGB) (example: [255,134,0]) /// * background-effect-args : Set optional effect arguments (Have a look at the select effect to get the possible values), define it only when needed - /// * foreground-effect : 2 options: set a effect (example: "Rainbow swirl fast") or set a color (RGB) (example: [255,134,0]) + /// * foreground-effect : 2 options: set a effect (example: ["Rainbow swirl fast"]) or set a color (RGB) (example: [255,134,0]) /// * foreground-effect-args : Set optional effect arguments (Have a look at the select effect to get the possible values), define it only when needed /// * foreground-duration_ms : The duration of the selected foreground-effect or color (0=endless) /// HINT: "foreground-effect" starts always with priority 0, so it blocks all remotes and grabbers if the loop is endless /// HINT: Set a empty value if you want to disable a component (example: "") "initialEffect" : { - "background-effect" : "Full color mood blobs", + "background-effect" : ["Full color mood blobs"], //"background-effect-args" : {}, - "foreground-effect" : "Rainbow swirl fast", + "foreground-effect" : ["Rainbow swirl fast"], //"foreground-effect-args" : {}, "foreground-duration_ms" : 3000 }, diff --git a/config/hyperion.config.json.default b/config/hyperion.config.json.default index 9e791019..23fd3638 100644 --- a/config/hyperion.config.json.default +++ b/config/hyperion.config.json.default @@ -150,8 +150,8 @@ "initialEffect" : { - "background-effect" : "Full color mood blobs", - "foreground-effect" : "Rainbow swirl fast", + "background-effect" : ["Full color mood blobs"], + "foreground-effect" : ["Rainbow swirl fast"], "foreground-duration_ms" : 3000 }, diff --git a/include/hyperion/PriorityMuxer.h b/include/hyperion/PriorityMuxer.h index 79342c5f..f5295e0c 100644 --- a/include/hyperion/PriorityMuxer.h +++ b/include/hyperion/PriorityMuxer.h @@ -34,6 +34,9 @@ public: std::vector ledColors; }; + /// The lowest possible priority, which is used when no priority channels are active + const static int LOWEST_PRIORITY = std::numeric_limits::max(); + /// /// Constructs the PriorityMuxer for the given number of leds (used to switch to black when /// there are no priority channels @@ -118,6 +121,4 @@ private: /// The information of the lowest priority channel InputInfo _lowestPriorityInfo; - /// The lowest possible priority, which is used when no priority channels are active - const static int LOWEST_PRIORITY = std::numeric_limits::max(); }; diff --git a/libsrc/hyperion/Hyperion.cpp b/libsrc/hyperion/Hyperion.cpp index df5b7936..f35bb27b 100644 --- a/libsrc/hyperion/Hyperion.cpp +++ b/libsrc/hyperion/Hyperion.cpp @@ -557,6 +557,8 @@ Hyperion::Hyperion(const Json::Value &jsonConfig, const std::string configFile) , _hwLedCount(_ledString.leds().size()) , _sourceAutoSelectEnabled(true) { + registerPriority("Off", PriorityMuxer::LOWEST_PRIORITY); + if (!_raw2ledAdjustment->verifyAdjustments()) { throw std::runtime_error("Color adjustment incorrectly set"); @@ -679,14 +681,15 @@ void Hyperion::setComponentState(const Components component, const bool state) break; case KODICHECKER: { - KODIVideoChecker* _kodiVideoChecker = KODIVideoChecker::getInstance(); - if (_kodiVideoChecker != nullptr) - state ? _kodiVideoChecker->start() : _kodiVideoChecker->stop(); + KODIVideoChecker* kodiVideoChecker = KODIVideoChecker::getInstance(); + if (kodiVideoChecker != nullptr) + state ? kodiVideoChecker->start() : kodiVideoChecker->stop(); else Debug(_log, "Can't get instance from: '%s'", componentToString(component)); break; } case FORWARDER: + //_messageForwarder break; case UDPLISTENER: break; diff --git a/libsrc/hyperion/PriorityMuxer.cpp b/libsrc/hyperion/PriorityMuxer.cpp index 39718891..7943f745 100644 --- a/libsrc/hyperion/PriorityMuxer.cpp +++ b/libsrc/hyperion/PriorityMuxer.cpp @@ -14,6 +14,8 @@ PriorityMuxer::PriorityMuxer(int ledCount) _lowestPriorityInfo.priority = LOWEST_PRIORITY; _lowestPriorityInfo.timeoutTime_ms = -1; _lowestPriorityInfo.ledColors = std::vector(ledCount, {0, 0, 0}); + + _activeInputs[_currentPriority] = _lowestPriorityInfo; } PriorityMuxer::~PriorityMuxer() @@ -33,21 +35,15 @@ QList PriorityMuxer::getPriorities() const bool PriorityMuxer::hasPriority(const int priority) const { - return _activeInputs.contains(priority); + return (priority == LOWEST_PRIORITY) ? true : _activeInputs.contains(priority); } const PriorityMuxer::InputInfo& PriorityMuxer::getInputInfo(const int priority) const { - if (priority == LOWEST_PRIORITY) - { - return _lowestPriorityInfo; - } - auto elemIt = _activeInputs.find(priority); if (elemIt == _activeInputs.end()) { - std::cout << "error " << priority << std::endl; - throw std::runtime_error("HYPERION (prioritymux) ERROR: no such priority"); + throw std::runtime_error("HYPERION (prioritymuxer) ERROR: no such priority"); } return elemIt.value(); } @@ -64,14 +60,10 @@ void PriorityMuxer::setInput(const int priority, const std::vector& le void PriorityMuxer::clearInput(const int priority) { - _activeInputs.remove(priority); - if (_currentPriority == priority) + if (priority < LOWEST_PRIORITY) { - if (_activeInputs.empty()) - { - _currentPriority = LOWEST_PRIORITY; - } - else + _activeInputs.remove(priority); + if (_currentPriority == priority) { QList keys = _activeInputs.keys(); _currentPriority = *std::min_element(keys.begin(), keys.end()); @@ -83,6 +75,7 @@ void PriorityMuxer::clearAll() { _activeInputs.clear(); _currentPriority = LOWEST_PRIORITY; + _activeInputs[_currentPriority] = _lowestPriorityInfo; } void PriorityMuxer::setCurrentTime(const int64_t& now) diff --git a/libsrc/hyperion/hyperion.schema.json b/libsrc/hyperion/hyperion.schema.json index b89236f7..050f7fa4 100644 --- a/libsrc/hyperion/hyperion.schema.json +++ b/libsrc/hyperion/hyperion.schema.json @@ -6,13 +6,11 @@ "logger" : { "type" : "object", - "required" : true, "properties" : { "level" : { - "type" : "string", - "required" : true + "enum" : ["silent", "warn", "verbose", "debug"] } }, "additionalProperties" : false @@ -50,7 +48,7 @@ "required" : false } }, - "additionalProperties" : false + "additionalProperties" : true }, "color" : { @@ -364,44 +362,37 @@ "smoothing": { "type" : "object", - "required" : true, "properties" : { "enable" : { - "type" : "boolean", - "required" : true + "type" : "boolean" }, "type" : { - "enum" : ["none", "linear"], - "required" : true + "enum" : ["linear"] }, "time_ms" : { "type" : "integer", - "required" : false, "minimum" : 25, "maximum": 600 }, "updateFrequency" : { "type" : "number", - "required" : false, "minimum" : 1.000, "maximum": 100.000 }, "updateDelay" : { "type" : "integer", - "required" : false, "minimum" : 0, "maximum": 2048 }, "continuousOutput" : { - "type" : "boolean", - "required" : false + "type" : "boolean" } }, "additionalProperties" : false @@ -503,88 +494,120 @@ "framegrabber" : { "type" : "object", - "required" : false, "properties" : { "enable" : { - "type" : "boolean", - "required" : true + "type" : "boolean" }, "type" : { - "type" : "string", - "required" : true + "type" : "string" }, "width" : { - "type" : "integer", - "required" : false + "type" : "integer" }, "height" : { - "type" : "integer", - "required" : false + "type" : "integer" }, "frequency_Hz" : { "type" : "integer", - "required" : true + "minimum" : 0 }, "priority" : + { + "type" : "integer" + }, + "cropLeft" : { "type" : "integer", - "required" : true + "minimum" : 0 + }, + "cropRight" : + { + "type" : "integer", + "minimum" : 0 + }, + "cropTop" : + { + "type" : "integer", + "minimum" : 0 + }, + "cropBottom" : + { + "type" : "integer", + "minimum" : 0 + }, + "useXGetImage" : + { + "type" : "boolean" + }, + "horizontalPixelDecimation" : + { + "type" : "integer", + "minimum" : 0 + }, + "verticalPixelDecimation" : + { + "type" : "integer", + "minimum" : 0 + }, + "device" : + { + "type" : "string" + }, + "display" : + { + "type" : "integer", + "minimum" : 0 } }, - "additionalProperties" : true + "additionalProperties" : false }, "blackborderdetector" : { "type" : "object", - "required" : true, "properties" : { "enable" : { - "type" : "boolean", - "required" : true + "type" : "boolean" }, "threshold" : { "type" : "number", - "required" : true, "minimum" : 0.0, "maximum" : 1.0 }, "unknownFrameCnt" : { "type" : "number", - "required" : false, "minimum" : 0 }, "borderFrameCnt" : { "type" : "number", - "required" : false, "minimum" : 0 }, "maxInconsistentCnt" : { "type" : "number", - "required" : false, "minimum" : 0 }, "blurRemoveCnt" : { "type" : "number", - "required" : false, "minimum" : 0 }, "mode" : { - "type" : "string", - "required" : true + "type" : + { + "enum" : ["default", "classic", "osd"] + } } }, "additionalProperties" : false @@ -592,58 +615,47 @@ "kodiVideoChecker" : { "type" : "object", - "required" : true, "properties" : { "enable" : { - "type" : "boolean", - "required" : true + "type" : "boolean" }, "kodiAddress" : { - "type" : "string", - "required" : true + "type" : "string" }, "kodiTcpPort" : { - "type" : "integer", - "required" : true + "type" : "integer" }, "grabVideo" : { - "type" : "boolean", - "required" : true + "type" : "boolean" }, "grabPictures" : { - "type" : "boolean", - "required" : true + "type" : "boolean" }, "grabAudio" : { - "type" : "boolean", - "required" : true + "type" : "boolean" }, "grabMenu" : { - "type" : "boolean", - "required" : true + "type" : "boolean" }, "grabPause" : { - "type" : "boolean", - "required" : true + "type" : "boolean" }, "grabScreensaver" : { - "type" : "boolean", - "required" : true + "type" : "boolean" }, "enable3DDetection" : { - "type" : "boolean", - "required" : true + "type" : "boolean" } }, "additionalProperties" : false @@ -651,34 +663,28 @@ "initialEffect" : { "type" : "object", - "required" : false, "properties" : { "background-effect" : { - "type" : "string", - "required" : false + "type" : "array" }, "background-effect-args" : { - "type" : "object", - "required" : false + "type" : "object" }, "foreground-effect" : { - "type" : "string", - "required" : false + "type" : "array" }, "foreground-effect-args" : { - "type" : "object", - "required" : false + "type" : "object" }, "foreground-duration_ms" : { - "type" : "integer", - "required" : false - } + "type" : "integer" + } }, "additionalProperties" : false }, @@ -741,13 +747,11 @@ "boblightServer" : { "type" : "object", - "required" : true, "properties" : { "enable" : { - "type" : "boolean", - "required" : true + "type" : "boolean" }, "port" : { @@ -758,8 +762,7 @@ }, "priority" : { - "type" : "integer", - "required" : true + "type" : "integer" } }, "additionalProperties" : false @@ -767,13 +770,11 @@ "udpListener" : { "type" : "object", - "required" : true, "properties" : { "enable" : { - "type" : "boolean", - "required" : true + "type" : "boolean" }, "address" : { @@ -783,24 +784,20 @@ "port" : { "type" : "integer", - "required" : true, "minimum" : 0, "maximum" : 65535 }, "priority" : { - "type" : "integer", - "required" : true + "type" : "integer" }, "timeout" : { - "type" : "integer", - "required" : true + "type" : "integer" }, "shared" : { - "type" : "boolean", - "required" : true + "type" : "boolean" } }, "additionalProperties" : false @@ -832,13 +829,11 @@ "effects" : { "type" : "object", - "required" : false, "properties" : { "paths" : { - "type" : "array", - "required" : false + "type" : "array" } }, "additionalProperties" : false @@ -906,8 +901,7 @@ }, "endOfJson" : { - "type" : "string", - "required" : false + "type" : "string" } }, "additionalProperties" : false diff --git a/libsrc/jsonserver/JsonClientConnection.cpp b/libsrc/jsonserver/JsonClientConnection.cpp index 2bf6a49c..b740942f 100644 --- a/libsrc/jsonserver/JsonClientConnection.cpp +++ b/libsrc/jsonserver/JsonClientConnection.cpp @@ -13,6 +13,7 @@ #include #include #include +#include // hyperion util includes #include @@ -820,7 +821,7 @@ void JsonClientConnection::handleConfigGetCommand(const Json::Value &) void JsonClientConnection::handleComponentStateCommand(const Json::Value& message) { const Json::Value & componentState = message["componentstate"]; - std::string component = componentState.get("component", "").asString(); + QString component = QString::fromStdString(componentState.get("component", "").asString()).toUpper(); if (component == "SMOOTHING") _hyperion->setComponentState((Components)0, componentState.get("state", true).asBool()); diff --git a/src/hyperion-remote/hyperion-remote.cpp b/src/hyperion-remote/hyperion-remote.cpp index 0e45b5f5..40e71aae 100644 --- a/src/hyperion-remote/hyperion-remote.cpp +++ b/src/hyperion-remote/hyperion-remote.cpp @@ -1,6 +1,7 @@ // stl includes #include #include +#include // Qt includes #include @@ -85,6 +86,7 @@ int main(int argc, char * argv[]) AdjustmentParameter & argBAdjust = parameters.add('B', "blueAdjustment", "Set the adjustment of the blue color (requires 3 space seperated values between 0 and 255)"); IntParameter & argSource = parameters.add (0x0, "sourceSelect" , "Set current active priority channel and deactivate auto source switching"); SwitchParameter<> & argSourceAuto = parameters.add >(0x0, "sourceAutoSelect", "Enables auto source, if disabled prio by manual selecting input source"); + SwitchParameter<> & argSourceOff = parameters.add >(0x0, "sourceOff", "select no source, this results in leds activly set to black (=off)"); SwitchParameter<> & argConfigGet = parameters.add >(0x0, "configget" , "Print the current loaded Hyperion configuration file"); // set the default values @@ -109,7 +111,7 @@ int main(int argc, char * argv[]) bool colorModding = colorTransform || colorAdjust || argCorrection.isSet() || argTemperature.isSet(); // check that exactly one command was given - int commandCount = count({argColor.isSet(), argImage.isSet(), argEffect.isSet(), argServerInfo.isSet(), argClear.isSet(), argClearAll.isSet(), argEnableComponent.isSet(), argDisableComponent.isSet(), colorModding, argSource.isSet(), argSourceAuto.isSet(), argConfigGet.isSet()}); + int commandCount = count({argColor.isSet(), argImage.isSet(), argEffect.isSet(), argServerInfo.isSet(), argClear.isSet(), argClearAll.isSet(), argEnableComponent.isSet(), argDisableComponent.isSet(), colorModding, argSource.isSet(), argSourceAuto.isSet(), argSourceOff.isSet(), argConfigGet.isSet()}); if (commandCount != 1) { std::cerr << (commandCount == 0 ? "No command found." : "Multiple commands found.") << " Provide exactly one of the following options:" << std::endl; @@ -183,6 +185,10 @@ int main(int argc, char * argv[]) { connection.setComponentState(argDisableComponent.getValue(), false); } + else if (argSourceOff.isSet()) + { + connection.setSource(std::numeric_limits::max()); + } else if (argSource.isSet()) { connection.setSource(argSource.getValue()); diff --git a/src/hyperiond/hyperiond.cpp b/src/hyperiond/hyperiond.cpp index 249468ef..c86da78b 100644 --- a/src/hyperiond/hyperiond.cpp +++ b/src/hyperiond/hyperiond.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -32,7 +33,7 @@ #include "hyperiond.h" -HyperionDaemon::HyperionDaemon(std::string configFile, QObject *parent) +HyperionDaemon::HyperionDaemon(QString configFile, QObject *parent) : QObject(parent) , _log(Logger::getInstance("MAIN")) , _kodiVideoChecker(nullptr) @@ -48,10 +49,9 @@ HyperionDaemon::HyperionDaemon(std::string configFile, QObject *parent) , _osxGrabber(nullptr) , _hyperion(nullptr) { - loadConfig(configFile); // DEPRECATED | Remove this only when the conversion have been completed from JsonCpp to QTJson - loadConfig(QString::fromStdString(configFile)); + loadConfig(configFile); - _hyperion = Hyperion::initInstance(_config, configFile); + _hyperion = Hyperion::initInstance(_config, configFile.toStdString()); if (Logger::getLogLevel() == Logger::WARNING) { @@ -72,7 +72,7 @@ HyperionDaemon::HyperionDaemon(std::string configFile, QObject *parent) WarningIf(_qconfig.contains("logger"), Logger::getInstance("LOGGER"), "Logger settings overriden by command line argument"); } - Info(_log, "Hyperion started and initialised"); + Info(_log, "Hyperion initialised"); } HyperionDaemon::~HyperionDaemon() @@ -106,35 +106,14 @@ void HyperionDaemon::run() #if !defined(ENABLE_DISPMANX) && !defined(ENABLE_OSX) && !defined(ENABLE_FB) && !defined(ENABLE_X11) && !defined(ENABLE_AMLOGIC) WarningIf(_qconfig.contains("framegrabber"), _log, "No grabber can be instantiated, because all grabbers have been left out from the build"); #endif + Info(_log, "Hyperion started"); -} -void HyperionDaemon::loadConfig(const std::string & configFile) // DEPRECATED | Remove this only when the conversion have been completed from JsonCpp to QTJson -{ - Info(_log, "Selected configuration file: %s", configFile.c_str() ); - // make sure the resources are loaded (they may be left out after static linking) - Q_INIT_RESOURCE(resource); - - // read the json schema from the resource - QResource schemaData(":/hyperion-schema"); - assert(schemaData.isValid()); - - Json::Reader jsonReader; - Json::Value schemaJson; - if (!jsonReader.parse(reinterpret_cast(schemaData.data()), reinterpret_cast(schemaData.data()) + schemaData.size(), schemaJson, false)) - { - throw std::runtime_error("ERROR: Json schema wrong: " + jsonReader.getFormattedErrorMessages()) ; - } - JsonSchemaChecker schemaChecker; - schemaChecker.setSchema(schemaJson); - - _config = JsonFactory::readJson(configFile); - schemaChecker.validate(_config); } void HyperionDaemon::loadConfig(const QString & configFile) { -// Info(_log, "Selected configuration file: %s", configFile.toStdString().c_str()); // uncommend this line only if JsonCpp is removed. Otherwise appears this line twice in the debug output + Info(_log, "Selected configuration file: %s", configFile.toUtf8().constData()); // make sure the resources are loaded (they may be left out after static linking) Q_INIT_RESOURCE(resource); @@ -176,6 +155,7 @@ void HyperionDaemon::loadConfig(const QString & configFile) QJsonSchemaChecker schemaChecker; schemaChecker.setSchema(schemaJson.object()); + _config = JsonFactory::readJson(configFile.toStdString()); // DEPRECATED | Remove this only when the conversion have been completed from JsonCpp to QTJson _qconfig = QJsonFactory::readJson(configFile); if (!schemaChecker.validate(_qconfig)) { @@ -190,68 +170,76 @@ void HyperionDaemon::loadConfig(const QString & configFile) void HyperionDaemon::startInitialEffect() { + #define FGCONFIG_ARRAY fgEffectConfig.toArray() + #define BGCONFIG_ARRAY bgEffectConfig.toArray() + Hyperion *hyperion = Hyperion::getInstance(); // create boot sequence if the configuration is present if (_config.isMember("initialEffect")) { - const Json::Value effectConfig = _config["initialEffect"]; - const int HIGHEST_PRIORITY = 0; + const QJsonObject & effectConfig = _qconfig["initialEffect"].toObject(); + const int FG_PRIORITY = 0; const int DURATION_INFINITY = 0; - const int LOWEST_PRIORITY = std::numeric_limits::max()-1; + const int BG_PRIORITY = PriorityMuxer::LOWEST_PRIORITY -1; // clear the leds - hyperion->setColor(HIGHEST_PRIORITY, ColorRgb::BLACK, DURATION_INFINITY, false); + hyperion->setColor(FG_PRIORITY, ColorRgb::BLACK, DURATION_INFINITY, false); // initial foreground effect/color - const Json::Value fgEffectConfig = effectConfig["foreground-effect"]; + const QJsonValue fgEffectConfig = effectConfig["foreground-effect"]; int default_fg_duration_ms = 3000; - int fg_duration_ms = effectConfig.get("foreground-effect-duration_ms",default_fg_duration_ms).asUInt(); + int fg_duration_ms = effectConfig["foreground-effect-duration_ms"].toInt(default_fg_duration_ms); if (fg_duration_ms == DURATION_INFINITY) { fg_duration_ms = default_fg_duration_ms; Warning(_log, "foreground effect duration 'infinity' is forbidden, set to default value %d ms",default_fg_duration_ms); } - if ( ! fgEffectConfig.isNull() && fgEffectConfig.isArray() && fgEffectConfig.size() == 3 ) + if ( ! fgEffectConfig.isNull() && fgEffectConfig.isArray() && FGCONFIG_ARRAY.size() == 3 ) { ColorRgb fg_color = { - (uint8_t)fgEffectConfig[0].asUInt(), - (uint8_t)fgEffectConfig[1].asUInt(), - (uint8_t)fgEffectConfig[2].asUInt() + (uint8_t)FGCONFIG_ARRAY.at(0).toInt(0), + (uint8_t)FGCONFIG_ARRAY.at(1).toInt(0), + (uint8_t)FGCONFIG_ARRAY.at(2).toInt(0) }; - hyperion->setColor(HIGHEST_PRIORITY, fg_color, fg_duration_ms, false); + hyperion->setColor(FG_PRIORITY, fg_color, fg_duration_ms, false); Info(_log,"Inital foreground color set (%d %d %d)",fg_color.red,fg_color.green,fg_color.blue); } - else if (! fgEffectConfig.isNull() && fgEffectConfig.isString()) + else if (! fgEffectConfig.isNull() && fgEffectConfig.isArray() && FGCONFIG_ARRAY.size() == 1 && FGCONFIG_ARRAY.at(0).isString()) { - const std::string bgEffectName = fgEffectConfig.asString(); - int result = effectConfig.isMember("foreground-effect-args") - ? hyperion->setEffect(bgEffectName, effectConfig["foreground-effect-args"], HIGHEST_PRIORITY, fg_duration_ms) - : hyperion->setEffect(bgEffectName, HIGHEST_PRIORITY, fg_duration_ms); - Info(_log,"Inital foreground effect '%s' %s", bgEffectName.c_str(), ((result == 0) ? "started" : "failed")); + const std::string fgEffectName = FGCONFIG_ARRAY.at(0).toString().toStdString(); + int result = effectConfig.contains("foreground-effect-args") +// ? hyperion->setEffect(fgEffectName, effectConfig["foreground-effect-args"], FG_PRIORITY, fg_duration_ms) + ? hyperion->setEffect(fgEffectName, _config["initialEffect"]["foreground-effect-args"], FG_PRIORITY, fg_duration_ms) + : hyperion->setEffect(fgEffectName, FG_PRIORITY, fg_duration_ms); + Info(_log,"Inital foreground effect '%s' %s", fgEffectName.c_str(), ((result == 0) ? "started" : "failed")); } // initial background effect/color - const Json::Value bgEffectConfig = effectConfig["background-effect"]; - if ( ! bgEffectConfig.isNull() && bgEffectConfig.isArray() && bgEffectConfig.size() == 3 ) + const QJsonValue bgEffectConfig = effectConfig["background-effect"]; + if ( ! bgEffectConfig.isNull() && bgEffectConfig.isArray() && BGCONFIG_ARRAY.size() == 3 ) { ColorRgb bg_color = { - (uint8_t)bgEffectConfig[0].asUInt(), - (uint8_t)bgEffectConfig[1].asUInt(), - (uint8_t)bgEffectConfig[2].asUInt() + (uint8_t)BGCONFIG_ARRAY.at(0).toInt(0), + (uint8_t)BGCONFIG_ARRAY.at(1).toInt(0), + (uint8_t)BGCONFIG_ARRAY.at(2).toInt(0) }; - hyperion->setColor(LOWEST_PRIORITY, bg_color, DURATION_INFINITY, false); + hyperion->setColor(BG_PRIORITY, bg_color, DURATION_INFINITY, false); Info(_log,"Inital background color set (%d %d %d)",bg_color.red,bg_color.green,bg_color.blue); } - else if (! bgEffectConfig.isNull() && bgEffectConfig.isString()) + else if (! bgEffectConfig.isNull() && bgEffectConfig.isArray() && BGCONFIG_ARRAY.size() == 1 && BGCONFIG_ARRAY.at(0).isString()) { - const std::string bgEffectName = bgEffectConfig.asString(); - int result = effectConfig.isMember("background-effect-args") - ? hyperion->setEffect(bgEffectName, effectConfig["background-effect-args"], LOWEST_PRIORITY, DURATION_INFINITY) - : hyperion->setEffect(bgEffectName, LOWEST_PRIORITY, DURATION_INFINITY); + const std::string bgEffectName = BGCONFIG_ARRAY.at(0).toString().toStdString(); + int result = effectConfig.contains("background-effect-args") +// ? hyperion->setEffect(bgEffectName, effectConfig["background-effect-args"], BG_PRIORITY, fg_duration_ms) + ? hyperion->setEffect(bgEffectName, _config["initialEffect"]["background-effect-args"], BG_PRIORITY, DURATION_INFINITY) + : hyperion->setEffect(bgEffectName, BG_PRIORITY, DURATION_INFINITY); Info(_log,"Inital background effect '%s' %s", bgEffectName.c_str(), ((result == 0) ? "started" : "failed")); } } + + #undef FGCONFIG_ARRAY + #undef BGCONFIG_ARRAY } @@ -271,7 +259,7 @@ void HyperionDaemon::createKODIVideoChecker() videoCheckerConfig["grabPause"].toBool(true), videoCheckerConfig["grabScreensaver"].toBool(false), videoCheckerConfig["enable3DDetection"].toBool(true)); - Debug(_log, "KODI checker created "); + Debug(_log, "KODI checker created "); if( kodiCheckerConfigured && videoCheckerConfig["enable"].toBool(true)) { diff --git a/src/hyperiond/hyperiond.h b/src/hyperiond/hyperiond.h index 590a215e..031974ad 100644 --- a/src/hyperiond/hyperiond.h +++ b/src/hyperiond/hyperiond.h @@ -51,10 +51,9 @@ class HyperionDaemon : public QObject { public: - HyperionDaemon(std::string configFile, QObject *parent=nullptr); + HyperionDaemon(QString configFile, QObject *parent=nullptr); ~HyperionDaemon(); - void loadConfig(const std::string & configFile); // DEPRECATED | Remove this only when the conversion have been completed from JsonCpp to QTJson void loadConfig(const QString & configFile); void run(); diff --git a/src/hyperiond/main.cpp b/src/hyperiond/main.cpp index a65e4fe6..3ef8ecaa 100644 --- a/src/hyperiond/main.cpp +++ b/src/hyperiond/main.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "HyperionConfig.h" @@ -143,7 +144,7 @@ int main(int argc, char** argv) HyperionDaemon* hyperiond = nullptr; try { - hyperiond = new HyperionDaemon(configFiles[argvId], &app); + hyperiond = new HyperionDaemon(QString::fromStdString(configFiles[argvId]), &app); hyperiond->run(); } catch (std::exception& e)