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:
redPanther 2016-08-08 00:17:00 +02:00 committed by GitHub
parent a56f98b085
commit 197af35de0
21 changed files with 421 additions and 380 deletions

View File

@ -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;
}; };

View File

@ -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;
}; };

View File

@ -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);

View File

@ -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>");

View File

@ -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

View File

@ -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

View File

@ -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();

View File

@ -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;
} }

View File

@ -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

View File

@ -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;

View File

@ -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;
}; };

View File

@ -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

View File

@ -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

View File

@ -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]

View File

@ -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;
} }

View File

@ -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;

View File

@ -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);

View File

@ -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})

View File

@ -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());
} }

View File

@ -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;

View File

@ -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;