checkpoint
[slipway.git] / src / edu / berkeley / slipway / gui / ZoomingPanel.java
1 package edu.berkeley.slipway.gui;
2
3 import com.atmel.fpslic.*;
4 import static com.atmel.fpslic.FpslicConstants.*;
5 import static com.atmel.fpslic.FpslicUtil.*;
6 import edu.berkeley.slipway.*;
7 import java.awt.*;
8 import java.awt.geom.*;
9 import java.awt.event.*;
10 import static java.awt.event.KeyEvent.*;
11 import java.awt.color.*;
12 import org.ibex.util.*;
13 import java.io.*;
14 import java.util.*;
15 import javax.swing.*;
16
17 public abstract class ZoomingPanel extends JComponent implements KeyListener, MouseMotionListener, MouseListener {
18
19     double scale = 1.0;
20     double oscale = 1.0;
21     public    int dragx = 0;
22     public    int dragy = 0;
23     public    boolean drag = false;
24     protected int mousex;
25     protected int mousey;
26     protected AffineTransform transform = new AffineTransform();
27     private   Point2D recenter;
28     private   Point2D recenter2;
29
30     private FtdiBoard ftdiboard;
31
32     public ZoomingPanel(FtdiBoard ftdiboard) {
33         this.ftdiboard = ftdiboard;
34         setDoubleBuffered(true);
35         addKeyListener(this);
36         addMouseMotionListener(this);
37         addMouseListener(this);
38     }
39
40     public abstract void _paint(Graphics2D g);
41
42     public final void paint(Graphics _g) {
43         Graphics2D g = (Graphics2D)_g;
44         g.scale(scale,scale);
45         g.translate(10, 0);
46         g.scale(1, -1);
47         g.translate(5, -1 * getHeight() + 10);
48
49         transform = g.getTransform();
50
51         Point2D p = new Point2D.Float();
52         if (recenter != null) {
53             transform.transform(recenter, p);
54             transform.preConcatenate(AffineTransform.getTranslateInstance(dragx - p.getX(),
55                                                                           dragy - p.getY()));
56         }
57         g.setTransform(transform);
58
59         if (drag) {
60             g.setColor(Color.blue);
61             g.drawLine((int)(recenter.getX() - 10),
62                        (int)(recenter.getY() - 10),
63                        (int)(recenter.getX() + 10),
64                        (int)(recenter.getY() + 10));
65             g.drawLine((int)(recenter.getX() + 10),
66                        (int)(recenter.getY() - 10),
67                        (int)(recenter.getX() - 10),
68                        (int)(recenter.getY() + 10));
69         }
70         _paint(g);
71     }
72
73
74     public void keyTyped(KeyEvent k) {
75     }
76     public void keyReleased(KeyEvent k) {
77         shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
78         if (k.getKeyCode() == k.VK_ALT) {
79             if (drag) {
80                 drag = false;
81                 oscale = scale;
82                 repaint();
83             }
84         }
85         switch(k.getKeyCode()) {
86             case VK_X: xkey = false; return; 
87             case VK_Y: ykey = false; return; 
88         }
89     }
90     public char lastChar;
91     public int keyMode;
92     public void keyPressed(KeyEvent k) {
93         shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
94         keyPressed0(k);
95         char c = k.getKeyChar();
96         if (c=='q') c = 'y';
97         lastChar = c;
98     }
99     public boolean shiftkey = false;
100     public void keyPressed0(KeyEvent k) {
101         repaint();
102         if (k.getKeyCode() == k.VK_ALT) {
103             drag = true;
104             dragx = mousex;
105             dragy = mousey;
106             recenter = new Point2D.Float(dragx, dragy);
107             try {
108                 transform.inverseTransform(recenter, recenter);
109             } catch (Exception e) {
110                 e.printStackTrace();
111             }
112         }
113         Gui.Cell cell = whichCell(mousex, mousey);
114         Fpslic.Cell c = cell == null ? null : cell.cell;
115         if ((k.getModifiers() & k.ALT_MASK) != 0 || (k.getModifiers() & k.META_MASK) != 0)
116             switch(k.getKeyCode()) {
117                 case VK_S:
118                     writeMode4();
119                     break;
120                     /*
121                 case VK_O:
122                     readMode4();
123                     break;
124                     */
125                 case VK_0: {
126                     c.xlut(0x00);
127                     c.ylut(0x00);
128                     repaint();
129                     return;
130                 }
131                 case VK_1: {
132                     c.xlut(0xff);
133                     c.ylut(0xff);
134                     repaint();
135                     return;
136                 }
137                 case VK_F: {
138                     int save1y = c.fpslic().cell(19,22).ylut();
139                     int save1x = c.fpslic().cell(19,22).xlut();
140                     int save2y = c.fpslic().cell(20,22).ylut();
141                     int save2x = c.fpslic().cell(20,22).xlut();
142                     c.fpslic().cell(19,22).ylut(0xff);
143                     c.fpslic().cell(19,22).xlut(0xff);
144                     for(int i=0; i<800; i++) {
145                         c.fpslic().cell(20,22).ylut(0xff);
146                         c.fpslic().cell(20,22).xlut(0xff);
147                         c.fpslic().flush();
148                         c.fpslic().cell(20,22).ylut(0x00);
149                         c.fpslic().cell(20,22).xlut(0x00);
150                         c.fpslic().flush();
151                     }
152                     c.fpslic().cell(19,22).ylut(save1y);
153                     c.fpslic().cell(19,22).xlut(save1x);
154                     c.fpslic().cell(20,22).ylut(save2y);
155                     c.fpslic().cell(20,22).xlut(save2x);
156                     System.out.println("done");
157                     repaint();
158                     return;
159                 }
160                 case VK_BACK_QUOTE: {
161                     c.xlut(0xff);
162                     c.ylut(0xff);
163                     repaint();
164                     return;
165                 }
166                 case VK_A: {
167                     c.xlut(LUT_SELF & LUT_OTHER);
168                     c.ylut(LUT_SELF & LUT_OTHER);
169                     repaint();
170                     return;
171                 }
172                 case VK_2:
173                 case VK_G:
174                     {
175                 c.c(YLUT);
176                 c.ylut(0x00);
177                 c.xlut(0x00);
178                 c.wi(L0);
179                 c.t(TMUX_W_AND_FB);
180                 c.ylut((LUT_SELF & ~LUT_OTHER) |
181                        (LUT_Z & ~LUT_OTHER) |
182                        (LUT_Z & LUT_SELF));
183                 c.fpslic().flush();
184                 c.xlut(LUT_Z);
185                 c.fpslic().flush();
186                 c.wi(NONE);
187                 c.fpslic().flush();
188                     repaint();
189                     return;
190                 }
191                 case VK_3: {
192
193                 c.c(XLUT);
194                 c.xlut(0x00);
195                 c.ylut(0x00);
196                 c.wi(L0);
197                 c.t(TMUX_W_AND_FB);
198                 c.xlut((LUT_SELF & ~LUT_OTHER) |
199                        (LUT_Z & ~LUT_OTHER) |
200                        (LUT_Z & LUT_SELF));
201                 c.fpslic().flush();
202                 c.ylut(LUT_Z);
203                 c.fpslic().flush();
204                 c.wi(NONE);
205                 c.fpslic().flush();
206                     repaint();
207                     return;
208                 }
209                 case VK_Z: {
210                     c.xlut(LUT_Z);
211                     c.ylut(LUT_Z);
212                     repaint();
213                     return;
214                 }
215                 case VK_W: {
216                     c.xlut(LUT_Z);
217                     c.ylut(LUT_SELF);
218                     c.t(TMUX_W);
219                     repaint();
220                     return;
221                 }
222                 case VK_T: {
223                     //c.t(;
224                     repaint();
225                     return;
226                 }
227                 case VK_O: {
228                     c.xlut(LUT_SELF | LUT_OTHER);
229                     c.ylut(LUT_SELF | LUT_OTHER);
230                     repaint();
231                     return;
232                 }
233                 case VK_X: {
234                     c.xlut(LUT_SELF);
235                     c.ylut(LUT_OTHER);
236                     repaint();
237                     return;
238                 }
239                 case VK_Y: {
240                     c.xlut(LUT_OTHER);
241                     c.ylut(LUT_SELF);
242                     repaint();
243                     return;
244                 }
245                 case VK_I: {
246                     System.out.println("interrupt count => " + ftdiboard.readCount());
247                     repaint();
248                     return;
249                 }
250             }
251
252         else switch(k.getKeyCode()) {
253             case VK_ESCAPE: scale = 1.0; recenter = null; repaint(); return;
254
255             case VK_BACK_QUOTE: case VK_0: case VK_1: case VK_2: case VK_3: case VK_4: {
256                 int i = k.getKeyCode()==VK_BACK_QUOTE ? NONE : (L0 + (k.getKeyChar() - '0'));
257                 switch(lastChar) {
258                     case 'x': c.xi(i); break;
259                     case 'y': case 'q': c.yi(i); break;
260                     case 'w': c.wi(i); break;
261                     case 'z': c.zi(i); break;
262                     case 'o': c.out(i, !c.out(i)); break;
263                     case 'h': c.h(i, !c.hx(i)); break;
264                     case 'v': c.v(i, !c.vx(i)); break;
265                 }
266                 repaint();
267                 return;
268                 }
269
270             case VK_W: if (lastChar == 'w') c.wi(NONE); repaint(); return;
271             case VK_X: if (lastChar == 'x') c.xi(NONE); repaint(); return;
272             case VK_Y: if (lastChar == 'y') c.yi(NONE); repaint(); return;
273             case VK_Z: if (lastChar == 'z') c.zi(NONE); repaint(); return;
274             case VK_Q: if (lastChar == 'q') c.yi(NONE); repaint(); return;
275
276             case VK_C:
277                 if (lastChar == 'x') { c.xo(true); repaint(); return; }
278                 if (lastChar == 'y' || lastChar == 'q') { c.yo(true); repaint(); return; }
279                 switch(c.c()) {
280                     case XLUT: c.c(YLUT); break;
281                     case YLUT: c.c(ZMUX); break;
282                     case ZMUX: c.c(XLUT); break;
283                     default:   c.c(ZMUX); break;
284                 }
285                 repaint();
286                 return;
287
288             case VK_F: c.f(!c.f()); repaint(); return;
289             case VK_S:
290                 Gui.Cell gc = whichCell(mousex,mousey);
291                 gc.scanme = !gc.scanme;
292                 //case VK_S: c.ff_reset_value(!c.ff_reset_value()); repaint(); return;
293             case VK_R: c.b(!c.b()); repaint(); return;
294
295             case VK_T:
296                 switch(c.t()) {
297                     case TMUX_FB:
298                     case TMUX_W_AND_FB:
299                         c.t(TMUX_W_AND_Z);
300                         break;
301
302                     case TMUX_Z:
303                     case TMUX_W_AND_Z:
304                         c.t(TMUX_W);
305                         break;
306
307                     case TMUX_W:
308                         c.t(TMUX_W_AND_FB);
309                         break;
310                 }
311                 repaint();
312                 return;
313
314             case VK_E:
315                 switch(c.oe()) {
316                     case H4:   c.oe(V4); break;
317                     case V4:   c.oe(NONE); break;
318                     case NONE: c.oe(H4); break;
319                 }
320                 repaint();
321                 return;
322
323                 // ff reset polarity
324                 // h0..h5, v0..v5
325                 // xi=0..5
326                 // yi=0..5
327                 // zi=0..5
328                 // wi=0..5
329                 // t-mux
330                 
331         }
332     }
333
334     public Gui.Cell oldcell = null;
335     public abstract Gui.Cell whichCell(int x, int y);
336     public void mouseMoved(MouseEvent m) {
337
338         Gui.Cell newcell = whichCell(m.getX(), m.getY());
339         /*
340         System.out.println((oldcell==null ? "old=null" : ("old=" + oldcell._x+","+oldcell._y+"  "))+
341                            (newcell==null ? "new=null" : ("new=" + newcell._x+","+newcell._y+"  ")));
342         */
343         if (oldcell != newcell) {
344             if (oldcell != null) oldcell.in = false;
345             if (newcell != null) newcell.in = true;
346             repaint();
347         }
348         oldcell = newcell;
349
350         mousex = m.getX();
351         mousey = m.getY();
352         if (drag) {
353             if (mousey > dragy + 5) {
354                 scale = 1 / ((1 / oscale) + ((mousey - dragy) / 50.0));
355             } else if (mousey < dragy - 5) {
356                 scale = oscale + ((dragy - mousey) / 50.0);
357             } else {
358                 scale = oscale;
359             }
360             repaint();
361         }
362     }
363
364    
365     public boolean isFocusable() { return true; }
366
367     public void mouseDragged(MouseEvent m) {
368         mouseMoved(m);
369         //dragx = m.getX();
370         //dragy = m.getY();
371
372     }
373     public abstract void pressed();
374     public abstract void released();
375     public void mousePressed(MouseEvent m) {
376         mousebutton = true;
377
378         /*
379         recenter = new Point2D.Float(m.getX(), m.getY());
380         try {
381             transform.transform(recenter, recenter);
382         } catch (Exception e) {
383             e.printStackTrace();
384         }
385         repaint();
386         */
387         pressed();
388     }
389     public void mouseEntered(MouseEvent e) { }
390     public void mouseExited(MouseEvent e) { }
391     public void mouseClicked(MouseEvent e) { }
392     public void mouseReleased(MouseEvent e) {
393         mousebutton = false;
394         released();
395     }
396     public boolean mousebutton = false;
397     public boolean xkey = false;
398     public boolean ykey = false;
399
400     HashSet<Gui.Cell> cells = new HashSet<Gui.Cell>();
401     public abstract void scan(final Gui.Cell c);
402     public abstract void scan();
403     public abstract void writeMode4();
404     public abstract void readMode4();
405 }