Version 3: Trying to interleave capture and read
Dependencies: ov7670_lib Project_test
Diff: main.cpp
- Revision:
- 2:bbd557817319
- Parent:
- 0:19429e334b75
- Child:
- 3:b4e0cefc37f6
--- a/main.cpp Sun Mar 10 13:20:27 2013 +0000 +++ b/main.cpp Sat Mar 16 13:45:09 2013 +0000 @@ -6,8 +6,12 @@ #include "main.h" -#define QQVGA 4 //320*240 -#define QVGA 2 //160*120 +#define VGA 307200 //640*480 +#define QVGA 76800 //320*240 +#define QQVGA 19200 //160*120 + +static char format = ' '; +static int resolution = 0; void rxCallback(MODSERIAL_IRQ_INFO *q) @@ -45,37 +49,89 @@ void parse_cmd(){ new_send = false; - if(strcmp("snap_yuv", word) == 0) + if(strcmp("snap", word) == 0) { - CameraSnap('y'); + CameraSnap(); memset(word, 0, sizeof(word)); }else - if(strcmp("snap_rgb", word) == 0) + if(strcmp("init_bw_VGA", word) == 0) // Set up for 640*480 pixels YUV (Only Y) { - CameraSnap('r'); + pc.printf("Initializing ov7670 - Format YUV422(Y only) & VGA Mode\r\n"); + format = 'b'; + resolution = VGA; + if(camera.Init('b', VGA) != 1) + { + pc.printf("Init Fail\r\n"); + } + pc.printf("Initializing done\r\n"); + memset(word, 0, sizeof(word)); + }else + if(strcmp("init_yuv_QVGA", word) == 0) // Set up for 320*240 pixels YUV422 + { + pc.printf("Initializing ov7670 - Format YUV422 & QVGA Mode\r\n"); + format = 'y'; + resolution = QVGA; + if(camera.Init('b', QVGA) != 1) + { + pc.printf("Init Fail\r\n"); + } + pc.printf("Initializing done\r\n"); memset(word, 0, sizeof(word)); - - }else - if(strcmp("init_yuv", word) == 0) + }else + if(strcmp("init_rgb_QVGA", word) == 0) // Set up for 320*240 pixels RGB565 + { + pc.printf("Initializing ov7670 - Format RGB565 & QVGA Mode\r\n"); + format = 'r'; + resolution = QVGA; + if(camera.Init('r', QVGA) != 1) + { + pc.printf("Init Fail\r\n"); + } + pc.printf("Initializing done\r\n"); + memset(word, 0, sizeof(word)); + }else + if(strcmp("init_bw_QVGA", word) == 0) // Set up for 320*240 pixels YUV (Only Y) { - // 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("Initializing ov7670 - Format YUV422(Y only) & QVGA Mode\r\n"); + format = 'b'; + resolution = QVGA; + if(camera.Init('b', QVGA) != 1) + { + pc.printf("Init Fail\r\n"); + } + pc.printf("Initializing done\r\n"); + memset(word, 0, sizeof(word)); + }else + if(strcmp("init_yuv_QQVGA", word) == 0) // Set up for 160*120 pixels YUV422 + { + pc.printf("Initializing ov7670 - Format YUV422 & QQVGA Mode\r\n"); + format = 'y'; + resolution = QQVGA; + if(camera.Init('b', QQVGA) != 1) + { + pc.printf("Init Fail\r\n"); + } + pc.printf("Initializing done\r\n"); + memset(word, 0, sizeof(word)); + }else + if(strcmp("init_rgb_QQVGA", word) == 0) // Set up for 160*120 pixels RGB565 + { + pc.printf("Initializing ov7670 - Format RGB565 & QQVGA Mode\r\n"); + format = 'r'; + resolution = QQVGA; + if(camera.Init('r', QQVGA) != 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) + if(strcmp("init_bw_QQVGA", word) == 0) // Set up for 160*120 pixels YUV (Only Y) + { + pc.printf("Initializing ov7670 - Format YUV422(Y only) & QQVGA Mode\r\n"); + format = 'b'; + resolution = QQVGA; + if(camera.Init('b', QQVGA) != 1) { pc.printf("Init Fail\r\n"); } @@ -88,68 +144,48 @@ }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); + pc.printf("Tot time acq + send (mbed): %dms\r\n", t2-t1); memset(word, 0, sizeof(word)); - } + } + memset(word, 0, sizeof(word)); } - -void CameraSnap(char c){ +void CameraSnap(){ led4 = 1; - int var2 = 0; - int var = 0; - t1 = t.read_ms(); - - // wait until the image has been captured + + // Kick things off by capturing an image camera.CaptureNext(); - while(camera.CaptureDone() == false); - + while(camera.CaptureDone() == false); // Start reading in the image data from the camera hardware buffer camera.ReadStart(); + t1 = t.read_ms(); - // 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++) + for(int x = 0; x<resolution; x++) { - bank1[q] = camera.ReadOnebyte(); - } - - // Stop reading the image - camera.ReadStop() ; - t2 = t.read_ms(); - - if(c == 'y') - { - var = 2; // set YUV QQVGA - var2 = 1; + // Read in the first half of the image + if(format == 'b') + { + camera.ReadOnebyte(); + }else + if(format == 'y' || format == 'r') + { + pc.putc(camera.ReadOnebyte()); + } + // Read in the Second half of the image + pc.putc(camera.ReadOnebyte()); // Y only } - else{ - var = 1; // set RGB565 QQVGA - var2 = 0; - } + + camera.ReadStop(); + t2 = t.read_ms(); - 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 + // 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); - t3 = t.read_ms(); - pc.printf("Grab done\r\n"); - + pc.printf("Snap_done\r\n"); led4 = 0; -} - - +} \ No newline at end of file