// // Paint all visible fixture labels // void Monitor::paintFixtureLabelAll(QRegion region, int x_offset, int y_offset, int unitW, int unitH, int unitsX) { int x = 0; int y = 0; int w = 0; int wcur = 0; int h = 0; t_fixture_id id = KNoID; Fixture* fxi = NULL; // Draw fixture names and their channel spaces for (id = 0; id < KFixtureArraySize; id++) { fxi = _app->doc()->fixture(id); if (fxi == NULL) continue; if (fxi->universe() != m_universe) continue; // Calculate x and y positions for this fixture label x = ((fxi->address() % unitsX) * unitW); x += x_offset; y = static_cast<int> (floor((fxi->address() / unitsX)) * (unitH * 3)); y += y_offset; // Get width and height for this fixture label w = (fxi->channels() * unitW) - X_OFFSET; h = unitH; // Check if this label needs to be painted at all if (region.contains(QRect(x, y, w, h)) == false) continue; if ((x + w + X_OFFSET) <= width()) { // The label fits to one line, just draw it paintFixtureLabel(x, y, w, h, fxi->name()); } else { // The label needs to be drawn on at least two lines while (w > 0) { wcur = MIN(w, (unitsX * unitW) - (x)); // Draw the label paintFixtureLabel(x, y, wcur, h, fxi->name()); // Calculate remaining width w = w - wcur - X_OFFSET; // Next line y += (unitH * 3); x = x_offset; } } } }
void EFXFixture::setPointPanTilt(QList<Universe *> universes, float pan, float tilt) { Fixture* fxi = doc()->fixture(head().fxi); Q_ASSERT(fxi != NULL); /* Write coarse point data to universes */ if (fxi->panMsbChannel(head().head) != QLCChannel::invalid()) { if (m_parent->isRelative()) universes[fxi->universe()]->writeRelative(fxi->address() + fxi->panMsbChannel(head().head), static_cast<char>(pan)); else universes[fxi->universe()]->write(fxi->address() + fxi->panMsbChannel(head().head), static_cast<char>(pan)); } if (fxi->tiltMsbChannel(head().head) != QLCChannel::invalid()) { if (m_parent->isRelative()) universes[fxi->universe()]->writeRelative(fxi->address() + fxi->tiltMsbChannel(head().head), static_cast<char> (tilt)); else universes[fxi->universe()]->write(fxi->address() + fxi->tiltMsbChannel(head().head), static_cast<char> (tilt)); } /* Write fine point data to universes if applicable */ if (fxi->panLsbChannel(head().head) != QLCChannel::invalid()) { /* Leave only the fraction */ char value = static_cast<char> ((pan - floor(pan)) * double(UCHAR_MAX)); if (m_parent->isRelative()) universes[fxi->universe()]->writeRelative(fxi->address() + fxi->panLsbChannel(head().head), value); else universes[fxi->universe()]->write(fxi->address() + fxi->panLsbChannel(head().head), value); } if (fxi->tiltLsbChannel(head().head) != QLCChannel::invalid()) { /* Leave only the fraction */ char value = static_cast<char> ((tilt - floor(tilt)) * double(UCHAR_MAX)); if (m_parent->isRelative()) universes[fxi->universe()]->writeRelative(fxi->address() + fxi->tiltLsbChannel(head().head), value); else universes[fxi->universe()]->write(fxi->address() + fxi->tiltLsbChannel(head().head), value); } }
void MonitorGraphicsView::writeUniverse(int index, const QByteArray &ua) { QHashIterator <quint32, MonitorFixtureItem*> it(m_fixtures); while (it.hasNext() == true) { it.next(); quint32 fid = it.key(); Fixture *fxi = m_doc->fixture(fid); // preliminary validity checks if (fxi == NULL || fxi->universe() != (quint32)index || fxi->address() > (quint32)ua.size()) { continue; } MonitorFixtureItem *item = it.value(); item->updateValues(ua); } }
void Fixture_Test::loader() { QBuffer buffer; buffer.open(QIODevice::WriteOnly | QIODevice::Text); QXmlStreamWriter xmlWriter(&buffer); xmlWriter.writeStartElement("Fixture"); xmlWriter.writeTextElement("Channels", "18"); xmlWriter.writeTextElement("Name", "Foobar"); xmlWriter.writeTextElement("Universe", "3"); xmlWriter.writeTextElement("Model", "Foobar"); xmlWriter.writeTextElement("Mode", "Foobar"); xmlWriter.writeTextElement("Manufacturer", "Foobar"); xmlWriter.writeTextElement("ID", "42"); xmlWriter.writeTextElement("Address", "21"); xmlWriter.writeEndDocument(); xmlWriter.setDevice(NULL); buffer.close(); buffer.open(QIODevice::ReadOnly | QIODevice::Text); QXmlStreamReader xmlReader(&buffer); xmlReader.readNextStartElement(); QVERIFY(m_doc != NULL); QVERIFY(m_doc->fixtures().size() == 0); QVERIFY(Fixture::loader(xmlReader, m_doc) == true); QVERIFY(m_doc->fixtures().size() == 1); QVERIFY(m_doc->fixture(0) == NULL); // No ID auto-assignment Fixture* fxi = m_doc->fixture(42); QVERIFY(fxi != NULL); QVERIFY(fxi->name() == "Foobar"); QVERIFY(fxi->channels() == 18); QVERIFY(fxi->address() == 21); QVERIFY(fxi->universe() == 3); QVERIFY(fxi->fixtureDef() != NULL); QVERIFY(fxi->fixtureMode() != NULL); }
void MonitorFixture::slotChannelStyleChanged(Monitor::ChannelStyle style) { QString str; int i = 0; m_channelStyle = style; /* Check that this MonitorFixture represents a fixture */ if (m_fixture == Fixture::invalidId()) return; Fixture* fxi = m_doc->fixture(m_fixture); Q_ASSERT(fxi != NULL); /* Start channel numbering from this fixture's address */ if (style == Monitor::DMXChannels) i = fxi->address() + 1; else i = 1; QListIterator <QLabel*> it(m_channelLabels); while (it.hasNext() == true) it.next()->setText(str.sprintf("<B>%.3d</B>", i++)); }
void Fixture_Test::loader() { QDomDocument doc; QDomElement root = doc.createElement("Fixture"); doc.appendChild(root); QDomElement chs = doc.createElement("Channels"); QDomText chsText = doc.createTextNode("18"); chs.appendChild(chsText); root.appendChild(chs); QDomElement name = doc.createElement("Name"); QDomText nameText = doc.createTextNode("Foobar"); name.appendChild(nameText); root.appendChild(name); QDomElement uni = doc.createElement("Universe"); QDomText uniText = doc.createTextNode("3"); uni.appendChild(uniText); root.appendChild(uni); QDomElement model = doc.createElement("Model"); QDomText modelText = doc.createTextNode("Foobar"); model.appendChild(modelText); root.appendChild(model); QDomElement mode = doc.createElement("Mode"); QDomText modeText = doc.createTextNode("Foobar"); mode.appendChild(modeText); root.appendChild(mode); QDomElement type = doc.createElement("Manufacturer"); QDomText typeText = doc.createTextNode("Foobar"); type.appendChild(typeText); root.appendChild(type); QDomElement id = doc.createElement("ID"); QDomText idText = doc.createTextNode("42"); id.appendChild(idText); root.appendChild(id); QDomElement addr = doc.createElement("Address"); QDomText addrText = doc.createTextNode("21"); addr.appendChild(addrText); root.appendChild(addr); Doc* qlcdoc = new Doc(this, m_fixtureDefCache); QVERIFY(qlcdoc != NULL); QVERIFY(qlcdoc->fixtures() == 0); QVERIFY(Fixture::loader(&root, qlcdoc) == true); QVERIFY(qlcdoc->fixtures() == 1); QVERIFY(qlcdoc->fixture(0) == NULL); // No ID auto-assignment Fixture* fxi = qlcdoc->fixture(42); QVERIFY(fxi != NULL); QVERIFY(fxi->name() == "Foobar"); QVERIFY(fxi->channels() == 18); QVERIFY(fxi->address() == 21); QVERIFY(fxi->universe() == 3); QVERIFY(fxi->fixtureDef() == NULL); QVERIFY(fxi->fixtureMode() == NULL); delete qlcdoc; }
void MonitorFixture_Test::channelValueStyles() { QWidget w; Fixture* fxi = new Fixture(m_doc); fxi->setChannels(6); fxi->setAddress(10); fxi->setName("Foobar"); m_doc->addFixture(fxi); QVERIFY(fxi->id() != Fixture::invalidId()); MonitorFixture mof(&w, m_doc); mof.setFixture(fxi->id()); mof.updateLabelStyles(); for (int i = 0; i < mof.m_channelLabels.size(); i++) { QString str; QVERIFY(mof.m_channelLabels[i] != NULL); QCOMPARE(mof.m_channelLabels[i]->text(), str.sprintf("<B>%.3d</B>", i + fxi->address() + 1)); QVERIFY(mof.m_valueLabels[i] != NULL); QCOMPARE(mof.m_valueLabels[i]->text(), QString("000")); } mof.slotChannelStyleChanged(Monitor::RelativeChannels); mof.updateLabelStyles(); for (int i = 0; i < mof.m_channelLabels.size(); i++) { QString str; QVERIFY(mof.m_channelLabels[i] != NULL); QCOMPARE(mof.m_channelLabels[i]->text(), str.sprintf("<B>%.3d</B>", i + 1)); QVERIFY(mof.m_valueLabels[i] != NULL); QCOMPARE(mof.m_valueLabels[i]->text(), QString("000")); } mof.slotChannelStyleChanged(Monitor::DMXChannels); for (int i = 0; i < mof.m_channelLabels.size(); i++) { QString str; QVERIFY(mof.m_channelLabels[i] != NULL); QCOMPARE(mof.m_channelLabels[i]->text(), str.sprintf("<B>%.3d</B>", i + fxi->address() + 1)); QVERIFY(mof.m_valueLabels[i] != NULL); QCOMPARE(mof.m_valueLabels[i]->text(), QString("000")); } for (int i = 0; i < mof.m_valueLabels.size(); i++) { QString str; mof.m_valueLabels[i]->setText(str.sprintf("%.3d", (i + 1) * 10)); } mof.slotValueStyleChanged(Monitor::PercentageValues); for (int i = 0; i < mof.m_channelLabels.size(); i++) { QString str; QVERIFY(mof.m_channelLabels[i] != NULL); QCOMPARE(mof.m_channelLabels[i]->text(), str.sprintf("<B>%.3d</B>", i + fxi->address() + 1)); QVERIFY(mof.m_valueLabels[i] != NULL); QCOMPARE(mof.m_valueLabels[i]->text(), str.sprintf("%.3d", (int) ceil(SCALE(qreal((i + 1) * 10), qreal(0), qreal(UCHAR_MAX), qreal(0), qreal(100))))); } }
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); } }