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

main.cpp

Committer:
va009039
Date:
2016-05-01
Revision:
5:c977606222fd
Parent:
4:efa6fc1219e7

File content as of revision 5:c977606222fd:

#include "USBHostCam.h"
RawSerial pc(USBTX, USBRX);

#if defined(TARGET_NUCLEO_F401RE)||defined(TARGET_NUCLEO_F411RE)||defined(TARGET_NUCLEO_F446RE)
uint8_t image_buf[1024*32];
DigitalOut led1(LED1);
#define LED_OFF 0
#define LED_ON  1

#elif defined(TARGET_KL46Z)||defined(TARGET_K64F)
uint8_t image_buf[1024*24];
DigitalOut led1(LED1);
#define LED_OFF 1
#define LED_ON  0

#elif defined(TARGET_KL25Z)
uint8_t image_buf[1024*12];
DigitalOut led1(LED1);
#define LED_OFF 1
#define LED_ON  0

#elif defined(TARGET_LPC4088)||defined(TARGET_LPC1768)
uint8_t image_buf[1024*24];
DigitalOut led1(LED1);
#define LED_OFF 0
#define LED_ON  1

#else
#error "target error"
#endif

int main() {
    pc.baud(9600);
    led1 = LED_OFF;

    // Logitech C270
    USBHostCam* cam = new USBHostCam(_320x240);
    if (!cam->connect()) {
        error("WebCam not found.\n");
    }

    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/Checksum.\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();
                led1 = !led1;
                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();
    }
}