Test Code for OV7670 Camera module. The images are sent over ethernet link.

Dependencies:   EthernetInterface mbed-rtos mbed ov7670

You can find more information in this page: https://mbed.org/users/edodm85/notebook/ov7670-camera-and-ethernet-stream/

Revision:
0:2208b72b1ba1
Child:
1:0e4d23df43ea
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jul 15 20:51:31 2013 +0000
@@ -0,0 +1,231 @@
+/*
+ * Author: Edoardo De Marchi
+ * Date: 15/07/13
+ * Notes: OV7670 camera with Ethernet Connection
+*/
+
+#include "main.h"
+
+#define VGA     307200         //640*480
+#define QVGA    76800          //320*240
+#define QQVGA   19200          //160*120
+
+static char format = ' ';
+static int resolution = 0;
+
+
+int Init()
+{
+    led1 = 0;               
+    led2 = 0;        // mbed status       
+    led3 = 0;        // Ethernet link enable/disable      
+    led4 = 0;               
+    
+    
+    
+    //ETHERNET
+    eth.init(ip, mask, gateway);
+    eth.connect();
+    server.bind(ECHO_SERVER_PORT);
+    server.listen(1);
+    printf("IP Address is %s\r\n", eth.getIPAddress());
+    
+    //THREAD 
+    osThreadCreate(osThread(net_thread), NULL); 
+       
+    return 0;
+}
+
+
+
+int main (void) 
+{
+    Init();
+
+    t.start();
+    
+    while (true)
+    {
+        //mbed is alive?
+        led2 = !led2;
+        osDelay(500);
+    }     
+}
+
+
+void net_thread(void const *argument)
+{
+    while (true) 
+    {
+        led3 = 1;
+        ////printf("\r\nWait for new connection...\r\n");
+        server.accept(client);
+        //printf("Connection from: %s\r\n", client.get_address());
+        while (true) 
+        {
+            led3 = 0;
+            int n = client.receive(bufferRX, sizeof(bufferRX));  
+            if (n <= 0) break;
+            
+            bufferRX[n]=0; // make terminater
+            parse_cmd();
+        }
+        client.close();
+        //printf("Connection close.\r\n");
+    } 
+} 
+
+
+void Send()
+{
+        client.send_all(bufferTX, sizeof(bufferTX));
+        memset(bufferTX, 0, sizeof(bufferTX));
+}
+
+
+void parse_cmd(){
+            new_send = false;
+            
+            if(strcmp("snap", bufferRX) == 0)              
+            {
+                    CameraSnap();
+                    memset(bufferRX, 0, sizeof(bufferRX));      
+            }else
+            if(strcmp("init_bw_VGA", bufferRX) == 0)                  // Set up for 640*480 pixels RAW     
+            {
+                    format = 'b';
+                    resolution = VGA;
+                    if(camera.Init('b', VGA) != 1)
+                    {
+                      printf("Init Fail\r\n");
+                    }
+                    memset(bufferRX, 0, sizeof(bufferRX));
+            }else  
+            if(strcmp("init_yuv_QVGA", bufferRX) == 0)                  // Set up for 320*240 pixels YUV422   
+            {
+                    format = 'y';
+                    resolution = QVGA;
+                    if(camera.Init('b', QVGA) != 1)
+                    {
+                      printf("Init Fail\r\n");
+                    }
+                    memset(bufferRX, 0, sizeof(bufferRX));
+            }else  
+            if(strcmp("init_rgb_QVGA", bufferRX) == 0)                  // Set up for 320*240 pixels RGB565   
+            {
+                    format = 'r';
+                    resolution = QVGA;
+                    if(camera.Init('r', QVGA) != 1)
+                    {
+                      printf("Init Fail\r\n");
+                    }
+                    memset(bufferRX, 0, sizeof(bufferRX));
+            }else 
+            if(strcmp("init_bw_QVGA", bufferRX) == 0)                  // Set up for 320*240 pixels YUV (Only Y)         
+            {
+                    format = 'b';
+                    resolution = QVGA;
+                    if(camera.Init('b', QVGA) != 1)
+                    {
+                      printf("Init Fail\r\n");
+                    }
+                    memset(bufferRX, 0, sizeof(bufferRX));
+            }else  
+            if(strcmp("init_yuv_QQVGA", bufferRX) == 0)                 // Set up for 160*120 pixels YUV422
+            {                            
+                    format = 'y';
+                    resolution = QQVGA;
+                    if(camera.Init('b', QQVGA) != 1)
+                    {
+                      printf("Init Fail\r\n");
+                    }
+                    memset(bufferRX, 0, sizeof(bufferRX));
+            }else   
+            if(strcmp("init_rgb_QQVGA", bufferRX) == 0)                 // Set up for 160*120 pixels RGB565
+            {                            
+                    format = 'r';
+                    resolution = QQVGA;
+                    if(camera.Init('r', QQVGA) != 1)
+                    {
+                      printf("Init Fail\r\n");
+                    }
+                    memset(bufferRX, 0, sizeof(bufferRX));
+            }else
+            if(strcmp("init_bw_QQVGA", bufferRX) == 0)                 // Set up for 160*120 pixels YUV (Only Y)
+            {                        
+                    format = 'b';
+                    resolution = QQVGA;
+                    if(camera.Init('b', QQVGA) != 1)
+                    {
+                      printf("Init Fail\r\n");
+                    }
+                    memset(bufferRX, 0, sizeof(bufferRX));
+            }else
+            if(strcmp("reset", bufferRX) == 0)              
+            {
+                    mbed_reset();        
+            }else
+            if(strcmp("time", bufferRX) == 0)              
+            {
+                    sprintf(bufferTX, "Tot time acq + send (mbed): %dms\r\n", t2-t1);
+                    client.send_all(bufferTX, sizeof(bufferTX));
+                    memset(bufferTX, 0, sizeof(bufferTX));
+            }    
+            memset(bufferRX, 0, sizeof(bufferRX));           
+}
+
+
+void CameraSnap(){
+        led4 = 1;
+        t1 = t.read_ms();
+        
+                // Kick things off by capturing an image
+        camera.CaptureNext();
+        while(camera.CaptureDone() == false);      
+                // Start reading in the image data from the camera hardware buffer                   
+        camera.ReadStart();  
+
+     
+        int p = 0;         
+        if(format == 'b')                       // B&W  
+        {  
+            for(int x = 0; x<resolution/9600; x++)
+            {
+                for(int q = 0; q<9600; q++)
+                { 
+                       // Read in the first half of the image
+                       if(resolution != VGA)
+                            camera.ReadOnebyte();  
+                       // Read in the Second half of the image
+                       bufferTX[q] = camera.ReadOnebyte();      // Y only                                        
+                }  
+                Send();       
+            } 
+        }     
+        
+        if(format == 'y' || format == 'r')          // Color
+        {
+            for(int x = 0; x<(resolution/9600)*2; x++)
+            {
+                for(int q = 0; q<9600/2; q++)
+                {
+                       p = q*2;         
+                       // Read in the first half of the image
+                       bufferTX[p] = camera.ReadOnebyte();   
+                       // Read in the Second half of the image
+                       bufferTX[p+1] = camera.ReadOnebyte();                           
+                }  
+                Send();       
+            }         
+        }   
+        camera.ReadStop();               
+        t2 = t.read_ms(); 
+                        
+                 // Immediately request the next image to be captured (takes around 45ms)
+        camera.CaptureNext();                             
+                // Now wait for the image to finish being captured
+        while (camera.CaptureDone() == false);
+        
+        //pc.printf("Snap_done\r\n");   
+        led4 = 0;
+}
\ No newline at end of file