Hello World example program for the OV528 Camera Module

Dependencies:   CameraOV528

Committer:
jplunkett
Date:
Fri Jul 07 21:55:18 2017 +0000
Revision:
6:9f5ecac1118f
Parent:
4:327a3341b5f3
Switched to EventLoop & InterruptIn, added comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jplunkett 4:327a3341b5f3 1 #include "mbed.h"
jplunkett 1:67a9d5cee87c 2 #include "CameraOV528.h"
jplunkett 0:ac819fa0198f 3 #include "FATFileSystem.h"
jplunkett 0:ac819fa0198f 4 #include "SDBlockDevice.h"
jplunkett 0:ac819fa0198f 5 #include <stdio.h>
jplunkett 0:ac819fa0198f 6
jplunkett 4:327a3341b5f3 7 CameraOV528 camera(D1, D0); // DX, RX
jplunkett 0:ac819fa0198f 8 SDBlockDevice bd(PTE3, PTE1, PTE2, PTE4); // MOSI, MISO, SCLK, CS
jplunkett 0:ac819fa0198f 9 FATFileSystem fs("fs");
jplunkett 6:9f5ecac1118f 10 EventQueue queue(32 * EVENTS_EVENT_SIZE);
jplunkett 6:9f5ecac1118f 11 Thread t;
jplunkett 6:9f5ecac1118f 12 DigitalOut green_led(LED_GREEN);
jplunkett 6:9f5ecac1118f 13 DigitalOut red_led(LED_RED);
jplunkett 6:9f5ecac1118f 14 InterruptIn btn(SW2);
jplunkett 0:ac819fa0198f 15 int picture_count;
jplunkett 0:ac819fa0198f 16
jplunkett 6:9f5ecac1118f 17 int format_fs(){
jplunkett 0:ac819fa0198f 18 int error = 0;
jplunkett 0:ac819fa0198f 19 printf("Welcome to the filesystem example.\r\n"
jplunkett 0:ac819fa0198f 20 "Formatting a FAT, RAM-backed filesystem. ");
jplunkett 0:ac819fa0198f 21 error = FATFileSystem::format(&bd);
jplunkett 0:ac819fa0198f 22 if (error)
jplunkett 0:ac819fa0198f 23 printf("Failure. %d\r\n", error);
jplunkett 0:ac819fa0198f 24 else
jplunkett 0:ac819fa0198f 25 printf("done.\r\n");
jplunkett 0:ac819fa0198f 26 return error;
jplunkett 0:ac819fa0198f 27 }
jplunkett 0:ac819fa0198f 28
jplunkett 0:ac819fa0198f 29 int mount_fs() {
jplunkett 0:ac819fa0198f 30 printf("Mounting the filesystem on \"/fs\". ");
jplunkett 0:ac819fa0198f 31 int error = fs.mount(&bd);
jplunkett 0:ac819fa0198f 32 if (error)
jplunkett 0:ac819fa0198f 33 printf("Failure. %d\r\n", error);
jplunkett 0:ac819fa0198f 34 else
jplunkett 0:ac819fa0198f 35 printf("done.\r\n");
jplunkett 0:ac819fa0198f 36 return error;
jplunkett 0:ac819fa0198f 37 }
jplunkett 0:ac819fa0198f 38
jplunkett 0:ac819fa0198f 39 void init_fs() {
jplunkett 6:9f5ecac1118f 40 if (mount_fs()) {
jplunkett 6:9f5ecac1118f 41 format_fs();
jplunkett 6:9f5ecac1118f 42 mount_fs();
jplunkett 6:9f5ecac1118f 43 }
jplunkett 0:ac819fa0198f 44 }
jplunkett 0:ac819fa0198f 45
jplunkett 6:9f5ecac1118f 46 void swap_led() {
jplunkett 6:9f5ecac1118f 47 green_led = !green_led;
jplunkett 6:9f5ecac1118f 48 red_led = !red_led;
jplunkett 0:ac819fa0198f 49 }
jplunkett 0:ac819fa0198f 50
jplunkett 0:ac819fa0198f 51 void take_and_store_photo() {
jplunkett 6:9f5ecac1118f 52 // Change LED to Red (for take_and_store_photo duration)
jplunkett 6:9f5ecac1118f 53 swap_led();
jplunkett 0:ac819fa0198f 54
jplunkett 6:9f5ecac1118f 55 // Take and store the picture
jplunkett 0:ac819fa0198f 56 if(camera.take_picture() == 0) {
jplunkett 0:ac819fa0198f 57 printf("Picture taken.\r\n");
jplunkett 0:ac819fa0198f 58
jplunkett 0:ac819fa0198f 59 uint32_t size = camera.get_picture_size();
jplunkett 0:ac819fa0198f 60 uint8_t* data_buff = (uint8_t*)malloc(size);
jplunkett 0:ac819fa0198f 61 uint32_t bytes_read = camera.read_picture_data(data_buff, size);
jplunkett 0:ac819fa0198f 62 char filename[30];
jplunkett 0:ac819fa0198f 63 sprintf(filename, "/fs/img%d.jpg", picture_count++);
jplunkett 0:ac819fa0198f 64 printf("Opening a new file, %s.\r\n", filename);
jplunkett 0:ac819fa0198f 65
jplunkett 0:ac819fa0198f 66 FILE* fd = fopen(filename, "wb");
jplunkett 0:ac819fa0198f 67 fwrite(data_buff, sizeof(uint8_t), bytes_read, fd);
jplunkett 0:ac819fa0198f 68 fclose(fd);
jplunkett 0:ac819fa0198f 69
jplunkett 0:ac819fa0198f 70 printf("Picture saved.\r\n\n");
jplunkett 0:ac819fa0198f 71
jplunkett 0:ac819fa0198f 72 free(data_buff);
jplunkett 0:ac819fa0198f 73 }
jplunkett 0:ac819fa0198f 74 else {
jplunkett 0:ac819fa0198f 75 printf("Failed to take photo.\r\n\n");
jplunkett 0:ac819fa0198f 76 }
jplunkett 6:9f5ecac1118f 77
jplunkett 6:9f5ecac1118f 78 // Change LED to Green
jplunkett 6:9f5ecac1118f 79 swap_led();
jplunkett 6:9f5ecac1118f 80 }
jplunkett 6:9f5ecac1118f 81
jplunkett 6:9f5ecac1118f 82 void rise_handler(void) {
jplunkett 6:9f5ecac1118f 83 // Add the take_and_store_photo event to the queue
jplunkett 6:9f5ecac1118f 84 queue.call(take_and_store_photo);
jplunkett 0:ac819fa0198f 85 }
jplunkett 0:ac819fa0198f 86
jplunkett 0:ac819fa0198f 87 int main() {
jplunkett 6:9f5ecac1118f 88 // Initialize LED to Green
jplunkett 6:9f5ecac1118f 89 red_led = !red_led;
jplunkett 6:9f5ecac1118f 90
jplunkett 6:9f5ecac1118f 91 // Initialize picture count to zero
jplunkett 0:ac819fa0198f 92 picture_count = 0;
jplunkett 6:9f5ecac1118f 93
jplunkett 6:9f5ecac1118f 94 // Initialize FATFileSystem and Camera
jplunkett 0:ac819fa0198f 95 init_fs();
jplunkett 0:ac819fa0198f 96 camera.powerup();
jplunkett 6:9f5ecac1118f 97
jplunkett 6:9f5ecac1118f 98 // Start the event queue's dispatch thread
jplunkett 6:9f5ecac1118f 99 t.start(callback(&queue, &EventQueue::dispatch_forever));
jplunkett 6:9f5ecac1118f 100
jplunkett 6:9f5ecac1118f 101 // On button press (rise), execute rise_handler in the context of thread 't'
jplunkett 6:9f5ecac1118f 102 btn.rise(queue.event(rise_handler));
jplunkett 0:ac819fa0198f 103 }