Mar. 14. 2018

Dependencies:   GraphicsFramework GR-PEACH_video LCD_shield_config AsciiFont R_BSP USBHost_custom

Committer:
dkato
Date:
Wed Mar 08 07:43:42 2017 +0000
Revision:
3:0760680f06d8
Parent:
1:11be006960b1
Child:
5:49a61433290a
Fixed buffer size of character string .

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