Threading and more

- webui remove restarts
- threading for LedDevice
This commit is contained in:
Paulchen-Panther
2019-01-01 19:47:07 +01:00
parent 7b6df922ea
commit 7352ff4d42
24 changed files with 482 additions and 282 deletions

View File

@@ -1,6 +1,12 @@
#include <hyperion/CaptureCont.h>
// hyperion includes
#include <hyperion/Hyperion.h>
// utils includes
#include <utils/GlobalSignals.h>
// qt includes
#include <QTimer>
CaptureCont::CaptureCont(Hyperion* hyperion)
@@ -56,11 +62,11 @@ void CaptureCont::setSystemCaptureEnable(const bool& enable)
if(enable)
{
_hyperion->registerInput(_systemCaptPrio, hyperion::COMP_GRABBER);
connect(_hyperion, &Hyperion::systemImage, this, &CaptureCont::handleSystemImage);
connect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, this, &CaptureCont::handleSystemImage);
}
else
{
disconnect(_hyperion, &Hyperion::systemImage, this, &CaptureCont::handleSystemImage);
disconnect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, 0, 0);
_hyperion->clear(_systemCaptPrio);
}
_systemCaptEnabled = enable;
@@ -75,11 +81,11 @@ void CaptureCont::setV4LCaptureEnable(const bool& enable)
if(enable)
{
_hyperion->registerInput(_v4lCaptPrio, hyperion::COMP_V4L);
connect(_hyperion, &Hyperion::v4lImage, this, &CaptureCont::handleV4lImage);
connect(GlobalSignals::getInstance(), &GlobalSignals::setV4lImage, this, &CaptureCont::handleV4lImage);
}
else
{
disconnect(_hyperion, &Hyperion::v4lImage, this, &CaptureCont::handleV4lImage);
disconnect(GlobalSignals::getInstance(), &GlobalSignals::setV4lImage, 0, 0);
_hyperion->clear(_v4lCaptPrio);
_v4lInactiveTimer->stop();
}

View File

@@ -3,6 +3,9 @@
#include <hyperion/Grabber.h>
#include <HyperionConfig.h>
// utils includes
#include <utils/GlobalSignals.h>
// qt
#include <QTimer>
@@ -20,6 +23,11 @@ GrabberWrapper::GrabberWrapper(QString grabberName, Grabber * ggrabber, unsigned
_image.resize(width, height);
connect(_timer, &QTimer::timeout, this, &GrabberWrapper::action);
// connect the image forwarding
_grabberName.startsWith("V4L")
? connect(this, &GrabberWrapper::systemImage, GlobalSignals::getInstance(), &GlobalSignals::setV4lImage)
: connect(this, &GrabberWrapper::systemImage, GlobalSignals::getInstance(), &GlobalSignals::setSystemImage);
}
GrabberWrapper::~GrabberWrapper()

View File

