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:
Tue Jan 28 06:54:16 2014 +0000
Revision:
1:22304b8f8395
Parent:
0:a72d9b047d8d
Child:
2:2a40888db9fc
support Logitech C210 Q200R, LifeCam VX-700(VX-500), Sonix Camera.

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 0:a72d9b047d8d 20
va009039 0:a72d9b047d8d 21 int pos = 0;
va009039 0:a72d9b047d8d 22 int size = 0;
va009039 0:a72d9b047d8d 23 Timer t;
va009039 0:a72d9b047d8d 24 for(int seq = 0;;) {
va009039 0:a72d9b047d8d 25 int c = -1;
va009039 0:a72d9b047d8d 26 if (pc.readable()) {
va009039 0:a72d9b047d8d 27 c = pc.getc();
va009039 0:a72d9b047d8d 28 }
va009039 0:a72d9b047d8d 29 switch(seq) {
va009039 0:a72d9b047d8d 30 case 0:
va009039 0:a72d9b047d8d 31 pc.printf("\nReady, please download JPEG using XMODEM from FRDM-KL46Z.\n");
va009039 0:a72d9b047d8d 32 t.start();
va009039 0:a72d9b047d8d 33 seq++;
va009039 0:a72d9b047d8d 34 break;
va009039 0:a72d9b047d8d 35 case 1:
va009039 0:a72d9b047d8d 36 if (c == 0x15) { // NAK
va009039 0:a72d9b047d8d 37 size = cam->readJPEG(image_buf, sizeof(image_buf));
va009039 0:a72d9b047d8d 38 pos = 0;
va009039 0:a72d9b047d8d 39 seq++;
va009039 0:a72d9b047d8d 40 }
va009039 0:a72d9b047d8d 41 break;
va009039 0:a72d9b047d8d 42 case 2:
va009039 0:a72d9b047d8d 43 if (pos >= size) {
va009039 0:a72d9b047d8d 44 pc.putc(0x04); // EOT
va009039 0:a72d9b047d8d 45 } else {
va009039 0:a72d9b047d8d 46 pc.putc(0x01); // SOH
va009039 0:a72d9b047d8d 47 uint8_t block = pos/128 + 1;
va009039 0:a72d9b047d8d 48 pc.putc(block);
va009039 0:a72d9b047d8d 49 pc.putc(block ^ 0xff);
va009039 0:a72d9b047d8d 50 uint8_t checksum = 0x00;
va009039 0:a72d9b047d8d 51 for(int i = 0; i < 128; i++) {
va009039 0:a72d9b047d8d 52 uint8_t c = image_buf[pos + i];
va009039 0:a72d9b047d8d 53 checksum += c;
va009039 0:a72d9b047d8d 54 pc.putc(c);
va009039 0:a72d9b047d8d 55 }
va009039 0:a72d9b047d8d 56 pc.putc(checksum);
va009039 0:a72d9b047d8d 57 }
va009039 0:a72d9b047d8d 58 seq++;
va009039 0:a72d9b047d8d 59 t.reset();
va009039 0:a72d9b047d8d 60 led2 = !led2;
va009039 0:a72d9b047d8d 61 break;
va009039 0:a72d9b047d8d 62 case 3:
va009039 0:a72d9b047d8d 63 if (c == 0x06) { // ACK
va009039 0:a72d9b047d8d 64 if (pos >= size) {
va009039 0:a72d9b047d8d 65 seq = 0;
va009039 0:a72d9b047d8d 66 } else {
va009039 0:a72d9b047d8d 67 pos += 128;
va009039 0:a72d9b047d8d 68 seq--;
va009039 0:a72d9b047d8d 69 }
va009039 0:a72d9b047d8d 70 }
va009039 0:a72d9b047d8d 71 break;
va009039 0:a72d9b047d8d 72 }
va009039 0:a72d9b047d8d 73 if (t.read_ms() > 15*1000) { // timeout
va009039 0:a72d9b047d8d 74 t.reset();
va009039 0:a72d9b047d8d 75 seq = 0;
va009039 0:a72d9b047d8d 76 }
va009039 0:a72d9b047d8d 77 cam->poll();
va009039 0:a72d9b047d8d 78 }
va009039 0:a72d9b047d8d 79 }