Renamed net.mograsim.logic.tests to net.mograsim.logic.core.tests
[Mograsim.git] / tests / net.mograsim.logic.core.tests / src / net / mograsim / logic / core / tests / GUITest.java
1 package net.mograsim.logic.core.tests;
2
3 import java.awt.Color;
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;
11 import java.util.Map;
12 import java.util.Map.Entry;
13
14 import javax.swing.JFrame;
15 import javax.swing.JPanel;
16 import javax.swing.WindowConstants;
17
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;
24
25 public class GUITest extends JPanel
26 {
27
28         private static final long serialVersionUID = 1L;
29
30         private static final int WIRE_DELAY = 40;
31         private static final int OR_DELAY = 100;
32         private static final int NOT_DELAY = 100;
33
34         private Timeline t = new Timeline(11);
35
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);
42
43         CoreManualSwitch rIn = new CoreManualSwitch(t, r.createReadWriteEnd());
44         CoreManualSwitch sIn = new CoreManualSwitch(t, s.createReadWriteEnd());
45
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());
50
51         Map<CoreManualSwitch, Rectangle> switchMap = new HashMap<>();
52
53         int height;
54         int width;
55         boolean sizeChanged;
56
57         public GUITest()
58         {
59                 addMouseListener(new MouseListener()
60                 {
61
62                         @Override
63                         public void mouseReleased(MouseEvent e)
64                         {
65                                 for (Entry<CoreManualSwitch, Rectangle> dim : switchMap.entrySet())
66                                 {
67                                         if (dim.getValue().contains(e.getPoint()))
68                                         {
69                                                 dim.getKey().switchFullOff();
70                                                 repaint();
71                                         }
72                                 }
73                         }
74
75                         @Override
76                         public void mousePressed(MouseEvent e)
77                         {
78                                 for (Entry<CoreManualSwitch, Rectangle> dim : switchMap.entrySet())
79                                 {
80                                         if (dim.getValue().contains(e.getPoint()))
81                                         {
82                                                 dim.getKey().switchFullOn();
83                                                 repaint();
84                                         }
85                                 }
86                         }
87
88                         @Override
89                         public void mouseExited(MouseEvent e)
90                         {
91                                 // none
92                         }
93
94                         @Override
95                         public void mouseEntered(MouseEvent e)
96                         {
97                                 // none
98                         }
99
100                         @Override
101                         public void mouseClicked(MouseEvent e)
102                         {
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();
107 //                                              repaint();
108 //                                      }
109 //                              }
110                         }
111                 });
112         }
113
114         public Timeline getTimeline()
115         {
116                 return t;
117         }
118
119         @Override
120         public void paint(Graphics some_g)
121         {
122                 super.paint(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);
127
128                 checkSizeChange();
129                 adaptFont(g);
130
131                 drawWire(g, r, "r", 2, 9, 4, 9);
132
133                 drawWire(g, s, "s", 2, 3, 4, 3);
134
135                 drawWire(g, t2, "t2", 5, 8.5, 6, 8.5);
136
137                 drawWire(g, t1, "t1", 5, 3.5, 6, 3.5);
138
139                 drawWire(g, q, "q", 7, 8.5, 9, 8.5);
140
141                 drawWire(g, nq, "nq", 7, 3.5, 9, 3.5);
142
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);
147
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);
152
153                 drawSquare(g, 4, 8, "OR");
154                 drawSquare(g, 4, 3, "OR");
155
156                 drawSquare(g, 6, 8, "NOT");
157                 drawSquare(g, 6, 3, "NOT");
158
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);
161
162                 drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0);
163         }
164
165         private void checkSizeChange()
166         {
167                 sizeChanged = height != getHeight() || width != getWidth();
168                 if (sizeChanged)
169                 {
170                         height = getHeight();
171                         width = getWidth();
172                 }
173         }
174
175         private void adaptFont(Graphics g)
176         {
177                 g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f));
178         }
179
180         @SuppressWarnings("static-method")
181         private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY)
182         {
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));
186         }
187
188         private void drawWire(Graphics g, CoreWire wa, String name, double x1, double y1, double x2, double y2)
189         {
190                 setTo(g, wa);
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);
193         }
194
195         private void drawSquare(Graphics g, int posX, int posY, String text)
196         {
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;
201
202                 g.setColor(Color.WHITE);
203                 g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
204                 setBlack(g);
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);
207
208         }
209
210         private void drawSwitch(Graphics g, CoreManualSwitch ms, String text, double posX1, double posY1, double posX2, double posY2)
211         {
212                 int x1 = gX(posX1) - 5;
213                 int x2 = gX(posX2) + 5;
214                 int y1 = gY(posY1) - 5;
215                 int y2 = gY(posY2) + 5;
216
217                 if (sizeChanged)
218                 {
219                         Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1);
220                         switchMap.put(ms, r);
221                 }
222
223                 g.setColor(ms.isFullOn() ? Color.getHSBColor(.3f, .5f, 1f) : Color.WHITE);
224                 g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
225                 setBlack(g);
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);
228         }
229
230         private static void setBlack(Graphics g)
231         {
232                 g.setColor(Color.BLACK);
233         }
234
235         private static void setTo(Graphics g, CoreWire wa)
236         {
237                 switch (wa.getValue())
238                 {
239                 case ONE:
240                         g.setColor(Color.GREEN);
241                         break;
242                 case X:
243                         g.setColor(Color.RED);
244                         break;
245                 case Z:
246                         g.setColor(Color.DARK_GRAY);
247                         break;
248                 case ZERO:
249                         g.setColor(Color.BLACK);
250                         break;
251                 case U:
252                         g.setColor(Color.MAGENTA);
253                         break;
254                 default:
255                         throw new IllegalArgumentException();
256                 }
257         }
258
259         private int gY(double pos)
260         {
261                 return (int) (pos * height / 11);
262         }
263
264         private int gX(double pos)
265         {
266                 return (int) (pos * width / 11) + 50;
267         }
268
269         public static void main(String[] args)
270         {
271                 JFrame f = new JFrame("Test circuit 1.0.0");
272                 GUITest gt = new GUITest();
273                 f.add(gt);
274                 f.setSize(800, 600);
275                 f.setLocation(500, 400);
276                 f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
277                 f.setVisible(true);
278
279                 long begin = System.currentTimeMillis();
280
281                 long lastFrame = begin;
282                 long updateT = 16;
283
284                 while (f.isVisible())
285                 {
286                         ExecutionResult er = gt.getTimeline().executeUntil(gt.getTimeline().laterThan((lastFrame - begin) * 3), lastFrame + 14);
287 //                              if (t.hasNext()) 
288 //                              t.executeNext();
289                         if (er != ExecutionResult.NOTHING_DONE)
290                                 gt.repaint(12);
291                         try
292                         {
293                                 Thread.sleep(Math.max(updateT - System.currentTimeMillis() + lastFrame, 0));
294                         }
295                         catch (Exception e)
296                         {
297                                 e.printStackTrace();
298                         }
299                         lastFrame = System.currentTimeMillis();
300                 }
301         }
302 }