mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
Clone single led color from other led (#157)
* start ledclone * led cloning: clone scan areas from original led main: show exceptions, better exit * tune json schema for new option. somwe cleanup * fix warnings and bug for framebuffer selection. thx to clang brought by new osx buikld on travis * make ledclone feature work flawlessly for effects too. Effect sees the ledstring without cloned leds. cloned leds will be inserted just before sending to leddevice additional: remove warnings and fix code style * fix warning
This commit is contained in:
parent
a56f98b085
commit
197af35de0
@ -268,6 +268,7 @@ public:
|
|||||||
* @return The constructed ledstring
|
* @return The constructed ledstring
|
||||||
*/
|
*/
|
||||||
static LedString createLedString(const Json::Value & ledsConfig, const ColorOrder deviceOrder);
|
static LedString createLedString(const Json::Value & ledsConfig, const ColorOrder deviceOrder);
|
||||||
|
static LedString createLedStringClone(const Json::Value & ledsConfig, const ColorOrder deviceOrder);
|
||||||
|
|
||||||
static MultiColorTransform * createLedColorsTransform(const unsigned ledCnt, const Json::Value & colorTransformConfig);
|
static MultiColorTransform * createLedColorsTransform(const unsigned ledCnt, const Json::Value & colorTransformConfig);
|
||||||
static MultiColorCorrection * createLedColorsTemperature(const unsigned ledCnt, const Json::Value & colorTemperatureConfig);
|
static MultiColorCorrection * createLedColorsTemperature(const unsigned ledCnt, const Json::Value & colorTemperatureConfig);
|
||||||
@ -312,6 +313,10 @@ private:
|
|||||||
/// The specifiation of the led frame construction and picture integration
|
/// The specifiation of the led frame construction and picture integration
|
||||||
LedString _ledString;
|
LedString _ledString;
|
||||||
|
|
||||||
|
/// specifiation of cloned leds
|
||||||
|
LedString _ledStringClone;
|
||||||
|
|
||||||
|
std::vector<ColorOrder> _ledStringColorOrder;
|
||||||
/// The priority muxer
|
/// The priority muxer
|
||||||
PriorityMuxer _muxer;
|
PriorityMuxer _muxer;
|
||||||
|
|
||||||
@ -368,4 +373,5 @@ private:
|
|||||||
|
|
||||||
/// holds the current priority channel that is manualy selected
|
/// holds the current priority channel that is manualy selected
|
||||||
int _currentSourcePriority;
|
int _currentSourcePriority;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -97,6 +97,8 @@ struct Led
|
|||||||
double minY_frac;
|
double minY_frac;
|
||||||
/// The maximum horizontal scan line included for this leds color
|
/// The maximum horizontal scan line included for this leds color
|
||||||
double maxY_frac;
|
double maxY_frac;
|
||||||
|
/// id to clone
|
||||||
|
int clone;
|
||||||
/// the color order
|
/// the color order
|
||||||
ColorOrder colorOrder;
|
ColorOrder colorOrder;
|
||||||
};
|
};
|
||||||
|
@ -50,18 +50,18 @@ void Effect::registerHyperionExtensionModule()
|
|||||||
PyImport_AppendInittab("hyperion", &PyInit_hyperion);
|
PyImport_AppendInittab("hyperion", &PyInit_hyperion);
|
||||||
}
|
}
|
||||||
|
|
||||||
Effect::Effect(PyThreadState * mainThreadState, int priority, int timeout, const std::string & script, const Json::Value & args) :
|
Effect::Effect(PyThreadState * mainThreadState, int priority, int timeout, const std::string & script, const Json::Value & args)
|
||||||
QThread(),
|
: QThread()
|
||||||
_mainThreadState(mainThreadState),
|
, _mainThreadState(mainThreadState)
|
||||||
_priority(priority),
|
, _priority(priority)
|
||||||
_timeout(timeout),
|
, _timeout(timeout)
|
||||||
_script(script),
|
, _script(script)
|
||||||
_args(args),
|
, _args(args)
|
||||||
_endTime(-1),
|
, _endTime(-1)
|
||||||
_interpreterThreadState(nullptr),
|
, _interpreterThreadState(nullptr)
|
||||||
_abortRequested(false),
|
, _abortRequested(false)
|
||||||
_imageProcessor(ImageProcessorFactory::getInstance().newImageProcessor()),
|
, _imageProcessor(ImageProcessorFactory::getInstance().newImageProcessor())
|
||||||
_colors()
|
, _colors()
|
||||||
{
|
{
|
||||||
_colors.resize(_imageProcessor->getLedCount(), ColorRgb::BLACK);
|
_colors.resize(_imageProcessor->getLedCount(), ColorRgb::BLACK);
|
||||||
|
|
||||||
|
@ -18,12 +18,12 @@
|
|||||||
#include "Effect.h"
|
#include "Effect.h"
|
||||||
#include "HyperionConfig.h"
|
#include "HyperionConfig.h"
|
||||||
|
|
||||||
EffectEngine::EffectEngine(Hyperion * hyperion, const Json::Value & jsonEffectConfig) :
|
EffectEngine::EffectEngine(Hyperion * hyperion, const Json::Value & jsonEffectConfig)
|
||||||
_hyperion(hyperion),
|
: _hyperion(hyperion)
|
||||||
_availableEffects(),
|
, _availableEffects()
|
||||||
_activeEffects(),
|
, _activeEffects()
|
||||||
_mainThreadState(nullptr),
|
, _mainThreadState(nullptr)
|
||||||
_log(Logger::getInstance("EFFECTENGINE"))
|
, _log(Logger::getInstance("EFFECTENGINE"))
|
||||||
{
|
{
|
||||||
qRegisterMetaType<std::vector<ColorRgb>>("std::vector<ColorRgb>");
|
qRegisterMetaType<std::vector<ColorRgb>>("std::vector<ColorRgb>");
|
||||||
|
|
||||||
|
@ -54,31 +54,7 @@ Hyperion* Hyperion::getInstance()
|
|||||||
|
|
||||||
ColorOrder Hyperion::createColorOrder(const Json::Value &deviceConfig)
|
ColorOrder Hyperion::createColorOrder(const Json::Value &deviceConfig)
|
||||||
{
|
{
|
||||||
std::string order = deviceConfig.get("colorOrder", "rgb").asString();
|
return stringToColorOrder( deviceConfig.get("colorOrder", "rgb").asString() );
|
||||||
if (order == "bgr")
|
|
||||||
{
|
|
||||||
return ORDER_BGR;
|
|
||||||
}
|
|
||||||
if (order == "rbg")
|
|
||||||
{
|
|
||||||
return ORDER_RBG;
|
|
||||||
}
|
|
||||||
if (order == "brg")
|
|
||||||
{
|
|
||||||
return ORDER_BRG;
|
|
||||||
}
|
|
||||||
if (order == "gbr")
|
|
||||||
{
|
|
||||||
return ORDER_GBR;
|
|
||||||
}
|
|
||||||
if (order == "grb")
|
|
||||||
{
|
|
||||||
return ORDER_GRB;
|
|
||||||
}
|
|
||||||
|
|
||||||
WarningIf( order != "rgb", Logger::getInstance("Core"), "Unknown color order defined (%s). Using RGB.", order.c_str());
|
|
||||||
|
|
||||||
return ORDER_RGB;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ColorTransform * Hyperion::createColorTransform(const Json::Value & transformConfig)
|
ColorTransform * Hyperion::createColorTransform(const Json::Value & transformConfig)
|
||||||
@ -443,20 +419,27 @@ RgbChannelAdjustment* Hyperion::createRgbChannelAdjustment(const Json::Value& co
|
|||||||
LedString Hyperion::createLedString(const Json::Value& ledsConfig, const ColorOrder deviceOrder)
|
LedString Hyperion::createLedString(const Json::Value& ledsConfig, const ColorOrder deviceOrder)
|
||||||
{
|
{
|
||||||
LedString ledString;
|
LedString ledString;
|
||||||
|
|
||||||
const std::string deviceOrderStr = colorOrderToString(deviceOrder);
|
const std::string deviceOrderStr = colorOrderToString(deviceOrder);
|
||||||
|
int maxLedId = ledsConfig.size();
|
||||||
for (const Json::Value& ledConfig : ledsConfig)
|
for (const Json::Value& ledConfig : ledsConfig)
|
||||||
{
|
{
|
||||||
Led led;
|
Led led;
|
||||||
led.index = ledConfig["index"].asInt();
|
led.index = ledConfig["index"].asInt();
|
||||||
|
led.clone = ledConfig.get("clone",-1).asInt();
|
||||||
|
if ( led.clone < -1 || led.clone >= maxLedId )
|
||||||
|
{
|
||||||
|
Warning(Logger::getInstance("Core"), "LED %d: clone index of %d is out of range, clone ignored", led.index, led.clone);
|
||||||
|
led.clone = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( led.clone < 0 )
|
||||||
|
{
|
||||||
const Json::Value& hscanConfig = ledConfig["hscan"];
|
const Json::Value& hscanConfig = ledConfig["hscan"];
|
||||||
const Json::Value& vscanConfig = ledConfig["vscan"];
|
const Json::Value& vscanConfig = ledConfig["vscan"];
|
||||||
led.minX_frac = std::max(0.0, std::min(1.0, hscanConfig["minimum"].asDouble()));
|
led.minX_frac = std::max(0.0, std::min(1.0, hscanConfig["minimum"].asDouble()));
|
||||||
led.maxX_frac = std::max(0.0, std::min(1.0, hscanConfig["maximum"].asDouble()));
|
led.maxX_frac = std::max(0.0, std::min(1.0, hscanConfig["maximum"].asDouble()));
|
||||||
led.minY_frac = std::max(0.0, std::min(1.0, vscanConfig["minimum"].asDouble()));
|
led.minY_frac = std::max(0.0, std::min(1.0, vscanConfig["minimum"].asDouble()));
|
||||||
led.maxY_frac = std::max(0.0, std::min(1.0, vscanConfig["maximum"].asDouble()));
|
led.maxY_frac = std::max(0.0, std::min(1.0, vscanConfig["maximum"].asDouble()));
|
||||||
|
|
||||||
// Fix if the user swapped min and max
|
// Fix if the user swapped min and max
|
||||||
if (led.minX_frac > led.maxX_frac)
|
if (led.minX_frac > led.maxX_frac)
|
||||||
{
|
{
|
||||||
@ -468,15 +451,49 @@ LedString Hyperion::createLedString(const Json::Value& ledsConfig, const ColorOr
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the order of the rgb channels for this led (default is device order)
|
// Get the order of the rgb channels for this led (default is device order)
|
||||||
const std::string ledOrderStr = ledConfig.get("colorOrder", deviceOrderStr).asString();
|
led.colorOrder = stringToColorOrder(ledConfig.get("colorOrder", deviceOrderStr).asString());
|
||||||
led.colorOrder = stringToColorOrder(ledOrderStr);
|
|
||||||
|
|
||||||
ledString.leds().push_back(led);
|
ledString.leds().push_back(led);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Make sure the leds are sorted (on their indices)
|
// Make sure the leds are sorted (on their indices)
|
||||||
std::sort(ledString.leds().begin(), ledString.leds().end(), [](const Led& lhs, const Led& rhs){ return lhs.index < rhs.index; });
|
std::sort(ledString.leds().begin(), ledString.leds().end(), [](const Led& lhs, const Led& rhs){ return lhs.index < rhs.index; });
|
||||||
|
return ledString;
|
||||||
|
}
|
||||||
|
|
||||||
|
LedString Hyperion::createLedStringClone(const Json::Value& ledsConfig, const ColorOrder deviceOrder)
|
||||||
|
{
|
||||||
|
LedString ledString;
|
||||||
|
const std::string deviceOrderStr = colorOrderToString(deviceOrder);
|
||||||
|
int maxLedId = ledsConfig.size();
|
||||||
|
for (const Json::Value& ledConfig : ledsConfig)
|
||||||
|
{
|
||||||
|
Led led;
|
||||||
|
led.index = ledConfig["index"].asInt();
|
||||||
|
led.clone = ledConfig.get("clone",-1).asInt();
|
||||||
|
if ( led.clone < -1 || led.clone >= maxLedId )
|
||||||
|
{
|
||||||
|
Warning(Logger::getInstance("Core"), "LED %d: clone index of %d is out of range, clone ignored", led.index, led.clone);
|
||||||
|
led.clone = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( led.clone >= 0 )
|
||||||
|
{
|
||||||
|
Debug(Logger::getInstance("Core"), "LED %d: clone from led %d", led.index, led.clone);
|
||||||
|
led.minX_frac = 0;
|
||||||
|
led.maxX_frac = 0;
|
||||||
|
led.minY_frac = 0;
|
||||||
|
led.maxY_frac = 0;
|
||||||
|
// Get the order of the rgb channels for this led (default is device order)
|
||||||
|
led.colorOrder = stringToColorOrder(ledConfig.get("colorOrder", deviceOrderStr).asString());
|
||||||
|
|
||||||
|
ledString.leds().push_back(led);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure the leds are sorted (on their indices)
|
||||||
|
std::sort(ledString.leds().begin(), ledString.leds().end(), [](const Led& lhs, const Led& rhs){ return lhs.index < rhs.index; });
|
||||||
return ledString;
|
return ledString;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -543,6 +560,7 @@ MessageForwarder * Hyperion::getForwarder()
|
|||||||
|
|
||||||
Hyperion::Hyperion(const Json::Value &jsonConfig, const std::string configFile)
|
Hyperion::Hyperion(const Json::Value &jsonConfig, const std::string configFile)
|
||||||
: _ledString(createLedString(jsonConfig["leds"], createColorOrder(jsonConfig["device"])))
|
: _ledString(createLedString(jsonConfig["leds"], createColorOrder(jsonConfig["device"])))
|
||||||
|
, _ledStringClone(createLedStringClone(jsonConfig["leds"], createColorOrder(jsonConfig["device"])))
|
||||||
, _muxer(_ledString.leds().size())
|
, _muxer(_ledString.leds().size())
|
||||||
, _raw2ledTransform(createLedColorsTransform(_ledString.leds().size(), jsonConfig["color"]))
|
, _raw2ledTransform(createLedColorsTransform(_ledString.leds().size(), jsonConfig["color"]))
|
||||||
, _raw2ledTemperature(createLedColorsTemperature(_ledString.leds().size(), jsonConfig["color"]))
|
, _raw2ledTemperature(createLedColorsTemperature(_ledString.leds().size(), jsonConfig["color"]))
|
||||||
@ -595,7 +613,7 @@ Hyperion::Hyperion(const Json::Value &jsonConfig, const std::string configFile)
|
|||||||
QObject::connect(&_timer, SIGNAL(timeout()), this, SLOT(update()));
|
QObject::connect(&_timer, SIGNAL(timeout()), this, SLOT(update()));
|
||||||
|
|
||||||
// create the effect engine
|
// create the effect engine
|
||||||
_effectEngine = new EffectEngine(this, jsonConfig["effects"]);
|
_effectEngine = new EffectEngine(this,jsonConfig["effects"]);
|
||||||
|
|
||||||
unsigned int hwLedCount = jsonConfig["device"].get("ledCount",getLedCount()).asUInt();
|
unsigned int hwLedCount = jsonConfig["device"].get("ledCount",getLedCount()).asUInt();
|
||||||
_hwLedCount = std::max(hwLedCount, getLedCount());
|
_hwLedCount = std::max(hwLedCount, getLedCount());
|
||||||
@ -867,14 +885,32 @@ void Hyperion::update()
|
|||||||
if (_adjustmentEnabled) _raw2ledAdjustment->applyAdjustment(_ledBuffer);
|
if (_adjustmentEnabled) _raw2ledAdjustment->applyAdjustment(_ledBuffer);
|
||||||
if (_temperatureEnabled) _raw2ledTemperature->applyCorrection(_ledBuffer);
|
if (_temperatureEnabled) _raw2ledTemperature->applyCorrection(_ledBuffer);
|
||||||
|
|
||||||
const std::vector<Led>& leds = _ledString.leds();
|
// init colororder vector, if nempty
|
||||||
|
if (_ledStringColorOrder.empty())
|
||||||
|
{
|
||||||
|
for (Led& led : _ledString.leds())
|
||||||
|
{
|
||||||
|
_ledStringColorOrder.push_back(led.colorOrder);
|
||||||
|
}
|
||||||
|
for (Led& led : _ledStringClone.leds())
|
||||||
|
{
|
||||||
|
_ledStringColorOrder.insert(_ledStringColorOrder.begin() + led.index, led.colorOrder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// insert cloned leds into buffer
|
||||||
|
for (Led& led : _ledStringClone.leds())
|
||||||
|
{
|
||||||
|
_ledBuffer.insert(_ledBuffer.begin() + led.index, _ledBuffer.at(led.clone));
|
||||||
|
}
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (ColorRgb& color : _ledBuffer)
|
for (ColorRgb& color : _ledBuffer)
|
||||||
{
|
{
|
||||||
const ColorOrder ledColorOrder = leds.at(i).colorOrder;
|
//const ColorOrder ledColorOrder = leds.at(i).colorOrder;
|
||||||
|
|
||||||
// correct the color byte order
|
// correct the color byte order
|
||||||
switch (ledColorOrder)
|
switch (_ledStringColorOrder.at(i))
|
||||||
{
|
{
|
||||||
case ORDER_RGB:
|
case ORDER_RGB:
|
||||||
// leave as it is
|
// leave as it is
|
||||||
|
@ -33,19 +33,19 @@
|
|||||||
},
|
},
|
||||||
"output" :
|
"output" :
|
||||||
{
|
{
|
||||||
"type" : "string",
|
"type" : "string"
|
||||||
"required" : true
|
|
||||||
},
|
},
|
||||||
"rate" :
|
"rate" :
|
||||||
{
|
{
|
||||||
"type" : "integer",
|
"type" : "integer",
|
||||||
"required" : false,
|
|
||||||
"minimum" : 0
|
"minimum" : 0
|
||||||
},
|
},
|
||||||
"colorOrder" :
|
"colorOrder" :
|
||||||
{
|
{
|
||||||
"type" : "string",
|
"type":
|
||||||
"required" : false
|
{
|
||||||
|
"enum" : ["bgr", "rbg", "brg", "gbr", "grb"]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties" : true
|
"additionalProperties" : true
|
||||||
@ -852,20 +852,27 @@
|
|||||||
"type":"integer",
|
"type":"integer",
|
||||||
"required":true
|
"required":true
|
||||||
},
|
},
|
||||||
|
"clone":
|
||||||
|
{
|
||||||
|
"type":"integer"
|
||||||
|
},
|
||||||
"hscan":
|
"hscan":
|
||||||
{
|
{
|
||||||
"type":"object",
|
"type":"object",
|
||||||
"required":true,
|
|
||||||
"properties":
|
"properties":
|
||||||
{
|
{
|
||||||
"minimum":
|
"minimum":
|
||||||
{
|
{
|
||||||
"type":"number",
|
"type":"number",
|
||||||
|
"minimum" : 0,
|
||||||
|
"maximum" : 1,
|
||||||
"required":true
|
"required":true
|
||||||
},
|
},
|
||||||
"maximum":
|
"maximum":
|
||||||
{
|
{
|
||||||
"type":"number",
|
"type":"number",
|
||||||
|
"minimum" : 0,
|
||||||
|
"maximum" : 1,
|
||||||
"required":true
|
"required":true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -874,17 +881,20 @@
|
|||||||
"vscan":
|
"vscan":
|
||||||
{
|
{
|
||||||
"type":"object",
|
"type":"object",
|
||||||
"required":true,
|
|
||||||
"properties":
|
"properties":
|
||||||
{
|
{
|
||||||
"minimum":
|
"minimum":
|
||||||
{
|
{
|
||||||
"type":"number",
|
"type":"number",
|
||||||
|
"minimum" : 0,
|
||||||
|
"maximum" : 1,
|
||||||
"required":true
|
"required":true
|
||||||
},
|
},
|
||||||
"maximum":
|
"maximum":
|
||||||
{
|
{
|
||||||
"type":"number",
|
"type":"number",
|
||||||
|
"minimum" : 0,
|
||||||
|
"maximum" : 1,
|
||||||
"required":true
|
"required":true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -892,8 +902,10 @@
|
|||||||
},
|
},
|
||||||
"colorOrder":
|
"colorOrder":
|
||||||
{
|
{
|
||||||
"type":"string",
|
"type":
|
||||||
"required":false
|
{
|
||||||
|
"enum" : ["bgr", "rbg", "brg", "gbr", "grb"]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties" : false
|
"additionalProperties" : false
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
// Build configuration
|
// Build configuration
|
||||||
#include <HyperionConfig.h>
|
#include <HyperionConfig.h>
|
||||||
@ -62,6 +63,8 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig)
|
|||||||
std::transform(type.begin(), type.end(), type.begin(), ::tolower);
|
std::transform(type.begin(), type.end(), type.begin(), ::tolower);
|
||||||
|
|
||||||
LedDevice* device = nullptr;
|
LedDevice* device = nullptr;
|
||||||
|
try
|
||||||
|
{
|
||||||
if (false) {}
|
if (false) {}
|
||||||
else if (type == "adalight")
|
else if (type == "adalight")
|
||||||
{
|
{
|
||||||
@ -79,7 +82,7 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig)
|
|||||||
deviceConfig.get("delayAfterConnect",500).asInt()
|
deviceConfig.get("delayAfterConnect",500).asInt()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_SPIDEV
|
#ifdef ENABLE_SPIDEV
|
||||||
else if (type == "lpd6803" || type == "ldp6803")
|
else if (type == "lpd6803" || type == "ldp6803")
|
||||||
{
|
{
|
||||||
device = new LedDeviceLpd6803(
|
device = new LedDeviceLpd6803(
|
||||||
@ -131,8 +134,8 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig)
|
|||||||
deviceConfig.get("white_algorithm","").asString()
|
deviceConfig.get("white_algorithm","").asString()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef ENABLE_TINKERFORGE
|
#ifdef ENABLE_TINKERFORGE
|
||||||
else if (type=="tinkerforge")
|
else if (type=="tinkerforge")
|
||||||
{
|
{
|
||||||
device = new LedDeviceTinkerforge(
|
device = new LedDeviceTinkerforge(
|
||||||
@ -143,7 +146,7 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig)
|
|||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if (type == "rawhid")
|
else if (type == "rawhid")
|
||||||
{
|
{
|
||||||
const int delay_ms = deviceConfig["delayAfterConnect"].asInt();
|
const int delay_ms = deviceConfig["delayAfterConnect"].asInt();
|
||||||
@ -259,7 +262,6 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig)
|
|||||||
{
|
{
|
||||||
device = new LedDeviceUdp(
|
device = new LedDeviceUdp(
|
||||||
deviceConfig["output"].asString(),
|
deviceConfig["output"].asString(),
|
||||||
deviceConfig["rate"].asInt(),
|
|
||||||
deviceConfig["protocol"].asInt(),
|
deviceConfig["protocol"].asInt(),
|
||||||
deviceConfig["maxpacket"].asInt()
|
deviceConfig["maxpacket"].asInt()
|
||||||
);
|
);
|
||||||
@ -268,7 +270,6 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig)
|
|||||||
{
|
{
|
||||||
device = new LedDeviceUdpRaw(
|
device = new LedDeviceUdpRaw(
|
||||||
deviceConfig["output"].asString(),
|
deviceConfig["output"].asString(),
|
||||||
deviceConfig["rate"].asInt(),
|
|
||||||
deviceConfig.get("latchtime",500000).asInt()
|
deviceConfig.get("latchtime",500000).asInt()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -286,13 +287,13 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig)
|
|||||||
38400
|
38400
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_WS2812BPWM
|
#ifdef ENABLE_WS2812BPWM
|
||||||
else if (type == "ws2812b")
|
else if (type == "ws2812b")
|
||||||
{
|
{
|
||||||
device = new LedDeviceWS2812b();
|
device = new LedDeviceWS2812b();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef ENABLE_WS281XPWM
|
#ifdef ENABLE_WS281XPWM
|
||||||
else if (type == "ws281x")
|
else if (type == "ws281x")
|
||||||
{
|
{
|
||||||
device = new LedDeviceWS281x(
|
device = new LedDeviceWS281x(
|
||||||
@ -306,16 +307,21 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig)
|
|||||||
deviceConfig.get("white_algorithm","").asString()
|
deviceConfig.get("white_algorithm","").asString()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
else if (type == "file")
|
||||||
|
{
|
||||||
|
device = new LedDeviceFile( deviceConfig.get("output", "/dev/null").asString() );
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (type != "file")
|
throw std::runtime_error("unknown device");
|
||||||
{
|
|
||||||
Error(log, "Dummy device used, because unknown device %s set.", type.c_str());
|
|
||||||
}
|
}
|
||||||
device = new LedDeviceFile(
|
}
|
||||||
deviceConfig.get("output", "/dev/null").asString()
|
catch(std::exception e)
|
||||||
);
|
{
|
||||||
|
|
||||||
|
Error(log, "Dummy device used, because configured device '%s' throws error '%s'", type.c_str(), e.what());
|
||||||
|
device = new LedDeviceFile( "/dev/null" );
|
||||||
}
|
}
|
||||||
|
|
||||||
device->open();
|
device->open();
|
||||||
|
@ -13,9 +13,9 @@
|
|||||||
// Local LedDevice includes
|
// Local LedDevice includes
|
||||||
#include "LedDevicePiBlaster.h"
|
#include "LedDevicePiBlaster.h"
|
||||||
|
|
||||||
LedDevicePiBlaster::LedDevicePiBlaster(const std::string & deviceName, const Json::Value & gpioMapping) :
|
LedDevicePiBlaster::LedDevicePiBlaster(const std::string & deviceName, const Json::Value & gpioMapping)
|
||||||
_deviceName(deviceName),
|
: _deviceName(deviceName)
|
||||||
_fid(nullptr)
|
, _fid(nullptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
@ -59,34 +59,25 @@ LedDevicePiBlaster::~LedDevicePiBlaster()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int LedDevicePiBlaster::open(bool report)
|
int LedDevicePiBlaster::open()
|
||||||
{
|
{
|
||||||
if (_fid != nullptr)
|
if (_fid != nullptr)
|
||||||
{
|
{
|
||||||
// The file pointer is already open
|
// The file pointer is already open
|
||||||
if (report)
|
|
||||||
{
|
|
||||||
Error( _log, "Device (%s) is already open.", _deviceName.c_str() );
|
Error( _log, "Device (%s) is already open.", _deviceName.c_str() );
|
||||||
}
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!QFile::exists(_deviceName.c_str()))
|
if (!QFile::exists(_deviceName.c_str()))
|
||||||
{
|
|
||||||
if (report)
|
|
||||||
{
|
{
|
||||||
Error( _log, "The device (%s) does not yet exist.", _deviceName.c_str() );
|
Error( _log, "The device (%s) does not yet exist.", _deviceName.c_str() );
|
||||||
}
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
_fid = fopen(_deviceName.c_str(), "w");
|
_fid = fopen(_deviceName.c_str(), "w");
|
||||||
if (_fid == nullptr)
|
if (_fid == nullptr)
|
||||||
{
|
|
||||||
if (report)
|
|
||||||
{
|
{
|
||||||
Error( _log, "Failed to open device (%s). Error message: %s", _deviceName.c_str(), strerror(errno) );
|
Error( _log, "Failed to open device (%s). Error message: %s", _deviceName.c_str(), strerror(errno) );
|
||||||
}
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,7 +89,7 @@ int LedDevicePiBlaster::open(bool report)
|
|||||||
int LedDevicePiBlaster::write(const std::vector<ColorRgb> & ledValues)
|
int LedDevicePiBlaster::write(const std::vector<ColorRgb> & ledValues)
|
||||||
{
|
{
|
||||||
// Attempt to open if not yet opened
|
// Attempt to open if not yet opened
|
||||||
if (_fid == nullptr && open(false) < 0)
|
if (_fid == nullptr && open() < 0)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -151,7 +142,7 @@ int LedDevicePiBlaster::write(const std::vector<ColorRgb> & ledValues)
|
|||||||
int LedDevicePiBlaster::switchOff()
|
int LedDevicePiBlaster::switchOff()
|
||||||
{
|
{
|
||||||
// Attempt to open if not yet opened
|
// Attempt to open if not yet opened
|
||||||
if (_fid == nullptr && open(false) < 0)
|
if (_fid == nullptr && open() < 0)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -27,10 +27,9 @@ public:
|
|||||||
/// Attempts to open the piblaster-device. This will only succeed if the device is not yet open
|
/// Attempts to open the piblaster-device. This will only succeed if the device is not yet open
|
||||||
/// and the device is available.
|
/// and the device is available.
|
||||||
///
|
///
|
||||||
/// @param report If true errors are writen to the standard error else silent
|
|
||||||
/// @return Zero on succes else negative
|
/// @return Zero on succes else negative
|
||||||
///
|
///
|
||||||
int open(bool report = true);
|
int open();
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Writes the colors to the PiBlaster device
|
/// Writes the colors to the PiBlaster device
|
||||||
|
@ -21,7 +21,7 @@ unsigned leds_per_pkt;
|
|||||||
int update_number;
|
int update_number;
|
||||||
int fragment_number;
|
int fragment_number;
|
||||||
|
|
||||||
LedDeviceUdp::LedDeviceUdp(const std::string& output, const unsigned baudrate, const unsigned protocol, const unsigned maxPacket)
|
LedDeviceUdp::LedDeviceUdp(const std::string& output, const unsigned protocol, const unsigned maxPacket)
|
||||||
{
|
{
|
||||||
std::string hostname;
|
std::string hostname;
|
||||||
std::string port;
|
std::string port;
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
#include <leddevice/LedDevice.h>
|
#include <leddevice/LedDevice.h>
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Implementation of the LedDevice that write the led-colors to an
|
/// Implementation of the LedDevice that write the led-colors via udp
|
||||||
/// ASCII-textfile('/home/pi/LedDevice.out')
|
///
|
||||||
///
|
///
|
||||||
class LedDeviceUdp : public LedDevice
|
class LedDeviceUdp : public LedDevice
|
||||||
{
|
{
|
||||||
@ -16,7 +16,7 @@ public:
|
|||||||
///
|
///
|
||||||
/// Constructs the test-device, which opens an output stream to the file
|
/// Constructs the test-device, which opens an output stream to the file
|
||||||
///
|
///
|
||||||
LedDeviceUdp(const std::string& output, const unsigned baudrate, const unsigned protocol, const unsigned maxPacket);
|
LedDeviceUdp(const std::string& output, const unsigned protocol, const unsigned maxPacket);
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Destructor of this test-device
|
/// Destructor of this test-device
|
||||||
@ -36,9 +36,6 @@ public:
|
|||||||
virtual int switchOff();
|
virtual int switchOff();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// The outputstream
|
|
||||||
// std::ofstream _ofs;
|
|
||||||
|
|
||||||
/// the number of leds (needed when switching off)
|
/// the number of leds (needed when switching off)
|
||||||
size_t mLedCount;
|
size_t mLedCount;
|
||||||
};
|
};
|
||||||
|
@ -11,8 +11,8 @@
|
|||||||
// hyperion local includes
|
// hyperion local includes
|
||||||
#include "LedDeviceUdpRaw.h"
|
#include "LedDeviceUdpRaw.h"
|
||||||
|
|
||||||
LedDeviceUdpRaw::LedDeviceUdpRaw(const std::string& outputDevice, const unsigned baudrate, const unsigned latchTime) :
|
LedDeviceUdpRaw::LedDeviceUdpRaw(const std::string& outputDevice, const unsigned latchTime) :
|
||||||
LedUdpDevice(outputDevice, baudrate, latchTime),
|
LedUdpDevice(outputDevice, latchTime),
|
||||||
mLedCount(0)
|
mLedCount(0)
|
||||||
{
|
{
|
||||||
// empty
|
// empty
|
||||||
|
@ -7,21 +7,19 @@
|
|||||||
#include "LedUdpDevice.h"
|
#include "LedUdpDevice.h"
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Implementation of the LedDevice interface for writing to Ws2801 led device.
|
/// Implementation of the LedDevice interface for sending led colors via udp.
|
||||||
///
|
///
|
||||||
class LedDeviceUdpRaw : public LedUdpDevice
|
class LedDeviceUdpRaw : public LedUdpDevice
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
///
|
///
|
||||||
/// Constructs the LedDevice for a string containing leds of the type Ws2801
|
/// Constructs the LedDevice for sending led colors via udp
|
||||||
///
|
///
|
||||||
/// @param outputDevice The name of the output device (eg '/etc/SpiDev.0.0')
|
/// @param outputDevice hostname:port
|
||||||
/// @param baudrate The used baudrate for writing to the output device
|
/// @param latchTime
|
||||||
///
|
///
|
||||||
|
|
||||||
LedDeviceUdpRaw(const std::string& outputDevice,
|
LedDeviceUdpRaw(const std::string& outputDevice, const unsigned latchTime);
|
||||||
const unsigned baudrate,
|
|
||||||
const unsigned latchTime);
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Writes the led color values to the led-device
|
/// Writes the led color values to the led-device
|
||||||
|
@ -15,7 +15,7 @@ public:
|
|||||||
///
|
///
|
||||||
/// Constructs the LedDevice attached to a SPI-device
|
/// Constructs the LedDevice attached to a SPI-device
|
||||||
///
|
///
|
||||||
/// @param[in] outputDevice The name of the output device (eg '/etc/SpiDev.0.0')
|
/// @param[in] outputDevice The name of the output device (eg '/dev/spidev.0.0')
|
||||||
/// @param[in] baudrate The used baudrate for writing to the output device
|
/// @param[in] baudrate The used baudrate for writing to the output device
|
||||||
/// @param[in] latchTime_ns The latch-time to latch in the values across the SPI-device (negative
|
/// @param[in] latchTime_ns The latch-time to latch in the values across the SPI-device (negative
|
||||||
/// means no latch required) [ns]
|
/// means no latch required) [ns]
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <exception>
|
||||||
// Linux includes
|
// Linux includes
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
@ -15,17 +15,15 @@
|
|||||||
// Local Hyperion includes
|
// Local Hyperion includes
|
||||||
#include "LedUdpDevice.h"
|
#include "LedUdpDevice.h"
|
||||||
|
|
||||||
LedUdpDevice::LedUdpDevice(const std::string& output, const unsigned baudrate, const int latchTime_ns) :
|
LedUdpDevice::LedUdpDevice(const std::string& output, const int latchTime_ns) :
|
||||||
_target(output),
|
_target(output),
|
||||||
_BaudRate_Hz(baudrate),
|
|
||||||
_LatchTime_ns(latchTime_ns)
|
_LatchTime_ns(latchTime_ns)
|
||||||
{
|
{
|
||||||
udpSocket = new QUdpSocket();
|
udpSocket = new QUdpSocket();
|
||||||
QString str = QString::fromStdString(_target);
|
QString str = QString::fromStdString(_target);
|
||||||
QStringList _list = str.split(":");
|
QStringList _list = str.split(":");
|
||||||
if (_list.size() != 2) {
|
if (_list.size() != 2) {
|
||||||
Error( _log, "Error parsing hostname:port");
|
throw("Error parsing hostname:port");
|
||||||
exit (-1);
|
|
||||||
}
|
}
|
||||||
QHostInfo info = QHostInfo::fromName(_list.at(0));
|
QHostInfo info = QHostInfo::fromName(_list.at(0));
|
||||||
if (!info.addresses().isEmpty()) {
|
if (!info.addresses().isEmpty()) {
|
||||||
@ -45,8 +43,7 @@ int LedUdpDevice::open()
|
|||||||
QHostAddress _localAddress = QHostAddress::Any;
|
QHostAddress _localAddress = QHostAddress::Any;
|
||||||
quint16 _localPort = 0;
|
quint16 _localPort = 0;
|
||||||
|
|
||||||
WarningIf( !udpSocket->bind(_localAddress, _localPort),
|
WarningIf( !udpSocket->bind(_localAddress, _localPort), _log, "Couldnt bind local address: %s", strerror(errno));
|
||||||
_log, "Couldnt bind local address: %s", strerror(errno));
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -13,14 +13,13 @@ class LedUdpDevice : public LedDevice
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
///
|
///
|
||||||
/// Constructs the LedDevice attached to a SPI-device
|
/// Constructs the LedDevice sendig data via udp
|
||||||
///
|
///
|
||||||
/// @param[in] outputDevice The name of the output device (eg '/etc/UdpDev.0.0')
|
/// @param[in] outputDevice string hostname:port
|
||||||
/// @param[in] baudrate The used baudrate for writing to the output device
|
|
||||||
/// @param[in] latchTime_ns The latch-time to latch in the values across the SPI-device (negative
|
/// @param[in] latchTime_ns The latch-time to latch in the values across the SPI-device (negative
|
||||||
/// means no latch required) [ns]
|
/// means no latch required) [ns]
|
||||||
///
|
///
|
||||||
LedUdpDevice(const std::string& outputDevice, const unsigned baudrate, const int latchTime_ns = -1);
|
LedUdpDevice(const std::string& outputDevice, const int latchTime_ns = -1);
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Destructor of the LedDevice; closes the output device if it is open
|
/// Destructor of the LedDevice; closes the output device if it is open
|
||||||
@ -49,8 +48,6 @@ protected:
|
|||||||
private:
|
private:
|
||||||
/// The UDP destination as "host:port"
|
/// The UDP destination as "host:port"
|
||||||
const std::string _target;
|
const std::string _target;
|
||||||
/// The used baudrate of the output device for rate limiting
|
|
||||||
const int _BaudRate_Hz;
|
|
||||||
/// The time which the device should be untouched after a write
|
/// The time which the device should be untouched after a write
|
||||||
const int _LatchTime_ns;
|
const int _LatchTime_ns;
|
||||||
|
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
|
|
||||||
WebConfig::WebConfig(QObject * parent)
|
WebConfig::WebConfig(QObject * parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, _port(WEBCONFIG_DEFAULT_PORT)
|
|
||||||
, _server(nullptr)
|
, _server(nullptr)
|
||||||
{
|
{
|
||||||
|
_port = WEBCONFIG_DEFAULT_PORT;
|
||||||
_hyperion = Hyperion::getInstance();
|
_hyperion = Hyperion::getInstance();
|
||||||
const Json::Value &config = _hyperion->getJsonConfig();
|
const Json::Value &config = _hyperion->getJsonConfig();
|
||||||
_baseUrl = QString::fromStdString(WEBCONFIG_DEFAULT_PATH);
|
_baseUrl = QString::fromStdString(WEBCONFIG_DEFAULT_PATH);
|
||||||
|
@ -7,8 +7,10 @@ find_package(Qt5 COMPONENTS Core Gui Widgets Network REQUIRED)
|
|||||||
|
|
||||||
# The following I do not undrstand completely...
|
# The following I do not undrstand completely...
|
||||||
# libQtCore.so uses some hardcoded library path inside which are incorrect after copying the file RPi file system
|
# libQtCore.so uses some hardcoded library path inside which are incorrect after copying the file RPi file system
|
||||||
# Therefor, an extra path is needed on which to find the required libraries
|
# Therefore, an extra path is needed on which to find the required libraries
|
||||||
LINK_DIRECTORIES(${LINK_DIRECTORIES} ${CMAKE_FIND_ROOT_PATH}/lib/arm-linux-gnueabihf)
|
IF ( EXISTS ${CMAKE_FIND_ROOT_PATH}/lib/arm-linux-gnueabihf )
|
||||||
|
LINK_DIRECTORIES(${LINK_DIRECTORIES} ${CMAKE_FIND_ROOT_PATH}/lib/arm-linux-gnueabihf)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
include_directories(${QT_INCLUDES})
|
include_directories(${QT_INCLUDES})
|
||||||
|
|
||||||
|
@ -420,7 +420,7 @@ void HyperionDaemon::createSystemFrameGrabber()
|
|||||||
// framebuffer -> if nothing other applies
|
// framebuffer -> if nothing other applies
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
type == "framebuffer";
|
type = "framebuffer";
|
||||||
}
|
}
|
||||||
Info( _log, "set screen capture device to '%s'", type.constData());
|
Info( _log, "set screen capture device to '%s'", type.constData());
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,6 @@
|
|||||||
#include <jsonserver/JsonServer.h>
|
#include <jsonserver/JsonServer.h>
|
||||||
#include <protoserver/ProtoServer.h>
|
#include <protoserver/ProtoServer.h>
|
||||||
#include <boblightserver/BoblightServer.h>
|
#include <boblightserver/BoblightServer.h>
|
||||||
#include <webconfig/WebConfig.h>
|
|
||||||
#include <udplistener/UDPListener.h>
|
#include <udplistener/UDPListener.h>
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
|
|
||||||
@ -86,7 +85,6 @@ private:
|
|||||||
AmlogicWrapper* _amlGrabber;
|
AmlogicWrapper* _amlGrabber;
|
||||||
FramebufferWrapper* _fbGrabber;
|
FramebufferWrapper* _fbGrabber;
|
||||||
OsxWrapper* _osxGrabber;
|
OsxWrapper* _osxGrabber;
|
||||||
WebConfig* _webConfig;
|
|
||||||
Hyperion* _hyperion;
|
Hyperion* _hyperion;
|
||||||
|
|
||||||
unsigned _grabber_width;
|
unsigned _grabber_width;
|
||||||
|
@ -143,7 +143,7 @@ void setup_io()
|
|||||||
);
|
);
|
||||||
|
|
||||||
if ((long)gpio_map < 0) {
|
if ((long)gpio_map < 0) {
|
||||||
printf("mmap error %d\n", (long)gpio_map);
|
printf("mmap error %ld\n", (long)gpio_map);
|
||||||
exit (-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
gpio = (volatile unsigned *)gpio_map;
|
gpio = (volatile unsigned *)gpio_map;
|
||||||
@ -166,10 +166,10 @@ void setup_io()
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
printf("SPI mapped from 0x%p to 0x%p\n",SPI0_BASE,spi0_map);
|
printf("SPI mapped from 0x%d to 0x%p\n",SPI0_BASE,spi0_map);
|
||||||
|
|
||||||
if ((long)spi0_map < 0) {
|
if ((long)spi0_map < 0) {
|
||||||
printf("mmap error %d\n", (long)spi0_map);
|
printf("mmap error %ld\n", (long)spi0_map);
|
||||||
exit (-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
spi0 = (volatile unsigned *)spi0_map;
|
spi0 = (volatile unsigned *)spi0_map;
|
||||||
|
Loading…
Reference in New Issue
Block a user