Bugfix/Hotfix/Update

Signed-off-by: Paulchen-Panther <Paulchen-Panter@protonmail.com>
This commit is contained in:
Paulchen-Panther 2019-07-02 19:06:36 +02:00
parent d739d9efdb
commit d414942e2e
No known key found for this signature in database
GPG Key ID: 84E3B692456B6840
20 changed files with 149 additions and 115 deletions

View File

@ -193,10 +193,10 @@ function createClassicLeds(){
} }
} }
createLeftLeds();
createBottomLeds();
createRightLeds();
createTopLeds(); createTopLeds();
createRightLeds();
createBottomLeds();
createLeftLeds();
//check led gap pos //check led gap pos
if (ledsgpos+ledsglength > ledArray.length) if (ledsgpos+ledsglength > ledArray.length)
@ -429,6 +429,9 @@ $(document).ready(function() {
// create and update editor // create and update editor
$("#leddevices").off().on("change", function() { $("#leddevices").off().on("change", function() {
var generalOptions = window.serverSchema.properties.device; var generalOptions = window.serverSchema.properties.device;
// Modified schema enty "hardwareLedCount" in generalOptions to minimum LedCount
var specificOptions = window.serverSchema.properties.alldevices[$(this).val()]; var specificOptions = window.serverSchema.properties.alldevices[$(this).val()];
conf_editor = createJsonEditor('editor_container', { conf_editor = createJsonEditor('editor_container', {
generalOptions : generalOptions, generalOptions : generalOptions,

View File

@ -31,7 +31,7 @@
"output" : "/dev/null", "output" : "/dev/null",
"rate" : 1000000, "rate" : 1000000,
"colorOrder" : "rgb", "colorOrder" : "rgb",
"rewriteTime": 0 "rewriteTime": 5000
}, },
/// Color manipulation configuration used to tune the output colors to specific surroundings. /// Color manipulation configuration used to tune the output colors to specific surroundings.

View File

@ -6,7 +6,7 @@
#include <utils/Components.h> #include <utils/Components.h>
#include <hyperion/Hyperion.h> #include <hyperion/Hyperion.h>
// qt includess // qt includes
#include <QJsonObject> #include <QJsonObject>
#include <QMutex> #include <QMutex>
#include <QString> #include <QString>
@ -63,8 +63,8 @@ private:
// true if further callbacks are forbidden (http) // true if further callbacks are forbidden (http)
bool _noListener; bool _noListener;
/// The peer address of the client /// The peer address of the client
QString _peerAddress; QString _peerAddress;
/// Log instance /// Log instance
Logger* _log; Logger* _log;
@ -86,7 +86,7 @@ private:
/// mutex to determine state of image streaming /// mutex to determine state of image streaming
QMutex _image_stream_mutex; QMutex _image_stream_mutex;
/// mutex to determine state of image streaming /// mutex to determine state of led streaming
QMutex _led_stream_mutex; QMutex _led_stream_mutex;
/// timeout for live video refresh /// timeout for live video refresh

View File

@ -5,7 +5,6 @@
#include <QMap> #include <QMap>
// QT includes // QT includes
//#include <QObject>
#include <QString> #include <QString>
#include <QStringList> #include <QStringList>
#include <QSize> #include <QSize>
@ -13,6 +12,7 @@
#include <QJsonValue> #include <QJsonValue>
#include <QJsonArray> #include <QJsonArray>
#include <QFileSystemWatcher> #include <QFileSystemWatcher>
#include <QMutex>
// hyperion-utils includes // hyperion-utils includes
#include <utils/Image.h> #include <utils/Image.h>
@ -410,8 +410,11 @@ signals:
/// Signal which is emitted, when a new json message should be forwarded /// Signal which is emitted, when a new json message should be forwarded
void forwardJsonMessage(QJsonObject); void forwardJsonMessage(QJsonObject);
/// Signal which is emitted, when a new proto image should be forwarded /// Signal which is emitted, when a new system proto image should be forwarded
void forwardProtoMessage(const QString, const Image<ColorRgb>); void forwardSystemProtoMessage(const QString, const Image<ColorRgb>);
/// Signal which is emitted, when a new V4l proto image should be forwarded
void forwardV4lProtoMessage(const QString, const Image<ColorRgb>);
/// ///
/// @brief Is emitted from clients who request a videoMode change /// @brief Is emitted from clients who request a videoMode change
@ -474,6 +477,12 @@ private slots:
/// ///
void handleSettingsUpdate(const settings::type& type, const QJsonDocument& config); void handleSettingsUpdate(const settings::type& type, const QJsonDocument& config);
///
/// @brief Handle priority updates from Priority Muxer
/// @param priority The new visible priority
///
void handlePriorityChanges(const quint8 &priority);
private: private:
/// ///
@ -560,12 +569,12 @@ private:
/// Capture control for Daemon native capture /// Capture control for Daemon native capture
CaptureCont* _captureCont; CaptureCont* _captureCont;
// lock Hyperion::update() for exec
bool _lockUpdate = false;
/// buffer for leds (with adjustment) /// buffer for leds (with adjustment)
std::vector<ColorRgb> _ledBuffer; std::vector<ColorRgb> _ledBuffer;
/// Boblight instance /// Boblight instance
BoblightServer* _boblightServer; BoblightServer* _boblightServer;
/// mutex
QMutex _changes;
}; };

View File

@ -150,7 +150,7 @@ public:
// Check black border detection // Check black border detection
verifyBorder(image); verifyBorder(image);
// Determine the mean-colors of each led (using the existing mapping) // Determine the mean or uni colors of each led (using the existing mapping)
switch (_mappingType) switch (_mappingType)
{ {
case 1: _imageToLeds->getUniLedColor(image, ledColors); break; case 1: _imageToLeds->getUniLedColor(image, ledColors); break;

View File

@ -61,7 +61,7 @@ namespace hyperion
unsigned verticalBorder() { return _verticalBorder; }; unsigned verticalBorder() { return _verticalBorder; };
/// ///
/// Determines the mean-color for each led using the mapping the image given /// Determines the mean color for each led using the mapping the image given
/// at construction. /// at construction.
/// ///
/// @param[in] image The image from which to extract the led colors /// @param[in] image The image from which to extract the led colors
@ -104,7 +104,7 @@ namespace hyperion
} }
/// ///
/// Determines the mean-color for each led using the mapping the image given /// Determines the uni color for each led using the mapping the image given
/// at construction. /// at construction.
/// ///
/// @param[in] image The image from which to extract the led colors /// @param[in] image The image from which to extract the led colors
@ -120,7 +120,7 @@ namespace hyperion
} }
/// ///
/// Determines the mean color for each led using the mapping the image given /// Determines the uni color for each led using the mapping the image given
/// at construction. /// at construction.
/// ///
/// @param[in] image The image from which to extract the led colors /// @param[in] image The image from which to extract the led colors

View File

@ -84,6 +84,14 @@ signals:
/// ///
void enableStateChanged(bool newState); void enableStateChanged(bool newState);
///
/// PIPER signal for Priority Muxer -> LedDevice
///
/// @brief Handle priority updates from Priority Muxer
/// @param priority The new visible priority
///
void visiblePriorityChanged(const quint8 &priority);
protected: protected:
virtual bool init(const QJsonObject &deviceConfig); virtual bool init(const QJsonObject &deviceConfig);

View File

@ -40,12 +40,12 @@ namespace hyperion {
(uint8_t)FGCONFIG_ARRAY.at(2).toInt(0) (uint8_t)FGCONFIG_ARRAY.at(2).toInt(0)
}; };
hyperion->setColor(FG_PRIORITY, fg_color, fg_duration_ms); hyperion->setColor(FG_PRIORITY, fg_color, fg_duration_ms);
Info(Logger::getInstance("HYPERION"),"Inital foreground color set (%d %d %d)",fg_color.red,fg_color.green,fg_color.blue); Info(Logger::getInstance("HYPERION"),"Initial foreground color set (%d %d %d)",fg_color.red,fg_color.green,fg_color.blue);
} }
else else
{ {
int result = hyperion->setEffect(fgEffectConfig, FG_PRIORITY, fg_duration_ms); int result = hyperion->setEffect(fgEffectConfig, FG_PRIORITY, fg_duration_ms);
Info(Logger::getInstance("HYPERION"),"Inital foreground effect '%s' %s", QSTRING_CSTR(fgEffectConfig), ((result == 0) ? "started" : "failed")); Info(Logger::getInstance("HYPERION"),"Initial foreground effect '%s' %s", QSTRING_CSTR(fgEffectConfig), ((result == 0) ? "started" : "failed"));
} }
} }
#undef FGCONFIG_ARRAY #undef FGCONFIG_ARRAY

