mbed interface to jpeg engine (OV528) camera module
Dependencies: mbed uCAM_TTL120
mbed_uCAM_TTL_test.cpp
- Committer:
- jebradshaw
- Date:
- 2014-11-18
- Revision:
- 1:9a1b5099488a
- Parent:
- 0:f0b5974a0c54
- Child:
- 2:c6ccfc36cd19
File content as of revision 1:9a1b5099488a:
// 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); /* 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(){ 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; int fileNameCnt = 0; while(1) { char ser_read[7]; unsigned long pic_bytes; unsigned int serbytes_read; char fileNameStr[20]; sprintf(fileNameStr, "/local/pic%2X.jpg", fileNameCnt++); FILE *fp = fopen("/local/text1.txt", "w"); wait(.2); fprintf(fp, "Hello World Joe!"); fclose(fp); fp = fopen(fileNameStr, "w"); //------- begin get jpeg -------------- cam.uCAM_FlushBuffer(); //cam.uCAM_Command_Send(uCAM_INITIAL,0x00,0x07,0x07,0x07); // JPEG,640 x 480,JPEG cam.uCAM_Command_Send(uCAM_INITIAL,0x00,0x07,0x07,0x03); // JPEG,160 x 120,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_FlushBuffer(); 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; 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"); int numPackages = pic_bytes / (512 - 6); while(numPackages>=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); char ID_ret[2]; cam.uCAM_read(ID_ret, 2, .2); char dataSize[2]; cam.uCAM_read(dataSize, 2, .2); char imageData[506]; //512 - 6 int imageDataSize = ((dataSize[1] & 0xff) << 8) + (dataSize[0] & 0xff); //load with garbage for debugging for(i=0;i<imageDataSize;i++) imageData[i] = 0xCC; //cam.uCAM_read(imageData, imageDataSize, .2); for(i=0;i<imageDataSize;i++) imageData[i] = cam._cam.getc(); char verifyCode[2]; cam.uCAM_read(verifyCode, 2, .2); int vCodeCheck=0; vCodeCheck += ID_ret[0]; vCodeCheck += ID_ret[1]; vCodeCheck += dataSize[0]; vCodeCheck += dataSize[1]; for(int i=0;i<imageDataSize;i++) vCodeCheck += imageData[i]; if((verifyCode[0] & 0xff) == (vCodeCheck & 0xff)){ //debugging pc.printf("\r\nPack ID = %d\r\n", packID); for(int j=0;j<imageDataSize;j++){ fputc(imageData[j], fp); pc.printf("%2X ", imageData[j]); } packID++; numPackages--; } else{ pc.printf("\r\nBad Data in transfer. ReTransfer\r\n"); } } 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(.2); myled = 0; wait(0.2); } }