BaseUsbHost example program
Dependencies: BaseUsbHost FATFileSystem mbed mbed-rtos
example2_LifeCamVX700.cpp@1:80205a2de336, 2012-12-05 (annotated)
- Committer:
- va009039
- Date:
- Wed Dec 05 13:25:18 2012 +0000
- Revision:
- 1:80205a2de336
add LifeCamVX700
Who changed what in which revision?
User | Revision | Line number | New 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 |