mbed interface to jpeg engine (OV528) camera module

Dependencies:   mbed uCAM_TTL120

mbed_uCAM_TTL_test.cpp

Committer:
jebradshaw
Date:
2014-11-17
Revision:
0:f0b5974a0c54
Child:
1:9a1b5099488a

File content as of revision 0:f0b5974a0c54:

// mbed_uCAM_TTL120_test.c
// J Bradshaw 11-06-2014
#include "mbed.h"
#include "uCAM_TTL120.h"
#include "stdio.h"
#include "stdlib.h"

LocalFileSystem local("local");// Create the local filesystem under the name "local"
Serial pc(USBTX,USBRX);    
uCAM_TTL120 cam(p28, p27);      //Tx/Rx
DigitalOut myled(LED1);
DigitalOut camrst(p15);

char picture[20000];
/*
void write_local_file(char *filename, char data)
{
    char c;
    FILE *fp = fopen(filename, "w");  // Open file on the local file system for writing
    while(true)
    {
        c = fgetc(fp);
        pc.printf("%c", c);
        if(c == 0xff)
            break;
    }
    fclose(fp);       
}
    */


/*
int uCAM_send_GET_PICTURE_640x480_JPEG(FILE *filew)
{
    char ser_read[7];
    char frame[512];
   char c;
   unsigned long pic_bytes;
   unsigned int pixel_col;
   unsigned int i, j, k;
   int m;
   unsigned int serbytes_read;
   int temp;

   pic_bytes = 0;
   c=0;
   serbytes_read = 0;

    for(i=0;i<100;i++)
        picture[i] = 0;

    cam.uCAM_FlushBuffer();

   cam.uCAM_Command_Send(uCAM_GET_PICTURE,0x01,0x00,0x00,0x00); // p1=0x01-Snapshot picture
        wait(.3);

      //read serial C buffer and wait for ACK (0xAA0E0DXX0000)
   c=cam.uCAM_read(ser_read, 6, 1);
   wait(.2);

   if(c==6) //received 6 bytes back
   {
       if((ser_read[0] == 0xAA) &&  //first 2 bytes indicate it was a DATA packet
          (ser_read[1] == 0x0E) &&
         (ser_read[2] == 0x04))     //returned get pic
      {
       //read serial buffer and wait for ACK (0xAA0E0DXX0000)
          c=cam.uCAM_read(ser_read, 6, 1);

          if(c==6) //received 6 bytes back
          {
             if((ser_read[0] == 0xAA) &&   //first 2 bytes indicate it was a DATA packet
                (ser_read[1] == 0x0A))
             {
                pic_bytes = (unsigned long)ser_read[3];
                pic_bytes += (unsigned long)ser_read[4] << 8;
                pic_bytes += (unsigned long)ser_read[5] << 16;

                serbytes_read = cam.uCAM_read(picture, pic_bytes, .2);  //frames of 512 bytes?
                                                
                if(serbytes_read == pic_bytes){
                    
                    for(int i=0;i<pic_bytes;i++){                        
                        cam.uCAM_Command_Send(uCAM_ACK, 0x0A, 0x00, i, 0x00);
                        
                        cam.uCAM_read(picture, 512, .2);
                        for(int j=0;j<512;j++){
                            pc.printf("%c", picture[j]);
 //                           fputc(picture[j], filew);                                                
                        }
                    }
                    cam.uCAM_Command_Send(uCAM_ACK, 0x00, 0x00, 0xf0, 0xf0);

                   return pic_bytes;
                }
                else
                    return -5;
               }
               else
                return -4;
             }
             return -3;
          }
      }
      return -2;
   }//if(c==6)
     return -1;
}//uCAM_send_GET_PICTURE_640x480_JPEG(FILE *filew)

int get_jpeg(FILE *file){
    cam.uCAM_Command_Send(uCAM_INITIAL,0x00,0x07,0x07,0x07); // JPEG,640 x 480,JPEG
    
    wait(.05);

    if(cam.uCAM_GetACK()){
        pc.printf("Did not receive ACK on uCAM_INITIAL\r\n");
        return -1;
    } 
        
   cam.uCAM_Command_Send(uCAM_SET_PACKAGE_SIZE,0x08,0x00,0x02,0x00); //512 bytes
   
    if(cam.uCAM_GetACK()){
        pc.printf("Did not receive ACK on uCAM_SET_PACKAGE_SIZE\r\n");
        return -2;
    }
        
    cam.uCAM_Command_Send(uCAM_SNAPSHOT,0x00,0x00,0x00,0x00); //JPEG
  
    if(cam.uCAM_GetACK()){
        pc.printf("Did not receive ACK on uCAM_SNAPSHOT\r\n");
        return -3;
    }
        
    uCAM_send_GET_PICTURE_640x480_JPEG(file);             
}
  */
    
