void QLCFixtureMode_Test::channelNumber() { QLCFixtureMode* mode = new QLCFixtureMode(m_fixtureDef); mode->insertChannel(m_ch1, 0); mode->insertChannel(m_ch2, 1); mode->insertChannel(m_ch3, 2); mode->insertChannel(m_ch4, 3); QVERIFY(mode->channelNumber(m_ch1) == 0); QVERIFY(mode->channelNumber(m_ch2) == 1); QVERIFY(mode->channelNumber(m_ch3) == 2); QVERIFY(mode->channelNumber(m_ch4) == 3); QLCChannel* ch = new QLCChannel(); QVERIFY(mode->channelNumber(ch) == KChannelInvalid); QVERIFY(mode->channelNumber(NULL) == KChannelInvalid); delete ch; delete mode; }
void AddFixture_Test::initialScanner() { Fixture* fxi = new Fixture(m_doc); fxi->setName("My scanner"); QLCFixtureDef* def = m_doc->fixtureDefCache()->fixtureDef("Martin", "MAC300"); Q_ASSERT(def != NULL); Q_ASSERT(def != NULL); Q_ASSERT(def->channels().size() > 0); QLCFixtureMode* mode = def->modes().first(); Q_ASSERT(def->modes().size() > 1); fxi->setFixtureDefinition(def, mode); fxi->setUniverse(2); fxi->setAddress(484); m_doc->addFixture(fxi); AddFixture af(NULL, m_doc, fxi); QVERIFY(m_doc == af.m_doc); QVERIFY(af.fixtureDef() == def); QVERIFY(af.mode() == mode); QVERIFY(af.name() == QString("My scanner")); QVERIFY(af.address() == 484); QVERIFY(af.universe() == 2); QVERIFY(af.amount() == 1); QVERIFY(af.gap() == 0); QVERIFY(af.channels() == fxi->channels()); // Check that all makes & models are put to the tree QStringList makers(m_doc->fixtureDefCache()->manufacturers()); QVERIFY(makers.isEmpty() == false); for (int i = 0; i < af.m_tree->topLevelItemCount(); i++) { QTreeWidgetItem* top = af.m_tree->topLevelItem(i); if (top->text(0) != KXMLFixtureGeneric) { QStringList models(m_doc->fixtureDefCache()->models(top->text(0))); for (int j = 0; j < top->childCount(); j++) { QTreeWidgetItem* child = top->child(j); QCOMPARE(child->childCount(), 0); QCOMPARE(models.removeAll(child->text(0)), 1); } QCOMPARE(makers.removeAll(top->text(0)), 1); } else { QCOMPARE(i, af.m_tree->topLevelItemCount() - 1); // Generic should be last QCOMPARE(top->childCount(), 3); QCOMPARE(top->child(0)->text(0), QString(KXMLFixtureGeneric)); QStringList models(m_doc->fixtureDefCache()->models(top->text(0))); for (int j = 0; j < top->childCount(); j++) { QTreeWidgetItem* child = top->child(j); QCOMPARE(child->childCount(), 0); QCOMPARE(models.removeAll(child->text(0)), child->text(0) == KXMLFixtureGeneric ? 0 : 1); } QCOMPARE(makers.removeAll(top->text(0)), 1); } } QVERIFY(makers.isEmpty() == true); // Generic / Generic should be selected for dimmers QVERIFY(af.m_tree->currentItem() != NULL); QCOMPARE(af.m_tree->currentItem()->text(0), def->model()); QVERIFY(af.m_tree->currentItem()->parent() != NULL); QCOMPARE(af.m_tree->currentItem()->parent()->text(0), def->manufacturer()); QVERIFY(af.m_modeCombo->isEnabled() == true); QCOMPARE(af.m_modeCombo->count(), def->modes().size()); QCOMPARE(af.m_modeCombo->itemText(0), mode->name()); QVERIFY(af.m_universeCombo->isEnabled() == true); QCOMPARE(af.m_universeCombo->currentIndex(), 2); QCOMPARE(af.m_universeCombo->count(), 4); QVERIFY(af.m_addressSpin->isEnabled() == true); QCOMPARE(af.m_addressSpin->value(), 485); QVERIFY(af.m_channelsSpin->isEnabled() == false); QCOMPARE(af.m_channelsSpin->value(), (int) fxi->channels()); QVERIFY(af.m_nameEdit->isEnabled() == true); QCOMPARE(af.m_nameEdit->text(), QString("My scanner")); QVERIFY(af.m_nameEdit->isModified() == true); QVERIFY(af.m_multipleGroup->isEnabled() == false); QVERIFY(af.m_gapSpin->isEnabled() == false); QCOMPARE(af.m_gapSpin->value(), 0); QVERIFY(af.m_amountSpin->isEnabled() == false); QCOMPARE(af.m_amountSpin->value(), 1); }
void EFX::arm() { class Scene* startScene = NULL; class Scene* stopScene = NULL; QLCFixtureMode* mode = NULL; QLCChannel* ch = NULL; int serialNumber = 0; Fixture* fxi = NULL; /* Initialization scene */ if (m_startSceneID != KNoID && m_startSceneEnabled == true) startScene = static_cast <class Scene*> (_app->doc()->function(m_startSceneID)); /* De-initialization scene */ if (m_stopSceneID != KNoID && m_stopSceneEnabled == true) stopScene = static_cast <class Scene*> (_app->doc()->function(m_stopSceneID)); QListIterator <EFXFixture*> it(m_fixtures); while (it.hasNext() == true) { EFXFixture* ef = it.next(); Q_ASSERT(ef != NULL); ef->setSerialNumber(serialNumber++); ef->setStartScene(startScene); ef->setStopScene(stopScene); /* If fxi == NULL, the fixture has been destroyed */ fxi = _app->doc()->fixture(ef->fixture()); if (fxi == NULL) continue; /* If this fixture has no mode, it's a generic dimmer that can't do pan&tilt anyway. */ mode = fxi->fixtureMode(); if (mode == NULL) continue; /* Find exact channel numbers for MSB/LSB pan and tilt */ for (t_channel i = 0; i < mode->channels(); i++) { ch = mode->channel(i); Q_ASSERT(ch != NULL); if (ch->group() == KQLCChannelGroupPan) { if (ch->controlByte() == 0) { ef->setMsbPanChannel( fxi->universeAddress() + i); } else if (ch->controlByte() == 1) { ef->setLsbPanChannel( fxi->universeAddress() + i); } } else if (ch->group() == KQLCChannelGroupTilt) { if (ch->controlByte() == 0) { ef->setMsbTiltChannel( fxi->universeAddress() + i); } else if (ch->controlByte() == 1) { ef->setLsbTiltChannel( fxi->universeAddress() + i); } } } } /* Choose a point calculation function depending on the algorithm */ if (m_algorithm == KCircleAlgorithmName) pointFunc = circlePoint; else if (m_algorithm == KEightAlgorithmName) pointFunc = eightPoint; else if (m_algorithm == KLineAlgorithmName) pointFunc = linePoint; else if (m_algorithm == KTriangleAlgorithmName) pointFunc = trianglePoint; else if (m_algorithm == KDiamondAlgorithmName) pointFunc = diamondPoint; else if (m_algorithm == KLissajousAlgorithmName) pointFunc = lissajousPoint; else pointFunc = NULL; }
void QLCFixtureMode_Test::insertChannel() { QLCFixtureMode* mode = new QLCFixtureMode(m_fixtureDef); mode->setName("Test"); QVERIFY(mode->insertChannel(NULL, 0) == false); QVERIFY(mode->channels().size() == 0); /* Channel that doesn't belong to mode->fixtureDef() */ QLCChannel* ch = new QLCChannel(); ch->setName("Rogue"); mode->insertChannel(ch, 0); QVERIFY(mode->channels().size() == 0); delete ch; /* First channel */ mode->insertChannel(m_ch1, 0); QVERIFY(mode->channel(0) == m_ch1); /* Second prepended */ mode->insertChannel(m_ch2, 0); QVERIFY(mode->channel(0) == m_ch2); QVERIFY(mode->channel(1) == m_ch1); /* Third appended way over the end */ mode->insertChannel(m_ch3, 10); QVERIFY(mode->channel(0) == m_ch2); QVERIFY(mode->channel(1) == m_ch1); QVERIFY(mode->channel(2) == m_ch3); /* Fourth inserted in-between */ mode->insertChannel(m_ch4, 1); QVERIFY(mode->channel(0) == m_ch2); QVERIFY(mode->channel(1) == m_ch4); QVERIFY(mode->channel(2) == m_ch1); QVERIFY(mode->channel(3) == m_ch3); delete mode; }
void QLCFixtureMode_Test::copy() { QLCFixtureMode* mode = new QLCFixtureMode(m_fixtureDef); mode->setName("Test Mode"); mode->insertChannel(m_ch1, 0); mode->insertChannel(m_ch2, 1); mode->insertChannel(m_ch3, 2); mode->insertChannel(m_ch4, 3); /* Create a copy of the mode to the same fixtureDef as the original */ QLCFixtureMode* copy = new QLCFixtureMode(m_fixtureDef, mode); QVERIFY(copy != NULL); QVERIFY(copy->name() == "Test Mode"); QVERIFY(copy->channels().size() == 4); QVERIFY(copy->channel(0) == m_ch1); QVERIFY(copy->channel(1) == m_ch2); QVERIFY(copy->channel(2) == m_ch3); QVERIFY(copy->channel(3) == m_ch4); delete copy; copy = NULL; /* Create another fixture def with some channels matching, some not */ QLCFixtureDef* anotherDef = new QLCFixtureDef(); QLCChannel* ch1 = new QLCChannel(); ch1->setName("Channel 1"); // Should match anotherDef->addChannel(ch1); QLCChannel* ch2 = new QLCChannel(); ch2->setName("Channel 2, not the same name"); // Shouldn't match anotherDef->addChannel(ch2); QLCChannel* ch3 = new QLCChannel(); ch3->setName("Channel 3, still not the same name"); // Shouldn't match anotherDef->addChannel(ch3); QLCChannel* ch4 = new QLCChannel(); ch4->setName("Channel 4"); // Should match anotherDef->addChannel(ch4); QLCChannel* ch5 = new QLCChannel(); ch5->setName("Channel 5"); // Shouldn't match since original has 4 chans anotherDef->addChannel(ch5); /* Create a copy of the mode to the other fixtureDef */ copy = new QLCFixtureMode(anotherDef, mode); QVERIFY(copy->name() == "Test Mode"); QVERIFY(copy->channels().size() == 2); QVERIFY(copy->channel(0)->name() == "Channel 1"); QVERIFY(copy->channel(0) == ch1); QVERIFY(copy->channel(1)->name() == "Channel 4"); QVERIFY(copy->channel(1) == ch4); delete copy; delete anotherDef; }
void QLCFixtureMode_Test::removeChannel() { QLCFixtureMode* mode = new QLCFixtureMode(m_fixtureDef); mode->insertChannel(m_ch1, 0); mode->insertChannel(m_ch2, 1); mode->insertChannel(m_ch3, 2); mode->insertChannel(m_ch4, 3); /* Remove one channel in the middle */ QVERIFY(mode->channels().size() == 4); mode->removeChannel(m_ch2); QVERIFY(mode->channels().size() == 3); QVERIFY(mode->channel(0) == m_ch1); QVERIFY(mode->channel(1) == m_ch3); QVERIFY(mode->channel(2) == m_ch4); QVERIFY(mode->channel(3) == NULL); /* Remove the same channel again. Shouldn't change anything. */ mode->removeChannel(m_ch2); QVERIFY(mode->channels().size() == 3); QVERIFY(mode->channel(0) == m_ch1); QVERIFY(mode->channel(1) == m_ch3); QVERIFY(mode->channel(2) == m_ch4); QVERIFY(mode->channel(3) == NULL); /* Remove last channel. */ mode->removeChannel(m_ch4); QVERIFY(mode->channels().size() == 2); QVERIFY(mode->channel(0) == m_ch1); QVERIFY(mode->channel(1) == m_ch3); QVERIFY(mode->channel(2) == NULL); QVERIFY(mode->channel(3) == NULL); /* Remove first channel. */ mode->removeChannel(m_ch1); QVERIFY(mode->channels().size() == 1); QVERIFY(mode->channel(0) == m_ch3); QVERIFY(mode->channel(1) == NULL); QVERIFY(mode->channel(2) == NULL); QVERIFY(mode->channel(3) == NULL); /* Remove last channel. */ mode->removeChannel(m_ch3); QVERIFY(mode->channels().size() == 0); QVERIFY(mode->channel(0) == NULL); QVERIFY(mode->channel(1) == NULL); QVERIFY(mode->channel(2) == NULL); QVERIFY(mode->channel(3) == NULL); delete mode; }
void Fixture_Test::save() { QLCFixtureDef* fixtureDef; fixtureDef = m_doc->fixtureDefCache()->fixtureDef("Martin", "MAC250+"); Q_ASSERT(fixtureDef != NULL); QLCFixtureMode* fixtureMode; fixtureMode = fixtureDef->modes().at(0); Q_ASSERT(fixtureMode != NULL); Fixture fxi(this); fxi.setID(1337); fxi.setName("Test Fixture"); fxi.setUniverse(2); fxi.setAddress(438); fxi.setFixtureDefinition(fixtureDef, fixtureMode); QBuffer buffer; buffer.open(QIODevice::WriteOnly | QIODevice::Text); QXmlStreamWriter xmlWriter(&buffer); xmlWriter.writeStartElement("TestRoot"); QVERIFY(fxi.saveXML(&xmlWriter) == true); xmlWriter.setDevice(NULL); buffer.close(); buffer.open(QIODevice::ReadOnly | QIODevice::Text); QXmlStreamReader xmlReader(&buffer); xmlReader.readNextStartElement(); QVERIFY(xmlReader.name().toString() == "TestRoot"); xmlReader.readNextStartElement(); QVERIFY(xmlReader.name().toString() == "Fixture"); bool manufacturer = false, model = false, mode = false, name = false, channels = false, universe = false, address = false, id = false; while (xmlReader.readNextStartElement()) { if (xmlReader.name() == "Manufacturer") { QVERIFY(xmlReader.readElementText() == "Martin"); manufacturer = true; } else if (xmlReader.name() == "Model") { QVERIFY(xmlReader.readElementText() == "MAC250+"); model = true; } else if (xmlReader.name() == "Mode") { QVERIFY(xmlReader.readElementText() == fixtureMode->name()); mode = true; } else if (xmlReader.name() == "ID") { QVERIFY(xmlReader.readElementText() == "1337"); id = true; } else if (xmlReader.name() == "Name") { QVERIFY(xmlReader.readElementText() == "Test Fixture"); name = true; } else if (xmlReader.name() == "Universe") { QVERIFY(xmlReader.readElementText() == "2"); universe = true; } else if (xmlReader.name() == "Address") { QVERIFY(xmlReader.readElementText() == "438"); address = true; } else if (xmlReader.name() == "Channels") { QVERIFY(xmlReader.readElementText().toInt() == fixtureMode->channels().count()); channels = true; } else { QFAIL(QString("Unexpected tag: %1").arg(xmlReader.name().toString()) .toLatin1()); xmlReader.skipCurrentElement(); } } QVERIFY(manufacturer == true); QVERIFY(model == true); QVERIFY(mode == true); QVERIFY(id == true); QVERIFY(name == true); QVERIFY(universe == true); QVERIFY(address == true); QVERIFY(channels == true); }
void FixtureGroup_Test::assignFixtureNoSize() { QLCPoint pt; FixtureGroup grp(m_doc); QCOMPARE(grp.headList().size(), 0); Fixture* fxi = new Fixture(m_doc); fxi->setChannels(2); m_doc->addFixture(fxi); grp.assignFixture(fxi->id()); QCOMPARE(grp.headList().size(), 2); QCOMPARE(grp.size(), QSize(1, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 0)] == GroupHead(0, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 1)] == GroupHead(0, 1)); // Same fixture can't be at two places grp.assignFixture(0, QLCPoint(100, 100)); QCOMPARE(grp.headList().size(), 2); QCOMPARE(grp.size(), QSize(1, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 0)] == GroupHead(0, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 1)] == GroupHead(0, 1)); fxi = new Fixture(m_doc); fxi->setChannels(1); m_doc->addFixture(fxi); grp.assignFixture(fxi->id()); QCOMPARE(grp.headList().size(), 3); QCOMPARE(grp.size(), QSize(1, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 0)] == GroupHead(0, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 1)] == GroupHead(0, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 2)] == GroupHead(1, 0)); QLCFixtureDef* def = m_doc->fixtureDefCache()->fixtureDef("Futurelight", "DJScan250"); QVERIFY(def != NULL); QLCFixtureMode* mode = def->modes().first(); QVERIFY(mode != NULL); fxi = new Fixture(m_doc); fxi->setFixtureDefinition(def, mode); m_doc->addFixture(fxi); grp.assignFixture(fxi->id()); QCOMPARE(grp.headList().size(), 4); QCOMPARE(grp.size(), QSize(1, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 0)] == GroupHead(0, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 1)] == GroupHead(0, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 2)] == GroupHead(1, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 3)] == GroupHead(2, 0)); def = m_doc->fixtureDefCache()->fixtureDef("i-Pix", "BB4"); QVERIFY(def != NULL); mode = def->modes().last(); QVERIFY(mode != NULL); QCOMPARE(mode->heads().size(), 4); fxi = new Fixture(m_doc); fxi->setFixtureDefinition(def, mode); m_doc->addFixture(fxi); grp.assignFixture(fxi->id()); QCOMPARE(grp.headList().size(), 8); QCOMPARE(grp.size(), QSize(1, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 0)] == GroupHead(0, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 1)] == GroupHead(0, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 2)] == GroupHead(1, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 3)] == GroupHead(2, 0)); // BB4 heads QVERIFY(grp.headHash()[QLCPoint(0, 4)] == GroupHead(3, 0)); QVERIFY(grp.headHash()[QLCPoint(0, 5)] == GroupHead(3, 1)); QVERIFY(grp.headHash()[QLCPoint(0, 6)] == GroupHead(3, 2)); QVERIFY(grp.headHash()[QLCPoint(0, 7)] == GroupHead(3, 3)); }
bool QLCFixtureDef::loadXML(QXmlStreamReader& doc) { bool retval = false; if (doc.readNextStartElement() == false) return false; if (doc.name() == KXMLQLCFixtureDef) { while (doc.readNextStartElement()) { if (doc.name() == KXMLQLCCreator) { loadCreator(doc); } else if (doc.name() == KXMLQLCFixtureDefManufacturer) { setManufacturer(doc.readElementText()); } else if (doc.name() == KXMLQLCFixtureDefModel) { setModel(doc.readElementText()); } else if (doc.name() == KXMLQLCFixtureDefType) { setType(doc.readElementText()); } else if (doc.name() == KXMLQLCChannel) { QLCChannel* ch = new QLCChannel(); if (ch->loadXML(doc) == true) { /* Loading succeeded */ if (addChannel(ch) == false) { /* Channel already exists */ delete ch; } } else { /* Loading failed */ delete ch; } } else if (doc.name() == KXMLQLCFixtureMode) { QLCFixtureMode* mode = new QLCFixtureMode(this); if (mode->loadXML(doc) == true) { /* Loading succeeded */ if (addMode(mode) == false) { /* Mode already exists */ delete mode; } } else { /* Loading failed */ delete mode; } } else { qWarning() << Q_FUNC_INFO << "Unknown Fixture tag: " << doc.name(); doc.skipCurrentElement(); } } retval = true; } else { qWarning() << Q_FUNC_INFO << "Fixture node not found"; retval = false; } if (retval == true) m_isLoaded = true; return retval; }
void QLCFixtureMode_Test::heads() { QLCFixtureMode* mode = new QLCFixtureMode(m_fixtureDef); QLCFixtureHead head; head.addChannel(0); head.addChannel(10); head.addChannel(20); mode->insertHead(-1, head); QCOMPARE(mode->heads().size(), 1); QVERIFY(mode->m_heads[0].m_channels.contains(0) == true); QVERIFY(mode->m_heads[0].m_channels.contains(10) == true); QVERIFY(mode->m_heads[0].m_channels.contains(20) == true); QLCFixtureHead head2; head2.addChannel(1); head2.addChannel(2); mode->insertHead(10, head2); QCOMPARE(mode->heads().size(), 2); QVERIFY(mode->m_heads[0].m_channels.contains(0) == true); QVERIFY(mode->m_heads[0].m_channels.contains(10) == true); QVERIFY(mode->m_heads[0].m_channels.contains(20) == true); QVERIFY(mode->m_heads[1].m_channels.contains(0) == false); QVERIFY(mode->m_heads[1].m_channels.contains(1) == true); QVERIFY(mode->m_heads[1].m_channels.contains(2) == true); QLCFixtureHead head3; head3.addChannel(3); head3.addChannel(4); mode->insertHead(1, head3); QCOMPARE(mode->heads().size(), 3); QVERIFY(mode->m_heads[0].m_channels.contains(0) == true); QVERIFY(mode->m_heads[0].m_channels.contains(10) == true); QVERIFY(mode->m_heads[0].m_channels.contains(20) == true); QVERIFY(mode->m_heads[1].m_channels.contains(3) == true); QVERIFY(mode->m_heads[1].m_channels.contains(4) == true); QVERIFY(mode->m_heads[2].m_channels.contains(1) == true); QVERIFY(mode->m_heads[2].m_channels.contains(2) == true); QLCFixtureHead head4; head4.addChannel(15); head4.addChannel(16); mode->replaceHead(4, head4); QCOMPARE(mode->heads().size(), 3); QVERIFY(mode->m_heads[0].m_channels.contains(0) == true); QVERIFY(mode->m_heads[0].m_channels.contains(10) == true); QVERIFY(mode->m_heads[0].m_channels.contains(20) == true); QVERIFY(mode->m_heads[1].m_channels.contains(3) == true); QVERIFY(mode->m_heads[1].m_channels.contains(4) == true); QVERIFY(mode->m_heads[2].m_channels.contains(1) == true); QVERIFY(mode->m_heads[2].m_channels.contains(2) == true); mode->replaceHead(2, head4); QCOMPARE(mode->heads().size(), 3); QVERIFY(mode->m_heads[0].m_channels.contains(0) == true); QVERIFY(mode->m_heads[0].m_channels.contains(10) == true); QVERIFY(mode->m_heads[0].m_channels.contains(20) == true); QVERIFY(mode->m_heads[1].m_channels.contains(3) == true); QVERIFY(mode->m_heads[1].m_channels.contains(4) == true); QVERIFY(mode->m_heads[2].m_channels.contains(15) == true); QVERIFY(mode->m_heads[2].m_channels.contains(16) == true); mode->removeHead(15); QCOMPARE(mode->heads().size(), 3); mode->removeHead(1); QCOMPARE(mode->heads().size(), 2); QVERIFY(mode->m_heads[0].m_channels.contains(0) == true); QVERIFY(mode->m_heads[0].m_channels.contains(10) == true); QVERIFY(mode->m_heads[0].m_channels.contains(20) == true); QVERIFY(mode->m_heads[1].m_channels.contains(15) == true); QVERIFY(mode->m_heads[1].m_channels.contains(16) == true); mode->removeHead(0); QCOMPARE(mode->heads().size(), 1); QVERIFY(mode->m_heads[0].m_channels.contains(15) == true); QVERIFY(mode->m_heads[0].m_channels.contains(16) == true); mode->removeHead(0); QCOMPARE(mode->heads().size(), 0); delete mode; }
/** * Prepare this function for running. This is called when * the user sets the mode to Operate. Basically allocates everything * that is needed to run the function. */ void EFX::arm() { class Scene* startScene = NULL; class Scene* stopScene = NULL; QLCFixtureMode* mode = NULL; QLCChannel* ch = NULL; t_fixture_id fxi_id = KNoID; Fixture* fxi = NULL; int channels = 0; int order = 0; m_channels = 0; /* Initialization scene */ if (m_startSceneID != KNoID && m_startSceneEnabled == true) { startScene = static_cast <class Scene*> (_app->doc()->function(m_startSceneID)); Q_ASSERT(startScene != NULL); } /* De-initialization scene */ if (m_stopSceneID != KNoID && m_stopSceneEnabled == true) { stopScene = static_cast <class Scene*> (_app->doc()->function(m_stopSceneID)); Q_ASSERT(stopScene != NULL); } QListIterator <t_function_id> it(m_fixtures); while (it.hasNext() == true) { fxi_id = it.next(); Q_ASSERT(fxi_id != KNoID); EFXFixture ef(this, fxi_id, m_channels, order, m_direction, startScene, stopScene); fxi = _app->doc()->fixture(fxi_id); Q_ASSERT(fxi != NULL); mode = fxi->fixtureMode(); Q_ASSERT(mode != NULL); channels = 0; for (t_channel i = 0; i < mode->channels(); i++) { ch = mode->channel(i); Q_ASSERT(ch != NULL); if (ch->group() == KQLCChannelGroupPan) { if (ch->controlByte() == 0) { ef.setMsbPanChannel( fxi->universeAddress() + i); channels++; } else if (ch->controlByte() == 1) { ef.setLsbPanChannel( fxi->universeAddress() + i); channels++; } } else if (ch->group() == KQLCChannelGroupTilt) { if (ch->controlByte() == 0) { ef.setMsbTiltChannel( fxi->universeAddress() + i); channels++; } else if (ch->controlByte() == 1) { ef.setLsbTiltChannel( fxi->universeAddress() + i); channels++; } } } /* The fixture must have at least an LSB channel for 8bit precision to get accepted into the EFX */ if (ef.isValid() == true) { ef.updateSkipThreshold(); m_runTimeData.append(ef); m_channels += channels; order++; } } /* Allocate space for channel data that is set to the eventbuffer */ if (m_channelData == NULL) m_channelData = new unsigned int[m_channels]; /* Allocate space for the event buffer, 1/2 seconds worth of events */ if (m_eventBuffer == NULL) m_eventBuffer = new EventBuffer(m_channels, KFrequency >> 1); /* Choose a point calculation function depending on the algorithm */ if (m_algorithm == KCircleAlgorithmName) pointFunc = circlePoint; else if (m_algorithm == KEightAlgorithmName) pointFunc = eightPoint; else if (m_algorithm == KLineAlgorithmName) pointFunc = linePoint; else if (m_algorithm == KTriangleAlgorithmName) pointFunc = trianglePoint; else if (m_algorithm == KDiamondAlgorithmName) pointFunc = diamondPoint; else if (m_algorithm == KLissajousAlgorithmName) pointFunc = lissajousPoint; else pointFunc = NULL; }
void MainView2D::createFixtureItem(quint32 fxID, quint16 headIndex, quint16 linkedIndex, QVector3D pos, bool mmCoords) { if (isEnabled() == false) return; if (m_gridItem == NULL) initialize2DProperties(); qDebug() << "[MainView2D] Creating fixture with ID" << fxID << headIndex << linkedIndex << "pos:" << pos; Fixture *fixture = m_doc->fixture(fxID); if (fixture == NULL) return; quint32 itemID = FixtureUtils::fixtureItemID(fxID, headIndex, linkedIndex); QLCFixtureMode *fxMode = fixture->fixtureMode(); QQuickItem *newFixtureItem = qobject_cast<QQuickItem*>(fixtureComponent->create()); quint32 itemFlags = m_monProps->fixtureFlags(fxID, headIndex, linkedIndex); newFixtureItem->setParentItem(m_gridItem); newFixtureItem->setProperty("itemID", itemID); if (itemFlags & MonitorProperties::HiddenFlag) newFixtureItem->setProperty("visible", false); if (fxMode != NULL && fixture->type() != QLCFixtureDef::Dimmer) { QLCPhysical phy = fxMode->physical(); //qDebug() << "Current mode fixture heads:" << fxMode->heads().count(); newFixtureItem->setProperty("headsNumber", fxMode->heads().count()); if (fixture->channelNumber(QLCChannel::Pan, QLCChannel::MSB) != QLCChannel::invalid()) { int panDeg = phy.focusPanMax(); if (panDeg == 0) panDeg = 360; newFixtureItem->setProperty("panMaxDegrees", panDeg); } if (fixture->channelNumber(QLCChannel::Tilt, QLCChannel::MSB) != QLCChannel::invalid()) { int tiltDeg = phy.focusTiltMax(); if (tiltDeg == 0) tiltDeg = 270; newFixtureItem->setProperty("tiltMaxDegrees", tiltDeg); } } QPointF itemPos; QSizeF size = FixtureUtils::item2DDimension(fixture->type() == QLCFixtureDef::Dimmer ? NULL : fxMode, m_monProps->pointOfView()); if (mmCoords == false && (pos.x() != 0 || pos.y() != 0)) { float gridUnits = m_monProps->gridUnits() == MonitorProperties::Meters ? 1000.0 : 304.8; itemPos.setX((pos.x() * gridUnits) / m_cellPixels); itemPos.setY((pos.y() * gridUnits) / m_cellPixels); } if (m_monProps->containsItem(fxID, headIndex, linkedIndex)) { itemPos = FixtureUtils::item2DPosition(m_monProps, m_monProps->pointOfView(), pos); newFixtureItem->setProperty("rotation", FixtureUtils::item2DRotation(m_monProps->pointOfView(), m_monProps->fixtureRotation(fxID, headIndex, linkedIndex))); } else { itemPos = FixtureUtils::available2DPosition(m_doc, m_monProps->pointOfView(), QRectF(itemPos.x(), itemPos.y(), size.width(), size.height())); // add the new fixture to the Doc monitor properties QVector3D newPos = FixtureUtils::item3DPosition(m_monProps, itemPos, 1000.0); m_monProps->setFixturePosition(fxID, headIndex, linkedIndex, newPos); m_monProps->setFixtureFlags(fxID, headIndex, linkedIndex, 0); Tardis::instance()->enqueueAction(Tardis::FixtureSetPosition, itemID, QVariant(QVector3D(0, 0, 0)), QVariant(newPos)); } newFixtureItem->setProperty("mmXPos", itemPos.x()); newFixtureItem->setProperty("mmYPos", itemPos.y()); newFixtureItem->setProperty("mmWidth", size.width()); newFixtureItem->setProperty("mmHeight", size.height()); newFixtureItem->setProperty("fixtureName", fixture->name()); // and finally add the new item to the items map m_itemsMap[itemID] = newFixtureItem; QByteArray values; updateFixture(fixture, values); }
QLCFixtureMode *Fixture::genericRGBPanelMode(QLCFixtureDef *def, Components components, quint32 width, quint32 height) { Q_ASSERT(def != NULL); QLCFixtureMode *mode = new QLCFixtureMode(def); int compNum = 3; if (components == BGR) mode->setName("BGR"); else if (components == BRG) mode->setName("BRG"); else if (components == GBR) mode->setName("GBR"); else if (components == GRB) mode->setName("GRB"); else if (components == RBG) mode->setName("RBG"); else if (components == RGBW) { mode->setName("RGBW"); compNum = 4; } else mode->setName("RGB"); QList<QLCChannel *>channels = def->channels(); for (int i = 0; i < channels.count(); i++) { QLCChannel *ch = channels.at(i); mode->insertChannel(ch, i); if (i%compNum == 0) { QLCFixtureHead head; head.addChannel(i); head.addChannel(i+1); head.addChannel(i+2); if (components == RGBW) head.addChannel(i+3); mode->insertHead(-1, head); } } QLCPhysical physical; physical.setWidth(width); physical.setHeight(height); physical.setDepth(height); mode->setPhysical(physical); def->addMode(mode); return mode; }
void Fixture_Test::save() { QLCFixtureDef* fixtureDef; fixtureDef = m_doc->fixtureDefCache()->fixtureDef("Martin", "MAC250+"); Q_ASSERT(fixtureDef != NULL); QLCFixtureMode* fixtureMode; fixtureMode = fixtureDef->modes().at(0); Q_ASSERT(fixtureMode != NULL); Fixture fxi(this); fxi.setID(1337); fxi.setName("Test Fixture"); fxi.setUniverse(2); fxi.setAddress(438); fxi.setFixtureDefinition(fixtureDef, fixtureMode); QDomDocument doc; QDomElement root = doc.createElement("TestRoot"); QVERIFY(fxi.saveXML(&doc, &root) == true); QDomNode node = root.firstChild(); QVERIFY(node.toElement().tagName() == "Fixture"); bool manufacturer = false, model = false, mode = false, name = false, channels = false, universe = false, address = false, id = false; node = node.firstChild(); while (node.isNull() == false) { QDomElement e = node.toElement(); if (e.tagName() == "Manufacturer") { QVERIFY(e.text() == "Martin"); manufacturer = true; } else if (e.tagName() == "Model") { QVERIFY(e.text() == "MAC250+"); model = true; } else if (e.tagName() == "Mode") { QVERIFY(e.text() == fixtureMode->name()); mode = true; } else if (e.tagName() == "ID") { QVERIFY(e.text() == "1337"); id = true; } else if (e.tagName() == "Name") { QVERIFY(e.text() == "Test Fixture"); name = true; } else if (e.tagName() == "Universe") { QVERIFY(e.text() == "2"); universe = true; } else if (e.tagName() == "Address") { QVERIFY(e.text() == "438"); address = true; } else if (e.tagName() == "Channels") { QVERIFY(e.text().toInt() == fixtureMode->channels().count()); channels = true; } else { QFAIL(QString("Unexpected tag: %1").arg(e.tagName()) .toLatin1()); } node = node.nextSibling(); } QVERIFY(manufacturer == true); QVERIFY(model == true); QVERIFY(mode == true); QVERIFY(id == true); QVERIFY(name == true); QVERIFY(universe == true); QVERIFY(address == true); QVERIFY(channels == true); }
void Fixture_Test::fixtureDef() { Fixture fxi(this); QVERIFY(fxi.fixtureDef() == NULL); QVERIFY(fxi.fixtureMode() == NULL); QVERIFY(fxi.channels() == 0); QVERIFY(fxi.channel(0) == NULL); QCOMPARE(fxi.panMsbChannel(), QLCChannel::invalid()); QCOMPARE(fxi.tiltMsbChannel(), QLCChannel::invalid()); QCOMPARE(fxi.panLsbChannel(), QLCChannel::invalid()); QCOMPARE(fxi.tiltLsbChannel(), QLCChannel::invalid()); QCOMPARE(fxi.masterIntensityChannel(), QLCChannel::invalid()); QLCFixtureDef* fixtureDef; fixtureDef = m_doc->fixtureDefCache()->fixtureDef("Martin", "MAC300"); Q_ASSERT(fixtureDef != NULL); fxi.setFixtureDefinition(fixtureDef, NULL); QVERIFY(fxi.fixtureDef() == NULL); QVERIFY(fxi.fixtureMode() == NULL); QLCFixtureMode* fixtureMode; fixtureMode = fixtureDef->modes().last(); Q_ASSERT(fixtureMode != NULL); fxi.setFixtureDefinition(NULL, fixtureMode); QVERIFY(fxi.fixtureDef() == NULL); QVERIFY(fxi.fixtureMode() == NULL); fxi.setFixtureDefinition(fixtureDef, fixtureMode); QVERIFY(fxi.fixtureDef() != NULL); QVERIFY(fxi.fixtureMode() != NULL); QVERIFY(fxi.fixtureDef() == fixtureDef); QVERIFY(fxi.fixtureMode() == fixtureMode); QVERIFY(fxi.channels() == quint32(fixtureMode->channels().count())); QVERIFY(fxi.channel(fxi.channels() - 1) != NULL); QVERIFY(fxi.channel(fxi.channels()) == NULL); QVERIFY(fxi.channel("Pan") != QLCChannel::invalid()); const QLCChannel* ch = fxi.channel(fxi.channel("Pan")); QVERIFY(ch != NULL); QVERIFY(ch->name().toLower() == "pan"); ch = fxi.channel(fxi.channel("Pan", Qt::CaseInsensitive, QLCChannel::Colour)); QVERIFY(ch == NULL); QVERIFY(fxi.channel("fect") != QLCChannel::invalid()); ch = fxi.channel(fxi.channel("fect")); QVERIFY(ch != NULL); QCOMPARE(ch->name(), QString("Effect speed")); QCOMPARE(fxi.panMsbChannel(), quint32(7)); QCOMPARE(fxi.tiltMsbChannel(), quint32(9)); QCOMPARE(fxi.panLsbChannel(), quint32(8)); QCOMPARE(fxi.tiltLsbChannel(), quint32(10)); QCOMPARE(fxi.masterIntensityChannel(), quint32(1)); QCOMPARE(fxi.rgbChannels(), QList <quint32> ()); QCOMPARE(fxi.cmyChannels(), QList <quint32> () << 2 << 3 << 4); }
bool QLCFixtureDef::loadXML(const QDomDocument& doc) { bool retval = false; QDomElement root = doc.documentElement(); if (root.tagName() == KXMLQLCFixtureDef) { QDomNode node = root.firstChild(); while (node.isNull() == false) { QDomElement tag = node.toElement(); if (tag.tagName() == KXMLQLCCreator) { loadCreator(tag); } else if (tag.tagName() == KXMLQLCFixtureDefManufacturer) { setManufacturer(tag.text()); } else if (tag.tagName() == KXMLQLCFixtureDefModel) { setModel(tag.text()); } else if (tag.tagName() == KXMLQLCFixtureDefType) { setType(tag.text()); } else if (tag.tagName() == KXMLQLCChannel) { QLCChannel* ch = new QLCChannel(); if (ch->loadXML(tag) == true) { /* Loading succeeded */ if (addChannel(ch) == false) { /* Channel already exists */ delete ch; } } else { /* Loading failed */ delete ch; } } else if (tag.tagName() == KXMLQLCFixtureMode) { QLCFixtureMode* mode = new QLCFixtureMode(this); if (mode->loadXML(tag) == true) { /* Loading succeeded */ if (addMode(mode) == false) { /* Mode already exists */ delete mode; } } else { /* Loading failed */ delete mode; } } else { qWarning() << Q_FUNC_INFO << "Unknown Fixture tag: " << tag.tagName(); } node = node.nextSibling(); } retval = true; } else { qWarning() << Q_FUNC_INFO << "Fixture node not found"; retval = false; } return retval; }