#include "qsacnuniverse.h" /** * @brief QSacnUniverse::QSacnUniverse * @param parent * @param universe */ QSacnUniverse::QSacnUniverse(QObject *parent, std::shared_ptr universe) : QObject(parent) , universe_(universe) { if (!universe) return; data_change_token = universe_->onData([this](DMX::Universe*) { emit dataChanged(); }); if (!universe->isEditable()) list_change_token = universe_->onSourceListChange([this]() { syncSources(); }); status_change_token = universe_->onStatusChange([this]() { emit statusChanged(); }); }; /** * @brief QSacnUniverse::~QSacnUniverse */ QSacnUniverse::~QSacnUniverse() { // delete QSacnUniverse sources qDeleteAll(sources_); } /** * @brief QSacnUniverse::description * @return */ const QString QSacnUniverse::sourceName() const { auto metadata = universe_->provenance(); if (!metadata) return QString(); return QString::fromUtf8(metadata->source_name.c_str()); } /** * @brief QSacnUniverse::number * @return */ uint16_t QSacnUniverse::number() const { auto metadata = universe_->provenance(); if (!metadata) return 0; return metadata->universe; } /** * @brief QSacnUniverse::priority * @return */ uint8_t QSacnUniverse::priority() const { auto metadata = universe_->provenance(); if (!metadata) return 0; return metadata->priority; } /** * @brief QSacnUniverse::rxRate * @return */ double QSacnUniverse::rxRate() const { return (universe_) ? universe_->rxRate() : -1; } /** * @brief QSacnUniverse::status * @return */ uint8_t QSacnUniverse::status() const { return (universe_) ? universe_->status() : sACN::Universe::DMX_NULL; } /** * @brief QSacnUniverse::slot * @param slot * @return */ uint8_t QSacnUniverse::slot(const uint16_t slot) const { return (universe_) ? universe_->slot(slot) : 0; } /** * @brief QSacnUniverse::isEditable * @return */ bool QSacnUniverse::isEditable() const { return (universe_) ? universe_->isEditable() : false; } /** * @brief QSacnUniverse::sources * @return */ QList QSacnUniverse::sources() const { QList ret; if (!universe_) return ret; for (const auto & src : universe_->sources()) ret.append(src); return ret; } /** * @brief QSacnUniverse::sourceUniverse * @param metadata * @return */ QSacnUniverse* QSacnUniverse::sourceUniverse( const sACN::DATA::data_header& metadata) { if (!universe_) return nullptr; if (!sources_.count(metadata)) return nullptr; return sources_.value(metadata); } /** * @brief QSacnUniverse::activeSlots * @return */ uint16_t QSacnUniverse::activeSlots() const { return (universe_) ? universe_->activeSlots() : 0; } /** * @brief QSacnUniverse::setOptions * @param o */ void QSacnUniverse::setOptions(sACN::DATA::data_options o) { if (!isEditable()) return; universe_->provenance()->options = o; emit dataChanged(); } /** * @brief QSacnUniverse::setPriority * @param p */ void QSacnUniverse::setPriority(uint8_t p) { if (!isEditable()) return; universe_->provenance()->priority = p; emit dataChanged(); } /** * @brief QSacnUniverse::setSyncAddress * @param a */ void QSacnUniverse::setSyncAddress(uint16_t a) { if (!isEditable()) return; universe_->provenance()->sync_address = a; emit dataChanged(); } /** * @brief QSacnUniverse::setValue * @param addr * @param level */ void QSacnUniverse::setValue (const uint16_t addr, const uint8_t level) { if (!isEditable()) return; universe_->sACN::Universe::setValue(addr, level); emit dataChanged(); } /** * @brief QSacnUniverse::setValue * @param addr * @param size * @param profile */ void QSacnUniverse::setValue (const uint16_t addr, const uint16_t size, const uint8_t* profile) { if (!isEditable()) return; universe_->sACN::Universe::setValue(addr, size, profile); emit dataChanged(); } /** * @brief QSacnUniverse::syncSources */ void QSacnUniverse::syncSources() { // create a new list of sources QMap newSources; auto headers = universe_->sources(); for (const auto & metadata : headers) { if (sources_.contains(metadata)) // move the QSacnUniverse to the new list newSources.insert(metadata, sources_.take(metadata)); else { // make a new QSacnUniverse to add to the new list auto universe = universe_->sourceUniverse(metadata); newSources.insert(metadata, new QSacnUniverse(this, universe)); } } // delete any remaining sources, ie. not moved to the new list qDeleteAll(sources_); // accept the new list sources_ = newSources; emit sourceListChanged(); }