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; }
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; }
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(); }
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); }
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")); }