int main(){
    FILE *fp;
    
    pc.baud(921600);
    pc.printf("\r\n\r\n%s\r\n", __FILE__);

        //cam.uCAM_set_baud();
    
        camrst = 0;
        wait(.5);
        camrst = 1;
    
        if(cam.uCAM_Connect()){   //Initialize the uCAM connection
            pc.printf("Camera Initialized\r\n");
        }
        else{
            pc.printf("Camera failed to connect\r\n");
            exit(1);
        }
                
        int i = 0;
    while(1) {          
            char ser_read[7];
            unsigned long pic_bytes;
            unsigned int serbytes_read;         
            char fileNameStr[20];
            
        //          sprintf(fileNameStr, "/local/pic%2X.bmp", i++);
                
                /*
        FILE *fp = fopen("/local/text1.txt", "w");
        wait(.2);
        fprintf(fp, "Hello World Joe!");
        fclose(fp);
        
        */
        fp = fopen("/local/pic000.jpg", "w");
                
        //------- begin get jpeg --------------
        cam.uCAM_FlushBuffer();
        cam.uCAM_Command_Send(uCAM_INITIAL,0x00,0x07,0x07,0x07); // JPEG,640 x 480,JPEG
        
        wait(.05);  
                
        cam.uCAM_read(ser_read, 6, .1);
      if((ser_read[0] == 0xAA) &&
        (ser_read[1] == 0x0E) &&
                (ser_read[2] == 0x01)){     //INITIAL ACK
                pc.printf("ACK received on uCAM_INITIAL\r\n");
      }
      else{
        pc.printf("Did not receive ACK on uCAM_INITIAL\r\n");
            }
    
        cam.uCAM_FlushBuffer();         
   cam.uCAM_Command_Send(uCAM_SET_PACKAGE_SIZE,0x08,0x00,0x02,0x00); //512 bytes
   
    wait(.05);
            
      cam.uCAM_read(ser_read, 6, .1);
      if((ser_read[0] == 0xAA) &&
        (ser_read[1] == 0x0E) &&
                (ser_read[2] == 0x06)){     //SET PACKAGE SIZE ACK
                pc.printf("ACK received on uCAM_SET_PACKAGE_SIZE\r\n");
      }
      else{
        pc.printf("Did not receive ACK on SET PACKAGE SIZE\r\n");
            }
        
    cam.uCAM_Command_Send(uCAM_SNAPSHOT,0x00,0x00,0x00,0x00); //JPEG
  
      cam.uCAM_read(ser_read, 6, .1);
      if((ser_read[0] == 0xAA) &&
        (ser_read[1] == 0x0E) &&
                (ser_read[2] == 0x05)){     //uCAM_SNAPSHOT ACK
                pc.printf("ACK received on uCAM_SNAPSHOT\r\n");
      }
      else{
        pc.printf("Did not receive ACK on uCAM_SNAPSHOT\r\n");
            }

   pic_bytes = 0;
   serbytes_read = 0;

    for(i=0;i<100;i++)
        picture[i] = 0;

    cam.uCAM_FlushBuffer();

   cam.uCAM_Command_Send(uCAM_GET_PICTURE,0x01,0x00,0x00,0x00); // p1=0x01-Snapshot picture
        wait(.3);

      //read serial C buffer and wait for ACK (0xAA0E0DXX0000)
   char c=cam.uCAM_read(ser_read, 6, 1);
        
   wait(.2);

         if((ser_read[0] == 0xAA) &&  //first 2 bytes indicate it was a DATA packet
                (ser_read[1] == 0x0E) &&
             (ser_read[2] == 0x04))     //returned get pic
        {
         //read serial buffer and wait for ACK (0xAA0E0DXX0000)
                char c=cam.uCAM_read(ser_read, 6, 1);

                     if((ser_read[0] == 0xAA) &&   //first 2 bytes indicate it was a DATA packet
                            (ser_read[1] == 0x0A) &&
                            (ser_read[2] == 0x01))      //DATA from snapshot ACK
                     {
                            pic_bytes = (unsigned long)ser_read[3];
                            pic_bytes += (unsigned long)ser_read[4] << 8;
                            pic_bytes += (unsigned long)ser_read[5] << 16;

                        int packID=0;
                        char packID_l, packID_h;
                        
                        pc.printf("\r\n");
                        while(pic_bytes>0){
                            packID_h = (packID >> 8) & 0xff;
                            packID_l = packID & 0xff;
                            
                            cam.uCAM_FlushBuffer();
                            cam.uCAM_Command_Send(uCAM_ACK, 0x00, 0x00, packID_l, packID_h);    
                            
                            pc.printf("\r\n ");
                            
                            if(pic_bytes > 512){
                                int pbytes = cam.uCAM_read(picture, 512, .2);
                                pic_bytes -= 512;
                                //debugging
                                for(int j=0;j<512;j++){
                                    fputc(picture[j], fp);
                                    pc.printf("%2X ", picture[j]);
                                }                                   
                            }
                            else{
                                cam.uCAM_read(picture, pic_bytes, .2);
                                //for debugging
                                for(int j=0;j<pic_bytes;j++){
                                    fputc(picture[j], fp);
                                    pc.printf("%2X ", picture[j]);
                                }
                                pic_bytes = 0;
                            }
                                
                            packID++;
                        }
                        cam.uCAM_Command_Send(uCAM_ACK, 0x00, 0x00, 0xf0, 0xf0); 
                         
                            //serbytes_read = cam.uCAM_read(picture, pic_bytes, .2);  //frames of 512 bytes?                                                                                        

                     }
                     //pc.printf("-3");
        }//data packet

        fclose(fp);
        
            //------- end get jpeg --------------
            
            /*
                cam.uCAM_send_INITIAL_80x60_16RAW();
        wait(.1);
                cam.uCAM_send_SNAPSHOT();
                wait(.1);
                cam.uCAM_send_GET_PICTURE_80x60_16COL_RAW();
            */
        myled = 1;
        wait(3);
        myled = 0;
        wait(0.2);
    }
}