BaseJpegDeocde exampe program

Dependencies:   BaseJpegDecode Terminal BaseUsbHost mbed mbed-rtos

Fork of BaseJpegDecode by Norimasa Okamoto

Committer:
va009039
Date:
Sun Jan 27 11:15:26 2013 +0000
Revision:
7:3ad9c948bc06
change library uvchost to BaseUsbHost, delete SimpleJpegDecode

Who changed what in which revision?

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