1 package edu.berkeley.slipway.gui;
3 import com.atmel.fpslic.*;
4 import static com.atmel.fpslic.FpslicConstants.*;
5 import static com.atmel.fpslic.FpslicUtil.*;
6 import edu.berkeley.slipway.*;
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.*;
17 public abstract class ZoomingPanel extends JComponent implements KeyListener, MouseMotionListener, MouseListener {
23 public boolean drag = false;
26 protected AffineTransform transform = new AffineTransform();
27 private Point2D recenter = new Point2D.Double(-100, 2500);
28 private Point2D recenter2;
30 private FtdiBoard ftdiboard;
32 public ZoomingPanel(FtdiBoard ftdiboard) {
33 this.ftdiboard = ftdiboard;
34 setDoubleBuffered(true);
36 addMouseMotionListener(this);
37 addMouseListener(this);
40 public abstract void _paint(Graphics2D g);
42 public final void paint(Graphics _g) {
43 Graphics2D g = (Graphics2D)_g;
47 g.translate(5, -1 * getHeight() + 10);
49 transform = g.getTransform();
51 Point2D p = new Point2D.Float();
52 if (recenter != null) {
53 transform.transform(recenter, p);
54 transform.preConcatenate(AffineTransform.getTranslateInstance(dragx - p.getX(),
57 g.setTransform(transform);
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));
74 public void keyTyped(KeyEvent k) {
76 public void keyReleased(KeyEvent k) {
77 shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
78 if (k.getKeyCode() == k.VK_ALT) {
85 switch(k.getKeyCode()) {
86 case VK_X: xkey = false; return;
87 case VK_Y: ykey = false; return;
92 public void keyPressed(KeyEvent k) {
93 shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
95 char c = k.getKeyChar();
99 public boolean shiftkey = false;
100 public void keyPressed0(KeyEvent k) {
102 if (k.getKeyCode() == k.VK_ALT) {
106 recenter = new Point2D.Float(dragx, dragy);
108 transform.inverseTransform(recenter, recenter);
109 } catch (Exception e) {
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()) {
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);
148 c.fpslic().cell(20,22).ylut(0x00);
149 c.fpslic().cell(20,22).xlut(0x00);
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");
160 case VK_BACK_QUOTE: {
167 c.xlut(LUT_SELF & LUT_OTHER);
168 c.ylut(LUT_SELF & LUT_OTHER);
180 c.ylut((LUT_SELF & ~LUT_OTHER) |
181 (LUT_Z & ~LUT_OTHER) |
198 c.xlut((LUT_SELF & ~LUT_OTHER) |
199 (LUT_Z & ~LUT_OTHER) |
228 c.xlut(LUT_SELF | LUT_OTHER);
229 c.ylut(LUT_SELF | LUT_OTHER);
246 System.out.println("interrupt count => " + ftdiboard.readCount());
252 else switch(k.getKeyCode()) {
253 case VK_ESCAPE: scale = 1.0; recenter = null; repaint(); return;
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'));
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;
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;
277 if (lastChar == 'x') { c.xo(true); repaint(); return; }
278 if (lastChar == 'y' || lastChar == 'q') { c.yo(true); repaint(); return; }
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;
288 case VK_F: c.f(!c.f()); repaint(); return;
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;
316 case H4: c.oe(V4); break;
317 case V4: c.oe(NONE); break;
318 case NONE: c.oe(H4); break;
334 public Gui.Cell oldcell = null;
335 public abstract Gui.Cell whichCell(int x, int y);
336 public void mouseMoved(MouseEvent m) {
338 Gui.Cell newcell = whichCell(m.getX(), m.getY());
340 System.out.println((oldcell==null ? "old=null" : ("old=" + oldcell._x+","+oldcell._y+" "))+
341 (newcell==null ? "new=null" : ("new=" + newcell._x+","+newcell._y+" ")));
343 if (oldcell != newcell) {
344 if (oldcell != null) oldcell.in = false;
345 if (newcell != null) newcell.in = true;
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);
365 public boolean isFocusable() { return true; }
367 public void mouseDragged(MouseEvent m) {
373 public abstract void pressed();
374 public abstract void released();
375 public void mousePressed(MouseEvent m) {
379 recenter = new Point2D.Float(m.getX(), m.getY());
381 transform.transform(recenter, recenter);
382 } catch (Exception e) {
389 public void mouseEntered(MouseEvent e) { }
390 public void mouseExited(MouseEvent e) { }
391 public void mouseClicked(MouseEvent e) { }
392 public void mouseReleased(MouseEvent e) {
396 public boolean mousebutton = false;
397 public boolean xkey = false;
398 public boolean ykey = false;
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();