diff --git a/include/hyperion/LedString.h b/include/hyperion/LedString.h index 282b4429..6a5bfc52 100644 --- a/include/hyperion/LedString.h +++ b/include/hyperion/LedString.h @@ -10,6 +10,7 @@ // QT includes #include +#include // Forward class declarations namespace Json { class Value; } @@ -73,7 +74,7 @@ inline ColorOrder stringToColorOrder(const QString & order) } /// -/// The Led structure contains the definition of the image portion used to determine a single led's +/// The Led structure contains the definition of the image portion used to determine a single LED's /// color. /// @verbatim /// |--------------------image--| @@ -89,39 +90,66 @@ inline ColorOrder stringToColorOrder(const QString & order) /// struct Led { - /// The minimum vertical scan line included for this leds color + /// The minimum vertical scan line included for this LEDs color double minX_frac; - /// The maximum vertical scan line included for this leds color + /// The maximum vertical scan line included for this LEDs color double maxX_frac; - /// The minimum horizontal scan line included for this leds color + /// The minimum horizontal scan line included for this LEDs color 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; + /// A LEDs at {0,0,0,0} is not visible and therefore treated as blacklisted + bool isBlacklisted {false}; /// the color order ColorOrder colorOrder; }; /// -/// The LedString contains the image integration information of the leds +/// The LedString contains the image integration information of the LEDs /// class LedString { public: /// - /// Returns the led specifications + /// Returns the LED specifications /// /// @return The list with led specifications /// std::vector& leds(); /// - /// Returns the led specifications + /// Returns the LED specifications /// /// @return The list with led specifications /// const std::vector& leds() const; + /// + /// Returns the IDs of blacklisted LEDs + /// + /// @return ID List of blacklisted LEDs + /// + std::vector& blacklistedLedIds(); + + /// + /// Returns the IDs of blacklisted LEDs + /// + /// @return ID List of blacklisted LEDs + /// + const std::vector& blacklistedLedIds() const; + + /// + /// Check, if teh layout has blacklisted LEDs configured + /// + /// @return True, if blacklisted LEDs are configured + /// + bool hasBlackListedLeds (); + + static LedString createLedString(const QJsonArray& ledConfigArray, const ColorOrder deviceOrder); + private: - /// The list with led specifications - std::vector mLeds; + /// The list with LED specifications + std::vector _leds; + /// The list containing IDs of blacklisted LED + std::vector _blacklistedLedIds; }; diff --git a/include/utils/hyperion.h b/include/utils/hyperion.h index 774267a8..88ebc44e 100644 --- a/include/utils/hyperion.h +++ b/include/utils/hyperion.h @@ -177,44 +177,6 @@ namespace hyperion { return adjustment; } - /** - * Construct the 'led-string' with the integration area definition per led and the color - * ordering of the RGB channels - * @param ledsConfig The configuration of the led areas - * @param deviceOrder The default RGB channel ordering - * @return The constructed ledstring - */ - static LedString createLedString(const QJsonArray& ledConfigArray, const ColorOrder deviceOrder) - { - LedString ledString; - const QString deviceOrderStr = colorOrderToString(deviceOrder); - - for (signed i = 0; i < ledConfigArray.size(); ++i) - { - const QJsonObject& ledConfig = ledConfigArray[i].toObject(); - Led led; - - led.minX_frac = qMax(0.0, qMin(1.0, ledConfig["hmin"].toDouble())); - led.maxX_frac = qMax(0.0, qMin(1.0, ledConfig["hmax"].toDouble())); - led.minY_frac = qMax(0.0, qMin(1.0, ledConfig["vmin"].toDouble())); - led.maxY_frac = qMax(0.0, qMin(1.0, ledConfig["vmax"].toDouble())); - // Fix if the user swapped min and max - if (led.minX_frac > led.maxX_frac) - { - std::swap(led.minX_frac, led.maxX_frac); - } - if (led.minY_frac > led.maxY_frac) - { - std::swap(led.minY_frac, led.maxY_frac); - } - - // Get the order of the rgb channels for this led (default is device order) - led.colorOrder = stringToColorOrder(ledConfig["colorOrder"].toString(deviceOrderStr)); - ledString.leds().push_back(led); - } - return ledString; - } - static QSize getLedLayoutGridSize(const QJsonArray& ledConfigArray) { std::vector midPointsX; diff --git a/libsrc/hyperion/Hyperion.cpp b/libsrc/hyperion/Hyperion.cpp index 7107611e..c0441294 100644 --- a/libsrc/hyperion/Hyperion.cpp +++ b/libsrc/hyperion/Hyperion.cpp @@ -52,7 +52,7 @@ Hyperion::Hyperion(quint8 instance, bool readonlyMode) , _instIndex(instance) , _settingsManager(new SettingsManager(instance, this, readonlyMode)) , _componentRegister(nullptr) - , _ledString(hyperion::createLedString(getSetting(settings::LEDS).array(), hyperion::createColorOrder(getSetting(settings::DEVICE).object()))) + , _ledString(LedString::createLedString(getSetting(settings::LEDS).array(), hyperion::createColorOrder(getSetting(settings::DEVICE).object()))) , _imageProcessor(nullptr) , _muxer(nullptr) , _raw2ledAdjustment(hyperion::createLedColorsAdjustment(static_cast(_ledString.leds().size()), getSetting(settings::COLOR).object())) @@ -255,7 +255,7 @@ void Hyperion::handleSettingsUpdate(settings::type type, const QJsonDocument& co #endif // ledstring, img processor, muxer, ledGridSize (effect-engine image based effects), _ledBuffer and ByteOrder of ledstring - _ledString = hyperion::createLedString(leds, hyperion::createColorOrder(getSetting(settings::DEVICE).object())); + _ledString = LedString::createLedString(leds, hyperion::createColorOrder(getSetting(settings::DEVICE).object())); _imageProcessor->setLedString(_ledString); _muxer->updateLedColorsLength(static_cast(_ledString.leds().size())); _ledGridSize = hyperion::getLedLayoutGridSize(leds); @@ -291,7 +291,7 @@ void Hyperion::handleSettingsUpdate(settings::type type, const QJsonDocument& co // force ledString update, if device ByteOrder changed if(_ledDeviceWrapper->getColorOrder() != dev["colorOrder"].toString("rgb")) { - _ledString = hyperion::createLedString(getSetting(settings::LEDS).array(), hyperion::createColorOrder(dev)); + _ledString = LedString::createLedString(getSetting(settings::LEDS).array(), hyperion::createColorOrder(dev)); _imageProcessor->setLedString(_ledString); _ledStringColorOrder.clear(); @@ -671,6 +671,18 @@ void Hyperion::update() else { _ledBuffer = priorityInfo.ledColors; + + if (_ledString.hasBlackListedLeds()) + { + for (int id : _ledString.blacklistedLedIds()) + { + if (id > _ledBuffer.size()-1) + { + break; + } + _ledBuffer.at(id) = ColorRgb::BLACK; + } + } } // emit rawLedColors before transform diff --git a/libsrc/hyperion/LedString.cpp b/libsrc/hyperion/LedString.cpp index bf9f7528..172504c4 100644 --- a/libsrc/hyperion/LedString.cpp +++ b/libsrc/hyperion/LedString.cpp @@ -1,16 +1,92 @@ // STL includes + #include #include // hyperion includes #include +// QT includes +#include + std::vector& LedString::leds() { - return mLeds; + return _leds; } const std::vector& LedString::leds() const { - return mLeds; + return _leds; +} + +std::vector& LedString::blacklistedLedIds() +{ + return _blacklistedLedIds; +} + +const std::vector& LedString::blacklistedLedIds() const +{ + return _blacklistedLedIds; +} + +bool LedString::hasBlackListedLeds() +{ + + if (_blacklistedLedIds.size() > 0) + { + return true; + } + else + { + return false; + } +} + +/** + * Construct the 'led-string' with the integration area definition per led and the color + * ordering of the RGB channels + * @param ledsConfig The configuration of the led areas + * @param deviceOrder The default RGB channel ordering + * @return The constructed ledstring + */ +LedString LedString::createLedString(const QJsonArray& ledConfigArray, const ColorOrder deviceOrder) +{ + LedString ledString; + const QString deviceOrderStr = colorOrderToString(deviceOrder); + + for (signed i = 0; i < ledConfigArray.size(); ++i) + { + const QJsonObject& ledConfig = ledConfigArray[i].toObject(); + Led led; + + led.minX_frac = qMax(0.0, qMin(1.0, ledConfig["hmin"].toDouble())); + led.maxX_frac = qMax(0.0, qMin(1.0, ledConfig["hmax"].toDouble())); + led.minY_frac = qMax(0.0, qMin(1.0, ledConfig["vmin"].toDouble())); + led.maxY_frac = qMax(0.0, qMin(1.0, ledConfig["vmax"].toDouble())); + // Fix if the user swapped min and max + if (led.minX_frac > led.maxX_frac) + { + std::swap(led.minX_frac, led.maxX_frac); + } + if (led.minY_frac > led.maxY_frac) + { + std::swap(led.minY_frac, led.maxY_frac); + } + + // Get the order of the rgb channels for this led (default is device order) + led.colorOrder = stringToColorOrder(ledConfig["colorOrder"].toString(deviceOrderStr)); + + led.isBlacklisted = false; + if (led.minX_frac < std::numeric_limits::epsilon() && + led.maxX_frac < std::numeric_limits::epsilon() && + led.minY_frac < std::numeric_limits::epsilon() && + led.maxY_frac < std::numeric_limits::epsilon() + ) + { + led.isBlacklisted = true; + ledString.blacklistedLedIds().push_back(i); + } + ledString.leds().push_back(led); + } + return ledString; } diff --git a/test/TestImage2LedsMap.cpp b/test/TestImage2LedsMap.cpp index bb9aa618..c0f08430 100644 --- a/test/TestImage2LedsMap.cpp +++ b/test/TestImage2LedsMap.cpp @@ -24,7 +24,7 @@ int main() return -1; } - const LedString ledString = hyperion::createLedString(config["leds"].toArray(), hyperion::createColorOrder(config["device"].toObject())); + const LedString ledString = LedString::createLedString(config["leds"].toArray(), hyperion::createColorOrder(config["device"].toObject())); const ColorRgb testColor = {64, 123, 12};