BaseUsbHost example program
Dependencies: BaseUsbHost FATFileSystem mbed mbed-rtos
example_captureYUY2.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 | #include "mbed.h" |
va009039 | 2:c10029b87439 | 3 | #include "rtos.h" |
va009039 | 2:c10029b87439 | 4 | #include "BaseUsbHost.h" |
va009039 | 2:c10029b87439 | 5 | #include "UvcCam.h" |
va009039 | 2:c10029b87439 | 6 | #include "MyThread.h" |
va009039 | 2:c10029b87439 | 7 | #include <bitset> |
va009039 | 2:c10029b87439 | 8 | |
va009039 | 2:c10029b87439 | 9 | Serial pc(USBTX, USBRX); |
va009039 | 2:c10029b87439 | 10 | DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); |
va009039 | 2:c10029b87439 | 11 | |
va009039 | 2:c10029b87439 | 12 | class decodeYUY2 { |
va009039 | 2:c10029b87439 | 13 | public: |
va009039 | 2:c10029b87439 | 14 | decodeYUY2() { |
va009039 | 2:c10029b87439 | 15 | xy = 0; |
va009039 | 2:c10029b87439 | 16 | } |
va009039 | 2:c10029b87439 | 17 | protected: |
va009039 | 2:c10029b87439 | 18 | void inputPacket(uint8_t* buf, int len) { |
va009039 | 2:c10029b87439 | 19 | for(int i = 12; i < len; i += 4) { |
va009039 | 2:c10029b87439 | 20 | outputY(xy, buf[i]); |
va009039 | 2:c10029b87439 | 21 | outputCb(xy+1, buf[i+1]); |
va009039 | 2:c10029b87439 | 22 | outputY(xy+2, buf[i+2]); |
va009039 | 2:c10029b87439 | 23 | outputCr(xy+3, buf[i+3]); |
va009039 | 2:c10029b87439 | 24 | xy += 4; |
va009039 | 2:c10029b87439 | 25 | } |
va009039 | 2:c10029b87439 | 26 | if (buf[1]&2) { //EOF |
va009039 | 2:c10029b87439 | 27 | xy = 0; |
va009039 | 2:c10029b87439 | 28 | } |
va009039 | 2:c10029b87439 | 29 | } |
va009039 | 2:c10029b87439 | 30 | virtual void outputY(int xy, uint8_t c)=0; |
va009039 | 2:c10029b87439 | 31 | virtual void outputCb(int xy, uint8_t c)=0; |
va009039 | 2:c10029b87439 | 32 | virtual void outputCr(int xy, uint8_t c)=0; |
va009039 | 2:c10029b87439 | 33 | int xy; |
va009039 | 2:c10029b87439 | 34 | }; |
va009039 | 2:c10029b87439 | 35 | |
va009039 | 2:c10029b87439 | 36 | class captureYUY2 : public MyThread, public decodeYUY2 { |
va009039 | 2:c10029b87439 | 37 | public: |
va009039 | 2:c10029b87439 | 38 | captureYUY2(BaseUvc* cam) { |
va009039 | 2:c10029b87439 | 39 | m_cam = cam; |
va009039 | 2:c10029b87439 | 40 | m_cam->setOnResult(this, &captureYUY2::callback); |
va009039 | 2:c10029b87439 | 41 | } |
va009039 | 2:c10029b87439 | 42 | bitset<160*120> bitmap; |
va009039 | 2:c10029b87439 | 43 | uint8_t buf[160]; |
va009039 | 2:c10029b87439 | 44 | protected: |
va009039 | 2:c10029b87439 | 45 | virtual void outputY(int xy, uint8_t c) { |
va009039 | 2:c10029b87439 | 46 | if (xy < bitmap.size()) { |
va009039 | 2:c10029b87439 | 47 | bitmap.set(xy, c > 0x80); |
va009039 | 2:c10029b87439 | 48 | } |
va009039 | 2:c10029b87439 | 49 | if (xy < sizeof(buf)) { |
va009039 | 2:c10029b87439 | 50 | buf[xy] = c; |
va009039 | 2:c10029b87439 | 51 | } |
va009039 | 2:c10029b87439 | 52 | } |
va009039 | 2:c10029b87439 | 53 | virtual void outputCb(int xy, uint8_t c) {} |
va009039 | 2:c10029b87439 | 54 | virtual void outputCr(int xy, uint8_t c) {} |
va009039 | 2:c10029b87439 | 55 | void callback(uint16_t frame, uint8_t* buf, int len) { |
va009039 | 2:c10029b87439 | 56 | inputPacket(buf, len); |
va009039 | 2:c10029b87439 | 57 | if (buf[1]&1) { // FID |
va009039 | 2:c10029b87439 | 58 | led1 = !led1; |
va009039 | 2:c10029b87439 | 59 | } |
va009039 | 2:c10029b87439 | 60 | if (buf[1]&2) { // EOF |
va009039 | 2:c10029b87439 | 61 | led2 = !led2; |
va009039 | 2:c10029b87439 | 62 | } |
va009039 | 2:c10029b87439 | 63 | } |
va009039 | 2:c10029b87439 | 64 | virtual void run() { |
va009039 | 2:c10029b87439 | 65 | while(true) { |
va009039 | 2:c10029b87439 | 66 | if (m_cam) { |
va009039 | 2:c10029b87439 | 67 | m_cam->poll(); |
va009039 | 2:c10029b87439 | 68 | } |
va009039 | 2:c10029b87439 | 69 | } |
va009039 | 2:c10029b87439 | 70 | } |
va009039 | 2:c10029b87439 | 71 | BaseUvc* m_cam; |
va009039 | 2:c10029b87439 | 72 | }; |
va009039 | 2:c10029b87439 | 73 | |
va009039 | 2:c10029b87439 | 74 | int main() { |
va009039 | 2:c10029b87439 | 75 | pc.baud(921600); |
va009039 | 2:c10029b87439 | 76 | printf("%s\n", __FILE__); |
va009039 | 2:c10029b87439 | 77 | |
va009039 | 2:c10029b87439 | 78 | BaseUsbHost* usbHost = new BaseUsbHost(); |
va009039 | 2:c10029b87439 | 79 | UsbHub* hub = new UsbHub(); |
va009039 | 2:c10029b87439 | 80 | BaseUvc* cam = NULL; |
va009039 | 2:c10029b87439 | 81 | for(int i = 1; i <= MAX_HUB_PORT; i++) { |
va009039 | 2:c10029b87439 | 82 | ControlEp* ctlEp = hub->GetPortEp(i); |
va009039 | 2:c10029b87439 | 83 | if (cam == NULL && UvcCam::check(ctlEp)) { |
va009039 | 2:c10029b87439 | 84 | cam = new UvcCam(UVC_YUY2, UVC_160x120, _5FPS, ctlEp); |
va009039 | 2:c10029b87439 | 85 | } |
va009039 | 2:c10029b87439 | 86 | } |
va009039 | 2:c10029b87439 | 87 | if (cam == NULL) { |
va009039 | 2:c10029b87439 | 88 | error("cam not found\n"); |
va009039 | 2:c10029b87439 | 89 | } |
va009039 | 2:c10029b87439 | 90 | captureYUY2* capture = new captureYUY2(cam); |
va009039 | 2:c10029b87439 | 91 | capture->set_stack(DEFAULT_STACK_SIZE-128*12); |
va009039 | 2:c10029b87439 | 92 | capture->start(); |
va009039 | 2:c10029b87439 | 93 | |
va009039 | 2:c10029b87439 | 94 | for(int n = 0; ; n++) { |
va009039 | 2:c10029b87439 | 95 | for(int y = 0; y < 120; y+= 6) { |
va009039 | 2:c10029b87439 | 96 | for(int x = 0; x < 160; x+= 3) { |
va009039 | 2:c10029b87439 | 97 | printf("%c", capture->bitmap[y*160+x] ? '*':'.'); |
va009039 | 2:c10029b87439 | 98 | } |
va009039 | 2:c10029b87439 | 99 | printf("\n"); |
va009039 | 2:c10029b87439 | 100 | } |
va009039 | 2:c10029b87439 | 101 | |
va009039 | 2:c10029b87439 | 102 | printf("%d captureYUY2 stack used: %d/%d bytes\n", n, capture->stack_used(), capture->stack_size()); |
va009039 | 2:c10029b87439 | 103 | printf("CC:"); // conditon code |
va009039 | 2:c10029b87439 | 104 | for(int i = 0; i < 16; i++) { |
va009039 | 2:c10029b87439 | 105 | printf(" %u", cam->report_cc_count[i]); |
va009039 | 2:c10029b87439 | 106 | } |
va009039 | 2:c10029b87439 | 107 | printf("\n"); |
va009039 | 2:c10029b87439 | 108 | printf("PS:"); // Packet status |
va009039 | 2:c10029b87439 | 109 | for(int i = 0; i < 16; i++) { |
va009039 | 2:c10029b87439 | 110 | printf(" %u", cam->report_ps_cc_count[i]); |
va009039 | 2:c10029b87439 | 111 | } |
va009039 | 2:c10029b87439 | 112 | printf("\n"); |
va009039 | 2:c10029b87439 | 113 | |
va009039 | 2:c10029b87439 | 114 | for(int i = 0; i < 64; i++) { |
va009039 | 2:c10029b87439 | 115 | printf("%02X ", capture->buf[i]); |
va009039 | 2:c10029b87439 | 116 | if (i%16==15) { |
va009039 | 2:c10029b87439 | 117 | printf("\n"); |
va009039 | 2:c10029b87439 | 118 | } |
va009039 | 2:c10029b87439 | 119 | } |
va009039 | 2:c10029b87439 | 120 | Thread::wait(400); |
va009039 | 2:c10029b87439 | 121 | led3 = !led3; |
va009039 | 2:c10029b87439 | 122 | } |
va009039 | 2:c10029b87439 | 123 | } |
va009039 | 2:c10029b87439 | 124 | |
va009039 | 2:c10029b87439 | 125 | #endif |