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/

main.cpp

Committer:
edodm85
Date:
2014-04-05
Revision:
3:df8de18d7fa9
Parent:
2:d6b38a4512eb

File content as of revision 3:df8de18d7fa9:

/*
 * Author: Edoardo De Marchi
 * Date: 05/04/14
 * Notes: This firmware required "OV7670 Grabber v2.0"
*/

#include "main.h"

#define VGA     307200         //640*480
#define QVGA    76800          //320*240
#define QQVGA   19200          //160*120


int Init()
{
    led1 = 0;               
    led2 = 0;        // mbed status       
    led3 = 0;        // Ethernet link enable/disable      
    led4 = 0;        // Snap status       
      
    //ETHERNET
    //Static IP
    eth.init(ip, mask, gateway);
    //DHCP
    //eth.init();
    
    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);
    tencid = osThreadCreate(osThread(Grab_Thread), NULL);  
    
    return 0;
}


void Net_Thread(void const *argument)
{
    while (true) 
    {
        led3 = 1;
        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(n);
        }
        client.close();
    } 
} 


void Send()
{
        client.send_all(bufferTX, sizeof(bufferTX));
        memset(bufferTX, 0, sizeof(bufferTX));
}


void Grab_Thread(void const *argument)
{
    while(true)
    {    
        osSignalWait(0x1, osWaitForever);
                    
        while(bSnap_on || bGrab_on)
        {
            CameraSnap();
            bSnap_on = false;
        }
    }
}


void CameraSnap()
{
        led4 = 1;
        int p = 0;  

        camera.CaptureNext();
        while(camera.CaptureDone() == false);      
                                 
        camera.ReadStart();                             // Start reading in the image data from the camera hardware buffer  
        
        t1 = t.read_ms(); 
                  
        client.send_all(StartCondition, sizeof(StartCondition));
                    
        if(strcmp("BAW", CMDCamera.format) == 0 || strcmp("RAW", CMDCamera.format) == 0)                   // B&W  
        {  
            for(int x = 0; x<CMDCamera.resolution/sizeof(bufferTX); x++)
            {
                for(int q = 0; q<sizeof(bufferTX); q++)
                {               
                   if(CMDCamera.resolution != VGA)
                        camera.ReadOnebyte();                   // Read in the first half of the image
                   
                   bufferTX[q] = camera.ReadOnebyte();          // Y only      // Read in the Second half of the image                                  
                }  
                Send();       
            } 
        }     
        
        if(strcmp("YUV", CMDCamera.format) == 0 || strcmp("RGB", CMDCamera.format) == 0)                    // Color
        {
            for(int x = 0; x<(CMDCamera.resolution/sizeof(bufferTX))*2; x++)
            {
                for(int q = 0; q<sizeof(bufferTX)/2; q++)
                {
                       p = q*2;                               
                       bufferTX[p] = camera.ReadOnebyte();          // Read in the first half of the image                       
                       bufferTX[p+1] = camera.ReadOnebyte();        // Read in the Second half of the image                      
                }  
                Send();       
            }         
        }       
           
        camera.ReadStop();               
        t2 = t.read_ms(); 
                                      
        led4 = 0;
}


int main (void) 
{
    led3 = 0;
    int iRet=Init();

    if (iRet<0)
    {
        printf("Init Error!");
        return iRet;
    }
    t.start();
    
    while (true)
    {
        //mbed is alive?
        led2 = !led2;
        osDelay(500);
    }     
}


