Simple USBHost WebCam for EA LPC4088 QSB/LPC1768 test program

Dependencies:   LPC4088-USBHost mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "USBHostCam.h"
00002 RawSerial pc(USBTX, USBRX);
00003 
00004 #if defined(TARGET_LPC4088)
00005 #define IMAGE_BUF_SIZE (1024*48)
00006 #elif defined(TARGET_LPC1768)
00007 #define IMAGE_BUF_SIZE (1024*24)
00008 #else
00009 #error "target error"
00010 #endif
00011 
00012 uint8_t image_buf[IMAGE_BUF_SIZE];
00013  
00014 DigitalOut led1(LED1);
00015 DigitalOut led2(LED2);
00016 #define LED_OFF 0
00017 #define LED_ON  1
00018 
00019 int main() {
00020     pc.baud(9600);
00021     led1 = led2 = LED_OFF;
00022 
00023     // Logitech C270
00024     USBHostCam* cam = new USBHostCam(_800x600);
00025     if (!cam->connect()) {
00026         error("WebCam not found.\n");
00027     }
00028 
00029     int pos = 0; 
00030     int size = 0;
00031     Timer t;
00032     for(int seq = 0;;) {
00033         int c = -1;
00034         if (pc.readable()) {
00035             c = pc.getc();
00036         }    
00037         switch(seq) {
00038             case 0:
00039                 pc.printf("\nReady, please download JPEG using XMODEM from LPC4088.\n");
00040                 t.start();
00041                 seq++;
00042                 break;
00043             case 1:
00044                 if (c == 0x15) { // NAK
00045                     size = cam->readJPEG(image_buf, sizeof(image_buf));
00046                     pos = 0;
00047                     seq++;
00048                 }
00049                 break;
00050             case 2:
00051                 if (pos >= size) {
00052                     pc.putc(0x04); // EOT
00053                 } else {
00054                     pc.putc(0x01); // SOH
00055                     uint8_t block = pos/128 + 1;
00056                     pc.putc(block);
00057                     pc.putc(block ^ 0xff);
00058                     uint8_t checksum = 0x00;
00059                     for(int i = 0; i < 128; i++) {
00060                         uint8_t c = image_buf[pos + i];
00061                         checksum += c;
00062                         pc.putc(c);
00063                     }
00064                     pc.putc(checksum);
00065                 }
00066                 seq++;
00067                 t.reset();
00068                 led2 = !led2;
00069                 break;
00070             case 3:
00071                 if (c == 0x06) { // ACK
00072                     if (pos >= size) {
00073                         seq = 0;
00074                     } else {
00075                         pos += 128;
00076                         seq--;
00077                     }
00078                 }
00079                 break;
00080         }
00081         if (t.read_ms() > 15*1000) { // timeout
00082             t.reset();
00083             seq = 0;
00084         }
00085         cam->poll();
00086     }
00087 }