Simple USBHost WebCam for EA LPC4088 QSB/LPC1768 test program

Dependencies:   LPC4088-USBHost mbed

EA LPC4088 QSB/LPC1768をUSBホストにしてWebカメラからJPEG画像を読み取るテストプログラムです。

The usage is the same as KL46Z-USBHostC270_example.
使い方はKL46Z-USBHostC270_exampleと同じです。
動作確認: Logitech C270,Logitech Q200R(Qcam Orbit AF)
/media/uploads/va009039/lpc4088-c270-480x360.jpg

main.cpp

Committer:
va009039
Date:
2014-04-25
Revision:
1:1bb68ef9aa77
Parent:
0:c972ee42b455

File content as of revision 1:1bb68ef9aa77:

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

#if defined(TARGET_LPC4088)
#define IMAGE_BUF_SIZE (1024*48)
#elif defined(TARGET_LPC1768)
#define IMAGE_BUF_SIZE (1024*24)
#else
#error "target error"
#endif

uint8_t image_buf[IMAGE_BUF_SIZE];
 
DigitalOut led1(LED1);
DigitalOut led2(LED2);
#define LED_OFF 0
#define LED_ON  1

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

    // Logitech C270
    USBHostCam* cam = new USBHostCam(_800x600);
    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 from LPC4088.\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();
    }
}