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::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()); } }
QString Script::handleSetFixture(const QList<QStringList>& tokens, QList<Universe *> universes) { qDebug() << Q_FUNC_INFO; if (tokens.size() > 4) return QString("Too many arguments"); bool ok = false; quint32 id = 0; quint32 ch = 0; uchar value = 0; double time = 0; id = tokens[0][1].toUInt(&ok); if (ok == false) return QString("Invalid fixture (ID: %1)").arg(tokens[0][1]); for (int i = 1; i < tokens.size(); i++) { QStringList list = tokens[i]; list[0] = list[0].toLower().trimmed(); if (list.size() == 2) { ok = false; if (list[0] == "val" || list[0] == "value") value = uchar(list[1].toUInt(&ok)); else if (list[0] == "ch" || list[0] == "channel") ch = list[1].toUInt(&ok); else if (list[0] == "time") time = list[1].toDouble(&ok); else return QString("Unrecognized keyword: %1").arg(list[0]); if (ok == false) return QString("Invalid value (%1) for keyword: %2").arg(list[1]).arg(list[0]); } } Doc* doc = qobject_cast<Doc*> (parent()); Q_ASSERT(doc != NULL); Fixture* fxi = doc->fixture(id); if (fxi != NULL) { if (ch < fxi->channels()) { int address = fxi->address() + ch; if (address < 512) { GenericFader* gf = fader(); Q_ASSERT(gf != NULL); FadeChannel fc; fc.setFixture(doc, fxi->id()); fc.setChannel(ch); fc.setTarget(value); fc.setFadeTime(time); // If the script has used the channel previously, it might still be in // the bowels of GenericFader so get the starting value from there. // Otherwise get it from universes (HTP channels are always 0 then). quint32 uni = fc.universe(); if (gf->channels().contains(fc) == true) fc.setStart(gf->channels()[fc].current()); else fc.setStart(universes[uni]->preGMValue(address)); fc.setCurrent(fc.start()); gf->add(fc); return QString(); } else { return QString("Invalid address: %1").arg(address); } } else { return QString("Fixture (%1) has no channel number %2").arg(fxi->name()).arg(ch); } } else { return QString("No such fixture (ID: %1)").arg(id); } }