Beispiel #1
0
ECSRFlipFlop::ECSRFlipFlop( ICNDocument *icnDocument, bool newItem, const char *id )
	: Component( icnDocument, newItem, id ? id : "sr_flipflop" )
{
	m_name = i18n("SR Flip-Flop");
	
	setSize( -24, -24, 48, 48 );

	init2PinLeft( -8, 8 );
	init2PinRight( -8, 8 );
	
	m_pS = createLogicIn( m_pNNode[0] );
	m_pR = createLogicIn( m_pNNode[1] );
	m_pQ = createLogicOut( m_pPNode[0], true );
	m_pQBar = createLogicOut( m_pPNode[1], false );
	
	old_q1 = true;
	old_q2 = false;
	m_pQ->setHigh(old_q1);
	m_pQBar->setHigh(old_q2);
	
	addDisplayText( "S", QRect( -24, -16, 20, 16 ), "S" );
	addDisplayText( "R", QRect( -24, 0, 20, 16 ), "R" );
	addDisplayText( "Q", QRect( 4, -16, 20, 16 ), "Q" );
	addDisplayText( "Q'", QRect( 4, 0, 20, 16 ), "Q'" );
	
	m_pS->setCallback( this, static_cast<CallbackPtr>(&ECSRFlipFlop::inStateChanged) );
	m_pR->setCallback( this, static_cast<CallbackPtr>(&ECSRFlipFlop::inStateChanged) );
	m_pQ->setCallback( this, static_cast<CallbackPtr>(&ECSRFlipFlop::inStateChanged) );
	m_pQBar->setCallback( this, static_cast<CallbackPtr>(&ECSRFlipFlop::inStateChanged) );
}
ECCurrentSignal::ECCurrentSignal( ICNDocument *icnDocument, bool newItem, const char *id )
	: Component( icnDocument, newItem, id ? id : "current_signal" )
{
	m_name = i18n("Current Signal");
	setSize( -8, -8, 16, 16 );
	
	init1PinLeft();
	init1PinRight();
	
	m_pNNode[0]->pin()->setGroundType( Pin::gt_low );
	m_currentSignal = createCurrentSignal( m_pNNode[0], m_pPNode[0], 0. );
	m_currentSignal->setStep(ElementSignal::st_sinusoidal, 50. );
	
	createProperty( "1-frequency", Variant::Type::Double );
	property("1-frequency")->setCaption( i18n("Frequency") );
	property("1-frequency")->setUnit("Hz");
	property("1-frequency")->setMinValue(1e-9);
	property("1-frequency")->setMaxValue(1e3);
	property("1-frequency")->setValue(50.0);
	
	createProperty( "1-current", Variant::Type::Double );
	property("1-current")->setCaption( i18n("Current Range") );
	property("1-current")->setUnit("A");
	property("1-current")->setMinValue(-1e12);
	property("1-current")->setMaxValue(1e12);
	property("1-current")->setValue(0.02);
	
	addDisplayText( "~", QRect( -8, -8, 16, 16 ), "~" );
	addDisplayText( "current", QRect( -16, -24, 32, 16 ), "" );
}
VarComparison::VarComparison( ICNDocument *icnDocument, bool newItem, const char *id )
	: FlowPart( icnDocument, newItem, id ? id : "varcomparison" )
{
	m_name = i18n("Variable Comparison");
	initDecisionSymbol();
	createStdInput();
	createStdOutput();
	createAltOutput();
	
	createProperty( "0var1", Variant::Type::Combo );
	property("0var1")->setCaption( i18n("Variable") );
	property("0var1")->setValue("x");
	
	createProperty( "1op", Variant::Type::Select );
	property("1op")->setAllowed( QStringList::split( ',', "==,<,>,<=,>=,!=" ) );
	property("1op")->setValue("==");
	property("1op")->setToolbarCaption(" ");
	property("1op")->setEditorCaption( i18n("Operation") );
	
	createProperty( "2var2", Variant::Type::Combo );
	property("2var2")->setToolbarCaption(" ");
	property("2var2")->setEditorCaption( i18n("Value") );
	property("2var2")->setValue("0");
	
	addDisplayText( "output_false", QRect( offsetX()+width(), 2, 40, 20 ), "No" );
	addDisplayText( "output_true", QRect( 0, offsetY()+height(), 50, 20 ), "Yes" ); 
}
Beispiel #4
0
ECDFlipFlop::ECDFlipFlop( ICNDocument *icnDocument, bool newItem, const char *id )
	: ClockedFlipFlop( icnDocument, newItem, id ? id : "d_flipflop" )
{
	m_name = i18n("D-Type Flip-Flop");
	
	setSize( -32, -24, 64, 48 );
	init2PinLeft( -8, 8 );
	init2PinRight( -8, 8 );
	initSymbolFromTrigger();
	
	m_prevD = false;
	m_pSimulator = Simulator::self();
	
	m_bPrevClock = false;
	m_pD = createLogicIn( m_pNNode[0] );
	m_pClock = createLogicIn( m_pNNode[1] );
	m_pQ = createLogicOut( m_pPNode[0], false );
	m_pQBar = createLogicOut( m_pPNode[1], false );
	
	setp = createLogicIn( createPin( 0, -32, 90, "set" ) );
	rstp = createLogicIn( createPin( 0, 32, 270, "rst" ) );
	
	// (The display text for D, >, Set, Rst is set in initSymbolFromTrigger
	addDisplayText( "Q",	QRect( 12,	-16,	20, 16 ), "Q" );
	addDisplayText( "Q'",	QRect( 12,	0,		20, 16 ), "Q'" );
	
	m_pD->setCallback( this, static_cast<CallbackPtr>(&ECDFlipFlop::inputChanged) );
	m_pClock->setCallback( this, static_cast<CallbackPtr>(&ECDFlipFlop::clockChanged) );
	setp->setCallback( this, static_cast<CallbackPtr>(&ECDFlipFlop::asyncChanged) );
	rstp->setCallback( this, static_cast<CallbackPtr>(&ECDFlipFlop::asyncChanged) );
	
	inStateChanged(false);
}
Beispiel #5
0
void ECDFlipFlop::initSymbolFromTrigger()
{
	int offset = (m_edgeTrigger == Rising) ? 0 : 6;
	
	int w = 64-offset;
	setSize( offset-32, -24, w, 48, true );
	m_pNNode[0]->setLength( 8+offset );
	addDisplayText( "D",	QRect( offset-28,	-16,	20, 16 ), "D", true, Qt::AlignLeft );
	addDisplayText( ">",	QRect( offset-28,	0,		20, 16 ), ">", true, Qt::AlignLeft ); 
	addDisplayText( "Set",	QRect( offset-28,	-20,	w-8, 16 ), "Set", true, Qt::AlignHCenter );
	addDisplayText( "Rst",	QRect( offset-28,	4,		w-8, 16 ), "Rst", true, Qt::AlignHCenter );
	
	updateAttachedPositioning();
}
Beispiel #6
0
EC555::EC555( ICNDocument *icnDocument, bool newItem, const char *id )
	: Component( icnDocument, newItem, (id) ? id : "555" )
{
	m_name = i18n("555");
// 	m_pins = QStringList::split( ',', "Gnd,Trg,Out,Res,CV,Th,Dis,Vcc" );
// 	m_pins = QStringList::split( ',', "Dis,Th,Trg,Gnd,CV,Out,Res,Vcc" );
	
	old_com1 = false;
	old_com2 = false;
	old_q = false;
	
	setSize( -32, -32, 64, 64 );

	// Pins down left
	
	// Pin 7
	discharge = createPin( -40, -16, 0, "Dis" )->pin();
	addDisplayText( "dis", QRect( -32, -24, 24, 16 ), "Dis" );
	
	// Pin 6
	threshold = createPin( -40, 0, 0, "Th" )->pin();
	addDisplayText( "th", QRect( -32, -8, 24, 16 ), "Th" );
	
	// Pin 2
	trigger = createPin( -40, 16, 0, "Trg" )->pin();
	addDisplayText( "trg", QRect( -32, 8, 24, 16 ), "Trg" );

	// Top two
	
	// Pin 8
	vcc = createPin( -16, -40, 90, "Vcc" )->pin();
	addDisplayText( "vcc", QRect( -24, -32, 16, 8 ), "+" );
	
	// Pin 4
	reset = createPin( 16, -40, 90, "Res" )->pin();
	addDisplayText( "res", QRect( 8, -28, 16, 16 ), "Res" );
	
	// Bottom two
	
	// Pin 1
	ground = createPin( -16, 40, 270, "Gnd" )->pin();
	addDisplayText( "gnd", QRect( -24, 20, 16, 8 ), "-" );
	
	// Pin 5
	control = createPin( 16, 40, 270, "CV" )->pin();
	addDisplayText( "cv", QRect( 8, 12, 16, 16 ), "CV" );
	
	// Output on right
	
	// Pin 3
	output = createPin( 40, 0, 180, "Out" )->pin();
	addDisplayText( "out", QRect( 8, -8, 16, 16 ), "Out" );
	
	m_r1 = createResistance( vcc, control, 5e3 );
	m_r23 = createResistance( control, ground, 1e4 );
	m_po_sink = createResistance( output, ground, 0. );
	m_po_source = createResistance( output, vcc, 0. );
	m_po_source->setConductance(0.);
	m_r_discharge = createResistance( discharge, ground, 0. );
}
Beispiel #7
0
ECPotentiometer::ECPotentiometer(ICNDocument *icnDocument, bool newItem, const char *id)
	: Component(icnDocument, newItem, id ? id : "potentiometer")
{
	m_name = i18n("Potentiometer");
	setSize(-16, -16, 40, 32);

	ECNode *m_p1 = createPin(32, 0, 180, "p1");

	m_sliderProp = 0.0;
	m_resistance = 5000.;

	setup2pinElement(m_r1, createPin(-8, -24, 90, "n1")->pin(), m_p1->pin());
	setup2pinElement(m_r2, createPin(-8, 24, 270, "n2")->pin(), m_p1->pin());

	Slider * s = addSlider("slider", 0, 100, 5, 50, Qt::Vertical, QRect(0, -16, 16, 32));
	m_pSlider = static_cast<QSlider*>(s->widget());

	createProperty("resistance", Variant::Type::Double);
	property("resistance")->setCaption(i18n("Resistance"));
	property("resistance")->setUnit(QChar(0x3a9));
	property("resistance")->setMinValue(1e-6);
	property("resistance")->setValue(1e5);

	addDisplayText("res", QRect(-56, -8, 40, 16), "");
}
Beispiel #8
0
TestPin::TestPin( ICNDocument *icnDocument, bool newItem, const char *id )
	: FlowPart( icnDocument, newItem, id ? id : "testpin" )
{
	m_name = i18n("Test Pin State");
	initDecisionSymbol();
	createStdInput();
	createStdOutput();
	createAltOutput();
	
	createProperty( "pin", Variant::Type::Pin );
	property("pin")->setCaption( i18n("Pin") );
	property("pin")->setValue("RA0");
	
	addDisplayText( "output_false", QRect( offsetX()+width(), 2, 40, 20 ), "Low" );
	addDisplayText( "output_true", QRect( 0, offsetY()+height(), 50, 20 ), "High" );
}
Beispiel #9
0
//BEGIN class Meter
Meter::Meter( ICNDocument *icnDocument, bool newItem, const char *id )
	: SimpleComponent( icnDocument, newItem, id )
{
	b_timerStarted = false;
	m_timeSinceUpdate = 0.;
	m_old_value  = 0.;
	m_avgValue = 0.;
	b_firstRun = true;
	m_prevProp = 0.0;
	setSize( -16, -16, 32, 32 );

	p_displayText = addDisplayText( "meter", QRect( -16, 16, 32, 16 ), displayText() );
	
	createProperty( "0-minValue", Variant::Type::Double );
	property("0-minValue")->setCaption( i18n("Minimum Value") );
	property("0-minValue")->setMinValue(1e-12);
	property("0-minValue")->setMaxValue(1e12);
	property("0-minValue")->setValue(1e-3);
	
	createProperty( "1-maxValue", Variant::Type::Double );
	property("1-maxValue")->setCaption( i18n("Maximum Value") );
	property("1-maxValue")->setMinValue(1e-12);
	property("1-maxValue")->setMaxValue(1e12);
	property("1-maxValue")->setValue(1e3);
}
Beispiel #10
0
void MultiInputGate::updateSymbolText() {
	if (m_logicSymbolShape == Distinctive)
		removeDisplayText("rect-shape-text");
	else {
		int w = 32 - (m_bInvertedOutput ? 6 : 0);
		QRect r(-16, 4 - height() / 2, w, height() - 4);
		addDisplayText("rect-shape-text", r, m_rectangularShapeText, true, AlignTop | AlignHCenter);
	}
}
Beispiel #11
0
void ResistorDIP::dataChanged()
{
	initPins();
	const double resistance = dataDouble("resistance");
	for ( int i=0; i<m_resistorCount; ++i )
		m_resistance[i]->setResistance(resistance);
	
	const QString display = QString::number( resistance / getMultiplier(resistance), 'g', 3 ) + getNumberMag(resistance) + QChar(0x3a9);
	addDisplayText( "res", QRect( offsetX(), offsetY()-16, 32, 12 ), display );
}
Beispiel #12
0
ECJKFlipFlop::ECJKFlipFlop( ICNDocument *icnDocument, bool newItem, const char *id )
	: ClockedFlipFlop( icnDocument, newItem, id ? id : "jk_flipflop" )
{
	m_name = i18n("JK-Type Flip-Flop");
	
	setSize( -32, -32, 64, 64 );
	init3PinLeft( -16, 0, 16 );
	init2PinRight( -16, 16 );
	initSymbolFromTrigger();
	
	m_bPrevClock = false;
	
	createProperty( "trig", Variant::Type::Select );
	property("trig")->setCaption( i18n("Trigger Edge") );
	QStringMap allowed;
	allowed["Rising"] = i18n("Rising");
	allowed["Falling"] = i18n("Falling");
	property("trig")->setAllowed( allowed );
	property("trig")->setValue("Rising");
	m_edgeTrigger = Rising;
	initSymbolFromTrigger();
	
	m_pJ = createLogicIn( m_pNNode[0] );
	m_pClock = createLogicIn( m_pNNode[1] );
	m_pK = createLogicIn( m_pNNode[2] );
	
	m_pQ = createLogicOut( m_pPNode[0], false );
	m_pQBar = createLogicOut( m_pPNode[1], false );

	setp = createLogicIn( createPin( 0, -40, 90, "set" ) );
	rstp = createLogicIn( createPin( 0, 40, 270, "rst" ) );
	
	addDisplayText( "Q",	QRect( 12,	-24,	20, 16 ), "Q" );
	addDisplayText( "Q'",	QRect( 12,	8,		20, 16 ), "Q'" );
		
	m_pClock->setCallback( this, static_cast<CallbackPtr>(&ECJKFlipFlop::clockChanged) );
	setp->setCallback( this, static_cast<CallbackPtr>(&ECJKFlipFlop::asyncChanged) );
	rstp->setCallback( this, static_cast<CallbackPtr>(&ECJKFlipFlop::asyncChanged) );
	
	inStateChanged(false);
}
Beispiel #13
0
void PIC_IC::initPackage( MicroInfo * microInfo )
{
	// The code in this function is a stripped down version of that in PICComponent::initPackage
	
	if (!microInfo)
		return;
	
	MicroPackage * microPackage = microInfo->package();
	if (!microPackage)
		return;
	
	//BEGIN Get pin IDs
	QStringList allPinIDs = microPackage->pinIDs();
	QStringList ioPinIDs = microPackage->pinIDs( PicPin::type_bidir | PicPin::type_input | PicPin::type_open );
	
	// Now, we make the unwanted pin ids blank, so a pin is not created for them
	const QStringList::iterator allPinIDsEnd = allPinIDs.end();
	for ( QStringList::iterator it = allPinIDs.begin(); it != allPinIDsEnd; ++it )
	{
		if ( !ioPinIDs.contains(*it) )
			*it = "";
	}
	//END Get pin IDs
	
	
	//BEGIN Remove old stuff
	// Remove old text
	TextMap textMapCopy = m_textMap;
	const TextMap::iterator textMapEnd = textMapCopy.end();
	for ( TextMap::iterator it = textMapCopy.begin(); it != textMapEnd; ++it )
		removeDisplayText(it.key());
	
	// Remove old nodes
	NodeInfoMap nodeMapCopy = m_nodeMap;
	const NodeInfoMap::iterator nodeMapEnd = nodeMapCopy.end();
	for ( NodeInfoMap::iterator it = nodeMapCopy.begin(); it != nodeMapEnd; ++it )
	{
		if ( !ioPinIDs.contains(it.key()) )
			removeNode( it.key() );
	}
	//END Remove old stuff
	
	
	
	//BEGIN Create new stuff
	initDIPSymbol( allPinIDs, 80 );
	initDIP(allPinIDs);
	//END Create new stuff
	
	
	addDisplayText( "picid", QRect(offsetX(), offsetY()-16, width(), 16), microInfo->id() );
}
VariableCapacitor::VariableCapacitor(ICNDocument* icnDocument, bool newItem, const QString& id)
		: SimpleComponent(icnDocument, newItem, id ? id : "variable capacitor"),
		m_pCapacitance(m_currCapacitance, LINEAR_UPDATE_PERIOD) {
	m_name = i18n("Variable Capacitor");

	// Top Left(x,y) from centre point, width, height.
	setSize(-16, -8, 32, 16);

	// william - you might want to change this value. I added this line as it
	// was being used unitialized (in the sliderValueChanged function when
	// addSlider is called later on), and causing a crash - david.
	m_tickValue = 1;

	m_maxCapacitance = 0.0001;
	m_minCapacitance = 0.00005;

	m_currCapacitance = m_minCapacitance + ((m_maxCapacitance - m_minCapacitance) / 2);

	init1PinLeft();
	init1PinRight();

	m_pNNode[0]->setLength(15);
	m_pPNode[0]->setLength(15);

	setup2pinElement(m_pCapacitance, m_pNNode[0]->pin(), m_pPNode[0]->pin());

	addDisplayText("capacitance", QRect(-8, -26, 16, 16), "", false);

	createProperty("currcapacitance", Variant::Type::Double);
	property("currcapacitance")->setCaption(i18n("Capacitance"));
	property("currcapacitance")->setUnit("F");
	property("currcapacitance")->setMinValue(1e-12);
	property("currcapacitance")->setMaxValue(1e12);
	property("currcapacitance")->setValue(m_currCapacitance);

	createProperty("maximum capacitance", Variant::Type::Double);
	property("maximum capacitance")->setCaption(i18n("Max"));
	property("maximum capacitance")->setUnit("F");
	property("maximum capacitance")->setMinValue(1e-12);
	property("maximum capacitance")->setMaxValue(1e12);
	property("maximum capacitance")->setValue(m_maxCapacitance);

	createProperty("minimum capacitance", Variant::Type::Double);
	property("minimum capacitance")->setCaption(i18n("Min"));
	property("minimum capacitance")->setUnit("F");
	property("minimum capacitance")->setMinValue(1e-12);
	property("minimum capacitance")->setMaxValue(1e12);
	property("minimum capacitance")->setValue(m_minCapacitance);

	Slider * s = addSlider("slider", 0, 100, 1, 50, Qt::Horizontal, QRect(-16, 10, 32, 16));
	m_pSlider = static_cast<QSlider*>(s->widget());
}
//BEGIN class DependentSource
DependentSource::DependentSource(ICNDocument *icnDocument, bool newItem, const char *id)
		: SimpleComponent(icnDocument, newItem, id) {
	setSize(-16, -16, 32, 32);

	init2PinLeft();
	init2PinRight();

	m_pNNode[1]->setLength(13);
	m_pPNode[1]->setLength(13);

	createProperty("gain", Variant::Type::Double);
	property("gain")->setCaption(i18n("Gain"));
	property("gain")->setValue(1.0);

	addDisplayText("gain", QRect(-16, -32, 32, 16), "");
}
VariableResistor::VariableResistor( ICNDocument* icnDocument, bool newItem, const QString& id )
    : Component( icnDocument, newItem, (!id.isEmpty()) ? id : "variable resistor" )
{
    m_name = i18n("Resistor");

    // Top Left(x,y) from centre point, width, height.
    setSize( -16, -16, 32, 32 );

    init1PinLeft();
    init1PinRight();

    // (see comment in variablecapacitor.cpp) - david
    m_tickValue = 1;

    m_minResistance = 0.5;
    m_maxResistance = 1.0;

    m_currResistance = m_minResistance + ( ( m_maxResistance - m_minResistance ) / 2 ) ;

    m_pResistance = createResistance( m_pPNode[0], m_pNNode[0], m_currResistance );

    createProperty( "resistance", Variant::Type::Double );
    property("resistance")->setCaption( i18n("Resistance") );
    property("resistance")->setUnit( QChar( 0x3a9 ) );
    property("resistance")->setMinValue( 1e-6 );
    property("resistance")->setValue( m_currResistance );

    createProperty( "minimum resistance", Variant::Type::Double );
    property("minimum resistance")->setCaption( i18n("Min") );
    property("minimum resistance")->setUnit( QChar( 0x3a9 ) );
    property("minimum resistance")->setMinValue( 1e-6 );
    property("minimum resistance")->setValue( m_minResistance );

    createProperty( "maximum resistance", Variant::Type::Double );
    property("maximum resistance")->setCaption( i18n("Max") );
    property("maximum resistance")->setUnit( QChar( 0x3a9 ) );
    property("maximum resistance")->setMinValue( 1e-6 );
    property("maximum resistance")->setValue( m_maxResistance );

    addDisplayText( "res", QRect( -16, -26, 32, 12 ), "", false );

    Slider * s = addSlider( "slider", 0, 100, 1, 50, Qt::Horizontal, QRect( -16, 14, width(), 16 ) );
    m_pSlider = static_cast<QSlider*>( s->widget() );

}
Beispiel #17
0
Capacitor::Capacitor( ICNDocument *icnDocument, bool newItem, const char *id )
	: Component( icnDocument, newItem, id ? id : "capacitor" )
{
	m_name = i18n("Capacitor");
	setSize( -8, -8, 16, 16 );
	
	init1PinLeft();
	init1PinRight();
	
	m_capacitance = createCapacitance( m_pNNode[0], m_pPNode[0], 0.001 );
	
	createProperty( "Capacitance", Variant::Type::Double );
	property("Capacitance")->setCaption( i18n("Capacitance") );
	property("Capacitance")->setUnit("F");
	property("Capacitance")->setMinValue(1e-12);
	property("Capacitance")->setMaxValue(1e12);
	property("Capacitance")->setValue(1e-3);
	
	addDisplayText( "capacitance", QRect( -8, -24, 16, 16 ), "", false );
}
Beispiel #18
0
Capacitor::Capacitor(ICNDocument *icnDocument, bool newItem, const char *id)
		: SimpleComponent(icnDocument, newItem, id ? id : "capacitor"),
		m_capacitance(0.001, LINEAR_UPDATE_PERIOD) {
	m_name = i18n("Capacitor");
	setSize(-8, -8, 16, 16);

	init1PinLeft();
	init1PinRight();

;
	setup2pinElement(m_capacitance, m_pNNode[0]->pin(), m_pPNode[0]->pin());

	createProperty("Capacitance", Variant::Type::Double);
	property("Capacitance")->setCaption(i18n("Capacitance"));
	property("Capacitance")->setUnit("F");
	property("Capacitance")->setMinValue(1e-12);
	property("Capacitance")->setMaxValue(1e12);
	property("Capacitance")->setValue(1e-3);

	addDisplayText("capacitance", QRect(-8, -24, 16, 16), "", false);
}
ECCell::ECCell(ICNDocument *icnDocument, bool newItem, const char *id)
        : SimpleComponent(icnDocument, newItem, id ? id : "cell") {
    m_name = i18n("Battery");
    setSize(-8, -8, 16, 16);

    init1PinLeft();
    init1PinRight();

    m_pNNode[0]->pin().setGroundType(Pin::gt_medium);

    setup2pinElement(m_voltageSource, m_pNNode[0]->pin(), m_pPNode[0]->pin());

    createProperty("voltage", Variant::Type::Double);
    property("voltage")->setUnit("V");
    property("voltage")->setCaption(i18n("Voltage"));
    property("voltage")->setMinValue(-1e12);
    property("voltage")->setMaxValue(1e12);
    property("voltage")->setValue(5.0);

    addDisplayText("voltage", QRect(-16, -24, 32, 16), "");
}
Beispiel #20
0
void PICComponent::initPackage( MicroInfo * microInfo )
{
	MicroPackage * microPackage = microInfo ? microInfo->package() : 0l;
	
	if ( microPackage )
	{
		m_bCreatedInitialPackage = true;
		
		//BEGIN Get pin IDs
		QStringList allPinIDs = microPackage->pinIDs();
		QStringList ioPinIDs = microPackage->pinIDs( PicPin::type_bidir | PicPin::type_input | PicPin::type_open );
	
		// Now, we make the unwanted pin ids blank, so a pin is not created for them
		const QStringList::iterator allPinIDsEnd = allPinIDs.end();
		for ( QStringList::iterator it = allPinIDs.begin(); it != allPinIDsEnd; ++it )
		{
			if ( !ioPinIDs.contains(*it) )
				*it = "";
		}
		//END Get pin IDs
	
	
		//BEGIN Remove old stuff
		// Remove old text
		TextMap textMapCopy = m_textMap;
		const TextMap::iterator textMapEnd = textMapCopy.end();
		for ( TextMap::iterator it = textMapCopy.begin(); it != textMapEnd; ++it )
			removeDisplayText(it.key());
	
		// Remove the old pins
		deletePICComponentPins();
	
		// Remove old nodes
		NodeInfoMap nodeMapCopy = m_nodeMap;
		const NodeInfoMap::iterator nodeMapEnd = nodeMapCopy.end();
		for ( NodeInfoMap::iterator it = nodeMapCopy.begin(); it != nodeMapEnd; ++it )
		{
			if ( !ioPinIDs.contains(it.key()) )
				removeNode( it.key() );
		}
	
		removeElements();
		//END Remove old stuff
	
	
	
		//BEGIN Create new stuff
		initDIPSymbol( allPinIDs, 80 );
		initDIP(allPinIDs);
	
		PicPinMap picPinMap = microPackage->pins( PicPin::type_bidir | PicPin::type_input | PicPin::type_open );
		const PicPinMap::iterator picPinMapEnd = picPinMap.end();
		for ( PicPinMap::iterator it = picPinMap.begin(); it != picPinMapEnd; ++it )
			m_picComponentPinMap[it.key()] = new PICComponentPin( this, it.value() );
		//END Create new stuff
	
	
		removeDisplayText( "no_file" );
		addDisplayText( "picid", QRect(offsetX(), offsetY()-16, width(), 16), microInfo->id() );
	}
	else
	{
		setSize( -48, -72, 96, 144 );
		removeDisplayText( "picid" );
		addDisplayText( "no_file", sizeRect(), i18n("(No\nprogram\nloaded)") );
	}
	
	
	//BEGIN Update button positions
	int leftpos = (width()-88)/2+offsetX();
	button("run")->setOriginalRect( QRect( leftpos, height()+4+offsetY(), 20, 20 ) );
	button("pause")->setOriginalRect( QRect( leftpos+23, height()+4+offsetY(), 20, 20 ) );
	button("reset")->setOriginalRect( QRect( leftpos+46, height()+4+offsetY(), 20, 20 ) );
	button("reload")->setOriginalRect( QRect( leftpos+69, height()+4+offsetY(), 20, 20 ) );
	updateAttachedPositioning();
	//END Update button positions
}
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"));
}
SerialPortComponent::SerialPortComponent( ICNDocument *icnDocument, bool newItem, const char *id )
	: Component( icnDocument, newItem, id ? id : "serial_port" )
{
	m_name = i18n("Serial Port");
	
	Q3PointArray pa( 4 );
	pa[0] = QPoint( -32, -48 );
	pa[1] = QPoint( 32, -40 );
	pa[2] = QPoint( 32, 40 );
	pa[3] = QPoint( -32, 48 );
	
	setItemPoints( pa );
	
	m_pSerialPort = new SerialPort();
	
	ECNode * pin = 0;
	
	// Works
	pin = createPin( -40,  32,   0, "CD" );
	addDisplayText( "CD", QRect( -28, 24, 28, 16 ), "CD", true, Qt::AlignLeft | Qt::AlignVCenter );
	m_pCD = createLogicOut( pin, false  );
	
	// Doesn't work
// 	pin = createPin( -40,  16,   0, "RD" );
	addDisplayText( "RD", QRect( -28, 8, 28, 16 ), "RD", true, Qt::AlignLeft | Qt::AlignVCenter );
// 	m_pRD = createLogicOut( pin, false  );
	
	// Works
	pin = createPin( -40,   0,   0, "TD" );
	addDisplayText( "TD", QRect( -28, -8, 28, 16 ), "TD", true, Qt::AlignLeft | Qt::AlignVCenter );
	m_pTD = createLogicIn( pin);
	m_pTD->setCallback( this, (CallbackPtr)(&SerialPortComponent::tdCallback) );
	
	// Works
	pin = createPin( -40, -16,   0, "DTR" );
	addDisplayText( "DTR", QRect( -28, -24, 28, 16 ), "DTR", true, Qt::AlignLeft | Qt::AlignVCenter );
	m_pDTR = createLogicIn( pin );
	m_pDTR->setCallback( this, (CallbackPtr)(&SerialPortComponent::dtrCallback) );
	
	// N/A
	pin = createPin( -40, -32,   0, "GND" );
	addDisplayText( "GND", QRect( -28, -40, 28, 16 ), "GND", true, Qt::AlignLeft | Qt::AlignVCenter );
	pin->pin()->setGroundType( Pin::gt_always );
	
	// Doesn't work
// 	pin = createPin(  40,  24, 180, "DSR" );
	addDisplayText( "DSR", QRect( 0, 16, 28, 16 ), "DSR", true, Qt::AlignRight | Qt::AlignVCenter );
// 	m_pDSR = createLogicIn( pin );
// 	m_pDSR->setCallback( this, (CallbackPtr)(&SerialPortComponent::dsrCallback) );
	
	// Doesn't work
// 	pin = createPin(  40,   8, 180, "RTS" );
	addDisplayText( "RTS", QRect( 0, 0, 28, 16 ), "RTS", true, Qt::AlignRight | Qt::AlignVCenter );
// 	m_pRTS = createLogicIn( pin );
// 	m_pRTS->setCallback( this, (CallbackPtr)(&SerialPortComponent::rtsCallback) );
	
	// Works
	pin = createPin(  40,  -8, 180, "CTS" );
	addDisplayText( "CTS", QRect( 0, -16, 28, 16 ), "CTS", true, Qt::AlignRight | Qt::AlignVCenter );
	m_pCTS = createLogicOut( pin, false  );
	
	// Works
	pin = createPin(  40, -24, 180, "RI" );
	addDisplayText( "RI", QRect( 0, -32, 28, 16 ), "RI", true, Qt::AlignRight | Qt::AlignVCenter );
	m_pRI = createLogicOut( pin, false  );
	
	Variant * v = createProperty( "port", Variant::Type::Combo );
	v->setAllowed( SerialPort::ports( Port::ExistsAndRW ) );
	v->setCaption( i18n("Port") );
	
// 	v = createProperty( "baudRate", Variant::Type::Select );
// 	v->setAllowed( QStringList::split( ",", "B0,B50,B75,B110,B134,B150,B200,B300,B600,B1200,B1800,B2400,B4800,B9600,B19200,B38400" ) );
// 	v->setCaption( i18n("Baud rate") );
// 	v->setValue("B9600");
}