#include "qsacnuniverse.h" /** * @brief QSacnUniverse::QSacnUniverse * @param parent * @param universe */ QSacnUniverse::QSacnUniverse(QObject *parent, std::shared_ptr universe) : QObject(parent) , universe_(universe) , status_watchdog_(new QTimer(this)) { if (!universe) return; data_change_token = universe_->onDataChange([this](DMX::Universe*){emit dataChanged();}); status_change_token = universe_->onStatusChange([this](DMX::Universe*){emit statusChanged();}); if (!universe->isEditable()) list_change_token = universe_->onSourceListChange([this](){syncSources();}); // set the status watchdog to update the status if the universe // isn't showing frequent activity status_watchdog_->callOnTimeout([this](){universe_->status();}); status_watchdog_->setInterval(DMX::E111_DATA_LOSS_TIMEOUT); status_watchdog_->start(); connect(this, &QSacnUniverse::dataChanged, this, [this](){status_watchdog_->start();}); connect(this, &QSacnUniverse::statusChanged, this, [this](){status_watchdog_->start();}); }; /** * @brief QSacnUniverse::~QSacnUniverse */ QSacnUniverse::~QSacnUniverse() { // delete QSacnUniverse sources qDeleteAll(sources_); } /** * @brief QSacnUniverse::description * @return */ const QString QSacnUniverse::sourceName() const { auto metadata = universe_->metadata(); return metadata ? QString::fromUtf8(metadata->source_name.c_str()) : QString(); } /** * @brief QSacnUniverse::number * @return */ uint16_t QSacnUniverse::number() const { auto metadata = universe_->metadata(); return metadata ? metadata->universe : 0; } /** * @brief QSacnUniverse::priority * @return */ uint8_t QSacnUniverse::priority() const { auto metadata = universe_->metadata(); return metadata ? metadata->priority : 0; } /** * @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 */ const 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) const { 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_->metadata()->options = o; emit dataChanged(); } /** * @brief QSacnUniverse::setPriority * @param p */ void QSacnUniverse::setPriority(uint8_t p) { if (!isEditable()) return; universe_->metadata()->priority = p; emit dataChanged(); } /** * @brief QSacnUniverse::setSyncAddress * @param a */ void QSacnUniverse::setSyncAddress(uint16_t a) { if (!isEditable()) return; universe_->metadata()->sync_address = a; emit dataChanged(); } /** * @brief QSacnUniverse::setValue * @param addr * @param level */ void QSacnUniverse::setValue (const uint16_t addr, const uint8_t level) { setValue(addr, 1, &level); } /** * @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(); }