testing n-Bed with a Logitech C270 camera

Dependencies:   USBHost mbed

Fork of USBHostC270_example by Norimasa Okamoto

Revision:
10:387c49b2fc7e
Parent:
9:fecabade834a
Child:
11:6a8eef89eb22
--- a/main.cpp	Sat Mar 16 13:07:55 2013 +0000
+++ b/main.cpp	Sun Mar 17 13:22:13 2013 +0000
@@ -1,135 +1,44 @@
-// USBHostC270_HelloWorld/main.cpp
-#include "mbed.h"
-#include "USBHostMSD.h"
-#include "USBHostC270.h"
-#include "decodeMJPEG.h"
-#include "MyThread.h"
-
-#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;
-        }
-    }
-};
-
-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();
-            }
-        }
-    }
-    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++;
-            }
-            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();
-        }
-    }
-}
+#include "USBHostMSD.h"
+#include "USBHostC270.h"
+
+Serial pc(USBTX, USBRX);
+BusOut leds(LED1, LED2, LED3);
+
+int main() {
+    pc.baud(921600);
+
+    USBHostMSD* msd = new USBHostMSD("usb"); // USB flash drive
+
+    USBHostC270* cam = new USBHostC270(C270_MJPEG, C270_160x120, _5FPS); // Logitech C270
+    while(!cam->connect()) {
+        Thread::wait(500);
+    }
+
+    uint8_t buf[1024*3];
+    Timer interval_t;
+    interval_t.reset();
+    interval_t.start();
+    int shot = 0;
+    while(1) {
+        if (interval_t.read() > 10) {
+            int r = cam->readJPEG(buf, sizeof(buf));
+            char path[32];
+            snprintf(path, sizeof(path), "/usb/image%02d.jpg", shot % 20);
+            printf("%d %s %d bytes\n", shot, path, r);
+            if (msd->connected()) {
+                FILE* fp = fopen(path, "wb");
+                if (fp) {
+                    fwrite(buf, r, 1, fp);
+                    fclose(fp);
+                }
+                shot++;
+                leds = shot % 8;
+            }
+            interval_t.reset();
+        }
+        if (!msd->connected()) {
+            msd->connect();
+        }
+        cam->poll();    
+    }
+}