Version 3: Trying to interleave capture and read
Dependencies: ov7670_lib Project_test
Diff: main.cpp
- Revision:
- 0:19429e334b75
- Child:
- 2:bbd557817319
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Mar 10 13:03:52 2013 +0000 @@ -0,0 +1,155 @@ +/* + * Author: Edoardo De Marchi + * Date: 10/03/13 + * Notes: OV7670 + FIFO AL422B camera test +*/ + +#include "main.h" + +#define QQVGA 4 //320*240 +#define QVGA 2 //160*120 + + +void rxCallback(MODSERIAL_IRQ_INFO *q) +{ + new_send = true; +} + +int main() +{ + pc.baud(921600); + pc.printf("SystemCoreClock: %dMHz\r\n", SystemCoreClock/1000000); // print the clock frequency + led4 = 0; + + t.start(); + pc.attach(&rxCallback, MODSERIAL::RxIrq); + + while(1) + { + if(new_send){ + int i = 0; + + while(pc.readable()) + { + word[i] = pc.getc(); + i++; + } + parse_cmd(); + } + wait_ms(50); + } +} + + + +void parse_cmd(){ + new_send = false; + + if(strcmp("snap_yuv", word) == 0) + { + CameraSnap('y'); + memset(word, 0, sizeof(word)); + }else + if(strcmp("snap_rgb", word) == 0) + { + CameraSnap('r'); + memset(word, 0, sizeof(word)); + + }else + if(strcmp("init_yuv", word) == 0) + { + // Reset camera on power up + camera.Reset(); + // Set up for 160*120 pixels YUV (Only Y) + pc.printf("Initializing ov7670 - Format YUV & QQVGA Mode\r\n"); + if(camera.Init('y') != 1) + { + pc.printf("Init Fail\r\n"); + } + pc.printf("Initializing done\r\n"); + memset(word, 0, sizeof(word)); + }else + if(strcmp("init_rgb", word) == 0) + { + // Reset camera on power up + camera.Reset(); + // Set up for 160*120 pixels RGB565 + pc.printf("Initializing ov7670 - Format RGB & QQVGA Mode\r\n"); + if(camera.Init('r') != 1) + { + pc.printf("Init Fail\r\n"); + } + pc.printf("Initializing done\r\n"); + memset(word, 0, sizeof(word)); + }else + if(strcmp("reset", word) == 0) + { + mbed_reset(); + }else + if(strcmp("time", word) == 0) + { + pc.printf("Time Acq from camera: %dms - Time Send to pc: %dms - Time Tot: %dms\r\n", t2-t1, t3-t2, t3-t1); + memset(word, 0, sizeof(word)); + } + memset(word, 0, sizeof(word)); + +} + + + +void CameraSnap(char c){ + led4 = 1; + int var2 = 0; + int var = 0; + t1 = t.read_ms(); + + // wait until the image has been captured + camera.CaptureNext(); + while(camera.CaptureDone() == false); + + // Start reading in the image data from the camera hardware buffer + camera.ReadStart(); + + // Read the first half of the image + for (int q = 0; q < SIZE; q++) + { + bank0[q] = camera.ReadOnebyte(); + } + // Read the Second half of the image + for (int q = 0; q < SIZE; q++) + { + bank1[q] = camera.ReadOnebyte(); + } + + // Stop reading the image + camera.ReadStop() ; + t2 = t.read_ms(); + + if(c == 'y') + { + var = 2; // set YUV QQVGA + var2 = 1; + } + else{ + var = 1; // set RGB565 QQVGA + var2 = 0; + } + + for (int i = 0; i < SIZE/var; i++) { + pc.putc(bank0[(i*var)+var2]); + } + for (int i = 0; i < SIZE/var; i++) { + pc.putc(bank1[(i*var)+var2]); + } + + // Immediately request the next image to be captured + camera.CaptureNext(); + while (camera.CaptureDone() == false); + t3 = t.read_ms(); + + pc.printf("Grab done\r\n"); + + led4 = 0; +} + +