View File

@ -30,7 +30,6 @@ EffectEngine::EffectEngine(Hyperion * hyperion)
{ {
Q_INIT_RESOURCE(EffectEngine); Q_INIT_RESOURCE(EffectEngine);
qRegisterMetaType<std::vector<ColorRgb>>("std::vector<ColorRgb>");
qRegisterMetaType<hyperion::Components>("hyperion::Components"); qRegisterMetaType<hyperion::Components>("hyperion::Components");
// connect the Hyperion channel clear feedback // connect the Hyperion channel clear feedback

View File

@ -73,7 +73,7 @@ void CaptureCont::setSystemCaptureEnable(const bool& enable)
{ {
_hyperion->registerInput(_systemCaptPrio, hyperion::COMP_GRABBER); _hyperion->registerInput(_systemCaptPrio, hyperion::COMP_GRABBER);
connect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, this, &CaptureCont::handleSystemImage); connect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, this, &CaptureCont::handleSystemImage);
connect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, _hyperion, &Hyperion::forwardProtoMessage); connect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, _hyperion, &Hyperion::forwardSystemProtoMessage);
} }
else else
{ {
@ -94,7 +94,7 @@ void CaptureCont::setV4LCaptureEnable(const bool& enable)
{ {
_hyperion->registerInput(_v4lCaptPrio, hyperion::COMP_V4L); _hyperion->registerInput(_v4lCaptPrio, hyperion::COMP_V4L);
connect(GlobalSignals::getInstance(), &GlobalSignals::setV4lImage, this, &CaptureCont::handleV4lImage); connect(GlobalSignals::getInstance(), &GlobalSignals::setV4lImage, this, &CaptureCont::handleV4lImage);
connect(GlobalSignals::getInstance(), &GlobalSignals::setV4lImage, _hyperion, &Hyperion::forwardProtoMessage); connect(GlobalSignals::getInstance(), &GlobalSignals::setV4lImage, _hyperion, &Hyperion::forwardV4lProtoMessage);
} }
else else
{ {

View File

@ -106,8 +106,8 @@ Hyperion::Hyperion(HyperionDaemon* daemon, const quint8& instance, const QString
_ledStringColorOrder.insert(_ledStringColorOrder.begin() + led.index, led.colorOrder); _ledStringColorOrder.insert(_ledStringColorOrder.begin() + led.index, led.colorOrder);
} }
// connect Hyperion::update with Muxer visible priority changes as muxer updates independent // connect Hyperion::handlePriorityChanges with Muxer visible priority changes as muxer updates independent
connect(&_muxer, &PriorityMuxer::visiblePriorityChanged, this, &Hyperion::update); connect(&_muxer, &PriorityMuxer::visiblePriorityChanged, this, &Hyperion::handlePriorityChanges);
// listens for ComponentRegister changes of COMP_ALL to perform core enable/disable actions // listens for ComponentRegister changes of COMP_ALL to perform core enable/disable actions
connect(&_componentRegister, &ComponentRegister::updatedComponentState, this, &Hyperion::updatedComponentState); connect(&_componentRegister, &ComponentRegister::updatedComponentState, this, &Hyperion::updatedComponentState);
@ -186,7 +186,6 @@ void Hyperion::freeObjects(bool emitCloseSignal)
delete _boblightServer; delete _boblightServer;
delete _captureCont; delete _captureCont;
delete _effectEngine; delete _effectEngine;
//delete _deviceSmooth;
delete _raw2ledAdjustment; delete _raw2ledAdjustment;
delete _messageForwarder; delete _messageForwarder;
delete _settingsManager; delete _settingsManager;
@ -209,10 +208,13 @@ void Hyperion::handleSettingsUpdate(const settings::type& type, const QJsonDocum
} }
else if(type == settings::LEDS) else if(type == settings::LEDS)
{ {
QMutexLocker lock(&_changes);
const QJsonArray leds = config.array(); const QJsonArray leds = config.array();
// lock update() // // lock update()
_lockUpdate = true; // _lockUpdate = true;
// stop and cache all running effects, as effects depend heavily on ledlayout // stop and cache all running effects, as effects depend heavily on ledlayout
_effectEngine->cacheRunningEffects(); _effectEngine->cacheRunningEffects();
@ -249,12 +251,13 @@ void Hyperion::handleSettingsUpdate(const settings::type& type, const QJsonDocum
// start cached effects // start cached effects
_effectEngine->startCachedEffects(); _effectEngine->startCachedEffects();
// unlock // // unlock
_lockUpdate = false; // _lockUpdate = false;
} }
else if(type == settings::DEVICE) else if(type == settings::DEVICE)
{ {
_lockUpdate = true; QMutexLocker lock(&_changes);
// _lockUpdate = true;
QJsonObject dev = config.object(); QJsonObject dev = config.object();
// handle hwLedCount update // handle hwLedCount update
@ -278,7 +281,7 @@ void Hyperion::handleSettingsUpdate(const settings::type& type, const QJsonDocum
// do always reinit until the led devices can handle dynamic changes // do always reinit until the led devices can handle dynamic changes
dev["currentLedCount"] = int(_hwLedCount); // Inject led count info dev["currentLedCount"] = int(_hwLedCount); // Inject led count info
_ledDeviceWrapper->createLedDevice(dev); _ledDeviceWrapper->createLedDevice(dev);
_lockUpdate = false; // _lockUpdate = false;
} }
// update once to push single color sets / adjustments/ ledlayout resizes and update ledBuffer color // update once to push single color sets / adjustments/ ledlayout resizes and update ledBuffer color
update(); update();
@ -578,50 +581,25 @@ void Hyperion::updatedComponentState(const hyperion::Components comp, const bool
void Hyperion::update() void Hyperion::update()
{ {
if(_lockUpdate) QMutexLocker lock(&_changes);
return;
// the ledbuffer resize for hwledcount needs to be reverted
if(_hwLedCount > _ledBuffer.size())
_ledBuffer.resize(getLedCount());
// Obtain the current priority channel // Obtain the current priority channel
int priority = _muxer.getCurrentPriority(); int priority = _muxer.getCurrentPriority();
const PriorityMuxer::InputInfo priorityInfo = _muxer.getInputInfo(priority); const PriorityMuxer::InputInfo priorityInfo = _muxer.getInputInfo(priority);
// eval comp change
bool compChanged = false;
if (priorityInfo.componentId != _prevCompId)
{
compChanged = true;
_prevCompId = priorityInfo.componentId;
}
// copy image & process OR copy ledColors from muxer // copy image & process OR copy ledColors from muxer
Image<ColorRgb> image = priorityInfo.image; Image<ColorRgb> image = priorityInfo.image;
if(image.size() > 3) if(image.size() > 3)
{ {
emit currentImage(image); emit currentImage(image);
// disable the black border detector for effects and ledmapping to 0 _ledBuffer = _imageProcessor->process(image);
if(compChanged)
{
_imageProcessor->setBlackbarDetectDisable((_prevCompId == hyperion::COMP_EFFECT));
_imageProcessor->setHardLedMappingType((_prevCompId == hyperion::COMP_EFFECT) ? 0 : -1);
}
_imageProcessor->process(image, _ledBuffer);
} }
else else
{
_ledBuffer = priorityInfo.ledColors; _ledBuffer = priorityInfo.ledColors;
}
// emit rawLedColors before transform // emit rawLedColors before transform
emit rawLedColors(_ledBuffer); emit rawLedColors(_ledBuffer);
// apply adjustments
if(compChanged)
_raw2ledAdjustment->setBacklightEnabled((_prevCompId != hyperion::COMP_COLOR && _prevCompId != hyperion::COMP_EFFECT));
_raw2ledAdjustment->applyAdjustment(_ledBuffer); _raw2ledAdjustment->applyAdjustment(_ledBuffer);
// insert cloned leds into buffer // insert cloned leds into buffer
@ -660,7 +638,8 @@ void Hyperion::update()
} }
i++; i++;
} }
// fill aditional hw leds with black
// fill additional hw leds with black
if ( _hwLedCount > _ledBuffer.size() ) if ( _hwLedCount > _ledBuffer.size() )
{ {
_ledBuffer.resize(_hwLedCount, ColorRgb::BLACK); _ledBuffer.resize(_hwLedCount, ColorRgb::BLACK);
@ -671,7 +650,7 @@ void Hyperion::update()
{ {
_deviceSmooth->selectConfig(priorityInfo.smooth_cfg); _deviceSmooth->selectConfig(priorityInfo.smooth_cfg);
// feed smoothing in pause mode to maintain a smooth transistion back to smoth mode // feed smoothing in pause mode to maintain a smooth transistion back to smooth mode
if (_deviceSmooth->enabled() || _deviceSmooth->pause()) if (_deviceSmooth->enabled() || _deviceSmooth->pause())
_deviceSmooth->setLedValues(_ledBuffer); _deviceSmooth->setLedValues(_ledBuffer);
@ -679,3 +658,20 @@ void Hyperion::update()
emit ledDeviceData(_ledBuffer); emit ledDeviceData(_ledBuffer);
} }
} }
void Hyperion::handlePriorityChanges(const quint8 &priority)
{
QMutexLocker lock(&_changes);
// Obtain the current priority channel
const PriorityMuxer::InputInfo priorityInfo = _muxer.getInputInfo(priority);
// evaluate comp change
if (priorityInfo.componentId != _prevCompId)
{
_imageProcessor->setBlackbarDetectDisable((_prevCompId == hyperion::COMP_EFFECT));
_imageProcessor->setHardLedMappingType((_prevCompId == hyperion::COMP_EFFECT) ? 0 : -1);
_prevCompId = priorityInfo.componentId;
_raw2ledAdjustment->setBacklightEnabled((_prevCompId != hyperion::COMP_COLOR && _prevCompId != hyperion::COMP_EFFECT));
}
}

View File

@ -3,7 +3,6 @@
// STL includes // STL includes
#include <vector> #include <vector>
// Qt includes // Qt includes
#include <QVector> #include <QVector>

View File

@ -83,9 +83,12 @@ void MessageForwarder::handleSettingsUpdate(const settings::type &type, const QJ
if (!_protoSlaves.isEmpty() && obj["enable"].toBool() && _forwarder_enabled) if (!_protoSlaves.isEmpty() && obj["enable"].toBool() && _forwarder_enabled)
{ {
InfoIf(obj["enable"].toBool(true), _log, "Forward now to proto targets '%s'", QSTRING_CSTR(_protoSlaves.join(", "))); InfoIf(obj["enable"].toBool(true), _log, "Forward now to proto targets '%s'", QSTRING_CSTR(_protoSlaves.join(", ")));
connect(_hyperion, &Hyperion::forwardProtoMessage, this, &MessageForwarder::forwardProtoMessage, Qt::UniqueConnection); // connect(_hyperion, &Hyperion::forwardProtoMessage, this, &MessageForwarder::forwardProtoMessage, Qt::UniqueConnection);
} else if ( _protoSlaves.isEmpty() || ! obj["enable"].toBool() || !_forwarder_enabled) } else if ( _protoSlaves.isEmpty() || ! obj["enable"].toBool() || !_forwarder_enabled)
disconnect(_hyperion, &Hyperion::forwardProtoMessage, 0, 0); {
disconnect(_hyperion, &Hyperion::forwardSystemProtoMessage, 0, 0);
disconnect(_hyperion, &Hyperion::forwardV4lProtoMessage, 0, 0);
}
// update comp state // update comp state
_hyperion->getComponentRegister().componentStateChanged(hyperion::COMP_FORWARDER, obj["enable"].toBool(true)); _hyperion->getComponentRegister().componentStateChanged(hyperion::COMP_FORWARDER, obj["enable"].toBool(true));
@ -112,8 +115,8 @@ void MessageForwarder::handlePriorityChanges(const quint8 &priority)
while (!_forwardClients.isEmpty()) while (!_forwardClients.isEmpty())
delete _forwardClients.takeFirst(); delete _forwardClients.takeFirst();
hyperion::Components activePrio = _hyperion->getPriorityInfo(priority).componentId; hyperion::Components activeCompId = _hyperion->getPriorityInfo(priority).componentId;
if (activePrio == hyperion::COMP_GRABBER || activePrio == hyperion::COMP_V4L) if (activeCompId == hyperion::COMP_GRABBER || activeCompId == hyperion::COMP_V4L)
{ {
if ( !obj["proto"].isNull() ) if ( !obj["proto"].isNull() )
{ {
@ -123,10 +126,33 @@ void MessageForwarder::handlePriorityChanges(const quint8 &priority)
addProtoSlave(entry.toString()); addProtoSlave(entry.toString());
} }
} }
connect(_hyperion, &Hyperion::forwardProtoMessage, this, &MessageForwarder::forwardProtoMessage, Qt::UniqueConnection);
switch(activeCompId)
{
case hyperion::COMP_GRABBER:
{
disconnect(_hyperion, &Hyperion::forwardV4lProtoMessage, 0, 0);
connect(_hyperion, &Hyperion::forwardSystemProtoMessage, this, &MessageForwarder::forwardProtoMessage, Qt::UniqueConnection);
}
break;
case hyperion::COMP_V4L:
{
disconnect(_hyperion, &Hyperion::forwardSystemProtoMessage, 0, 0);
connect(_hyperion, &Hyperion::forwardV4lProtoMessage, this, &MessageForwarder::forwardProtoMessage, Qt::UniqueConnection);
}
break;
default:
{
disconnect(_hyperion, &Hyperion::forwardSystemProtoMessage, 0, 0);
disconnect(_hyperion, &Hyperion::forwardV4lProtoMessage, 0, 0);
}
}
} }
else else
disconnect(_hyperion, &Hyperion::forwardProtoMessage, 0, 0); {
disconnect(_hyperion, &Hyperion::forwardSystemProtoMessage, 0, 0);
disconnect(_hyperion, &Hyperion::forwardV4lProtoMessage, 0, 0);
}
} }
} }

