1 package edu.berkeley.obits.device.atmel;
3 import edu.berkeley.slipway.*;
4 import edu.berkeley.obits.*;
5 import org.ibex.util.Log;
10 /** the "host" side of the AVR Drone; see AvrDrone.c for the other side */
11 public class AvrDrone extends AtmelDevice {
13 private final DataInputStream in;
14 private final DataOutputStream out;
15 private final Board board;
17 public AvrDrone(Board b) throws IOException {
19 this.out = new DataOutputStream(b.getOutputStream());
20 this.in = new DataInputStream(b.getInputStream());
24 public void reset() throws DeviceException {
27 } catch (IOException e) {
28 throw new DeviceException(e);
32 private void init() throws IOException {
33 byte[] bytes = new byte[6];
39 // read any crap that might be left in the buffer
41 System.arraycopy(bytes, 1, bytes, 0, 5);
42 bytes[5] = in.readByte();
44 System.out.print("\rsignature: read \"" + new String(bytes) + "\" ");
45 if (bytes[0] == (byte)'O' &&
46 bytes[1] == (byte)'B' &&
47 bytes[2] == (byte)'I' &&
48 bytes[3] == (byte)'T' &&
49 bytes[4] == (byte)'S') {
50 System.out.println("\rsignature: got proper signature ");
57 public synchronized void scanFPGA(boolean on) throws DeviceException {
65 } catch (IOException e) { throw new DeviceException(e); }
68 public static int retval = 0;
69 public synchronized int readCount() throws DeviceException {
75 ByteCallback bc = new ByteCallback() {
76 public synchronized void call(byte b) throws Exception {
79 ((in.read() & 0xff) << 16) |
80 ((in.read() & 0xff) << 8) |
81 ((in.read() & 0xff) << 0);
92 } catch (Exception e) { throw new DeviceException(e); }
95 public static interface ByteCallback {
96 public void call(byte b) throws Exception;
99 private Vector callbacks = new Vector();
101 private Thread reader = new Thread() {
103 System.out.println("*** reader thread begun");
106 byte b = in.readByte();
107 ByteCallback bc = (ByteCallback)callbacks.remove(0);
109 } catch (Exception e) {
116 public synchronized void readBus(ByteCallback bc) throws DeviceException {
121 if (reader != null) {
125 } catch (IOException e) { throw new DeviceException(e); }
128 public synchronized void readInterrupts(ByteCallback bc) throws DeviceException {
133 if (reader != null) {
137 } catch (IOException e) { throw new DeviceException(e); }
140 private byte[][][] cache = new byte[24][][];
141 public /*synchronized*/ byte mode4(int z, int y, int x) throws DeviceException {
142 if (cache[x]==null) return 0;
143 if (cache[x][y]==null) return 0;
144 return cache[x][y][z];
150 public static int save = 0;
151 public static int saveof = 0;
152 public /*synchronized*/ void mode4(int z, int y, int x, int d) throws DeviceException {
155 Log.info(this, "writing configuration frame [zyxd]: " +
156 pad(1, Integer.toString(z&0xff, 16)) + " " +
157 pad(1, Integer.toString(y&0xff, 16)) + " " +
158 pad(1, Integer.toString(x&0xff, 16)) + " " +
159 pad(1, Integer.toString(d&0xff, 16))
162 boolean zchange = z!=lastz;
163 boolean ychange = y!=lasty;
164 boolean xchange = x!=lastx;
165 boolean zinc = z==lastz+1;
166 boolean yinc = y==lasty+1;
167 boolean xinc = x==lastx+1;
168 boolean zdec = z==lastz-1;
169 boolean ydec = y==lasty-1;
170 boolean xdec = x==lastx-1;
182 if (cache[x & 0xff]==null) cache[x & 0xff] = new byte[24][];
183 if (cache[x & 0xff][y & 0xff]==null) cache[x & 0xff][y & 0xff] = new byte[256];
184 cache[x & 0xff][y & 0xff][z & 0xff] = (byte)(d & 0xff);
185 } catch (IOException e) { throw new DeviceException(e); }
188 public /*synchronized*/ void flush() throws DeviceException {
191 } catch (IOException e) { throw new DeviceException(e); }
194 private String pad(int i, String s) { if (s.length()>i) return s; return "0"+pad((i-1),s); }