Esempio n. 1
0
void ADC::initPins()
{

    int numBits = propertyByName("numBits")->value().toInt();
        // dataInt("numBits");

	if ( numBits < 2 )
		numBits = 2;
	else if ( numBits > max_ADDAC_bits )
		numBits = max_ADDAC_bits;

	if ( numBits == m_numBits )
		return;

	QStringList pins;

	int inPos = (numBits - 1 + (numBits % 2)) / 2;
	for(int i=0; i < inPos; ++i)
		pins += "";

	pins += "In";

	for(int i = inPos + 1; i < numBits; ++i)
		pins += "";

	for(int i = numBits - 1; i >= 0; --i)
		pins += QString::number(i);

//	if(!m_realNode)
//		m_realNode =  ecNodeWithID("In");

	if(numBits > m_numBits) {
		for(int i = m_numBits; i < numBits; ++i) {

			m_logic[i] = new LogicOut(LogicConfig(), false);
		}
	} else {
		for(int i = numBits; i < m_numBits; ++i) {
			QString id = QString::number(i);
            // FIXME cleanup of elements: logic outs and pins
            /*
			removeDisplayText(id);
			removeElement(m_logic[i], false);
			removeNode(id);
            */
			m_logic[i] = 0;
		}
	}
	m_numBits = numBits;
}
Esempio n. 2
0
void DAC::initPins()
{
    int numBits = propertyByName("numBits")->value().toInt();
            // FIXME dataInt("numBits");

	if(numBits < 2) numBits = 2;
	else if(numBits > max_ADDAC_bits)
		numBits = max_ADDAC_bits;

	if(numBits == m_numBits) return;

	QStringList pins;

	for(int i = 0; i < numBits; ++i)
		pins += QString::number(i);

	int inPos = (numBits + 1 + (numBits % 2)) / 2;
	for(int i = numBits - 1; i >= inPos; --i)
		pins += "";

	pins += "Out";

	for(int i = inPos - 2; i >= 0; --i)
		pins += "";

	if(numBits > m_numBits) {
		for(int i = m_numBits; i < numBits; ++i)
		{
			m_logic[i] = new LogicIn(LogicConfig());
		}
	} else {
		for(int i = numBits; i < m_numBits; ++i)
		{
			QString id = QString::number(i);
            // FIXME element removal
            /*
			removeDisplayText(id);
			removeElement(m_logic[i], false);
			removeNode(id);
            */
			m_logic[i] = 0;
		}
	}

	m_numBits = numBits;
}
Esempio n. 3
0
void MultiInputGate::updateInputs(int newNum) {
	if (newNum == m_numInputs) return;

	if (newNum < 2) newNum = 2;
	else if (newNum > maxGateInput)
		newNum = maxGateInput;

	int newWidth = logicSymbolShapeToWidth();

	QRect r(-newWidth / 2, -8 * newNum, newWidth, 16 * newNum);

	setSize(r, true);
	updateSymbolText();

	const bool added = (newNum > m_numInputs);

	if (added) {
		for (int i = m_numInputs; i < newNum; ++i) {
			ECNode *node = createPin(0, 0, 0, "in" + QString::number(i));
			inNode[i] = node;

			inLogic[i] = new LogicIn(LogicConfig());
			setup1pinElement(*(inLogic[i]), node->pin());

			inLogic[i]->setCallback(this, (CallbackPtr)(&MultiInputGate::inStateChanged));
		}
	} else {
		for (int i = newNum; i < m_numInputs; ++i) {
			removeNode("in" + QString::number(i));
			removeElement(inLogic[i], false);
			inNode[i] = 0;
			inLogic[i] = 0;
		}
	}

	m_numInputs = newNum;

	// We can't call a pure-virtual function if we haven't finished our constructor yet...

	if (m_bDoneInit)
		inStateChanged(!added);

	updateAttachedPositioning();
}
Esempio n. 4
0
Demultiplexer::Demultiplexer(ICNDocument *icnDocument, bool newItem, const char *id)
		: DIPComponent(icnDocument, newItem, id ? id : "demultiplexer"), 
		m_input(LogicConfig()) {

	m_input.setCallback(this, (CallbackPtr)(&Demultiplexer::inStateChanged));

	m_name = i18n("Demultiplexer");
	createProperty("addressSize", Variant::Type::Int);
	property("addressSize")->setCaption(i18n("Address Size"));
	property("addressSize")->setMinValue(1);
	property("addressSize")->setMaxValue(8);
	property("addressSize")->setValue(1);

	// For backwards compatibility
	createProperty("numInput", Variant::Type::Int);
	property("numInput")->setMinValue(-1);
	property("numInput")->setValue(-1);
	property("numInput")->setHidden(true);
}
Esempio n. 5
0
ParallelPortComponent::ParallelPortComponent(ICNDocument *icnDocument, bool newItem, const char *id)
		: DSubCon(icnDocument, newItem, id ? id : "parallel_port") {
	m_name = i18n("Parallel Port");

	Q3PointArray pa(4);
	pa[0] = QPoint(-32, -112);
	pa[1] = QPoint(32, -104);
	pa[2] = QPoint(32, 104);
	pa[3] = QPoint(-32, 112);
	setItemPoints(pa);

	m_pParallelPort = new ParallelPort();

	for (unsigned i = 0; i < 24; ++i)
		m_pLogic[i] = 0;

	ECNode *pin = 0;

	//BEGIN Data register
	for (int i = 0; i < 8; ++i) {
		QString id = QString("D%1").arg(i);
		QString name = id;

		pin = createPin(-40, -80 + 16 * i, 0, id);
		addDisplayText(id, QRect(-28, -88 + 16 * i, 28, 16), name, true, Qt::AlignLeft | Qt::AlignVCenter);

		m_pLogic[i] = new LogicOut(LogicConfig(), false);
		setup1pinElement(*(m_pLogic[i]), createPin(-40, -80 + 16 * i, 0, id)->pin());

//		m_pLogic[i]->setCallback(this, (CallbackPtr)(&ParallelPortComponent::dataCallback));
	}
	//END Data register

	//BEGIN Status register
	QString statusNames[] = {"ERR", "ON", "PE", "ACK", "BUSY"};

	// The statusIDs are referenced in the save file and must not change
	QString statusIDs[] = {"ERROR", "ONLINE", "PE", "ACK", "BUSY"};

	// Bits 0...2 in the Status register are not used
	for (int i = 3; i < 8; ++i) {
		QString id = statusIDs[i - 3];
		QString name = statusNames[i - 3];

		// Bit 3 (pin 15) doesn't not follow the same positioning pattern as
		// the other pins in the Status register.

		if (i == 3) {
			pin = createPin(40, -72, 180, id);
			addDisplayText(id, QRect(0, -80, 28, 16), name, true, Qt::AlignRight | Qt::AlignVCenter);
		} else {
			pin = createPin(-40, -16 + 16 * i, 0, id);
			addDisplayText(id, QRect(-28, -24 + 16*i, 28, 16), name, true, Qt::AlignLeft | Qt::AlignVCenter);
		}

		m_pLogic[i + 8] = new LogicOut(LogicConfig(), false);

		setup1pinElement(*(m_pLogic[i + 8]), pin->pin());
	}
	//END Status register

	//BEGIN Control register
	QString controlNames[] = { "STR", "AUT", "INIT", "SEL" };

	// The controlIDs are referenced in the save file and must not change
	QString controlIDs[] = { "STROBE", "AUTO", "INIT", "SELECT" };

	// Bits 4..7 are not used (well; bit 5 is, but not as a pin)
	for (int i = 0; i < 4; ++i) {
		QString id = controlIDs[i];
		QString name = controlNames[i];

		if (i == 0) {
			pin = createPin(-40, -96, 0, id);
			addDisplayText(id, QRect(-28, -104, 28, 16), name, true, Qt::AlignLeft | Qt::AlignVCenter);
		} else if (i == 1) {
			pin = createPin(40, -88, 180, id);
			addDisplayText(id, QRect(0, -96, 28, 16), name, true, Qt::AlignRight | Qt::AlignVCenter);
		} else {
			pin = createPin(40, -88 + i * 16, 180, id);
			addDisplayText(id, QRect(0, -96 + i * 16, 28, 16), name, true, Qt::AlignRight | Qt::AlignVCenter);
		}

		m_pLogic[i + 16] = new LogicOut(LogicConfig(), false);

		setup1pinElement(*(m_pLogic[i + 16]), pin->pin());

//		m_pLogic[i + 16]->setCallback(this, (CallbackPtr)(&ParallelPortComponent::controlCallback));
	}
	//END Control register

#if 0
	// And make the rest of the pins ground
	for (int i = 0; i < 8; ++i) {
		pin = createPin(40, -24 + i * 16, 180, QString("GND%1").arg(i));
		pin->pin()->setGroundType(Pin::gt_always);
	}

#endif
	Variant *v = createProperty("port", Variant::Type::Combo);
	v->setAllowed(ParallelPort::ports(Port::ExistsAndRW));
	v->setCaption(i18n("Port"));
}