1 package net.mograsim.logic.core.tests;
4 import java.awt.Graphics;
5 import java.awt.Graphics2D;
6 import java.awt.Rectangle;
7 import java.awt.RenderingHints;
8 import java.awt.event.MouseEvent;
9 import java.awt.event.MouseListener;
10 import java.util.HashMap;
12 import java.util.Map.Entry;
14 import javax.swing.JFrame;
15 import javax.swing.JPanel;
16 import javax.swing.WindowConstants;
18 import net.mograsim.logic.core.components.CoreManualSwitch;
19 import net.mograsim.logic.core.components.gates.CoreNotGate;
20 import net.mograsim.logic.core.components.gates.CoreOrGate;
21 import net.mograsim.logic.core.timeline.Timeline;
22 import net.mograsim.logic.core.timeline.Timeline.ExecutionResult;
23 import net.mograsim.logic.core.wires.CoreWire;
25 public class GUITest extends JPanel
28 private static final long serialVersionUID = 1L;
30 private static final int WIRE_DELAY = 40;
31 private static final int OR_DELAY = 100;
32 private static final int NOT_DELAY = 100;
34 private Timeline t = new Timeline(11);
36 CoreWire r = new CoreWire(t, 1, WIRE_DELAY);
37 CoreWire s = new CoreWire(t, 1, WIRE_DELAY);
38 CoreWire t1 = new CoreWire(t, 1, WIRE_DELAY);
39 CoreWire t2 = new CoreWire(t, 1, WIRE_DELAY);
40 CoreWire q = new CoreWire(t, 1, WIRE_DELAY);
41 CoreWire nq = new CoreWire(t, 1, WIRE_DELAY);
43 CoreManualSwitch rIn = new CoreManualSwitch(t, r.createReadWriteEnd());
44 CoreManualSwitch sIn = new CoreManualSwitch(t, s.createReadWriteEnd());
46 CoreOrGate or1 = new CoreOrGate(t, OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
47 CoreOrGate or2 = new CoreOrGate(t, OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
48 CoreNotGate not1 = new CoreNotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd());
49 CoreNotGate not2 = new CoreNotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
51 Map<CoreManualSwitch, Rectangle> switchMap = new HashMap<>();
59 addMouseListener(new MouseListener()
63 public void mouseReleased(MouseEvent e)
65 for (Entry<CoreManualSwitch, Rectangle> dim : switchMap.entrySet())
67 if (dim.getValue().contains(e.getPoint()))
69 dim.getKey().switchFullOff();
76 public void mousePressed(MouseEvent e)
78 for (Entry<CoreManualSwitch, Rectangle> dim : switchMap.entrySet())
80 if (dim.getValue().contains(e.getPoint()))
82 dim.getKey().switchFullOn();
89 public void mouseExited(MouseEvent e)
95 public void mouseEntered(MouseEvent e)
101 public void mouseClicked(MouseEvent e)
103 // If you want toggle buttons, use this code instead
104 // for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet()) {
105 // if (dim.getValue().contains(e.getPoint())) {
106 // dim.getKey().toggle();
114 public Timeline getTimeline()
120 public void paint(Graphics some_g)
123 Graphics2D g = ((Graphics2D) some_g);
124 g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
125 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
126 g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
131 drawWire(g, r, "r", 2, 9, 4, 9);
133 drawWire(g, s, "s", 2, 3, 4, 3);
135 drawWire(g, t2, "t2", 5, 8.5, 6, 8.5);
137 drawWire(g, t1, "t1", 5, 3.5, 6, 3.5);
139 drawWire(g, q, "q", 7, 8.5, 9, 8.5);
141 drawWire(g, nq, "nq", 7, 3.5, 9, 3.5);
143 drawWire(g, q, "", 7.5, 8.5, 7.5, 7.5);
144 drawWire(g, q, "", 7.5, 7.5, 3, 4.5);
145 drawWire(g, q, "", 3, 4.5, 3, 4);
146 drawWire(g, q, "q", 3, 4, 4, 4);
148 drawWire(g, nq, "", 7.5, 3.5, 7.5, 4.5);
149 drawWire(g, nq, "", 7.5, 4.5, 3, 7.5);
150 drawWire(g, nq, "", 3, 7.5, 3, 8);
151 drawWire(g, nq, "nq", 3, 8, 4, 8);
153 drawSquare(g, 4, 8, "OR");
154 drawSquare(g, 4, 3, "OR");
156 drawSquare(g, 6, 8, "NOT");
157 drawSquare(g, 6, 3, "NOT");
159 drawSwitch(g, rIn, "Switch R", 0.5, 8.25, 2, 9.75);
160 drawSwitch(g, sIn, "Switch S", 0.5, 2.25, 2, 3.75);
162 drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0);
165 private void checkSizeChange()
167 sizeChanged = height != getHeight() || width != getWidth();
170 height = getHeight();
175 private void adaptFont(Graphics g)
177 g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f));
180 @SuppressWarnings("static-method")
181 private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY)
183 int h = g.getFontMetrics().getAscent();
184 int w = g.getFontMetrics().stringWidth(s);
185 g.drawString(s, x - (int) (w * anchorX), y + (int) (h * anchorY));
188 private void drawWire(Graphics g, CoreWire wa, String name, double x1, double y1, double x2, double y2)
191 g.drawLine(gX(x1), gY(y1), gX(x2), gY(y2));
192 drawString(g, name, (gX(x1) + gX(x2)) / 2, (gY(y1) + gY(y2)) / 2 - 5, 0, 0);
195 private void drawSquare(Graphics g, int posX, int posY, String text)
197 int x1 = gX(posX) - 5;
198 int x2 = gX(posX + 1) + 5;
199 int y1 = gY(posY) - 5;
200 int y2 = gY(posY + 1) + 5;
202 g.setColor(Color.WHITE);
203 g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
205 g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
206 drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);
210 private void drawSwitch(Graphics g, CoreManualSwitch ms, String text, double posX1, double posY1, double posX2, double posY2)
212 int x1 = gX(posX1) - 5;
213 int x2 = gX(posX2) + 5;
214 int y1 = gY(posY1) - 5;
215 int y2 = gY(posY2) + 5;
219 Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1);
220 switchMap.put(ms, r);
223 g.setColor(ms.isFullOn() ? Color.getHSBColor(.3f, .5f, 1f) : Color.WHITE);
224 g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
226 g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
227 drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);
230 private static void setBlack(Graphics g)
232 g.setColor(Color.BLACK);
235 private static void setTo(Graphics g, CoreWire wa)
237 switch (wa.getValue())
240 g.setColor(Color.GREEN);
243 g.setColor(Color.RED);
246 g.setColor(Color.DARK_GRAY);
249 g.setColor(Color.BLACK);
252 g.setColor(Color.MAGENTA);
255 throw new IllegalArgumentException();
259 private int gY(double pos)
261 return (int) (pos * height / 11);
264 private int gX(double pos)
266 return (int) (pos * width / 11) + 50;
269 public static void main(String[] args)
271 JFrame f = new JFrame("Test circuit 1.0.0");
272 GUITest gt = new GUITest();
275 f.setLocation(500, 400);
276 f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
279 long begin = System.currentTimeMillis();
281 long lastFrame = begin;
284 while (f.isVisible())
286 ExecutionResult er = gt.getTimeline().executeUntil(gt.getTimeline().laterThan((lastFrame - begin) * 3), lastFrame + 14);
289 if (er != ExecutionResult.NOTHING_DONE)
293 Thread.sleep(Math.max(updateT - System.currentTimeMillis() + lastFrame, 0));
299 lastFrame = System.currentTimeMillis();