From 505b83f0282dee696532d3a05e4e54fac81a959e Mon Sep 17 00:00:00 2001 From: redpanther Date: Fri, 15 Jul 2016 23:08:55 +0200 Subject: [PATCH 1/4] every input sources trackes now its priority and ID to hyperion core ATM all input sources except inputs via proto are tracked --- include/hyperion/Hyperion.h | 22 +++++++- .../BoblightClientConnection.cpp | 6 +-- .../boblightserver/BoblightClientConnection.h | 2 +- libsrc/boblightserver/BoblightServer.cpp | 8 ++- libsrc/effectengine/EffectEngine.cpp | 2 + libsrc/grabber/amlogic/AmlogicWrapper.cpp | 2 + libsrc/grabber/dispmanx/DispmanxWrapper.cpp | 2 + .../framebuffer/FramebufferWrapper.cpp | 2 + libsrc/grabber/osx/OsxWrapper.cpp | 2 + libsrc/grabber/v4l2/V4L2Wrapper.cpp | 27 +++++----- libsrc/hyperion/Hyperion.cpp | 54 +++++++++++++------ libsrc/udplistener/UDPListener.cpp | 3 ++ 12 files changed, 94 insertions(+), 38 deletions(-) diff --git a/include/hyperion/Hyperion.h b/include/hyperion/Hyperion.h index 633be30b..ce1895d0 100644 --- a/include/hyperion/Hyperion.h +++ b/include/hyperion/Hyperion.h @@ -2,6 +2,7 @@ // stl includes #include +#include // QT includes #include @@ -46,6 +47,7 @@ class Hyperion : public QObject public: /// Type definition of the info structure used by the priority muxer typedef PriorityMuxer::InputInfo InputInfo; + typedef std::map PriorityRegister; /// /// RGB-Color channel enumeration @@ -109,11 +111,24 @@ public: /// @return The list of active effects const std::list &getActiveEffects(); - /// + /// gets the current json config object + /// @return json config const Json::Value& getJsonConfig() { return _jsonConfig; }; - + + /// get filename of configfile + /// @return the current config filename std::string getConfigFileName() { return _configFile; }; + /// register a input source to a priority channel + /// @param name uniq name of input source + /// @param priority priority channel + void registerPriority(const std::string name, const int priority); + + /// unregister a input source to a priority channel + /// @param name uniq name of input source + void unRegisterPriority(const std::string name); + + const PriorityRegister& getPriorityRegister() { return _priorityRegister; } public slots: /// /// Writes a single color to all the leds for the given time and priority @@ -307,4 +322,7 @@ private: /// count of hardware leds unsigned _hwLedCount; + + /// register of input sources and it's prio channel + PriorityRegister _priorityRegister; }; diff --git a/libsrc/boblightserver/BoblightClientConnection.cpp b/libsrc/boblightserver/BoblightClientConnection.cpp index 5ae424b4..d794bc71 100644 --- a/libsrc/boblightserver/BoblightClientConnection.cpp +++ b/libsrc/boblightserver/BoblightClientConnection.cpp @@ -22,15 +22,15 @@ // project includes #include "BoblightClientConnection.h" -BoblightClientConnection::BoblightClientConnection(QTcpSocket *socket, const int priority, Hyperion * hyperion) +BoblightClientConnection::BoblightClientConnection(QTcpSocket *socket, const int priority) : QObject() , _locale(QLocale::C) , _socket(socket) , _imageProcessor(ImageProcessorFactory::getInstance().newImageProcessor()) - , _hyperion(hyperion) + , _hyperion(Hyperion::getInstance()) , _receiveBuffer() , _priority(priority) - , _ledColors(hyperion->getLedCount(), ColorRgb::BLACK) + , _ledColors(Hyperion::getInstance()->getLedCount(), ColorRgb::BLACK) , _log(Logger::getInstance("BOBLIGHT")) { // initalize the locale. Start with the default C-locale diff --git a/libsrc/boblightserver/BoblightClientConnection.h b/libsrc/boblightserver/BoblightClientConnection.h index d73c4960..6f91060c 100644 --- a/libsrc/boblightserver/BoblightClientConnection.h +++ b/libsrc/boblightserver/BoblightClientConnection.h @@ -27,7 +27,7 @@ public: /// @param socket The Socket object for this connection /// @param hyperion The Hyperion server /// - BoblightClientConnection(QTcpSocket * socket, const int priority, Hyperion * hyperion); + BoblightClientConnection(QTcpSocket * socket, const int priority); /// /// Destructor diff --git a/libsrc/boblightserver/BoblightServer.cpp b/libsrc/boblightserver/BoblightServer.cpp index 46f54e27..a8176bf2 100644 --- a/libsrc/boblightserver/BoblightServer.cpp +++ b/libsrc/boblightserver/BoblightServer.cpp @@ -37,6 +37,9 @@ void BoblightServer::start() _isActive = true; emit statusChanged(_isActive); + + _hyperion->registerPriority("Boblight", _priority); + } void BoblightServer::stop() @@ -49,6 +52,9 @@ void BoblightServer::stop() } _isActive = false; emit statusChanged(_isActive); + + _hyperion->unRegisterPriority("Boblight"); + } @@ -64,7 +70,7 @@ void BoblightServer::newConnection() if (socket != nullptr) { Info(_log, "new connection"); - BoblightClientConnection * connection = new BoblightClientConnection(socket, _priority, _hyperion); + BoblightClientConnection * connection = new BoblightClientConnection(socket, _priority); _openConnections.insert(connection); // register slot for cleaning up after the connection closed diff --git a/libsrc/effectengine/EffectEngine.cpp b/libsrc/effectengine/EffectEngine.cpp index a22fd3cf..a27261eb 100644 --- a/libsrc/effectengine/EffectEngine.cpp +++ b/libsrc/effectengine/EffectEngine.cpp @@ -181,6 +181,7 @@ int EffectEngine::runEffectScript(const std::string &script, const Json::Value & _activeEffects.push_back(effect); // start the effect + _hyperion->registerPriority("EFFECT: "+script, priority); effect->start(); return 0; @@ -225,4 +226,5 @@ void EffectEngine::effectFinished(Effect *effect) // cleanup the effect effect->deleteLater(); + _hyperion->unRegisterPriority("EFFECT: " + effect->getScript()); } diff --git a/libsrc/grabber/amlogic/AmlogicWrapper.cpp b/libsrc/grabber/amlogic/AmlogicWrapper.cpp index 2506d79b..c4efcc77 100644 --- a/libsrc/grabber/amlogic/AmlogicWrapper.cpp +++ b/libsrc/grabber/amlogic/AmlogicWrapper.cpp @@ -31,6 +31,8 @@ AmlogicWrapper::AmlogicWrapper(const unsigned grabWidth, const unsigned grabHeig // Connect the QTimer to this QObject::connect(&_timer, SIGNAL(timeout()), this, SLOT(action())); + + _hyperion->registerPriority("Amlogic Grabber", _priority); } AmlogicWrapper::~AmlogicWrapper() diff --git a/libsrc/grabber/dispmanx/DispmanxWrapper.cpp b/libsrc/grabber/dispmanx/DispmanxWrapper.cpp index cec8ee65..0a070138 100644 --- a/libsrc/grabber/dispmanx/DispmanxWrapper.cpp +++ b/libsrc/grabber/dispmanx/DispmanxWrapper.cpp @@ -31,6 +31,8 @@ DispmanxWrapper::DispmanxWrapper(const unsigned grabWidth, const unsigned grabHe // Connect the QTimer to this QObject::connect(&_timer, SIGNAL(timeout()), this, SLOT(action())); + + _hyperion->registerPriority("Dispmanx Grabber", _priority); } DispmanxWrapper::~DispmanxWrapper() diff --git a/libsrc/grabber/framebuffer/FramebufferWrapper.cpp b/libsrc/grabber/framebuffer/FramebufferWrapper.cpp index 57abf697..e3732c29 100644 --- a/libsrc/grabber/framebuffer/FramebufferWrapper.cpp +++ b/libsrc/grabber/framebuffer/FramebufferWrapper.cpp @@ -26,6 +26,8 @@ FramebufferWrapper::FramebufferWrapper(const std::string & device, const unsigne // Connect the QTimer to this QObject::connect(&_timer, SIGNAL(timeout()), this, SLOT(action())); + + _hyperion->registerPriority("FrameBuffer Grabber", _priority); } FramebufferWrapper::~FramebufferWrapper() diff --git a/libsrc/grabber/osx/OsxWrapper.cpp b/libsrc/grabber/osx/OsxWrapper.cpp index e891ddb2..b2cda007 100644 --- a/libsrc/grabber/osx/OsxWrapper.cpp +++ b/libsrc/grabber/osx/OsxWrapper.cpp @@ -26,6 +26,8 @@ OsxWrapper::OsxWrapper(const unsigned display, const unsigned grabWidth, const u // Connect the QTimer to this QObject::connect(&_timer, SIGNAL(timeout()), this, SLOT(action())); + + _hyperion->registerPriority("OsxFrameGrabber", _priority); } OsxWrapper::~OsxWrapper() diff --git a/libsrc/grabber/v4l2/V4L2Wrapper.cpp b/libsrc/grabber/v4l2/V4L2Wrapper.cpp index ca18df6f..3de05b5b 100644 --- a/libsrc/grabber/v4l2/V4L2Wrapper.cpp +++ b/libsrc/grabber/v4l2/V4L2Wrapper.cpp @@ -15,10 +15,10 @@ V4L2Wrapper::V4L2Wrapper(const std::string &device, double redSignalThreshold, double greenSignalThreshold, double blueSignalThreshold, - int hyperionPriority) : - _timeout_ms(1000), - _priority(hyperionPriority), - _grabber(device, + int hyperionPriority) + : _timeout_ms(1000) + , _priority(hyperionPriority) + , _grabber(device, input, videoStandard, pixelFormat, @@ -26,18 +26,16 @@ V4L2Wrapper::V4L2Wrapper(const std::string &device, height, frameDecimation, pixelDecimation, - pixelDecimation), - _processor(ImageProcessorFactory::getInstance().newImageProcessor()), - _hyperion(Hyperion::getInstance()), - _ledColors(Hyperion::getInstance()->getLedCount(), ColorRgb{0,0,0}), - _timer() + pixelDecimation) + , _processor(ImageProcessorFactory::getInstance().newImageProcessor()) + , _hyperion(Hyperion::getInstance()) + , _ledColors(Hyperion::getInstance()->getLedCount(), ColorRgb{0,0,0}) + , _timer() { // set the signal detection threshold of the grabber - _grabber.setSignalThreshold( - redSignalThreshold, - greenSignalThreshold, - blueSignalThreshold, - 50); + _grabber.setSignalThreshold( redSignalThreshold, greenSignalThreshold, blueSignalThreshold, 50); + + _hyperion->registerPriority("V4L2", _priority); // register the image type qRegisterMetaType>("Image"); @@ -55,6 +53,7 @@ V4L2Wrapper::V4L2Wrapper(const std::string &device, _hyperion, SLOT(setColors(int,std::vector,int)), Qt::QueuedConnection); + // setup the higher prio source checker // this will disable the v4l2 grabber when a source with hisher priority is active _timer.setInterval(500); diff --git a/libsrc/hyperion/Hyperion.cpp b/libsrc/hyperion/Hyperion.cpp index ec6405f8..0264fd99 100644 --- a/libsrc/hyperion/Hyperion.cpp +++ b/libsrc/hyperion/Hyperion.cpp @@ -541,32 +541,32 @@ MessageForwarder * Hyperion::getForwarder() return _messageForwarder; } -Hyperion::Hyperion(const Json::Value &jsonConfig, const std::string configFile) : - _ledString(createLedString(jsonConfig["leds"], createColorOrder(jsonConfig["device"]))), - _muxer(_ledString.leds().size()), - _raw2ledTransform(createLedColorsTransform(_ledString.leds().size(), jsonConfig["color"])), - _raw2ledTemperature(createLedColorsTemperature(_ledString.leds().size(), jsonConfig["color"])), - _raw2ledAdjustment(createLedColorsAdjustment(_ledString.leds().size(), jsonConfig["color"])), - _device(LedDeviceFactory::construct(jsonConfig["device"])), - _effectEngine(nullptr), - _messageForwarder(createMessageForwarder(jsonConfig["forwarder"])), - _jsonConfig(jsonConfig), - _configFile(configFile), - _timer(), - _log(Logger::getInstance("Core")), - _hwLedCount(_ledString.leds().size()) +Hyperion::Hyperion(const Json::Value &jsonConfig, const std::string configFile) + : _ledString(createLedString(jsonConfig["leds"], createColorOrder(jsonConfig["device"]))) + , _muxer(_ledString.leds().size()) + , _raw2ledTransform(createLedColorsTransform(_ledString.leds().size(), jsonConfig["color"])) + , _raw2ledTemperature(createLedColorsTemperature(_ledString.leds().size(), jsonConfig["color"])) + , _raw2ledAdjustment(createLedColorsAdjustment(_ledString.leds().size(), jsonConfig["color"])) + , _device(LedDeviceFactory::construct(jsonConfig["device"])) + , _effectEngine(nullptr) + , _messageForwarder(createMessageForwarder(jsonConfig["forwarder"])) + , _jsonConfig(jsonConfig) + , _configFile(configFile) + , _timer() + , _log(Logger::getInstance("Core")) + , _hwLedCount(_ledString.leds().size()) { if (!_raw2ledAdjustment->verifyAdjustments()) { - throw std::runtime_error("HYPERION ERROR: Color adjustment incorrectly set"); + throw std::runtime_error("Color adjustment incorrectly set"); } if (!_raw2ledTemperature->verifyCorrections()) { - throw std::runtime_error("HYPERION ERROR: Color temperature incorrectly set"); + throw std::runtime_error("Color temperature incorrectly set"); } if (!_raw2ledTransform->verifyTransforms()) { - throw std::runtime_error("HYPERION ERROR: Color transformation incorrectly set"); + throw std::runtime_error("Color transformation incorrectly set"); } // initialize the image processor factory ImageProcessorFactory::getInstance().init( @@ -614,6 +614,26 @@ unsigned Hyperion::getLedCount() const return _ledString.leds().size(); } +void Hyperion::registerPriority(const std::string name, const int priority) +{ + Info(_log, "Register new input source named '%s' for priority channel '%d'", name.c_str(), priority ); + + for(auto const &entry : _priorityRegister) + { + WarningIf( ( entry.first != name && entry.second == priority), _log, + "Input source '%s' uses same priority channel (%d) as '%s'.", name.c_str(), priority, entry.first.c_str()); + } + + _priorityRegister.emplace(name,priority); +} + +void Hyperion::unRegisterPriority(const std::string name) +{ + Info(_log, "Unregister input source named '%s' from priority register", name.c_str()); + _priorityRegister.erase(name); +} + + void Hyperion::setColor(int priority, const ColorRgb &color, const int timeout_ms, bool clearEffects) { // create led output diff --git a/libsrc/udplistener/UDPListener.cpp b/libsrc/udplistener/UDPListener.cpp index e7b5483e..74a3f3bc 100644 --- a/libsrc/udplistener/UDPListener.cpp +++ b/libsrc/udplistener/UDPListener.cpp @@ -29,6 +29,9 @@ UDPListener::UDPListener(const int priority, const int timeout, const std::strin // Set trigger for incoming connections connect(_server, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams())); + + _hyperion->registerPriority("UDPLISTENER", _priority); + } UDPListener::~UDPListener() From a8da7acd143fd755816cd4345d88d75bc66c1cee Mon Sep 17 00:00:00 2001 From: redpanther Date: Sat, 16 Jul 2016 22:51:31 +0200 Subject: [PATCH 2/4] make proto uses priorityRegister --- libsrc/grabber/amlogic/AmlogicWrapper.cpp | 5 ++- libsrc/grabber/dispmanx/DispmanxWrapper.cpp | 4 +- .../framebuffer/FramebufferWrapper.cpp | 4 +- libsrc/grabber/osx/OsxWrapper.cpp | 4 +- libsrc/grabber/v4l2/V4L2Wrapper.cpp | 11 ++++-- libsrc/jsonserver/JsonClientConnection.cpp | 11 ++++++ libsrc/protoserver/ProtoClientConnection.cpp | 37 ++++++++++++------- libsrc/protoserver/ProtoClientConnection.h | 6 ++- libsrc/protoserver/ProtoConnectionWrapper.cpp | 8 ++-- libsrc/protoserver/ProtoServer.cpp | 14 +++---- libsrc/webconfig/StaticFileServing.cpp | 2 +- 11 files changed, 69 insertions(+), 37 deletions(-) diff --git a/libsrc/grabber/amlogic/AmlogicWrapper.cpp b/libsrc/grabber/amlogic/AmlogicWrapper.cpp index c4efcc77..24eedc84 100644 --- a/libsrc/grabber/amlogic/AmlogicWrapper.cpp +++ b/libsrc/grabber/amlogic/AmlogicWrapper.cpp @@ -31,8 +31,6 @@ AmlogicWrapper::AmlogicWrapper(const unsigned grabWidth, const unsigned grabHeig // Connect the QTimer to this QObject::connect(&_timer, SIGNAL(timeout()), this, SLOT(action())); - - _hyperion->registerPriority("Amlogic Grabber", _priority); } AmlogicWrapper::~AmlogicWrapper() @@ -46,6 +44,7 @@ void AmlogicWrapper::start() { // Start the timer with the pre configured interval _timer.start(); + _hyperion->registerPriority("Amlogic Grabber"); } void AmlogicWrapper::action() @@ -72,6 +71,8 @@ void AmlogicWrapper::stop() { // Stop the timer, effectivly stopping the process _timer.stop(); + _hyperion->unRegisterPriority("Amlogic Grabber", _priority); + } void AmlogicWrapper::setGrabbingMode(const GrabbingMode mode) diff --git a/libsrc/grabber/dispmanx/DispmanxWrapper.cpp b/libsrc/grabber/dispmanx/DispmanxWrapper.cpp index 0a070138..f2783deb 100644 --- a/libsrc/grabber/dispmanx/DispmanxWrapper.cpp +++ b/libsrc/grabber/dispmanx/DispmanxWrapper.cpp @@ -31,8 +31,6 @@ DispmanxWrapper::DispmanxWrapper(const unsigned grabWidth, const unsigned grabHe // Connect the QTimer to this QObject::connect(&_timer, SIGNAL(timeout()), this, SLOT(action())); - - _hyperion->registerPriority("Dispmanx Grabber", _priority); } DispmanxWrapper::~DispmanxWrapper() @@ -46,6 +44,7 @@ void DispmanxWrapper::start() { // Start the timer with the pre configured interval _timer.start(); + _hyperion->registerPriority("Dispmanx Grabber", _priority); } void DispmanxWrapper::action() @@ -68,6 +67,7 @@ void DispmanxWrapper::stop() { // Stop the timer, effectivly stopping the process _timer.stop(); + _hyperion->unRegisterPriority("Dispmanx Grabber"); } void DispmanxWrapper::setGrabbingMode(const GrabbingMode mode) diff --git a/libsrc/grabber/framebuffer/FramebufferWrapper.cpp b/libsrc/grabber/framebuffer/FramebufferWrapper.cpp index e3732c29..0e0c2c8f 100644 --- a/libsrc/grabber/framebuffer/FramebufferWrapper.cpp +++ b/libsrc/grabber/framebuffer/FramebufferWrapper.cpp @@ -26,8 +26,6 @@ FramebufferWrapper::FramebufferWrapper(const std::string & device, const unsigne // Connect the QTimer to this QObject::connect(&_timer, SIGNAL(timeout()), this, SLOT(action())); - - _hyperion->registerPriority("FrameBuffer Grabber", _priority); } FramebufferWrapper::~FramebufferWrapper() @@ -41,6 +39,7 @@ void FramebufferWrapper::start() { // Start the timer with the pre configured interval _timer.start(); + _hyperion->registerPriority("FrameBuffer Grabber", _priority); } void FramebufferWrapper::action() @@ -57,6 +56,7 @@ void FramebufferWrapper::stop() { // Stop the timer, effectivly stopping the process _timer.stop(); + _hyperion->unRegisterPriority("FrameBuffer Grabber"); } void FramebufferWrapper::setGrabbingMode(const GrabbingMode mode) diff --git a/libsrc/grabber/osx/OsxWrapper.cpp b/libsrc/grabber/osx/OsxWrapper.cpp index b2cda007..afde051f 100644 --- a/libsrc/grabber/osx/OsxWrapper.cpp +++ b/libsrc/grabber/osx/OsxWrapper.cpp @@ -26,8 +26,6 @@ OsxWrapper::OsxWrapper(const unsigned display, const unsigned grabWidth, const u // Connect the QTimer to this QObject::connect(&_timer, SIGNAL(timeout()), this, SLOT(action())); - - _hyperion->registerPriority("OsxFrameGrabber", _priority); } OsxWrapper::~OsxWrapper() @@ -41,6 +39,7 @@ void OsxWrapper::start() { // Start the timer with the pre configured interval _timer.start(); + _hyperion->registerPriority("OsxFrameGrabber", _priority); } void OsxWrapper::action() @@ -57,6 +56,7 @@ void OsxWrapper::stop() { // Stop the timer, effectivly stopping the process _timer.stop(); + _hyperion->unRegisterPriority("OsxFrameGrabber"); } void OsxWrapper::setGrabbingMode(const GrabbingMode mode) diff --git a/libsrc/grabber/v4l2/V4L2Wrapper.cpp b/libsrc/grabber/v4l2/V4L2Wrapper.cpp index 3de05b5b..b685c962 100644 --- a/libsrc/grabber/v4l2/V4L2Wrapper.cpp +++ b/libsrc/grabber/v4l2/V4L2Wrapper.cpp @@ -35,8 +35,6 @@ V4L2Wrapper::V4L2Wrapper(const std::string &device, // set the signal detection threshold of the grabber _grabber.setSignalThreshold( redSignalThreshold, greenSignalThreshold, blueSignalThreshold, 50); - _hyperion->registerPriority("V4L2", _priority); - // register the image type qRegisterMetaType>("Image"); qRegisterMetaType>("std::vector"); @@ -71,14 +69,21 @@ bool V4L2Wrapper::start() { bool grabber_started = _grabber.start(); if ( ! grabber_started ) + { _timer.stop(); - + } + else + { + _hyperion->registerPriority("V4L2", _priority); + } + return grabber_started; } void V4L2Wrapper::stop() { _grabber.stop(); + _hyperion->unRegisterPriority("V4L2"); } void V4L2Wrapper::setCropping(int cropLeft, int cropRight, int cropTop, int cropBottom) diff --git a/libsrc/jsonserver/JsonClientConnection.cpp b/libsrc/jsonserver/JsonClientConnection.cpp index 6f402c29..9c88135d 100644 --- a/libsrc/jsonserver/JsonClientConnection.cpp +++ b/libsrc/jsonserver/JsonClientConnection.cpp @@ -387,6 +387,7 @@ void JsonClientConnection::handleServerInfoCommand(const Json::Value &) Json::Value & priorities = info["priorities"] = Json::Value(Json::arrayValue); uint64_t now = QDateTime::currentMSecsSinceEpoch(); QList activePriorities = _hyperion->getActivePriorities(); + const Hyperion::PriorityRegister& priorityRegister = _hyperion->getPriorityRegister(); foreach (int priority, activePriorities) { const Hyperion::InputInfo & priorityInfo = _hyperion->getPriorityInfo(priority); Json::Value & item = priorities[priorities.size()]; @@ -395,6 +396,16 @@ void JsonClientConnection::handleServerInfoCommand(const Json::Value &) { item["duration_ms"] = Json::Value::UInt(priorityInfo.timeoutTime_ms - now); } + + item["owner"] = "unknown"; + for(auto const &entry : priorityRegister) + { + if (entry.second == priority) + { + item["owner"] = entry.first; + break; + } + } } // collect temperature correction information diff --git a/libsrc/protoserver/ProtoClientConnection.cpp b/libsrc/protoserver/ProtoClientConnection.cpp index 9082635e..5db92eac 100644 --- a/libsrc/protoserver/ProtoClientConnection.cpp +++ b/libsrc/protoserver/ProtoClientConnection.cpp @@ -20,16 +20,19 @@ // project includes #include "ProtoClientConnection.h" -ProtoClientConnection::ProtoClientConnection(QTcpSocket *socket, Hyperion * hyperion) : - QObject(), - _socket(socket), - _imageProcessor(ImageProcessorFactory::getInstance().newImageProcessor()), - _hyperion(hyperion), - _receiveBuffer() +ProtoClientConnection::ProtoClientConnection(QTcpSocket *socket) + : QObject() + , _socket(socket) + , _imageProcessor(ImageProcessorFactory::getInstance().newImageProcessor()) + , _hyperion(Hyperion::getInstance()) + , _receiveBuffer() + , _priority(-1) { // connect internal signals and slots connect(_socket, SIGNAL(disconnected()), this, SLOT(socketClosed())); connect(_socket, SIGNAL(readyRead()), this, SLOT(readData())); + + _priorityChannelName = "proto@"+ _socket->peerAddress().toString().toStdString(); } ProtoClientConnection::~ProtoClientConnection() @@ -76,6 +79,7 @@ void ProtoClientConnection::readData() void ProtoClientConnection::socketClosed() { + _hyperion->unRegisterPriority(_priorityChannelName); emit connectionClosed(this); } @@ -110,6 +114,7 @@ void ProtoClientConnection::handleMessage(const proto::HyperionRequest & message // forward messages emit newMessage(&message); + int prevPriority = _priority; switch (message.command()) { case proto::HyperionRequest::COLOR: @@ -142,12 +147,18 @@ void ProtoClientConnection::handleMessage(const proto::HyperionRequest & message default: handleNotImplemented(); } + + if (prevPriority != _priority) + { + _hyperion->registerPriority(_priorityChannelName, _priority); + prevPriority = _priority; + } } void ProtoClientConnection::handleColorCommand(const proto::ColorRequest &message) { // extract parameters - int priority = message.priority(); + _priority = message.priority(); int duration = message.has_duration() ? message.duration() : -1; ColorRgb color; color.red = qRed(message.rgbcolor()); @@ -155,7 +166,7 @@ void ProtoClientConnection::handleColorCommand(const proto::ColorRequest &messag color.blue = qBlue(message.rgbcolor()); // set output - _hyperion->setColor(priority, color, duration); + _hyperion->setColor(_priority, color, duration); // send reply sendSuccessReply(); @@ -164,7 +175,7 @@ void ProtoClientConnection::handleColorCommand(const proto::ColorRequest &messag void ProtoClientConnection::handleImageCommand(const proto::ImageRequest &message) { // extract parameters - int priority = message.priority(); + _priority = message.priority(); int duration = message.has_duration() ? message.duration() : -1; int width = message.imagewidth(); int height = message.imageheight(); @@ -186,7 +197,7 @@ void ProtoClientConnection::handleImageCommand(const proto::ImageRequest &messag // process the image std::vector ledColors = _imageProcessor->process(image); - _hyperion->setColors(priority, ledColors, duration); + _hyperion->setColors(_priority, ledColors, duration); // send reply sendSuccessReply(); @@ -196,11 +207,11 @@ void ProtoClientConnection::handleImageCommand(const proto::ImageRequest &messag void ProtoClientConnection::handleClearCommand(const proto::ClearRequest &message) { // extract parameters - int priority = message.priority(); + _priority = message.priority(); // clear priority - _hyperion->clear(priority); - + _hyperion->clear(_priority); + _hyperion->unRegisterPriority(_priorityChannelName); // send reply sendSuccessReply(); } diff --git a/libsrc/protoserver/ProtoClientConnection.h b/libsrc/protoserver/ProtoClientConnection.h index d5d31c89..f2777d4c 100644 --- a/libsrc/protoserver/ProtoClientConnection.h +++ b/libsrc/protoserver/ProtoClientConnection.h @@ -34,7 +34,7 @@ public: /// @param socket The Socket object for this connection /// @param hyperion The Hyperion server /// - ProtoClientConnection(QTcpSocket * socket, Hyperion * hyperion); + ProtoClientConnection(QTcpSocket * socket); /// /// Destructor @@ -137,4 +137,8 @@ private: /// The buffer used for reading data from the socket QByteArray _receiveBuffer; + + int _priority; + + std::string _priorityChannelName; }; diff --git a/libsrc/protoserver/ProtoConnectionWrapper.cpp b/libsrc/protoserver/ProtoConnectionWrapper.cpp index 3c2ad0cd..e236e223 100644 --- a/libsrc/protoserver/ProtoConnectionWrapper.cpp +++ b/libsrc/protoserver/ProtoConnectionWrapper.cpp @@ -1,10 +1,10 @@ // protoserver includes #include "protoserver/ProtoConnectionWrapper.h" -ProtoConnectionWrapper::ProtoConnectionWrapper(const std::string & address, int priority, int duration_ms, bool skipProtoReply) : - _priority(priority), - _duration_ms(duration_ms), - _connection(address) +ProtoConnectionWrapper::ProtoConnectionWrapper(const std::string & address, int priority, int duration_ms, bool skipProtoReply) + : _priority(priority) + , _duration_ms(duration_ms) + , _connection(address) { _connection.setSkipReply(skipProtoReply); connect(&_connection, SIGNAL(setGrabbingMode(GrabbingMode)), this, SIGNAL(setGrabbingMode(GrabbingMode))); diff --git a/libsrc/protoserver/ProtoServer.cpp b/libsrc/protoserver/ProtoServer.cpp index 46d38029..b3b0a654 100644 --- a/libsrc/protoserver/ProtoServer.cpp +++ b/libsrc/protoserver/ProtoServer.cpp @@ -7,12 +7,12 @@ #include "protoserver/ProtoConnection.h" #include "ProtoClientConnection.h" -ProtoServer::ProtoServer(uint16_t port) : - QObject(), - _hyperion(Hyperion::getInstance()), - _server(), - _openConnections(), - _log(Logger::getInstance("PROTOSERVER")) +ProtoServer::ProtoServer(uint16_t port) + : QObject() + , _hyperion(Hyperion::getInstance()) + , _server() + , _openConnections() + , _log(Logger::getInstance("PROTOSERVER")) { MessageForwarder * forwarder = _hyperion->getForwarder(); @@ -59,7 +59,7 @@ void ProtoServer::newConnection() if (socket != nullptr) { Debug(_log, "New connection"); - ProtoClientConnection * connection = new ProtoClientConnection(socket, _hyperion); + ProtoClientConnection * connection = new ProtoClientConnection(socket); _openConnections.insert(connection); // register slot for cleaning up after the connection closed diff --git a/libsrc/webconfig/StaticFileServing.cpp b/libsrc/webconfig/StaticFileServing.cpp index 25e5f9a4..4230b23e 100644 --- a/libsrc/webconfig/StaticFileServing.cpp +++ b/libsrc/webconfig/StaticFileServing.cpp @@ -17,7 +17,7 @@ StaticFileServing::StaticFileServing (Hyperion *hyperion, QString baseUrl, quint _mimeDb = new QMimeDatabase; _server = new QtHttpServer (this); - _server->setServerName (QStringLiteral ("Qt Static HTTP File Server")); + _server->setServerName (QStringLiteral ("Hyperion WebConfig")); connect (_server, &QtHttpServer::started, this, &StaticFileServing::onServerStarted); connect (_server, &QtHttpServer::stopped, this, &StaticFileServing::onServerStopped); From acd15fa10825b1be8221434759fd80eb5d1c3284 Mon Sep 17 00:00:00 2001 From: redpanther Date: Sat, 16 Jul 2016 22:58:13 +0200 Subject: [PATCH 3/4] fix compile for aml --- libsrc/grabber/amlogic/AmlogicWrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsrc/grabber/amlogic/AmlogicWrapper.cpp b/libsrc/grabber/amlogic/AmlogicWrapper.cpp index 24eedc84..62d1f073 100644 --- a/libsrc/grabber/amlogic/AmlogicWrapper.cpp +++ b/libsrc/grabber/amlogic/AmlogicWrapper.cpp @@ -44,7 +44,7 @@ void AmlogicWrapper::start() { // Start the timer with the pre configured interval _timer.start(); - _hyperion->registerPriority("Amlogic Grabber"); + _hyperion->registerPriority("Amlogic Grabber",_priority); } void AmlogicWrapper::action() From 4538e81b4bcd5667307f0431137771d3f64ca1da Mon Sep 17 00:00:00 2001 From: redpanther Date: Sat, 16 Jul 2016 23:01:18 +0200 Subject: [PATCH 4/4] fix aml build --- libsrc/grabber/amlogic/AmlogicWrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsrc/grabber/amlogic/AmlogicWrapper.cpp b/libsrc/grabber/amlogic/AmlogicWrapper.cpp index 62d1f073..e9f59f3f 100644 --- a/libsrc/grabber/amlogic/AmlogicWrapper.cpp +++ b/libsrc/grabber/amlogic/AmlogicWrapper.cpp @@ -71,7 +71,7 @@ void AmlogicWrapper::stop() { // Stop the timer, effectivly stopping the process _timer.stop(); - _hyperion->unRegisterPriority("Amlogic Grabber", _priority); + _hyperion->unRegisterPriority("Amlogic Grabber"); }