Simple USBHost WebCam test program

Dependencies:   F401RE-USBHost mbed

Fork of KL46Z-USBHostC270_example by Norimasa Okamoto

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