checkpoint
[slipway.git] / src / edu / berkeley / obits / device / atmel / AvrDrone.c
index b50dd07..02fa4f9 100644 (file)
@@ -2,7 +2,8 @@
 // YOU MUST COMPILE THIS WITH -O3 OR THE AVR WILL NOT BE ABLE TO KEEP UP!!!!\r
 //\r
 \r
-#define F_CPU 3960000\r
+//#define F_CPU 3960000\r
+#define F_CPU 4000000\r
 \r
 #if !defined(__AVR_AT94K__)\r
 #error you forgot to put -mmcu=at94k on the command line\r
@@ -17,9 +18,10 @@ void initUART1(unsigned int baudRate, unsigned int doubleRate) {
   UBRRHI = (((baudRate) >> 8) & 0x000F); \r
   UBRR1  = ((baudRate) & 0x00FF); \r
   UCSR1B |= ((1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1)); \r
-  /*\r
+\r
   if (doubleRate)\r
     UCSR1A |= (1 << U2X1);\r
+  /*\r
   else\r
     UCSR1A &= ~(1 << U2X1);\r
   */\r
@@ -28,11 +30,13 @@ void initUART1(unsigned int baudRate, unsigned int doubleRate) {
 #define BUFSIZE (1024)\r
 \r
 inline void portd(int bit, int on) {\r
+  /*\r
   if (on) {\r
     PORTD &= ~(1<<bit);\r
   } else {\r
     PORTD |= (1<<bit);\r
   }\r
+  */\r
 }\r
 inline void cts(int c) {\r
   if (c) {\r
@@ -45,6 +49,9 @@ inline void cts(int c) {
 }\r
 \r
 \r
+static volatile int sending = 0;\r
+static volatile int32_t interrupt_count = 0;\r
+\r
 // RECV //////////////////////////////////////////////////////////////////////////////\r
 \r
 char read_buf[BUFSIZE];\r
@@ -113,6 +120,17 @@ void send(char c) {
 }\r
 \r
 \r
+void fpga_interrupts(int on) {\r
+  if (on/* && interrupt_count<301*/) {\r
+    //FISUA = 0x1;\r
+    FISCR = 0x80;\r
+    FISUD = 0x08;\r
+  } else {\r
+    FISUD = 0;\r
+    FISCR = 0;\r
+  }\r
+}\r
+\r
 void init() {\r
   read_buf_head = 0;\r
   read_buf_tail = 0;\r
@@ -121,7 +139,9 @@ void init() {
   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
+  initUART1(12, 1);  //for slow board\r
+  //initUART1(1, 0);\r
+  fpga_interrupts(1);\r
   SREG |= 0x80;\r
   sei();\r
 }\r
@@ -153,12 +173,22 @@ void doreset() {
 }\r
 \r
 #define TIMERVAL 100\r
-static volatile int sending = 0;\r
+int portdc = 0;\r
+ISR(SIG_FPGA_INTERRUPT15) { \r
+  PORTD = portdc++;\r
+  interrupt_count++;\r
+  //PORTD = ~(interrupt_count & 0xff);\r
+  //if (interrupt_count >= 301) fpga_interrupts(0);\r
+  //sei();\r
+  fpga_interrupts(1);\r
+}\r
 ISR(SIG_OVERFLOW0) { \r
+  fpga_interrupts(0);\r
   PORTD = ~FISUA;\r
   TCNT0 = TIMERVAL;           // load the nearest-to-one-second value  into the timer0\r
   TIMSK |= (1<<TOIE0);        // enable the compare match1 interrupt and the timer/counter0 overflow interrupt\r
   if (sending) UDR1 = FISUA;\r
+  fpga_interrupts(1);\r
   sei();\r
 } \r
 void init_timer()  { \r
@@ -201,9 +231,11 @@ int main() {
   send('S');\r
   send('\n');\r
   cts(1);\r
+  int x=0, y=0, z=0;\r
   for(;;) {\r
-    int i, x=0, y=0, z=0, d=0;\r
-    switch(recv()) {\r
+    int i, d=0;\r
+    int r = recv();\r
+    switch(r) {\r
       case 1:\r
         z = recv();\r
         y = recv();\r
@@ -214,9 +246,11 @@ int main() {
         portd(1,0);\r
         break;\r
       case 2:\r
+        fpga_interrupts(0);\r
         portd(1,1);\r
         send(FISUA);\r
         portd(1,0);\r
+        fpga_interrupts(1);\r
         break;\r
       case 3:\r
         init_timer();\r
@@ -227,7 +261,41 @@ int main() {
       case 5:\r
         sending = 0;\r
         break;\r
-      default: die();\r
+      case 6: {\r
+        int32_t local_interrupt_count = interrupt_count;\r
+        interrupt_count = 0;\r
+        send((local_interrupt_count >> 24) & 0xff);\r
+        send((local_interrupt_count >> 16) & 0xff);\r
+        send((local_interrupt_count >>  8) & 0xff);\r
+        send((local_interrupt_count >>  0) & 0xff);\r
+        fpga_interrupts(1);\r
+        break;\r
+      }\r
+      default: {\r
+        if ((r & 0x80) == 0x80) {\r
+          switch (r & 0x44) {\r
+            case 0x44: z = recv(); break;\r
+            case 0x40: z++;        break;\r
+            case 0x04: z--;        break;\r
+          }\r
+          switch (r & 0x22) {\r
+            case 0x22: y = recv(); break;\r
+            case 0x20: y++;        break;\r
+            case 0x02: y--;        break;\r
+          }\r
+          switch (r & 0x11) {\r
+            case 0x11: x = recv(); break;\r
+            case 0x10: x++;        break;\r
+            case 0x01: x--;        break;\r
+          }\r
+          d = recv();\r
+          portd(1,1);\r
+          conf(z, y, x, d);\r
+          portd(1,0);\r
+          break;\r
+        }\r
+        die();\r
+      }\r
     }\r
   }\r
   return 0;\r