Jenny Plunkett
/
CameraOV528-Example
Hello World example program for the OV528 Camera Module
main.cpp@6:9f5ecac1118f, 2017-07-07 (annotated)
- 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?
User | Revision | Line number | New 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 | } |