1 package edu.berkeley.slipway.gui;
3 import com.atmel.fpslic.*;
4 import static com.atmel.fpslic.FpslicConstants.*;
5 import edu.berkeley.slipway.*;
7 import java.awt.geom.*;
8 import java.awt.event.*;
9 import static java.awt.event.KeyEvent.*;
10 import java.awt.color.*;
11 import org.ibex.util.*;
16 public abstract class ZoomingPanel extends JComponent implements KeyListener, MouseMotionListener, MouseListener {
22 public boolean drag = false;
25 protected AffineTransform transform = new AffineTransform();
26 private Point2D recenter = new Point2D.Double(-100, 2500);
27 private Point2D recenter2;
29 private SlipwayBoard ftdiboard;
31 public ZoomingPanel(SlipwayBoard ftdiboard) {
32 this.ftdiboard = ftdiboard;
33 setDoubleBuffered(true);
35 addMouseMotionListener(this);
36 addMouseListener(this);
39 public abstract void _paint(Graphics2D g);
41 public final void paint(Graphics _g) {
42 Graphics2D g = (Graphics2D)_g;
46 g.translate(5, -1 * getHeight() + 10);
48 transform = g.getTransform();
50 Point2D p = new Point2D.Float();
51 if (recenter != null) {
52 transform.transform(recenter, p);
53 transform.preConcatenate(AffineTransform.getTranslateInstance(dragx - p.getX(),
56 g.setTransform(transform);
59 g.setColor(Color.blue);
60 g.drawLine((int)(recenter.getX() - 10),
61 (int)(recenter.getY() - 10),
62 (int)(recenter.getX() + 10),
63 (int)(recenter.getY() + 10));
64 g.drawLine((int)(recenter.getX() + 10),
65 (int)(recenter.getY() - 10),
66 (int)(recenter.getX() - 10),
67 (int)(recenter.getY() + 10));
73 public void keyTyped(KeyEvent k) {
75 public void keyReleased(KeyEvent k) {
76 shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
77 if (k.getKeyCode() == k.VK_ALT) {
84 switch(k.getKeyCode()) {
85 case VK_X: xkey = false; return;
86 case VK_Y: ykey = false; return;
91 public void keyPressed(KeyEvent k) {
92 shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
94 char c = k.getKeyChar();
98 public boolean shiftkey = false;
99 public void keyPressed0(KeyEvent k) {
101 if (k.getKeyCode() == k.VK_ALT) {
105 recenter = new Point2D.Float(dragx, dragy);
107 transform.inverseTransform(recenter, recenter);
108 } catch (Exception e) {
112 Gui.Cell cell = whichCell(mousex, mousey);
113 FpslicDevice.Cell c = cell == null ? null : cell.cell;
114 if ((k.getModifiers() & k.ALT_MASK) != 0 || (k.getModifiers() & k.META_MASK) != 0)
115 switch(k.getKeyCode()) {
137 int save1y = c.fpslic().cell(19,22).ylut();
138 int save1x = c.fpslic().cell(19,22).xlut();
139 int save2y = c.fpslic().cell(20,22).ylut();
140 int save2x = c.fpslic().cell(20,22).xlut();
141 c.fpslic().cell(19,22).ylut(0xff);
142 c.fpslic().cell(19,22).xlut(0xff);
143 for(int i=0; i<800; i++) {
144 c.fpslic().cell(20,22).ylut(0xff);
145 c.fpslic().cell(20,22).xlut(0xff);
147 c.fpslic().cell(20,22).ylut(0x00);
148 c.fpslic().cell(20,22).xlut(0x00);
151 c.fpslic().cell(19,22).ylut(save1y);
152 c.fpslic().cell(19,22).xlut(save1x);
153 c.fpslic().cell(20,22).ylut(save2y);
154 c.fpslic().cell(20,22).xlut(save2x);
155 System.out.println("done");
159 case VK_BACK_QUOTE: {
166 c.xlut(LUT_SELF & LUT_OTHER);
167 c.ylut(LUT_SELF & LUT_OTHER);
179 c.ylut((LUT_SELF & ~LUT_OTHER) |
180 (LUT_Z & ~LUT_OTHER) |
197 c.xlut((LUT_SELF & ~LUT_OTHER) |
198 (LUT_Z & ~LUT_OTHER) |
227 c.xlut(LUT_SELF | LUT_OTHER);
228 c.ylut(LUT_SELF | LUT_OTHER);
245 System.out.println("interrupt count => " + ftdiboard.readInterruptCount());
251 else switch(k.getKeyCode()) {
252 case VK_ESCAPE: scale = 1.0; recenter = null; repaint(); return;
254 case VK_BACK_QUOTE: case VK_0: case VK_1: case VK_2: case VK_3: case VK_4: {
255 int i = k.getKeyCode()==VK_BACK_QUOTE ? NONE : (L0 + (k.getKeyChar() - '0'));
257 case 'x': c.xi(i); break;
258 case 'y': case 'q': c.yi(i); break;
259 case 'w': c.wi(i); break;
260 case 'z': c.zi(i); break;
261 case 'o': c.out(i, !c.out(i)); break;
262 case 'h': c.h(i, !c.hx(i)); break;
263 case 'v': c.v(i, !c.vx(i)); break;
269 case VK_W: if (lastChar == 'w') c.wi(NONE); repaint(); return;
270 case VK_X: if (lastChar == 'x') c.xi(NONE); repaint(); return;
271 case VK_Y: if (lastChar == 'y') c.yi(NONE); repaint(); return;
272 case VK_Z: if (lastChar == 'z') c.zi(NONE); repaint(); return;
273 case VK_Q: if (lastChar == 'q') c.yi(NONE); repaint(); return;
276 if (lastChar == 'x') { c.xo(true); repaint(); return; }
277 if (lastChar == 'y' || lastChar == 'q') { c.yo(true); repaint(); return; }
279 case XLUT: c.c(YLUT); break;
280 case YLUT: c.c(ZMUX); break;
281 case ZMUX: c.c(XLUT); break;
282 default: c.c(ZMUX); break;
287 case VK_F: c.f(!c.f()); repaint(); return;
289 Gui.Cell gc = whichCell(mousex,mousey);
290 gc.scanme = !gc.scanme;
291 //case VK_S: c.ff_reset_value(!c.ff_reset_value()); repaint(); return;
292 case VK_R: c.b(!c.b()); repaint(); return;
315 case H4: c.oe(V4); break;
316 case V4: c.oe(NONE); break;
317 case NONE: c.oe(H4); break;
333 public Gui.Cell oldcell = null;
334 public abstract Gui.Cell whichCell(int x, int y);
335 public void mouseMoved(MouseEvent m) {
337 Gui.Cell newcell = whichCell(m.getX(), m.getY());
339 System.out.println((oldcell==null ? "old=null" : ("old=" + oldcell._x+","+oldcell._y+" "))+
340 (newcell==null ? "new=null" : ("new=" + newcell._x+","+newcell._y+" ")));
342 if (oldcell != newcell) {
343 if (oldcell != null) oldcell.in = false;
344 if (newcell != null) newcell.in = true;
352 if (mousey > dragy + 5) {
353 scale = 1 / ((1 / oscale) + ((mousey - dragy) / 50.0));
354 } else if (mousey < dragy - 5) {
355 scale = oscale + ((dragy - mousey) / 50.0);
364 public boolean isFocusable() { return true; }
366 public void mouseDragged(MouseEvent m) {
372 public abstract void pressed();
373 public abstract void released();
374 public void mousePressed(MouseEvent m) {
378 recenter = new Point2D.Float(m.getX(), m.getY());
380 transform.transform(recenter, recenter);
381 } catch (Exception e) {
388 public void mouseEntered(MouseEvent e) { }
389 public void mouseExited(MouseEvent e) { }
390 public void mouseClicked(MouseEvent e) { }
391 public void mouseReleased(MouseEvent e) {
395 public boolean mousebutton = false;
396 public boolean xkey = false;
397 public boolean ykey = false;
399 HashSet<Gui.Cell> cells = new HashSet<Gui.Cell>();
400 public abstract void scan(final Gui.Cell c);
401 public abstract void scan();
402 public abstract void writeMode4();
403 public abstract void readMode4();