X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fobits%2Fdevice%2Fatmel%2FAvrDrone.java;h=7860ad69206e26bfba387b7deda011c7b58f989a;hb=bb3326dd8253c36b342063dbbd1c24ef866c37b9;hp=2e50094dfec70239a7d781905d254304b479f01d;hpb=604bd6c2950f0c389380f4d0cd107a1cc8719220;p=slipway.git diff --git a/src/edu/berkeley/obits/device/atmel/AvrDrone.java b/src/edu/berkeley/obits/device/atmel/AvrDrone.java index 2e50094..7860ad6 100644 --- a/src/edu/berkeley/obits/device/atmel/AvrDrone.java +++ b/src/edu/berkeley/obits/device/atmel/AvrDrone.java @@ -1,5 +1,6 @@ package edu.berkeley.obits.device.atmel; +import edu.berkeley.slipway.*; import edu.berkeley.obits.*; import org.ibex.util.Log; import java.io.*; @@ -9,32 +10,48 @@ import gnu.io.*; /** the "host" side of the AVR Drone; see AvrDrone.c for the other side */ public class AvrDrone extends AtmelDevice { - final DataInputStream in; - - final DataOutputStream out; - - final SerialPort sp; - - public AvrDrone(SerialPort sp) throws IOException, UnsupportedCommOperationException, InterruptedException, DeviceException { - this.sp = sp; - //sp.setSerialPortParams(115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); - sp.setSerialPortParams(38400, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); - sp.setFlowControlMode(sp.FLOWCONTROL_RTSCTS_OUT); - sp.setInputBufferSize(1024); - //sp.setFlowControlMode(sp.FLOWCONTROL_NONE); - this.out = new DataOutputStream(sp.getOutputStream()); - this.in = new DataInputStream(sp.getInputStream()); - Log.debug(this, "consuming any leftover data on the serial port"); - while(in.available() > 0) in.read(); - reset(); - Log.debug(this, "waiting for device to identify itself"); - if (in.readByte() != (byte)'O') throw new RuntimeException("didn't get the proper signature"); - if (in.readByte() != (byte)'B') throw new RuntimeException("didn't get the proper signature"); - if (in.readByte() != (byte)'I') throw new RuntimeException("didn't get the proper signature"); - if (in.readByte() != (byte)'T') throw new RuntimeException("didn't get the proper signature"); - if (in.readByte() != (byte)'S') throw new RuntimeException("didn't get the proper signature"); - if (in.readByte() != (byte)'\n') throw new RuntimeException("didn't get the proper signature"); - Log.info(this, "device correctly identified itself; ready for operation"); + private final DataInputStream in; + private final DataOutputStream out; + private final Board board; + + public AvrDrone(Board b) throws IOException { + this.board = b; + this.out = new DataOutputStream(b.getOutputStream()); + this.in = new DataInputStream(b.getInputStream()); + init(); + } + + public void reset() throws DeviceException { + try { + board.reset(); + } catch (IOException e) { + throw new DeviceException(e); + } + } + + private void init() throws IOException { + byte[] bytes = new byte[6]; + int i=0; + + out.write(0); + out.flush(); + + // read any crap that might be left in the buffer + while(true) { + System.arraycopy(bytes, 1, bytes, 0, 5); + bytes[5] = in.readByte(); + i++; + System.out.print("\rsignature: read \"" + new String(bytes) + "\" "); + if (bytes[0] == (byte)'O' && + bytes[1] == (byte)'B' && + bytes[2] == (byte)'I' && + bytes[3] == (byte)'T' && + bytes[4] == (byte)'S') { + System.out.println("\rsignature: got proper signature "); + break; + } + } + } public synchronized void scanFPGA(boolean on) throws DeviceException { @@ -83,6 +100,7 @@ public class AvrDrone extends AtmelDevice { private Thread reader = new Thread() { public void run() { + System.out.println("*** reader thread begun"); while(true) { try { byte b = in.readByte(); @@ -119,21 +137,8 @@ public class AvrDrone extends AtmelDevice { } catch (IOException e) { throw new DeviceException(e); } } - public synchronized void reset() throws DeviceException { - try { - Log.info(this, "resetting device"); - sp.setDTR(true); - sp.setRTS(true); - Thread.sleep(500); - Log.info(this, "deasserting reset signal"); - sp.setDTR(false); - sp.setRTS(false); - Thread.sleep(100); - } catch (InterruptedException e) { throw new DeviceException(e); } - } - private byte[][][] cache = new byte[24][][]; - public synchronized byte mode4(int z, int y, int x) throws DeviceException { + public /*synchronized*/ byte mode4(int z, int y, int x) throws DeviceException { if (cache[x]==null) return 0; if (cache[x][y]==null) return 0; return cache[x][y][z]; @@ -144,7 +149,7 @@ public class AvrDrone extends AtmelDevice { int lasty = 0; public static int save = 0; public static int saveof = 0; - public synchronized void mode4(int z, int y, int x, int d) throws DeviceException { + public /*synchronized*/ void mode4(int z, int y, int x, int d) throws DeviceException { try { /* Log.info(this, "writing configuration frame [zyxd]: " + @@ -164,26 +169,23 @@ public class AvrDrone extends AtmelDevice { boolean ydec = y==lasty-1; boolean xdec = x==lastx-1; - //System.out.println(zchange + " " + ychange + " " + xchange); - out.writeByte(0x80 - | (zinc?0x40:zdec?0x04:zchange?0x44:0x00) - | (yinc?0x20:ydec?0x02:ychange?0x22:0x00) - | (xinc?0x10:xdec?0x01:xchange?0x11:0x00)); - if (!zinc && !zdec && zchange) out.writeByte(z); else save++; - if (!yinc && !ydec && ychange) out.writeByte(y); else save++; - if (!xinc && !xdec && xchange) out.writeByte(x); else save++; + out.writeByte(1); + out.writeByte(z); + out.writeByte(y); + out.writeByte(x); saveof++; lastz = z; lastx = x; lasty = y; out.writeByte(d); + if (cache[x & 0xff]==null) cache[x & 0xff] = new byte[24][]; if (cache[x & 0xff][y & 0xff]==null) cache[x & 0xff][y & 0xff] = new byte[256]; cache[x & 0xff][y & 0xff][z & 0xff] = (byte)(d & 0xff); } catch (IOException e) { throw new DeviceException(e); } } - public synchronized void flush() throws DeviceException { + public /*synchronized*/ void flush() throws DeviceException { try { out.flush(); } catch (IOException e) { throw new DeviceException(e); }