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