Sample program for communicating with Fujitsuu IoT Platform using HTTP

Dependencies:   AsciiFont GR-PEACH_video GraphicsFramework LCD_shield_config R_BSP USBHost_custom easy-connect-gr-peach mbed-http picojson BM1383GLV KX022 rohm-sensor-hal rohm-bh1745

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