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
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
Generated on Wed Jul 13 2022 06:45:29 by 1.7.2