testing n-Bed with a Logitech C270 camera

Dependencies:   USBHost mbed

Fork of USBHostC270_example by Norimasa Okamoto

Revision:
9:fecabade834a
Parent:
4:f8a5c8aa895a
Child:
10:387c49b2fc7e
--- a/main.cpp	Thu Mar 14 14:23:42 2013 +0000
+++ b/main.cpp	Sat Mar 16 13:07:55 2013 +0000
@@ -1,50 +1,135 @@
+// USBHostC270_HelloWorld/main.cpp
 #include "mbed.h"
 #include "USBHostMSD.h"
+#include "USBHostC270.h"
+#include "decodeMJPEG.h"
+#include "MyThread.h"
 
-DigitalOut led(LED1);
+#define IMAGE_BUF_SIZE (1024*3)
+
+Serial pc(USBTX, USBRX);
+DigitalOut led1(LED1),led2(LED2),led3(LED3);
+
+struct ImageBuffer {
+    int pos;
+    uint8_t buf[IMAGE_BUF_SIZE];
+    void clear() { pos = 0; }
+    int size() { return pos; }
+    uint8_t get(int pos) { return buf[pos]; } 
+    void put(uint8_t c) {
+        if (pos < sizeof(buf)) {
+            buf[pos++] = c;
+        }
+    }
+};
 
-void msd_task(void const *) {
-    
-    USBHostMSD msd("usb");
-    int i = 0;
-    
-    while(1) {
-        
-        // try to connect a MSD device
-        while(!msd.connect()) {
-            Thread::wait(500);
+Mail<ImageBuffer, 1> mail_box;
+class captureJPEG : public MyThread, public decodeMJPEG {
+public:
+    captureJPEG(BaseUvc* cam) : m_cam(cam) {
+        m_buf = NULL;
+        m_cam->setOnResult(this, &captureJPEG::callback_motion_jpeg);
+    }
+private:    
+    virtual void outputJPEG(uint8_t c, int status) {
+        if (m_buf == NULL && status == JPEG_START) {
+            m_buf = mail_box.alloc();
+            if (m_buf) {
+                m_buf->clear();
+            }
+        }
+        if (m_buf) {
+            m_buf->put(c);
+            if (status == JPEG_END) {
+                mail_box.put(m_buf);
+                m_buf = NULL;
+                led3 = !led3;
+            }
+        }
+    }
+
+    void callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len) {
+        inputPacket(buf, len);
+        led1 = buf[1]&1;    // FID
+        if (buf[1]&2) {     // EOF
+            led2 = !led2;
+        }
+    }
+
+    virtual void run() {
+        while(true) {
+            if (m_cam) {
+                m_cam->poll();
+            }
         }
-        
-        // in a loop, append a file
-        // if the device is disconnected, we try to connect it again
-        while(1) {
-            
-            // append a file
-            FILE * fp = fopen("/usb/test1.txt", "a");
-        
-            if (fp != NULL) {
-                fprintf(fp, "Hello fun SD Card World: %d!\r\n", i++);
-                printf("Goodbye World!\r\n");
-                fclose(fp);
-            } else {
-                printf("FILE == NULL\r\n");
+    }
+    ImageBuffer* m_buf;
+    BaseUvc* m_cam;
+};
+
+int main() {
+    pc.baud(921600);
+    printf("%s\n", __FILE__);
+
+    USBHostMSD* msd = new USBHostMSD("usb");
+    while(!msd->connect()) {
+        Thread::wait(200);
+    }
+    
+
+    USBHostC270* cam = new USBHostC270(C270_MJPEG, C270_160x120, _5FPS);
+    while(!cam->connect()) {
+        Thread::wait(200);
+    }
+
+    captureJPEG* capture = new captureJPEG(cam);
+    capture->set_stack(512);
+    capture->start();
+
+    Timer t;
+    t.reset();
+    t.start();
+    Timer interval_t;
+    interval_t.reset();
+    interval_t.start();
+    int shot = 0;
+    while(1) {
+        osEvent evt = mail_box.get();
+        if (evt.status == osEventMail) {
+            ImageBuffer *buf = reinterpret_cast<ImageBuffer*>(evt.value.p);
+            if (interval_t.read() > 10) {
+                char path[32];
+                snprintf(path, sizeof(path), "/usb/image%02d.jpg", shot % 100);
+                printf("%d %s %d bytes\n", shot, path, buf->size());
+                if (msd->connected()) {
+                    FILE* fp = fopen(path, "wb");
+                    if (fp) {
+                        for(int i = 0; i < buf->size(); i++) {
+                            fputc(buf->get(i), fp);
+                        }
+                        fclose(fp);
+                    }
+                }
+                interval_t.reset();
+                shot++;
             }
-            
-            Thread::wait(500);
-        
-            // if device disconnected, try to connect again
-            if (!msd.connected())
-                break;
+            mail_box.free(buf);
         }
-            
+        if (t.read() > 5) {
+            printf("captureJPEG stack used: %d/%d bytes\n", capture->stack_used(), capture->stack_size());
+            printf("CC:");
+            for(int i = 0; i < 16; i++) {
+                printf(" %u", cam->report_cc_count[i]); 
+            }
+            printf("\nPS:"); 
+            for(int i = 0; i < 16; i++) {
+                printf(" %u", cam->report_ps_cc_count[i]); 
+            }
+            printf("\n");
+            t.reset();
+        }
+        if (!msd->connected()) {
+            msd->connect();
+        }
     }
 }
-
-
-int main() {
-    Thread msdTask(msd_task, NULL, osPriorityNormal, 1024 * 4);
-    while(1) {
-        led=!led;
-        Thread::wait(500);
-    }
-}
\ No newline at end of file