checkpoing
authoradam <adam@megacz.com>
Tue, 6 Sep 2005 08:11:10 +0000 (01:11 -0700)
committeradam <adam@megacz.com>
Tue, 6 Sep 2005 08:11:10 +0000 (01:11 -0700)
darcs-hash:20050906081110-5007d-4c09ddecacace380ed110dbc12480addf529179a.gz

src/edu/berkeley/cs/obits/device/atmel/AtmelDevice.java
src/edu/berkeley/cs/obits/device/atmel/AvrDrone.c [new file with mode: 0644]
src/edu/berkeley/cs/obits/device/atmel/AvrDrone.java

index 515e9b0..7e3c7fd 100644 (file)
@@ -2,6 +2,32 @@ package edu.berkeley.cs.obits.device.atmel;
 
 import edu.berkeley.cs.obits.*;
 
 
 import edu.berkeley.cs.obits.*;
 
-public interface AtmelDevice extends Device {
+public abstract class AtmelDevice extends Device {
+
+    /** issue a command to the device in Mode4 format; see Gosset's documentation for further details */
     public void mode4(int z, int y, int x, int d) throws DeviceException;
     public void mode4(int z, int y, int x, int d) throws DeviceException;
+
+    public Sector sector(int col, int row) { return new Sector(col, row); }
+    public final class Sector {
+        public final int col;
+        public final int row;
+        public Sector(int col, int row) {
+            if (row % 4 != 0) throw new Error("Sector must be created with a multiple-of-4 row");
+            if (col % 4 != 0) throw new Error("Sector must be created with a multiple-of-4 col");
+            this.row = row;
+            this.col = col;
+        }
+    }
+    
+    public Cell cell(int col, int row) { return new Cell(col, row); }
+    public final class Cell {
+        public final int col;
+        public final int row;
+        public Sector getSector() { return sector(col - (col % 4), row - (row % 4)); }
+        public Cell(int col, int row) {
+            this.row = row;
+            this.col = col;
+        }
+    }
+
 }
 }