@@ -26,8 +26,7 @@
#include <utils/hyperion.h>
// Leddevice includes
#include <leddevice/LedDevice.h>
#include <leddevice/LedDeviceFactory.h>
#include <leddevice/LedDeviceWrapper.h>
#include <hyperion/MultiColorAdjustment.h>
#include "LinearColorSmoothing.h"
@@ -127,22 +126,23 @@ Hyperion::Hyperion(HyperionDaemon* daemon, const quint8& instance, const QString
QJsonObject ledDevice = getSetting(settings::DEVICE).object();
ledDevice["currentLedCount"] = int(_hwLedCount); // Inject led count info
_device = LedDeviceFactory::construct(ledDevice);
_deviceSmooth = new LinearColorSmoothing(_device, getSetting(settings::SMOOTHING), this);
_ledDeviceWrapper = new LedDeviceWrapper(this);
connect(this, &Hyperion::componentStateChanged, _ledDeviceWrapper, &LedDeviceWrapper::handleComponentState);
connect(this, &Hyperion::ledDeviceData, _ledDeviceWrapper, &LedDeviceWrapper::write);
_ledDeviceWrapper->createLedDevice(ledDevice);
// smoothing
_deviceSmooth = new LinearColorSmoothing(getSetting(settings::SMOOTHING), this);
connect(this, &Hyperion::settingsChanged, _deviceSmooth, &LinearColorSmoothing::handleSettingsUpdate);
getComponentRegister().componentStateChanged(hyperion::COMP_LEDDEVICE, _device->componentState());
// create the effect engine and pipe the updateEmit; must be initialized after smoothing!
// create the effect engine; needs to be initialized after smoothing!
_effectEngine = new EffectEngine(this);
connect(_effectEngine, &EffectEngine::effectListUpdated, this, &Hyperion::effectListUpdated);
// setup config state checks and initial shot
checkConfigState();
if(_fsWatcher.addPath(_configFile))
{
QObject::connect(&_fsWatcher, &QFileSystemWatcher::fileChanged, this, &Hyperion::checkConfigState);
}
else
{
_cTimer = new QTimer(this);
@@ -153,6 +153,7 @@ Hyperion::Hyperion(HyperionDaemon* daemon, const quint8& instance, const QString
// initial startup effect
hyperion::handleInitialEffect(this, getSetting(settings::FGEFFECT).object());
// handle background effect
_BGEffectHandler = new BGEffectHandler(this);
@@ -163,7 +164,6 @@ Hyperion::Hyperion(HyperionDaemon* daemon, const quint8& instance, const QString
update();
// 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);
}
@@ -188,10 +188,10 @@ void Hyperion::freeObjects(bool emitCloseSignal)
delete _captureCont;
delete _effectEngine;
//delete _deviceSmooth;
delete _device;
delete _raw2ledAdjustment;
delete _messageForwarder;
delete _settingsManager;
delete _ledDeviceWrapper;
}
void Hyperion::handleSettingsUpdate(const settings::type& type, const QJsonDocument& config)
@@ -241,7 +241,7 @@ void Hyperion::handleSettingsUpdate(const settings::type& type, const QJsonDocum
_hwLedCount = qMax(unsigned(getSetting(settings::DEVICE).object()["hardwareLedCount"].toInt(getLedCount())), getLedCount());
// update led count in device
_device->setLedCount(_hwLedCount);
//_ledDeviceWrapper->setLedCount(_hwLedCount);
// change in leds are also reflected in adjustment
delete _raw2ledAdjustment;
@@ -262,7 +262,7 @@ void Hyperion::handleSettingsUpdate(const settings::type& type, const QJsonDocum
_hwLedCount = qMax(unsigned(dev["hardwareLedCount"].toInt(getLedCount())), getLedCount());
// force ledString update, if device ByteOrder changed
if(_device->getColorOrder() != dev["colorOrder"].toString("rgb"))
if(_ledDeviceWrapper->getColorOrder() != dev["colorOrder"].toString("rgb"))
{
_ledString = hyperion::createLedString(getSetting(settings::LEDS).array(), hyperion::createColorOrder(dev));
_ledStringClone = hyperion::createLedStringClone(getSetting(settings::LEDS).array(), hyperion::createColorOrder(dev));
@@ -276,16 +276,9 @@ void Hyperion::handleSettingsUpdate(const settings::type& type, const QJsonDocum
// update led count
_device->setLedCount(_hwLedCount);
*/
// do always reinit
// TODO segfaulting in LinearColorSmoothing::queueColor triggert from QTimer because of device->setLEdValues (results from gdb debugging and testing)
bool wasEnabled = _deviceSmooth->enabled();
_deviceSmooth->stopTimer();
delete _device;
// do always reinit until the led devices can handle dynamic changes
dev["currentLedCount"] = int(_hwLedCount); // Inject led count info
_device = LedDeviceFactory::construct(dev);
getComponentRegister().componentStateChanged(hyperion::COMP_LEDDEVICE, _device->componentState());
if(wasEnabled)
_deviceSmooth->startTimerDelayed();
_ledDeviceWrapper->createLedDevice(dev);
_lockUpdate = false;
}
// update once to push single color sets / adjustments/ ledlayout resizes and update ledBuffer color
@@ -310,7 +303,7 @@ QString Hyperion::getConfigFileName() const
int Hyperion::getLatchTime() const
{
return _device->getLatchTime();
return _ledDeviceWrapper->getLatchTime();
}
unsigned Hyperion::addSmoothingConfig(int settlingTime_ms, double ledUpdateFrequency_hz, unsigned updateDelay)
@@ -373,18 +366,14 @@ bool Hyperion::sourceAutoSelectEnabled()
return _muxer.isSourceAutoSelectEnabled();
}
void Hyperion::setNewComponentState(const hyperion::Components& component, const bool& state)
{
_componentRegister.componentStateChanged(component, state);
}
void Hyperion::setComponentState(const hyperion::Components component, const bool state)
{
switch (component)
{
case hyperion::COMP_LEDDEVICE:
_device->setEnable(state);
getComponentRegister().componentStateChanged(hyperion::COMP_LEDDEVICE, _device->componentState());
break;
default:
emit componentStateChanged(component, state);
}
emit componentStateChanged(component, state);
}
void Hyperion::registerInput(const int priority, const hyperion::Components& component, const QString& origin, const QString& owner, unsigned smooth_cfg)
@@ -571,7 +560,7 @@ const VideoMode & Hyperion::getCurrentVideoMode()
const QString & Hyperion::getActiveDevice()
{
return _device->getActiveDevice();
return _ledDeviceWrapper->getActiveDevice();
}
void Hyperion::updatedComponentState(const hyperion::Components comp, const bool state)
@@ -681,7 +670,7 @@ void Hyperion::update()
}
// Write the data to the device
if (_device->enabled())
if (_ledDeviceWrapper->enabled())
{
_deviceSmooth->selectConfig(priorityInfo.smooth_cfg);
@@ -690,6 +679,6 @@ void Hyperion::update()
_deviceSmooth->setLedValues(_ledBuffer);
if (! _deviceSmooth->enabled())
_device->setLedValues(_ledBuffer);
emit ledDeviceData(_ledBuffer);
}
}

View File

@@ -9,9 +9,8 @@
using namespace hyperion;
LinearColorSmoothing::LinearColorSmoothing( LedDevice * ledDevice, const QJsonDocument& config, Hyperion* hyperion)
: LedDevice()
, _ledDevice(ledDevice)
LinearColorSmoothing::LinearColorSmoothing(const QJsonDocument& config, Hyperion* hyperion)
: LedDevice(QJsonObject(), hyperion)
, _log(Logger::getInstance("SMOOTHING"))
, _hyperion(hyperion)
, _updateInterval(1000)
@@ -42,8 +41,7 @@ LinearColorSmoothing::LinearColorSmoothing( LedDevice * ledDevice, const QJsonDo
LinearColorSmoothing::~LinearColorSmoothing()
{
// Make sure to switch off the underlying led-device (because switchOff is no longer forwarded)
_ledDevice->switchOff();
}
void LinearColorSmoothing::handleSettingsUpdate(const settings::type& type, const QJsonDocument& config)
@@ -148,7 +146,8 @@ void LinearColorSmoothing::queueColors(const std::vector<ColorRgb> & ledColors)
{
// No output delay => immediate write
if ( _writeToLedsEnable && !_pause)
_ledDevice->setLedValues(ledColors);
emit _hyperion->ledDeviceData(ledColors);
}
else
{
@@ -163,7 +162,7 @@ void LinearColorSmoothing::queueColors(const std::vector<ColorRgb> & ledColors)
{
if (!_pause)
{
_ledDevice->setLedValues(_outputQueue.front());
emit _hyperion->ledDeviceData(_outputQueue.front());
}
_outputQueue.pop_front();
}
@@ -235,18 +234,3 @@ bool LinearColorSmoothing::selectConfig(unsigned cfg, const bool& force)
_currentConfigId = 0;
return false;
}
void LinearColorSmoothing::startTimerDelayed()
{
QTimer::singleShot(500, this, SLOT(delayStartTimer()));
}
void LinearColorSmoothing::stopTimer()
{
_timer->stop();
}
void LinearColorSmoothing::delayStartTimer()
{
_timer->start();
}

View File

@@ -28,11 +28,10 @@ class LinearColorSmoothing : public LedDevice
public:
/// Constructor
/// @param LedDevice the led device
/// @param config The configuration document smoothing
/// @param hyperion The hyperion parent instance
///
LinearColorSmoothing(LedDevice *ledDevice, const QJsonDocument& config, Hyperion* hyperion);
LinearColorSmoothing(const QJsonDocument& config, Hyperion* hyperion);
/// Destructor
virtual ~LinearColorSmoothing();
@@ -71,12 +70,6 @@ public:
///
bool selectConfig(unsigned cfg, const bool& force = false);
///
/// @ Helper methods to start the timer with delay (see delayStartSmooth())
///
void startTimerDelayed();
void stopTimer();
public slots:
///
/// @brief Handle settings update from Hyperion Settingsmanager emit or this constructor
@@ -89,9 +82,6 @@ private slots:
/// Timer callback which writes updated led values to the led device
void updateLeds();
/// Delay timer slot to workaround the leddevice reconstruction segfault (dangling pointer)
void delayStartTimer();
///
/// @brief Handle component state changes
/// @param component The component
@@ -107,9 +97,6 @@ private:
*/
void queueColors(const std::vector<ColorRgb> & ledColors);
/// The led device
LedDevice * _ledDevice;
/// Logger instance
Logger* _log;