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;
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);
175 c.generalized_c_element();
180 c.generalized_c_element();
181 c.xlut((LUT_SELF & ~LUT_OTHER) | (LUT_Z & ~LUT_OTHER) | (LUT_Z & LUT_SELF & LUT_OTHER));
206 c.xlut(LUT_SELF | LUT_OTHER);
207 c.ylut(LUT_SELF | LUT_OTHER);
224 System.out.println("interrupt count => " + ftdiboard.readCount());
230 else switch(k.getKeyCode()) {
231 case VK_ESCAPE: scale = 1.0; recenter = null; repaint(); return;
233 case VK_BACK_QUOTE: case VK_0: case VK_1: case VK_2: case VK_3: case VK_4: {
234 int i = k.getKeyCode()==VK_BACK_QUOTE ? NONE : (L0 + (k.getKeyChar() - '0'));
236 case 'x': c.xi(i); break;
237 case 'y': case 'q': c.yi(i); break;
238 case 'w': c.wi(i); break;
239 case 'z': c.zi(i); break;
240 case 'o': c.out(i, !c.out(i)); break;
241 case 'h': c.h(i, !c.hx(i)); break;
242 case 'v': c.v(i, !c.vx(i)); break;
248 case VK_W: if (lastChar == 'w') c.wi(NONE); repaint(); return;
249 case VK_X: if (lastChar == 'x') c.xi(NONE); repaint(); return;
250 case VK_Y: if (lastChar == 'y') c.yi(NONE); repaint(); return;
251 case VK_Z: if (lastChar == 'z') c.zi(NONE); repaint(); return;
252 case VK_Q: if (lastChar == 'q') c.yi(NONE); repaint(); return;
255 if (lastChar == 'x') { c.xo(true); repaint(); return; }
256 if (lastChar == 'y' || lastChar == 'q') { c.yo(true); repaint(); return; }
258 case XLUT: c.c(YLUT); break;
259 case YLUT: c.c(ZMUX); break;
260 case ZMUX: c.c(XLUT); break;
261 default: c.c(ZMUX); break;
266 case VK_F: c.f(!c.f()); repaint(); return;
268 Gui.Cell gc = whichCell(mousex,mousey);
269 gc.scanme = !gc.scanme;
270 //case VK_S: c.ff_reset_value(!c.ff_reset_value()); repaint(); return;
271 case VK_R: c.b(!c.b()); repaint(); return;
294 case H4: c.oe(V4); break;
295 case V4: c.oe(NONE); break;
296 case NONE: c.oe(H4); break;
312 public Gui.Cell oldcell = null;
313 public abstract Gui.Cell whichCell(int x, int y);
314 public void mouseMoved(MouseEvent m) {
316 Gui.Cell newcell = whichCell(m.getX(), m.getY());
318 System.out.println((oldcell==null ? "old=null" : ("old=" + oldcell._x+","+oldcell._y+" "))+
319 (newcell==null ? "new=null" : ("new=" + newcell._x+","+newcell._y+" ")));
321 if (oldcell != newcell) {
322 if (oldcell != null) oldcell.in = false;
323 if (newcell != null) newcell.in = true;
331 if (mousey > dragy + 5) {
332 scale = 1 / ((1 / oscale) + ((mousey - dragy) / 50.0));
333 } else if (mousey < dragy - 5) {
334 scale = oscale + ((dragy - mousey) / 50.0);
343 public boolean isFocusable() { return true; }
345 public void mouseDragged(MouseEvent m) {
351 public abstract void pressed();
352 public abstract void released();
353 public void mousePressed(MouseEvent m) {
357 recenter = new Point2D.Float(m.getX(), m.getY());
359 transform.transform(recenter, recenter);
360 } catch (Exception e) {
367 public void mouseEntered(MouseEvent e) { }
368 public void mouseExited(MouseEvent e) { }
369 public void mouseClicked(MouseEvent e) { }
370 public void mouseReleased(MouseEvent e) {
374 public boolean mousebutton = false;
375 public boolean xkey = false;
376 public boolean ykey = false;
378 HashSet<Gui.Cell> cells = new HashSet<Gui.Cell>();
379 public abstract void scan(final Gui.Cell c);
380 public abstract void scan();
381 public abstract void writeMode4();
382 public abstract void readMode4();