void parse_cmd(int sizeCMD)
{
            new_send = false;
            //printf("bufferRX: %s\r\n", bufferRX);
            
            if(strcmp("snap", bufferRX) == 0)              
            {
                    bSnap_on = true;
                    osSignalSet(tencid, 0x1);
                    memset(bufferRX, 0, sizeof(bufferRX));      
            }else
            if(strncmp("grab", bufferRX, 4) == 0)               // grab start       grab stop  
            {
                    if(strncmp("start", &bufferRX[5], 5) == 0)
                    {
                        bGrab_on = true;
                        osSignalSet(tencid, 0x1);
                        memset(bufferRX, 0, sizeof(bufferRX));
                    }else
                    {
                        bGrab_on = false;
                        memset(bufferRX, 0, sizeof(bufferRX));
                    }      
            }else
            if(strncmp("init", bufferRX, 4) == 0)               // init RGB 19200
            {
                    char word[10];
                    strncpy(CMDCamera.format, &bufferRX[5], 3);
                    strncpy(word, &bufferRX[9], sizeCMD-9);                  
                    CMDCamera.resolution = atoi(word);
                    
                    printf("CMDCamera.format: %s\r\n", CMDCamera.format);
                    printf("CMDCamera.resolution: %d\r\n", CMDCamera.resolution); 

                    if(camera.Init(CMDCamera.format, CMDCamera.resolution) != 1)
                    {
                      printf("Init Fail\r\n");
                    }
                    
                    sprintf(bufferTX, "OV Init OK\r\n");
                    client.send_all(bufferTX, sizeof(bufferTX));
                    memset(bufferRX, 0, sizeof(bufferRX));
            }else 
            if(strncmp("reg", bufferRX, 3) == 0)                // reg r 018       reg w 018 004        reg 
            {        
                    if(!bGrab_on)
                    {
                        strncpy(&Reg.type, &bufferRX[4], 1);
                        char word[3];                    
                    
        
                        if(Reg.type == 'r')
                        {
                            strncpy(word, &bufferRX[6], 3);
                            Reg.addr = atoi(word);
                            memset(word, 0, sizeof(word));
                            sprintf(bufferTX, "reg: %x", camera.ReadReg(Reg.addr));  
                        }else
                        {
                            strncpy(word, &bufferRX[6], 3);
                            Reg.addr = atoi(word);
                            strncpy(word, &bufferRX[10], 3);
                            Reg.value = atoi(word);
                            memset(word, 0, sizeof(word));
                            camera.WriteReg(Reg.addr, Reg.value);
                            sprintf(bufferTX, "%x", camera.ReadReg(Reg.addr));
                        }
                        if(sizeCMD == 3)
                        {
                            int n = 0;
                            int g = 0;
                            int c = 650;
                            sprintf(bufferTX, "reg_tab: ");
                            for (int i=0;i<201;i++) 
                            {
                                n = snprintf(9+bufferTX+g, c, "%02X", camera.ReadReg(i));
                                g = g + n; 
                                c = c - n - 1;                                          
                            }                  
                            client.send_all(bufferTX, sizeof(bufferTX));                      
                        }
                  
                        client.send_all(bufferTX, sizeof(bufferTX));
                    }
            }else
            if(strncmp("w_bit", bufferRX, 5) == 0)                  //  w_bit0 018 001         w_bit1 018 001 
            {        
                    int type;
                    int reg_addr = 0;                
                    int reg_value = 0;
                    char word[3];
                    strncpy(word, &bufferRX[5], 1); 
                    type = atoi(word);
                    strncpy(word, &bufferRX[7], 3);  
                    reg_addr = atoi(word);
                    memset(word, 0, sizeof(word));
                    strncpy(word, &bufferRX[11], 3); 
                    reg_value = atoi(word); 
                    //printf("reg read write: addr: %x - value %x\r\n", reg_addr, reg_value);
                    int reg_value_now = camera.ReadReg(reg_addr);
                    
                    if(type == 0)
                    {
                        reg_value = reg_value_now ^ reg_value; 
                    }else
                    {
                        reg_value = reg_value_now | reg_value;
                    }
                    //printf("reg value new: reg_value_now: %x - reg_value %x\r\n", reg_value_now, reg_value);                   
                    camera.WriteReg(reg_addr, reg_value);
                    memset(word, 0, sizeof(word));
                    memset(bufferTX, 0, sizeof(bufferRX));
            }else
            if(strcmp("reset", bufferRX) == 0)              
            {
                    mbed_reset();        
            }else
            if(strcmp("time", bufferRX) == 0)              
            {
                    sprintf(bufferTX, "OV Tot time acq + send (mbed): %dms\r\n", t2-t1);                  
                    client.send_all(bufferTX, sizeof(bufferTX));
                    memset(bufferTX, 0, sizeof(bufferTX));
            }else   
            if(strcmp("ciao", bufferRX) == 0)              
            {
                    sprintf(bufferTX, "OV Test OK\r\n");                   
                    client.send_all(bufferTX, sizeof(bufferTX));
                    memset(bufferTX, 0, sizeof(bufferTX));                         
            }            
            memset(bufferRX, 0, sizeof(bufferRX));           
}