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

Overview

This sample program shows how to send the cognitive data and sensing data gathered by Omron HVC-P2 and Rohm Sensor Shield respectively to IoT Platform managed by FUJITSU ( http://jp.fujitsu.com/solutions/cloud/k5/function/paas/iot-platform/ ).

Required Hardware

Application Setup

  1. Configure the connection type. For details, please refer to the following link:
    https://developer.mbed.org/teams/Renesas/code/GR-PEACH_IoT_Platform_HTTP_sample/wiki/Connection-Type
  2. Configure Ethernet settings. For details, please refer to the following link:
    https://developer.mbed.org/teams/Renesas/code/GR-PEACH_IoT_Platform_HTTP_sample/wiki/Ethernet-settings
  3. Set up the Access Code of resource where the gathered data would be stored. For details on Access Code, please refer to the following links:
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/userguide_en.pdf
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/apireference_en.pdf
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/portalmanual_en.pdf
  4. Set up URI for the resource where the gathered data would be stored. For details, please refer to the following link:
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/userguide_en.pdf
    https://iot-docs.jp-east-1.paas.cloud.global.fujitsu.com/en/manual/apireference_en.pdf

Building Example

  1. Import this sample program onto mbed Compiler
  2. Configure the program in accordance with the description of Application Setup above
  3. Compile the sample program
  4. Plug the Ethernet cable into GR-PEACH if you would like Ethernet mode
  5. Plug micro-USB cable into the OpenSDA port which lies on the next to the RESET button
  6. Copy the binary previously downloaded to your PC to GR-PEACH in order to flash this program. When the copy is successfully completed, the drive named MBED should be re-mounted automatically
  7. Press the RESET button on the board to run the sample application

Data Format sent to IoT Platform

In this sample program, the cognitive data and sensing data are serialized into the following JSON format using picojson (https://developer.mbed.org/users/mimil/code/picojson/):

  • Face detection data

{
    "RecordType": "HVC-P2(face)",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "Age": xxx,
    "FaceRectangle": {
        "Height": xxx,
        "Left": xxx,
        "Top": xxx,
        "Width": xxx
    },
    "Gender": xxx,
    "Scores": {
        "Anger": xxx,
        "Happiness": xxx,
        "Neutral": xxx,
        "Sadness": xxx,
        "Surprise": xxx
    }
}
  • Body detection data

{
    "RecodeType": "HVC-P2(body)",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "BodyRectangle": {
        "Height": xxx,
        "Left": xxx,
        "Top": xxx,
        "Width": xxx
    }
}
  • Accelerometer data

{
    "RecodeType": "Accelerometer",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ acceleratoin(x-direction), acceleration(y-direction), acceleration(z-direction), null, null, null ]
}

Note that data[0], data[1] and data[2] are filled with the acceleration data in x, y and z direction respectively, and the remaining elements are filled with null.

  • Atmosphere data

{
    "RecodeType": "Atmosphere",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ atmosphere data, null, null, null, null, null ]
}

Note that data[0] is filled with atmosphere data, and the remaining elements are filled with null.

  • Color sensor data

{
    "RecodeType": "Color",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ Red, Green, Blue, Alpha, null, null]
}

Note that data[0], data[1], data[2] and data[3] are filled with Red, Green, Blue and Alpha elements of color respectively, and the remaining elements are filled with null.

  • Temperature data

{
    "RecodeType": "Temperature",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ Temperature, null, null, null, null, null ]
}

Note that data[0] is filled with temperature data, the remaining elements are filled with null.

  • Geomagnetism

{
    "RecodeType": "Geomagnetism",
    "id": "<GR-PEACH ID>-<Sensor ID>",
    "data": [ geomagnetism(x-direction), geomagnetism(y-direction), geomagnetism(z-direction), null, null, null]
}

Note that data[0], data[1] and data[2] are filled with the geomagnetism data in x, y and z direction respectively, and the remaining elements are filled with null.

Committer:
Osamu Nakamura
Date:
Thu Apr 12 19:04:23 2018 +0900
Revision:
7:9ae73f85dc04
Parent:
4:46e32be9507a
Update BM1422AGMV driver so that it can be compiled by ARMCC

Who changed what in which revision?

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