Mar. 14. 2018

Dependencies:   GraphicsFramework GR-PEACH_video LCD_shield_config AsciiFont R_BSP USBHost_custom

Committer:
dkato
Date:
Tue Sep 26 09:19:48 2017 +0000
Revision:
7:85ba09eb46b3
Parent:
6:8c0c70710090
The number of STB retries has been changed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:f5de229c9a00 1 #include "mbed.h"
dkato 0:f5de229c9a00 2 #include "DisplayBace.h"
dkato 0:f5de229c9a00 3 #include "rtos.h"
dkato 0:f5de229c9a00 4 #include "AsciiFont.h"
dkato 0:f5de229c9a00 5 #include "USBHostSerial.h"
dkato 0:f5de229c9a00 6 #include "LCD_shield_config_4_3inch.h"
dkato 0:f5de229c9a00 7 #include "recognition_proc.h"
dkato 5:49a61433290a 8 #include "STBWrap.h"
dkato 0:f5de229c9a00 9
dkato 0:f5de229c9a00 10 #define UART_SETTING_TIMEOUT 1000 /* HVC setting command signal timeout period */
dkato 0:f5de229c9a00 11 #define UART_REGIST_EXECUTE_TIMEOUT 7000 /* HVC registration command signal timeout period */
dkato 0:f5de229c9a00 12 #define UART_EXECUTE_TIMEOUT 10000 /* HVC execute command signal timeout period */
dkato 0:f5de229c9a00 13
dkato 3:0760680f06d8 14 #define SENSOR_ROLL_ANGLE_DEFAULT 0 /* Camera angle setting */
dkato 0:f5de229c9a00 15 #define USER_ID_NUM_MAX 10
dkato 0:f5de229c9a00 16
dkato 1:11be006960b1 17 #define ERROR_02 "Error: Number of detected faces is 2 or more"
dkato 1:11be006960b1 18
dkato 0:f5de229c9a00 19 #define DISP_PIXEL_WIDTH (320)
dkato 0:f5de229c9a00 20 #define DISP_PIXEL_HEIGHT (240)
dkato 0:f5de229c9a00 21
dkato 0:f5de229c9a00 22 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
dkato 0:f5de229c9a00 23 in accordance with the frame buffer burst transfer mode. */
dkato 0:f5de229c9a00 24 /* FRAME BUFFER Parameter GRAPHICS_LAYER_0 */
dkato 0:f5de229c9a00 25 #define FRAME_BUFFER_BYTE_PER_PIXEL (2u)
dkato 0:f5de229c9a00 26 #define FRAME_BUFFER_STRIDE (((DISP_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
dkato 0:f5de229c9a00 27
dkato 0:f5de229c9a00 28 /* RESULT BUFFER Parameter GRAPHICS_LAYER_1 */
dkato 0:f5de229c9a00 29 #define RESULT_BUFFER_BYTE_PER_PIXEL (2u)
dkato 0:f5de229c9a00 30 #define RESULT_BUFFER_STRIDE (((DISP_PIXEL_WIDTH * RESULT_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
dkato 0:f5de229c9a00 31
dkato 0:f5de229c9a00 32 static bool registrationr_req = false;
dkato 0:f5de229c9a00 33 static bool setting_req = false;
dkato 0:f5de229c9a00 34 static recognition_setting_t setting = {
dkato 0:f5de229c9a00 35 0,
dkato 0:f5de229c9a00 36 { BODY_THRESHOLD_DEFAULT, HAND_THRESHOLD_DEFAULT, FACE_THRESHOLD_DEFAULT, REC_THRESHOLD_DEFAULT},
dkato 0:f5de229c9a00 37 { BODY_SIZE_RANGE_MIN_DEFAULT, BODY_SIZE_RANGE_MAX_DEFAULT, HAND_SIZE_RANGE_MIN_DEFAULT,
dkato 0:f5de229c9a00 38 HAND_SIZE_RANGE_MAX_DEFAULT, FACE_SIZE_RANGE_MIN_DEFAULT, FACE_SIZE_RANGE_MAX_DEFAULT},
dkato 0:f5de229c9a00 39 FACE_POSE_DEFAULT,
dkato 0:f5de229c9a00 40 FACE_ANGLE_DEFAULT
dkato 0:f5de229c9a00 41 };
dkato 0:f5de229c9a00 42 static USBHostSerial serial;
dkato 0:f5de229c9a00 43 static InterruptIn button(USER_BUTTON0);
dkato 0:f5de229c9a00 44
dkato 0:f5de229c9a00 45 #if defined(__ICCARM__)
dkato 0:f5de229c9a00 46 /* 32 bytes aligned */
dkato 0:f5de229c9a00 47 #pragma data_alignment=32
dkato 0:f5de229c9a00 48 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * DISP_PIXEL_HEIGHT]@ ".mirrorram";
dkato 0:f5de229c9a00 49 #pragma data_alignment=32
dkato 0:f5de229c9a00 50 static uint8_t user_frame_buffer_result[RESULT_BUFFER_STRIDE * DISP_PIXEL_HEIGHT]@ ".mirrorram";
dkato 0:f5de229c9a00 51 #else
dkato 0:f5de229c9a00 52 /* 32 bytes aligned */
dkato 0:f5de229c9a00 53 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * DISP_PIXEL_HEIGHT]__attribute((section("NC_BSS"),aligned(32)));
dkato 0:f5de229c9a00 54 static uint8_t user_frame_buffer_result[RESULT_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((section("NC_BSS"),aligned(32)));
dkato 0:f5de229c9a00 55 #endif
dkato 0:f5de229c9a00 56
dkato 0:f5de229c9a00 57 static AsciiFont ascii_font(user_frame_buffer_result, DISP_PIXEL_WIDTH, LCD_PIXEL_HEIGHT,
dkato 0:f5de229c9a00 58 RESULT_BUFFER_STRIDE, RESULT_BUFFER_BYTE_PER_PIXEL, 0x00000090);
dkato 0:f5de229c9a00 59 static INT32 imageNo_setting = HVC_EXECUTE_IMAGE_QVGA_HALF;
dkato 0:f5de229c9a00 60 static int str_draw_x = 0;
dkato 0:f5de229c9a00 61 static int str_draw_y = 0;
dkato 0:f5de229c9a00 62
dkato 0:f5de229c9a00 63 /****** Image Recognition ******/
dkato 0:f5de229c9a00 64 extern "C" int UART_SendData(int inDataSize, UINT8 *inData) {
dkato 0:f5de229c9a00 65 return serial.writeBuf((char *)inData, inDataSize);
dkato 0:f5de229c9a00 66 }
dkato 0:f5de229c9a00 67
dkato 0:f5de229c9a00 68 extern "C" int UART_ReceiveData(int inTimeOutTime, int inDataSize, UINT8 *outResult) {
dkato 0:f5de229c9a00 69 return serial.readBuf((char *)outResult, inDataSize, inTimeOutTime);
dkato 0:f5de229c9a00 70 }
dkato 0:f5de229c9a00 71
dkato 0:f5de229c9a00 72 void SetRegistrationrReq(void) {
dkato 0:f5de229c9a00 73 registrationr_req = true;
dkato 0:f5de229c9a00 74 }
dkato 0:f5de229c9a00 75
dkato 0:f5de229c9a00 76 void SetSettingReq(void) {
dkato 0:f5de229c9a00 77 setting_req = true;
dkato 0:f5de229c9a00 78 }
dkato 0:f5de229c9a00 79
dkato 0:f5de229c9a00 80 recognition_setting_t * GetRecognitionSettingPointer(void) {
dkato 0:f5de229c9a00 81 return &setting;
dkato 0:f5de229c9a00 82 }
dkato 0:f5de229c9a00 83
dkato 0:f5de229c9a00 84 static void EraseImage(void) {
dkato 0:f5de229c9a00 85 uint32_t i = 0;
dkato 0:f5de229c9a00 86 while (i < sizeof(user_frame_buffer0)) {
dkato 0:f5de229c9a00 87 user_frame_buffer0[i++] = 0x10;
dkato 0:f5de229c9a00 88 user_frame_buffer0[i++] = 0x80;
dkato 0:f5de229c9a00 89 }
dkato 0:f5de229c9a00 90 }
dkato 0:f5de229c9a00 91
dkato 0:f5de229c9a00 92 static void DrawImage(int x, int y, int nWidth, int nHeight, UINT8 *unImageBuffer, int magnification) {
dkato 0:f5de229c9a00 93 int idx_base;
dkato 0:f5de229c9a00 94 int idx_w = 0;
dkato 0:f5de229c9a00 95 int wk_tmp = 0;
dkato 0:f5de229c9a00 96 int i;
dkato 0:f5de229c9a00 97 int j;
dkato 0:f5de229c9a00 98 int k;
dkato 0:f5de229c9a00 99 int idx_r = 0;
dkato 0:f5de229c9a00 100
dkato 0:f5de229c9a00 101 if (magnification <= 0) {
dkato 0:f5de229c9a00 102 return;
dkato 0:f5de229c9a00 103 }
dkato 0:f5de229c9a00 104
dkato 0:f5de229c9a00 105 idx_base = (x + (DISP_PIXEL_WIDTH * y)) * RESULT_BUFFER_BYTE_PER_PIXEL;
dkato 0:f5de229c9a00 106
dkato 0:f5de229c9a00 107 for (i = 0; i < nHeight; i++) {
dkato 0:f5de229c9a00 108 idx_w = idx_base + (DISP_PIXEL_WIDTH * RESULT_BUFFER_BYTE_PER_PIXEL * i) * magnification;
dkato 0:f5de229c9a00 109 wk_tmp = idx_w;
dkato 0:f5de229c9a00 110 for (j = 0; j < nWidth; j++) {
dkato 0:f5de229c9a00 111 for (k = 0; k < magnification; k++) {
dkato 0:f5de229c9a00 112 user_frame_buffer0[idx_w] = unImageBuffer[idx_r];
dkato 0:f5de229c9a00 113 idx_w += 2;
dkato 0:f5de229c9a00 114 }
dkato 0:f5de229c9a00 115 idx_r++;
dkato 0:f5de229c9a00 116 }
dkato 3:0760680f06d8 117 for (k = 1; k < magnification; k++) {
dkato 3:0760680f06d8 118 memcpy(&user_frame_buffer0[wk_tmp + (DISP_PIXEL_WIDTH * RESULT_BUFFER_BYTE_PER_PIXEL * k)], &user_frame_buffer0[wk_tmp], idx_w - wk_tmp);
dkato 0:f5de229c9a00 119 }
dkato 0:f5de229c9a00 120 }
dkato 0:f5de229c9a00 121 }
dkato 0:f5de229c9a00 122
dkato 0:f5de229c9a00 123 static void DrawSquare(int x, int y, int size, uint32_t const colour) {
dkato 0:f5de229c9a00 124 int wk_x;
dkato 0:f5de229c9a00 125 int wk_y;
dkato 0:f5de229c9a00 126 int wk_w = 0;
dkato 0:f5de229c9a00 127 int wk_h = 0;
dkato 0:f5de229c9a00 128 int idx_base;
dkato 0:f5de229c9a00 129 int wk_idx;
dkato 0:f5de229c9a00 130 int i;
dkato 0:f5de229c9a00 131 int j;
dkato 0:f5de229c9a00 132 uint8_t coller_pix[RESULT_BUFFER_BYTE_PER_PIXEL]; /* ARGB4444 */
dkato 0:f5de229c9a00 133 bool l_draw = true;
dkato 0:f5de229c9a00 134 bool r_draw = true;
dkato 0:f5de229c9a00 135 bool t_draw = true;
dkato 0:f5de229c9a00 136 bool b_draw = true;
dkato 0:f5de229c9a00 137
dkato 0:f5de229c9a00 138 if ((x - (size / 2)) < 0) {
dkato 0:f5de229c9a00 139 l_draw = false;
dkato 0:f5de229c9a00 140 wk_w += x;
dkato 0:f5de229c9a00 141 wk_x = 0;
dkato 0:f5de229c9a00 142 } else {
dkato 0:f5de229c9a00 143 wk_w += (size / 2);
dkato 0:f5de229c9a00 144 wk_x = x - (size / 2);
dkato 0:f5de229c9a00 145 }
dkato 0:f5de229c9a00 146
dkato 0:f5de229c9a00 147 if ((x + (size / 2)) >= 1600) {
dkato 0:f5de229c9a00 148 r_draw = false;
dkato 0:f5de229c9a00 149 wk_w += (1600 - x);
dkato 0:f5de229c9a00 150 } else {
dkato 0:f5de229c9a00 151 wk_w += (size / 2);
dkato 0:f5de229c9a00 152 }
dkato 0:f5de229c9a00 153
dkato 0:f5de229c9a00 154 if ((y - (size / 2)) < 0) {
dkato 0:f5de229c9a00 155 t_draw = false;
dkato 0:f5de229c9a00 156 wk_h += y;
dkato 0:f5de229c9a00 157 wk_y = 0;
dkato 0:f5de229c9a00 158 } else {
dkato 0:f5de229c9a00 159 wk_h += (size / 2);
dkato 0:f5de229c9a00 160 wk_y = y - (size / 2);
dkato 0:f5de229c9a00 161 }
dkato 0:f5de229c9a00 162
dkato 0:f5de229c9a00 163 if ((y + (size / 2)) >= 1200) {
dkato 0:f5de229c9a00 164 b_draw = false;
dkato 0:f5de229c9a00 165 wk_h += (1200 - y);
dkato 0:f5de229c9a00 166 } else {
dkato 0:f5de229c9a00 167 wk_h += (size / 2);
dkato 0:f5de229c9a00 168 }
dkato 0:f5de229c9a00 169
dkato 0:f5de229c9a00 170 wk_x = wk_x / 5;
dkato 0:f5de229c9a00 171 wk_y = wk_y / 5;
dkato 0:f5de229c9a00 172 wk_w = wk_w / 5;
dkato 0:f5de229c9a00 173 wk_h = wk_h / 5;
dkato 0:f5de229c9a00 174
dkato 0:f5de229c9a00 175 if ((colour == 0x0000f0f0) || (colour == 0x0000fff4)) {
dkato 0:f5de229c9a00 176 str_draw_x = wk_x;
dkato 0:f5de229c9a00 177 str_draw_y = wk_y + wk_h + 1;
dkato 0:f5de229c9a00 178 }
dkato 0:f5de229c9a00 179
dkato 0:f5de229c9a00 180 idx_base = (wk_x + (DISP_PIXEL_WIDTH * wk_y)) * RESULT_BUFFER_BYTE_PER_PIXEL;
dkato 0:f5de229c9a00 181
dkato 0:f5de229c9a00 182 /* Select color */
dkato 0:f5de229c9a00 183 coller_pix[0] = (colour >> 8) & 0xff; /* 4:Green 4:Blue */
dkato 0:f5de229c9a00 184 coller_pix[1] = colour & 0xff; /* 4:Alpha 4:Red */
dkato 0:f5de229c9a00 185
dkato 0:f5de229c9a00 186 /* top */
dkato 0:f5de229c9a00 187 if (t_draw) {
dkato 0:f5de229c9a00 188 wk_idx = idx_base;
dkato 0:f5de229c9a00 189 for (j = 0; j < wk_w; j++) {
dkato 0:f5de229c9a00 190 user_frame_buffer_result[wk_idx++] = coller_pix[0];
dkato 0:f5de229c9a00 191 user_frame_buffer_result[wk_idx++] = coller_pix[1];
dkato 0:f5de229c9a00 192 }
dkato 0:f5de229c9a00 193 }
dkato 0:f5de229c9a00 194
dkato 0:f5de229c9a00 195 /* middle */
dkato 0:f5de229c9a00 196 for (i = 1; i < (wk_h - 1); i++) {
dkato 0:f5de229c9a00 197 wk_idx = idx_base + (DISP_PIXEL_WIDTH * RESULT_BUFFER_BYTE_PER_PIXEL * i);
dkato 0:f5de229c9a00 198 if (l_draw) {
dkato 0:f5de229c9a00 199 user_frame_buffer_result[wk_idx + 0] = coller_pix[0];
dkato 0:f5de229c9a00 200 user_frame_buffer_result[wk_idx + 1] = coller_pix[1];
dkato 0:f5de229c9a00 201 }
dkato 0:f5de229c9a00 202 wk_idx += (wk_w - 1) * 2;
dkato 0:f5de229c9a00 203 if (r_draw) {
dkato 0:f5de229c9a00 204 user_frame_buffer_result[wk_idx + 0] = coller_pix[0];
dkato 0:f5de229c9a00 205 user_frame_buffer_result[wk_idx + 1] = coller_pix[1];
dkato 0:f5de229c9a00 206 }
dkato 0:f5de229c9a00 207 }
dkato 0:f5de229c9a00 208
dkato 0:f5de229c9a00 209 /* bottom */
dkato 0:f5de229c9a00 210 if (b_draw) {
dkato 0:f5de229c9a00 211 wk_idx = idx_base + (DISP_PIXEL_WIDTH * RESULT_BUFFER_BYTE_PER_PIXEL * (wk_h - 1));
dkato 0:f5de229c9a00 212 for (j = 0; j < wk_w; j++) {
dkato 0:f5de229c9a00 213 user_frame_buffer_result[wk_idx++] = coller_pix[0];
dkato 0:f5de229c9a00 214 user_frame_buffer_result[wk_idx++] = coller_pix[1];
dkato 0:f5de229c9a00 215 }
dkato 0:f5de229c9a00 216 }
dkato 0:f5de229c9a00 217 }
dkato 0:f5de229c9a00 218
dkato 0:f5de229c9a00 219 static void DrawString(const char * str, uint32_t const colour) {
dkato 0:f5de229c9a00 220 ascii_font.Erase(0x00000090, str_draw_x, str_draw_y,
dkato 0:f5de229c9a00 221 (AsciiFont::CHAR_PIX_WIDTH * strlen(str) + 2),
dkato 0:f5de229c9a00 222 (AsciiFont::CHAR_PIX_HEIGHT + 2));
dkato 0:f5de229c9a00 223 ascii_font.DrawStr(str, str_draw_x + 1, str_draw_y + 1, colour, 1);
dkato 0:f5de229c9a00 224 str_draw_y += AsciiFont::CHAR_PIX_HEIGHT + 1;
dkato 0:f5de229c9a00 225 }
dkato 0:f5de229c9a00 226
dkato 0:f5de229c9a00 227 static void button_fall(void) {
dkato 0:f5de229c9a00 228 if (imageNo_setting == HVC_EXECUTE_IMAGE_NONE) {
dkato 0:f5de229c9a00 229 imageNo_setting = HVC_EXECUTE_IMAGE_QVGA_HALF;
dkato 0:f5de229c9a00 230 } else if (imageNo_setting == HVC_EXECUTE_IMAGE_QVGA_HALF) {
dkato 0:f5de229c9a00 231 imageNo_setting = HVC_EXECUTE_IMAGE_QVGA;
dkato 0:f5de229c9a00 232 } else {
dkato 0:f5de229c9a00 233 imageNo_setting = HVC_EXECUTE_IMAGE_NONE;
dkato 0:f5de229c9a00 234 }
dkato 0:f5de229c9a00 235 }
dkato 0:f5de229c9a00 236
dkato 0:f5de229c9a00 237 void init_recognition_layers(DisplayBase * p_display) {
dkato 0:f5de229c9a00 238 DisplayBase::rect_t rect;
dkato 0:f5de229c9a00 239
dkato 0:f5de229c9a00 240 /* The layer by which the image is drawn */
dkato 0:f5de229c9a00 241 rect.vs = 0;
dkato 0:f5de229c9a00 242 rect.vw = DISP_PIXEL_HEIGHT;
dkato 0:f5de229c9a00 243 rect.hs = 0;
dkato 0:f5de229c9a00 244 rect.hw = DISP_PIXEL_WIDTH;
dkato 0:f5de229c9a00 245 p_display->Graphics_Read_Setting(
dkato 0:f5de229c9a00 246 DisplayBase::GRAPHICS_LAYER_0,
dkato 0:f5de229c9a00 247 (void *)user_frame_buffer0,
dkato 0:f5de229c9a00 248 FRAME_BUFFER_STRIDE,
dkato 0:f5de229c9a00 249 DisplayBase::GRAPHICS_FORMAT_YCBCR422,
dkato 0:f5de229c9a00 250 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 0:f5de229c9a00 251 &rect
dkato 0:f5de229c9a00 252 );
dkato 0:f5de229c9a00 253 p_display->Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
dkato 0:f5de229c9a00 254
dkato 0:f5de229c9a00 255 /* The layer by which the image recognition is drawn */
dkato 0:f5de229c9a00 256 rect.vs = 0;
dkato 0:f5de229c9a00 257 rect.vw = LCD_PIXEL_HEIGHT;
dkato 0:f5de229c9a00 258 rect.hs = 0;
dkato 0:f5de229c9a00 259 rect.hw = DISP_PIXEL_WIDTH;
dkato 0:f5de229c9a00 260 p_display->Graphics_Read_Setting(
dkato 0:f5de229c9a00 261 DisplayBase::GRAPHICS_LAYER_1,
dkato 0:f5de229c9a00 262 (void *)user_frame_buffer_result,
dkato 0:f5de229c9a00 263 RESULT_BUFFER_STRIDE,
dkato 0:f5de229c9a00 264 DisplayBase::GRAPHICS_FORMAT_ARGB4444,
dkato 0:f5de229c9a00 265 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 0:f5de229c9a00 266 &rect
dkato 0:f5de229c9a00 267 );
dkato 0:f5de229c9a00 268 p_display->Graphics_Start(DisplayBase::GRAPHICS_LAYER_1);
dkato 0:f5de229c9a00 269 }
dkato 0:f5de229c9a00 270
dkato 0:f5de229c9a00 271 void recognition_task(DisplayBase * p_display) {
dkato 0:f5de229c9a00 272 INT32 ret = 0;
dkato 0:f5de229c9a00 273 UINT8 status;
dkato 0:f5de229c9a00 274 HVC_VERSION version;
dkato 0:f5de229c9a00 275 HVC_RESULT *pHVCResult = NULL;
dkato 5:49a61433290a 276
dkato 5:49a61433290a 277 int nSTBFaceCount;
dkato 5:49a61433290a 278 STB_FACE *pSTBFaceResult;
dkato 5:49a61433290a 279 int nSTBBodyCount;
dkato 5:49a61433290a 280 STB_BODY *pSTBBodyResult;
dkato 5:49a61433290a 281 int nIndex;
dkato 5:49a61433290a 282
dkato 0:f5de229c9a00 283 HVC_IMAGE *pImage = NULL;
dkato 0:f5de229c9a00 284 INT32 execFlag;
dkato 0:f5de229c9a00 285 INT32 imageNo;
dkato 0:f5de229c9a00 286 INT32 userID;
dkato 0:f5de229c9a00 287 INT32 next_userID;
dkato 0:f5de229c9a00 288 INT32 dataID;
dkato 0:f5de229c9a00 289 const char *pExStr[] = {"?", "Neutral", "Happiness", "Surprise", "Anger", "Sadness"};
dkato 0:f5de229c9a00 290 uint32_t i;
dkato 3:0760680f06d8 291 char Str_disp[32];
dkato 0:f5de229c9a00 292 Timer resp_time;
dkato 5:49a61433290a 293 INT32 TrackingID;
dkato 0:f5de229c9a00 294
dkato 0:f5de229c9a00 295 /* Register the button */
dkato 0:f5de229c9a00 296 button.fall(&button_fall);
dkato 0:f5de229c9a00 297
dkato 0:f5de229c9a00 298 /* Initializing Recognition layers */
dkato 0:f5de229c9a00 299 EraseImage();
dkato 0:f5de229c9a00 300 memset(user_frame_buffer_result, 0, sizeof(user_frame_buffer_result));
dkato 0:f5de229c9a00 301 init_recognition_layers(p_display);
dkato 0:f5de229c9a00 302
dkato 0:f5de229c9a00 303 /* Result Structure Allocation */
dkato 0:f5de229c9a00 304 pHVCResult = (HVC_RESULT *)malloc(sizeof(HVC_RESULT));
dkato 0:f5de229c9a00 305 if (pHVCResult == NULL) {
dkato 0:f5de229c9a00 306 printf("Memory Allocation Error : %08x\n", sizeof(HVC_RESULT));
dkato 0:f5de229c9a00 307 mbed_die();
dkato 0:f5de229c9a00 308 }
dkato 0:f5de229c9a00 309
dkato 5:49a61433290a 310 /* STB Initialize */
dkato 5:49a61433290a 311 ret = STB_Init(STB_FUNC_BD | STB_FUNC_DT | STB_FUNC_PT | STB_FUNC_AG | STB_FUNC_GN);
dkato 5:49a61433290a 312 if (ret != 0) {
dkato 5:49a61433290a 313 printf("STB_Init Error : %d\n", ret);
dkato 5:49a61433290a 314 mbed_die();
dkato 5:49a61433290a 315 }
dkato 5:49a61433290a 316
dkato 0:f5de229c9a00 317 /* Image Structure allocation */
dkato 0:f5de229c9a00 318 pImage = (HVC_IMAGE *)malloc(sizeof(HVC_IMAGE));
dkato 0:f5de229c9a00 319 if (pImage == NULL) {
dkato 0:f5de229c9a00 320 printf("Memory Allocation Error : %08x\n", sizeof(HVC_RESULT));
dkato 0:f5de229c9a00 321 mbed_die();
dkato 0:f5de229c9a00 322 }
dkato 0:f5de229c9a00 323
dkato 0:f5de229c9a00 324 while (1) {
dkato 0:f5de229c9a00 325 /* try to connect a serial device */
dkato 0:f5de229c9a00 326 while (!serial.connect()) {
dkato 0:f5de229c9a00 327 Thread::wait(500);
dkato 0:f5de229c9a00 328 }
dkato 0:f5de229c9a00 329 serial.baud(921600);
dkato 0:f5de229c9a00 330 setting_req = true;
dkato 0:f5de229c9a00 331
dkato 0:f5de229c9a00 332 do {
dkato 0:f5de229c9a00 333 /* Initializing variables */
dkato 0:f5de229c9a00 334 next_userID = 0;
dkato 0:f5de229c9a00 335 dataID = 0;
dkato 0:f5de229c9a00 336
dkato 0:f5de229c9a00 337 /* Get Model and Version */
dkato 0:f5de229c9a00 338 ret = HVC_GetVersion(UART_SETTING_TIMEOUT, &version, &status);
dkato 0:f5de229c9a00 339 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 340 break;
dkato 0:f5de229c9a00 341 }
dkato 0:f5de229c9a00 342
dkato 0:f5de229c9a00 343 while (1) {
dkato 0:f5de229c9a00 344 if (!serial.connected()) {
dkato 0:f5de229c9a00 345 break;
dkato 0:f5de229c9a00 346 }
dkato 0:f5de229c9a00 347
dkato 0:f5de229c9a00 348 /* Execute Setting */
dkato 0:f5de229c9a00 349 if (setting_req) {
dkato 0:f5de229c9a00 350 setting_req = false;
dkato 0:f5de229c9a00 351 /* Set Camera Angle */
dkato 0:f5de229c9a00 352 ret = HVC_SetCameraAngle(UART_SETTING_TIMEOUT, SENSOR_ROLL_ANGLE_DEFAULT, &status);
dkato 0:f5de229c9a00 353 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 354 break;
dkato 0:f5de229c9a00 355 }
dkato 0:f5de229c9a00 356 /* Set Threshold Values */
dkato 0:f5de229c9a00 357 ret = HVC_SetThreshold(UART_SETTING_TIMEOUT, &setting.threshold, &status);
dkato 0:f5de229c9a00 358 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 359 break;
dkato 0:f5de229c9a00 360 }
dkato 0:f5de229c9a00 361 ret = HVC_GetThreshold(UART_SETTING_TIMEOUT, &setting.threshold, &status);
dkato 0:f5de229c9a00 362 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 363 break;
dkato 0:f5de229c9a00 364 }
dkato 0:f5de229c9a00 365 /* Set Detection Size */
dkato 0:f5de229c9a00 366 ret = HVC_SetSizeRange(UART_SETTING_TIMEOUT, &setting.sizeRange, &status);
dkato 0:f5de229c9a00 367 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 368 break;
dkato 0:f5de229c9a00 369 }
dkato 0:f5de229c9a00 370 ret = HVC_GetSizeRange(UART_SETTING_TIMEOUT, &setting.sizeRange, &status);
dkato 0:f5de229c9a00 371 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 372 break;
dkato 0:f5de229c9a00 373 }
dkato 0:f5de229c9a00 374 /* Set Face Angle */
dkato 0:f5de229c9a00 375 ret = HVC_SetFaceDetectionAngle(UART_SETTING_TIMEOUT, setting.pose, setting.angle, &status);
dkato 0:f5de229c9a00 376 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 377 break;
dkato 0:f5de229c9a00 378 }
dkato 0:f5de229c9a00 379 ret = HVC_GetFaceDetectionAngle(UART_SETTING_TIMEOUT, &setting.pose, &setting.angle, &status);
dkato 0:f5de229c9a00 380 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 381 break;
dkato 0:f5de229c9a00 382 }
dkato 5:49a61433290a 383
dkato 5:49a61433290a 384 /* Set STB Parameters */
dkato 5:49a61433290a 385 ret = STB_SetTrParam(STB_RETRYCOUNT_DEFAULT, STB_POSSTEADINESS_DEFAULT, STB_SIZESTEADINESS_DEFAULT);
dkato 5:49a61433290a 386 if (ret != 0) {
dkato 5:49a61433290a 387 break;
dkato 5:49a61433290a 388 }
dkato 5:49a61433290a 389 ret = STB_SetPeParam(STB_PE_THRESHOLD_DEFAULT, STB_PE_ANGLEUDMIN_DEFAULT, STB_PE_ANGLEUDMAX_DEFAULT,
dkato 5:49a61433290a 390 STB_PE_ANGLELRMIN_DEFAULT, STB_PE_ANGLELRMAX_DEFAULT, STB_PE_FRAME_DEFAULT);
dkato 5:49a61433290a 391 if (ret != 0) {
dkato 5:49a61433290a 392 break;
dkato 5:49a61433290a 393 }
dkato 0:f5de229c9a00 394 }
dkato 0:f5de229c9a00 395
dkato 0:f5de229c9a00 396 /* Execute Registration */
dkato 0:f5de229c9a00 397 if (registrationr_req) {
dkato 1:11be006960b1 398 int wk_width;
dkato 1:11be006960b1 399
dkato 0:f5de229c9a00 400 if ((pHVCResult->fdResult.num == 1) && (pHVCResult->fdResult.fcResult[0].recognitionResult.uid >= 0)) {
dkato 0:f5de229c9a00 401 userID = pHVCResult->fdResult.fcResult[0].recognitionResult.uid;
dkato 0:f5de229c9a00 402 } else {
dkato 0:f5de229c9a00 403 userID = next_userID;
dkato 0:f5de229c9a00 404 }
dkato 0:f5de229c9a00 405 ret = HVC_Registration(UART_REGIST_EXECUTE_TIMEOUT, userID, dataID, pImage, &status);
dkato 0:f5de229c9a00 406 if ((ret == 0) && (status == 0)) {
dkato 0:f5de229c9a00 407 if (userID == next_userID) {
dkato 0:f5de229c9a00 408 next_userID++;
dkato 0:f5de229c9a00 409 if (next_userID >= USER_ID_NUM_MAX) {
dkato 0:f5de229c9a00 410 next_userID = 0;
dkato 0:f5de229c9a00 411 }
dkato 0:f5de229c9a00 412 }
dkato 0:f5de229c9a00 413 memset(user_frame_buffer_result, 0, sizeof(user_frame_buffer_result));
dkato 0:f5de229c9a00 414 DrawImage(128, 88, pImage->width, pImage->height, pImage->image, 1);
dkato 0:f5de229c9a00 415 memset(Str_disp, 0, sizeof(Str_disp));
dkato 0:f5de229c9a00 416 sprintf(Str_disp, "USER%03d", userID + 1);
dkato 1:11be006960b1 417 wk_width = (AsciiFont::CHAR_PIX_WIDTH * strlen(Str_disp)) + 2;
dkato 0:f5de229c9a00 418 ascii_font.Erase(0x00000090, (DISP_PIXEL_WIDTH - wk_width) / 2, 153, wk_width, (AsciiFont::CHAR_PIX_HEIGHT + 2));
dkato 1:11be006960b1 419 ascii_font.DrawStr(Str_disp, (DISP_PIXEL_WIDTH - wk_width) / 2 + 1, 154, 0x0000ffff, 1);
dkato 0:f5de229c9a00 420 Thread::wait(1200);
dkato 1:11be006960b1 421 } else {
dkato 1:11be006960b1 422 if (status == 0x02) {
dkato 1:11be006960b1 423 wk_width = (AsciiFont::CHAR_PIX_WIDTH * (sizeof(ERROR_02) - 1)) + 4;
dkato 1:11be006960b1 424 ascii_font.Erase(0x00000090, (DISP_PIXEL_WIDTH - wk_width) / 2, 120, wk_width, (AsciiFont::CHAR_PIX_HEIGHT + 3));
dkato 1:11be006960b1 425 ascii_font.DrawStr(ERROR_02, (DISP_PIXEL_WIDTH - wk_width) / 2 + 2, 121, 0x0000ffff, 1);
dkato 1:11be006960b1 426 Thread::wait(1500);
dkato 1:11be006960b1 427 }
dkato 0:f5de229c9a00 428 }
dkato 0:f5de229c9a00 429 registrationr_req = false;
dkato 0:f5de229c9a00 430 }
dkato 0:f5de229c9a00 431
dkato 0:f5de229c9a00 432 /* Execute Detection */
dkato 0:f5de229c9a00 433 execFlag = setting.execFlag;
dkato 0:f5de229c9a00 434 if ((execFlag & HVC_ACTIV_FACE_DETECTION) == 0) {
dkato 0:f5de229c9a00 435 execFlag &= ~(HVC_ACTIV_AGE_ESTIMATION | HVC_ACTIV_GENDER_ESTIMATION | HVC_ACTIV_EXPRESSION_ESTIMATION);
dkato 0:f5de229c9a00 436 }
dkato 5:49a61433290a 437 if (execFlag != 0) { // for STB
dkato 5:49a61433290a 438 execFlag |= HVC_ACTIV_FACE_DIRECTION;
dkato 5:49a61433290a 439 }
dkato 0:f5de229c9a00 440 imageNo = imageNo_setting;
dkato 0:f5de229c9a00 441 resp_time.reset();
dkato 0:f5de229c9a00 442 resp_time.start();
dkato 0:f5de229c9a00 443 ret = HVC_ExecuteEx(UART_EXECUTE_TIMEOUT, execFlag, imageNo, pHVCResult, &status);
dkato 0:f5de229c9a00 444 resp_time.stop();
dkato 5:49a61433290a 445
dkato 5:49a61433290a 446 /* STB */
dkato 5:49a61433290a 447 if (STB_Exec(pHVCResult->executedFunc, pHVCResult, &nSTBFaceCount, &pSTBFaceResult, &nSTBBodyCount, &pSTBBodyResult) == 0) {
dkato 5:49a61433290a 448 for ( i = 0; i < nSTBBodyCount; i++ )
dkato 5:49a61433290a 449 {
dkato 5:49a61433290a 450 if ( pHVCResult->bdResult.num <= i ) break;
dkato 5:49a61433290a 451
dkato 5:49a61433290a 452 nIndex = pSTBBodyResult[i].nDetectID;
dkato 6:8c0c70710090 453 if (nIndex >= 0) {
dkato 6:8c0c70710090 454 pHVCResult->bdResult.bdResult[nIndex].posX = (short)pSTBBodyResult[i].center.x;
dkato 6:8c0c70710090 455 pHVCResult->bdResult.bdResult[nIndex].posY = (short)pSTBBodyResult[i].center.y;
dkato 6:8c0c70710090 456 pHVCResult->bdResult.bdResult[nIndex].size = pSTBBodyResult[i].nSize;
dkato 6:8c0c70710090 457 }
dkato 5:49a61433290a 458 }
dkato 5:49a61433290a 459 for (i = 0; i < nSTBFaceCount; i++)
dkato 5:49a61433290a 460 {
dkato 5:49a61433290a 461 if (pHVCResult->fdResult.num <= i) break;
dkato 5:49a61433290a 462
dkato 5:49a61433290a 463 nIndex = pSTBFaceResult[i].nDetectID;
dkato 6:8c0c70710090 464 if (nIndex >= 0) {
dkato 6:8c0c70710090 465 pHVCResult->fdResult.fcResult[nIndex].dtResult.posX = (short)pSTBFaceResult[i].center.x;
dkato 6:8c0c70710090 466 pHVCResult->fdResult.fcResult[nIndex].dtResult.posY = (short)pSTBFaceResult[i].center.y;
dkato 6:8c0c70710090 467 pHVCResult->fdResult.fcResult[nIndex].dtResult.size = pSTBFaceResult[i].nSize;
dkato 5:49a61433290a 468
dkato 6:8c0c70710090 469 if (pHVCResult->executedFunc & HVC_ACTIV_AGE_ESTIMATION) {
dkato 6:8c0c70710090 470 pHVCResult->fdResult.fcResult[nIndex].ageResult.confidence += 10000; // During
dkato 6:8c0c70710090 471 if (pSTBFaceResult[i].age.status >= STB_STATUS_COMPLETE) {
dkato 6:8c0c70710090 472 pHVCResult->fdResult.fcResult[nIndex].ageResult.age = pSTBFaceResult[i].age.value;
dkato 6:8c0c70710090 473 pHVCResult->fdResult.fcResult[nIndex].ageResult.confidence += 10000; // Complete
dkato 6:8c0c70710090 474 }
dkato 5:49a61433290a 475 }
dkato 6:8c0c70710090 476 if (pHVCResult->executedFunc & HVC_ACTIV_GENDER_ESTIMATION) {
dkato 6:8c0c70710090 477 pHVCResult->fdResult.fcResult[nIndex].genderResult.confidence += 10000; // During
dkato 6:8c0c70710090 478 if (pSTBFaceResult[i].gender.status >= STB_STATUS_COMPLETE) {
dkato 6:8c0c70710090 479 pHVCResult->fdResult.fcResult[nIndex].genderResult.gender = pSTBFaceResult[i].gender.value;
dkato 6:8c0c70710090 480 pHVCResult->fdResult.fcResult[nIndex].genderResult.confidence += 10000; // Complete
dkato 6:8c0c70710090 481 }
dkato 5:49a61433290a 482 }
dkato 5:49a61433290a 483 }
dkato 5:49a61433290a 484 }
dkato 5:49a61433290a 485 }
dkato 5:49a61433290a 486
dkato 0:f5de229c9a00 487 if ((ret == 0) && (status == 0)) {
dkato 0:f5de229c9a00 488 if (imageNo == HVC_EXECUTE_IMAGE_QVGA_HALF) {
dkato 0:f5de229c9a00 489 DrawImage(0, 0, pHVCResult->image.width, pHVCResult->image.height, pHVCResult->image.image, 2);
dkato 0:f5de229c9a00 490 } else if (imageNo == HVC_EXECUTE_IMAGE_QVGA) {
dkato 0:f5de229c9a00 491 DrawImage(0, 0, pHVCResult->image.width, pHVCResult->image.height, pHVCResult->image.image, 1);
dkato 0:f5de229c9a00 492 } else {
dkato 0:f5de229c9a00 493 EraseImage();
dkato 0:f5de229c9a00 494 }
dkato 0:f5de229c9a00 495 memset(user_frame_buffer_result, 0, sizeof(user_frame_buffer_result));
dkato 0:f5de229c9a00 496 if (pHVCResult->executedFunc & HVC_ACTIV_BODY_DETECTION) {
dkato 0:f5de229c9a00 497 /* Body Detection result */
dkato 0:f5de229c9a00 498 for (i = 0; i < pHVCResult->bdResult.num; i++) {
dkato 0:f5de229c9a00 499 DrawSquare(pHVCResult->bdResult.bdResult[i].posX,
dkato 0:f5de229c9a00 500 pHVCResult->bdResult.bdResult[i].posY,
dkato 0:f5de229c9a00 501 pHVCResult->bdResult.bdResult[i].size,
dkato 0:f5de229c9a00 502 0x000000ff);
dkato 0:f5de229c9a00 503 }
dkato 0:f5de229c9a00 504 }
dkato 0:f5de229c9a00 505
dkato 0:f5de229c9a00 506 /* Face Detection result */
dkato 0:f5de229c9a00 507 if (pHVCResult->executedFunc &
dkato 0:f5de229c9a00 508 (HVC_ACTIV_FACE_DETECTION | HVC_ACTIV_FACE_DIRECTION |
dkato 0:f5de229c9a00 509 HVC_ACTIV_AGE_ESTIMATION | HVC_ACTIV_GENDER_ESTIMATION |
dkato 0:f5de229c9a00 510 HVC_ACTIV_GAZE_ESTIMATION | HVC_ACTIV_BLINK_ESTIMATION |
dkato 0:f5de229c9a00 511 HVC_ACTIV_EXPRESSION_ESTIMATION | HVC_ACTIV_FACE_RECOGNITION)){
dkato 0:f5de229c9a00 512 for (i = 0; i < pHVCResult->fdResult.num; i++) {
dkato 0:f5de229c9a00 513 if (pHVCResult->executedFunc & HVC_ACTIV_FACE_DETECTION) {
dkato 0:f5de229c9a00 514 uint32_t detection_colour = 0x0000f0f0; /* green */
dkato 0:f5de229c9a00 515
dkato 0:f5de229c9a00 516 if (pHVCResult->executedFunc & HVC_ACTIV_FACE_RECOGNITION) {
dkato 0:f5de229c9a00 517 if (pHVCResult->fdResult.fcResult[i].recognitionResult.uid >= 0) {
dkato 0:f5de229c9a00 518 detection_colour = 0x0000fff4; /* blue */
dkato 0:f5de229c9a00 519 }
dkato 0:f5de229c9a00 520 }
dkato 0:f5de229c9a00 521 /* Detection */
dkato 0:f5de229c9a00 522 DrawSquare(pHVCResult->fdResult.fcResult[i].dtResult.posX,
dkato 0:f5de229c9a00 523 pHVCResult->fdResult.fcResult[i].dtResult.posY,
dkato 0:f5de229c9a00 524 pHVCResult->fdResult.fcResult[i].dtResult.size,
dkato 0:f5de229c9a00 525 detection_colour);
dkato 0:f5de229c9a00 526 }
dkato 5:49a61433290a 527 TrackingID = 0;
dkato 5:49a61433290a 528 for (int j = 0; j < nSTBFaceCount; j++)
dkato 5:49a61433290a 529 {
dkato 5:49a61433290a 530 if (pSTBFaceResult[j].nDetectID == i) {
dkato 5:49a61433290a 531 TrackingID = pSTBFaceResult[j].nTrackingID;
dkato 5:49a61433290a 532 break;
dkato 5:49a61433290a 533 }
dkato 5:49a61433290a 534 }
dkato 5:49a61433290a 535 memset(Str_disp, 0, sizeof(Str_disp));
dkato 0:f5de229c9a00 536 if (pHVCResult->executedFunc & HVC_ACTIV_FACE_RECOGNITION) {
dkato 0:f5de229c9a00 537 /* Recognition */
dkato 5:49a61433290a 538 if (pHVCResult->fdResult.fcResult[i].recognitionResult.uid < 0) {
dkato 5:49a61433290a 539 sprintf(Str_disp, "ID:%d", TrackingID);
dkato 0:f5de229c9a00 540 } else {
dkato 0:f5de229c9a00 541 sprintf(Str_disp, "USER%03d", pHVCResult->fdResult.fcResult[i].recognitionResult.uid + 1);
dkato 0:f5de229c9a00 542 }
dkato 5:49a61433290a 543 } else {
dkato 5:49a61433290a 544 sprintf(Str_disp, "ID:%d", TrackingID);
dkato 0:f5de229c9a00 545 }
dkato 5:49a61433290a 546 DrawString(Str_disp, 0x0000f0ff);
dkato 0:f5de229c9a00 547 if (pHVCResult->executedFunc & HVC_ACTIV_AGE_ESTIMATION) {
dkato 0:f5de229c9a00 548 /* Age */
dkato 0:f5de229c9a00 549 if (-128 != pHVCResult->fdResult.fcResult[i].ageResult.age) {
dkato 0:f5de229c9a00 550 memset(Str_disp, 0, sizeof(Str_disp));
dkato 0:f5de229c9a00 551 sprintf(Str_disp, "Age:%d", pHVCResult->fdResult.fcResult[i].ageResult.age);
dkato 5:49a61433290a 552 if (pHVCResult->fdResult.fcResult[i].ageResult.confidence < 20000) {
dkato 5:49a61433290a 553 strcat(Str_disp, " (?)");
dkato 5:49a61433290a 554 }
dkato 0:f5de229c9a00 555 DrawString(Str_disp, 0x0000f0ff);
dkato 0:f5de229c9a00 556 }
dkato 0:f5de229c9a00 557 }
dkato 0:f5de229c9a00 558 if (pHVCResult->executedFunc & HVC_ACTIV_GENDER_ESTIMATION) {
dkato 0:f5de229c9a00 559 /* Gender */
dkato 0:f5de229c9a00 560 if (-128 != pHVCResult->fdResult.fcResult[i].genderResult.gender) {
dkato 5:49a61433290a 561 uint32_t wk_color;
dkato 5:49a61433290a 562 memset(Str_disp, 0, sizeof(Str_disp));
dkato 0:f5de229c9a00 563 if (1 == pHVCResult->fdResult.fcResult[i].genderResult.gender) {
dkato 5:49a61433290a 564 sprintf(Str_disp, "Male");
dkato 5:49a61433290a 565 wk_color = 0x0000fff4;
dkato 0:f5de229c9a00 566 } else {
dkato 5:49a61433290a 567 sprintf(Str_disp, "Female");
dkato 5:49a61433290a 568 wk_color = 0x00006dff;
dkato 0:f5de229c9a00 569 }
dkato 5:49a61433290a 570 if ( pHVCResult->fdResult.fcResult[i].genderResult.confidence < 20000 ) {
dkato 5:49a61433290a 571 strcat(Str_disp, " (?)");
dkato 5:49a61433290a 572 }
dkato 5:49a61433290a 573 DrawString(Str_disp, wk_color);
dkato 0:f5de229c9a00 574 }
dkato 0:f5de229c9a00 575 }
dkato 0:f5de229c9a00 576 if (pHVCResult->executedFunc & HVC_ACTIV_EXPRESSION_ESTIMATION) {
dkato 0:f5de229c9a00 577 /* Expression */
dkato 0:f5de229c9a00 578 if (-128 != pHVCResult->fdResult.fcResult[i].expressionResult.score[0]) {
dkato 0:f5de229c9a00 579 uint32_t colour;
dkato 0:f5de229c9a00 580
dkato 0:f5de229c9a00 581 if (pHVCResult->fdResult.fcResult[i].expressionResult.topExpression > EX_SADNESS) {
dkato 0:f5de229c9a00 582 pHVCResult->fdResult.fcResult[i].expressionResult.topExpression = 0;
dkato 0:f5de229c9a00 583 }
dkato 0:f5de229c9a00 584 switch (pHVCResult->fdResult.fcResult[i].expressionResult.topExpression) {
dkato 0:f5de229c9a00 585 case 1: colour = 0x0000ffff; break; /* white */
dkato 0:f5de229c9a00 586 case 2: colour = 0x0000f0ff; break; /* yellow */
dkato 0:f5de229c9a00 587 case 3: colour = 0x000060ff; break; /* orange */
dkato 0:f5de229c9a00 588 case 4: colour = 0x00000fff; break; /* purple */
dkato 0:f5de229c9a00 589 case 5: colour = 0x0000fff4; break; /* blue */
dkato 0:f5de229c9a00 590 default: colour = 0x0000ffff; break; /* white */
dkato 0:f5de229c9a00 591 }
dkato 0:f5de229c9a00 592 DrawString(pExStr[pHVCResult->fdResult.fcResult[i].expressionResult.topExpression], colour);
dkato 0:f5de229c9a00 593 }
dkato 0:f5de229c9a00 594 }
dkato 0:f5de229c9a00 595 }
dkato 0:f5de229c9a00 596 }
dkato 0:f5de229c9a00 597 }
dkato 0:f5de229c9a00 598 /* Response time */
dkato 0:f5de229c9a00 599 memset(Str_disp, 0, sizeof(Str_disp));
dkato 0:f5de229c9a00 600 sprintf(Str_disp, "Response time:%dms", resp_time.read_ms());
dkato 0:f5de229c9a00 601 ascii_font.Erase(0, 0, 0, 0, 0);
dkato 0:f5de229c9a00 602 ascii_font.DrawStr(Str_disp, 0, LCD_PIXEL_HEIGHT - AsciiFont::CHAR_PIX_HEIGHT, 0x0000ffff, 1);
dkato 0:f5de229c9a00 603 }
dkato 0:f5de229c9a00 604 } while(0);
dkato 0:f5de229c9a00 605
dkato 0:f5de229c9a00 606 EraseImage();
dkato 0:f5de229c9a00 607 memset(user_frame_buffer_result, 0, sizeof(user_frame_buffer_result));
dkato 0:f5de229c9a00 608 }
dkato 0:f5de229c9a00 609 }