OV7670 + 23LC1024 + Bluetooth

Dependencies:   FastPWM MODSERIAL mbed

Revision:
1:6e4d2cff76e8
Parent:
0:f309a2b2f27b
--- a/main.cpp	Mon Jul 22 23:55:34 2013 +0000
+++ b/main.cpp	Tue Jul 23 06:33:27 2013 +0000
@@ -1,6 +1,9 @@
 #include "mbed.h"
+#include "Constants.h"
 #include "OV7670.h"
 #include "FastPWM.h"
+#include "spi_ram.h"
+#include "MODSERIAL.h"
 
 #define SIZEX (160)
 #define SIZEY (120)
@@ -12,10 +15,9 @@
     Port0, 0x07878000); // D0-D7 -> P11-p18
     
 Serial host(USBTX, USBRX);
+MODSERIAL bt(p9, p10, 16384, 512);
 DigitalOut status(p20);
-
-unsigned char bank0[SIZE];
-unsigned char *bank1 = (unsigned char *)(0x2007C000);
+int feedMode = 0;
 
 int hexToInt(int i) {
     if(i >= '0' && i <= '9') return i - '0';
@@ -29,18 +31,21 @@
     return (hexToInt(b1) << 4) | hexToInt(b2);
 }
 
-void sendImage() {
-    // Write the image to the serial host
-    for (int i = 0; i < SIZE; i++) {
-        while(!(host.writeable())) {}
-        host.putc(bank0[i]);
-        while(!(host.writeable())) {}
-        host.putc(bank1[i]);
+void readLine(Serial *ser, char *data) {
+    int i=0;
+    char c = '0';
+    while(c != '\n') {
+        if(ser->readable()) {
+            c = ser->getc();
+            data[i++] = c;
+        }
     }
+    data[i] = '\0';
 }
 
 int main() {
     host.baud(115200);
+    bt.baud(230400);
     
     // Initialize a 12Mhz XCLK for the camera
     camera.Init();
@@ -52,28 +57,73 @@
     camera.InitQQVGA();
 
     char c;
+    char data[20];
     while(1) {
+        if(bt.readable()) {
+            c = bt.getc();
+            switch(c) {
+                case REQUEST_PROFILE:
+                    host.printf("Profile requested\n\r");
+                    bt.putc(CLIENT_PROFILE);
+                    bt.putc((TAPCAM_ID >> 4) & 0x0F);
+                    bt.putc(TAPCAM_ID & 0x0F);
+                    bt.printf("device\n");
+                    break;
+                case CLIENT_PROFILE: {
+                    host.printf("Client profile:\n\r");
+                    int id = bt.getc() << 4;
+                    id |= bt.getc();
+                    readLine(&bt, data);
+                    host.printf("ID: %d\n\r", id);
+                    host.printf("Type: %s\n\r", data);
+                    break;
+                }
+                case FEED_REQUEST:
+                    host.printf("Feed requested\n\r");
+                    bt.putc(FEED_START);
+                    break;
+                case FEED_START_ACK:
+                    host.printf("Feed start acknowledged\n\r");
+                    feedMode = 1;
+                    break;
+                case FEED_CANCEL:
+                    host.printf("Feed canceled\n\r");
+                    feedMode = 0;
+                    break;
+            }
+        }
+        if(feedMode) {
+            int bytes = camera.captureImage();
+            bt.putc(FRAME_READ);
+            bt.printf(ORIENTATION);
+            bt.printf("%d\n", bytes);
+            camera.sendImage(&bt, bytes);
+            host.printf("Sent %d\n\r", bytes);
+            wait_ms(100);
+        }
         if(host.readable()) {
             c = host.getc();
-        } else {
-            continue;
-        }
-        if(c == 'r') {
-            int reg = getHexWord(&host);
-            host.printf("%d\n\r", camera.ReadReg(reg));
-        } else if(c == 'w') {
-            int reg = getHexWord(&host);
-            int val = getHexWord(&host);
-            camera.WriteReg(reg, val);
-            host.printf("%d\n\r", camera.ReadReg(reg));
-        } else if(c == 't') {
-            camera.scopeTest(&host);
-        } else if(c == 'c') {
-            status = 1;
-            int bytes = camera.captureImage(bank0, bank1);
-            //host.printf("%d\n", bytes);
-            sendImage();
-            status = 0;
+            if(c == 'r') {
+                int reg = getHexWord(&host);
+                host.printf("%d\n\r", camera.ReadReg(reg));
+            } else if(c == 'w') {
+                int reg = getHexWord(&host);
+                int val = getHexWord(&host);
+                camera.WriteReg(reg, val);
+                host.printf("%d\n\r", camera.ReadReg(reg));
+            } else if(c == 't') {
+                camera.scopeTest(&host);
+            } else if(c == 'c') {
+                status = 1;
+                int bytes = camera.captureImage();
+                host.printf("%d\n", bytes);
+                camera.sendImage(&host, bytes);
+                status = 0;
+            } else if(c == 's') {
+                feedMode = false;
+            } else if(c == 'p') {
+                bt.putc(REQUEST_PROFILE);
+            }
         }
     }
 }