BaseUsbHost example program
Dependencies: BaseUsbHost FATFileSystem mbed mbed-rtos
example2_LogitechC270.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 1 |
va009039 | 2:c10029b87439 | 2 | // example2_LogitechC270.cpp |
va009039 | 2:c10029b87439 | 3 | // |
va009039 | 2:c10029b87439 | 4 | // simple color tracking |
va009039 | 2:c10029b87439 | 5 | // |
va009039 | 2:c10029b87439 | 6 | #include "mbed.h" |
va009039 | 2:c10029b87439 | 7 | #include "rtos.h" |
va009039 | 2:c10029b87439 | 8 | #include "BaseUsbHost.h" |
va009039 | 2:c10029b87439 | 9 | #include "LogitechC270.h" |
va009039 | 2:c10029b87439 | 10 | #include "UvcCam.h" |
va009039 | 2:c10029b87439 | 11 | #include "BaseJpegDecode.h" |
va009039 | 2:c10029b87439 | 12 | #include "Terminal.h" |
va009039 | 2:c10029b87439 | 13 | #include "MyThread.h" |
va009039 | 2:c10029b87439 | 14 | |
va009039 | 2:c10029b87439 | 15 | // Logitech C270 |
va009039 | 2:c10029b87439 | 16 | #define WIDTH 160 |
va009039 | 2:c10029b87439 | 17 | #define HEIGHT 120 |
va009039 | 2:c10029b87439 | 18 | |
va009039 | 2:c10029b87439 | 19 | #define THRESHOLD 200 |
va009039 | 2:c10029b87439 | 20 | |
va009039 | 2:c10029b87439 | 21 | DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); |
va009039 | 2:c10029b87439 | 22 | Terminal term(USBTX, USBRX); |
va009039 | 2:c10029b87439 | 23 | |
va009039 | 2:c10029b87439 | 24 | class CalcCenter : public MyThread, public BaseJpegDecode { |
va009039 | 2:c10029b87439 | 25 | public: |
va009039 | 2:c10029b87439 | 26 | int y_center, x_center; |
va009039 | 2:c10029b87439 | 27 | int m_x_sum, m_y_sum, m_sum; |
va009039 | 2:c10029b87439 | 28 | uint32_t EOI_count; |
va009039 | 2:c10029b87439 | 29 | int16_t buf_Cb[WIDTH/16*HEIGHT/8]; // debug |
va009039 | 2:c10029b87439 | 30 | int16_t buf_Cr[WIDTH/16*HEIGHT/8]; // debug |
va009039 | 2:c10029b87439 | 31 | CalcCenter(BaseUvc* cam) { |
va009039 | 2:c10029b87439 | 32 | m_cam = cam; |
va009039 | 2:c10029b87439 | 33 | m_cam->setOnResult(this, &CalcCenter::callback_motion_jpeg); |
va009039 | 2:c10029b87439 | 34 | EOI_count = 0; |
va009039 | 2:c10029b87439 | 35 | } |
va009039 | 2:c10029b87439 | 36 | protected: |
va009039 | 2:c10029b87439 | 37 | void callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len) { |
va009039 | 2:c10029b87439 | 38 | input(buf+12, len-12); |
va009039 | 2:c10029b87439 | 39 | if (buf[1]&1) { // FID |
va009039 | 2:c10029b87439 | 40 | led1 = !led1; |
va009039 | 2:c10029b87439 | 41 | } |
va009039 | 2:c10029b87439 | 42 | } |
va009039 | 2:c10029b87439 | 43 | |
va009039 | 2:c10029b87439 | 44 | virtual void outputDC(int mcu, int block, int value) { |
va009039 | 2:c10029b87439 | 45 | if (mcu >= (WIDTH/16*HEIGHT/8)) { |
va009039 | 2:c10029b87439 | 46 | return; |
va009039 | 2:c10029b87439 | 47 | } |
va009039 | 2:c10029b87439 | 48 | if (block == 2) { |
va009039 | 2:c10029b87439 | 49 | buf_Cb[mcu] = value * qt[1][0]; |
va009039 | 2:c10029b87439 | 50 | } else if (block == 3) { // 0-1:Y 2:Cb 3:Cr |
va009039 | 2:c10029b87439 | 51 | buf_Cr[mcu] = value * qt[1][0]; |
va009039 | 2:c10029b87439 | 52 | value *= qt[1][0]; |
va009039 | 2:c10029b87439 | 53 | if (value >= THRESHOLD) { // red |
va009039 | 2:c10029b87439 | 54 | m_x_sum += value*(mcu%(WIDTH/16)); |
va009039 | 2:c10029b87439 | 55 | m_y_sum += value*(mcu/(WIDTH/16)); |
va009039 | 2:c10029b87439 | 56 | m_sum += value; |
va009039 | 2:c10029b87439 | 57 | } |
va009039 | 2:c10029b87439 | 58 | } |
va009039 | 2:c10029b87439 | 59 | } |
va009039 | 2:c10029b87439 | 60 | virtual void outputAC(int mcu, int block, int scan, int value){}; |
va009039 | 2:c10029b87439 | 61 | virtual void outputMARK(uint8_t c){ |
va009039 | 2:c10029b87439 | 62 | if (c == 0xd9) { // EOI |
va009039 | 2:c10029b87439 | 63 | if(m_sum == 0) { |
va009039 | 2:c10029b87439 | 64 | x_center = y_center = -1; // not found |
va009039 | 2:c10029b87439 | 65 | } else { |
va009039 | 2:c10029b87439 | 66 | x_center = m_x_sum / m_sum; |
va009039 | 2:c10029b87439 | 67 | y_center = m_y_sum / m_sum; |
va009039 | 2:c10029b87439 | 68 | } |
va009039 | 2:c10029b87439 | 69 | m_x_sum = m_y_sum = m_sum = 0; // reset |
va009039 | 2:c10029b87439 | 70 | EOI_count++; |
va009039 | 2:c10029b87439 | 71 | led3 = !led3; |
va009039 | 2:c10029b87439 | 72 | } |
va009039 | 2:c10029b87439 | 73 | } |
va009039 | 2:c10029b87439 | 74 | |
va009039 | 2:c10029b87439 | 75 | virtual void run() { |
va009039 | 2:c10029b87439 | 76 | while(true) { |
va009039 | 2:c10029b87439 | 77 | if (m_cam) { |
va009039 | 2:c10029b87439 | 78 | m_cam->poll(); |
va009039 | 2:c10029b87439 | 79 | } |
va009039 | 2:c10029b87439 | 80 | } |
va009039 | 2:c10029b87439 | 81 | } |
va009039 | 2:c10029b87439 | 82 | BaseUvc* m_cam; |
va009039 | 2:c10029b87439 | 83 | }; |
va009039 | 2:c10029b87439 | 84 | |
va009039 | 2:c10029b87439 | 85 | BaseUvc* cam = NULL; |
va009039 | 2:c10029b87439 | 86 | CalcCenter* calc = NULL; |
va009039 | 2:c10029b87439 | 87 | |
va009039 | 2:c10029b87439 | 88 | #define PI 3.14159265 |
va009039 | 2:c10029b87439 | 89 | |
va009039 | 2:c10029b87439 | 90 | class display_Thread : public MyThread { |
va009039 | 2:c10029b87439 | 91 | virtual void run() { |
va009039 | 2:c10029b87439 | 92 | term.cls(); |
va009039 | 2:c10029b87439 | 93 | int fg, old_fg = 0xffffff; |
va009039 | 2:c10029b87439 | 94 | while(1) { |
va009039 | 2:c10029b87439 | 95 | int column = 0; |
va009039 | 2:c10029b87439 | 96 | for(int y = 0; y < HEIGHT/8; y++) { |
va009039 | 2:c10029b87439 | 97 | term.locate(0, column++); |
va009039 | 2:c10029b87439 | 98 | for(int x = 0; x < WIDTH/16; x++) { |
va009039 | 2:c10029b87439 | 99 | int value = calc->buf_Cr[y*WIDTH/16+x]; |
va009039 | 2:c10029b87439 | 100 | if (value >= THRESHOLD) { |
va009039 | 2:c10029b87439 | 101 | fg = 0xff0000; // red |
va009039 | 2:c10029b87439 | 102 | } else { |
va009039 | 2:c10029b87439 | 103 | fg = 0xffffff; // white |
va009039 | 2:c10029b87439 | 104 | } |
va009039 | 2:c10029b87439 | 105 | if (fg != old_fg) { |
va009039 | 2:c10029b87439 | 106 | term.foreground(fg); |
va009039 | 2:c10029b87439 | 107 | old_fg = fg; |
va009039 | 2:c10029b87439 | 108 | } |
va009039 | 2:c10029b87439 | 109 | term.printf("%+4d,", value); |
va009039 | 2:c10029b87439 | 110 | } |
va009039 | 2:c10029b87439 | 111 | } |
va009039 | 2:c10029b87439 | 112 | term.locate(0, column++); |
va009039 | 2:c10029b87439 | 113 | term.printf("Cr:(%d,%d)", calc->x_center, calc->y_center); |
va009039 | 2:c10029b87439 | 114 | #if 0 |
va009039 | 2:c10029b87439 | 115 | for(int y = 0; y < HEIGHT/8; y++) { |
va009039 | 2:c10029b87439 | 116 | term.locate(0, column++); |
va009039 | 2:c10029b87439 | 117 | for(int x = 0; x < WIDTH/16; x++) { |
va009039 | 2:c10029b87439 | 118 | float Cb = calc->buf_Cb[y*WIDTH/16+x]; |
va009039 | 2:c10029b87439 | 119 | float Cr = calc->buf_Cr[y*WIDTH/16+x]; |
va009039 | 2:c10029b87439 | 120 | float value; |
va009039 | 2:c10029b87439 | 121 | if (Cb == 0.0) { |
va009039 | 2:c10029b87439 | 122 | value = 0.0; |
va009039 | 2:c10029b87439 | 123 | } else { |
va009039 | 2:c10029b87439 | 124 | value = (atan(Cr / Cb) + PI/2.0)* 360.0 / PI; |
va009039 | 2:c10029b87439 | 125 | } |
va009039 | 2:c10029b87439 | 126 | term.printf("%3.0f,", value); |
va009039 | 2:c10029b87439 | 127 | } |
va009039 | 2:c10029b87439 | 128 | } |
va009039 | 2:c10029b87439 | 129 | #endif |
va009039 | 2:c10029b87439 | 130 | term.locate(0, column++); |
va009039 | 2:c10029b87439 | 131 | term.printf("width=%d height=%d yblock=%d EOI: %u]\n", |
va009039 | 2:c10029b87439 | 132 | calc->width, calc->height, calc->yblock, calc->EOI_count); |
va009039 | 2:c10029b87439 | 133 | term.printf("CC:"); |
va009039 | 2:c10029b87439 | 134 | for(int i = 0; i < 16; i++) { |
va009039 | 2:c10029b87439 | 135 | term.printf(" %u", cam->report_cc_count[i]); |
va009039 | 2:c10029b87439 | 136 | } |
va009039 | 2:c10029b87439 | 137 | term.printf("]\n"); |
va009039 | 2:c10029b87439 | 138 | term.printf("PS:"); |
va009039 | 2:c10029b87439 | 139 | for(int i = 0; i < 16; i++) { |
va009039 | 2:c10029b87439 | 140 | term.printf(" %u", cam->report_ps_cc_count[i]); |
va009039 | 2:c10029b87439 | 141 | } |
va009039 | 2:c10029b87439 | 142 | term.printf("]\n"); |
va009039 | 2:c10029b87439 | 143 | Thread::wait(200); |
va009039 | 2:c10029b87439 | 144 | led2 = !led2; |
va009039 | 2:c10029b87439 | 145 | } |
va009039 | 2:c10029b87439 | 146 | } |
va009039 | 2:c10029b87439 | 147 | }; |
va009039 | 2:c10029b87439 | 148 | |
va009039 | 2:c10029b87439 | 149 | int main() { |
va009039 | 2:c10029b87439 | 150 | term.baud(921600); |
va009039 | 2:c10029b87439 | 151 | term.printf("%s\n", __FILE__); |
va009039 | 2:c10029b87439 | 152 | |
va009039 | 2:c10029b87439 | 153 | BaseUsbHost* UsbHost = new BaseUsbHost; |
va009039 | 2:c10029b87439 | 154 | UsbHub* hub = new UsbHub(); |
va009039 | 2:c10029b87439 | 155 | |
va009039 | 2:c10029b87439 | 156 | for(int port = 1; port <= MAX_HUB_PORT; port++) { |
va009039 | 2:c10029b87439 | 157 | ControlEp* ctlEp = hub->GetPortEp(port); |
va009039 | 2:c10029b87439 | 158 | if (LogitechC270::check(ctlEp)) { |
va009039 | 2:c10029b87439 | 159 | cam = new LogitechC270(C270_160x120, _10FPS, ctlEp); |
va009039 | 2:c10029b87439 | 160 | break; |
va009039 | 2:c10029b87439 | 161 | } |
va009039 | 2:c10029b87439 | 162 | if (UvcCam::check(ctlEp)) { |
va009039 | 2:c10029b87439 | 163 | cam = new UvcCam(UVC_MJPEG, UVC_160x120, _10FPS, ctlEp); |
va009039 | 2:c10029b87439 | 164 | break; |
va009039 | 2:c10029b87439 | 165 | } |
va009039 | 2:c10029b87439 | 166 | } |
va009039 | 2:c10029b87439 | 167 | if (cam == NULL) { |
va009039 | 2:c10029b87439 | 168 | error("USB camera not found\n"); |
va009039 | 2:c10029b87439 | 169 | } |
va009039 | 2:c10029b87439 | 170 | calc = new CalcCenter(cam); |
va009039 | 2:c10029b87439 | 171 | calc->start(); |
va009039 | 2:c10029b87439 | 172 | |
va009039 | 2:c10029b87439 | 173 | display_Thread* th = new display_Thread; |
va009039 | 2:c10029b87439 | 174 | th->start(osPriorityBelowNormal); |
va009039 | 2:c10029b87439 | 175 | |
va009039 | 2:c10029b87439 | 176 | Thread::wait(osWaitForever); |
va009039 | 2:c10029b87439 | 177 | } |
va009039 | 2:c10029b87439 | 178 | #endif |