Simple USBHost WebCam test program

Dependencies:   F401RE-USBHost mbed

Fork of KL46Z-USBHostC270_example by Norimasa Okamoto

WebカメラからJPEG画像を読み取るテストプログラムです。
使い方はKL46Z-USBHostC270_exampleと同じです。
動作確認カメラ: Logitech C270, Logitech C210, Logitech Q200R(Qcam Orbit AF), LifeCam VX-500
/media/uploads/va009039/f401re-c270-1.jpg /media/uploads/va009039/k64f-c270.jpg

Committer:
va009039
Date:
Wed Jul 23 04:51:51 2014 +0000
Revision:
4:efa6fc1219e7
Parent:
3:b2f688e2ddd7
Child:
5:c977606222fd
update USBHost,added FRDM-K64F.

Who changed what in which revision?

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