OV7670 + 23LC1024 + Bluetooth
Dependencies: FastPWM MODSERIAL mbed
main.cpp@1:6e4d2cff76e8, 2013-07-23 (annotated)
- Committer:
- sampullman
- Date:
- Tue Jul 23 06:33:27 2013 +0000
- Revision:
- 1:6e4d2cff76e8
- Parent:
- 0:f309a2b2f27b
Implemented image streaming client protocol. Single image works, but fails to send subsequent frames.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sampullman | 0:f309a2b2f27b | 1 | #include "mbed.h" |
sampullman | 1:6e4d2cff76e8 | 2 | #include "Constants.h" |
sampullman | 0:f309a2b2f27b | 3 | #include "OV7670.h" |
sampullman | 0:f309a2b2f27b | 4 | #include "FastPWM.h" |
sampullman | 1:6e4d2cff76e8 | 5 | #include "spi_ram.h" |
sampullman | 1:6e4d2cff76e8 | 6 | #include "MODSERIAL.h" |
sampullman | 0:f309a2b2f27b | 7 | |
sampullman | 0:f309a2b2f27b | 8 | #define SIZEX (160) |
sampullman | 0:f309a2b2f27b | 9 | #define SIZEY (120) |
sampullman | 0:f309a2b2f27b | 10 | #define SIZE 19200 |
sampullman | 0:f309a2b2f27b | 11 | |
sampullman | 0:f309a2b2f27b | 12 | OV7670 camera( |
sampullman | 0:f309a2b2f27b | 13 | p28, p27, // SDA,SCL(I2C / SCCB) |
sampullman | 0:f309a2b2f27b | 14 | p21, p22, p23, p24, // XCLK, PCLK, VSYNC, HREF |
sampullman | 0:f309a2b2f27b | 15 | Port0, 0x07878000); // D0-D7 -> P11-p18 |
sampullman | 0:f309a2b2f27b | 16 | |
sampullman | 0:f309a2b2f27b | 17 | Serial host(USBTX, USBRX); |
sampullman | 1:6e4d2cff76e8 | 18 | MODSERIAL bt(p9, p10, 16384, 512); |
sampullman | 0:f309a2b2f27b | 19 | DigitalOut status(p20); |
sampullman | 1:6e4d2cff76e8 | 20 | int feedMode = 0; |
sampullman | 0:f309a2b2f27b | 21 | |
sampullman | 0:f309a2b2f27b | 22 | int hexToInt(int i) { |
sampullman | 0:f309a2b2f27b | 23 | if(i >= '0' && i <= '9') return i - '0'; |
sampullman | 0:f309a2b2f27b | 24 | else if(i >= 'A' && i <= 'F') return i - 55; |
sampullman | 0:f309a2b2f27b | 25 | else return 0; |
sampullman | 0:f309a2b2f27b | 26 | } |
sampullman | 0:f309a2b2f27b | 27 | |
sampullman | 0:f309a2b2f27b | 28 | int getHexWord(Serial *ser) { |
sampullman | 0:f309a2b2f27b | 29 | int b1 = ser->getc(); |
sampullman | 0:f309a2b2f27b | 30 | int b2 = ser->getc(); |
sampullman | 0:f309a2b2f27b | 31 | return (hexToInt(b1) << 4) | hexToInt(b2); |
sampullman | 0:f309a2b2f27b | 32 | } |
sampullman | 0:f309a2b2f27b | 33 | |
sampullman | 1:6e4d2cff76e8 | 34 | void readLine(Serial *ser, char *data) { |
sampullman | 1:6e4d2cff76e8 | 35 | int i=0; |
sampullman | 1:6e4d2cff76e8 | 36 | char c = '0'; |
sampullman | 1:6e4d2cff76e8 | 37 | while(c != '\n') { |
sampullman | 1:6e4d2cff76e8 | 38 | if(ser->readable()) { |
sampullman | 1:6e4d2cff76e8 | 39 | c = ser->getc(); |
sampullman | 1:6e4d2cff76e8 | 40 | data[i++] = c; |
sampullman | 1:6e4d2cff76e8 | 41 | } |
sampullman | 0:f309a2b2f27b | 42 | } |
sampullman | 1:6e4d2cff76e8 | 43 | data[i] = '\0'; |
sampullman | 0:f309a2b2f27b | 44 | } |
sampullman | 0:f309a2b2f27b | 45 | |
sampullman | 0:f309a2b2f27b | 46 | int main() { |
sampullman | 0:f309a2b2f27b | 47 | host.baud(115200); |
sampullman | 1:6e4d2cff76e8 | 48 | bt.baud(230400); |
sampullman | 0:f309a2b2f27b | 49 | |
sampullman | 0:f309a2b2f27b | 50 | // Initialize a 12Mhz XCLK for the camera |
sampullman | 0:f309a2b2f27b | 51 | camera.Init(); |
sampullman | 0:f309a2b2f27b | 52 | |
sampullman | 0:f309a2b2f27b | 53 | // Reset camera on power up |
sampullman | 0:f309a2b2f27b | 54 | camera.Reset(); |
sampullman | 0:f309a2b2f27b | 55 | |
sampullman | 0:f309a2b2f27b | 56 | // Set up for 160*120 pixels RGB565 |
sampullman | 0:f309a2b2f27b | 57 | camera.InitQQVGA(); |
sampullman | 0:f309a2b2f27b | 58 | |
sampullman | 0:f309a2b2f27b | 59 | char c; |
sampullman | 1:6e4d2cff76e8 | 60 | char data[20]; |
sampullman | 0:f309a2b2f27b | 61 | while(1) { |
sampullman | 1:6e4d2cff76e8 | 62 | if(bt.readable()) { |
sampullman | 1:6e4d2cff76e8 | 63 | c = bt.getc(); |
sampullman | 1:6e4d2cff76e8 | 64 | switch(c) { |
sampullman | 1:6e4d2cff76e8 | 65 | case REQUEST_PROFILE: |
sampullman | 1:6e4d2cff76e8 | 66 | host.printf("Profile requested\n\r"); |
sampullman | 1:6e4d2cff76e8 | 67 | bt.putc(CLIENT_PROFILE); |
sampullman | 1:6e4d2cff76e8 | 68 | bt.putc((TAPCAM_ID >> 4) & 0x0F); |
sampullman | 1:6e4d2cff76e8 | 69 | bt.putc(TAPCAM_ID & 0x0F); |
sampullman | 1:6e4d2cff76e8 | 70 | bt.printf("device\n"); |
sampullman | 1:6e4d2cff76e8 | 71 | break; |
sampullman | 1:6e4d2cff76e8 | 72 | case CLIENT_PROFILE: { |
sampullman | 1:6e4d2cff76e8 | 73 | host.printf("Client profile:\n\r"); |
sampullman | 1:6e4d2cff76e8 | 74 | int id = bt.getc() << 4; |
sampullman | 1:6e4d2cff76e8 | 75 | id |= bt.getc(); |
sampullman | 1:6e4d2cff76e8 | 76 | readLine(&bt, data); |
sampullman | 1:6e4d2cff76e8 | 77 | host.printf("ID: %d\n\r", id); |
sampullman | 1:6e4d2cff76e8 | 78 | host.printf("Type: %s\n\r", data); |
sampullman | 1:6e4d2cff76e8 | 79 | break; |
sampullman | 1:6e4d2cff76e8 | 80 | } |
sampullman | 1:6e4d2cff76e8 | 81 | case FEED_REQUEST: |
sampullman | 1:6e4d2cff76e8 | 82 | host.printf("Feed requested\n\r"); |
sampullman | 1:6e4d2cff76e8 | 83 | bt.putc(FEED_START); |
sampullman | 1:6e4d2cff76e8 | 84 | break; |
sampullman | 1:6e4d2cff76e8 | 85 | case FEED_START_ACK: |
sampullman | 1:6e4d2cff76e8 | 86 | host.printf("Feed start acknowledged\n\r"); |
sampullman | 1:6e4d2cff76e8 | 87 | feedMode = 1; |
sampullman | 1:6e4d2cff76e8 | 88 | break; |
sampullman | 1:6e4d2cff76e8 | 89 | case FEED_CANCEL: |
sampullman | 1:6e4d2cff76e8 | 90 | host.printf("Feed canceled\n\r"); |
sampullman | 1:6e4d2cff76e8 | 91 | feedMode = 0; |
sampullman | 1:6e4d2cff76e8 | 92 | break; |
sampullman | 1:6e4d2cff76e8 | 93 | } |
sampullman | 1:6e4d2cff76e8 | 94 | } |
sampullman | 1:6e4d2cff76e8 | 95 | if(feedMode) { |
sampullman | 1:6e4d2cff76e8 | 96 | int bytes = camera.captureImage(); |
sampullman | 1:6e4d2cff76e8 | 97 | bt.putc(FRAME_READ); |
sampullman | 1:6e4d2cff76e8 | 98 | bt.printf(ORIENTATION); |
sampullman | 1:6e4d2cff76e8 | 99 | bt.printf("%d\n", bytes); |
sampullman | 1:6e4d2cff76e8 | 100 | camera.sendImage(&bt, bytes); |
sampullman | 1:6e4d2cff76e8 | 101 | host.printf("Sent %d\n\r", bytes); |
sampullman | 1:6e4d2cff76e8 | 102 | wait_ms(100); |
sampullman | 1:6e4d2cff76e8 | 103 | } |
sampullman | 0:f309a2b2f27b | 104 | if(host.readable()) { |
sampullman | 0:f309a2b2f27b | 105 | c = host.getc(); |
sampullman | 1:6e4d2cff76e8 | 106 | if(c == 'r') { |
sampullman | 1:6e4d2cff76e8 | 107 | int reg = getHexWord(&host); |
sampullman | 1:6e4d2cff76e8 | 108 | host.printf("%d\n\r", camera.ReadReg(reg)); |
sampullman | 1:6e4d2cff76e8 | 109 | } else if(c == 'w') { |
sampullman | 1:6e4d2cff76e8 | 110 | int reg = getHexWord(&host); |
sampullman | 1:6e4d2cff76e8 | 111 | int val = getHexWord(&host); |
sampullman | 1:6e4d2cff76e8 | 112 | camera.WriteReg(reg, val); |
sampullman | 1:6e4d2cff76e8 | 113 | host.printf("%d\n\r", camera.ReadReg(reg)); |
sampullman | 1:6e4d2cff76e8 | 114 | } else if(c == 't') { |
sampullman | 1:6e4d2cff76e8 | 115 | camera.scopeTest(&host); |
sampullman | 1:6e4d2cff76e8 | 116 | } else if(c == 'c') { |
sampullman | 1:6e4d2cff76e8 | 117 | status = 1; |
sampullman | 1:6e4d2cff76e8 | 118 | int bytes = camera.captureImage(); |
sampullman | 1:6e4d2cff76e8 | 119 | host.printf("%d\n", bytes); |
sampullman | 1:6e4d2cff76e8 | 120 | camera.sendImage(&host, bytes); |
sampullman | 1:6e4d2cff76e8 | 121 | status = 0; |
sampullman | 1:6e4d2cff76e8 | 122 | } else if(c == 's') { |
sampullman | 1:6e4d2cff76e8 | 123 | feedMode = false; |
sampullman | 1:6e4d2cff76e8 | 124 | } else if(c == 'p') { |
sampullman | 1:6e4d2cff76e8 | 125 | bt.putc(REQUEST_PROFILE); |
sampullman | 1:6e4d2cff76e8 | 126 | } |
sampullman | 0:f309a2b2f27b | 127 | } |
sampullman | 0:f309a2b2f27b | 128 | } |
sampullman | 0:f309a2b2f27b | 129 | } |
sampullman | 0:f309a2b2f27b | 130 |