Sample to operate omron HVC-P2 on GR-PEACH.
Dependencies: AsciiFont
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 }
Generated on Fri Jul 15 2022 01:15:48 by 1.7.2