BaseUsbHost example program

Dependencies:   BaseUsbHost FATFileSystem mbed mbed-rtos

Committer:
va009039
Date:
Tue Dec 11 15:28:00 2012 +0000
Revision:
2:c10029b87439
add example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 2:c10029b87439 1 #if 0
va009039 2:c10029b87439 2 // example_captureJPEG.cpp
va009039 2:c10029b87439 3 #include "mbed.h"
va009039 2:c10029b87439 4 #include "rtos.h"
va009039 2:c10029b87439 5 #include "BaseUsbHost.h"
va009039 2:c10029b87439 6 #include "LogitechC270.h"
va009039 2:c10029b87439 7 #include "UvcCam.h"
va009039 2:c10029b87439 8 #include "UsbFlashDrive.h"
va009039 2:c10029b87439 9 #include "decodeMJPEG.h"
va009039 2:c10029b87439 10 #include "MyThread.h"
va009039 2:c10029b87439 11
va009039 2:c10029b87439 12 #define IMAGE_BUF_SIZE (1024*8)
va009039 2:c10029b87439 13 #define INTERVAL_S 10
va009039 2:c10029b87439 14 #define SHOT_N 5
va009039 2:c10029b87439 15 #define BASE_PATH "usb"
va009039 2:c10029b87439 16
va009039 2:c10029b87439 17 Serial pc(USBTX, USBRX);
va009039 2:c10029b87439 18 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
va009039 2:c10029b87439 19
va009039 2:c10029b87439 20 class captureJPEG : public MyThread, public decodeMJPEG {
va009039 2:c10029b87439 21 public:
va009039 2:c10029b87439 22 captureJPEG(BaseUvc* cam) {
va009039 2:c10029b87439 23 m_cam = cam;
va009039 2:c10029b87439 24 m_cam->setOnResult(this, &captureJPEG::callback_motion_jpeg);
va009039 2:c10029b87439 25 interval_t.start();
va009039 2:c10029b87439 26 shot = 0;
va009039 2:c10029b87439 27 for(buf_size = IMAGE_BUF_SIZE; ; buf_size -= 128) {
va009039 2:c10029b87439 28 buf = new uint8_t[buf_size];
va009039 2:c10029b87439 29 if (buf) {
va009039 2:c10029b87439 30 break;
va009039 2:c10029b87439 31 }
va009039 2:c10029b87439 32 }
va009039 2:c10029b87439 33 printf("%p buf size: %d\n", buf, buf_size);
va009039 2:c10029b87439 34 }
va009039 2:c10029b87439 35 int shot;
va009039 2:c10029b87439 36 Timer interval_t;
va009039 2:c10029b87439 37 protected:
va009039 2:c10029b87439 38 virtual void outputJPEG(uint8_t c, int status) {
va009039 2:c10029b87439 39 if (status == JPEG_START) {
va009039 2:c10029b87439 40 pos = 0;
va009039 2:c10029b87439 41 led2 = !led2;
va009039 2:c10029b87439 42 }
va009039 2:c10029b87439 43 if (pos < buf_size) {
va009039 2:c10029b87439 44 buf[pos++] = c;
va009039 2:c10029b87439 45 }
va009039 2:c10029b87439 46 if (status == JPEG_END) {
va009039 2:c10029b87439 47 led3 = !led3;
va009039 2:c10029b87439 48 if (interval_t.read_ms() > INTERVAL_S*1000) {
va009039 2:c10029b87439 49 interval_t.reset();
va009039 2:c10029b87439 50 led4 = !led4;
va009039 2:c10029b87439 51 if (shot < SHOT_N) {
va009039 2:c10029b87439 52 char path[32];
va009039 2:c10029b87439 53 snprintf(path, sizeof(path), "/%s/image%02d.jpg", BASE_PATH, shot);
va009039 2:c10029b87439 54 printf("%d %s %d bytes\n", shot, path, pos);
va009039 2:c10029b87439 55 FILE* fp = fopen(path, "wb");
va009039 2:c10029b87439 56 if (fp) {
va009039 2:c10029b87439 57 fwrite(buf, pos, 1, fp);
va009039 2:c10029b87439 58 fclose(fp);
va009039 2:c10029b87439 59 }
va009039 2:c10029b87439 60 shot++;
va009039 2:c10029b87439 61 }
va009039 2:c10029b87439 62 }
va009039 2:c10029b87439 63 }
va009039 2:c10029b87439 64 }
va009039 2:c10029b87439 65
va009039 2:c10029b87439 66 void callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len) {
va009039 2:c10029b87439 67 inputPacket(buf, len);
va009039 2:c10029b87439 68 if (buf[1]&1) { // FID
va009039 2:c10029b87439 69 led1 = !led1;
va009039 2:c10029b87439 70 }
va009039 2:c10029b87439 71 if (buf[1]&2) { // EOF
va009039 2:c10029b87439 72 led2 = !led2;
va009039 2:c10029b87439 73 }
va009039 2:c10029b87439 74 }
va009039 2:c10029b87439 75
va009039 2:c10029b87439 76 virtual void run() {
va009039 2:c10029b87439 77 while(true) {
va009039 2:c10029b87439 78 if (m_cam) {
va009039 2:c10029b87439 79 m_cam->poll();
va009039 2:c10029b87439 80 }
va009039 2:c10029b87439 81 }
va009039 2:c10029b87439 82 }
va009039 2:c10029b87439 83 uint8_t* buf;
va009039 2:c10029b87439 84 int buf_size;
va009039 2:c10029b87439 85 int pos;
va009039 2:c10029b87439 86 BaseUvc* m_cam;
va009039 2:c10029b87439 87 };
va009039 2:c10029b87439 88
va009039 2:c10029b87439 89 int main() {
va009039 2:c10029b87439 90 pc.baud(921600);
va009039 2:c10029b87439 91 printf("%s\n", __FILE__);
va009039 2:c10029b87439 92
va009039 2:c10029b87439 93 BaseUvc* cam = NULL;
va009039 2:c10029b87439 94 UsbFlashDrive* drive = NULL;
va009039 2:c10029b87439 95 BaseUsbHost* usbHost = new BaseUsbHost();
va009039 2:c10029b87439 96 UsbHub* hub = new UsbHub();
va009039 2:c10029b87439 97
va009039 2:c10029b87439 98 for(int i = 1; i <= MAX_HUB_PORT; i++) {
va009039 2:c10029b87439 99 ControlEp* ctlEp = hub->GetPortEp(i);
va009039 2:c10029b87439 100 if (drive == NULL && UsbFlashDrive::check(ctlEp)) {
va009039 2:c10029b87439 101 drive = new UsbFlashDrive("usb", ctlEp);
va009039 2:c10029b87439 102 }
va009039 2:c10029b87439 103 if (cam == NULL && LogitechC270::check(ctlEp)) {
va009039 2:c10029b87439 104 cam = new LogitechC270(C270_160x120, _5FPS, ctlEp);
va009039 2:c10029b87439 105 }
va009039 2:c10029b87439 106 if (cam == NULL && UvcCam::check(ctlEp)) {
va009039 2:c10029b87439 107 cam = new UvcCam(UVC_MJPEG, UVC_160x120, _5FPS, ctlEp);
va009039 2:c10029b87439 108 }
va009039 2:c10029b87439 109 }
va009039 2:c10029b87439 110 if (cam == NULL) {
va009039 2:c10029b87439 111 error("UVC cam not found\n");
va009039 2:c10029b87439 112 }
va009039 2:c10029b87439 113 if (drive == NULL) {
va009039 2:c10029b87439 114 error("USB flash drive not found\n");
va009039 2:c10029b87439 115 }
va009039 2:c10029b87439 116
va009039 2:c10029b87439 117 captureJPEG* capture = new captureJPEG(cam);
va009039 2:c10029b87439 118 printf("captureJPEG: %p %d\n", capture, sizeof(captureJPEG));
va009039 2:c10029b87439 119 capture->set_stack(DEFAULT_STACK_SIZE+256);
va009039 2:c10029b87439 120 capture->start();
va009039 2:c10029b87439 121
va009039 2:c10029b87439 122 for(int n = 0; ; n++) {
va009039 2:c10029b87439 123 printf("%d captureJPEG stack used: %d/%d bytes, interval %d/%d %d/%d sec\n",
va009039 2:c10029b87439 124 n, capture->stack_used(), capture->stack_size(),
va009039 2:c10029b87439 125 capture->shot, SHOT_N, capture->interval_t.read_ms()/1000, INTERVAL_S);
va009039 2:c10029b87439 126 printf("CC:");
va009039 2:c10029b87439 127 for(int i = 0; i < 16; i++) {
va009039 2:c10029b87439 128 printf(" %u", cam->report_cc_count[i]);
va009039 2:c10029b87439 129 }
va009039 2:c10029b87439 130 printf("\n");
va009039 2:c10029b87439 131 printf("PS:");
va009039 2:c10029b87439 132 for(int i = 0; i < 16; i++) {
va009039 2:c10029b87439 133 printf(" %u", cam->report_ps_cc_count[i]);
va009039 2:c10029b87439 134 }
va009039 2:c10029b87439 135 printf("\n");
va009039 2:c10029b87439 136 Thread::wait(3000);
va009039 2:c10029b87439 137 }
va009039 2:c10029b87439 138 }
va009039 2:c10029b87439 139
va009039 2:c10029b87439 140 #endif