BaseJpegDeocde exampe program

Dependencies:   BaseJpegDecode Terminal BaseUsbHost mbed mbed-rtos

Fork of BaseJpegDecode by Norimasa Okamoto

Committer:
va009039
Date:
Sun Oct 07 12:03:40 2012 +0000
Revision:
0:7121d9fb45f4
Child:
2:697ebeb8336f
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:7121d9fb45f4 1 #if 1
va009039 0:7121d9fb45f4 2 #include "mbed.h"
va009039 0:7121d9fb45f4 3 #include "BaseJpegDecode.h"
va009039 0:7121d9fb45f4 4 #include "uvc.h"
va009039 0:7121d9fb45f4 5
va009039 0:7121d9fb45f4 6 // Logitech C270
va009039 0:7121d9fb45f4 7 #define WIDTH 320
va009039 0:7121d9fb45f4 8 #define HEIGHT 176
va009039 0:7121d9fb45f4 9
va009039 0:7121d9fb45f4 10 #define ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
va009039 0:7121d9fb45f4 11
va009039 0:7121d9fb45f4 12 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
va009039 0:7121d9fb45f4 13 Serial pc(USBTX, USBRX);
va009039 0:7121d9fb45f4 14
va009039 0:7121d9fb45f4 15 class CalcCenter : public BaseJpegDecode {
va009039 0:7121d9fb45f4 16 public:
va009039 0:7121d9fb45f4 17 int y_center, x_center;
va009039 0:7121d9fb45f4 18 int m_x_sum, m_y_sum, m_sum;
va009039 0:7121d9fb45f4 19 int8_t m_buf[WIDTH/16*HEIGHT/8];
va009039 0:7121d9fb45f4 20 virtual void outputDC(int mcu, int block, int value) {
va009039 0:7121d9fb45f4 21 if (mcu >= (WIDTH/16*HEIGHT/8)) {
va009039 0:7121d9fb45f4 22 return;
va009039 0:7121d9fb45f4 23 }
va009039 0:7121d9fb45f4 24 if (block == 3) { // 0-1:Y 2:Cb 3:Cr
va009039 0:7121d9fb45f4 25 m_buf[mcu] = value; // debug
va009039 0:7121d9fb45f4 26 if (value >= 2) { // red
va009039 0:7121d9fb45f4 27 m_x_sum += value*(mcu%(WIDTH/16));
va009039 0:7121d9fb45f4 28 m_y_sum += value*(mcu/(WIDTH/16));
va009039 0:7121d9fb45f4 29 m_sum += value;
va009039 0:7121d9fb45f4 30 }
va009039 0:7121d9fb45f4 31 }
va009039 0:7121d9fb45f4 32 }
va009039 0:7121d9fb45f4 33 virtual void outputAC(int mcu, int block, int scan, int value){};
va009039 0:7121d9fb45f4 34 virtual void outputMARK(uint8_t c){
va009039 0:7121d9fb45f4 35 if (c == 0xd9) { // EOI
va009039 0:7121d9fb45f4 36 if(m_sum == 0) {
va009039 0:7121d9fb45f4 37 x_center = y_center = -1; // not found
va009039 0:7121d9fb45f4 38 } else {
va009039 0:7121d9fb45f4 39 x_center = m_x_sum / m_sum;
va009039 0:7121d9fb45f4 40 y_center = m_y_sum / m_sum;
va009039 0:7121d9fb45f4 41 }
va009039 0:7121d9fb45f4 42 m_x_sum = m_y_sum = m_sum = 0; // reset
va009039 0:7121d9fb45f4 43 led2 = !led2;
va009039 0:7121d9fb45f4 44 }
va009039 0:7121d9fb45f4 45 };
va009039 0:7121d9fb45f4 46 };
va009039 0:7121d9fb45f4 47
va009039 0:7121d9fb45f4 48 CalcCenter* calc = NULL;
va009039 0:7121d9fb45f4 49
va009039 0:7121d9fb45f4 50 void callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len)
va009039 0:7121d9fb45f4 51 {
va009039 0:7121d9fb45f4 52 if (calc) {
va009039 0:7121d9fb45f4 53 calc->input(buf+12, len-12);
va009039 0:7121d9fb45f4 54 }
va009039 0:7121d9fb45f4 55 led1 = buf[1]&1; // FID
va009039 0:7121d9fb45f4 56 }
va009039 0:7121d9fb45f4 57
va009039 0:7121d9fb45f4 58 int main() {
va009039 0:7121d9fb45f4 59 pc.baud(921600);
va009039 0:7121d9fb45f4 60 printf("%s\n", __FILE__);
va009039 0:7121d9fb45f4 61
va009039 0:7121d9fb45f4 62 calc = new CalcCenter;
va009039 0:7121d9fb45f4 63 ASSERT(calc);
va009039 0:7121d9fb45f4 64 uvc* cam = new uvc;
va009039 0:7121d9fb45f4 65 ASSERT(cam);
va009039 0:7121d9fb45f4 66 cam->SetImageSize(WIDTH, HEIGHT);
va009039 0:7121d9fb45f4 67 cam->SetFrameInterval(2000000); // 5.0fps
va009039 0:7121d9fb45f4 68 cam->setOnResult(callback_motion_jpeg);
va009039 0:7121d9fb45f4 69 ASSERT(cam->setup() >= 0);
va009039 0:7121d9fb45f4 70 while(1) {
va009039 0:7121d9fb45f4 71 printf("\n"); // start debug dump
va009039 0:7121d9fb45f4 72 for(int y = 0; y < HEIGHT/8; y++) {
va009039 0:7121d9fb45f4 73 for(int x = 0; x < WIDTH/16; x++) {
va009039 0:7121d9fb45f4 74 printf("%+3d,", calc->m_buf[y*WIDTH/16+x]);
va009039 0:7121d9fb45f4 75 cam->poll();
va009039 0:7121d9fb45f4 76 }
va009039 0:7121d9fb45f4 77 printf("\n");
va009039 0:7121d9fb45f4 78 }
va009039 0:7121d9fb45f4 79 printf("red:(%d,%d)\n", calc->x_center, calc->y_center);
va009039 0:7121d9fb45f4 80 cam->wait_ms(500);
va009039 0:7121d9fb45f4 81 led3 = !led3;
va009039 0:7121d9fb45f4 82 }
va009039 0:7121d9fb45f4 83 }
va009039 0:7121d9fb45f4 84 #endif