package com.lushprojects.circuitjs1.client; public class OTAElm extends CompositeElm { private static String modelString = "RailElm 4\rRailElm 10\rNTransistorElm 1 2 3\rNTransistorElm 3 1 4\rNTransistorElm 3 3 4\rNTransistorElm 5 6 2\rNTransistorElm 7 8 2\rPTransistorElm 9 6 10\rPTransistorElm 9 9 10\rPTransistorElm 6 12 9\rPTransistorElm 11 8 10\rPTransistorElm 11 11 10\rPTransistorElm 8 13 11\rNTransistorElm 14 14 4\rNTransistorElm 14 12 4\rNTransistorElm 12 13 14\rNTransistorElm 15 15 5\rNTransistorElm 15 15 7"; private static int[] modelExternalNodes = { 7, 5, 15, 1, 13 }; // private static String modelString="NTransistorElm 1 1 2\rNTransistorElm 1 // 2 3\rNTransistorElm 1 3 4\rNTransistorElm 1 4 5"; // private static int[] modelExternalNodes = { 1, 2, 3 , 4, 5}; Polygon arrowPoly1, arrowPoly2; int opsize; final int opheight = 32; final int opwidth = 32; final int circDiam = 19; final int circOverlap = 8; Point in1p[], in2p[], in3p[], in4p[], textp[], bar1[], bar2[], circCent[]; Point point2bis; Polygon triangle; Font plusFont; double curCount0 = 0; double curCount1 = 0; double curCount2 = 0; double curCount3 = 0; double posVolt = 9.0; double negVolt = -9.0; public OTAElm(int xx, int yy) { super(xx, yy, modelString, modelExternalNodes); noDiagonal = true; initOTA(); } public OTAElm(int xa, int ya, int xb, int yb, int f, StringTokenizer st) { super(xa, ya, xb, yb, f, st, modelString, modelExternalNodes); noDiagonal = true; initOTA(); } private void initOTA() { ((RailElm) compElmList.get(0)).maxVoltage = negVolt; ((RailElm) compElmList.get(1)).maxVoltage = posVolt; } public void reset() { super.reset(); curCount0 = curCount1 = curCount2 = curCount3 = 0; } public boolean getConnection(int n1, int n2) { return false; } void draw(Graphics g) { setBbox(point1, point2, 3 * opheight / 2); setVoltageColor(g, volts[0]); drawThickLine(g, in1p[0], in1p[1]); setVoltageColor(g, volts[1]); drawThickLine(g, in2p[0], in2p[1]); setVoltageColor(g, volts[2]); drawThickLine(g, in3p[0], in3p[1]); setVoltageColor(g, volts[3]); drawThickLine(g, in4p[0], in4p[1]); g.setColor(needsHighlight() ? selectColor : lightGrayColor); setPowerColor(g, true); drawThickPolygon(g, triangle); g.fillPolygon(arrowPoly1); g.fillPolygon(arrowPoly2); drawThickLine(g, bar1[0], bar1[1]); drawThickLine(g, bar2[0], bar2[1]); drawThickCircle(g, circCent[0].x, circCent[0].y, circDiam / 2); drawThickCircle(g, circCent[1].x, circCent[1].y, circDiam / 2); g.setFont(plusFont); drawCenteredText(g, "+", textp[0].x, textp[0].y - 2, true); drawCenteredText(g, "-", textp[1].x, textp[1].y, true); // setVoltageColor(g, volts[2]); // drawThickLine(g, lead2, point2); curCount0 = updateDotCount(-getCurrentIntoNode(0), curCount0); drawDots(g, in1p[0], in1p[1], curCount0); curCount1 = updateDotCount(-getCurrentIntoNode(1), curCount1); drawDots(g, in2p[0], in2p[1], curCount0); curCount2 = updateDotCount(-getCurrentIntoNode(2), curCount2); drawDots(g, in3p[0], in3p[1], curCount2); curCount3 = updateDotCount(-getCurrentIntoNode(3), curCount3); drawDots(g, in4p[0], in4p[1], curCount3); drawPosts(g); } void setPoints() { super.setPoints(); int ww = opwidth; int wtot = ww * 2 + 2 * circDiam - circOverlap; if (dn > wtot) { lead1 = interpPoint(point1, point2, 1.0 - wtot / dn, 0); lead2 = point2; point2bis = point2; } else { lead1 = point1; lead2 = interpPoint(point1, point2, wtot / dn, 0); point2bis = lead2; } int hs = opheight * dsign; // if ((flags & FLAG_SWAP) != 0) // hs = -hs; in1p = newPointArray(2); in2p = newPointArray(2); in3p = newPointArray(2); in4p = newPointArray(2); textp = newPointArray(2); bar1 = newPointArray(2); bar2 = newPointArray(2); circCent = newPointArray(2); interpPoint2(point1, point2bis, in1p[0], in2p[0], 0, hs); interpPoint2(lead1, lead2, in1p[1], in2p[1], 0, hs); interpPoint2(lead1, lead2, textp[0], textp[1], .1, hs); in3p[0] = point1; in3p[1] = lead1; in4p[0] = interpPoint(lead1, lead2, 1.0 - (16.0 / wtot), 32); in4p[1] = interpPoint(lead1, lead2, 1.0 - (16.0 / wtot), 8); // in4p[0].x=sim.snapGrid(in4p[0].x); // in4p[0].y=sim.snapGrid(in4p[0].y); Point tris[] = newPointArray(3); interpPoint2(lead1, lead2, tris[0], tris[1], 0, 3 * hs / 2); tris[2] = interpPoint(lead1, lead2, (2.0 * ww) / wtot); triangle = createPolygon(tris[0], tris[1], tris[2]); circCent[0] = interpPoint(lead1, lead2, 1.0 - (circDiam / (2.0 * wtot)), 0); circCent[1] = interpPoint(lead1, lead2, 1.0 - (3 * circDiam / 2.0 - circOverlap) / wtot, 0); Point d1, d2; d1 = interpPoint(in3p[1], in1p[1], 0.3333); d2 = interpPoint(in3p[1], in1p[1], 0.6666); arrowPoly1 = calcArrow(d1, d2, 8, 4); interpPoint2(d1, d2, bar1[0], bar1[1], 1.0, 4); d1 = interpPoint(in3p[1], in2p[1], 0.3333); d2 = interpPoint(in3p[1], in2p[1], 0.6666); arrowPoly2 = calcArrow(d1, d2, 8, 4); interpPoint2(d1, d2, bar2[0], bar2[1], 1.0, 4); plusFont = new Font("SansSerif", 0, 14); setPost(0, in1p[0]); setPost(1, in2p[0]); setPost(2, in3p[0]); setPost(3, in4p[0]); setPost(4, point2bis); } @Override public int getDumpType() { return 402; } void getInfo(String arr[]) { arr[0] = "OTA (LM13700 style)"; arr[1] = "Iabc = " + getCurrentText(-getCurrentIntoNode(3)); arr[2] = "V+ - V- = " + getVoltageText(volts[0] - volts[1]); } public EditInfo getEditInfo(int n) { if (n == 0) return new EditInfo("Positive Supply Voltage (5-20V)", posVolt, 5, 20); if (n == 1) return new EditInfo("Negative Supply Voltage (V)", negVolt, -20, -5); return null; } public void setEditValue(int n, EditInfo ei) { if (n == 0) posVolt = ei.value; if (n == 1) negVolt = ei.value; initOTA(); } }