void FadeChannel_Test::group() { Doc doc(this); FadeChannel fc; // Only a channel given, no fixture at the address -> intensity fc.setChannel(2); QCOMPARE(fc.group(&doc), QLCChannel::Intensity); Fixture* fxi = new Fixture(&doc); fxi->setAddress(10); fxi->setChannels(5); doc.addFixture(fxi); // Fixture and channel given, fixture is a dimmer -> intensity fc.setFixture(&doc, fxi->id()); QCOMPARE(fc.group(&doc), QLCChannel::Intensity); QDir dir(INTERNAL_FIXTUREDIR); dir.setFilter(QDir::Files); dir.setNameFilters(QStringList() << QString("*%1").arg(KExtFixture)); QVERIFY(doc.fixtureDefCache()->load(dir) == true); QLCFixtureDef* def = doc.fixtureDefCache()->fixtureDef("Futurelight", "DJScan250"); QVERIFY(def != NULL); QLCFixtureMode* mode = def->modes().first(); QVERIFY(mode != NULL); fxi = new Fixture(&doc); fxi->setAddress(0); fxi->setFixtureDefinition(def, mode); doc.addFixture(fxi); // Fixture and channel given, but channel is beyond fixture's channels -> intensity fc.setFixture(&doc, fxi->id()); fc.setChannel(50); QCOMPARE(fc.group(&doc), QLCChannel::Intensity); // Only a channel given, no fixture given but a fixture occupies the address. // Check that reverse address -> fixture lookup works. fc.setFixture(&doc, Fixture::invalidId()); fc.setChannel(2); QCOMPARE(fc.group(&doc), QLCChannel::Colour); // Fixture and channel given, but fixture doesn't exist -> intensity fc.setFixture(&doc, 12345); fc.setChannel(2); QCOMPARE(fc.group(&doc), QLCChannel::Intensity); }
void CueStack::insertStartValue(FadeChannel& fc, const QList<Universe *> ua) { qDebug() << Q_FUNC_INFO; const QHash <FadeChannel,FadeChannel>& channels(m_fader->channels()); if (channels.contains(fc) == true) { // GenericFader contains the channel so grab its current // value as the new starting value to get a smoother fade FadeChannel existing = channels[fc]; fc.setStart(existing.current()); fc.setCurrent(fc.start()); } else { // GenericFader didn't have the channel. Grab the starting value from UniverseArray. quint32 uni = fc.universe(); if (uni != Universe::invalid() && uni < (quint32)ua.count()) { if (fc.group(doc()) != QLCChannel::Intensity) fc.setStart(ua[uni]->preGMValues()[fc.address()]); else fc.setStart(0); // HTP channels must start at zero } fc.setCurrent(fc.start()); } }
void CueStack::postRun(MasterTimer* timer) { qDebug() << Q_FUNC_INFO; Q_ASSERT(timer != NULL); Q_ASSERT(m_fader != NULL); // Bounce all intensity channels to MasterTimer's fader for zeroing QHashIterator <FadeChannel,FadeChannel> it(m_fader->channels()); while (it.hasNext() == true) { it.next(); FadeChannel fc = it.value(); if (fc.group(doc()) == QLCChannel::Intensity) { fc.setStart(fc.current(intensity())); fc.setTarget(0); fc.setElapsed(0); fc.setReady(false); fc.setFadeTime(fadeOutSpeed()); timer->fader()->add(fc); } } m_currentIndex = -1; delete m_fader; m_fader = NULL; emit currentCueChanged(m_currentIndex); emit stopped(); }
void GenericDMXSource::writeDMX(MasterTimer* timer, QList<Universe *> ua) { Q_UNUSED(timer); m_mutex.lock(); QMutableMapIterator <QPair<quint32,quint32>,uchar> it(m_values); while (it.hasNext() == true && m_outputEnabled == true) { it.next(); FadeChannel fc; fc.setFixture(m_doc, it.key().first); fc.setChannel(it.key().second); QLCChannel::Group grp = fc.group(m_doc); quint32 address = fc.address(); quint32 universe = fc.universe(); if (address != QLCChannel::invalid()) ua[universe]->write(address, it.value()); if (grp != QLCChannel::Intensity) it.remove(); } m_mutex.unlock(); }
void CueStack::switchCue(int from, int to, const QList<Universe *> ua) { qDebug() << Q_FUNC_INFO; Cue newCue; Cue oldCue; m_mutex.lock(); if (to >= 0 && to < m_cues.size()) newCue = m_cues[to]; if (from >= 0 && from < m_cues.size()) oldCue = m_cues[from]; m_mutex.unlock(); // Fade out the HTP channels of the previous cue QHashIterator <uint,uchar> oldit(oldCue.values()); while (oldit.hasNext() == true) { oldit.next(); FadeChannel fc; fc.setFixture(doc(), Fixture::invalidId()); fc.setChannel(oldit.key()); if (fc.group(doc()) == QLCChannel::Intensity) { fc.setElapsed(0); fc.setReady(false); fc.setTarget(0); fc.setFadeTime(oldCue.fadeOutSpeed()); insertStartValue(fc, ua); m_fader->add(fc); } } // Fade in all channels of the new cue QHashIterator <uint,uchar> newit(newCue.values()); while (newit.hasNext() == true) { newit.next(); FadeChannel fc; fc.setFixture(doc(), Fixture::invalidId()); fc.setChannel(newit.key()); fc.setTarget(newit.value()); fc.setElapsed(0); fc.setReady(false); fc.setFadeTime(newCue.fadeInSpeed()); insertStartValue(fc, ua); m_fader->add(fc); } }
void RGBMatrix::postRun(MasterTimer* timer, QList<Universe *> universes) { if (m_fader != NULL) { QHashIterator <FadeChannel,FadeChannel> it(m_fader->channels()); while (it.hasNext() == true) { it.next(); FadeChannel fc = it.value(); // fade out only intensity channels if (fc.group(doc()) != QLCChannel::Intensity) continue; bool canFade = true; Fixture *fixture = doc()->fixture(fc.fixture()); if (fixture != NULL) canFade = fixture->channelCanFade(fc.channel()); fc.setStart(fc.current(getAttributeValue(Intensity))); fc.setCurrent(fc.current(getAttributeValue(Intensity))); fc.setElapsed(0); fc.setReady(false); if (canFade == false) { fc.setFadeTime(0); fc.setTarget(fc.current(getAttributeValue(Intensity))); } else { if (overrideFadeOutSpeed() == defaultSpeed()) fc.setFadeTime(fadeOutSpeed()); else fc.setFadeTime(overrideFadeOutSpeed()); fc.setTarget(0); } timer->faderAdd(fc); } delete m_fader; m_fader = NULL; } { QMutexLocker algorithmLocker(&m_algorithmMutex); if (m_algorithm != NULL) m_algorithm->postRun(); } Function::postRun(timer, universes); }