Mar. 14. 2018

Dependencies:   GraphicsFramework GR-PEACH_video LCD_shield_config AsciiFont R_BSP USBHost_custom

Revision:
5:49a61433290a
Parent:
4:55e0d1f4e55a
diff -r 55e0d1f4e55a -r 49a61433290a HVC/HVCApi/HVCApi.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HVC/HVCApi/HVCApi.c	Tue Sep 05 10:01:51 2017 +0000
@@ -0,0 +1,1297 @@
+/*---------------------------------------------------------------------------*/
+/* Copyright(C)  2017  OMRON Corporation                                     */
+/*                                                                           */
+/* Licensed under the Apache License, Version 2.0 (the "License");           */
+/* you may not use this file except in compliance with the License.          */
+/* You may obtain a copy of the License at                                   */
+/*                                                                           */
+/*     http://www.apache.org/licenses/LICENSE-2.0                            */
+/*                                                                           */
+/* Unless required by applicable law or agreed to in writing, software       */
+/* distributed under the License is distributed on an "AS IS" BASIS,         */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  */
+/* See the License for the specific language governing permissions and       */
+/* limitations under the License.                                            */
+/*---------------------------------------------------------------------------*/
+
+/* 
+    HVC Sample API
+*/
+
+#include <stdlib.h>
+#include "HVCApi.h"
+#include "HVCExtraUartFunc.h"
+
+/*----------------------------------------------------------------------------*/
+/* Command number                                                             */
+/*----------------------------------------------------------------------------*/
+#define HVC_COM_GET_VERSION             (UINT8)0x00
+#define HVC_COM_SET_CAMERA_ANGLE        (UINT8)0x01
+#define HVC_COM_GET_CAMERA_ANGLE        (UINT8)0x02
+#define HVC_COM_EXECUTE                 (UINT8)0x03
+#define HVC_COM_EXECUTEEX               (UINT8)0x04
+#define HVC_COM_SET_THRESHOLD           (UINT8)0x05
+#define HVC_COM_GET_THRESHOLD           (UINT8)0x06
+#define HVC_COM_SET_SIZE_RANGE          (UINT8)0x07
+#define HVC_COM_GET_SIZE_RANGE          (UINT8)0x08
+#define HVC_COM_SET_DETECTION_ANGLE     (UINT8)0x09
+#define HVC_COM_GET_DETECTION_ANGLE     (UINT8)0x0A
+#define HVC_COM_SET_BAUDRATE            (UINT8)0x0E
+#define HVC_COM_REGISTRATION            (UINT8)0x10
+#define HVC_COM_DELETE_DATA             (UINT8)0x11
+#define HVC_COM_DELETE_USER             (UINT8)0x12
+#define HVC_COM_DELETE_ALL              (UINT8)0x13
+#define HVC_COM_GET_PERSON_DATA         (UINT8)0x15
+#define HVC_COM_SAVE_ALBUM              (UINT8)0x20
+#define HVC_COM_LOAD_ALBUM              (UINT8)0x21
+#define HVC_COM_WRITE_ALBUM             (UINT8)0x22
+
+/*----------------------------------------------------------------------------*/
+/* Header for send signal data */
+typedef enum {
+    SEND_HEAD_SYNCBYTE = 0,
+    SEND_HEAD_COMMANDNO,
+    SEND_HEAD_DATALENGTHLSB,
+    SEND_HEAD_DATALENGTHMSB,
+    SEND_HEAD_NUM
+}SEND_HEADER;
+/*----------------------------------------------------------------------------*/
+/* Header for receive signal data */
+typedef enum {
+    RECEIVE_HEAD_SYNCBYTE = 0,
+    RECEIVE_HEAD_STATUS,
+    RECEIVE_HEAD_DATALENLL,
+    RECEIVE_HEAD_DATALENLM,
+    RECEIVE_HEAD_DATALENML,
+    RECEIVE_HEAD_DATALENMM,
+    RECEIVE_HEAD_NUM
+}RECEIVE_HEADER;
+
+/*----------------------------------------------------------------------------*/
+/* Send command signal                                                        */
+/* param    : UINT8         inCommandNo     command number                    */
+/*          : INT32         inDataSize      sending signal data size          */
+/*          : UINT8         *inData         sending signal data               */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -10...timeout error               */
+/*----------------------------------------------------------------------------*/
+static INT32 HVC_SendCommand(UINT8 inCommandNo, INT32 inDataSize, UINT8 *inData)
+{
+    INT32 i;
+    INT32 ret = 0;
+    UINT8 sendData[32];
+
+    /* Create header */
+    sendData[SEND_HEAD_SYNCBYTE]        = (UINT8)0xFE;
+    sendData[SEND_HEAD_COMMANDNO]       = (UINT8)inCommandNo;
+    sendData[SEND_HEAD_DATALENGTHLSB]   = (UINT8)(inDataSize&0xff);
+    sendData[SEND_HEAD_DATALENGTHMSB]   = (UINT8)((inDataSize>>8)&0xff);
+
+    for(i = 0; i < inDataSize; i++){
+        sendData[SEND_HEAD_NUM + i] = inData[i];
+    }
+
+    /* Send command signal */
+    ret = UART_SendData(SEND_HEAD_NUM+inDataSize, sendData);
+    if(ret != SEND_HEAD_NUM+inDataSize){
+        return HVC_ERROR_SEND_DATA;
+    }
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* Send command signal of LoadAlbum                                           */
+/* param    : UINT8         inCommandNo     command number                    */
+/*          : INT32         inDataSize      sending signal data size          */
+/*          : UINT8         *inData         sending signal data               */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -10...timeout error               */
+/*----------------------------------------------------------------------------*/
+static INT32 HVC_SendCommandOfLoadAlbum(UINT8 inCommandNo, INT32 inDataSize, UINT8 *inData)
+{   
+    INT32 i;
+    INT32 ret = 0;
+    UINT8 *pSendData = NULL;
+    
+    pSendData = (UINT8*)malloc(SEND_HEAD_NUM + 4 + inDataSize);
+
+    /* Create header */
+    pSendData[SEND_HEAD_SYNCBYTE]       = (UINT8)0xFE;
+    pSendData[SEND_HEAD_COMMANDNO]      = (UINT8)inCommandNo;
+    pSendData[SEND_HEAD_DATALENGTHLSB]  = (UINT8)4;
+    pSendData[SEND_HEAD_DATALENGTHMSB]  = (UINT8)0;
+
+    pSendData[SEND_HEAD_NUM + 0]        = (UINT8)(inDataSize & 0x000000ff);
+    pSendData[SEND_HEAD_NUM + 1]        = (UINT8)((inDataSize >> 8) & 0x000000ff);
+    pSendData[SEND_HEAD_NUM + 2]        = (UINT8)((inDataSize >> 16) & 0x000000ff);
+    pSendData[SEND_HEAD_NUM + 3]        = (UINT8)((inDataSize >> 24) & 0x000000ff);
+
+     for(i = 0; i < inDataSize; i++){
+        pSendData[SEND_HEAD_NUM + 4 + i] = inData[i];
+    }
+     
+    /* Send command signal */
+    ret = UART_SendData(SEND_HEAD_NUM+4+inDataSize, pSendData);
+    if(ret != SEND_HEAD_NUM + 4 + inDataSize){
+        ret = HVC_ERROR_SEND_DATA;
+    }
+    else{
+        ret = 0;
+    }
+    free(pSendData);
+
+    return ret;
+}
+
+/*----------------------------------------------------------------------------*/
+/* Receive header                                                             */
+/* param    : INT32         inTimeOutTime   timeout time                      */
+/*          : INT32         *outDataSize    receive signal data length        */
+/*          : UINT8         *outStatus      status                            */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -20...timeout error               */
+/*          :                               -21...invalid header error        */
+/*----------------------------------------------------------------------------*/
+static INT32 HVC_ReceiveHeader(INT32 inTimeOutTime, INT32 *outDataSize, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    UINT8 headerData[32];
+
+    /* Get header part */
+    ret = UART_ReceiveData(inTimeOutTime, RECEIVE_HEAD_NUM, headerData);
+    if(ret != RECEIVE_HEAD_NUM){
+        return HVC_ERROR_HEADER_TIMEOUT;
+    }
+    else if((UINT8)0xFE != headerData[RECEIVE_HEAD_SYNCBYTE]){
+        /* Different value indicates an invalid result */
+        return HVC_ERROR_HEADER_INVALID;
+    }
+
+    /* Get data length */
+    *outDataSize = headerData[RECEIVE_HEAD_DATALENLL] +
+                    (headerData[RECEIVE_HEAD_DATALENLM]<<8) +
+                    (headerData[RECEIVE_HEAD_DATALENML]<<16) +
+                    (headerData[RECEIVE_HEAD_DATALENMM]<<24);
+
+    /* Get command execution result */
+    *outStatus  = headerData[RECEIVE_HEAD_STATUS];
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* Receive data                                                               */
+/* param    : INT32         inTimeOutTime   timeout time                      */
+/*          : INT32         inDataSize      receive signal data size          */
+/*          : UINT8         *outResult      receive signal data               */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -20...timeout error               */
+/*----------------------------------------------------------------------------*/
+static INT32 HVC_ReceiveData(INT32 inTimeOutTime, INT32 inDataSize, UINT8 *outResult)
+{
+    INT32 ret = 0;
+
+    if ( inDataSize <= 0 ) return 0;
+
+    /* Receive data */
+    ret = UART_ReceiveData(inTimeOutTime, inDataSize, outResult);
+    if(ret != inDataSize){
+        return HVC_ERROR_DATA_TIMEOUT;
+    }
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_GetVersion                                                             */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : HVC_VERSION   *outVersion     version data                      */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_GetVersion(INT32 inTimeOutTime, HVC_VERSION *outVersion, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+
+    if((NULL == outVersion) || (NULL == outStatus)){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    /* Send GetVersion command signal */
+    ret = HVC_SendCommand(HVC_COM_GET_VERSION, 0, NULL);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+
+    if ( size > (INT32)sizeof(HVC_VERSION) ) {
+        size = sizeof(HVC_VERSION);
+    }
+
+    /* Receive data */
+    return HVC_ReceiveData(inTimeOutTime, size, (UINT8*)outVersion);
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_SetCameraAngle                                                         */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : INT32         inAngleNo       camera angle number               */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_SetCameraAngle(INT32 inTimeOutTime, INT32 inAngleNo, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 sendData[32];
+
+    if(NULL == outStatus){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    sendData[0] = (UINT8)(inAngleNo&0xff);
+    /* Send SetCameraAngle command signal */
+    ret = HVC_SendCommand(HVC_COM_SET_CAMERA_ANGLE, sizeof(UINT8), sendData);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_GetCameraAngle                                                         */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : INT32         *outAngleNo     camera angle number               */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_GetCameraAngle(INT32 inTimeOutTime, INT32 *outAngleNo, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 recvData[32];
+
+    if((NULL == outAngleNo) || (NULL == outStatus)){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    /* Send GetCameraAngle command signal */
+    ret = HVC_SendCommand(HVC_COM_GET_CAMERA_ANGLE, 0, NULL);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+
+    if ( size > (INT32)sizeof(UINT8) ) {
+        size = sizeof(UINT8);
+    }
+
+    /* Receive data */
+    ret = HVC_ReceiveData(inTimeOutTime, size, recvData);
+    *outAngleNo = recvData[0];
+    return ret;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_Execute                                                                */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : INT32         inExec          executable function               */
+/*          : INT32         inImage         image info                        */
+/*          : HVC_RESULT    *outHVCResult   result data                       */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_Execute(INT32 inTimeOutTime, INT32 inExec, INT32 inImage, HVC_RESULT *outHVCResult, UINT8 *outStatus)
+{
+    int i;
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 sendData[32];
+    UINT8 recvData[32];
+
+    if((NULL == outHVCResult) || (NULL == outStatus)){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    /* Send Execute command signal */
+    sendData[0] = (UINT8)(inExec&0xff);
+    sendData[1] = (UINT8)((inExec>>8)&0xff);
+    sendData[2] = (UINT8)(inImage&0xff);
+    ret = HVC_SendCommand(HVC_COM_EXECUTE, sizeof(UINT8)*3, sendData);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+
+    /* Receive result data */
+    if ( size >= (INT32)sizeof(UINT8)*4 ) {
+        outHVCResult->executedFunc = inExec;
+        ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*4, recvData);
+        outHVCResult->bdResult.num = recvData[0];
+        outHVCResult->hdResult.num = recvData[1];
+        outHVCResult->fdResult.num = recvData[2];
+        if ( ret != 0 ) return ret;
+        size -= sizeof(UINT8)*4;
+    }
+
+    /* Get Human Body Detection result */
+    for(i = 0; i < outHVCResult->bdResult.num; i++){
+        if ( size >= (INT32)sizeof(UINT8)*8 ) {
+            ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*8, recvData);
+            outHVCResult->bdResult.bdResult[i].posX = (short)(recvData[0] + (recvData[1]<<8));
+            outHVCResult->bdResult.bdResult[i].posY = (short)(recvData[2] + (recvData[3]<<8));
+            outHVCResult->bdResult.bdResult[i].size = (short)(recvData[4] + (recvData[5]<<8));
+            outHVCResult->bdResult.bdResult[i].confidence = (short)(recvData[6] + (recvData[7]<<8));
+            if ( ret != 0 ) return ret;
+            size -= sizeof(UINT8)*8;
+        }
+    }
+
+    /* Get Hand Detection result */
+    for(i = 0; i < outHVCResult->hdResult.num; i++){
+        if ( size >= (INT32)sizeof(UINT8)*8 ) {
+            ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*8, recvData);
+            outHVCResult->hdResult.hdResult[i].posX = (short)(recvData[0] + (recvData[1]<<8));
+            outHVCResult->hdResult.hdResult[i].posY = (short)(recvData[2] + (recvData[3]<<8));
+            outHVCResult->hdResult.hdResult[i].size = (short)(recvData[4] + (recvData[5]<<8));
+            outHVCResult->hdResult.hdResult[i].confidence = (short)(recvData[6] + (recvData[7]<<8));
+            if ( ret != 0 ) return ret;
+            size -= sizeof(UINT8)*8;
+        }
+    }
+
+    /* Face-related results */
+    for(i = 0; i < outHVCResult->fdResult.num; i++){
+        /* Face Detection result */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_FACE_DETECTION)){
+            if ( size >= (INT32)sizeof(UINT8)*8 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*8, recvData);
+                outHVCResult->fdResult.fcResult[i].dtResult.posX = (short)(recvData[0] + (recvData[1]<<8));
+                outHVCResult->fdResult.fcResult[i].dtResult.posY = (short)(recvData[2] + (recvData[3]<<8));
+                outHVCResult->fdResult.fcResult[i].dtResult.size = (short)(recvData[4] + (recvData[5]<<8));
+                outHVCResult->fdResult.fcResult[i].dtResult.confidence = (short)(recvData[6] + (recvData[7]<<8));
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*8;
+            }
+        }
+
+        /* Face direction */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_FACE_DIRECTION)){
+            if ( size >= (INT32)sizeof(UINT8)*8 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*8, recvData);
+                outHVCResult->fdResult.fcResult[i].dirResult.yaw = (short)(recvData[0] + (recvData[1]<<8));
+                outHVCResult->fdResult.fcResult[i].dirResult.pitch = (short)(recvData[2] + (recvData[3]<<8));
+                outHVCResult->fdResult.fcResult[i].dirResult.roll = (short)(recvData[4] + (recvData[5]<<8));
+                outHVCResult->fdResult.fcResult[i].dirResult.confidence = (short)(recvData[6] + (recvData[7]<<8));
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*8;
+            }
+        }
+
+        /* Age */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_AGE_ESTIMATION)){
+            if ( size >= (INT32)sizeof(UINT8)*3 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*3, recvData);
+#if(1)  // Mbed
+                outHVCResult->fdResult.fcResult[i].ageResult.age = (signed char)(recvData[0]);
+#else
+                outHVCResult->fdResult.fcResult[i].ageResult.age = (char)(recvData[0]);
+#endif
+                outHVCResult->fdResult.fcResult[i].ageResult.confidence = (short)(recvData[1] + (recvData[2]<<8));
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*3;
+            }
+        }
+
+        /* Gender */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_GENDER_ESTIMATION)){
+            if ( size >= (INT32)sizeof(UINT8)*3 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*3, recvData);
+#if(1)  // Mbed
+                outHVCResult->fdResult.fcResult[i].genderResult.gender = (signed char)(recvData[0]);
+#else
+                outHVCResult->fdResult.fcResult[i].genderResult.gender = (char)(recvData[0]);
+#endif
+                outHVCResult->fdResult.fcResult[i].genderResult.confidence = (short)(recvData[1] + (recvData[2]<<8));
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*3;
+            }
+        }
+
+        /* Gaze */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_GAZE_ESTIMATION)){
+            if ( size >= (INT32)sizeof(UINT8)*2 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*2, recvData);
+#if(1)  // Mbed
+                outHVCResult->fdResult.fcResult[i].gazeResult.gazeLR = (signed char)(recvData[0]);
+                outHVCResult->fdResult.fcResult[i].gazeResult.gazeUD = (signed char)(recvData[1]);
+#else
+                outHVCResult->fdResult.fcResult[i].gazeResult.gazeLR = (char)(recvData[0]);
+                outHVCResult->fdResult.fcResult[i].gazeResult.gazeUD = (char)(recvData[1]);
+#endif
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*2;
+            }
+        }
+
+        /* Blink */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_BLINK_ESTIMATION)){
+            if ( size >= (INT32)sizeof(UINT8)*4 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*4, recvData);
+                outHVCResult->fdResult.fcResult[i].blinkResult.ratioL = (short)(recvData[0] + (recvData[1]<<8));
+                outHVCResult->fdResult.fcResult[i].blinkResult.ratioR = (short)(recvData[2] + (recvData[3]<<8));
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*4;
+            }
+        }
+
+        /* Expression */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_EXPRESSION_ESTIMATION)){
+            if ( size >= (INT32)sizeof(UINT8)*3 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*3, recvData);
+#if(1)  // Mbed
+                outHVCResult->fdResult.fcResult[i].expressionResult.topExpression = (signed char)(recvData[0]);
+                outHVCResult->fdResult.fcResult[i].expressionResult.topScore = (signed char)(recvData[1]);
+                outHVCResult->fdResult.fcResult[i].expressionResult.degree = (signed char)(recvData[2]);
+#else
+                outHVCResult->fdResult.fcResult[i].expressionResult.topExpression = (char)(recvData[0]);
+                outHVCResult->fdResult.fcResult[i].expressionResult.topScore = (char)(recvData[1]);
+                outHVCResult->fdResult.fcResult[i].expressionResult.degree = (char)(recvData[2]);
+#endif
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*3;
+            }
+        }
+
+        /* Face Recognition */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_FACE_RECOGNITION)){
+            if ( size >= (INT32)sizeof(UINT8)*4 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*4, recvData);
+                outHVCResult->fdResult.fcResult[i].recognitionResult.uid = (short)(recvData[0] + (recvData[1]<<8));
+                outHVCResult->fdResult.fcResult[i].recognitionResult.confidence = (short)(recvData[2] + (recvData[3]<<8));
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*4;
+            }
+        }
+    }
+
+    if(HVC_EXECUTE_IMAGE_NONE != inImage){
+        /* Image data */
+        if ( size >= (INT32)sizeof(UINT8)*4 ) {
+            ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*4, recvData);
+            outHVCResult->image.width = (short)(recvData[0] + (recvData[1]<<8));
+            outHVCResult->image.height = (short)(recvData[2] + (recvData[3]<<8));
+            if ( ret != 0 ) return ret;
+            size -= sizeof(UINT8)*4;
+        }
+
+        if ( size >= (INT32)sizeof(UINT8)*outHVCResult->image.width*outHVCResult->image.height ) {
+            ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*outHVCResult->image.width*outHVCResult->image.height, outHVCResult->image.image);
+            if ( ret != 0 ) return ret;
+            size -= sizeof(UINT8)*outHVCResult->image.width*outHVCResult->image.height;
+        }
+    }
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_ExecuteEx                                                              */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : INT32         inExec          executable function               */
+/*          : INT32         inImage         image info                        */
+/*          : HVC_RESULT    *outHVCResult   result data                       */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_ExecuteEx(INT32 inTimeOutTime, INT32 inExec, INT32 inImage, HVC_RESULT *outHVCResult, UINT8 *outStatus)
+{
+    int i, j;
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 sendData[32];
+    UINT8 recvData[32];
+
+    if((NULL == outHVCResult) || (NULL == outStatus)){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    /* Send Execute command signal */
+    sendData[0] = (UINT8)(inExec&0xff);
+    sendData[1] = (UINT8)((inExec>>8)&0xff);
+    sendData[2] = (UINT8)(inImage&0xff);
+    ret = HVC_SendCommand(HVC_COM_EXECUTEEX, sizeof(UINT8)*3, sendData);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+
+    /* Receive result data */
+    if ( size >= (INT32)sizeof(UINT8)*4 ) {
+        outHVCResult->executedFunc = inExec;
+        ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*4, recvData);
+        outHVCResult->bdResult.num = recvData[0];
+        outHVCResult->hdResult.num = recvData[1];
+        outHVCResult->fdResult.num = recvData[2];
+        if ( ret != 0 ) return ret;
+        size -= sizeof(UINT8)*4;
+    }
+
+    /* Get Human Body Detection result */
+    for(i = 0; i < outHVCResult->bdResult.num; i++){
+        if ( size >= (INT32)sizeof(UINT8)*8 ) {
+            ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*8, recvData);
+            outHVCResult->bdResult.bdResult[i].posX = (short)(recvData[0] + (recvData[1]<<8));
+            outHVCResult->bdResult.bdResult[i].posY = (short)(recvData[2] + (recvData[3]<<8));
+            outHVCResult->bdResult.bdResult[i].size = (short)(recvData[4] + (recvData[5]<<8));
+            outHVCResult->bdResult.bdResult[i].confidence = (short)(recvData[6] + (recvData[7]<<8));
+            if ( ret != 0 ) return ret;
+            size -= sizeof(UINT8)*8;
+        }
+    }
+
+    /* Get Hand Detection result */
+    for(i = 0; i < outHVCResult->hdResult.num; i++){
+        if ( size >= (INT32)sizeof(UINT8)*8 ) {
+            ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*8, recvData);
+            outHVCResult->hdResult.hdResult[i].posX = (short)(recvData[0] + (recvData[1]<<8));
+            outHVCResult->hdResult.hdResult[i].posY = (short)(recvData[2] + (recvData[3]<<8));
+            outHVCResult->hdResult.hdResult[i].size = (short)(recvData[4] + (recvData[5]<<8));
+            outHVCResult->hdResult.hdResult[i].confidence = (short)(recvData[6] + (recvData[7]<<8));
+            if ( ret != 0 ) return ret;
+            size -= sizeof(UINT8)*8;
+        }
+    }
+
+    /* Face-related results */
+    for(i = 0; i < outHVCResult->fdResult.num; i++){
+        /* Face Detection result */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_FACE_DETECTION)){
+            if ( size >= (INT32)sizeof(UINT8)*8 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*8, recvData);
+                outHVCResult->fdResult.fcResult[i].dtResult.posX = (short)(recvData[0] + (recvData[1]<<8));
+                outHVCResult->fdResult.fcResult[i].dtResult.posY = (short)(recvData[2] + (recvData[3]<<8));
+                outHVCResult->fdResult.fcResult[i].dtResult.size = (short)(recvData[4] + (recvData[5]<<8));
+                outHVCResult->fdResult.fcResult[i].dtResult.confidence = (short)(recvData[6] + (recvData[7]<<8));
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*8;
+            }
+        }
+
+        /* Face direction */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_FACE_DIRECTION)){
+            if ( size >= (INT32)sizeof(UINT8)*8 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*8, recvData);
+                outHVCResult->fdResult.fcResult[i].dirResult.yaw = (short)(recvData[0] + (recvData[1]<<8));
+                outHVCResult->fdResult.fcResult[i].dirResult.pitch = (short)(recvData[2] + (recvData[3]<<8));
+                outHVCResult->fdResult.fcResult[i].dirResult.roll = (short)(recvData[4] + (recvData[5]<<8));
+                outHVCResult->fdResult.fcResult[i].dirResult.confidence = (short)(recvData[6] + (recvData[7]<<8));
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*8;
+            }
+        }
+
+        /* Age */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_AGE_ESTIMATION)){
+            if ( size >= (INT32)sizeof(UINT8)*3 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*3, recvData);
+#if(1)  // Mbed
+                outHVCResult->fdResult.fcResult[i].ageResult.age = (signed char)(recvData[0]);
+#else
+                outHVCResult->fdResult.fcResult[i].ageResult.age = (char)(recvData[0]);
+#endif
+                outHVCResult->fdResult.fcResult[i].ageResult.confidence = (short)(recvData[1] + (recvData[2]<<8));
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*3;
+            }
+        }
+
+        /* Gender */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_GENDER_ESTIMATION)){
+            if ( size >= (INT32)sizeof(UINT8)*3 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*3, recvData);
+#if(1)  // Mbed
+                outHVCResult->fdResult.fcResult[i].genderResult.gender = (signed char)(recvData[0]);
+#else
+                outHVCResult->fdResult.fcResult[i].genderResult.gender = (char)(recvData[0]);
+#endif
+                outHVCResult->fdResult.fcResult[i].genderResult.confidence = (short)(recvData[1] + (recvData[2]<<8));
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*3;
+            }
+        }
+
+        /* Gaze */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_GAZE_ESTIMATION)){
+            if ( size >= (INT32)sizeof(UINT8)*2 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*2, recvData);
+#if(1)  // Mbed
+                outHVCResult->fdResult.fcResult[i].gazeResult.gazeLR = (signed char)(recvData[0]);
+                outHVCResult->fdResult.fcResult[i].gazeResult.gazeUD = (signed char)(recvData[1]);
+#else
+                outHVCResult->fdResult.fcResult[i].gazeResult.gazeLR = (char)(recvData[0]);
+                outHVCResult->fdResult.fcResult[i].gazeResult.gazeUD = (char)(recvData[1]);
+#endif
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*2;
+            }
+        }
+
+        /* Blink */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_BLINK_ESTIMATION)){
+            if ( size >= (INT32)sizeof(UINT8)*4 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*4, recvData);
+                outHVCResult->fdResult.fcResult[i].blinkResult.ratioL = (short)(recvData[0] + (recvData[1]<<8));
+                outHVCResult->fdResult.fcResult[i].blinkResult.ratioR = (short)(recvData[2] + (recvData[3]<<8));
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*4;
+            }
+        }
+
+        /* Expression */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_EXPRESSION_ESTIMATION)){
+            if ( size >= (INT32)sizeof(UINT8)*6 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*6, recvData);
+                outHVCResult->fdResult.fcResult[i].expressionResult.topExpression = -128;
+                outHVCResult->fdResult.fcResult[i].expressionResult.topScore = -128;
+                for(j = 0; j < 5; j++){
+#if(1)  // Mbed
+                    outHVCResult->fdResult.fcResult[i].expressionResult.score[j] = (signed char)(recvData[j]);
+#else
+                    outHVCResult->fdResult.fcResult[i].expressionResult.score[j] = (char)(recvData[j]);
+#endif
+                    if(outHVCResult->fdResult.fcResult[i].expressionResult.topScore < outHVCResult->fdResult.fcResult[i].expressionResult.score[j]){
+                        outHVCResult->fdResult.fcResult[i].expressionResult.topScore = outHVCResult->fdResult.fcResult[i].expressionResult.score[j];
+                        outHVCResult->fdResult.fcResult[i].expressionResult.topExpression = j + 1;
+                    }
+                }
+#if(1)  // Mbed
+                outHVCResult->fdResult.fcResult[i].expressionResult.degree = (signed char)(recvData[5]);
+#else
+                outHVCResult->fdResult.fcResult[i].expressionResult.degree = (char)(recvData[5]);
+#endif
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*6;
+            }
+        }
+
+        /* Face Recognition */
+        if(0 != (outHVCResult->executedFunc & HVC_ACTIV_FACE_RECOGNITION)){
+            if ( size >= (INT32)sizeof(UINT8)*4 ) {
+                ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*4, recvData);
+                outHVCResult->fdResult.fcResult[i].recognitionResult.uid = (short)(recvData[0] + (recvData[1]<<8));
+                outHVCResult->fdResult.fcResult[i].recognitionResult.confidence = (short)(recvData[2] + (recvData[3]<<8));
+                if ( ret != 0 ) return ret;
+                size -= sizeof(UINT8)*4;
+            }
+        }
+    }
+
+    if(HVC_EXECUTE_IMAGE_NONE != inImage){
+        /* Image data */
+        if ( size >= (INT32)sizeof(UINT8)*4 ) {
+            ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*4, recvData);
+            outHVCResult->image.width = (short)(recvData[0] + (recvData[1]<<8));
+            outHVCResult->image.height = (short)(recvData[2] + (recvData[3]<<8));
+            if ( ret != 0 ) return ret;
+            size -= sizeof(UINT8)*4;
+        }
+
+        if ( size >= (INT32)sizeof(UINT8)*outHVCResult->image.width*outHVCResult->image.height ) {
+            ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*outHVCResult->image.width*outHVCResult->image.height, outHVCResult->image.image);
+            if ( ret != 0 ) return ret;
+            size -= sizeof(UINT8)*outHVCResult->image.width*outHVCResult->image.height;
+        }
+    }
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_SetThreshold                                                           */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : HVC_THRESHOLD *inThreshold    threshold values                  */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_SetThreshold(INT32 inTimeOutTime, HVC_THRESHOLD *inThreshold, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 sendData[32];
+
+    if((NULL == inThreshold) || (NULL == outStatus)){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    sendData[0] = (UINT8)(inThreshold->bdThreshold&0xff);
+    sendData[1] = (UINT8)((inThreshold->bdThreshold>>8)&0xff);
+    sendData[2] = (UINT8)(inThreshold->hdThreshold&0xff);
+    sendData[3] = (UINT8)((inThreshold->hdThreshold>>8)&0xff);
+    sendData[4] = (UINT8)(inThreshold->dtThreshold&0xff);
+    sendData[5] = (UINT8)((inThreshold->dtThreshold>>8)&0xff);
+    sendData[6] = (UINT8)(inThreshold->rsThreshold&0xff);
+    sendData[7] = (UINT8)((inThreshold->rsThreshold>>8)&0xff);
+    /* Send SetThreshold command signal */
+    ret = HVC_SendCommand(HVC_COM_SET_THRESHOLD, sizeof(UINT8)*8, sendData);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_GetThreshold                                                           */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : HVC_THRESHOLD *outThreshold   threshold values                  */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_GetThreshold(INT32 inTimeOutTime, HVC_THRESHOLD *outThreshold, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 recvData[32];
+
+    if((NULL == outThreshold) || (NULL == outStatus)){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    /* Send GetThreshold command signal */
+    ret = HVC_SendCommand(HVC_COM_GET_THRESHOLD, 0, NULL);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+
+    if ( size > (INT32)sizeof(UINT8)*8 ) {
+        size = sizeof(UINT8)*8;
+    }
+
+    /* Receive data */
+    ret = HVC_ReceiveData(inTimeOutTime, size, recvData);
+    outThreshold->bdThreshold = recvData[0] + (recvData[1]<<8);
+    outThreshold->hdThreshold = recvData[2] + (recvData[3]<<8);
+    outThreshold->dtThreshold = recvData[4] + (recvData[5]<<8);
+    outThreshold->rsThreshold = recvData[6] + (recvData[7]<<8);
+    return ret;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_SetSizeRange                                                           */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : HVC_SIZERANGE *inSizeRange    detection sizes                   */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_SetSizeRange(INT32 inTimeOutTime, HVC_SIZERANGE *inSizeRange, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 sendData[32];
+
+    if((NULL == inSizeRange) || (NULL == outStatus)){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    sendData[0] = (UINT8)(inSizeRange->bdMinSize&0xff);
+    sendData[1] = (UINT8)((inSizeRange->bdMinSize>>8)&0xff);
+    sendData[2] = (UINT8)(inSizeRange->bdMaxSize&0xff);
+    sendData[3] = (UINT8)((inSizeRange->bdMaxSize>>8)&0xff);
+    sendData[4] = (UINT8)(inSizeRange->hdMinSize&0xff);
+    sendData[5] = (UINT8)((inSizeRange->hdMinSize>>8)&0xff);
+    sendData[6] = (UINT8)(inSizeRange->hdMaxSize&0xff);
+    sendData[7] = (UINT8)((inSizeRange->hdMaxSize>>8)&0xff);
+    sendData[8] = (UINT8)(inSizeRange->dtMinSize&0xff);
+    sendData[9] = (UINT8)((inSizeRange->dtMinSize>>8)&0xff);
+    sendData[10] = (UINT8)(inSizeRange->dtMaxSize&0xff);
+    sendData[11] = (UINT8)((inSizeRange->dtMaxSize>>8)&0xff);
+    /* Send SetSizeRange command signal */
+    ret = HVC_SendCommand(HVC_COM_SET_SIZE_RANGE, sizeof(UINT8)*12, sendData);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_GetSizeRange                                                           */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : HVC_SIZERANGE *outSizeRange   detection sizes                   */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_GetSizeRange(INT32 inTimeOutTime, HVC_SIZERANGE *outSizeRange, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 recvData[32];
+
+    if((NULL == outSizeRange) || (NULL == outStatus)){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    /* Send GetSizeRange command signal */
+    ret = HVC_SendCommand(HVC_COM_GET_SIZE_RANGE, 0, NULL);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+
+    if ( size > (INT32)sizeof(UINT8)*12 ) {
+        size = sizeof(UINT8)*12;
+    }
+
+    /* Receive data */
+    ret = HVC_ReceiveData(inTimeOutTime, size, recvData);
+    outSizeRange->bdMinSize = recvData[0] + (recvData[1]<<8);
+    outSizeRange->bdMaxSize = recvData[2] + (recvData[3]<<8);
+    outSizeRange->hdMinSize = recvData[4] + (recvData[5]<<8);
+    outSizeRange->hdMaxSize = recvData[6] + (recvData[7]<<8);
+    outSizeRange->dtMinSize = recvData[8] + (recvData[9]<<8);
+    outSizeRange->dtMaxSize = recvData[10] + (recvData[11]<<8);
+    return ret;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_SetFaceDetectionAngle                                                  */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : INT32         inPose          Yaw angle range                   */
+/*          : INT32         inAngle         Roll angle range                  */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_SetFaceDetectionAngle(INT32 inTimeOutTime, INT32 inPose, INT32 inAngle, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 sendData[32];
+
+    if(NULL == outStatus){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    sendData[0] = (UINT8)(inPose&0xff);
+    sendData[1] = (UINT8)(inAngle&0xff);
+    /* Send SetFaceDetectionAngle command signal */
+    ret = HVC_SendCommand(HVC_COM_SET_DETECTION_ANGLE, sizeof(UINT8)*2, sendData);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_GetFaceDetectionAngle                                                  */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : INT32         *outPose        Yaw angle range                   */
+/*          : INT32         *outAngle       Roll angle range                  */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_GetFaceDetectionAngle(INT32 inTimeOutTime, INT32 *outPose, INT32 *outAngle, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 recvData[32];
+
+    if((NULL == outPose) || (NULL == outAngle) || (NULL == outStatus)){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    /* Send GetFaceDetectionAngle signal command */
+    ret = HVC_SendCommand(HVC_COM_GET_DETECTION_ANGLE, 0, NULL);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+
+    if ( size > (INT32)sizeof(UINT8)*2 ) {
+        size = sizeof(UINT8)*2;
+    }
+
+    /* Receive data */
+    ret = HVC_ReceiveData(inTimeOutTime, size, recvData);
+    *outPose = recvData[0];
+    *outAngle = recvData[1];
+    return ret;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_SetBaudRate                                                            */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : INT32         inRate          Baudrate                          */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_SetBaudRate(INT32 inTimeOutTime, INT32 inRate, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 sendData[32];
+
+    if(NULL == outStatus){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    sendData[0] = (UINT8)(inRate&0xff);
+    /* Send SetBaudRate command signal */
+    ret = HVC_SendCommand(HVC_COM_SET_BAUDRATE, sizeof(UINT8), sendData);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_Registration                                                           */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : INT32         inUserID        User ID (0-499)                   */
+/*          : INT32         inDataID        Data ID (0-9)                     */
+/*          : HVC_IMAGE     *outImage       image info                        */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_Registration(INT32 inTimeOutTime, INT32 inUserID, INT32 inDataID, HVC_IMAGE *outImage, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 sendData[32];
+    UINT8 recvData[32];
+
+    if((NULL == outImage) || (NULL == outStatus)){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    /* Send Registration signal command */
+    sendData[0] = (UINT8)(inUserID&0xff);
+    sendData[1] = (UINT8)((inUserID>>8)&0xff);
+    sendData[2] = (UINT8)(inDataID&0xff);
+    ret = HVC_SendCommand(HVC_COM_REGISTRATION, sizeof(UINT8)*3, sendData);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+
+    /* Receive data */
+    if ( size >= (INT32)sizeof(UINT8)*4 ) {
+        ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*4, recvData);
+        outImage->width = recvData[0] + (recvData[1]<<8);
+        outImage->height = recvData[2] + (recvData[3]<<8);
+        if ( ret != 0 ) return ret;
+        size -= sizeof(UINT8)*4;
+    }
+
+    /* Image data */
+    if ( size >= (INT32)sizeof(UINT8)*64*64 ) {
+        ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*64*64, outImage->image);
+        if ( ret != 0 ) return ret;
+        size -= sizeof(UINT8)*64*64;
+    }
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_DeleteData                                                             */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : INT32         inUserID        User ID (0-499)                   */
+/*          : INT32         inDataID        Data ID (0-9)                     */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_DeleteData(INT32 inTimeOutTime, INT32 inUserID, INT32 inDataID, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 sendData[32];
+
+    if(NULL == outStatus){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    /* Send Delete Data signal command */
+    sendData[0] = (UINT8)(inUserID&0xff);
+    sendData[1] = (UINT8)((inUserID>>8)&0xff);
+    sendData[2] = (UINT8)(inDataID&0xff);
+    ret = HVC_SendCommand(HVC_COM_DELETE_DATA, sizeof(UINT8)*3, sendData);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_DeleteUser                                                             */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : INT32         inUserID        User ID (0-499)                   */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_DeleteUser(INT32 inTimeOutTime, INT32 inUserID, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 sendData[32];
+
+    if(NULL == outStatus){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    /* Send Delete User signal command */
+    sendData[0] = (UINT8)(inUserID&0xff);
+    sendData[1] = (UINT8)((inUserID>>8)&0xff);
+    ret = HVC_SendCommand(HVC_COM_DELETE_USER, sizeof(UINT8)*2, sendData);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_DeleteAll                                                              */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_DeleteAll(INT32 inTimeOutTime, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+
+    if(NULL == outStatus){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    /* Send Delete All signal command */
+    ret = HVC_SendCommand(HVC_COM_DELETE_ALL, 0, NULL);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+    return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_GetUserData                                                            */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : INT32         inUserID        User ID (0-499)                   */
+/*          : INT32         *outDataNo      Registration Info                 */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_GetUserData(INT32 inTimeOutTime, INT32 inUserID, INT32 *outDataNo, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+    UINT8 sendData[8];
+    UINT8 recvData[8];
+
+    if((NULL == outDataNo) || (NULL == outStatus)){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    /* Send Get Registration Info signal command */
+    sendData[0] = (UINT8)(inUserID&0xff);
+    sendData[1] = (UINT8)((inUserID>>8)&0xff);
+    ret = HVC_SendCommand(HVC_COM_GET_PERSON_DATA, sizeof(UINT8)*2, sendData);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+
+    if ( size > (INT32)sizeof(UINT8)*2 ) {
+        size = sizeof(UINT8)*2;
+    }
+
+    /* Receive data */
+    ret = HVC_ReceiveData(inTimeOutTime, size, recvData);
+    *outDataNo = recvData[0] + (recvData[1]<<8);
+    return ret;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_SaveAlbum                                                              */
+/* param    : INT32         inTimeOutTime       timeout time (ms)             */
+/*          : UINT8         *outAlbumData       Album data                    */
+/*          : INT32         *outAlbumDataSize   Album data size               */
+/*          : UINT8         *outStatus          response code                 */
+/* return   : INT32                             execution result error code   */
+/*          :                                   0...normal                    */
+/*          :                                   -1...parameter error          */
+/*          :                                   other...signal error          */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_SaveAlbum(INT32 inTimeOutTime, UINT8 *outAlbumData, INT32 *outAlbumDataSize, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+
+    UINT8 *tmpAlbumData = NULL;;
+    
+    if((NULL == outAlbumData) || (NULL == outAlbumDataSize) || (NULL == outStatus)){
+        return HVC_ERROR_PARAMETER;
+    }
+        
+    /* Send Save Album signal command */
+    ret = HVC_SendCommand(HVC_COM_SAVE_ALBUM, 0, NULL);
+    if ( ret != 0 ) return ret;
+
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+
+    if ( size >= (INT32)sizeof(UINT8)*8 + HVC_ALBUM_SIZE_MIN ) {
+        *outAlbumDataSize = size;
+        tmpAlbumData = outAlbumData;
+
+        do{
+            ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*4, tmpAlbumData);
+            if ( ret != 0 ) return ret;
+            tmpAlbumData += sizeof(UINT8)*4;
+
+            ret = HVC_ReceiveData(inTimeOutTime, sizeof(UINT8)*4, tmpAlbumData);
+            if ( ret != 0 ) return ret;
+            tmpAlbumData += sizeof(UINT8)*4;
+
+            ret = HVC_ReceiveData(inTimeOutTime, size - sizeof(UINT8)*8, tmpAlbumData);
+            if ( ret != 0 ) return ret;
+        }while(0);
+    }
+    return ret;
+}
+
+
+/*----------------------------------------------------------------------------*/
+/* HVC_LoadAlbum                                                              */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : UINT8         *inAlbumData    Album data                        */
+/*          : INT32         inAlbumDataSize Album data size                   */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_LoadAlbum(INT32 inTimeOutTime, UINT8 *inAlbumData, INT32 inAlbumDataSize, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+        
+    if((NULL == inAlbumData) || (NULL == outStatus)){
+        return HVC_ERROR_PARAMETER;
+    }
+        
+    /* Send Save Album signal command */
+    ret = HVC_SendCommandOfLoadAlbum(HVC_COM_LOAD_ALBUM, inAlbumDataSize, inAlbumData);
+    if ( ret != 0 ) return ret;
+    
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+
+    return ret;
+}
+
+/*----------------------------------------------------------------------------*/
+/* HVC_WriteAlbum                                                             */
+/* param    : INT32         inTimeOutTime   timeout time (ms)                 */
+/*          : UINT8         *outStatus      response code                     */
+/* return   : INT32                         execution result error code       */
+/*          :                               0...normal                        */
+/*          :                               -1...parameter error              */
+/*          :                               other...signal error              */
+/*----------------------------------------------------------------------------*/
+INT32 HVC_WriteAlbum(INT32 inTimeOutTime, UINT8 *outStatus)
+{
+    INT32 ret = 0;
+    INT32 size = 0;
+
+    if(NULL == outStatus){
+        return HVC_ERROR_PARAMETER;
+    }
+
+    /* Send Write Album signal command */
+    ret = HVC_SendCommand(HVC_COM_WRITE_ALBUM, 0, NULL);
+    if ( ret != 0 ) return ret;
+
+    /* Receive header */
+    ret = HVC_ReceiveHeader(inTimeOutTime, &size, outStatus);
+    if ( ret != 0 ) return ret;
+
+    return ret;
+}
+