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

Revision:
0:a72d9b047d8d
Child:
1:22304b8f8395
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jan 27 11:07:34 2014 +0000
@@ -0,0 +1,79 @@
+#include "USBHostC270.h"
+RawSerial pc(USBTX, USBRX);
+DigitalOut led1(LED_GREEN);
+DigitalOut led2(LED_RED);
+#define LED_OFF 1
+#define LED_ON  0
+
+#if defined(TARGET_KL46Z)
+uint8_t image_buf[1024*24];
+#elif defined(TARGET_KL25Z)
+uint8_t image_buf[1024*12];
+#endif
+
+int main() {
+    pc.baud(9600);
+    led1 = led2 = LED_OFF;
+
+    // Logitech C270
+    USBHostC270* cam = new USBHostC270(C270_MJPEG, C270_320x240, _5FPS);
+
+    int pos = 0; 
+    int size = 0;
+    Timer t;
+    for(int seq = 0;;) {
+        int c = -1;
+        if (pc.readable()) {
+            c = pc.getc();
+        }    
+        switch(seq) {
+            case 0:
+                pc.printf("\nReady, please download JPEG using XMODEM from FRDM-KL46Z.\n");
+                t.start();
+                seq++;
+                break;
+            case 1:
+                if (c == 0x15) { // NAK
+                    size = cam->readJPEG(image_buf, sizeof(image_buf));
+                    pos = 0;
+                    seq++;
+                }
+                break;
+            case 2:
+                if (pos >= size) {
+                    pc.putc(0x04); // EOT
+                } else {
+                    pc.putc(0x01); // SOH
+                    uint8_t block = pos/128 + 1;
+                    pc.putc(block);
+                    pc.putc(block ^ 0xff);
+                    uint8_t checksum = 0x00;
+                    for(int i = 0; i < 128; i++) {
+                        uint8_t c = image_buf[pos + i];
+                        checksum += c;
+                        pc.putc(c);
+                    }
+                    pc.putc(checksum);
+                }
+                seq++;
+                t.reset();
+                led2 = !led2;
+                break;
+            case 3:
+                if (c == 0x06) { // ACK
+                    if (pos >= size) {
+                        seq = 0;
+                    } else {
+                        pos += 128;
+                        seq--;
+                    }
+                }
+                break;
+        }
+        if (t.read_ms() > 15*1000) { // timeout
+            t.reset();
+            seq = 0;
+        }
+        cam->poll();
+    }
+}