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:
Sun May 01 23:33:49 2016 +0000
Revision:
5:c977606222fd
Parent:
4:efa6fc1219e7
update USBHost,add ST-Nucleo-F446RE

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