BaseUsbHost example program

Dependencies:   BaseUsbHost FATFileSystem mbed mbed-rtos

Committer:
va009039
Date:
Tue Dec 04 13:39:57 2012 +0000
Revision:
0:2a9734a95d55
Child:
1:80205a2de336
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:2a9734a95d55 1 #if 1
va009039 0:2a9734a95d55 2 //
va009039 0:2a9734a95d55 3 // simple color tracking
va009039 0:2a9734a95d55 4 //
va009039 0:2a9734a95d55 5 #include "mbed.h"
va009039 0:2a9734a95d55 6 #include "rtos.h"
va009039 0:2a9734a95d55 7 #include "BaseUsbHost.h"
va009039 0:2a9734a95d55 8 #define DEBUG
va009039 0:2a9734a95d55 9 #include "BaseUsbHostDebug.h"
va009039 0:2a9734a95d55 10 #define TEST
va009039 0:2a9734a95d55 11 #include "BaseUsbHostTest.h"
va009039 0:2a9734a95d55 12 #include "LogitechC270.h"
va009039 0:2a9734a95d55 13 #include "BaseJpegDecode.h"
va009039 0:2a9734a95d55 14 #include "Terminal.h"
va009039 0:2a9734a95d55 15
va009039 0:2a9734a95d55 16 // Logitech C270
va009039 0:2a9734a95d55 17 #define WIDTH 160
va009039 0:2a9734a95d55 18 #define HEIGHT 120
va009039 0:2a9734a95d55 19
va009039 0:2a9734a95d55 20 #define THRESHOLD 200
va009039 0:2a9734a95d55 21
va009039 0:2a9734a95d55 22 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
va009039 0:2a9734a95d55 23 Terminal term(USBTX, USBRX);
va009039 0:2a9734a95d55 24
va009039 0:2a9734a95d55 25 class CalcCenter : public BaseJpegDecode {
va009039 0:2a9734a95d55 26 public:
va009039 0:2a9734a95d55 27 int y_center, x_center;
va009039 0:2a9734a95d55 28 int m_x_sum, m_y_sum, m_sum;
va009039 0:2a9734a95d55 29 uint32_t EOI_count;
va009039 0:2a9734a95d55 30 int16_t m_buf[WIDTH/16*HEIGHT/8];
va009039 0:2a9734a95d55 31 CalcCenter():EOI_count(0) {
va009039 0:2a9734a95d55 32 memset(m_buf, 0, sizeof(m_buf));
va009039 0:2a9734a95d55 33 }
va009039 0:2a9734a95d55 34 virtual void outputDC(int mcu, int block, int value) {
va009039 0:2a9734a95d55 35 if (mcu >= (WIDTH/16*HEIGHT/8)) {
va009039 0:2a9734a95d55 36 return;
va009039 0:2a9734a95d55 37 }
va009039 0:2a9734a95d55 38 if (block == 3) { // 0-1:Y 2:Cb 3:Cr
va009039 0:2a9734a95d55 39 value *= qt[1][0];
va009039 0:2a9734a95d55 40 m_buf[mcu] = value; // debug
va009039 0:2a9734a95d55 41 if (value >= THRESHOLD) { // red
va009039 0:2a9734a95d55 42 m_x_sum += value*(mcu%(WIDTH/16));
va009039 0:2a9734a95d55 43 m_y_sum += value*(mcu/(WIDTH/16));
va009039 0:2a9734a95d55 44 m_sum += value;
va009039 0:2a9734a95d55 45 }
va009039 0:2a9734a95d55 46 }
va009039 0:2a9734a95d55 47 }
va009039 0:2a9734a95d55 48 virtual void outputAC(int mcu, int block, int scan, int value){};
va009039 0:2a9734a95d55 49 virtual void outputMARK(uint8_t c){
va009039 0:2a9734a95d55 50 if (c == 0xd9) { // EOI
va009039 0:2a9734a95d55 51 if(m_sum == 0) {
va009039 0:2a9734a95d55 52 x_center = y_center = -1; // not found
va009039 0:2a9734a95d55 53 } else {
va009039 0:2a9734a95d55 54 x_center = m_x_sum / m_sum;
va009039 0:2a9734a95d55 55 y_center = m_y_sum / m_sum;
va009039 0:2a9734a95d55 56 }
va009039 0:2a9734a95d55 57 m_x_sum = m_y_sum = m_sum = 0; // reset
va009039 0:2a9734a95d55 58 EOI_count++;
va009039 0:2a9734a95d55 59 led3 = !led3;
va009039 0:2a9734a95d55 60 }
va009039 0:2a9734a95d55 61 };
va009039 0:2a9734a95d55 62 };
va009039 0:2a9734a95d55 63
va009039 0:2a9734a95d55 64 CalcCenter* calc = NULL;
va009039 0:2a9734a95d55 65 void callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len)
va009039 0:2a9734a95d55 66 {
va009039 0:2a9734a95d55 67 if (calc) {
va009039 0:2a9734a95d55 68 calc->input(buf+12, len-12);
va009039 0:2a9734a95d55 69 }
va009039 0:2a9734a95d55 70 if (buf[1]&1) { // FID
va009039 0:2a9734a95d55 71 led1 = !led1;
va009039 0:2a9734a95d55 72 }
va009039 0:2a9734a95d55 73 }
va009039 0:2a9734a95d55 74
va009039 0:2a9734a95d55 75 BaseUsbHost *UsbHost;
va009039 0:2a9734a95d55 76 UsbHub* hub;
va009039 0:2a9734a95d55 77 ControlEp* ctlEp = NULL;
va009039 0:2a9734a95d55 78 LogitechC270* cam;
va009039 0:2a9734a95d55 79
va009039 0:2a9734a95d55 80 void display_thread(void const *args) {
va009039 0:2a9734a95d55 81 Timer t;
va009039 0:2a9734a95d55 82 term.cls();
va009039 0:2a9734a95d55 83 int fg, old_fg = 0xffffff;
va009039 0:2a9734a95d55 84 while(1) {
va009039 0:2a9734a95d55 85 int y;
va009039 0:2a9734a95d55 86 for(y = 0; y < HEIGHT/8; y++) {
va009039 0:2a9734a95d55 87 term.locate(0, y);
va009039 0:2a9734a95d55 88 for(int x = 0; x < WIDTH/16; x++) {
va009039 0:2a9734a95d55 89 int value = calc->m_buf[y*WIDTH/16+x];
va009039 0:2a9734a95d55 90 if (value >= THRESHOLD) {
va009039 0:2a9734a95d55 91 fg = 0xff0000; // red
va009039 0:2a9734a95d55 92 } else {
va009039 0:2a9734a95d55 93 fg = 0xffffff; // white
va009039 0:2a9734a95d55 94 }
va009039 0:2a9734a95d55 95 if (fg != old_fg) {
va009039 0:2a9734a95d55 96 term.foreground(fg);
va009039 0:2a9734a95d55 97 old_fg = fg;
va009039 0:2a9734a95d55 98 }
va009039 0:2a9734a95d55 99 term.printf("%+4d,", value);
va009039 0:2a9734a95d55 100 }
va009039 0:2a9734a95d55 101 }
va009039 0:2a9734a95d55 102 term.locate(0, y);
va009039 0:2a9734a95d55 103 term.printf("Cr:(%d,%d)[width=%d height=%d yblock=%d %u %u]\n",
va009039 0:2a9734a95d55 104 calc->x_center, calc->y_center, calc->width, calc->height, calc->yblock, calc->EOI_count, t.read_ms()/1000);
va009039 0:2a9734a95d55 105 term.printf("[CC:");
va009039 0:2a9734a95d55 106 for(int i = 0; i < 16; i++) {
va009039 0:2a9734a95d55 107 term.printf(" %u", cam->report_cc_count[i]);
va009039 0:2a9734a95d55 108 }
va009039 0:2a9734a95d55 109 term.printf("]\n");
va009039 0:2a9734a95d55 110 term.printf("[PS:");
va009039 0:2a9734a95d55 111 for(int i = 0; i < 16; i++) {
va009039 0:2a9734a95d55 112 term.printf(" %u", cam->report_ps_cc_count[i]);
va009039 0:2a9734a95d55 113 }
va009039 0:2a9734a95d55 114 term.printf("]\n");
va009039 0:2a9734a95d55 115 Thread::wait(200);
va009039 0:2a9734a95d55 116 //Thread::signal_wait(1, 2000);
va009039 0:2a9734a95d55 117 led2 = !led2;
va009039 0:2a9734a95d55 118 }
va009039 0:2a9734a95d55 119 }
va009039 0:2a9734a95d55 120
va009039 0:2a9734a95d55 121 int main() {
va009039 0:2a9734a95d55 122 term.baud(921600);
va009039 0:2a9734a95d55 123 term.printf("%s\n", __FILE__);
va009039 0:2a9734a95d55 124
va009039 0:2a9734a95d55 125 calc = new CalcCenter;
va009039 0:2a9734a95d55 126 TEST_ASSERT(calc);
va009039 0:2a9734a95d55 127
va009039 0:2a9734a95d55 128 UsbHost = new BaseUsbHost;
va009039 0:2a9734a95d55 129 TEST_ASSERT_TRUE(UsbHost);
va009039 0:2a9734a95d55 130
va009039 0:2a9734a95d55 131 UsbHub* hub = new UsbHub();
va009039 0:2a9734a95d55 132 TEST_ASSERT_TRUE(hub);
va009039 0:2a9734a95d55 133
va009039 0:2a9734a95d55 134 for(int i = 0; i < 4; i++) {
va009039 0:2a9734a95d55 135 if (hub->PortEp[i]) {
va009039 0:2a9734a95d55 136 if (hub->PortEp[i]->DeviceClass == 0x02) {
va009039 0:2a9734a95d55 137 ctlEp = hub->PortEp[i];
va009039 0:2a9734a95d55 138 break;
va009039 0:2a9734a95d55 139 }
va009039 0:2a9734a95d55 140 }
va009039 0:2a9734a95d55 141 }
va009039 0:2a9734a95d55 142
va009039 0:2a9734a95d55 143 cam = new LogitechC270(C270_160x120, _15FPS, ctlEp);
va009039 0:2a9734a95d55 144 TEST_ASSERT_TRUE(cam);
va009039 0:2a9734a95d55 145 cam->setOnResult(callback_motion_jpeg);
va009039 0:2a9734a95d55 146
va009039 0:2a9734a95d55 147 Thread thread(display_thread, NULL, osPriorityBelowNormal);
va009039 0:2a9734a95d55 148
va009039 0:2a9734a95d55 149 while(1) {
va009039 0:2a9734a95d55 150 cam->poll();
va009039 0:2a9734a95d55 151 }
va009039 0:2a9734a95d55 152 }
va009039 0:2a9734a95d55 153 #endif