Example #1
0
//
// 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;
			}
		}
	}
}
Example #2
0
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);
    }
}
Example #3
0
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);
    }
}
Example #4
0
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);
}
Example #5
0
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++));
}
Example #6
0
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)))));
    }
}
Example #8
0
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);
    }
}