mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
Merge pull request #576 from Paulchen-Panther/fadecandy
Bugfix/Hotfix/Update
This commit is contained in:
commit
3e55aa4886
@ -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,
|
||||||
|
@ -33,7 +33,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.
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
@ -560,12 +563,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;
|
||||||
};
|
};
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -106,9 +106,6 @@ 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(&_muxer, &PriorityMuxer::visiblePriorityChanged, this, &Hyperion::update);
|
|
||||||
|
|
||||||
// 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 +183,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 +205,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 +248,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 +278,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();
|
||||||
@ -562,66 +562,42 @@ const QString & Hyperion::getActiveDevice()
|
|||||||
|
|
||||||
void Hyperion::updatedComponentState(const hyperion::Components comp, const bool state)
|
void Hyperion::updatedComponentState(const hyperion::Components comp, const bool state)
|
||||||
{
|
{
|
||||||
if(comp == hyperion::COMP_ALL)
|
QMutexLocker lock(&_changes);
|
||||||
|
|
||||||
|
// evaluate comp change
|
||||||
|
if (comp != _prevCompId)
|
||||||
{
|
{
|
||||||
if(state)
|
_imageProcessor->setBlackbarDetectDisable((_prevCompId == hyperion::COMP_EFFECT));
|
||||||
{
|
_imageProcessor->setHardLedMappingType((_prevCompId == hyperion::COMP_EFFECT) ? 0 : -1);
|
||||||
// first muxer to update all inputs
|
_prevCompId = comp;
|
||||||
_muxer.setEnable(state);
|
_raw2ledAdjustment->setBacklightEnabled((_prevCompId != hyperion::COMP_COLOR && _prevCompId != hyperion::COMP_EFFECT));
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_muxer.setEnable(state);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(comp == hyperion::COMP_ALL)
|
||||||
|
_muxer.setEnable(state); // first muxer to update all inputs
|
||||||
}
|
}
|
||||||
|
|
||||||
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 +636,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 +648,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);
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
// STL includes
|
// STL includes
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
// Qt includes
|
// Qt includes
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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": {
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user