BaseUsbHost example program

Dependencies:   BaseUsbHost FATFileSystem mbed mbed-rtos

Committer:
va009039
Date:
Wed Dec 05 13:25:18 2012 +0000
Revision:
1:80205a2de336
add LifeCamVX700

Who changed what in which revision?

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