BaseJpegDeocde exampe program

Dependencies:   BaseJpegDecode Terminal BaseUsbHost mbed mbed-rtos

Fork of BaseJpegDecode by Norimasa Okamoto

example1_c270.cpp

Committer:
va009039
Date:
2012-10-07
Revision:
0:7121d9fb45f4
Child:
2:697ebeb8336f

File content as of revision 0:7121d9fb45f4:

#if 1
#include "mbed.h"
#include "BaseJpegDecode.h"
#include "uvc.h"

// Logitech C270
#define WIDTH  320
#define HEIGHT 176

#define ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};

DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
Serial pc(USBTX, USBRX);

class CalcCenter : public BaseJpegDecode {
public:
    int y_center, x_center;
    int m_x_sum, m_y_sum, m_sum;
    int8_t m_buf[WIDTH/16*HEIGHT/8];
    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
            m_buf[mcu] = value; // debug
            if (value >= 2) { // 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
            led2 = !led2;
        }
    };
};

CalcCenter* calc = NULL;

void callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len)
{
    if (calc) {
        calc->input(buf+12, len-12);
    }
    led1 = buf[1]&1; // FID
}

int main() {
    pc.baud(921600);
    printf("%s\n", __FILE__);

    calc = new CalcCenter;
    ASSERT(calc);
    uvc* cam = new uvc;
    ASSERT(cam);
    cam->SetImageSize(WIDTH, HEIGHT);
    cam->SetFrameInterval(2000000); // 5.0fps
    cam->setOnResult(callback_motion_jpeg);
    ASSERT(cam->setup() >= 0);
    while(1) {
        printf("\n"); // start debug dump
        for(int y = 0; y < HEIGHT/8; y++) {
            for(int x = 0; x < WIDTH/16; x++) {
                printf("%+3d,", calc->m_buf[y*WIDTH/16+x]);
                cam->poll();
            }
            printf("\n");
        }
        printf("red:(%d,%d)\n", calc->x_center, calc->y_center);
        cam->wait_ms(500);
        led3 = !led3;
    }
}
#endif