BaseUsbHost example program
Dependencies: BaseUsbHost FATFileSystem mbed mbed-rtos
example_captureYUY2.cpp
- Committer:
- va009039
- Date:
- 2012-12-11
- Revision:
- 2:c10029b87439
File content as of revision 2:c10029b87439:
#if 0 #include "mbed.h" #include "rtos.h" #include "BaseUsbHost.h" #include "UvcCam.h" #include "MyThread.h" #include <bitset> Serial pc(USBTX, USBRX); DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); class decodeYUY2 { public: decodeYUY2() { xy = 0; } protected: void inputPacket(uint8_t* buf, int len) { for(int i = 12; i < len; i += 4) { outputY(xy, buf[i]); outputCb(xy+1, buf[i+1]); outputY(xy+2, buf[i+2]); outputCr(xy+3, buf[i+3]); xy += 4; } if (buf[1]&2) { //EOF xy = 0; } } virtual void outputY(int xy, uint8_t c)=0; virtual void outputCb(int xy, uint8_t c)=0; virtual void outputCr(int xy, uint8_t c)=0; int xy; }; class captureYUY2 : public MyThread, public decodeYUY2 { public: captureYUY2(BaseUvc* cam) { m_cam = cam; m_cam->setOnResult(this, &captureYUY2::callback); } bitset<160*120> bitmap; uint8_t buf[160]; protected: virtual void outputY(int xy, uint8_t c) { if (xy < bitmap.size()) { bitmap.set(xy, c > 0x80); } if (xy < sizeof(buf)) { buf[xy] = c; } } virtual void outputCb(int xy, uint8_t c) {} virtual void outputCr(int xy, uint8_t c) {} void callback(uint16_t frame, uint8_t* buf, int len) { inputPacket(buf, len); if (buf[1]&1) { // FID led1 = !led1; } if (buf[1]&2) { // EOF led2 = !led2; } } virtual void run() { while(true) { if (m_cam) { m_cam->poll(); } } } BaseUvc* m_cam; }; int main() { pc.baud(921600); printf("%s\n", __FILE__); BaseUsbHost* usbHost = new BaseUsbHost(); UsbHub* hub = new UsbHub(); BaseUvc* cam = NULL; for(int i = 1; i <= MAX_HUB_PORT; i++) { ControlEp* ctlEp = hub->GetPortEp(i); if (cam == NULL && UvcCam::check(ctlEp)) { cam = new UvcCam(UVC_YUY2, UVC_160x120, _5FPS, ctlEp); } } if (cam == NULL) { error("cam not found\n"); } captureYUY2* capture = new captureYUY2(cam); capture->set_stack(DEFAULT_STACK_SIZE-128*12); capture->start(); for(int n = 0; ; n++) { for(int y = 0; y < 120; y+= 6) { for(int x = 0; x < 160; x+= 3) { printf("%c", capture->bitmap[y*160+x] ? '*':'.'); } printf("\n"); } printf("%d captureYUY2 stack used: %d/%d bytes\n", n, capture->stack_used(), capture->stack_size()); printf("CC:"); // conditon code for(int i = 0; i < 16; i++) { printf(" %u", cam->report_cc_count[i]); } printf("\n"); printf("PS:"); // Packet status for(int i = 0; i < 16; i++) { printf(" %u", cam->report_ps_cc_count[i]); } printf("\n"); for(int i = 0; i < 64; i++) { printf("%02X ", capture->buf[i]); if (i%16==15) { printf("\n"); } } Thread::wait(400); led3 = !led3; } } #endif