Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: USBHost_custom_Addiso
Fork of USBHostC270_example_GR-PEACH by
Diff: main.cpp
- 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