View File

@ -10,6 +10,8 @@
#include "hyperion/Hyperion.h" #include "hyperion/Hyperion.h"
#include <utils/JsonUtils.h> #include <utils/JsonUtils.h>
#include <QDebug>
LedDevice::LedDevice(const QJsonObject& config, QObject* parent) LedDevice::LedDevice(const QJsonObject& config, QObject* parent)
: QObject(parent) : QObject(parent)
, _devConfig(config) , _devConfig(config)
@ -43,21 +45,12 @@ void LedDevice::setEnable(bool enable)
{ {
// emit signal when state changed // emit signal when state changed
if (_enabled != enable) if (_enabled != enable)
{
emit enableStateChanged(enable); emit enableStateChanged(enable);
}
// set black to leds when they should go off // set black to leds when they should go off
if ( _enabled && !enable) if ( _enabled && !enable)
{
switchOff(); switchOff();
}
else {
if ( !_enabled && enable)
{
switchOn();
}
}
_enabled = enable; _enabled = enable;
} }

View File

@ -41,25 +41,26 @@ LedDeviceWrapper::~LedDeviceWrapper()
void LedDeviceWrapper::createLedDevice(const QJsonObject& config) void LedDeviceWrapper::createLedDevice(const QJsonObject& config)
{ {
if(_ledDevice != nullptr) if(_ledDevice != nullptr)
{ {
stopDeviceThread(); stopDeviceThread();
} }
// create thread and device // create thread and device
QThread* thread = new QThread(this); QThread* thread = new QThread(this);
_ledDevice = LedDeviceFactory::construct(config); _ledDevice = LedDeviceFactory::construct(config);
_ledDevice->moveToThread(thread); _ledDevice->moveToThread(thread);
// setup thread management // setup thread management
connect(thread, &QThread::started, _ledDevice, &LedDevice::start); connect(thread, &QThread::started, _ledDevice, &LedDevice::start);
connect(thread, &QThread::finished, thread, &QObject::deleteLater); connect(thread, &QThread::finished, thread, &QObject::deleteLater);
connect(thread, &QThread::finished, _ledDevice, &QObject::deleteLater); connect(thread, &QThread::finished, _ledDevice, &QObject::deleteLater);
// further signals // further signals
connect(this, &LedDeviceWrapper::write, _ledDevice, &LedDevice::write); connect(this, &LedDeviceWrapper::write, _ledDevice, &LedDevice::write);
connect(_ledDevice, &LedDevice::enableStateChanged, this, &LedDeviceWrapper::handleInternalEnableState); connect(_hyperion->getMuxerInstance(), &PriorityMuxer::visiblePriorityChanged, _ledDevice, &LedDevice::visiblePriorityChanged);
connect(_ledDevice, &LedDevice::enableStateChanged, this, &LedDeviceWrapper::handleInternalEnableState);
// start the thread // start the thread
thread->start(); thread->start();
} }
const QJsonObject LedDeviceWrapper::getLedDeviceSchemas() const QJsonObject LedDeviceWrapper::getLedDeviceSchemas()

