BaseUsbHost example program
Dependencies: BaseUsbHost FATFileSystem mbed mbed-rtos
example_captureJPEG.cpp@2:c10029b87439, 2012-12-11 (annotated)
- Committer:
- va009039
- Date:
- Tue Dec 11 15:28:00 2012 +0000
- Revision:
- 2:c10029b87439
add example
Who changed what in which revision?
User | Revision | Line number | New 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 |