Simple USBHost C270 example

Dependencies:   F401RE-USBHost mbed

/media/uploads/va009039/k64f-c270.jpg

Committer:
va009039
Date:
Fri Aug 08 14:08:44 2014 +0000
Revision:
0:5ca8a4347f67
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:5ca8a4347f67 1 #include "USBHostCam.h"
va009039 0:5ca8a4347f67 2 RawSerial pc(USBTX, USBRX);
va009039 0:5ca8a4347f67 3
va009039 0:5ca8a4347f67 4 uint8_t image_buf[1024*64];
va009039 0:5ca8a4347f67 5 DigitalOut led1(LED1);
va009039 0:5ca8a4347f67 6 DigitalOut led2(LED2);
va009039 0:5ca8a4347f67 7 #define LED_OFF 1
va009039 0:5ca8a4347f67 8 #define LED_ON 0
va009039 0:5ca8a4347f67 9
va009039 0:5ca8a4347f67 10 int main() {
va009039 0:5ca8a4347f67 11 pc.baud(9600);
va009039 0:5ca8a4347f67 12 led1 = led2 = LED_OFF;
va009039 0:5ca8a4347f67 13
va009039 0:5ca8a4347f67 14 // Logitech C270
va009039 0:5ca8a4347f67 15 USBHostCam* cam = new USBHostCam(_800x448);
va009039 0:5ca8a4347f67 16 if (!cam->connect()) {
va009039 0:5ca8a4347f67 17 error("WebCam not found.\n");
va009039 0:5ca8a4347f67 18 }
va009039 0:5ca8a4347f67 19
va009039 0:5ca8a4347f67 20 int pos = 0;
va009039 0:5ca8a4347f67 21 int size = 0;
va009039 0:5ca8a4347f67 22 Timer t;
va009039 0:5ca8a4347f67 23 for(int seq = 0;;) {
va009039 0:5ca8a4347f67 24 int c = -1;
va009039 0:5ca8a4347f67 25 if (pc.readable()) {
va009039 0:5ca8a4347f67 26 c = pc.getc();
va009039 0:5ca8a4347f67 27 }
va009039 0:5ca8a4347f67 28 switch(seq) {
va009039 0:5ca8a4347f67 29 case 0:
va009039 0:5ca8a4347f67 30 pc.printf("\nReady, please download JPEG using XMODEM/Checksum.\n");
va009039 0:5ca8a4347f67 31 t.start();
va009039 0:5ca8a4347f67 32 seq++;
va009039 0:5ca8a4347f67 33 break;
va009039 0:5ca8a4347f67 34 case 1:
va009039 0:5ca8a4347f67 35 if (c == 0x15) { // NAK
va009039 0:5ca8a4347f67 36 size = cam->readJPEG(image_buf, sizeof(image_buf));
va009039 0:5ca8a4347f67 37 pos = 0;
va009039 0:5ca8a4347f67 38 seq++;
va009039 0:5ca8a4347f67 39 }
va009039 0:5ca8a4347f67 40 break;
va009039 0:5ca8a4347f67 41 case 2:
va009039 0:5ca8a4347f67 42 if (pos >= size) {
va009039 0:5ca8a4347f67 43 pc.putc(0x04); // EOT
va009039 0:5ca8a4347f67 44 } else {
va009039 0:5ca8a4347f67 45 pc.putc(0x01); // SOH
va009039 0:5ca8a4347f67 46 uint8_t block = pos/128 + 1;
va009039 0:5ca8a4347f67 47 pc.putc(block);
va009039 0:5ca8a4347f67 48 pc.putc(block ^ 0xff);
va009039 0:5ca8a4347f67 49 uint8_t checksum = 0x00;
va009039 0:5ca8a4347f67 50 for(int i = 0; i < 128; i++) {
va009039 0:5ca8a4347f67 51 uint8_t c = image_buf[pos + i];
va009039 0:5ca8a4347f67 52 checksum += c;
va009039 0:5ca8a4347f67 53 pc.putc(c);
va009039 0:5ca8a4347f67 54 }
va009039 0:5ca8a4347f67 55 pc.putc(checksum);
va009039 0:5ca8a4347f67 56 }
va009039 0:5ca8a4347f67 57 seq++;
va009039 0:5ca8a4347f67 58 t.reset();
va009039 0:5ca8a4347f67 59 led2 = !led2;
va009039 0:5ca8a4347f67 60 break;
va009039 0:5ca8a4347f67 61 case 3:
va009039 0:5ca8a4347f67 62 if (c == 0x06) { // ACK
va009039 0:5ca8a4347f67 63 if (pos >= size) {
va009039 0:5ca8a4347f67 64 seq = 0;
va009039 0:5ca8a4347f67 65 } else {
va009039 0:5ca8a4347f67 66 pos += 128;
va009039 0:5ca8a4347f67 67 seq--;
va009039 0:5ca8a4347f67 68 }
va009039 0:5ca8a4347f67 69 }
va009039 0:5ca8a4347f67 70 break;
va009039 0:5ca8a4347f67 71 }
va009039 0:5ca8a4347f67 72 if (t.read_ms() > 15*1000) { // timeout
va009039 0:5ca8a4347f67 73 t.reset();
va009039 0:5ca8a4347f67 74 seq = 0;
va009039 0:5ca8a4347f67 75 }
va009039 0:5ca8a4347f67 76 cam->poll();
va009039 0:5ca8a4347f67 77 }
va009039 0:5ca8a4347f67 78 }
va009039 0:5ca8a4347f67 79