BaseUsbHost example program
Dependencies: BaseUsbHost FATFileSystem mbed mbed-rtos
Diff: example1_LogitechC270.cpp
- Revision:
- 2:c10029b87439
- Parent:
- 1:80205a2de336
- Child:
- 3:6ae9a03a6145
--- a/example1_LogitechC270.cpp Wed Dec 05 13:25:18 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,154 +0,0 @@ -#if 1 -// -// simple color tracking -// -#include "mbed.h" -#include "rtos.h" -#include "BaseUsbHost.h" -#define DEBUG -#include "BaseUsbHostDebug.h" -#define TEST -#include "BaseUsbHostTest.h" -#include "LogitechC270.h" -#include "BaseJpegDecode.h" -#include "Terminal.h" - -// Logitech C270 -#define WIDTH 160 -#define HEIGHT 120 - -#define THRESHOLD 200 - -DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); -Terminal term(USBTX, USBRX); - -class CalcCenter : public BaseJpegDecode { -public: - int y_center, x_center; - int m_x_sum, m_y_sum, m_sum; - uint32_t EOI_count; - int16_t m_buf[WIDTH/16*HEIGHT/8]; - CalcCenter():EOI_count(0) { - memset(m_buf, 0, sizeof(m_buf)); - } - virtual void outputDC(int mcu, int block, int value) { - if (mcu >= (WIDTH/16*HEIGHT/8)) { - return; - } - if (block == 3) { // 0-1:Y 2:Cb 3:Cr - value *= qt[1][0]; - m_buf[mcu] = value; // debug - if (value >= THRESHOLD) { // red - m_x_sum += value*(mcu%(WIDTH/16)); - m_y_sum += value*(mcu/(WIDTH/16)); - m_sum += value; - } - } - } - virtual void outputAC(int mcu, int block, int scan, int value){}; - virtual void outputMARK(uint8_t c){ - if (c == 0xd9) { // EOI - if(m_sum == 0) { - x_center = y_center = -1; // not found - } else { - x_center = m_x_sum / m_sum; - y_center = m_y_sum / m_sum; - } - m_x_sum = m_y_sum = m_sum = 0; // reset - EOI_count++; - led3 = !led3; - } - }; -}; - -CalcCenter* calc = NULL; -void callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len) -{ - if (calc) { - calc->input(buf+12, len-12); - } - if (buf[1]&1) { // FID - led1 = !led1; - } -} - -BaseUsbHost *UsbHost; -UsbHub* hub; -ControlEp* ctlEp = NULL; -LogitechC270* cam; - -void display_thread(void const *args) { - Timer t; - term.cls(); - int fg, old_fg = 0xffffff; - while(1) { - int y; - for(y = 0; y < HEIGHT/8; y++) { - term.locate(0, y); - for(int x = 0; x < WIDTH/16; x++) { - int value = calc->m_buf[y*WIDTH/16+x]; - if (value >= THRESHOLD) { - fg = 0xff0000; // red - } else { - fg = 0xffffff; // white - } - if (fg != old_fg) { - term.foreground(fg); - old_fg = fg; - } - term.printf("%+4d,", value); - } - } - term.locate(0, y); - term.printf("Cr:(%d,%d)[width=%d height=%d yblock=%d %u]\n", - calc->x_center, calc->y_center, calc->width, calc->height, calc->yblock, calc->EOI_count); - term.printf("[CC:"); - for(int i = 0; i < 16; i++) { - term.printf(" %u", cam->report_cc_count[i]); - } - term.printf("]\n"); - term.printf("[PS:"); - for(int i = 0; i < 16; i++) { - term.printf(" %u", cam->report_ps_cc_count[i]); - } - term.printf("]\n"); - Thread::wait(200); - //Thread::signal_wait(1, 2000); - led2 = !led2; - } -} - -int main() { - term.baud(921600); - term.printf("%s\n", __FILE__); - - calc = new CalcCenter; - TEST_ASSERT(calc); - - UsbHost = new BaseUsbHost; - TEST_ASSERT_TRUE(UsbHost); - - UsbHub* hub = new UsbHub(); - TEST_ASSERT_TRUE(hub); - - for(int i = 0; i < MAX_HUB_PORT; i++) { - if (LogitechC270::check(hub->PortEp[i])) { - ctlEp = hub->PortEp[i]; - break; - } - } - if (ctlEp == NULL) { - error("LogitechC270 not found\n"); - } - - cam = new LogitechC270(C270_160x120, _15FPS, ctlEp); - TEST_ASSERT_TRUE(cam); - cam->setOnResult(callback_motion_jpeg); - - Thread thread(display_thread, NULL, osPriorityBelowNormal); - - while(1) { - cam->poll(); - } -} -#endif