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:
Fri Jan 31 13:50:15 2014 +0000
Revision:
2:2a40888db9fc
Parent:
1:22304b8f8395
Child:
3:b2f688e2ddd7
USB hub support.

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