Sample to operate omron HVC-P2 on GR-PEACH.

Dependencies:   AsciiFont

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers touch_proc.cpp Source File

touch_proc.cpp

00001 #include "mbed.h"
00002 #include "EasyAttach_CameraAndLCD.h"
00003 #include "RGA.h"
00004 #include "BinaryImage_RZ_A1H.h"
00005 #include "recognition_proc.h"
00006 
00007 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
00008     in accordance with the frame buffer burst transfer mode. */
00009 /* TOUCH BUFFER Parameter GRAPHICS_LAYER_2 */
00010 #define TOUCH_BUFFER_BYTE_PER_PIXEL     (4u)
00011 #define TOUCH_BUFFER_STRIDE             (((LCD_PIXEL_WIDTH * TOUCH_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
00012 
00013 /* Disp mode */
00014 #define DISP_MODE_NORMAL                (0)
00015 #define DISP_MODE_SETTING_1             (1)
00016 #define DISP_MODE_SETTING_2             (2)
00017 #define DISP_MODE_SETTING_3             (3)
00018 
00019 /* Setting range  */
00020 #define THRESHOLD_MIN                   (1)
00021 #define THRESHOLD_MAX                   (1000)
00022 #define SIZE_RANGE_MIN                  (20)
00023 #define SIZE_RANGE_MAX                  (1000)
00024 #define POSE_MIN                        (0)
00025 #define POSE_MAX                        (2)
00026 #define ANGLE_MIN                       (0)
00027 #define ANGLE_MAX                       (1)
00028 
00029 /* slide bar */
00030 #define POS_SLIDE_BAR_X                 (185)
00031 #define SLIDE_BAR_LENGTH                (200)
00032 #define POS_PROGRESS_0_X                (POS_SLIDE_BAR_X + 15)
00033 
00034 /* func_code */
00035 #define TOUCH_KEY_CLOSE                 (1)
00036 #define TOUCH_KEY_SETTING_1             (2)
00037 #define TOUCH_KEY_SETTING_2             (3)
00038 #define TOUCH_KEY_SETTING_3             (4)
00039 #define TOUCH_KEY_REGISTRATION          (5)
00040 #define TOUCH_KEY_THRESHOLD_BODY        (6)
00041 #define TOUCH_KEY_THRESHOLD_FACE        (7)
00042 #define TOUCH_KEY_THRESHOLD_RECO        (8)
00043 #define TOUCH_KEY_RANGE_BODY_MIN        (9)
00044 #define TOUCH_KEY_RANGE_BODY_MAX        (10)
00045 #define TOUCH_KEY_RANGE_FACE_MIN        (11)
00046 #define TOUCH_KEY_RANGE_FACE_MAX        (12)
00047 #define TOUCH_KEY_FACE_POSE             (13)
00048 #define TOUCH_KEY_FACE_ANGLE            (14)
00049 #define TOUCH_KEY_BODY_DETECTION        (15)
00050 #define TOUCH_KEY_FACE_DETECTION        (16)
00051 #define TOUCH_KEY_AGE_ESTIMATION        (17)
00052 #define TOUCH_KEY_GENDER_ESTIMATION     (18)
00053 #define TOUCH_KEY_EXPRESSION_ESTIMATION (19)
00054 #define TOUCH_KEY_SETTING_LAST          (20)
00055 #define TOUCH_KEY_RESET_SETTING         (21)
00056 
00057 typedef struct {
00058     uint32_t pic_pos_x;             /* X position of the key picture. */
00059     uint32_t pic_pos_y;             /* Y position of the key picture. */
00060     uint32_t pic_width;             /* Width of the key picture. */
00061     uint32_t pic_height;            /* Height of the key picture. */
00062     uint32_t func_code;             /* func code of the key picture. */
00063 } key_pic_info_t;
00064 
00065 static const key_pic_info_t touch_key_tbl_normal[] = {
00066     /*                X      Y    Width  Height   Func code                      */
00067     {                330,    10,   140,    36,    TOUCH_KEY_BODY_DETECTION        },
00068     {                330,    56,   140,    36,    TOUCH_KEY_FACE_DETECTION        },
00069     {                330,   102,   140,    36,    TOUCH_KEY_AGE_ESTIMATION        },
00070     {                330,   148,   140,    36,    TOUCH_KEY_GENDER_ESTIMATION     },
00071     {                330,   194,   140,    36,    TOUCH_KEY_EXPRESSION_ESTIMATION },
00072     {                448,   240,    32,    32,    TOUCH_KEY_SETTING_LAST          },
00073     {                  0,     0,   320,   240,    TOUCH_KEY_REGISTRATION          },
00074     {                  0,     0,     0,     0,    0                               } /* table end */
00075 };
00076 
00077 static const key_pic_info_t touch_key_tbl_setting_1[] = {
00078     /*                X      Y    Width  Height   Func code                      */
00079     {                127,   220,    80,    34,    TOUCH_KEY_RESET_SETTING         },
00080     {                273,   220,    80,    34,    TOUCH_KEY_CLOSE                 },
00081     {                 21,    20,   146,    34,    TOUCH_KEY_SETTING_1             },
00082     {                167,    20,   146,    34,    TOUCH_KEY_SETTING_2             },
00083     {                313,    20,   146,    34,    TOUCH_KEY_SETTING_3             },
00084     { POS_SLIDE_BAR_X-20,  80-8,   281,    30,    TOUCH_KEY_THRESHOLD_BODY        },
00085     { POS_SLIDE_BAR_X-20, 120-8,   281,    30,    TOUCH_KEY_THRESHOLD_FACE        },
00086     { POS_SLIDE_BAR_X-20, 160-8,   281,    30,    TOUCH_KEY_THRESHOLD_RECO        },
00087     {                  0,     0,     0,     0,    0                               } /* table end */
00088 };
00089 
00090 static const key_pic_info_t touch_key_tbl_setting_2[] = {
00091     /*                X      Y    Width  Height   Func code                      */
00092     {                127,   220,    80,    34,    TOUCH_KEY_RESET_SETTING         },
00093     {                273,   220,    80,    34,    TOUCH_KEY_CLOSE                 },
00094     {                 21,    20,   146,    34,    TOUCH_KEY_SETTING_1             },
00095     {                167,    20,   146,    34,    TOUCH_KEY_SETTING_2             },
00096     {                313,    20,   146,    34,    TOUCH_KEY_SETTING_3             },
00097     { POS_SLIDE_BAR_X-20,  80-8,   281,    30,    TOUCH_KEY_RANGE_BODY_MIN        },
00098     { POS_SLIDE_BAR_X-20, 110-8,   281,    30,    TOUCH_KEY_RANGE_BODY_MAX        },
00099     { POS_SLIDE_BAR_X-20, 150-8,   281,    30,    TOUCH_KEY_RANGE_FACE_MIN        },
00100     { POS_SLIDE_BAR_X-20, 180-8,   281,    30,    TOUCH_KEY_RANGE_FACE_MAX        },
00101     {                  0,     0,     0,     0,    0                               } /* table end */
00102 };
00103 
00104 static const key_pic_info_t touch_key_tbl_setting_3[] = {
00105     /*                X      Y    Width  Height   Func code                      */
00106     {                127,   220,    80,    34,    TOUCH_KEY_RESET_SETTING         },
00107     {                273,   220,    80,    34,    TOUCH_KEY_CLOSE                 },
00108     {                 21,    20,   146,    34,    TOUCH_KEY_SETTING_1             },
00109     {                167,    20,   146,    34,    TOUCH_KEY_SETTING_2             },
00110     {                313,    20,   146,    34,    TOUCH_KEY_SETTING_3             },
00111     { POS_SLIDE_BAR_X-20,  80-8,   281,    30,    TOUCH_KEY_FACE_POSE             },
00112     { POS_SLIDE_BAR_X-20, 120-8,   281,    30,    TOUCH_KEY_FACE_ANGLE            },
00113     {                  0,     0,     0,     0,    0                               } /* table end */
00114 };
00115 
00116 static const key_pic_info_t * p_touch_key_tbl[] = {
00117     touch_key_tbl_normal,           /* DISP_MODE_NORMAL    */
00118     touch_key_tbl_setting_1,        /* DISP_MODE_SETTING_1 */
00119     touch_key_tbl_setting_2,        /* DISP_MODE_SETTING_2 */
00120     touch_key_tbl_setting_3,        /* DISP_MODE_SETTING_3 */
00121     NULL
00122 };
00123 
00124 static TouckKey_LCD_shield touch(P4_0, P2_13, I2C_SDA, I2C_SCL);
00125 static Semaphore   sem_touch_int(0);
00126 
00127 #if defined(__ICCARM__)
00128 /* 32 bytes aligned */
00129 #pragma data_alignment=32
00130 static uint8_t user_frame_buffer_touch0[TOUCH_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
00131 #pragma data_alignment=32
00132 static uint8_t user_frame_buffer_touch1[TOUCH_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
00133 #else
00134 /* 32 bytes aligned */
00135 static uint8_t user_frame_buffer_touch0[TOUCH_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32)));
00136 static uint8_t user_frame_buffer_touch1[TOUCH_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32)));
00137 #endif
00138 
00139 static volatile int32_t vsync_count = 0;
00140 static recognition_setting_t * p_setting;
00141 static int disp_mode;
00142 
00143 /****** Touch panel ******/
00144 static uint32_t Scan_Key(const key_pic_info_t * key_tbl, const uint32_t pos_x, const uint32_t pos_y) {
00145     uint32_t ret = 0;
00146 
00147     while (ret == 0) {
00148         if (key_tbl->func_code == 0) {
00149             break;
00150         }
00151         /* Check the range of the X position */
00152         if ((pos_x >= key_tbl->pic_pos_x) && (pos_x <= (key_tbl->pic_pos_x + key_tbl->pic_width))) {
00153             /* Check the range of the Y position */
00154             if ((pos_y >= key_tbl->pic_pos_y) && (pos_y <= (key_tbl->pic_pos_y + key_tbl->pic_height))) {
00155                 /* Decide the func code. */
00156                 ret = key_tbl->func_code;
00157             }
00158         }
00159         key_tbl++;
00160     }
00161 
00162     return ret;
00163 }
00164 
00165 static void draw_button(Canvas2D_ContextClass * p_canvas2d) {
00166     const graphics_image_t* p_wk;
00167 
00168     /* Draw background */
00169     p_canvas2d->drawImage(background, 320, 0);
00170 
00171     /* Draw "HUMAN BODY" button */
00172     if ((p_setting->execFlag & HVC_ACTIV_BODY_DETECTION) == 0) {
00173         p_wk = button_off;
00174     } else {
00175         p_wk = button_on;
00176     }
00177     p_canvas2d->drawImage(p_wk, 330, 10);
00178     p_canvas2d->drawImage(str_human_body, 330 + 19, 10 + 11);
00179 
00180     /* Draw "FACE" or "RECOGNITION" button */
00181     if ((p_setting->execFlag & HVC_ACTIV_FACE_RECOGNITION) == 0) {
00182         if ((p_setting->execFlag & HVC_ACTIV_FACE_DETECTION) == 0) {
00183             p_wk = button_off;
00184         } else {
00185             p_wk = button_on;
00186         }
00187         p_canvas2d->drawImage(p_wk, 330, 56);
00188         p_canvas2d->drawImage(str_face, 330 + 51, 56 + 11);
00189     } else {
00190         p_canvas2d->drawImage(button_on2, 330, 56);
00191         p_canvas2d->drawImage(str_recognition, 330 + 19, 56 + 11);
00192     }
00193 
00194     /* Draw "AGE" button */
00195     if ((p_setting->execFlag & HVC_ACTIV_FACE_DETECTION) == 0) {
00196         p_wk = button_inv;
00197     } else if ((p_setting->execFlag & HVC_ACTIV_AGE_ESTIMATION) == 0) {
00198         p_wk = button_off;
00199     } else {
00200         p_wk = button_on;
00201     }
00202     p_canvas2d->drawImage(p_wk, 330, 102);
00203     p_canvas2d->drawImage(str_age, 330 + 54, 102 + 11);
00204 
00205     /* Draw "GENDER" button */
00206     if ((p_setting->execFlag & HVC_ACTIV_FACE_DETECTION) == 0) {
00207         p_wk = button_inv;
00208     } else if ((p_setting->execFlag & HVC_ACTIV_GENDER_ESTIMATION) == 0) {
00209         p_wk = button_off;
00210     } else {
00211         p_wk = button_on;
00212     }
00213     p_canvas2d->drawImage(p_wk, 330, 148);
00214     p_canvas2d->drawImage(str_gender, 330 + 39, 148 + 11);
00215 
00216     /* Draw "EXPRESSION" button */
00217     if ((p_setting->execFlag & HVC_ACTIV_FACE_DETECTION) == 0) {
00218         p_wk = button_inv;
00219     } else if ((p_setting->execFlag & HVC_ACTIV_EXPRESSION_ESTIMATION) == 0) {
00220         p_wk = button_off;
00221     } else {
00222         p_wk = button_on;
00223     }
00224     p_canvas2d->drawImage(p_wk, 330, 194);
00225     p_canvas2d->drawImage(str_expression, 330 + 23, 194 + 11);
00226 
00227     /* Draw setting icon */
00228     p_canvas2d->drawImage(icon_setting, LCD_PIXEL_WIDTH - 32, LCD_PIXEL_HEIGHT - 32);
00229 }
00230 
00231 static void draw_number(Canvas2D_ContextClass * p_canvas2d, int x, int y, int number) {
00232     int wk_num;
00233     bool disp_flg = false;
00234     const graphics_image_t * p_num_tbl[] = {
00235         char_0, char_1, char_2, char_3, char_4, char_5, char_6, char_7, char_8, char_9
00236     };
00237 
00238     wk_num = (number / 1000) % 10;
00239     if ((wk_num != 0) || (disp_flg != false)) {
00240         p_canvas2d->drawImage(p_num_tbl[wk_num], x + 9 * 0, y);
00241         R_OSPL_CLEAR_ERROR();
00242         disp_flg = true;
00243     }
00244     wk_num = (number / 100) % 10;
00245     if ((wk_num != 0) || (disp_flg != false)) {
00246         p_canvas2d->drawImage(p_num_tbl[wk_num], x + 9 * 1, y);
00247         R_OSPL_CLEAR_ERROR();
00248         disp_flg = true;
00249     }
00250     wk_num = (number / 10) % 10;
00251     if ((wk_num != 0) || (disp_flg != false)) {
00252         p_canvas2d->drawImage(p_num_tbl[wk_num], x + 9 * 2, y);
00253         R_OSPL_CLEAR_ERROR();
00254     }
00255     wk_num = number % 10;
00256     p_canvas2d->drawImage(p_num_tbl[wk_num], x + 9 * 3, y);
00257     R_OSPL_CLEAR_ERROR();
00258 }
00259 
00260 static void draw_slide_bar(Canvas2D_ContextClass * p_canvas2d, int y, INT32 data, int min, int max) {
00261     p_canvas2d->globalAlpha = 0.7f;
00262     p_canvas2d->fillStyle = "#D9C3E6";
00263     p_canvas2d->fillRect(POS_PROGRESS_0_X, y + 6, SLIDE_BAR_LENGTH + 10, 2);
00264     p_canvas2d->globalAlpha = 1.0f;
00265     p_canvas2d->drawImage(char_left, POS_SLIDE_BAR_X, y);
00266     p_canvas2d->drawImage(char_rigth, POS_PROGRESS_0_X + SLIDE_BAR_LENGTH + 10 + 1, y);
00267     p_canvas2d->fillStyle = "#5B9BD5";
00268     p_canvas2d->fillRect(POS_PROGRESS_0_X + (int)(SLIDE_BAR_LENGTH * ((float)(data - min) / (max - min))), y, 10, 14);
00269 }
00270 
00271 static void draw_setting_menu(Canvas2D_ContextClass * p_canvas2d) {
00272     if (disp_mode == DISP_MODE_NORMAL) {
00273         return;
00274     }
00275 
00276     p_canvas2d->globalAlpha = 0.95f;
00277     p_canvas2d->drawImage(background_setting, 0, 0);
00278 
00279     /* Tab */
00280     if (disp_mode == DISP_MODE_SETTING_1) {
00281         p_canvas2d->globalAlpha = 0.9f;
00282         p_canvas2d->fillStyle = "#5B9BD5";
00283         p_canvas2d->fillRect(21, 20, 146, 34);
00284         p_canvas2d->globalAlpha = 1.0f;
00285     } else {
00286         p_canvas2d->globalAlpha = 0.3f;
00287     }
00288     p_canvas2d->drawImage(str_threshold_value, 23, 30);
00289 
00290     if (disp_mode == DISP_MODE_SETTING_2) {
00291         p_canvas2d->globalAlpha = 0.9f;
00292         p_canvas2d->fillStyle = "#5B9BD5";
00293         p_canvas2d->fillRect(167, 20, 146, 34);
00294         p_canvas2d->globalAlpha = 1.0f;
00295     } else {
00296         p_canvas2d->globalAlpha = 0.3f;
00297     }
00298     p_canvas2d->drawImage(str_detection_size, 181, 30);
00299 
00300     if (disp_mode == DISP_MODE_SETTING_3) {
00301         p_canvas2d->globalAlpha = 0.9f;
00302         p_canvas2d->fillStyle = "#5B9BD5";
00303         p_canvas2d->fillRect(313, 20, 146, 34);
00304         p_canvas2d->globalAlpha = 1.0f;
00305     } else {
00306         p_canvas2d->globalAlpha = 0.3f;
00307     }
00308     p_canvas2d->drawImage(str_face, 342, 30);
00309     p_canvas2d->drawImage(str_angle, 383, 30);
00310 
00311     /* Setting */
00312     p_canvas2d->globalAlpha = 1.0f;
00313     if (disp_mode == DISP_MODE_SETTING_1) {
00314         p_canvas2d->drawImage(str_human_body, 30, 80);
00315         p_canvas2d->drawImage(str_face, 30, 120);
00316         p_canvas2d->drawImage(str_recognition, 30, 160);
00317 
00318         draw_slide_bar(p_canvas2d,  80, p_setting->threshold.bdThreshold, THRESHOLD_MIN, THRESHOLD_MAX);
00319         draw_slide_bar(p_canvas2d, 120, p_setting->threshold.dtThreshold, THRESHOLD_MIN, THRESHOLD_MAX);
00320         draw_slide_bar(p_canvas2d, 160, p_setting->threshold.rsThreshold, THRESHOLD_MIN, THRESHOLD_MAX);
00321 
00322         draw_number(p_canvas2d, 430,  80, p_setting->threshold.bdThreshold);
00323         draw_number(p_canvas2d, 430, 120, p_setting->threshold.dtThreshold);
00324         draw_number(p_canvas2d, 430, 160, p_setting->threshold.rsThreshold);
00325     } else if (disp_mode == DISP_MODE_SETTING_2) {
00326         p_canvas2d->drawImage(str_human_body, 30, 80);
00327         p_canvas2d->drawImage(str_min, 140, 80);
00328         p_canvas2d->drawImage(str_max, 140, 110);
00329         p_canvas2d->drawImage(str_face, 30, 150);
00330         p_canvas2d->drawImage(str_min, 140, 150);
00331         p_canvas2d->drawImage(str_max, 140, 180);
00332 
00333         draw_slide_bar(p_canvas2d,  80, p_setting->sizeRange.bdMinSize, SIZE_RANGE_MIN, SIZE_RANGE_MAX);
00334         draw_slide_bar(p_canvas2d, 110, p_setting->sizeRange.bdMaxSize, SIZE_RANGE_MIN, SIZE_RANGE_MAX);
00335         draw_slide_bar(p_canvas2d, 150, p_setting->sizeRange.dtMinSize, SIZE_RANGE_MIN, SIZE_RANGE_MAX);
00336         draw_slide_bar(p_canvas2d, 180, p_setting->sizeRange.dtMaxSize, SIZE_RANGE_MIN, SIZE_RANGE_MAX);
00337 
00338         draw_number(p_canvas2d, 430,  80, p_setting->sizeRange.bdMinSize);
00339         draw_number(p_canvas2d, 430, 110, p_setting->sizeRange.bdMaxSize);
00340         draw_number(p_canvas2d, 430, 150, p_setting->sizeRange.dtMinSize);
00341         draw_number(p_canvas2d, 430, 180, p_setting->sizeRange.dtMaxSize);
00342     } else {
00343         int wk_data;
00344 
00345         p_canvas2d->drawImage(str_yaw, 30, 80);
00346         p_canvas2d->drawImage(str_angle, 30 + 41, 80);
00347         p_canvas2d->drawImage(str_roll, 30, 120);
00348         p_canvas2d->drawImage(str_angle, 30 + 42, 120);
00349 
00350         if (p_setting->pose == 0) {
00351             wk_data = 30;
00352         } else if (p_setting->pose == 1) {
00353             wk_data = 60;
00354         } else {
00355             wk_data = 90;
00356         }
00357         draw_slide_bar(p_canvas2d,  80, p_setting->pose, POSE_MIN , POSE_MAX);
00358         p_canvas2d->drawImage(char_plus_minus, 426, 80);
00359         draw_number(p_canvas2d, 420,  80, wk_data); /* 30 60 90 */
00360         p_canvas2d->drawImage(char_angle, 457, 80);
00361 
00362         if (p_setting->angle == 0) {
00363             wk_data = 15;
00364         } else {
00365             wk_data = 45;
00366         }
00367         draw_slide_bar(p_canvas2d, 120, p_setting->angle, ANGLE_MIN, ANGLE_MAX);
00368         p_canvas2d->drawImage(char_plus_minus, 426, 120);
00369         draw_number(p_canvas2d, 420, 120, wk_data); /* 15 45 */
00370         p_canvas2d->drawImage(char_angle, 457, 120);
00371     }
00372     p_canvas2d->drawImage(str_reset, 144, 230);
00373     p_canvas2d->drawImage(str_close, 290, 230);
00374 }
00375 
00376 static void draw_touch_layer(DisplayBase * p_display, frame_buffer_t * frmbuf_info, Canvas2D_ContextClass * p_canvas2d) {
00377     while (vsync_count > 0) {
00378         ThisThread::sleep_for(1);
00379     }
00380 
00381     /* Swap the frame buffer */
00382     if (frmbuf_info->draw_buffer_index == 1) {
00383         frmbuf_info->draw_buffer_index = 0;
00384     } else {
00385         frmbuf_info->draw_buffer_index = 1;
00386     }
00387 
00388     /* Clear */
00389     p_canvas2d->clearRect(0, 0, frmbuf_info->width, frmbuf_info->height);
00390 
00391     /* Draw button */
00392     draw_button(p_canvas2d);
00393 
00394     /* Draw setting menu */
00395     draw_setting_menu(p_canvas2d);
00396 
00397     /* Complete drawing */
00398     R_GRAPHICS_Finish(p_canvas2d->c_LanguageContext);
00399     p_display->Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_2,
00400      (void *)frmbuf_info->buffer_address[frmbuf_info->draw_buffer_index]);
00401     vsync_count = 1;
00402 }
00403 
00404 static void set_progress(int x, INT32 * p_data, int min, int max, bool * p_slide, int last_key) {
00405     int now_pos = POS_PROGRESS_0_X + (int)(SLIDE_BAR_LENGTH * (float)(*p_data - min) / (max - min));
00406 
00407     x -= 5;
00408     if ((last_key == 0) && (x > (now_pos - 10)) && (x < (now_pos + 20))) {
00409         *p_slide = true;
00410     }
00411     if (x < POS_PROGRESS_0_X) {
00412         x = POS_PROGRESS_0_X;
00413     }
00414     if (x > (POS_PROGRESS_0_X + SLIDE_BAR_LENGTH)) {
00415         x = (POS_PROGRESS_0_X + SLIDE_BAR_LENGTH);
00416     }
00417     if (*p_slide) {
00418         *p_data = ((float)(x - POS_PROGRESS_0_X) / (float)SLIDE_BAR_LENGTH * (float)(max - min)) + min;
00419     } else if ((x > now_pos) && (*p_data < max)) {
00420         *p_data += 1;
00421     } else if ((x < now_pos) && (*p_data > min)) {
00422         *p_data -= 1;
00423     } else {
00424         /* do nothing */
00425     }
00426 }
00427 
00428 static void init_touch_layer(DisplayBase * p_display, frame_buffer_t * frmbuf_info, Canvas2D_ContextClass * p_canvas2d) {
00429     errnum_t err;
00430     Canvas2D_ContextConfigClass config;
00431     DisplayBase::rect_t rect;
00432 
00433     /* The layer by which the buttons is drawn */
00434     memset(user_frame_buffer_touch0, 0, sizeof(user_frame_buffer_touch0));
00435     memset(user_frame_buffer_touch1, 0, sizeof(user_frame_buffer_touch1));
00436     frmbuf_info->buffer_address[0] = user_frame_buffer_touch0;
00437     frmbuf_info->buffer_address[1] = user_frame_buffer_touch1;
00438     frmbuf_info->buffer_count      = 2;
00439     frmbuf_info->show_buffer_index = 0;
00440     frmbuf_info->draw_buffer_index = 0;
00441     frmbuf_info->width             = LCD_PIXEL_WIDTH;
00442     frmbuf_info->byte_per_pixel    = TOUCH_BUFFER_BYTE_PER_PIXEL;
00443     frmbuf_info->stride            = TOUCH_BUFFER_STRIDE;
00444     frmbuf_info->height            = LCD_PIXEL_HEIGHT;
00445     frmbuf_info->pixel_format      = PIXEL_FORMAT_ARGB8888;
00446 
00447     rect.vs = 0;
00448     rect.vw = LCD_PIXEL_HEIGHT;
00449     rect.hs = 0;
00450     rect.hw = LCD_PIXEL_WIDTH;
00451     p_display->Graphics_Read_Setting(
00452         DisplayBase::GRAPHICS_LAYER_2,
00453         (void *)frmbuf_info->buffer_address[frmbuf_info->draw_buffer_index],
00454         TOUCH_BUFFER_STRIDE,
00455         DisplayBase::GRAPHICS_FORMAT_ARGB8888,
00456         DisplayBase::WR_RD_WRSWA_32BIT,
00457         &rect
00458     );
00459     p_display->Graphics_Start(DisplayBase::GRAPHICS_LAYER_2);
00460 
00461     /* Drawing buttons */
00462     config.frame_buffer = frmbuf_info;
00463     *p_canvas2d = R_RGA_New_Canvas2D_ContextClass(config);
00464     err = R_OSPL_GetErrNum();
00465     if (err != 0) {
00466         printf("Line %d, err %d\n", __LINE__, err);
00467         mbed_die();
00468     }
00469 }
00470 
00471 static void touch_int_callback(void) {
00472     sem_touch_int.release();
00473 }
00474 
00475 void touch_lcd_int(DisplayBase::int_type_t int_type) {
00476     /* Interrupt callback function for Vsync interruption */
00477     if (int_type == DisplayBase::INT_TYPE_S0_LO_VSYNC) {
00478         if (vsync_count > 0) {
00479             vsync_count--;
00480         }
00481     }
00482 }
00483 
00484 void touch_task(DisplayBase * p_display) {
00485     frame_buffer_t frame_buffer_info;
00486     Canvas2D_ContextClass canvas2d;
00487     TouchKey::touch_pos_t touch_pos[1];
00488     int touch_num = 0;
00489     int touch_num_last = 0;
00490     bool key_rep = false;
00491     int func_code;
00492     int func_code_last = 0;
00493     bool slide = false;
00494     Timer key_time;
00495     int wait_time;
00496     int last_setting_mode = DISP_MODE_SETTING_1;
00497 
00498     p_setting = GetRecognitionSettingPointer();
00499     disp_mode = DISP_MODE_NORMAL;
00500 
00501     /* Initializing Touch layer */
00502     init_touch_layer(p_display, &frame_buffer_info, &canvas2d);
00503     draw_touch_layer(p_display, &frame_buffer_info, &canvas2d);
00504 
00505     /* Callback setting */
00506     touch.SetCallback(&touch_int_callback);
00507 
00508     /* Reset touch IC */
00509     touch.Reset();
00510 
00511     key_time.reset();
00512     key_time.start();
00513 
00514     while (1) {
00515         /* Wait touch event */
00516         sem_touch_int.wait();
00517 
00518         /* Get touch coordinates */
00519         touch_num = touch.GetCoordinates(1, touch_pos);
00520 
00521         if (slide) {
00522             wait_time = 80;
00523         } else {
00524             wait_time = 250;
00525         }
00526         if ((key_time.read_ms() > wait_time) || (touch_num != touch_num_last)) {
00527             key_time.reset();
00528             key_time.start();
00529             if ((touch_num != 0) && ((touch_num_last == 0) || (key_rep == true))) {
00530                 key_rep = false;
00531                 func_code = Scan_Key(p_touch_key_tbl[disp_mode], touch_pos[0].x, touch_pos[0].y);
00532                 if (slide) {
00533                     func_code = func_code_last;
00534                 }
00535                 if (func_code != 0) {
00536                     switch (func_code) {
00537                         case TOUCH_KEY_SETTING_LAST:
00538                             disp_mode = last_setting_mode;
00539                             break;
00540                         case TOUCH_KEY_CLOSE:
00541                             disp_mode = DISP_MODE_NORMAL;
00542                             SetSettingReq();
00543                             break;
00544                         case TOUCH_KEY_SETTING_1:
00545                             disp_mode = DISP_MODE_SETTING_1;
00546                             last_setting_mode = DISP_MODE_SETTING_1;
00547                             break;
00548                         case TOUCH_KEY_SETTING_2:
00549                             disp_mode = DISP_MODE_SETTING_2;
00550                             last_setting_mode = DISP_MODE_SETTING_2;
00551                             break;
00552                         case TOUCH_KEY_SETTING_3:
00553                             disp_mode = DISP_MODE_SETTING_3;
00554                             last_setting_mode = DISP_MODE_SETTING_3;
00555                             break;
00556                         case TOUCH_KEY_REGISTRATION:
00557                             if ((p_setting->execFlag & HVC_ACTIV_FACE_RECOGNITION) != 0) {
00558                                 SetRegistrationrReq();
00559                             }
00560                             break;
00561                         case TOUCH_KEY_THRESHOLD_BODY:
00562                             set_progress(touch_pos[0].x, &p_setting->threshold.bdThreshold,
00563                                          THRESHOLD_MIN, THRESHOLD_MAX, &slide, touch_num_last);
00564                             key_rep = true;
00565                             break;
00566                         case TOUCH_KEY_THRESHOLD_FACE:
00567                             set_progress(touch_pos[0].x, &p_setting->threshold.dtThreshold,
00568                                          THRESHOLD_MIN, THRESHOLD_MAX, &slide, touch_num_last);
00569                             key_rep = true;
00570                             break;
00571                         case TOUCH_KEY_THRESHOLD_RECO:
00572                             set_progress(touch_pos[0].x, &p_setting->threshold.rsThreshold,
00573                                          THRESHOLD_MIN, THRESHOLD_MAX, &slide, touch_num_last);
00574                             key_rep = true;
00575                             break;
00576                         case TOUCH_KEY_RANGE_BODY_MIN:
00577                             set_progress(touch_pos[0].x, &p_setting->sizeRange.bdMinSize,
00578                                          SIZE_RANGE_MIN, SIZE_RANGE_MAX, &slide, touch_num_last);
00579                             if (p_setting->sizeRange.bdMinSize > p_setting->sizeRange.bdMaxSize) {
00580                                 p_setting->sizeRange.bdMaxSize = p_setting->sizeRange.bdMinSize;
00581                             }
00582                             key_rep = true;
00583                             break;
00584                         case TOUCH_KEY_RANGE_BODY_MAX:
00585                             set_progress(touch_pos[0].x, &p_setting->sizeRange.bdMaxSize,
00586                                          SIZE_RANGE_MIN, SIZE_RANGE_MAX, &slide, touch_num_last);
00587                             if (p_setting->sizeRange.bdMaxSize < p_setting->sizeRange.bdMinSize) {
00588                                 p_setting->sizeRange.bdMinSize = p_setting->sizeRange.bdMaxSize;
00589                             }
00590                             key_rep = true;
00591                             break;
00592                         case TOUCH_KEY_RANGE_FACE_MIN:
00593                             set_progress(touch_pos[0].x, &p_setting->sizeRange.dtMinSize,
00594                                          SIZE_RANGE_MIN, SIZE_RANGE_MAX, &slide, touch_num_last);
00595                             if (p_setting->sizeRange.dtMinSize > p_setting->sizeRange.dtMaxSize) {
00596                                 p_setting->sizeRange.dtMaxSize = p_setting->sizeRange.dtMinSize;
00597                             }
00598                             key_rep = true;
00599                             break;
00600                         case TOUCH_KEY_RANGE_FACE_MAX:
00601                             set_progress(touch_pos[0].x, &p_setting->sizeRange.dtMaxSize,
00602                                          SIZE_RANGE_MIN, SIZE_RANGE_MAX, &slide, touch_num_last);
00603                             if (p_setting->sizeRange.dtMaxSize < p_setting->sizeRange.dtMinSize) {
00604                                 p_setting->sizeRange.dtMinSize = p_setting->sizeRange.dtMaxSize;
00605                             }
00606                             key_rep = true;
00607                             break;
00608                         case TOUCH_KEY_FACE_POSE:
00609                             set_progress(touch_pos[0].x, &p_setting->pose,
00610                                          POSE_MIN, POSE_MAX, &slide, touch_num_last);
00611                             if (slide) {
00612                                 key_rep = true;
00613                             }
00614                             break;
00615                         case TOUCH_KEY_FACE_ANGLE:
00616                             set_progress(touch_pos[0].x, &p_setting->angle,
00617                                          ANGLE_MIN, ANGLE_MAX, &slide, touch_num_last);
00618                             if (slide) {
00619                                 key_rep = true;
00620                             }
00621                             break;
00622                         case TOUCH_KEY_BODY_DETECTION:
00623                             if ((p_setting->execFlag & HVC_ACTIV_BODY_DETECTION) != 0) {
00624                                 p_setting->execFlag &= ~HVC_ACTIV_BODY_DETECTION;
00625                             } else {
00626                                 p_setting->execFlag |= HVC_ACTIV_BODY_DETECTION;
00627                             }
00628                             break;
00629                         case TOUCH_KEY_FACE_DETECTION:
00630                             if ((p_setting->execFlag & HVC_ACTIV_FACE_DETECTION) == 0) {
00631                                 p_setting->execFlag |= HVC_ACTIV_FACE_DETECTION;
00632                             } else if ((p_setting->execFlag & HVC_ACTIV_FACE_RECOGNITION) == 0) {
00633                                 p_setting->execFlag |= HVC_ACTIV_FACE_RECOGNITION;
00634                             } else {
00635                                 p_setting->execFlag &= ~(HVC_ACTIV_FACE_DETECTION | HVC_ACTIV_FACE_RECOGNITION);
00636                             }
00637                             break;
00638                         case TOUCH_KEY_AGE_ESTIMATION:
00639                             if ((p_setting->execFlag & HVC_ACTIV_FACE_DETECTION) == 0) {
00640                                 /* do nothing */
00641                             } else if ((p_setting->execFlag & HVC_ACTIV_AGE_ESTIMATION) != 0) {
00642                                 p_setting->execFlag &= ~HVC_ACTIV_AGE_ESTIMATION;
00643                             } else {
00644                                 p_setting->execFlag |= HVC_ACTIV_AGE_ESTIMATION;
00645                             }
00646                             break;
00647                         case TOUCH_KEY_GENDER_ESTIMATION:
00648                             if ((p_setting->execFlag & HVC_ACTIV_FACE_DETECTION) == 0) {
00649                                 /* do nothing */
00650                             } else if ((p_setting->execFlag & HVC_ACTIV_GENDER_ESTIMATION) != 0) {
00651                                 p_setting->execFlag &= ~HVC_ACTIV_GENDER_ESTIMATION;
00652                             } else {
00653                                 p_setting->execFlag |= HVC_ACTIV_GENDER_ESTIMATION;
00654                             }
00655                             break;
00656                         case TOUCH_KEY_EXPRESSION_ESTIMATION:
00657                             if ((p_setting->execFlag & HVC_ACTIV_FACE_DETECTION) == 0) {
00658                                 /* do nothing */
00659                             } else if ((p_setting->execFlag & HVC_ACTIV_EXPRESSION_ESTIMATION) != 0) {
00660                                 p_setting->execFlag &= ~HVC_ACTIV_EXPRESSION_ESTIMATION;
00661                             } else {
00662                                 p_setting->execFlag |= HVC_ACTIV_EXPRESSION_ESTIMATION;
00663                             }
00664                             break;
00665                         case TOUCH_KEY_RESET_SETTING:
00666                             if (disp_mode == DISP_MODE_SETTING_1) {
00667                                 p_setting->threshold.bdThreshold = BODY_THRESHOLD_DEFAULT;
00668                                 p_setting->threshold.hdThreshold = HAND_THRESHOLD_DEFAULT;
00669                                 p_setting->threshold.dtThreshold = FACE_THRESHOLD_DEFAULT;
00670                                 p_setting->threshold.rsThreshold = REC_THRESHOLD_DEFAULT;
00671                             } else if (disp_mode == DISP_MODE_SETTING_2) {
00672                                 p_setting->sizeRange.bdMinSize = BODY_SIZE_RANGE_MIN_DEFAULT;
00673                                 p_setting->sizeRange.bdMaxSize = BODY_SIZE_RANGE_MAX_DEFAULT;
00674                                 p_setting->sizeRange.hdMinSize = HAND_SIZE_RANGE_MIN_DEFAULT;
00675                                 p_setting->sizeRange.hdMaxSize = HAND_SIZE_RANGE_MAX_DEFAULT;
00676                                 p_setting->sizeRange.dtMinSize = FACE_SIZE_RANGE_MIN_DEFAULT;
00677                                 p_setting->sizeRange.dtMaxSize = FACE_SIZE_RANGE_MAX_DEFAULT;
00678                             } else if (disp_mode == DISP_MODE_SETTING_3) {
00679                                 p_setting->pose  = FACE_POSE_DEFAULT;
00680                                 p_setting->angle = FACE_ANGLE_DEFAULT;
00681                             } else {
00682                                 /* do nothing */
00683                             }
00684                             break;
00685                         default:
00686                             break;
00687                     }
00688                     draw_touch_layer(p_display, &frame_buffer_info, &canvas2d);
00689                 }
00690                 func_code_last = func_code;
00691             } else {
00692                 slide = false;
00693             }
00694         }
00695         touch_num_last = touch_num;
00696     }
00697 }