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 #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