Re-organized sub-directory by category
[staging/basesystem.git] / service / vehicle / positioning / server / src / Sensor / SensorLog.cpp
diff --git a/service/vehicle/positioning/server/src/Sensor/SensorLog.cpp b/service/vehicle/positioning/server/src/Sensor/SensorLog.cpp
new file mode 100755 (executable)
index 0000000..eed514f
--- /dev/null
@@ -0,0 +1,1307 @@
+/*
+ * @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
+ *   SensorLog.cpp
+ * @brief
+ *   Sensor Logging service functionality
+ */
+
+/*---------------------------------------------------------------------------------*
+ * Include Files                                                                   *
+ *---------------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#include <positioning_hal.h>
+#include <unistd.h>
+#include "SensorLog.h"
+#include "Sensor_Common_API.h"
+#include <zlib.h>
+#include "POS_private.h"
+
+/*---------------------------------------------------------------------------------*
+ * Definition                                                                      *
+ *---------------------------------------------------------------------------------*/
+/* Sensor Log Type */
+typedef enum {
+    SENSLOG_TYPE_SYS_INPUT = 0,                 /* Sensor Log Type-SYS (INPUT)  */
+    SENSLOG_TYPE_SYS_OUTPUT,                    /* Sensor Log Type-SYS (OUTPUT) */
+    SENSLOG_TYPE_GPS_INPUT,                     /* Sensor Log Type-GPS (INPUT)  */
+    SENSLOG_TYPE_GPS_OUTPUT,                    /* Sensor Log Type-GPS (OUTPUT) */
+    SENSLOG_TYPE_NAVI_INPUT,                    /* Sensor Log Type-NAVI(INPUT)  */
+    SENSLOG_TYPE_NAVI_OUTPUT,                   /* Sensor Log Type-NAVI(OUTPUT) */
+    SENSLOG_TYPE_POS_OUTPUT,                    /* Sensor Log Type-POS (OUTPUT) */
+    SENSLOG_TYPE_CMD_INPUT,                     /* Sensor Log Type-CMD (INPUT)  */
+    SENSLOG_TYPE_CMD_OUTPUT,                    /* Sensor Log Type-CMD (OUTPUT) */
+
+    SENSLOG_TYPE_COUNT                          /* Sensor Log Type-Counting     */
+} SENSLOG_TYPE;
+
+#define SENSLOG_VALIDFLAG_ON            (1)     /* Effective specific flag ON              */
+#define SENSLOG_VALIDFLAG_OFF           (0)     /* Enable flag OFF             */
+#define SENSLOG_FILEPATH_SIZE           (128)   /* Output path size            */
+#define SENSLOG_FILENAME_SIZE           (64)    /* Output file name size      */
+#define SENSLOG_CONFIG_TEXT_SIZE        (128)   /* config file size/line */
+#define SENSLOG_LEN_MIN                 (1)     /* Record Length-Minimum         */
+#define SENSLOG_LEN_MAX                 (900)   /* Record Length-Maximum         */
+#define SENSLOG_LEN_DEFAULT             (300)   /* Record length-default value   */
+#define SENSLOG_GEN_MIN                 (1)     /* Number of generations-minimum value             */
+#define SENSLOG_GEN_MAX                 (999)   /* Number of generations-maximum value             */
+#define SENSLOG_GEN_DEFAULT             (100)   /* Number of generations-default value       */
+#define SENSLOG_BUF_MIN                 (2272)  /* Buffer Size-Minimum         */
+#define SENSLOG_BUF_MAX                 (11360) /* Buffer size-maximum value         */
+#define SENSLOG_BUF_DEFAULT             (4544)  /* Buffer size-default value   */
+#define SENSLOG_OUTPUTFLAG_NEW          (0)     /* Output Flag-New */
+#define SENSLOG_OUTPUTFLAG_ADD          (1)     /* Output Flag-Add */
+#define SENSLOG_PNAME_MAX               (16)    /* Maximum number of characters of process name */
+
+#define SENSLOG_SEMAPHO_NAME            ("SENSLOG_SEMAPHO")   /* Semaphore name(MAX 32Byte) */
+
+#define SENSLOG_CONFIG_FILE_PATH_1      "/nv/BS/vs/positioning/rwdata/"  /* Sensor log-Config filepath-1      */
+#define SENSLOG_CONFIG_FILE_PATH_2      "/mnt/sda1/"       /* Sensor log-Config filepath-2      */
+#define SENSLOG_CONFIG_FILE_NAME_SYS    "POS_sys_log.cfg"  /* Sensor log-Config filename-SYS      */
+#define SENSLOG_CONFIG_FILE_NAME_GPS    "POS_gps_log.cfg"  /* Sensor log-Config filename-GPS      */
+#define SENSLOG_CONFIG_FILE_NAME_NAVI   "POS_nav_log.cfg"  /* Sensor log-Config filename-NAVI     */
+#define SENSLOG_CONFIG_FILE_NAME_POS    "POS_pos_log.cfg"  /* Sensor log-Config filename-POS      */
+#define SENSLOG_CONFIG_FILE_NAME_CMD    "POS_cmd_log.cfg"  /* Sensor log-Config filename-CMD      */
+#define SENSLOG_CONFIG_KEY_LEN          "POS_log_len"      /* Sensor log-config file-Record length */
+#define SENSLOG_CONFIG_KEY_GEN          "POS_log_gen"      /* Sensor log-config file-Number of generations     */
+#define SENSLOG_CONFIG_KEY_BUF          "POS_log_buf"      /* Sensor log-config file-Buffer size */
+#define SENSLOG_NAV_SVINFO_FILE_NAME    "POS_NAV_SVINFO"   /* Sensor log-NAV-SVINFOFile name(Log output when file exists)*/
+#define SENSLOG_SEQ_START               ">>>>"             /* Sensor log sequence(Start) */
+#define SENSLOG_SEQ_END                 "<<<<"             /* Sensor log sequence(End)   */
+#define SENSLOG_SEQ_SIZE                (4)                /* Sensor Log Sequence Size       */
+
+/*---------------------------------------------------------------------------------*
+ * Structre                                                                        *
+ *---------------------------------------------------------------------------------*/
+/*!
+   @brief   Structure to create SensorLog data
+*/
+typedef struct {
+    uint16_t us_len;  /* Number of records */
+    uint16_t uc_gen;  /* Number of generations */
+} SENSLOG_GEN;
+
+/*!
+   @brief   Structure to create SensorLog data
+*/
+typedef struct {
+    uint8_t      uc_valid_flag;                       /* Output enable flag            */
+    SENSLOG_GEN  st_gen;                              /* Generation information                  */
+    uint16_t     us_file_rec_count;                    /* Number of file output records    */
+    uint16_t     us_rec_count;                        /* Number of output records            */
+    uint16_t     us_gen_count;                        /* Number of generations                    */
+    uint8_t      uc_file_path[SENSLOG_FILEPATH_SIZE]; /* Output path                  */
+    uint8_t      uc_file_name[SENSLOG_FILENAME_SIZE]; /* Output file name            */
+    uint8_t      uc_gen_fname[SENSLOG_FILENAME_SIZE]; /* Generation information output file name    */
+    uint8_t      uc_text_buf[SENSLOG_BUF_MAX];        /* Buffering area(Static)  */
+    uint32_t     ul_text_buf_size;                     /* Buffering area size  */
+    uint32_t     ul_text_buf_len;                      /* Data size in the buffer  */
+    uint8_t      uc_output_flag;                      /* Output flag */
+    uint8_t      uc_temp_buf[SENSLOG_BUF_MAX];        /* Output data temporary area        */
+    uint8_t      uc_positioninglog_buf[SENSLOG_BUF_MAX];      /* FRAMEWORKUNIFIEDLOG outputs          */
+} SENSLOG_INFO;
+
+/*!
+   @brief   Structure to get System time
+*/
+typedef struct {
+    uint16_t us_year;
+    uint16_t us_month;
+    uint16_t us_day_of_week;
+    uint16_t us_day;
+    uint16_t us_hour;
+    uint16_t us_minute;
+    uint16_t us_second;
+    uint16_t us_milli_seconds;
+} SENSLOG_SYSTEMTIME;
+
+/*!
+   @brief   Structure to create SensorLog data
+*/
+typedef struct {
+    uint16_t            us_data_type;                 /* Data type         */
+    SENSLOG_SYSTEMTIME  st_sys_time;                  /* Current time           */
+    DID                 ul_did;                      /* Data ID           */
+    int8_t              c_pname[SENSLOG_PNAME_MAX];  /* Destination information           */
+    uint8_t             uc_unit_type;                 /* Hardware configuration type(GRADE1 / GRADE2) */
+    uint8_t             uc_result;                   /* Send/Receive result(Success:0 / Fail:1) */
+    uint16_t            us_data_size;                 /* Size of the data       */
+} SENSLOG_DATA_HEADER;
+
+
+/*!
+   @brief   Structure to create SensorLog ID table
+*/
+typedef struct {
+    uint16_t            us_data_type;                 /* Data type         */
+    DID                 ul_did;                      /* Data ID           */
+    uint16_t            us_file_type;                 /* Sensor Log Type     */
+    uint16_t            us_write_type;                /* FRAMEWORKUNIFIEDLOG Output Type     */
+} SENSLOG_ID_TBL;
+
+/*---------------------------------------------------------------------------------*
+ * Local Function Prototype                                                        *
+ *---------------------------------------------------------------------------------*/
+static void SensLogGetConfig(const uint8_t*, SENSLOG_INFO*);
+static void SensLogGetConfigVal(uint8_t*, uint8_t*);
+static void SensLogCheckNAVSVINFOFile(void);
+static void SensLogWrite(uint16_t, uint16_t, uint16_t, DID did, PNO pno, uint8_t*, uint16_t, uint8_t, uint8_t, uint8_t);
+static uint16_t SensLogGetFileType(const SENSLOG_ID_TBL*, uint16_t*, uint16_t*, DID did);
+static void SensLogOutputFile(uint8_t);
+static void SensLogOutputGenFile(uint8_t);
+static void SensLogGetSystemTime(SENSLOG_SYSTEMTIME*);
+static void Num2String2Digit(uint8_t* buf, uint32_t num);
+static void Num2String3Digit(uint8_t* buf, uint32_t num);
+static void Num2String4Digit(uint8_t* buf, uint32_t num);
+static void Num2HexString(uint8_t* buf, uint8_t digits, uint32_t num);
+static void SensLogmakeHeader(uint8_t* buf, SENSLOG_DATA_HEADER data_header);
+
+/*---------------------------------------------------------------------------------*
+ * Grobal Value                                                                    *
+ *---------------------------------------------------------------------------------*/
+/* Sensor log information */
+static SENSLOG_INFO g_sens_log_info[SENSLOG_TYPE_COUNT];    // NOLINT(readability/nolint)
+static uint8_t   g_navsv_info_flag = FALSE;
+uint8_t   g_mount_path[SENSLOG_FILEPATH_SIZE];  /* Mount path */
+UNIT_TYPE g_unit_type = UNIT_TYPE_NONE;         /* HW configuration type   */
+SemID     g_sem_id = 0;                         /* Lock semaphore ID */
+
+/* Sensor log type definition table */
+const SENSLOG_ID_TBL kSensLogInputTbl[] = {
+    /* Data type                DID                                Sensor Log Type             FRAMEWORKUNIFIEDLOG Output Type */
+    {SENSLOG_DATA_I_SYS,         0,                                 SENSLOG_TYPE_SYS_INPUT,    POS_SENSLOG_TYPE_SYS  },
+    {SENSLOG_DATA_I_SYS_STS,     0,                                 SENSLOG_TYPE_SYS_INPUT,    POS_SENSLOG_TYPE_SYS  },
+    {SENSLOG_DATA_I_GPS,         0,                                 SENSLOG_TYPE_GPS_INPUT,    POS_SENSLOG_TYPE_GPS  },
+    {SENSLOG_DATA_I_LOC,         POSHAL_DID_GPS_CUSTOMDATA_NAVI,    SENSLOG_TYPE_NAVI_INPUT,   POS_SENSLOG_TYPE_NAV  },
+    {SENSLOG_DATA_I_SPEED,       VEHICLE_DID_MOTION_SPEED_NAVI,     SENSLOG_TYPE_NAVI_INPUT,   POS_SENSLOG_TYPE_NAV  },
+    {SENSLOG_DATA_I_TIME,        VEHICLE_DID_SETTINGTIME,           SENSLOG_TYPE_NAVI_INPUT,   POS_SENSLOG_TYPE_NAV  },
+    {SENSLOG_DATA_I_TIME,        POSHAL_DID_GPS_TIME,               SENSLOG_TYPE_GPS_INPUT,    POS_SENSLOG_TYPE_GPS  },
+    {SENSLOG_DATA_I_GPSINF,      0,                                 SENSLOG_TYPE_NAVI_INPUT,   POS_SENSLOG_TYPE_NAV  },
+    {SENSLOG_DATA_I_GPSRST,      0,                                 SENSLOG_TYPE_CMD_INPUT,    POS_SENSLOG_TYPE_CMD  },
+    {SENSLOG_DATA_I_GPSSET,      0,                                 SENSLOG_TYPE_CMD_INPUT,    POS_SENSLOG_TYPE_CMD  },
+    {SENSLOG_DATA_I_NAVSVINFO,   0,                                 SENSLOG_TYPE_GPS_INPUT,    POS_SENSLOG_TYPE_GPS  },
+    {SENSLOG_DATA_I_SYS_ABNORMAL, 0,                                SENSLOG_TYPE_SYS_INPUT,    POS_SENSLOG_TYPE_SYS  },
+    {SENSLOG_DATA_I_UNSPECIFIED, 0,                                 SENSLOG_TYPE_COUNT,        POS_SENSLOG_TYPE_NONE }
+};
+
+const SENSLOG_ID_TBL kSensLogOutputTbl[] = {
+    /* Data type                DID                                Sensor Log Type             FRAMEWORKUNIFIEDLOG Output Type */
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_SPEED_PULSE,               SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_SPEED_KMPH,                SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GYRO_X,                    SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GYRO_Y,                    SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GYRO_Z,                    SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GSNS_X,                    SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GSNS_Y,                    SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GSNS_Z,                    SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GPS_ANTENNA,               SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_SNS_COUNTER,               SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_SPEED_PULSE_FST,           SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GYRO_X_FST,                SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GYRO_Y_FST,                SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GYRO_Z_FST,                SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         VEHICLE_DID_GPS__CWORD82__NMEA,             SENSLOG_TYPE_GPS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GPS__CWORD82___CWORD44_GP4,          SENSLOG_TYPE_GPS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GPS__CWORD82__FULLBINARY,        SENSLOG_TYPE_GPS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GPS_NMEA,                  SENSLOG_TYPE_GPS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_REV,                       SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_REV_FST,                   SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GYRO_TEMP,                 SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GYRO_TEMP_FST,             SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GSNS_X_FST,                SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GSNS_Y_FST,                SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GSNS_Z_FST,                SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_PULSE_TIME,                SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GPS_CLOCK_DRIFT,           SENSLOG_TYPE_GPS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS,         POSHAL_DID_GPS_CLOCK_FREQ,            SENSLOG_TYPE_GPS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SYS_PKG,     0,                                 SENSLOG_TYPE_SYS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_GPS,         0,                                 SENSLOG_TYPE_CMD_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_LONLAT_N,    VEHICLE_DID_LOCATION_LONLAT_NAVI,  SENSLOG_TYPE_NAVI_OUTPUT,  POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_LONLAT_G,    VEHICLE_DID_LOCATION_LONLAT,       SENSLOG_TYPE_GPS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_ALT,         VEHICLE_DID_LOCATION_ALTITUDE,     SENSLOG_TYPE_GPS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SPEED_N,     VEHICLE_DID_MOTION_SPEED_NAVI,     SENSLOG_TYPE_NAVI_OUTPUT,  POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_SPEED_P,     VEHICLE_DID_MOTION_SPEED_INTERNAL, SENSLOG_TYPE_POS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_HEAD_N,      VEHICLE_DID_MOTION_HEADING_NAVI,   SENSLOG_TYPE_NAVI_OUTPUT,  POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_HEAD_G,      VEHICLE_DID_MOTION_HEADING,        SENSLOG_TYPE_GPS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_TIME_SETREQ, VEHICLE_DID_SETTINGTIME,           SENSLOG_TYPE_GPS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_TIME,        POSHAL_DID_GPS_TIME,               SENSLOG_TYPE_GPS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_GPSINF,      VEHICLE_DID_NAVIINFO_DIAG_GPS,     SENSLOG_TYPE_NAVI_OUTPUT,  POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_TIME_CS,     0,                                 SENSLOG_TYPE_GPS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+    {SENSLOG_DATA_O_GPSRST,      0,                                 SENSLOG_TYPE_GPS_OUTPUT,   POS_SENSLOG_TYPE_NONE },
+
+    {SENSLOG_DATA_O_UNSPECIFIED, 0,                                 SENSLOG_TYPE_COUNT,        POS_SENSLOG_TYPE_NONE }
+};
+
+/*---------------------------------------------------------------------------------*
+ * Function                                                                        *
+ *---------------------------------------------------------------------------------*/
+/**
+ * @brief
+ *   Sensor Log Initial Processing
+ *
+ * @param[in]  p_mount_path Mount path
+ */
+void SensLogInitialize(uint8_t *p_mount_path) {
+    static SENSLOG_INFO st_sens_log_info; /* Coverity CID:23609 compliant */
+    uint8_t      uc_hw[16];                       /* HW name */
+    uint8_t      ret = 0;
+    uint8_t      i;
+    static uint8_t tzset_flag = 0; /* Not initialized */
+
+    FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, "+");
+
+    /* Not initialized */
+    if (tzset_flag == 0) {
+        tzset();
+        tzset_flag = 1; /* Initialization complete */
+    }
+
+    /* Initialization of sensor log information structure */
+    memset(&g_sens_log_info, 0, sizeof(g_sens_log_info));
+
+    /* Get mount path */
+    memset(&g_mount_path[0], 0, sizeof(g_mount_path));
+    if (NULL == p_mount_path) {
+        snprintf(reinterpret_cast<char*>(&g_mount_path[0]), sizeof(g_mount_path), SENSLOG_CONFIG_FILE_PATH_2);
+    } else {
+        snprintf(reinterpret_cast<char*>(&g_mount_path[0]), sizeof(g_mount_path), "%s/", p_mount_path);
+    }
+    FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, "mount path[%s]", g_mount_path);
+
+    /* HW judgment */
+    memset(&uc_hw[0], 0, sizeof(uc_hw));
+    g_unit_type = GetEnvSupportInfo();
+    if (UNIT_TYPE_GRADE1 == g_unit_type) {
+        /* GRADE1 */
+        snprintf(reinterpret_cast<char*>(&uc_hw[0]), sizeof(uc_hw), "GRADE1");
+    } else if (UNIT_TYPE_GRADE2 == g_unit_type) {
+      /*
+       *  Note.
+       *  This feature branches processing depending on the unit type.
+       */
+    } else {
+        /* Environment error */
+        /* Do not output sensor log */
+        FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Environment Error.");
+        ret = 1;
+    }
+
+    /* Get Semaphore ID */
+    g_sem_id = _pb_CreateSemaphore(const_cast<char *>(SENSLOG_SEMAPHO_NAME));
+    if (g_sem_id == 0) {  // LCOV_EXCL_BR_LINE 200: can not return zero
+        // LCOV_EXCL_START 8: invalid
+        AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
+        FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Semaphore create Error.(ID = 0)");
+        ret = 1;
+        // LCOV_EXCL_STOP
+    }
+
+    if (ret == 0) {
+        /* Read config files */
+        /* SYS */
+        memset(&st_sens_log_info, 0, sizeof(SENSLOG_INFO));
+        SensLogGetConfig((const uint8_t*)SENSLOG_CONFIG_FILE_NAME_SYS, &st_sens_log_info);
+        if (st_sens_log_info.uc_valid_flag == SENSLOG_VALIDFLAG_ON) {
+            st_sens_log_info.us_gen_count = 1;
+            memcpy(&g_sens_log_info[SENSLOG_TYPE_SYS_INPUT],  &st_sens_log_info, sizeof(SENSLOG_INFO));
+            memcpy(&g_sens_log_info[SENSLOG_TYPE_SYS_OUTPUT], &st_sens_log_info, sizeof(SENSLOG_INFO));
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_SYS_INPUT].uc_file_name[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_SYS_INPUT].uc_file_name), "POS_%s_sys_i_%%03d.log", uc_hw);
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_SYS_OUTPUT].uc_file_name[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_SYS_OUTPUT].uc_file_name), "POS_%s_sys_o_%%03d.log", uc_hw);
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_SYS_INPUT].uc_gen_fname[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_SYS_INPUT].uc_gen_fname), "POS_%s_sys_i_gen.dat", uc_hw);
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_SYS_OUTPUT].uc_gen_fname[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_SYS_OUTPUT].uc_gen_fname), "POS_%s_sys_o_gen.dat", uc_hw);
+            SensLogOutputGenFile(SENSLOG_TYPE_SYS_INPUT);
+            SensLogOutputGenFile(SENSLOG_TYPE_SYS_OUTPUT);
+        }
+
+        /* GPS */
+        memset(&st_sens_log_info, 0, sizeof(SENSLOG_INFO));
+        SensLogGetConfig((const uint8_t*)SENSLOG_CONFIG_FILE_NAME_GPS, &st_sens_log_info);
+        if (st_sens_log_info.uc_valid_flag == SENSLOG_VALIDFLAG_ON) {
+            st_sens_log_info.us_gen_count = 1;
+            memcpy(&g_sens_log_info[SENSLOG_TYPE_GPS_INPUT],  &st_sens_log_info, sizeof(SENSLOG_INFO));
+            memcpy(&g_sens_log_info[SENSLOG_TYPE_GPS_OUTPUT], &st_sens_log_info, sizeof(SENSLOG_INFO));
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_GPS_INPUT].uc_file_name[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_GPS_INPUT].uc_file_name), "POS_%s_gps_i_%%03d.log", uc_hw);
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_GPS_OUTPUT].uc_file_name[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_GPS_OUTPUT].uc_file_name), "POS_%s_gps_o_%%03d.log", uc_hw);
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_GPS_INPUT].uc_gen_fname[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_GPS_INPUT].uc_gen_fname), "POS_%s_gps_i_gen.dat", uc_hw);
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_GPS_OUTPUT].uc_gen_fname[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_GPS_OUTPUT].uc_gen_fname), "POS_%s_gps_o_gen.dat", uc_hw);
+            SensLogOutputGenFile(SENSLOG_TYPE_GPS_INPUT);
+            SensLogOutputGenFile(SENSLOG_TYPE_GPS_OUTPUT);
+        }
+
+        /* NAVI */
+        memset(&st_sens_log_info, 0, sizeof(SENSLOG_INFO));
+        SensLogGetConfig((const uint8_t*)SENSLOG_CONFIG_FILE_NAME_NAVI, &st_sens_log_info);
+        if (st_sens_log_info.uc_valid_flag == SENSLOG_VALIDFLAG_ON) {
+            st_sens_log_info.us_gen_count = 1;
+            memcpy(&g_sens_log_info[SENSLOG_TYPE_NAVI_INPUT],  &st_sens_log_info, sizeof(SENSLOG_INFO));
+            memcpy(&g_sens_log_info[SENSLOG_TYPE_NAVI_OUTPUT], &st_sens_log_info, sizeof(SENSLOG_INFO));
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_NAVI_INPUT].uc_file_name[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_NAVI_INPUT].uc_file_name), "POS_%s_nav_i_%%03d.log", uc_hw);
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_NAVI_OUTPUT].uc_file_name[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_NAVI_OUTPUT].uc_file_name), "POS_%s_nav_o_%%03d.log", uc_hw);
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_NAVI_INPUT].uc_gen_fname[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_NAVI_INPUT].uc_gen_fname), "POS_%s_nav_i_gen.dat", uc_hw);
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_NAVI_OUTPUT].uc_gen_fname[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_NAVI_OUTPUT].uc_gen_fname), "POS_%s_nav_o_gen.dat", uc_hw);
+            SensLogOutputGenFile(SENSLOG_TYPE_NAVI_INPUT);
+            SensLogOutputGenFile(SENSLOG_TYPE_NAVI_OUTPUT);
+        }
+
+        /* POS */
+        memset(&st_sens_log_info, 0, sizeof(SENSLOG_INFO));
+        SensLogGetConfig((const uint8_t*)SENSLOG_CONFIG_FILE_NAME_POS, &st_sens_log_info);
+        if (st_sens_log_info.uc_valid_flag == SENSLOG_VALIDFLAG_ON) {
+            st_sens_log_info.us_gen_count = 1;
+            memcpy(&g_sens_log_info[SENSLOG_TYPE_POS_OUTPUT],  &st_sens_log_info, sizeof(SENSLOG_INFO));
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_POS_OUTPUT].uc_file_name[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_POS_OUTPUT].uc_file_name), "POS_%s_pos_o_%%03d.log", uc_hw);
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_POS_OUTPUT].uc_gen_fname[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_POS_OUTPUT].uc_gen_fname), "POS_%s_pos_o_gen.dat", uc_hw);
+            SensLogOutputGenFile(SENSLOG_TYPE_POS_OUTPUT);
+        }
+
+        /* CMD */
+        memset(&st_sens_log_info, 0, sizeof(SENSLOG_INFO));
+        SensLogGetConfig((const uint8_t*)SENSLOG_CONFIG_FILE_NAME_CMD, &st_sens_log_info);
+        if (st_sens_log_info.uc_valid_flag == SENSLOG_VALIDFLAG_ON) {
+            st_sens_log_info.us_gen_count = 1;
+            memcpy(&g_sens_log_info[SENSLOG_TYPE_CMD_INPUT],  &st_sens_log_info, sizeof(SENSLOG_INFO));
+            memcpy(&g_sens_log_info[SENSLOG_TYPE_CMD_OUTPUT], &st_sens_log_info, sizeof(SENSLOG_INFO));
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_CMD_INPUT].uc_file_name[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_CMD_INPUT].uc_file_name), "POS_%s_cmd_i_%%03d.log", uc_hw);
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_CMD_OUTPUT].uc_file_name[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_CMD_OUTPUT].uc_file_name), "POS_%s_cmd_o_%%03d.log", uc_hw);
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_CMD_INPUT].uc_gen_fname[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_CMD_INPUT].uc_gen_fname), "POS_%s_cmd_i_gen.dat", uc_hw);
+            snprintf(reinterpret_cast<char*>(&(g_sens_log_info[SENSLOG_TYPE_CMD_OUTPUT].uc_gen_fname[0])),
+                     sizeof(g_sens_log_info[SENSLOG_TYPE_CMD_OUTPUT].uc_gen_fname), "POS_%s_cmd_o_gen.dat", uc_hw);
+            SensLogOutputGenFile(SENSLOG_TYPE_CMD_INPUT);
+            SensLogOutputGenFile(SENSLOG_TYPE_CMD_OUTPUT);
+        }
+
+        /* NAV-SVINFO */
+        SensLogCheckNAVSVINFOFile();
+    }
+
+    for (i = 0; i < SENSLOG_TYPE_COUNT; i++) {
+        if (g_sens_log_info[i].uc_valid_flag == SENSLOG_VALIDFLAG_ON) {
+            FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, \
+                "g_sens_log_info[%d].uc_valid_flag:%d", i, g_sens_log_info[i].uc_valid_flag);
+            FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, \
+                "g_sens_log_info[%d].st_gen.us_len:%d", i, g_sens_log_info[i].st_gen.us_len);
+            FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, \
+                "g_sens_log_info[%d].st_gen.uc_gen:%d", i, g_sens_log_info[i].st_gen.uc_gen);
+            FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, \
+                "g_sens_log_info[%d].us_file_rec_count:%d", i, g_sens_log_info[i].us_file_rec_count);
+            FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, \
+                "g_sens_log_info[%d].us_rec_count:%d", i, g_sens_log_info[i].us_rec_count);
+            FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, \
+                "g_sens_log_info[%d].us_gen_count:%d", i, g_sens_log_info[i].us_gen_count);
+            FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, \
+                "g_sens_log_info[%d].uc_file_path:%s", i, g_sens_log_info[i].uc_file_path);
+            FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, \
+                "g_sens_log_info[%d].uc_file_name:%s", i, g_sens_log_info[i].uc_file_name);
+            FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, \
+                "g_sens_log_info[%d].uc_gen_fname:%s", i, g_sens_log_info[i].uc_gen_fname);
+            FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, \
+                "g_sens_log_info[%d].ul_text_buf_size:%d", i, g_sens_log_info[i].ul_text_buf_size);
+        }
+    }
+    FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, "-");
+
+    return;
+}
+
+/**
+ * @brief
+ *   Sensor log stop processing
+ */
+void SensLogTerminate(void) {
+    FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "+");
+
+    /* Initialization of sensor log information structure */
+    memset(&g_sens_log_info, 0, sizeof(g_sens_log_info));
+
+    FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "-");
+
+    return;
+}
+
+/**
+ * @brief
+ *   Sensor log saving process
+ */
+void SensLogStore(void) {  // LCOV_EXCL_START 8 : dead code
+    AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
+    uint8_t     i;
+
+    FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "+");
+
+    for (i = 0; i < SENSLOG_TYPE_COUNT; i++) {
+        /* Output buffering log */
+        if ((g_sens_log_info[i].uc_valid_flag == SENSLOG_VALIDFLAG_ON) &&
+                (g_sens_log_info[i].ul_text_buf_len > 0)) {
+            SensLogOutputFile(i);
+        }
+    }
+
+    FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "-");
+    return;
+}
+// LCOV_EXCL_STOP
+
+/**
+ * @brief
+ *   Sensor log config file information acquisition
+ *
+ * @param[in]  uc_config_file  Config filename
+ * @param[out] st_sens_log_info Sensor log information
+ */
+static void SensLogGetConfig(const uint8_t* uc_config_file, SENSLOG_INFO* st_sens_log_info) {
+    FILE*   fp;
+    uint8_t uc_file_path[SENSLOG_FILEPATH_SIZE];
+    uint8_t uc_file_name[SENSLOG_FILEPATH_SIZE + SENSLOG_FILENAME_SIZE];
+    uint8_t ucBuf[SENSLOG_CONFIG_TEXT_SIZE];
+    uint8_t uc_val[SENSLOG_CONFIG_TEXT_SIZE];
+    uint8_t flag = 0;
+
+    FRAMEWORKUNIFIEDLOG(ZONE_28, __FUNCTION__, "+");
+
+    if ((uc_config_file == NULL) || (st_sens_log_info == NULL)) {  // LCOV_EXCL_BR_LINE 200: can not NULL
+        // LCOV_EXCL_START 8: invalid
+        AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
+        /* Unprocessed if the argument is invalid. */
+        FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Parameter Error.");
+        // LCOV_EXCL_STOP
+    } else {
+        memset(&uc_file_path, 0, sizeof(uc_file_path));
+        memset(&uc_file_name, 0, sizeof(uc_file_name));
+
+        /* Refer to the config files in the built-in memory. */
+        snprintf(reinterpret_cast<char*>(&uc_file_path[0]), sizeof(uc_file_path), \
+            SENSLOG_CONFIG_FILE_PATH_1);
+        snprintf(reinterpret_cast<char*>(&uc_file_name[0]), sizeof(uc_file_name), \
+            "%s%s", uc_file_path, uc_config_file);
+        fp = fopen(reinterpret_cast<char*>(&uc_file_name[0]), "r");
+        if (NULL == fp) {
+            /* If there are no config files in the built-in memory, refer to the USB memory. */
+            snprintf(reinterpret_cast<char*>(&uc_file_path[0]), sizeof(uc_file_path), \
+                "%s", (const char*)&g_mount_path[0]);
+            snprintf(reinterpret_cast<char*>(&uc_file_name[0]), sizeof(uc_file_name), \
+                "%s%s", uc_file_path, uc_config_file);
+            fp = fopen(reinterpret_cast<char*>(&uc_file_name[0]), "r");
+        }
+
+        if (NULL == fp) {
+            /* Do not print when there are no config files.(Console log output)*/
+            FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, \
+                "Not SensorLog config file. [%s]", uc_file_name);
+        } else {
+            /* Read config files */
+            for (;;) {
+                if (fgets(reinterpret_cast<char*>(&ucBuf), SENSLOG_CONFIG_TEXT_SIZE, fp) == NULL) {
+                    /* EOF detection(Fail-safe:Normally it does not pass because it is break at the flag judgment place.)*/
+                    break;
+                }
+                memset(&uc_val, 0, sizeof(uc_val));
+                if ((strncmp(reinterpret_cast<char*>(&ucBuf), SENSLOG_CONFIG_KEY_LEN, \
+                    strlen(SENSLOG_CONFIG_KEY_LEN)) == 0) && ((flag & 0x01) != 0x01)) {
+                    /* Get record length */
+                    SensLogGetConfigVal(ucBuf, uc_val);
+                    st_sens_log_info->st_gen.us_len = static_cast<uint16_t>(atoi((const char *)uc_val));
+                    flag ^= 0x01;
+                } else if ((strncmp(reinterpret_cast<char*>(&ucBuf), SENSLOG_CONFIG_KEY_GEN, \
+                    strlen(SENSLOG_CONFIG_KEY_GEN)) == 0) && ((flag & 0x02) != 0x02)) {
+                    /* Get number of generations */
+                    SensLogGetConfigVal(ucBuf, uc_val);
+                    st_sens_log_info->st_gen.uc_gen = static_cast<uint16_t>(atoi((const char *)uc_val));
+                    flag ^= 0x02;
+                } else {
+                    /* nop */
+                }
+
+                if (flag == 0x03) {
+                    break;
+                }
+            }
+            fclose(fp);
+
+            FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, \
+                "SensorLog read : file[%s] : config[0x%02x]", uc_file_name, flag);
+
+            if ((st_sens_log_info->st_gen.us_len < SENSLOG_LEN_MIN) \
+                || (st_sens_log_info->st_gen.us_len > SENSLOG_LEN_MAX)) {
+                /* The default value is applied if it is outside the valid range. */
+                st_sens_log_info->st_gen.us_len = SENSLOG_LEN_DEFAULT;
+            }
+            if ((st_sens_log_info->st_gen.uc_gen < SENSLOG_GEN_MIN) \
+                || (st_sens_log_info->st_gen.uc_gen > SENSLOG_GEN_MAX)) {
+                /* The default value is applied if it is outside the valid range. */
+                st_sens_log_info->st_gen.uc_gen = SENSLOG_GEN_DEFAULT;
+            }
+            st_sens_log_info->ul_text_buf_size = SENSLOG_BUF_MAX; /* Static area(Maximum security) */
+
+            st_sens_log_info->uc_valid_flag = SENSLOG_VALIDFLAG_ON;
+            st_sens_log_info->uc_output_flag = SENSLOG_OUTPUTFLAG_NEW;
+            /* The log output path should be the same path as the config file. */
+            memcpy(st_sens_log_info->uc_file_path, uc_file_path, SENSLOG_FILEPATH_SIZE);
+        }
+    }
+    FRAMEWORKUNIFIEDLOG(ZONE_28, __FUNCTION__, "-");
+
+    return;
+}
+
+/**
+ * @brief
+ *   Sensor log config file setting value acquisition
+ *
+ * @param[in]  uc_text  Config setting information
+ * @param[out] uc_val   Config setting
+ */
+static void SensLogGetConfigVal(uint8_t* uc_text, uint8_t* uc_val) {
+    uint8_t  ucBuf[SENSLOG_CONFIG_TEXT_SIZE];
+    uint16_t i = 0;
+    uint16_t j = 0;
+
+    FRAMEWORKUNIFIEDLOG(ZONE_28, __FUNCTION__, "+");
+
+    if ((uc_text == NULL) || (uc_val == NULL)) {  // LCOV_EXCL_BR_LINE 200: can not NULL
+        // LCOV_EXCL_START 8: invalid
+        AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
+        /* Unprocessed if the argument is invalid. */
+        FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "Parameter Error.");
+        // LCOV_EXCL_STOP
+    } else {
+        memset(ucBuf, 0, sizeof(ucBuf));
+        while ((*uc_text != ':') && (*uc_text != '\0')) {
+            uc_text++;
+            i++;
+            if (i >= (SENSLOG_CONFIG_TEXT_SIZE - 1)) {
+                break;
+            }
+        }
+        while ((*uc_text != '\r') && (*uc_text != '\n') && (*uc_text != '\0')) {
+            uc_text++;
+            i++;
+            ucBuf[j++] = *uc_text;
+            if (i >= SENSLOG_CONFIG_TEXT_SIZE) {  // LCOV_EXCL_BR_LINE 200: can not exceed size
+                // LCOV_EXCL_START 8: invalid
+                AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
+                memset(&ucBuf, 0, sizeof(ucBuf));
+                break;
+                // LCOV_EXCL_STOP
+            }
+        }
+        memcpy(uc_val, ucBuf, sizeof(ucBuf));
+    }
+    FRAMEWORKUNIFIEDLOG(ZONE_28, __FUNCTION__, "-");
+
+    return;
+}
+
+/**
+ * @brief
+ *   Acquisition of sensor log NAV-SVINFO file information
+ *
+ * @param[in] none
+ */
+static void SensLogCheckNAVSVINFOFile(void) {
+    FILE*   fp;
+    const uint8_t* uc_config_file;
+    uint8_t uc_file_path[SENSLOG_FILEPATH_SIZE];
+    uint8_t uc_file_name[SENSLOG_FILEPATH_SIZE + SENSLOG_FILENAME_SIZE];
+
+    FRAMEWORKUNIFIEDLOG(ZONE_28, __FUNCTION__, "+");
+
+    uc_config_file = (const uint8_t*)SENSLOG_NAV_SVINFO_FILE_NAME;
+
+    memset(&uc_file_path, 0, sizeof(uc_file_path));
+    memset(&uc_file_name, 0, sizeof(uc_file_name));
+
+    /* Refer to the config files in the built-in memory. */
+    snprintf(reinterpret_cast<char*>(&uc_file_path[0]), sizeof(uc_file_path), SENSLOG_CONFIG_FILE_PATH_1);
+    snprintf(reinterpret_cast<char*>(&uc_file_name[0]), sizeof(uc_file_name), "%s%s", uc_file_path, uc_config_file);
+    fp = fopen(reinterpret_cast<char*>(&uc_file_name[0]), "r");
+    if (NULL == fp) {
+        /* If there are no config files in the built-in memory, refer to the USB memory. */
+        snprintf(reinterpret_cast<char*>(&uc_file_path[0]), sizeof(uc_file_path), \
+            "%s", (const char*)&g_mount_path[0]);
+        snprintf(reinterpret_cast<char*>(&uc_file_name[0]), sizeof(uc_file_name), \
+            "%s%s", uc_file_path, uc_config_file);
+        fp = fopen(reinterpret_cast<char*>(&uc_file_name[0]), "r");
+    }
+
+    if (NULL == fp) {
+        /* Do not print when there are no config files.(Console log output)*/
+        FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, "Not SensorLog config file. [%s]", uc_file_name);
+        g_navsv_info_flag = FALSE;
+    } else {
+        fclose(fp);
+        FRAMEWORKUNIFIEDLOG(ZONE_INIT, __FUNCTION__, "SensorLog read : file[%s]", uc_file_name);
+        g_navsv_info_flag = TRUE;
+    }
+    FRAMEWORKUNIFIEDLOG(ZONE_28, __FUNCTION__, "-");
+
+    return;
+}
+
+/**
+ * @brief
+ *   Acquisition of sensor log NAV-SVINFO file information
+ *
+ * @param[in] none
+ *
+ * @return Destination sensor log file type
+ */
+uint8_t SensLogGetNavSvinfoFlag(void) {  // LCOV_EXCL_START 8: dead code.
+    AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
+    return g_navsv_info_flag;
+}
+// LCOV_EXCL_STOP
+/**
+ * @brief
+ *   Sensor log output(Input information)
+ *
+ *   Writes the specified log (input information) to the buffer area
+ *
+ * @param[in]  us_data_type   Data type
+ * @param[in]  ul_did        Data ID
+ * @param[in]  us_pno        Destination PNO
+ * @param[in]  p_data        Write data pointer
+ * @param[in]  us_size       Write data size
+ * @param[in]  uc_result     Reception result
+ * @param[in]  u_write_flag   ability to write sensor log
+ * @param[in]  u_write_abnormal_flag   When an error occurs ability to write sensor log
+ */
+void SensLogWriteInputData(uint16_t us_data_type, DID ul_did, PNO us_pno, uint8_t *p_data, \
+        uint16_t us_size, uint8_t uc_result, uint8_t u_write_flag, uint8_t u_write_abnormal_flag) {
+    uint16_t                file_type = 0;
+    uint16_t                data_type = us_data_type;
+    uint16_t                write_type = POS_SENSLOG_TYPE_NONE;
+    RET_API                 lret_sem = RET_ERROR;
+
+    /* Sensor log file type determination */
+    file_type = SensLogGetFileType(kSensLogInputTbl, &data_type, &write_type, ul_did);
+
+    /* For the target type,Perform exclusive control */
+    /* Currently, only GPS input can be written from multiple threads. */
+    if (file_type == SENSLOG_TYPE_GPS_INPUT) {
+        /* Semaphore ID determination */
+        if (g_sem_id != 0) {  // LCOV_EXCL_BR_LINE 200: can not zero
+            lret_sem = _pb_SemLock(g_sem_id); /* Semaphore Lock */
+            if (lret_sem != RET_NORMAL) {  // LCOV_EXCL_BR_LINE 200: can not return error
+                // LCOV_EXCL_START 8: invalid
+                AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
+                FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "SemLock Error.");
+                // LCOV_EXCL_STOP
+            } else {
+                /* Sensor log output */
+                SensLogWrite(file_type, data_type, write_type, ul_did, us_pno, p_data, \
+                    us_size, uc_result, u_write_flag, u_write_abnormal_flag);
+                (void)_pb_SemUnlock(g_sem_id); /* Semaphore unlock */
+            }
+        }
+    } else {
+        /* Sensor log output */
+        SensLogWrite(file_type, data_type, write_type, ul_did, us_pno, p_data, us_size, \
+            uc_result, u_write_flag, u_write_abnormal_flag);
+    }
+
+    return;
+}
+
+/**
+ * @brief
+ *   Sensor log output(Outputs the information)
+ *
+ *   Writes the specified log (output information) to the buffer area
+ *
+ * @param[in]  us_data_type   Data type
+ * @param[in]  ul_did        Data ID
+ * @param[in]  us_pno        Destination PNO
+ * @param[in]  p_data        Write data pointer
+ * @param[in]  us_size       Write data size
+ * @param[in]  uc_result     Reception result
+ */
+void SensLogWriteOutputData(uint16_t us_data_type, DID ul_did, PNO us_pno, uint8_t *p_data, \
+        uint16_t us_size, uint8_t uc_result) {
+    uint16_t                file_type = 0;
+    uint16_t                data_type = us_data_type;
+    uint16_t                write_type = POS_SENSLOG_TYPE_NONE;
+    RET_API                 lret_sem = RET_ERROR;
+
+    /* Sensor log file type determination */
+    file_type = SensLogGetFileType(kSensLogOutputTbl, &data_type, &write_type, ul_did);
+
+    /* For the target type,Perform exclusive control */
+    /* Currently, only GPS output can be written from multiple threads. */
+    if (file_type == SENSLOG_TYPE_GPS_OUTPUT) {
+        /* Semaphore ID determination */
+        if (g_sem_id != 0) {  // LCOV_EXCL_BR_LINE 200: can not zero
+            lret_sem = _pb_SemLock(g_sem_id);  /* Semaphore Lock */
+            if (lret_sem != RET_NORMAL) {  // LCOV_EXCL_BR_LINE 200: can not return error
+                // LCOV_EXCL_START 8: invalid
+                AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
+                FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "SemLock Error.");
+                // LCOV_EXCL_STOP
+            } else {
+                /* Sensor log output */
+                SensLogWrite(file_type, data_type, write_type, ul_did, us_pno, p_data, \
+                    us_size, uc_result, SENSLOG_ON, SENSLOG_OFF);
+                (void)_pb_SemUnlock(g_sem_id);  /* Semaphore unlock */
+            }
+        }
+    } else {
+        /* Sensor log output */
+        SensLogWrite(file_type, data_type, write_type, ul_did, us_pno, p_data, us_size, \
+            uc_result, SENSLOG_ON, SENSLOG_OFF);
+    }
+    return;
+}
+
+/**
+ * @brief
+ *   Convert number to ASCII code(For two digits,Fill up to zero)
+ *
+ * @param[out] buf   Data saving
+ * @param[in]  num   Numbers to be converted
+ */
+static void Num2String2Digit(uint8_t* buf, uint32_t num) {
+    int8_t c;
+    if (num >= 100) {  // LCOV_EXCL_BR_LINE 200: can not exceed  size
+        // LCOV_EXCL_START 8: invalid
+        AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
+        *buf++ = '0';
+        *buf = '0';
+        // LCOV_EXCL_STOP
+    } else {
+        c = static_cast<int8_t>(num / 10);
+        *buf++ = static_cast<uint8_t>(c + '0');
+        *buf = static_cast<uint8_t>(num - (c * 10) + '0');
+    }
+}
+
+/**
+ * @brief
+ *   Convert number to ASCII code(For 3 digits,Fill up to zero)
+ *
+ * @param[out] buf   Data saving
+ * @param[in]  num   Numbers to be converted
+ */
+static void Num2String3Digit(uint8_t* buf, uint32_t num) {
+    int8_t c;
+    if (num >= 1000) {  // LCOV_EXCL_BR_LINE 200: can not exceed  size
+        // LCOV_EXCL_START 8: invalid
+        AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
+        *buf++ = '0';
+        *buf++ = '0';
+        *buf = '0';
+        // LCOV_EXCL_STOP
+    } else {
+        c = static_cast<int8_t>(num / 100);
+        *buf++ = static_cast<uint8_t>(c + '0');
+        num = num - (c * 100);
+        c = static_cast<int8_t>(num / 10);
+        *buf++ = static_cast<uint8_t>(c + '0');
+        *buf = static_cast<uint8_t>(num - (c * 10) + '0');
+    }
+}
+
+/**
+ * @brief
+ *   Convert number to ASCII code(For 4 digits,Fill up to zero)
+ *
+ * @param[out] buf   Data saving
+ * @param[in]  num   Numbers to be converted
+ */
+static void Num2String4Digit(uint8_t* buf, uint32_t num) {
+    int8_t c;
+    if (num >= 10000) {  // LCOV_EXCL_BR_LINE 200: can not exceed  size
+        // LCOV_EXCL_START 8: invalid
+        AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
+        *buf++ = '0';
+        *buf++ = '0';
+        *buf++ = '0';
+        *buf = '0';
+        // LCOV_EXCL_STOP
+    } else {
+        c = static_cast<int8_t>(num / 1000);
+        *buf++ = static_cast<uint8_t>(c + '0');
+        num = num - (c * 1000);
+        c = static_cast<int8_t>(num / 100);
+        *buf++ = static_cast<uint8_t>(c + '0');
+        num = num - (c * 100);
+        c = static_cast<int8_t>(num / 10);
+        *buf++ = static_cast<uint8_t>(c + '0');
+        *buf = static_cast<uint8_t>(num - (c * 10) + '0');
+    }
+}
+
+/**
+ * @brief
+ *   Convert digits to hexadecimal ASCII code(Fill up to zero)
+ *
+ * @param[out] buf    Data saving
+ * @param[in]  Number of digits to be converted to digits
+ * @param[in]  num    Numbers to be converted
+ */
+static void Num2HexString(uint8_t* buf, uint8_t digits, uint32_t num) {
+    uint8_t* p = buf + digits;
+    uint8_t calc;
+    int32_t i;
+
+    /* Only within the displayable range,Convert  */
+    if ((digits == 8) || (num <  (uint32_t)(1 << (4 *digits)))) {
+        while (num) {
+            calc = num % 16;
+            if (10 > calc) {
+                calc = static_cast<uint8_t>(calc + 0x30);  // 0x30 is 0 character
+            } else {
+                calc = static_cast<uint8_t>(calc + (0x61 - 0x0A));  // 0x41 is the letter of a
+            }
+            *(--p) = calc;
+            num /= 16;
+            digits--;
+        }
+    }
+
+    /* Insert 0 in the remaining significant digits.  */
+    for (i = 0; i < digits; i++) {
+        *(--p) = '0';
+    }
+}
+
+/**
+ * @brief
+ *   Sensor Log Header Creation
+ *
+ * @param[out] buf        Data saving
+ * @param[in]  DataHeader data headers
+ * @note For buf, Up to 62 bytes are used. As 64 bytes are allocated in the upper digit, Without current problems, dataHeader.c_pname size increase,
+ *  Need to be reviewed when changing the format.
+ */
+static void SensLogmakeHeader(uint8_t* buf, SENSLOG_DATA_HEADER dataHeader) {
+    /* "%02d %04d/%02d/%02d %02d:%02d:%02d.%03d %08x %s %01x %01x %04d " */
+    int8_t *p;
+    uint16_t i = 0;
+    Num2String2Digit(buf, dataHeader.us_data_type);
+    buf += 2;
+    *(buf++) = ' ';
+    Num2String4Digit(buf, dataHeader.st_sys_time.us_year);
+    buf += 4;
+    *(buf++) = '/';
+    Num2String2Digit(buf, dataHeader.st_sys_time.us_month);
+    buf += 2;
+    *(buf++) = '/';
+    Num2String2Digit(buf, dataHeader.st_sys_time.us_day);
+    buf += 2;
+    *(buf++) = ' ';
+    Num2String2Digit(buf, dataHeader.st_sys_time.us_hour);
+    buf += 2;
+    *(buf++) = ':';
+    Num2String2Digit(buf, dataHeader.st_sys_time.us_minute);
+    buf += 2;
+    *(buf++) = ':';
+    Num2String2Digit(buf, dataHeader.st_sys_time.us_second);
+    buf += 2;
+    *(buf++) = '.';
+    Num2String3Digit(buf, dataHeader.st_sys_time.us_milli_seconds);
+    buf += 3;
+    *(buf++) = ' ';
+    Num2HexString(buf, 8, dataHeader.ul_did);
+    buf += 8;
+    *(buf++) = ' ';
+    p = dataHeader.c_pname;
+    for (i = 0; i < sizeof(dataHeader.c_pname); i++) {
+        if (*p == 0) {
+            break;
+        }
+        *(buf++) = *(p++);
+    }
+    *(buf++) = ' ';
+    Num2HexString((buf++), 1, dataHeader.uc_unit_type);
+    *(buf++) = ' ';
+    Num2HexString((buf++), 1, dataHeader.uc_result);
+    *(buf++) = ' ';
+    Num2String4Digit(buf, dataHeader.us_data_size);
+    buf += 4;
+    *(buf++) = ' ';
+
+    return;
+}
+
+/**
+ * @brief
+ *   Sensor log output
+ *
+ *   Write specified log to buffer area(Common process)
+ *
+ * @param[in]  us_file_type   File type
+ * @param[in]  us_data_type   Data type
+ * @param[in]  us_write_type  FRAMEWORKUNIFIEDLOG Output Type
+ * @param[in]  ul_did        Data ID
+ * @param[in]  us_pno        Destination PNO
+ * @param[in]  p_data        Write data pointer
+ * @param[in]  us_size       Write data size
+ * @param[in]  uc_result     Reception result
+ * @param[in]  uWriteFlag   ability to write sensor log
+ * @param[in]  u_write_abnormal_flag   When an error occursability to write sensor log
+ */
+static void SensLogWrite(uint16_t us_file_type, uint16_t us_data_type, uint16_t us_write_type, \
+        DID ul_did, PNO us_pno, uint8_t *p_data, uint16_t us_size, uint8_t uc_result, uint8_t uWriteFlag, \
+        uint8_t u_write_abnormal_flag) {
+    uint32_t                len = 0;
+    SENSLOG_DATA_HEADER     dataHeader;
+    uint16_t                headSize = sizeof(SENSLOG_DATA_HEADER);
+    uint16_t                i = 0;
+    uint8_t                 workBuf[64];
+    uint16_t                workBufLen = 0;
+    PCSTR                   pPname = NULL;
+    uint32_t                ulTempBufLen;
+    uint32_t                ulPositioninglogBufLen = SENSLOG_BUF_MAX;
+    uint32_t                retComp;
+
+    if ((p_data == NULL) || (us_size == 0) || (us_size > SENSLOG_BUF_MIN)) {  // LCOV_EXCL_BR_LINE 200: can not NULL
+        /* Unprocessed if write specified log data is invalid */
+        FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, 
+                                          "Parameter Error. File[%d] Data[%d] DID[%d] Size[%d]",
+                                          us_file_type, us_data_type, ul_did, us_size);
+    } else {
+        /* Sensor log file type determination */
+        if (us_file_type < SENSLOG_TYPE_COUNT) {
+            if ((g_sens_log_info[us_file_type].uc_valid_flag == SENSLOG_VALIDFLAG_ON) ||
+                (us_write_type != POS_SENSLOG_TYPE_NONE)) {
+                /* Setting of header information */
+                memset(&dataHeader, 0x00, sizeof(dataHeader));
+                dataHeader.us_data_type = us_data_type;
+                SensLogGetSystemTime(&dataHeader.st_sys_time);
+                dataHeader.ul_did = ul_did;
+                pPname = _pb_CnvPno2Name(us_pno);
+                if (pPname == NULL) {
+                    dataHeader.c_pname[0] = '-';
+                } else {
+                    snprintf(reinterpret_cast<char *>(&(dataHeader.c_pname[0])), \
+                        sizeof(dataHeader.c_pname), "%s", pPname);
+                }
+                dataHeader.uc_unit_type = (uint8_t)g_unit_type;
+                dataHeader.uc_result = uc_result;
+                dataHeader.us_data_size = us_size;
+
+                /* Buffer storage(Header)*/
+                memset(&workBuf[0], 0x00, sizeof(workBuf));
+                SensLogmakeHeader(workBuf, dataHeader);
+                workBufLen = static_cast<uint16_t>(strlen(reinterpret_cast<char *>(&(workBuf[0]))));
+                memcpy(reinterpret_cast<char *>(&(g_sens_log_info[us_file_type].uc_temp_buf[0])), \
+                    &workBuf[0], workBufLen);
+
+                /* Buffer storage(Data portion)*/
+                for (i = 0; i < us_size; i++) {
+                    Num2HexString(&(g_sens_log_info[us_file_type].uc_temp_buf[workBufLen + i * 3]), 2, *p_data);
+                    g_sens_log_info[us_file_type].uc_temp_buf[workBufLen + i * 3 + 2] = ' ';
+                    g_sens_log_info[us_file_type].uc_temp_buf[workBufLen + i * 3 + 3] = 0; /* NULL */
+                    p_data++;
+                }
+                g_sens_log_info[us_file_type].uc_temp_buf[workBufLen + (us_size * 3)]     = '\r';
+                g_sens_log_info[us_file_type].uc_temp_buf[workBufLen + (us_size * 3) + 1] = '\n';
+                ulTempBufLen = workBufLen + (us_size * 3) + 2;
+
+                /* FRAMEWORKUNIFIEDLOG out */
+                if ((us_file_type == SENSLOG_TYPE_NAVI_INPUT) || (us_file_type == SENSLOG_TYPE_NAVI_OUTPUT)) {
+                    if (g_unit_type != UNIT_TYPE_GRADE1) {
+                        /* Sensor log is not output when an error occurs except for _CWORD80_ in NAV. */
+                        u_write_abnormal_flag = 0;
+                    }
+                }
+                if ((us_write_type != POS_SENSLOG_TYPE_NONE) && (u_write_abnormal_flag == SENSLOG_ON)) {
+                    /* Data compression */
+                    retComp = compress2(reinterpret_cast<Bytef*>(&(g_sens_log_info[us_file_type]. \
+                                        uc_positioninglog_buf[SENSLOG_SEQ_SIZE + sizeof(ulPositioninglogBufLen)])), \
+                                        reinterpret_cast<uLongf*>(&ulPositioninglogBufLen), \
+                                        reinterpret_cast<Bytef*>(&(g_sens_log_info[us_file_type].uc_temp_buf[0])), \
+                                        ulTempBufLen, Z_DEFAULT_COMPRESSION);
+
+                    if (retComp == Z_OK) {
+                        memcpy(&(g_sens_log_info[us_file_type].uc_positioninglog_buf[0]), \
+                                SENSLOG_SEQ_START, SENSLOG_SEQ_SIZE);
+                        memcpy(&(g_sens_log_info[us_file_type].uc_positioninglog_buf[SENSLOG_SEQ_SIZE]), \
+                            &ulPositioninglogBufLen, sizeof(ulPositioninglogBufLen));
+                        memcpy(&(g_sens_log_info[us_file_type].uc_positioninglog_buf[SENSLOG_SEQ_SIZE \
+                            + sizeof(ulPositioninglogBufLen) + ulPositioninglogBufLen]), SENSLOG_SEQ_END, SENSLOG_SEQ_SIZE);
+                        g_sens_log_info[us_file_type].uc_positioninglog_buf[SENSLOG_SEQ_SIZE + sizeof(ulPositioninglogBufLen) \
+                            + ulPositioninglogBufLen + SENSLOG_SEQ_SIZE] = '\n';
+                        ulPositioninglogBufLen = static_cast<uint32_t>(SENSLOG_SEQ_SIZE + sizeof(ulPositioninglogBufLen) \
+                            + ulPositioninglogBufLen + SENSLOG_SEQ_SIZE + 1);
+                        POS_SENSLOG(us_write_type, (PCSTR)&(g_sens_log_info[us_file_type].uc_positioninglog_buf[0]), \
+                            ulPositioninglogBufLen);
+                    } else {
+                        FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, \
+                            "compress error[retComp = %d]", retComp);
+                    }
+                }
+
+                if ((g_sens_log_info[us_file_type].uc_valid_flag == SENSLOG_VALIDFLAG_ON) \
+                        && (uWriteFlag == SENSLOG_ON)) {
+                    /* For executing file output */
+                    /* Buffer size determination */
+                    len = g_sens_log_info[us_file_type].ul_text_buf_len;
+                    if (g_sens_log_info[us_file_type].ul_text_buf_size <= (len + ((headSize + us_size) * 3))) {
+                        FRAMEWORKUNIFIEDLOG(ZONE_WARN, __FUNCTION__, "[%d]:DataSize[%d]/BufLen[%d]",
+                                                          us_data_type, us_size, len);
+
+                        /* In case of buffer upper limit,Write File */
+                        SensLogOutputFile(static_cast<uint8_t>(us_file_type));
+
+                        /* Buffer clear */
+                        memset(&(g_sens_log_info[us_file_type].uc_text_buf[0]), 0x00,
+                            g_sens_log_info[us_file_type].ul_text_buf_size);
+                        len = 0;
+                    }
+
+                    /* Buffer storage */
+                    memcpy(reinterpret_cast<char*>(&(g_sens_log_info[us_file_type].uc_text_buf[len])), \
+                        &g_sens_log_info[us_file_type].uc_temp_buf[0], ulTempBufLen);
+                    g_sens_log_info[us_file_type].ul_text_buf_len = len + ulTempBufLen;
+                    g_sens_log_info[us_file_type].us_rec_count++;
+
+                    /* Determining whether the number of file write records is the upper limit (the number of records per file) */
+                    if (g_sens_log_info[us_file_type].st_gen.us_len <= g_sens_log_info[us_file_type].us_rec_count) {
+                        FRAMEWORKUNIFIEDLOG(ZONE_28, __FUNCTION__, "[%d]:RecCnt[%d/%d]",
+                            us_data_type, g_sens_log_info[us_file_type].us_rec_count, \
+                            g_sens_log_info[us_file_type].st_gen.us_len);
+
+                        /* In case of buffer upper limit,Write File */
+                        SensLogOutputFile(static_cast<uint8_t>(us_file_type));
+
+                        /* Buffer clear */
+                        memset(&(g_sens_log_info[us_file_type].uc_text_buf[0]), 0x00, \
+                            g_sens_log_info[us_file_type].ul_text_buf_size);
+                        g_sens_log_info[us_file_type].ul_text_buf_len = 0;
+                        g_sens_log_info[us_file_type].us_rec_count = 0;
+                        /* Update the number of generations */
+                        g_sens_log_info[us_file_type].us_gen_count++;
+                        if (g_sens_log_info[us_file_type].st_gen.uc_gen < g_sens_log_info[us_file_type].us_gen_count) {
+                            g_sens_log_info[us_file_type].us_gen_count = 1;
+                        }
+                        g_sens_log_info[us_file_type].uc_output_flag = SENSLOG_OUTPUTFLAG_NEW;
+                    }
+                }
+            }
+        }
+    }
+
+    return;
+}
+
+/**
+ * @brief
+ *   Sensor log file type determination
+ *
+ *   Determine the type of the output destination sensor log file
+ *
+ * @param[in]   pstTbl       Sensor log type definition table
+ * @param[in]   Pus_data_type Data type
+ * @param[out]  pus_write_type FRAMEWORKUNIFIEDLOG Output Type
+ * @param[in]   ul_did        Data ID
+ *
+ * @return Destination sensor log file type
+ */
+static uint16_t SensLogGetFileType(const SENSLOG_ID_TBL *pstTbl, uint16_t *pus_data_type, \
+        uint16_t *pus_write_type, DID ul_did) {
+    uint16_t        file_type = SENSLOG_TYPE_COUNT;
+    uint16_t        cnt = 0;
+
+    /* Determination of output log file type */
+    /* DID,Prioritize the beginning of the table for both data types. */
+    /* If DID is specified, it is judged by DID.*/
+    if (ul_did != 0) {
+        for (cnt = 0; pstTbl[cnt].us_file_type != SENSLOG_TYPE_COUNT; cnt++) {
+            if (pstTbl[cnt].ul_did == ul_did) {
+                *pus_data_type = pstTbl[cnt].us_data_type;
+                file_type = pstTbl[cnt].us_file_type;
+                *pus_write_type = pstTbl[cnt].us_write_type;
+                break;
+            }
+        }
+    }
+    /* If no DID is specified or cannot be found, judge according to the data type. */
+    if (file_type == SENSLOG_TYPE_COUNT) {
+        for (cnt = 0; pstTbl[cnt].us_file_type != SENSLOG_TYPE_COUNT; cnt++) {
+            if (pstTbl[cnt].us_data_type == *pus_data_type) {
+                file_type = pstTbl[cnt].us_file_type;
+                *pus_write_type = pstTbl[cnt].us_write_type;
+                break;
+            }
+        }
+    }
+    return file_type;
+}
+
+/**
+ * @brief
+ *   Sensor log file output
+ *
+ *   Write the log data in the buffer area to a file
+ *
+ * @param[in]  ucFileType   File type
+ */
+static void SensLogOutputFile(uint8_t ucFileType) {
+    FILE    *fp;
+    int     fd;
+    uint8_t  uc_file_name_base[SENSLOG_FILEPATH_SIZE + SENSLOG_FILENAME_SIZE];
+    uint8_t  uc_file_name[SENSLOG_FILEPATH_SIZE + SENSLOG_FILENAME_SIZE];
+
+    if (ucFileType < SENSLOG_TYPE_COUNT) {  // LCOV_EXCL_BR_LINE 200: can not exceed  type
+        /* File path generation */
+        snprintf(reinterpret_cast<char*>(&uc_file_name_base[0]), sizeof(uc_file_name_base),
+                  "%s%s",
+                  g_sens_log_info[ucFileType].uc_file_path, g_sens_log_info[ucFileType].uc_file_name);
+        snprintf(reinterpret_cast<char*>(&uc_file_name[0]), sizeof(uc_file_name),
+                  reinterpret_cast<char*>(&uc_file_name_base[0]),
+                  g_sens_log_info[ucFileType].us_gen_count);
+
+        /* Writing to a File */
+        if (g_sens_log_info[ucFileType].uc_output_flag == SENSLOG_OUTPUTFLAG_NEW) {
+            FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, \
+                "SensLog create file. : file[%s] : uc_output_flag[%d]", \
+                uc_file_name, g_sens_log_info[ucFileType].uc_output_flag);
+
+            /* Export New File(Write From Beginning)*/
+            fp = fopen(reinterpret_cast<char*>(&uc_file_name[0]), "w+");
+            g_sens_log_info[ucFileType].uc_output_flag = SENSLOG_OUTPUTFLAG_ADD;
+
+            /* Update generation information file */
+            SensLogOutputGenFile(ucFileType);
+        } else {
+            /* Append export */
+            fp = fopen(reinterpret_cast<char*>(&uc_file_name[0]), "a+");
+        }
+
+        if (NULL != fp) {  // LCOV_EXCL_BR_LINE 200: can not NULL
+            /* Log file output(ASCII)*/
+            fd = fileno(fp);
+            fwrite(&(g_sens_log_info[ucFileType].uc_text_buf[0]), g_sens_log_info[ucFileType].ul_text_buf_len, 1, fp);
+            fflush(fp);    /* Flush the userspace buffers provided by the C library  */
+            fdatasync(fd); /* Flush cache of files referenced by fd to disk */
+            fclose(fp); /* Coverity CID:23371 compliant */
+        } else {
+            // LCOV_EXCL_START 8: invalid
+            AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
+            FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, \
+                "SensLog fopen fail. : file[%s] : uc_output_flag[%d]", \
+                uc_file_name, g_sens_log_info[ucFileType].uc_output_flag);
+            // LCOV_EXCL_STOP
+        }
+    }
+    return;
+}
+
+/**
+ * @brief
+ *   Generation information file output
+ *
+ *   Holds the number of generations being output in the generation information file.
+ *
+ * @param[in]  ucFileType   File type
+ */
+static void SensLogOutputGenFile(uint8_t ucFileType) {
+    FILE     *fp;
+    int      fd;
+    uint8_t  uc_file_name_base[SENSLOG_FILEPATH_SIZE + SENSLOG_FILENAME_SIZE];
+    uint8_t  uc_file_name[SENSLOG_FILEPATH_SIZE + SENSLOG_FILENAME_SIZE];
+
+    if (ucFileType < SENSLOG_TYPE_COUNT) {  // LCOV_EXCL_BR_LINE 200: can not exceed  type
+        /* File path generation */
+        snprintf(reinterpret_cast<char*>(&uc_file_name_base[0]), sizeof(uc_file_name_base),
+                  "%s%s",
+                  g_sens_log_info[ucFileType].uc_file_path, g_sens_log_info[ucFileType].uc_gen_fname);
+        snprintf(reinterpret_cast<char*>(&uc_file_name[0]), sizeof(uc_file_name),
+                  reinterpret_cast<char*>(&uc_file_name_base[0]),
+                  g_sens_log_info[ucFileType].us_gen_count);
+
+        FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__, "SensLog create file. : file[%s] : us_gen_count[%d]",
+                      uc_file_name, g_sens_log_info[ucFileType].us_gen_count);
+
+        /* Export New File(Write From Beginning)*/
+        fp = fopen(reinterpret_cast<char*>(&uc_file_name[0]), "w+");
+        if (NULL != fp) {  // LCOV_EXCL_BR_LINE 200: can not NULL
+            /* Generation control number output */
+            fd = fileno(fp);
+            fprintf(fp, "%03d", g_sens_log_info[ucFileType].us_gen_count);
+            fflush(fp);    /* Flush the userspace buffers provided by the C library  */
+            fdatasync(fd); /* Flush cache of files referenced by fd to disk */
+            fclose(fp); /* Coverity CID:23372 compliant */
+        } else {
+            // LCOV_EXCL_START 8: invalid
+            AGL_ASSERT_NOT_TESTED();  // LCOV_EXCL_LINE 200: test assert
+            FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__, \
+                "SensLog fopen fail. : file[%s] : us_gen_count[%d]", \
+                uc_file_name, g_sens_log_info[ucFileType].us_gen_count);
+            // LCOV_EXCL_STOP
+        }
+    }
+    return;
+}
+
+/**
+ * @brief
+ *   Get system time
+ *
+ *   Get the system time(Millisecond)
+ *
+ * @param[out] st_sys_time    System time
+ */
+void SensLogGetSystemTime(SENSLOG_SYSTEMTIME *st_sys_time) {
+    time_t time_sec = 0;
+    struct timespec tp = {0};
+    struct tm time_cal= {0};
+
+    if (NULL != st_sys_time) {  // LCOV_EXCL_BR_LINE 200: not NULL
+        if (0 == clock_gettime(CLOCK_REALTIME, &tp)) {
+            time_sec = tp.tv_sec;
+            localtime_r(&time_sec, &time_cal);
+            st_sys_time->us_year = static_cast<uint16_t>((WORD)time_cal.tm_year + 1900);
+            st_sys_time->us_month = static_cast<uint16_t>((WORD)time_cal.tm_mon + 1);
+            st_sys_time->us_day_of_week    = (WORD)time_cal.tm_wday;
+            st_sys_time->us_day          = (WORD)time_cal.tm_mday;
+            st_sys_time->us_hour         = (WORD)time_cal.tm_hour;
+            st_sys_time->us_minute       = (WORD)time_cal.tm_min;
+            st_sys_time->us_second       = (WORD)time_cal.tm_sec;
+            st_sys_time->us_milli_seconds = (WORD)(static_cast<double>(tp.tv_nsec) * 1e-6); /* Calculating milliseconds */
+        }
+    }
+    return;
+}
+
+/* end of file */