diff --git a/src/edu/berkeley/cs/obits/device/atmel/AvrDrone.c b/src/edu/berkeley/cs/obits/device/atmel/AvrDrone.c
new file mode 100644 (file)
index 0000000..2b4fa74
--- /dev/null
@@ -0,0 +1,159 @@
+//\r
+// YOU MUST COMPILE THIS WITH -O3 OR THE AVR WILL NOT BE ABLE TO KEEP UP!!!!\r
+//\r
+\r
+#define F_CPU 3960000\r
+#include <avr/wdt.h>\r
+#include <avr/delay.h>\r
+#include <avr/io.h>\r
+#include <avr/signal.h>\r
+#include <avr/interrupt.h>\r
+\r
+unsigned char val = 0;\r
+\r
+volatile unsigned char dataReady = 0;\r
+volatile unsigned char data = 0;\r
+\r
+void initUART1(unsigned int baudRate, unsigned int doubleRate) {\r
+  UBRRHI = (((baudRate) >> 8) & 0x000F); \r
+  UBRR1  = ((baudRate) & 0x00FF); \r
+  UCSR1B |= ((1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1)); \r
+  /*\r
+  if (doubleRate)\r
+    UCSR1A |= (1 << U2X1);\r
+  else\r
+    UCSR1A &= ~(1 << U2X1);\r
+  */\r
+}\r
+\r
+#define BUFSIZE (1024 *2)\r
+static char buf[BUFSIZE];\r
+volatile static int head = 0;\r
+volatile static int tail = 0;\r
+\r
+void send(char c) {\r
+  while(!(UCSR1A & (1 << UDRE1)));           /* Wait for data Regiester to be empty */\r
+  UDR1 = (int)c;\r
+}\r
+\r
+inline void portd(int bit, int on) {\r
+  if (on) {\r
+    PORTD &= ~(1<<bit);\r
+  } else {\r
+    PORTD |= (1<<bit);\r
+  }\r
+}\r
+inline void cts(int c) {\r
+  if (c) {\r
+    PORTE &= ~(1 << 4);\r
+    portd(0, 1);\r
+  } else {\r
+    PORTE |= (1 << 4);\r
+    portd(0, 0);\r
+  }\r
+}\r
+\r
+inline int inc(int x) { x++; if (x>=BUFSIZE) x=0; return x; }\r
+inline int full() { return inc(tail)==head; }\r
+inline int nearlyFull() {\r
+  if (tail==head) return 0;\r
+  if (tail < head) return (head-tail) < (BUFSIZE/2);\r
+  return (tail-head) > (BUFSIZE/2);\r
+}\r
+inline int empty() { return head==tail; }\r
+\r
+inline char recv() {\r
+  int q;\r
+  char ret;\r
+  while(empty()) cts(1);\r
+  ret = buf[head];\r
+  head = inc(head);\r
+  if (!nearlyFull()) cts(0);\r
+  return ret;\r
+}\r
+\r
+void init() {\r
+  EIMF  = 0xFF;                          /* Enalbe External Interrrupt*/  \r
+  DDRD = 0xFF;                           /* Configure PORTD as Output */\r
+  DDRE = 1 << 4;                         /* ability to write to E */\r
+  initUART1(1, 0);\r
+  SREG |= 0x80;\r
+  sei();\r
+}\r
+\r
+void conf(int z, int y, int x, int d) {\r
+  FPGAX = x;\r
+  FPGAY = y;\r
+  FPGAZ = z;\r
+  FPGAD = d;\r
+}\r
+\r
+void doreset() {\r
+  int i;\r
+  for(i=0; i<5; i++) {\r
+    PORTD = ~0x01;\r
+    _delay_ms(50);\r
+    PORTD = ~0x02;\r
+    _delay_ms(50);\r
+    PORTD = ~0x04;\r
+    _delay_ms(50);\r
+    PORTD = ~0x08;\r
+    _delay_ms(50);\r
+  }\r
+  PORTD = ~0x00;\r
+  wdt_enable(WDTO_250MS);\r
+  while(1) { }\r
+}\r
+\r
+SIGNAL(SIG_INTERRUPT1) {\r
+  doreset();\r
+}\r
+\r
+void die() { cli(); cts(0); _delay_ms(2000); while(1) { } }\r
+SIGNAL(SIG_UART1_RECV) {\r
+  if (UCSR1A & (1 << FE1))   { portd(2,0); portd(3,1); die(); }  // framing error, lock up with LED=01\r
+  if ((UCSR1A & (1 << OR1))) { portd(2,1); portd(3,0); die(); }  // overflow; lock up with LED=10\r
+  if (full())                { portd(2,1); portd(3,1); die(); }  // buffer overrun\r
+  buf[tail] = UDR1;\r
+  tail = inc(tail);\r
+  SREG |= 0x80;\r
+  sei();\r
+  if (nearlyFull()) cts(0);\r
+}\r
+\r
+inline int hex(char c) {\r
+  if (c >= '0' && c <= '9') return (c - '0');\r
+  if (c >= 'a' && c <= 'f') return ((c - 'a') + 0xa);\r
+  if (c >= 'A' && c <= 'F') return ((c - 'A') + 0xa);\r
+  return -1;\r
+}\r
+\r
+int main() {\r
+  int count;\r
+  init();\r
+  cts(0);\r
+  send('O');\r
+  send('B');\r
+  send('I');\r
+  send('T');\r
+  send('S');\r
+  send('\n');\r
+  cts(1);\r
+  for(;;) {\r
+    int i, x=0, y=0, z=0, d=0;\r
+    switch(recv()) {\r
+      case 1:\r
+        z = recv();\r
+        y = recv();\r
+        x = recv();\r
+        d = recv();\r
+        portd(1,1);\r
+        conf(z, y, x, d);\r
+        portd(1,0);\r
+        break;\r
+      default: die();\r
+    }\r
+  }\r
+  return 0;\r
+}  \r
+\r
index c77f05c..aa12dce 100644 (file)
@@ -7,7 +7,7 @@ import java.util.*;
 import gnu.io.*;
 
 /** the "host" side of the AVR Drone; see AvrDrone.c for the other side */
 import gnu.io.*;
 
 /** the "host" side of the AVR Drone; see AvrDrone.c for the other side */
-public class AvrDrone implements AtmelDevice {
+public class AvrDrone extends AtmelDevice {
 
     final DataInputStream in;
 
 
     final DataInputStream in;
 
@@ -44,7 +44,6 @@ public class AvrDrone implements AtmelDevice {
         } catch (InterruptedException e) { throw new DeviceException(e); }
     }
 
         } catch (InterruptedException e) { throw new DeviceException(e); }
     }
 
-    /** issue a command to the device in Mode4 format; see Gosset's documentation for further details */
     public void mode4(int z, int y, int x, int d) throws DeviceException {
         try {
             Log.debug(this, "writing configuration frame [zyxd]: " +
     public void mode4(int z, int y, int x, int d) throws DeviceException {
         try {
             Log.debug(this, "writing configuration frame [zyxd]: " +