View File

@ -5,17 +5,17 @@ static const unsigned OPC_SET_PIXELS = 0; // OPC command codes
static const unsigned OPC_SYS_EX = 255; // OPC command codes static const unsigned OPC_SYS_EX = 255; // OPC command codes
static const unsigned OPC_HEADER_SIZE = 4; // OPC header size static const unsigned OPC_HEADER_SIZE = 4; // OPC header size
LedDeviceFadeCandy::LedDeviceFadeCandy(const QJsonObject &deviceConfig) LedDeviceFadeCandy::LedDeviceFadeCandy(const QJsonObject &deviceConfig)
: LedDevice() : LedDevice()
, _client(nullptr)
{ {
_deviceReady = init(deviceConfig); _deviceReady = init(deviceConfig);
_client = new QTcpSocket(this);
} }
LedDeviceFadeCandy::~LedDeviceFadeCandy() LedDeviceFadeCandy::~LedDeviceFadeCandy()
{ {
_client.close(); _client->close();
} }
LedDevice* LedDeviceFadeCandy::construct(const QJsonObject &deviceConfig) LedDevice* LedDeviceFadeCandy::construct(const QJsonObject &deviceConfig)
@ -23,10 +23,9 @@ LedDevice* LedDeviceFadeCandy::construct(const QJsonObject &deviceConfig)
return new LedDeviceFadeCandy(deviceConfig); return new LedDeviceFadeCandy(deviceConfig);
} }
bool LedDeviceFadeCandy::init(const QJsonObject &deviceConfig) bool LedDeviceFadeCandy::init(const QJsonObject &deviceConfig)
{ {
_client.close(); LedDevice::init(deviceConfig);
if (_ledCount > MAX_NUM_LEDS) if (_ledCount > MAX_NUM_LEDS)
{ {
@ -67,15 +66,14 @@ bool LedDeviceFadeCandy::init(const QJsonObject &deviceConfig)
bool LedDeviceFadeCandy::isConnected() bool LedDeviceFadeCandy::isConnected()
{ {
return _client.state() == QAbstractSocket::ConnectedState; return _client->state() == QAbstractSocket::ConnectedState;
} }
bool LedDeviceFadeCandy::tryConnect() bool LedDeviceFadeCandy::tryConnect()
{ {
if ( _client.state() == QAbstractSocket::UnconnectedState ) { if ( _client->state() == QAbstractSocket::UnconnectedState ) {
_client.connectToHost( _host, _port); _client->connectToHost( _host, _port);
if ( _client.waitForConnected(1000) ) if ( _client->waitForConnected(1000) )
{ {
Info(_log,"fadecandy/opc: connected to %s:%i on channel %i", QSTRING_CSTR(_host), _port, _channel); Info(_log,"fadecandy/opc: connected to %s:%i on channel %i", QSTRING_CSTR(_host), _port, _channel);
if (_setFcConfig) if (_setFcConfig)
@ -88,7 +86,6 @@ bool LedDeviceFadeCandy::tryConnect()
return isConnected(); return isConnected();
} }
int LedDeviceFadeCandy::write( const std::vector<ColorRgb> & ledValues ) int LedDeviceFadeCandy::write( const std::vector<ColorRgb> & ledValues )
{ {
uint idx = OPC_HEADER_SIZE; uint idx = OPC_HEADER_SIZE;
@ -103,11 +100,11 @@ int LedDeviceFadeCandy::write( const std::vector<ColorRgb> & ledValues )
return ( transferData()<0 ? -1 : 0 ); return ( transferData()<0 ? -1 : 0 );
} }
int LedDeviceFadeCandy::transferData() int LedDeviceFadeCandy::transferData()
{ {
if ( isConnected() || tryConnect() ) if (LedDevice::enabled())
return _client.write( _opc_data, _opc_data.size() ); if ( isConnected() || tryConnect() )
return _client->write( _opc_data, _opc_data.size() );
return -2; return -2;
} }
@ -131,7 +128,7 @@ int LedDeviceFadeCandy::sendSysEx(uint8_t systemId, uint8_t commandId, QByteArra
sysExData += msg; sysExData += msg;
return _client.write( sysExData, sysExData.size() ); return _client->write( sysExData, sysExData.size() );
} }
return -1; return -1;
} }

View File

@ -56,17 +56,18 @@ public:
/// @return true if success /// @return true if success
bool init(const QJsonObject &deviceConfig); bool init(const QJsonObject &deviceConfig);
private:
/// ///
/// Writes the led color values to the led-device /// Writes the led color values to the led-device
/// ///
/// @param ledValues The color-value per led /// @param ledValues The color-value per led
/// @return Zero on succes else negative /// @return Zero on succes else negative
/// ///
virtual int write(const std::vector<ColorRgb> & ledValues); virtual int write(const std::vector<ColorRgb>& ledValues);
private: protected:
QTcpSocket _client; QTcpSocket* _client;
QString _host; QString _host;
uint16_t _port; uint16_t _port;
unsigned _channel; unsigned _channel;
QByteArray _opc_data; QByteArray _opc_data;

View File

@ -41,7 +41,7 @@ public:
protected: protected:
/// ///
/// Writes the given bytes/bits to the SPI-device and sleeps the latch time to ensure that the /// Writes the given bytes/bits to the UDP-device and sleeps the latch time to ensure that the
/// values are latched. /// values are latched.
/// ///
/// @param[in] size The length of the data /// @param[in] size The length of the data

View File

@ -77,6 +77,7 @@
"gamma" : { "gamma" : {
"type" : "number", "type" : "number",
"title" : "edt_dev_spec_gamma_title", "title" : "edt_dev_spec_gamma_title",
"default": 1.0,
"minimum" : 0.1, "minimum" : 0.1,
"maximum": 5.0, "maximum": 5.0,
"options": { "options": {

View File

@ -75,6 +75,7 @@ HyperionDaemon::HyperionDaemon(QString configFile, const QString rootPath, QObje
qRegisterMetaType<settings::type>("settings::type"); qRegisterMetaType<settings::type>("settings::type");
qRegisterMetaType<VideoMode>("VideoMode"); qRegisterMetaType<VideoMode>("VideoMode");
qRegisterMetaType<QMap<quint8,QJsonObject>>("QMap<quint8,QJsonObject>"); qRegisterMetaType<QMap<quint8,QJsonObject>>("QMap<quint8,QJsonObject>");
qRegisterMetaType<std::vector<ColorRgb>>("std::vector<ColorRgb>");
// init settings // init settings
_settingsManager = new SettingsManager(0,configFile); _settingsManager = new SettingsManager(0,configFile);