Simple USBHost C270 example

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