Re-organized sub-directory by category
[staging/basesystem.git] / service / vehicle / positioning / client / include / POS_private.h
diff --git a/service/vehicle/positioning/client/include/POS_private.h b/service/vehicle/positioning/client/include/POS_private.h
new file mode 100755 (executable)
index 0000000..9f02202
--- /dev/null
@@ -0,0 +1,981 @@
+/*
+ * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR 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.
+ */
+
+/**
+ * @file
+ *  POS_private.h
+ * @brief
+ *  Inner functions of Positoning API
+ *
+ */
+#ifndef POSITIONING_CLIENT_INCLUDE_POS_PRIVATE_H_
+#define POSITIONING_CLIENT_INCLUDE_POS_PRIVATE_H_
+
+/*---------------------------------------------------------------------------------*
+ * Include Files                                                                   *
+ *---------------------------------------------------------------------------------*/
+#include <vehicle_service/positioning_base_library.h>
+#include <vehicle_service/POS_define.h>
+#include "Vehicle_API_Dummy.h"
+#include "Vehicle_API_private.h"
+#include "Naviinfo_API.h"
+#include "POS_common_private.h"
+#include <asm/unistd.h>
+#include <other_service/VP_GetEnv.h>
+#include <other_service/env_vehicleparameterlibrary.h>
+#include "CommonDefine.h"
+/*---------------------------------------------------------------------------------*
+ * Function Prototype                                                              *
+ *---------------------------------------------------------------------------------*/
+/* Shared Library Value Area Check Function */
+inline UNIT_TYPE GetEnvSupportInfo(void);
+inline BOOL ChkUnitType(UNIT_TYPE type);
+inline RET_API MunMapDeviceIo(HANDLE dev, uint32_t map_size);
+inline RET_API MilliSecSleep(uint32_t mill_time);
+inline POS_RET_API PosChkParam8(int8_t data, int8_t min, int8_t max, const char* fn, int32_t line);
+inline POS_RET_API PosChkParam16(int16_t data, int16_t min, int16_t max, const char* fn, int32_t line);
+inline POS_RET_API PosChkParam32(int32_t data, int32_t min, int32_t max, const char* fn, int32_t line);
+inline POS_RET_API PosChkParamU8(uint8_t data, uint8_t min, uint8_t max, const char* fn, int32_t line);
+inline POS_RET_API PosChkParamU16(uint16_t data, uint16_t min, uint16_t max, const char* fn, int32_t line);
+inline POS_RET_API PosChkParamU32(uint32_t data, uint32_t min, uint32_t max, const char* fn, int32_t line);
+
+/* Shared Intra-Library Core Functions */
+inline POS_RET_API    PosSetProc(DID did, void *p_data, uint16_t size, uint8_t is_event);
+inline POS_RET_API    PosGetProc(DID did, void *p_data, uint16_t dest_size);
+inline SENSOR_RET_API PosRegisterListenerProc(PCSTR notify_name,
+                                              DID did, u_int8 ctrl_flg, u_int8 delivery_timing);
+
+/* General Functions in Shared Libraries */
+inline EventID VehicleCreateEvent(PNO pno);
+inline RET_API VehicleDeleteEvent(EventID event_id);
+inline RET_API VehicleLinkShareData(void **share_top, uint32_t *share_size, uint16_t *offset);
+inline RET_API VehicleUnLinkShareData(VEHICLE_SHARE *share_top, uint16_t offset);
+inline RET_API VehicleSndMsg(PNO pno_src, PNO pno_dest, CID cid, uint16_t msg_len, const void *msg_data);
+inline BOOL VehicleGetResource(void);
+inline void VehicleReleaseResource(void);
+inline uint32_t GetTid(void);
+/*---------------------------------------------------------------------------------*
+ * Definition                                                                      *
+ *---------------------------------------------------------------------------------*/
+#define POS_CHKPARAM8(data, min, max)   PosChkParam8(data, min, max, __func__, __LINE__)
+#define POS_CHKPARAM16(data, min, max)  PosChkParam16(data, min, max, __func__, __LINE__)
+#define POS_CHKPARAM32(data, min, max)  PosChkParam32(data, min, max, __func__, __LINE__)
+#define POS_CHKPARAMU8(data, min, max)  PosChkParamU8(data, min, max, __func__, __LINE__)
+#define POS_CHKPARAMU16(data, min, max) PosChkParamU16(data, min, max, __func__, __LINE__)
+#define POS_CHKPARAMU32(data, min, max) PosChkParamU32(data, min, max, __func__, __LINE__)
+#define POS_API_TIME_OUT_MS  5000 /* Timeout period(ms) */
+
+/*---------------------------------------------------------------------------------*
+ * Inline Functions                                                                *
+ *---------------------------------------------------------------------------------*/
+UNIT_TYPE GetEnvSupportInfo(void) {
+    UNIT_TYPE  ret_type = UNIT_TYPE_GRADE1;
+
+    char       env_area[VP_MAX_LENGTH];
+    char       env_grade[VP_MAX_LENGTH];
+    char*      p_env_grade    = env_grade;
+    char*      p_env_area     = env_area;
+
+    /*
+     *  Note.
+     *  This feature branches processing depending on the area and grade type.
+     */
+
+    VP_GetEnv(VP_VEHICLEPARAMETERLIBRARY_AREA, p_env_area);
+
+    if (0 == strcmp(p_env_area, "AREA1")) {
+        ret_type = UNIT_TYPE_GRADE2;
+    } else if (0 == strcmp(p_env_area, "AREA2")) {
+        memset(&env_grade, 0x00, sizeof(env_grade));
+        VP_GetEnv(VP_VEHICLEPARAMETERLIBRARY_GRADE, p_env_grade);
+        if (0 == strcmp(p_env_grade, "_CWORD95_") ||
+            0 == strcmp(p_env_grade, "_CWORD101_") ||
+            0 == strcmp(p_env_grade, "_CWORD61_")) {
+            ret_type = UNIT_TYPE_GRADE2;
+        }
+    } else {
+        // NOP
+    }
+
+    return ret_type;
+}
+
+BOOL ChkUnitType(UNIT_TYPE type) {
+    UNIT_TYPE type_temp;
+    BOOL ret;
+
+    type_temp = GetEnvSupportInfo();
+    if ((type_temp & type) != 0) {
+        ret = TRUE;
+    } else {
+        ret = FALSE;
+    }
+
+    return ret;
+}
+
+RET_API MunMapDeviceIo(HANDLE dev, uint32_t map_size) {
+    return RET_NORMAL;
+}
+
+RET_API MilliSecSleep(uint32_t mill_time) {
+    switch (mill_time) {
+        case 0:
+        {
+            /* Discard the time slice */
+            sched_yield();
+            break;
+        }
+        case INFINITE:
+        {
+            /* Abort processing indefinitely */
+            while (1) {
+                sleep(INFINITE);
+            }
+        }
+        default:
+            /* Sleep for Specified Time */
+            usleep(mill_time * 1000);
+            break;
+    }
+
+    return RET_NORMAL;
+}
+
+/**
+ * @brief
+ *  Data Valid Value Determination(int8)
+ *
+ * @param[in] date  int8_t       Object data
+ * @param[in] min   int8_t       Target Data Valid Value Range(Minimum value)
+ * @param[in] max   int8_t       Target Data Valid Value Range(Maximum value)
+ * @param[in] fn    const char*  Pointer to the function name
+ * @param[in] line  int32_t      Number of lines
+ *
+ * @return  POS_RET_NORMAL       Within the valid range<br>
+ *          POS_RET_ERROR        Out of scope<br>
+ *          POS_RET_ERROR_PARAM  Argument error
+ */
+inline POS_RET_API PosChkParam8(int8_t data, int8_t min, int8_t max, const char* fn, int32_t line) {
+    POS_RET_API ret = POS_RET_NORMAL;
+
+    if (fn == NULL) {
+        FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Argument ERROR!! fn=%p", fn);
+        ret = POS_RET_ERROR_PARAM;
+    } else {
+        if ((data < min) || (max < data)) {
+            ret = POS_RET_ERROR;
+            FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, 
+                          "%s/%d/Out of range!! data=%d[%d, %d]",
+                          fn, line, data, min, max);
+        }
+    }
+
+    return ret;
+}
+
+/**
+ * @brief
+ *  Data Valid Value Determination(int16)
+ *
+ * @param[in] date  int16_t      Object data
+ * @param[in] min   int16_t      Target Data Valid Value Range(Minimum value)
+ * @param[in] max   int16_t      Target Data Valid Value Range(Maximum value)
+ * @param[in] fn    const char*  Pointer to the function name
+ * @param[in] line  int32_t      Number of lines
+ *
+ * @return  POS_RET_NORMAL       Within the valid range<br>
+ *          POS_RET_ERROR        Out of scope<br>
+ *          POS_RET_ERROR_PARAM  Argument error
+ */
+inline POS_RET_API PosChkParam16(int16_t data, int16_t min, int16_t max, const char* fn, int32_t line) {
+    POS_RET_API ret = POS_RET_NORMAL;
+
+    if (fn == NULL) {
+        FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Argument ERROR!! fn=%p", fn);
+        ret = POS_RET_ERROR_PARAM;
+    } else {
+        if ((data < min) || (max < data)) {
+            ret = POS_RET_ERROR;
+            FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, 
+                          "%s/%d/Out of range!! data=%d[%d, %d]",
+                          fn, line, data, min, max);
+        }
+    }
+
+    return ret;
+}
+
+/**
+ * @brief
+ *  Data Valid Value Determination(int32)
+ *
+ * @param[in] date  int32_t      Object data
+ * @param[in] min   int32_t      Target Data Valid Value Range(Minimum value)
+ * @param[in] max   int32_t      Target Data Valid Value Range(Maximum value)
+ * @param[in] fn    const char*  Pointer to the function name
+ * @param[in] line  int32_t      Number of lines
+ *
+ * @return  POS_RET_NORMAL       Within the valid range<br>
+ *          POS_RET_ERROR        Out of scope<br>
+ *          POS_RET_ERROR_PARAM  Argument error
+ */
+inline POS_RET_API PosChkParam32(int32_t data, int32_t min, int32_t max, const char* fn, int32_t line) {
+    POS_RET_API ret = POS_RET_NORMAL;
+
+    if (fn == NULL) {
+        FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Argument ERROR!! fn=%p", fn);
+        ret = POS_RET_ERROR_PARAM;
+    } else {
+        if ((data < min) || (max < data)) {
+            ret = POS_RET_ERROR;
+            FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, 
+                          "%s/%d/Out of range!! data=%d[%d, %d]",
+                          fn, line, data, min, max);
+        }
+    }
+
+    return ret;
+}
+
+/**
+ * @brief
+ *  Data Valid Value Determination(unsigned int8)
+ *
+ * @param[in] date  uint8_t      Object data
+ * @param[in] min   uint8_t      Target Data Valid Value Range(Minimum value)
+ * @param[in] max   uint8_t      Target Data Valid Value Range(Maximum value)
+ * @param[in] fn    const char*  Pointer to the function name
+ * @param[in] line  int32_t      Number of lines
+ *
+ * @return  POS_RET_NORMAL       Within the valid range<br>
+ *          POS_RET_ERROR        Out of scope<br>
+ *          POS_RET_ERROR_PARAM  Argument error
+ */
+inline POS_RET_API PosChkParamU8(uint8_t data, uint8_t min, uint8_t max, const char* fn, int32_t line) {
+    POS_RET_API ret = POS_RET_NORMAL;
+
+    if (fn == NULL) {
+        FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Argument ERROR!! fn=%p", fn);
+        ret = POS_RET_ERROR_PARAM;
+    } else {
+        if ((data < min) || (max < data)) {
+            ret = POS_RET_ERROR;
+            FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, 
+                          "%s/%d/Out of range!! data=%u[%u, %u]",
+                          fn, line, data, min, max);
+        }
+    }
+
+    return ret;
+}
+
+/**
+ * @brief
+ *  Data Valid Value Determination(unsigned int16)
+ *
+ * @param[in] date  uint16_t     Object data
+ * @param[in] min   uint16_t     Target Data Valid Value Range(Minimum value)
+ * @param[in] max   uint16_t     Target Data Valid Value Range(Maximum value)
+ * @param[in] fn    const char*  Pointer to the function name
+ * @param[in] line  int32_t      Number of lines
+ *
+ * @return  POS_RET_NORMAL       Within the valid range<br>
+ *          POS_RET_ERROR        Out of scope<br>
+ *          POS_RET_ERROR_PARAM  Argument error
+ */
+inline POS_RET_API PosChkParamU16(uint16_t data, uint16_t min, uint16_t max, const char* fn, int32_t line) {
+    POS_RET_API ret = POS_RET_NORMAL;
+
+    if (fn == NULL) {
+        FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Argument ERROR!! fn=%p", fn);
+        ret = POS_RET_ERROR_PARAM;
+    } else {
+        if ((data < min) || (max < data)) {
+            ret = POS_RET_ERROR;
+            FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, 
+                          "%s/%d/Out of range!! data=%u[%u, %u]",
+                          fn, line, data, min, max);
+        }
+    }
+
+    return ret;
+}
+
+/**
+ * @brief
+ *  Data Valid Value Determination(unsigned int32)
+ *
+ * @param[in] date  uint32_t     Object data
+ * @param[in] min   uint32_t     Target Data Valid Value Range(Minimum value)
+ * @param[in] max   uint32_t     Target Data Valid Value Range(Maximum value)
+ * @param[in] fn    const char*  Pointer to the function name
+ * @param[in] line  int32_t      Number of lines
+ *
+ * @return  POS_RET_NORMAL       Within the valid range<br>
+ *          POS_RET_ERROR        Out of scope<br>
+ *          POS_RET_ERROR_PARAM  Argument error
+ */
+inline POS_RET_API PosChkParamU32(uint32_t data, uint32_t min, uint32_t max, const char* fn, int32_t line) {
+    POS_RET_API ret = POS_RET_NORMAL;
+
+    if (fn == NULL) {
+        FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Argument ERROR!! fn=%p", fn);
+        ret = POS_RET_ERROR_PARAM;
+    } else {
+        if ((data < min) || (max < data)) {
+            ret = POS_RET_ERROR;
+            FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, 
+                          "%s/%d/Out of range!! data=%u[%u, %u]",
+                          fn, line, data, min, max);
+        }
+    }
+
+    return ret;
+}
+
+/**
+ * @brief
+ *  Data setting process(Internal processing)
+ *
+ *  Set the specified information
+ *
+ * @param[in] did      DID         - Data ID
+ * @param[in] p_data    void*       - Configuration data
+ * @param[in] size     uint16_t    - Setting data size
+ * @param[in] is_event  uint8_t     - Event wait status(TRUE/FALSE)
+ *
+ * @return  POS_RET_NORMAL           Normal completion(Include illegal)<br>
+ *          POS_RET_ERROR_PARAM      Parameter error<br>
+ *          POS_RET_ERROR_INNER      Internal error
+ */
+inline POS_RET_API PosSetProc(DID did, void *p_data, uint16_t size, uint8_t is_event) {
+    POS_RET_API    ret = POS_RET_NORMAL;    /* Return value of this function */
+    RET_API      ret_api = RET_NORMAL;    /* API return value */
+    POS_MSGINFO    snd_msg;          /* Message */
+    EventID      event_id;          /* Event ID */
+    int32_t      event_val;          /* Event value */
+    PNO        pno;            /* Calling thread PNO */
+    uint32_t    pid;            /* Process ID */
+    uint32_t    tid;            /* Thread ID */
+    char      name[128];
+
+    /* Data size check */
+    if (POS_MSG_INFO_DSIZE < size) {
+        ret = POS_RET_ERROR_PARAM;
+    } else {
+        /* Resource acquisition */
+        if (VehicleGetResource() == TRUE) {
+            /* Message data */
+            /* _CWORD71_ processing speed(Memset modification) */
+            /* Initialization of areas that do not contain values */
+            snd_msg.pno = 0;
+            snd_msg.rcv_flag = 0;
+            snd_msg.reserve = 0;
+
+            snd_msg.did  = did;
+            snd_msg.size  = size;
+            memcpy(snd_msg.data, p_data, size);
+
+            if (TRUE == is_event) {
+                /* After requesting data setting,Wait for the setting completion(Event Wait) */
+
+                /* Event Generation */
+                pid = static_cast<uint32_t>(getpid());
+                tid = GetTid();
+
+                snprintf(name, sizeof(name), "PS_p%u_t%u", pid, tid);
+                pno = _pb_CnvName2Pno(name);
+                event_id = VehicleCreateEvent(pno);
+
+                /* Set the source Pno of message data */
+                snd_msg.pno = pno;
+
+                if (0 != event_id) {
+                    /* Successful event generation */
+
+                    /* Send NAVI Sensor Data Setting to Vehicle Sensor */
+                    ret_api = VehicleSndMsg(pno,
+                                            PNO_VEHICLE_SENSOR,
+                                            CID_POSIF_SET_DATA,
+
+                                            (uint16_t)sizeof(POS_MSGINFO) - POS_MSG_INFO_DSIZE + snd_msg.size, /* variable length */
+                                            (const void *)&snd_msg);
+
+                    if (RET_NORMAL == ret_api) {
+                        /* If the data setup process is successful,Wait for a completion event */
+                        ret_api = _pb_WaitEvent(event_id,
+                                                SAPI_EVWAIT_VAL,
+                                                VEHICLE_RET_ERROR_MIN,
+                                                VEHICLE_RET_NORMAL, &event_val, POS_API_TIME_OUT_MS);
+                        if (RET_NORMAL != ret_api) {
+                            /* Return an internal error */
+                            ret = POS_RET_ERROR_INNER;
+                        } else {
+                            /* Return from Event Wait */
+                            /* Set event value (processing result) as return value */
+                            ret = (POS_RET_API)event_val;
+                        }
+                    } else {
+                        /* Message transmission processing failed */
+                        ret = POS_RET_ERROR_INNER;
+                    }
+                    /* Event deletion */
+                    ret_api = VehicleDeleteEvent(event_id);
+                } else {
+                    /* Event generation failure */
+                    ret = POS_RET_ERROR_INNER;
+                }
+            } else {
+                /* After setting data,Immediate termination */
+
+                /* Send NAVI Sensor Data Setting to Vehicle Sensor */
+                ret_api = _pb_SndMsg_Ext(POS_THREAD_NAME,
+                                         CID_POSIF_SET_DATA,
+                                         sizeof(POS_MSGINFO), reinterpret_cast<void*>(&snd_msg), 0);
+                if (ret_api != RET_NORMAL) {
+                    /* Message transmission failure */
+                    ret = POS_RET_ERROR_INNER;
+                }
+            }
+        } else {
+            /* Insufficient resource */
+            ret = POS_RET_ERROR_RESOURCE;
+        }
+        /* Resource release */
+        VehicleReleaseResource();
+    }
+
+    return ret;
+}
+
+/**
+ * @brief
+ *  Sensor information acquisition(Internal processing)
+ *
+ * @param[in] did         DID      - Data ID for vehicle information
+ * @param[in] p_data     void*    - Pointer representing the storage destination of vehicle sensor information
+ * @param[in] dest_size    uint16_t - Storage destination size of vehicle sensor information(byte)
+ *
+ * @return  0 or more                        Stored data size(Include illegal)<br>
+ *          POS_RET_ERROR_CREATE_EVENT   Event generation failure<br>
+ *          POS_RET_ERROR_OUTOF_MEMORY   Shared memory allocation failed<br>
+ *          POS_RET_ERROR_SIZE           Storage destination size error<br>
+ *          POS_RET_ERROR_DID            Unregistered ID<br>
+ */
+inline POS_RET_API PosGetProc(DID did, void *p_data, uint16_t dest_size) {
+    POS_RET_API       ret;              /* Return value            */
+    RET_API           ret_api;          /* System API return value        */
+    EventID           event_id;         /* Event ID           */
+    int32_t           event_val;        /* Event value           */
+    void             *share_top;        /* Start address of shared memory       */
+    uint32_t          share_size;       /* Size of shared memory area       */
+    uint16_t          offset;                /* Offset to free shared memory area    */
+    VEHICLE_SHARE_BLOCK_DAT *share_dat; /* Address of free shared memory area  */
+    VEHICLE_MSG_GET_VEHICLE_DATA_DAT data; /* Message data     */
+    PNO                  pno;           /* Calling thread PNO       */
+    uint32_t    pid;          /* Process ID          */
+    uint32_t    tid;          /* Thread ID            */
+    char      name[128];
+
+    /* Resource acquisition */
+    if (VehicleGetResource() == TRUE) {
+        /* Initialization */
+        event_id = 0;
+        event_val = 0;
+        memset(reinterpret_cast<void *>(&data), 0, sizeof(VEHICLE_MSG_GET_VEHICLE_DATA_DAT));
+
+        /* Event Generation */
+        pid = static_cast<uint32_t>(getpid());
+        tid = GetTid();
+
+        snprintf(name, sizeof(name), "PG_p%u_t%u", pid, tid);
+        pno = _pb_CnvName2Pno(name);
+        event_id = VehicleCreateEvent(pno);
+
+        if (0 != event_id) {
+            /* Successful event generation */
+
+            /* Allocate shared memory */
+            ret_api = VehicleLinkShareData(reinterpret_cast<void **>(&share_top), &share_size, &offset);
+            if (RET_NORMAL != ret_api) {
+                /* Failed to allocate shared memory */
+                ret = POS_RET_ERROR_OUTOF_MEMORY;
+            } else { /* When the shared memory is allocated successfully */
+                /* Calculate start address of free shared memory area */
+                share_dat = reinterpret_cast<VEHICLE_SHARE_BLOCK_DAT *>(reinterpret_cast<u_int8 *>(share_top)
+                            + offset);
+
+                /* Send vehicle sensor information acquisition message */
+                data.did        = did;
+                data.pno        = pno;
+                data.offset     = offset;
+                data.size       = VEHICLE_SHARE_BLOCK_DSIZE;
+
+                /* Messaging */
+                ret_api = VehicleSndMsg(pno,
+                                        PNO_VEHICLE_SENSOR,
+                                        CID_VEHICLEIF_GET_VEHICLE_DATA,
+                                        sizeof(VEHICLE_MSG_GET_VEHICLE_DATA_DAT), (const void *)&data);
+
+                /* Message transmission processing is successful */
+                if (RET_NORMAL == ret_api) {
+                    /* Wait for completion event from vehicle sensor thread */
+                    ret_api = _pb_WaitEvent(event_id,
+                                            SAPI_EVWAIT_VAL,
+                                            VEHICLE_RET_ERROR_MIN,
+                                            VEHICLE_RET_NORMAL, &event_val, POS_API_TIME_OUT_MS);
+
+                    if (RET_NORMAL != ret_api) {
+                        /* Return an internal error */
+                        ret = POS_RET_ERROR_INNER;
+                    } else { /* Return from Event Wait */
+                        /* Link to shared memory */
+                        ret_api = _pb_LinkShareData(const_cast<char *>(VEHICLE_SHARE_NAME),
+                                                    &share_top, &share_size);
+
+                        /* Calculate the address of the shared memory storage area. */
+                        share_dat = reinterpret_cast<VEHICLE_SHARE_BLOCK_DAT *>(reinterpret_cast<u_int8 *>(share_top)
+                                    + offset);
+
+                        if (event_val < 0) {
+                            /* Vehicle sensor information acquisition failure */
+                            ret = (VEHICLE_RET_API)event_val;
+                        } else if (RET_NORMAL != ret_api) {
+                            /* Shared memory error */
+                            ret = POS_RET_ERROR_OUTOF_MEMORY;
+                        } else if (dest_size < share_dat->size) {
+                            /* Storage destination size error */
+                            ret = POS_RET_ERROR_SIZE;
+                        } else { /* Vehicle sensor information acquisition success */
+                            /* Copy from shared memory to user memory */
+                            memcpy(p_data, share_dat->data, (size_t)share_dat->size);
+
+                            /* Set Write Size to Return Value */
+                            ret = static_cast<int32>(share_dat->size);
+                        }
+                    }
+                } else { /* Message transmission processing failed */
+                    /* Return an event generation failure */
+                    ret = POS_RET_ERROR_CREATE_EVENT;
+                }
+                /* Free shared memory */
+                (void)VehicleUnLinkShareData(reinterpret_cast<VEHICLE_SHARE*>(share_top), offset);
+            }
+            /* Event deletion */
+            ret_api = VehicleDeleteEvent(event_id);
+        } else {
+            /* Event generation failure */
+            ret = POS_RET_ERROR_CREATE_EVENT;
+        }
+    } else {
+        /* Insufficient resource */
+        ret = POS_RET_ERROR_RESOURCE;
+    }
+    /* Resource release */
+    VehicleReleaseResource();
+
+    return ret;
+}
+
+/**
+ * @brief
+ *  Delivery registration process(Internal processing)
+ *
+ * @param[in]  notify_name      Destination thread name
+ * @param[in]  did        Pointer to an array of data IDs for vehicle information
+ * @param[in]  ctrl_flg      Delivery control<br>
+ *        Delivery registration: SENSOR_DELIVERY_REGIST<br>
+ *        Delivery stop: SENSOR_DELIVERY_STOP    (Note: Not mounted)<br>
+ *        Resume delivery: SENSOR_DELIVERY_RESTART  (Note: Not mounted)
+ * @param[in]  delivery_timing    Delivery timing<br>
+ *        Updating  : SENSOR_DELIVERY_TIMING_UPDATE<br>
+ *        Changing  : SENSOR_DELIVERY_TIMING_CHANGE
+ *
+ * @return  SENSOR_RET_NORMAL        Successful registration<br>
+ *      SENSOR_RET_ERROR_CREATE_EVENT  Event generation failure<br>
+ *      SENSOR_RET_ERROR_PARAM      Parameter error<br>
+ *      SENSOR_RET_ERROR_DID      Unregistered ID<br>
+ *      SENSOR_RET_ERROR_BUFFULL    FULL of delivery registers<br>
+ *      SENSOR_RET_ERROR_INNER      Internal abnormality<br>
+ */
+inline SENSOR_RET_API PosRegisterListenerProc(PCSTR notify_name, DID did, u_int8 ctrl_flg, u_int8 delivery_timing) {
+    SENSOR_RET_API          ret;      /* Return value */
+    RET_API              ret_api;    /* System API return value */
+    EventID              event_id;    /* Event ID */
+    int32              event_val;    /* Event value */
+    VEHICLE_MSG_DELIVERY_ENTRY_DAT  data;      /* Message data */
+    PNO                pno;      /* Converted internal PNO  */
+
+    /* Resource acquisition */
+    if (VehicleGetResource() == TRUE) {
+        /* Initialization */
+        event_id = 0;
+        event_val = 0;
+
+        /* Get PNO from Thread Name */
+        pno = _pb_CnvName2Pno(notify_name);
+
+        /* Event Generation */
+        event_id = VehicleCreateEvent(pno);
+
+        if (0 != event_id) {
+            /* Successful event generation */
+
+            /*--------------------------------------------------------------*
+             *  Send Vehicle Sensor Information Delivery Registration Message          *
+             *--------------------------------------------------------------*/
+            /* Create Message Data */
+            data.did      = did;
+            data.pno      = pno;
+            data.delivery_timing  = delivery_timing;
+            data.ctrl_flg  = ctrl_flg;
+            data.event_id   = event_id;
+
+            /* Messaging */
+            ret_api = VehicleSndMsg(pno,
+                                    PNO_VEHICLE_SENSOR,
+                                    CID_VEHICLEIF_DELIVERY_ENTRY,
+                                    (uint16_t)sizeof(VEHICLE_MSG_DELIVERY_ENTRY_DAT), (const void *)&data);
+
+            if (RET_NORMAL == ret_api) {
+                /* Message transmission processing is successful */
+                /* Wait for completion event from vehicle sensor thread */
+                ret_api = _pb_WaitEvent(event_id,
+                                        SAPI_EVWAIT_VAL,
+                                        VEHICLE_RET_ERROR_MIN,
+                                        VEHICLE_RET_NORMAL, &event_val, POS_API_TIME_OUT_MS);
+                if (RET_NORMAL != ret_api) {
+                    /* Return an internal error */
+                    ret = SENSOR_RET_ERROR_INNER;
+                } else {
+                    /* Return from Event Wait */
+                    /* Set event value (processing result) as return value */
+                    ret = (SENSOR_RET_API)event_val;
+                }
+            } else {
+                /* Message transmission processing failed */
+                /* Return an internal error */
+                ret = SENSOR_RET_ERROR_INNER;
+            }
+            /* Event deletion */
+            ret_api = VehicleDeleteEvent(event_id);
+        } else {
+            /* Event generation failure */
+            ret = SENSOR_RET_ERROR_CREATE_EVENT;
+        }
+    } else {
+        /* Insufficient resource */
+        ret = SENSOR_RET_ERROR_RESOURCE;
+    }
+    /* Resource release */
+    VehicleReleaseResource();
+
+    return ret;
+}
+
+/*******************************************************************************
+ * MODULE    : VehicleCreateEvent
+ * ABSTRACT  : Event creation process
+ * FUNCTION  : Generate an event
+ * ARGUMENT  : pno    : Thread ID
+ * NOTE      :
+ * RETURN    : Non-zero    : Event ID
+ *           : Zero      : Event generation failure
+ ******************************************************************************/
+inline EventID VehicleCreateEvent(PNO pno) {
+    EventID    event_id;              /* Event ID */
+    char    event_name[32];          /* Event name character string buffer */
+    RET_API    ret_api;              /* System API return value */
+
+
+    /* Initialization of event name character string buffer */
+    memset(reinterpret_cast<void *>(event_name), 0, sizeof(event_name));
+    /* Event name creation */
+    snprintf(event_name, sizeof(event_name), "VEHICLE_%X", pno);
+
+    /* Event Generation */
+    event_id = _pb_CreateEvent(FALSE, 0, event_name);
+
+    if (0 != event_id) {
+        /* For successful event generation */
+
+        /* Initialize the event */
+        ret_api = _pb_SetEvent(event_id, SAPI_EVSET_ABSOLUTE, VEHICLE_EVENT_VAL_INIT);
+        if (RET_NORMAL != ret_api) {
+            /* Event initialization failed */
+            /* Delete Event and Return Event Generation Failed */
+            ret_api = VehicleDeleteEvent(event_id);
+            event_id = 0;
+        }
+    }
+
+    return(event_id);
+}
+
+/*******************************************************************************
+ * MODULE    : VehicleDeleteEvent
+ * ABSTRACT  : Event deletion processing
+ * FUNCTION  : Delete events
+ * ARGUMENT  : event_id  : Event ID of the event to delete
+ * NOTE      :
+ * RETURN    : RET_NORMAL  : Normal completion
+ *           : RET_EV_NONE  : Specified event does not exist
+ ******************************************************************************/
+inline RET_API VehicleDeleteEvent(EventID event_id) {
+    return(_pb_DeleteEvent(event_id));
+}
+
+/*******************************************************************************
+ * MODULE    : VehicleLinkShareData
+ * ABSTRACT  : Link to shared memory
+ * FUNCTION  : Link to shared memory
+ * ARGUMENT  : **share_top  : Storage destination of shared memory top address
+ *           : *share_size  : Storage destination of shared memory area size
+ *           : *offset  : Offset storage destination to free shared memory area
+ * NOTE      :
+ * RETURN    : RET_NORMAL  : Normal completion
+ *           : RET_ERROR  : There is no shared memory area.
+ ******************************************************************************/
+inline RET_API VehicleLinkShareData(void **share_top, uint32_t *share_size, uint16_t *offset) {
+    RET_API      ret_api;            /* System API return value */
+    SemID      sem_id;              /* Semaphore ID */
+    VEHICLE_SHARE  *share_top_tmp;
+    int32      i;
+
+    /* Initialization */
+    ret_api = RET_ERROR;
+
+    /* Create Semaphore */
+    sem_id = _pb_CreateSemaphore(const_cast<char *>(VEHICLE_SEMAPHO_NAME));
+    if (0 != sem_id) {
+        /* Semaphore Lock */
+        ret_api = _pb_SemLock(sem_id);
+        if (RET_NORMAL == ret_api) {
+            /* Link to shared memory */
+            ret_api = _pb_LinkShareData(const_cast<char *>(VEHICLE_SHARE_NAME), share_top, share_size);
+            if (RET_NORMAL == ret_api) {
+                /* By searching the free shared memory area,Offset is calculated if there is free space. */
+                share_top_tmp = reinterpret_cast<VEHICLE_SHARE *>(*share_top);
+
+                /* Because the first block of the shared memory area is the control area,Loop from i = 1 */
+                for (i = 1; i < VEHICLE_SHARE_BLOCK_NUM; i++) {
+                    if (VEHICLE_SHARE_UNLOCK == share_top_tmp->mng.lock_info[i]) {
+                        break;
+                    }
+                }
+                if (i < VEHICLE_SHARE_BLOCK_NUM) {
+                    /* Empty space */
+                    /* Lock the block */
+                    share_top_tmp->mng.lock_info[i] = VEHICLE_SHARE_LOCK;
+
+                    /* Calculate the offset to the block */
+                    *offset = static_cast<u_int16>(i * VEHICLE_SHARE_BLOCK_SIZE);
+
+                    /* Normal completion */
+                    ret_api = RET_NORMAL;
+                } else {
+                    /* No free space */
+                    ret_api = RET_ERROR;
+                }
+            } else {
+                /* Failed link to shared memory */
+                ret_api = RET_ERROR;
+            }
+            /* Semaphore unlock */
+            _pb_SemUnlock(sem_id);
+        } else {
+            /* Semaphore lock failed */
+            ret_api = RET_ERROR;
+        }
+    } else {
+        /* Semaphore creation failed */
+        ret_api = RET_ERROR;
+    }
+
+    return(ret_api);
+}
+
+/*******************************************************************************
+ * MODULE    : VehicleUnLinkShareData
+ * ABSTRACT  : Unlinking shared memory
+ * FUNCTION  : Unlink shared memory
+ * ARGUMENT  : *share_top  : Start address of shared memory
+ *           : offset    : Offset to shared memory free area
+ * NOTE      :
+ * RETURN    : RET_NORMAL  : Normal completion
+ *           : RET_ERROR  : There is no shared memory area./semaphore error
+ ******************************************************************************/
+inline RET_API VehicleUnLinkShareData(VEHICLE_SHARE *share_top, uint16_t offset) {
+    RET_API      ret_api;            /* System API return value */
+    SemID      sem_id;              /* Semaphore ID */
+    int32      i;
+
+    /* Initialization */
+    ret_api = RET_ERROR;
+
+    /* Create Semaphore */
+    sem_id = _pb_CreateSemaphore(const_cast<char *>(VEHICLE_SEMAPHO_NAME));
+    if (0 != sem_id) {
+        /* Semaphore Lock */
+        ret_api = _pb_SemLock(sem_id);
+        if (RET_NORMAL == ret_api) {
+            /* Unlock the block */
+            i = static_cast<int32>(offset) / VEHICLE_SHARE_BLOCK_SIZE;
+            share_top->mng.lock_info[i] = VEHICLE_SHARE_UNLOCK;
+
+            /* Semaphore unlock */
+            _pb_SemUnlock(sem_id);
+
+            /* Normal completion */
+            ret_api = RET_NORMAL;
+        } else {
+            /* Semaphore lock failed */
+            ret_api = RET_ERROR;
+        }
+    } else {
+        /* Semaphore creation failed */
+        ret_api = RET_ERROR;
+    }
+
+    return(ret_api);
+}
+
+/*******************************************************************************
+ * MODULE    : VehicleSndMsg
+ * ABSTRACT  : Message transmission processing
+ * FUNCTION  : Send a message to the specified PNO
+ * ARGUMENT  : pno_src      : Source PNO
+ *           : pno_dest    : Destination PNO
+ *           : cid      : Command ID
+ *           : msg_len      : Message data body length
+ *           : *msg_data    : Pointer to message data
+ * NOTE      :
+ * RETURN    : RET_NORMAL    : Normal completion
+ *           : RET_ERRNOTRDY  : Destination process is not wakeup
+ *           : RET_ERRMSGFULL  : Message queue overflows
+ *           : RET_ERRPARAM    : Buffer size error
+ ******************************************************************************/
+inline RET_API VehicleSndMsg(PNO pno_src, PNO pno_dest, CID cid, uint16_t msg_len, const void *msg_data) {
+    VEHICLE_MSG_BUF      msg_buf;    /* message buffer */
+    T_APIMSG_MSGBUF_HEADER  *msg_hdr;    /* Pointer to the message header */
+    RET_API          ret_api;    /* Return value */
+    PCSTR          thread_name;  /* Destination thread name        */
+
+
+    /* Internal debug log output */
+    FRAMEWORKUNIFIEDLOG(ZONE_26, __FUNCTION__, 
+                  "+ [pno_src = 0x%x, pno_dest = 0x%x]", pno_src, pno_dest);
+
+    /* _CWORD71_ processing speed(Memset modification) */
+    /* Initializing the header of the message buffer */
+    memset(reinterpret_cast<void *>(&msg_buf.hdr), 0, sizeof(T_APIMSG_MSGBUF_HEADER));
+
+    /* Get pointer to send buffer */
+    msg_hdr = reinterpret_cast<T_APIMSG_MSGBUF_HEADER *>(reinterpret_cast<void *>(&msg_buf));
+
+    /*--------------------------------------------------------------*
+     *  Create message headers                  *
+     *--------------------------------------------------------------*/
+    msg_hdr->hdr.sndpno    = pno_src;    /* Source PNO */
+    msg_hdr->hdr.cid      = cid;    /* Command ID */
+    msg_hdr->hdr.msgbodysize  = msg_len;    /* Message data body length */
+
+    /*--------------------------------------------------------------*
+     *  Create message data                  *
+     *--------------------------------------------------------------*/
+    if ((0 != msg_data) && (0 != msg_len)) {
+        /* Set the message data */
+        memcpy(reinterpret_cast<void *>(msg_buf.data), msg_data, (size_t)msg_len);
+    }
+    /*--------------------------------------------------------------*
+     * Send messages                      *
+     *--------------------------------------------------------------*/
+    /* Get Thread Name from PNO */
+    if (pno_dest <= SYS_PNO_MAX) {
+        thread_name = POS_THREAD_NAME;
+    } else {
+        thread_name = _pb_CnvPno2Name(pno_dest);
+    }
+
+    if ((pno_dest <= SYS_PNO_MAX) && (pno_src <= SYS_PNO_MAX)) {
+        /* Internal debug log output */
+        FRAMEWORKUNIFIEDLOG(ZONE_26, __FUNCTION__, "[LOG pno_dest = 0x%x]", pno_dest);
+
+        /* Internal Process Transmission and Reception Messages */
+        ret_api = _pb_SndMsg(pno_dest,
+                             (uint16_t)(sizeof(T_APIMSG_MSGBUF_HEADER) + msg_len),
+                             reinterpret_cast<void *>(&msg_buf), 0);
+    } else {
+        /* External Process Transmission and Reception Messages */
+        ret_api = _pb_SndMsg_Ext(thread_name,
+                                 cid,
+                                 (uint16_t)(msg_len),  /* Ignore->MISRA-C++:2008 Rule 5-0-5 */
+                                 reinterpret_cast<void *>(&(msg_buf.data)), 0);
+    }
+    FRAMEWORKUNIFIEDLOG(ZONE_26, __FUNCTION__, "-");
+
+    return(ret_api);
+}
+
+/**
+ * @brief
+ *  Resource Acquisition Decision
+ *
+ * @param[in] none
+ *
+ * @return  TRUE       Normal<br>
+ *          FALSE      Abnormality(Insufficient resource)
+ */
+inline BOOL VehicleGetResource(void) {
+    BOOL ret[4] = {TRUE, TRUE, TRUE, TRUE};
+    uint8_t idx;
+
+    ret[1] = _pb_GetMsgResource();
+    ret[2] = _pb_GetMutexResource();
+    ret[3] = _pb_GetOtherResource();
+
+    for (idx = 1; idx < 4; idx++) {
+        if (ret[idx] == FALSE) {
+            ret[0] = FALSE;
+        }
+    }
+
+    return ret[0];
+}
+
+/**
+ * @brief
+ *  Resource release
+ *
+ * @param[in] none
+ *
+ * @return  none
+ */
+inline void VehicleReleaseResource(void) {
+    _pb_ReleaseMsgResource();
+    _pb_ReleaseMutexResource();
+    _pb_ReleaseOtherResource();
+
+    return;
+}
+
+inline uint32_t GetTid(void) {
+    return (uint32_t)syscall(__NR_gettid);
+}
+
+
+#endif  // POSITIONING_CLIENT_INCLUDE_POS_PRIVATE_H_