[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/navigation/sensor/2.0/core/HfManager.cpp b/src/navigation/sensor/2.0/core/HfManager.cpp
new file mode 100644
index 0000000..3e3591a
--- /dev/null
+++ b/src/navigation/sensor/2.0/core/HfManager.cpp
@@ -0,0 +1,667 @@
+/*
+* Copyright Statement:
+*
+* This software/firmware and related documentation ("MediaTek Software") are
+* protected under relevant copyright laws. The information contained herein is
+* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+* the prior written permission of MediaTek inc. and/or its licensors, any
+* reproduction, modification, use or disclosure of MediaTek Software, and
+* information contained herein, in whole or in part, shall be strictly
+* prohibited.
+*
+* MediaTek Inc. (C) 2017. All rights reserved.
+*
+* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*/
+
+#undef LOG_TAG
+#define LOG_TAG "HfManager"
+
+#include <stdio.h>
+#include <stdint.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <poll.h>
+#include <fcntl.h>
+#include <inttypes.h>
+
+#include <mutex>
+
+#include <log/log.h>
+
+#include "HfManager.h"
+
+#define HF_MANAGER_NODE_PATH "/dev/hf_manager"
+
+HfManager::HfManager() {
+    bool status = false;
+
+    sensorState.reset();
+    sensorRegister.reset();
+
+    memset(mDelayNs, 0, sizeof(mDelayNs));
+    memset(mLatencyNs, 0, sizeof(mLatencyNs));
+
+    mFd = TEMP_FAILURE_RETRY(open(HF_MANAGER_NODE_PATH, O_RDWR));
+    if (mFd < 0) {
+        ALOGE("open device failed err=%d errno=%d\n", mFd, errno);
+        return;
+    }
+
+    for (int sensor = 0; sensor < SENSOR_TYPE_SENSOR_MAX; ++sensor) {
+        status = checkRegisterStatus(sensor);
+        sensorRegister.set(sensor, status);
+    }
+
+    disableAllSensor();
+}
+
+HfManager::~HfManager() {
+    for (size_t sensor = 0; sensor < sensorState.size(); ++sensor) {
+        if (sensorState.test(sensor))
+            disableSensor(sensor);
+    }
+    close(mFd);
+}
+
+int HfManager::getFd(void) {
+    return mFd;
+}
+
+int HfManager::initCheck() const {
+    return mFd < 0 ? -ENODEV : 0;
+}
+
+int HfManager::findSensor(int sensor) {
+    if (sensor >= SENSOR_TYPE_SENSOR_MAX)
+        return -1;
+    int status = sensorRegister.test(sensor);
+    return !status ? -1 : sensor;
+}
+
+int HfManager::activateSensor(int sensor, int enabled) {
+    if (findSensor(sensor) < 0)
+        return -1;
+    if (enabled) {
+        return enableSensor(sensor, mDelayNs[sensor], mLatencyNs[sensor]);
+    } else {
+        return disableSensor(sensor);
+    }
+    return 0;
+}
+
+int HfManager::batchSensor(int sensor, int64_t delayNs, int64_t latencyNs) {
+    if (findSensor(sensor) < 0)
+        return -1;
+    if (sensorState.test(sensor)) {
+        return enableSensor(sensor, delayNs, latencyNs);
+    } else {
+        mDelayNs[sensor] = delayNs;
+        mLatencyNs[sensor] = latencyNs;
+    }
+    return 0;
+}
+
+int HfManager::flushSensor(int sensor) {
+    hf_manager_cmd cmd;
+
+    if (initCheck() < 0)
+        return -1;
+
+    memset(&cmd, 0, sizeof(hf_manager_cmd));
+    cmd.action = HF_MANAGER_SENSOR_FLUSH;
+    cmd.sensor_type = sensor;
+    return TEMP_FAILURE_RETRY(write(mFd, &cmd, sizeof(hf_manager_cmd)));
+}
+
+int HfManager::enableSensor(int sensor, int64_t delayNs) {
+    return enableDisable(sensor, HF_MANAGER_SENSOR_ENABLE, delayNs, 0);
+}
+
+int HfManager::enableSensor(int sensor, int64_t delayNs, int64_t latencyNs) {
+    return enableDisable(sensor, HF_MANAGER_SENSOR_ENABLE, delayNs, latencyNs);
+}
+
+int HfManager::disableSensor(int sensor) {
+    return enableDisable(sensor, HF_MANAGER_SENSOR_DISABLE, 0, 0);
+}
+
+int HfManager::enableDisable(int sensor, int enable,
+        int64_t delayNs, int64_t latencyNs) {
+    hf_manager_cmd cmd;
+
+    if (initCheck() < 0)
+        return -1;
+
+    if (enable == HF_MANAGER_SENSOR_ENABLE)
+        sensorState.set(sensor, 1);
+    else if (enable == HF_MANAGER_SENSOR_DISABLE)
+        sensorState.set(sensor, 0);
+
+    memset(&cmd, 0, sizeof(hf_manager_cmd));
+    cmd.action = enable;
+    cmd.sensor_type = sensor;
+    cmd.delay = delayNs;
+    cmd.latency = latencyNs;
+    return TEMP_FAILURE_RETRY(write(mFd, &cmd, sizeof(hf_manager_cmd)));
+}
+
+void HfManager::disableAllSensor(void) {
+    for (int sensor = 0; sensor < SENSOR_TYPE_SENSOR_MAX; ++sensor) {
+        if (sensorRegister.test(sensor))
+            disableSensor(sensor);
+    }
+}
+
+bool HfManager::checkRegisterStatus(int sensor) {
+    int err = -1;
+    ioctl_packet packet;
+
+    if ((err = initCheck()) < 0)
+        return false;
+
+    memset(&packet, 0, sizeof(ioctl_packet));
+    packet.sensor_type = sensor;
+
+    err = TEMP_FAILURE_RETRY(ioctl(mFd,
+            HF_MANAGER_REQUEST_REGISTER_STATUS, &packet));
+    if (err < 0) {
+        ALOGE("get sensor register failed err=%d errno=%d\n", err, errno);
+        return false;
+    }
+    return packet.status ? true : false;
+}
+
+int HfManager::enableFactoryCalibration(int sensor) {
+    hf_manager_cmd cmd;
+
+    if (initCheck() < 0)
+        return -1;
+
+    memset(&cmd, 0, sizeof(hf_manager_cmd));
+    cmd.action = HF_MANAGER_SENSOR_ENABLE_CALI;
+    cmd.sensor_type = sensor;
+    return TEMP_FAILURE_RETRY(write(mFd, &cmd, sizeof(hf_manager_cmd)));
+}
+
+int HfManager::configCalibration(int sensor, void *data, size_t length) {
+    hf_manager_cmd cmd;
+    size_t dst_length = 0;
+
+    if (initCheck() < 0)
+        return -1;
+
+    memset(&cmd, 0, sizeof(hf_manager_cmd));
+    cmd.action = HF_MANAGER_SENSOR_CONFIG_CALI;
+    cmd.sensor_type = sensor;
+    dst_length = sizeof(cmd.data);
+    dst_length = (dst_length < length) ? dst_length : length;
+    memcpy(cmd.data, data, dst_length);
+    return TEMP_FAILURE_RETRY(write(mFd, &cmd, sizeof(hf_manager_cmd)));
+}
+
+int HfManager::enableSelfTest(int sensor) {
+    hf_manager_cmd cmd;
+
+    if (initCheck() < 0)
+        return -1;
+
+    memset(&cmd, 0, sizeof(hf_manager_cmd));
+    cmd.action = HF_MANAGER_SENSOR_SELFTEST;
+    cmd.sensor_type = sensor;
+    return TEMP_FAILURE_RETRY(write(mFd, &cmd, sizeof(hf_manager_cmd)));
+}
+
+int HfManager::enableDisableRawData(int sensor, int en) {
+    hf_manager_cmd cmd;
+
+    if (initCheck() < 0)
+        return -1;
+
+    memset(&cmd, 0, sizeof(hf_manager_cmd));
+    cmd.action = HF_MANAGER_SENSOR_RAWDATA;
+    cmd.sensor_type = sensor;
+    cmd.data[0] = en;
+    return TEMP_FAILURE_RETRY(write(mFd, &cmd, sizeof(hf_manager_cmd)));
+}
+
+int HfManager::enableRawData(int sensor) {
+    return enableDisableRawData(sensor, true);
+}
+
+int HfManager::disableRawData(int sensor) {
+    return enableDisableRawData(sensor, false);
+}
+
+int HfManager::requestOperation(int sensor,
+            unsigned int cmd, bool status) {
+    int err = -1;
+    ioctl_packet packet;
+
+    if ((err = initCheck()) < 0)
+        return err;
+
+    memset(&packet, 0, sizeof(ioctl_packet));
+    packet.sensor_type = sensor;
+    packet.status = status;
+
+    err = TEMP_FAILURE_RETRY(ioctl(mFd, cmd, &packet));
+    if (err < 0) {
+        ALOGE("requestOperation failed err=%d errno=%d\n", err, errno);
+        return err;
+    }
+    return err;
+}
+
+int HfManager::requestRuntimeCalibration(int sensor, bool status) {
+    return requestOperation(sensor, HF_MANAGER_REQUEST_BIAS_DATA, status);
+}
+
+int HfManager::requestFactoryCalibration(int sensor, bool status) {
+    return requestOperation(sensor, HF_MANAGER_REQUEST_CALI_DATA, status);
+}
+
+int HfManager::requestGyroTemperatureCalibration(bool status) {
+    return requestOperation(SENSOR_TYPE_GYROSCOPE,
+        HF_MANAGER_REQUEST_TEMP_DATA, status);
+}
+
+int HfManager::requestSelfTest(int sensor, bool status) {
+    return requestOperation(sensor, HF_MANAGER_REQUEST_TEST_DATA, status);
+}
+
+#undef LOG_TAG
+#define LOG_TAG "HfLooper"
+
+HfLooper::HfLooper(int fd, int pollBufferSize) {
+    mPollBufferSize = (pollBufferSize > pollMaxBufferSize) ?
+        pollBufferSize : pollMaxBufferSize;
+    pollBuffer.reset(new hf_manager_event[mPollBufferSize]);
+
+    mFd = fd;
+    mPollFds[0].fd = fd;
+    mPollFds[0].events = POLLIN;
+    mPollFds[0].revents = 0;
+    mNumPollFds = 1;
+}
+
+HfLooper::~HfLooper() {
+    mPollFds[0].fd = mFd = -1;
+    /* must close fd then pollBuffer delete, wait poll return */
+    pollBuffer.reset();
+}
+
+int HfLooper::initCheck() const {
+    return mFd < 0 ? -ENODEV : 0;
+}
+
+int HfLooper::eventConvertOther(sensors_event_t *dst, hf_manager_event *src) {
+    if (src->action != DATA_ACTION || src->action != FLUSH_ACTION) {
+        eventConvertAll(dst, src);
+        return true;
+    }
+    return false;
+}
+
+int HfLooper::eventConvertData(sensors_event_t *dst, hf_manager_event *src) {
+    if (src->action == DATA_ACTION) {
+        eventConvertAll(dst, src);
+        return true;
+    }
+    return false;
+}
+
+int HfLooper::eventConvertDataFlush(sensors_event_t *dst, hf_manager_event *src) {
+    if (src->action == DATA_ACTION || src->action == FLUSH_ACTION) {
+        eventConvertAll(dst, src);
+        return true;
+    }
+    return false;
+}
+
+int HfLooper::eventConvertAll(sensors_event_t *dst, hf_manager_event *src) {
+    /* data[0, 1, 2, 3, 4, 5] bias cali temp or selftest result */
+    /* reserved0 restore action for sensor user dispatch */
+    /* data[13, 14, 15] restore bias for uncali sensor */
+    dst->reserved0 = src->action;
+    if (src->action == DATA_ACTION) {
+        dst->version = sizeof(sensors_event_t);
+        dst->timestamp = src->timestamp;
+        dst->sensor = src->sensor_type;
+        dst->type = src->sensor_type;
+        switch (src->sensor_type) {
+        case SENSOR_TYPE_ACCELEROMETER:
+            dst->acceleration.x = (float)src->word[0] / ACC_DIV;
+            dst->acceleration.y = (float)src->word[1] / ACC_DIV;
+            dst->acceleration.z = (float)src->word[2] / ACC_DIV;
+            dst->data[13] = (float)src->word[3] / ACC_DIV;
+            dst->data[14] = (float)src->word[4] / ACC_DIV;
+            dst->data[15] = (float)src->word[5] / ACC_DIV;
+            dst->acceleration.status = src->accurancy;
+            break;
+        case SENSOR_TYPE_MAGNETIC_FIELD:
+            dst->magnetic.x = (float)src->word[0] / MAG_DIV;
+            dst->magnetic.y = (float)src->word[1] / MAG_DIV;
+            dst->magnetic.z = (float)src->word[2] / MAG_DIV;
+            dst->data[13] = (float)src->word[3] / MAG_DIV;
+            dst->data[14] = (float)src->word[4] / MAG_DIV;
+            dst->data[15] = (float)src->word[5] / MAG_DIV;
+            dst->magnetic.status = src->accurancy;
+            break;
+        case SENSOR_TYPE_GYROSCOPE:
+            dst->gyro.x = (float)src->word[0] / GYRO_DIV;
+            dst->gyro.y = (float)src->word[1] / GYRO_DIV;
+            dst->gyro.z = (float)src->word[2] / GYRO_DIV;
+            dst->data[13] = (float)src->word[3] / GYRO_DIV;
+            dst->data[14] = (float)src->word[4] / GYRO_DIV;
+            dst->data[15] = (float)src->word[5] / GYRO_DIV;
+            dst->gyro.status = src->accurancy;
+            break;
+        case SENSOR_TYPE_ORIENTATION:
+            dst->orientation.azimuth = (float)src->word[0] / ORI_DIV;
+            dst->orientation.pitch = (float)src->word[1] / ORI_DIV;
+            dst->orientation.roll = (float)src->word[2] / ORI_DIV;
+            dst->orientation.status = src->accurancy;
+            break;
+        case SENSOR_TYPE_ROTATION_VECTOR:
+            dst->data[0] = (float)src->word[0] / RV_DIV;
+            dst->data[1] = (float)src->word[1] / RV_DIV;
+            dst->data[2] = (float)src->word[2] / RV_DIV;
+            dst->data[3] = (float)src->word[3] / RV_DIV;
+            break;
+        case SENSOR_TYPE_GAME_ROTATION_VECTOR:
+            dst->data[0] = (float)src->word[0] / GRV_DIV;
+            dst->data[1] = (float)src->word[1] / GRV_DIV;
+            dst->data[2] = (float)src->word[2] / GRV_DIV;
+            dst->data[3] = (float)src->word[3] / GRV_DIV;
+            break;
+        case SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR:
+            dst->data[0] = (float)src->word[0] / MRV_DIV;
+            dst->data[1] = (float)src->word[1] / MRV_DIV;
+            dst->data[2] = (float)src->word[2] / MRV_DIV;
+            dst->data[3] = (float)src->word[3] / MRV_DIV;
+            break;
+        case SENSOR_TYPE_LINEAR_ACCELERATION:
+            dst->acceleration.x = (float)src->word[0] / LA_DIV;
+            dst->acceleration.y = (float)src->word[1] / LA_DIV;
+            dst->acceleration.z = (float)src->word[2] / LA_DIV;
+            dst->orientation.status = src->accurancy;
+            break;
+        case SENSOR_TYPE_GRAVITY:
+            dst->acceleration.x = (float)src->word[0] / GRA_DIV;
+            dst->acceleration.y = (float)src->word[1] / GRA_DIV;
+            dst->acceleration.z = (float)src->word[2] / GRA_DIV;
+            dst->orientation.status = src->accurancy;
+            break;
+        case SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED:
+        case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED:
+        case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED:
+            dst->data[0] = (float)src->word[0] / RV_DIV;
+            dst->data[1] = (float)src->word[1] / RV_DIV;
+            dst->data[2] = (float)src->word[2] / RV_DIV;
+            dst->data[3] = (float)src->word[3] / RV_DIV;
+            dst->data[4] = (float)src->word[4] / RV_DIV;
+            dst->data[5] = (float)src->word[5] / RV_DIV;
+            break;
+        case SENSOR_TYPE_GYRO_SECONDARY:
+            dst->data[0] = (float)src->word[0] / GYRO_SEC_DIV;
+            dst->data[1] = (float)src->word[1] / GYRO_SEC_DIV;
+            dst->data[2] = (float)src->word[2] / GYRO_SEC_DIV;
+            break;
+        case SENSOR_TYPE_LIGHT:
+            dst->light = (float)src->word[0];
+            break;
+        case SENSOR_TYPE_PRESSURE:
+            dst->pressure = (float)src->word[0] / PRES_DIV;
+            break;
+        case SENSOR_TYPE_PROXIMITY:
+            dst->distance = (float)src->word[0];
+            ALOGI("distance = %f\n", dst->distance);
+            break;
+        case SENSOR_TYPE_STEP_COUNTER:
+            dst->u64.step_counter = (float)src->word[0];
+            break;
+        /*
+         * for wakeup sensor:
+         * sensors_event_t.sensor = SENSOR_TYPE_XXX_WAKEUP
+         * sensors_event_t.type = SENSOR_TYPE_XXX
+         */
+        case SENSOR_TYPE_STEP_DETECTOR_WAKEUP:
+            /* restore type to SENSOR_TYPE_XXX */
+            dst->type = src->sensor_type - WAKEUP_SENSOR_BASE;
+            dst->data[0] = (float)src->word[0];
+            dst->data[1] = (float)src->word[1];
+            dst->data[2] = (float)src->word[2];
+            dst->data[3] = (float)src->word[3];
+            dst->data[4] = (float)src->word[4];
+            dst->data[5] = (float)src->word[5];
+            break;
+        /*
+         * for private sensor:
+         * sensors_event_t.sensor = SENSOR_TYPE_XXX
+         * sensors_event_t.type = SENSOR_TYPE_XXX + SENSOR_TYPE_DEVICE_PRIVATE_BASE
+         */
+        case SENSOR_TYPE_PEDOMETER:
+        case SENSOR_TYPE_IN_POCKET:
+        case SENSOR_TYPE_ACTIVITY:
+        case SENSOR_TYPE_PDR:
+        case SENSOR_TYPE_FREEFALL:
+        case SENSOR_TYPE_FLAT:
+        case SENSOR_TYPE_FACE_DOWN:
+        case SENSOR_TYPE_SHAKE:
+        case SENSOR_TYPE_BRINGTOSEE:
+        case SENSOR_TYPE_ANSWER_CALL:
+        case SENSOR_TYPE_GEOFENCE:
+        case SENSOR_TYPE_FLOOR_COUNTER:
+        case SENSOR_TYPE_EKG:
+        case SENSOR_TYPE_PPG1:
+        case SENSOR_TYPE_PPG2:
+        case SENSOR_TYPE_RGBW:
+        case SENSOR_TYPE_SAR:
+            /* restore type to plus SENSOR_TYPE_DEVICE_PRIVATE_BASE */
+            dst->type = src->sensor_type + SENSOR_TYPE_DEVICE_PRIVATE_BASE;
+            dst->data[0] = (float)src->word[0];
+            dst->data[1] = (float)src->word[1];
+            dst->data[2] = (float)src->word[2];
+            dst->data[3] = (float)src->word[3];
+            dst->data[4] = (float)src->word[4];
+            dst->data[5] = (float)src->word[5];
+            break;
+        case SENSOR_TYPE_GYRO_TEMPERATURE:
+            /* restore type to plus SENSOR_TYPE_DEVICE_PRIVATE_BASE */
+            dst->type = src->sensor_type + SENSOR_TYPE_DEVICE_PRIVATE_BASE;
+            dst->data[0] = (float)src->word[0] / GYRO_TEMP_DIV;
+            break;
+        /*
+         * follow sensor run in default branch
+         * case SENSOR_TYPE_STATIONARY_DETECT:
+         * case SENSOR_TYPE_MOTION_DETECT;
+         * case SENSOR_TYPE_WAKE_GESTURE:
+         * case SENSOR_TYPE_PICK_UP_GESTURE:
+         * case SENSOR_TYPE_GLANCE_GESTURE:
+         * case SENSOR_TYPE_DEVICE_ORIENTATION:
+         * case SENSOR_TYPE_TILT_DETECTOR:
+         * case SENSOR_TYPE_STEP_DETECTOR:
+         * case SENSOR_TYPE_SIGNIFICANT_MOTION:
+         */
+        default:
+            dst->data[0] = (float)src->word[0];
+            dst->data[1] = (float)src->word[1];
+            dst->data[2] = (float)src->word[2];
+            dst->data[3] = (float)src->word[3];
+            dst->data[4] = (float)src->word[4];
+            dst->data[5] = (float)src->word[5];
+            break;
+        }
+    } else if (src->action == FLUSH_ACTION) {
+        dst->version = META_DATA_VERSION;
+        dst->sensor = 0;
+        dst->type = SENSOR_TYPE_META_DATA;
+        dst->meta_data.what = META_DATA_FLUSH_COMPLETE;
+        dst->meta_data.sensor = src->sensor_type;
+        dst->timestamp = src->timestamp;
+        ALOGI("[%d] flush complete\n", dst->meta_data.sensor);
+    } else if (src->action == RAW_ACTION) {
+        dst->version = sizeof(sensors_event_t);
+        dst->timestamp = src->timestamp;
+        dst->sensor = src->sensor_type;
+        dst->type = src->sensor_type;
+        switch (src->sensor_type) {
+        case SENSOR_TYPE_ACCELEROMETER:
+            dst->acceleration.x = (float)src->word[0] / ACC_DIV;
+            dst->acceleration.y = (float)src->word[1] / ACC_DIV;
+            dst->acceleration.z = (float)src->word[2] / ACC_DIV;
+            break;
+        case SENSOR_TYPE_MAGNETIC_FIELD:
+            dst->magnetic.x = (float)src->word[0] / MAG_DIV;
+            dst->magnetic.y = (float)src->word[1] / MAG_DIV;
+            dst->magnetic.z = (float)src->word[2] / MAG_DIV;
+            break;
+        case SENSOR_TYPE_GYROSCOPE:
+            dst->gyro.x = (float)src->word[0] / GYRO_DIV;
+            dst->gyro.y = (float)src->word[1] / GYRO_DIV;
+            dst->gyro.z = (float)src->word[2] / GYRO_DIV;
+            break;
+        case SENSOR_TYPE_PRESSURE:
+            dst->pressure = (float)src->word[0] / PRES_DIV;
+            break;
+        default:
+            dst->data[0] = (float)src->word[0];
+            dst->data[1] = (float)src->word[1];
+            dst->data[2] = (float)src->word[2];
+            dst->data[3] = (float)src->word[3];
+            dst->data[4] = (float)src->word[4];
+            dst->data[5] = (float)src->word[5];
+            break;
+        }
+    } else {
+        dst->version = sizeof(sensors_event_t);
+        dst->timestamp = src->timestamp;
+        dst->sensor = src->sensor_type;
+        dst->type = src->sensor_type;
+        dst->data[0] = (float)src->word[0];
+        dst->data[1] = (float)src->word[1];
+        dst->data[2] = (float)src->word[2];
+        dst->data[3] = (float)src->word[3];
+        dst->data[4] = (float)src->word[4];
+        dst->data[5] = (float)src->word[5];
+    }
+    return true;
+}
+
+int HfLooper::eventLooper(std::function<void(sensors_event_t const *)> callback) {
+    int err = -1, count = 0;
+    ssize_t len = 0;
+    hf_manager_event *buffer;
+    sensors_event_t event;
+
+    if ((err = initCheck()) < 0)
+        return err;
+
+    err = TEMP_FAILURE_RETRY(poll(mPollFds, mNumPollFds, -1));
+
+    if (mPollFds[0].revents & POLLIN) {
+        len = mPollBufferSize * sizeof(hf_manager_event);
+        memset(pollBuffer.get(), 0, len);
+        len = TEMP_FAILURE_RETRY(read(mFd, pollBuffer.get(), len));
+        if (len < 0) {
+            ALOGE("eventLooper read failed err=%zd errno=%d\n", len, errno);
+            len = 0;
+        }
+        if (len % sizeof(hf_manager_event)) {
+            ALOGE("eventLooper len failed err=%zu errno=%d\n", len, errno);
+            len = 0;
+        }
+        count = len / sizeof(hf_manager_event);
+        buffer = pollBuffer.get();
+        for (ssize_t i = 0; i < count; ++i) {
+            eventConvertAll(&event, &buffer[i]);
+            callback(&event);
+        }
+    }
+    return count;
+}
+
+int HfLooper::eventLooper(sensors_event_t *data, int count) {
+    int err = -1, size = 0;
+    ssize_t len = 0;
+    hf_manager_event *buffer;
+
+    if ((err = initCheck()) < 0)
+        return err;
+
+    err = TEMP_FAILURE_RETRY(poll(mPollFds, mNumPollFds, -1));
+
+    if (mPollFds[0].revents & POLLIN) {
+        /* reset all bufferm alloced */
+        memset(pollBuffer.get(), 0, mPollBufferSize * sizeof(hf_manager_event));
+
+        size = (count > mPollBufferSize) ? mPollBufferSize : count;
+        len = size * sizeof(hf_manager_event);
+
+        len = TEMP_FAILURE_RETRY(read(mFd, pollBuffer.get(), len));
+        if (len < 0) {
+            ALOGE("eventLooper read failed err=%zd errno=%d\n", len, errno);
+            len = 0;
+        }
+        if (len % sizeof(hf_manager_event)) {
+            ALOGE("eventLooper len failed err=%zu errno=%d\n", len, errno);
+            len = 0;
+        }
+        size = len / sizeof(hf_manager_event);
+        buffer = pollBuffer.get();
+        for (int i = 0; i < size; ++i) {
+            eventConvertAll(&data[i], &buffer[i]);
+        }
+    }
+    return size;
+}
+
+int HfLooper::eventRead(sensors_event_t *data, int count) {
+    int size = 0, data_flush_count = 0;
+    ssize_t len = 0;
+    hf_manager_event *buffer;
+
+    /* reset all bufferm alloced */
+    memset(pollBuffer.get(), 0, mPollBufferSize * sizeof(hf_manager_event));
+
+    size = (count > mPollBufferSize) ? mPollBufferSize : count;
+    len = size * sizeof(hf_manager_event);
+
+    len = TEMP_FAILURE_RETRY(read(mFd, pollBuffer.get(), len));
+    if (len < 0) {
+        ALOGE("eventRead read failed err=%zd errno=%d\n", len, errno);
+        len = 0;
+    }
+    if (len % sizeof(hf_manager_event)) {
+        ALOGE("eventRead len failed err=%zu errno=%d\n", len, errno);
+        len = 0;
+    }
+    size = len / sizeof(hf_manager_event);
+    buffer = pollBuffer.get();
+    for (int i = 0; i < size; ++i) {
+        if (eventConvertDataFlush(&data[i], &buffer[i]))
+            data_flush_count++;
+    }
+    return data_flush_count;
+}
+
diff --git a/src/navigation/sensor/2.0/core/HfManager.h b/src/navigation/sensor/2.0/core/HfManager.h
new file mode 100644
index 0000000..a572177
--- /dev/null
+++ b/src/navigation/sensor/2.0/core/HfManager.h
@@ -0,0 +1,118 @@
+/*
+* Copyright Statement:
+*
+* This software/firmware and related documentation ("MediaTek Software") are
+* protected under relevant copyright laws. The information contained herein is
+* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+* the prior written permission of MediaTek inc. and/or its licensors, any
+* reproduction, modification, use or disclosure of MediaTek Software, and
+* information contained herein, in whole or in part, shall be strictly
+* prohibited.
+*
+* MediaTek Inc. (C) 2017. All rights reserved.
+*
+* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*/
+
+
+#ifndef _HF_MANAGER_H_
+#define _HF_MANAGER_H_
+
+#include <fcntl.h>
+#include <poll.h>
+
+#include <mutex>
+#include <bitset>
+#include <memory>
+#include <functional>
+
+//#include <hardware/sensors.h>
+
+#include "HfSensorType.h"
+#include "HfSensorIo.h"
+
+class HfManager {
+public:
+    HfManager();
+    ~HfManager();
+
+    int getFd(void);
+    int findSensor(int sensor);
+    int activateSensor(int sensor, int enabled);
+    int batchSensor(int sensor, int64_t delayNs, int64_t latencyNs);
+    int flushSensor(int sensor);
+    int enableSensor(int sensor, int64_t delayNs);
+    int enableSensor(int sensor, int64_t delayNs, int64_t latencyNs);
+    int disableSensor(int sensor);
+    int requestFactoryCalibration(int sensor, bool status);
+    int requestRuntimeCalibration(int sensor, bool status);
+    int requestGyroTemperatureCalibration(bool status);
+    int requestSelfTest(int sensor, bool status);
+    int enableFactoryCalibration(int sensor);
+    int configCalibration(int sensor, void *data, size_t length);
+    int enableSelfTest(int sensor);
+    int enableRawData(int sensor);
+    int disableRawData(int sensor);
+
+protected:
+    int initCheck() const;
+    int enableDisable(int sensor, int enable,
+        int64_t delayNs, int64_t latencyNs);
+    void disableAllSensor(void);
+    bool checkRegisterStatus(int sensor);
+    int requestOperation(int sensor, unsigned int cmd, bool status);
+    int enableDisableRawData(int sensor, int en);
+
+private:
+    int mFd;
+    std::bitset<SENSOR_TYPE_SENSOR_MAX> sensorState;
+    std::bitset<SENSOR_TYPE_SENSOR_MAX> sensorRegister;
+    int64_t mDelayNs[SENSOR_TYPE_SENSOR_MAX];
+    int64_t mLatencyNs[SENSOR_TYPE_SENSOR_MAX];
+};
+
+class HfLooper {
+public:
+    HfLooper(int fd, int pollBufferSize);
+    ~HfLooper();
+    /* for other user loop data */
+    int eventLooper(std::function<void(sensors_event_t const *)> callback);
+    int eventLooper(sensors_event_t *data, int count);
+    /* for sensorservice user read data, only contain data and flush */
+    int eventRead(sensors_event_t *data, int count);
+
+protected:
+    int initCheck() const;
+    int eventConvertAll(sensors_event_t *dst, hf_manager_event *src);
+    int eventConvertOther(sensors_event_t *dst, hf_manager_event *src);
+    int eventConvertData(sensors_event_t *dst, hf_manager_event *src);
+    int eventConvertDataFlush(sensors_event_t *dst, hf_manager_event *src);
+
+private:
+    static constexpr int pollMaxBufferSize = 32;
+
+    int mFd;
+    int mPollBufferSize;
+    struct pollfd mPollFds[1];
+    int mNumPollFds;
+    std::unique_ptr<hf_manager_event[]> pollBuffer;
+};
+#endif
diff --git a/src/navigation/sensor/2.0/core/HfManagerWrapper.cpp b/src/navigation/sensor/2.0/core/HfManagerWrapper.cpp
new file mode 100644
index 0000000..6945445
--- /dev/null
+++ b/src/navigation/sensor/2.0/core/HfManagerWrapper.cpp
@@ -0,0 +1,86 @@
+/*
+* Copyright Statement:
+*
+* This software/firmware and related documentation ("MediaTek Software") are
+* protected under relevant copyright laws. The information contained herein is
+* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+* the prior written permission of MediaTek inc. and/or its licensors, any
+* reproduction, modification, use or disclosure of MediaTek Software, and
+* information contained herein, in whole or in part, shall be strictly
+* prohibited.
+*
+* MediaTek Inc. (C) 2017. All rights reserved.
+*
+* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*/
+
+#include <stdint.h>
+#include <inttypes.h>
+
+#include "HfManager.h"
+#include "HfManagerWrapper.h"
+
+void *HfManagerCreate(void) {
+    return new HfManager();
+}
+
+void HfManagerDestroy(void *p) {
+    delete static_cast<HfManager *>(p);
+}
+
+int HfManagerGetFd(void *p) {
+    return static_cast<HfManager *>(p)->getFd();
+}
+
+int HfManagerFindSensor(void *p, int sensor) {
+    return static_cast<HfManager *>(p)->findSensor(sensor);
+}
+
+int HfManagerEnableSensor(void *p, int sensor,
+        int64_t delayNs, int64_t latencyNs) {
+    return static_cast<HfManager *>(p)->enableSensor(sensor,
+        delayNs, latencyNs);
+}
+
+int HfManagerDisableSensor(void *p, int sensor) {
+    return static_cast<HfManager *>(p)->disableSensor(sensor);
+}
+
+int HfManagerEnableRawData(void *p, int sensor) {
+    return static_cast<HfManager *>(p)->enableRawData(sensor);
+}
+
+int HfManagerDisableRawData(void *p, int sensor) {
+    return static_cast<HfManager *>(p)->disableRawData(sensor);
+}
+
+void *HfLooperCreate(int fd, size_t size) {
+    return new HfLooper(fd, size);
+}
+
+void HfLooperDestroy(void *p) {
+    delete static_cast<HfLooper *>(p);
+}
+
+int HfLooperEventLooper(void *p,
+        sensors_event_t *data, int count) {
+    return static_cast<HfLooper *>(p)->eventLooper(data, count);
+}
diff --git a/src/navigation/sensor/2.0/core/HfManagerWrapper.h b/src/navigation/sensor/2.0/core/HfManagerWrapper.h
new file mode 100644
index 0000000..080782e
--- /dev/null
+++ b/src/navigation/sensor/2.0/core/HfManagerWrapper.h
@@ -0,0 +1,63 @@
+/*
+* Copyright Statement:
+*
+* This software/firmware and related documentation ("MediaTek Software") are
+* protected under relevant copyright laws. The information contained herein is
+* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+* the prior written permission of MediaTek inc. and/or its licensors, any
+* reproduction, modification, use or disclosure of MediaTek Software, and
+* information contained herein, in whole or in part, shall be strictly
+* prohibited.
+*
+* MediaTek Inc. (C) 2017. All rights reserved.
+*
+* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*/
+
+#ifndef _HF_MANAGER_WRAPPER_H_
+#define _HF_MANAGER_WRAPPER_H_
+
+#include "HfSensorType.h"
+#include "HfSensorIo.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+void *HfManagerCreate(void);
+void HfManagerDestroy(void *p);
+int HfManagerGetFd(void *p);
+int HfManagerFindSensor(void *p, int sensor);
+int HfManagerEnableSensor(void *p, int sensor,
+        int64_t delayNs, int64_t latencyNs);
+int HfManagerDisableSensor(void *p, int sensor);
+int HfManagerEnableRawData(void *p, int sensor);
+int HfManagerDisableRawData(void *p, int sensor);
+void *HfLooperCreate(int fd, size_t size);
+void HfLooperDestroy(void *p);
+int HfLooperEventLooper(void *p,
+        sensors_event_t *data, int count);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/navigation/sensor/2.0/core/HfSensorIo.h b/src/navigation/sensor/2.0/core/HfSensorIo.h
new file mode 100644
index 0000000..1af07ce
--- /dev/null
+++ b/src/navigation/sensor/2.0/core/HfSensorIo.h
@@ -0,0 +1,94 @@
+/*
+* Copyright Statement:
+*
+* This software/firmware and related documentation ("MediaTek Software") are
+* protected under relevant copyright laws. The information contained herein is
+* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+* the prior written permission of MediaTek inc. and/or its licensors, any
+* reproduction, modification, use or disclosure of MediaTek Software, and
+* information contained herein, in whole or in part, shall be strictly
+* prohibited.
+*
+* MediaTek Inc. (C) 2017. All rights reserved.
+*
+* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*/
+
+#ifndef _HF_SENSOR_IO_H_
+#define _HF_SENSOR_IO_H_
+
+#include <stdbool.h>
+
+#include <linux/ioctl.h>
+#include <sys/ioctl.h>
+
+enum {
+    DATA_ACTION,
+    FLUSH_ACTION,
+    BIAS_ACTION,
+    CALI_ACTION,
+    TEMP_ACTION,
+    TEST_ACTION,
+    RAW_ACTION,
+};
+
+enum {
+    HF_MANAGER_SENSOR_DISABLE,
+    HF_MANAGER_SENSOR_ENABLE,
+    HF_MANAGER_SENSOR_FLUSH,
+    HF_MANAGER_SENSOR_ENABLE_CALI,
+    HF_MANAGER_SENSOR_CONFIG_CALI,
+    HF_MANAGER_SENSOR_SELFTEST,
+    HF_MANAGER_SENSOR_RAWDATA,
+};
+
+typedef struct hf_manager_cmd {
+    uint8_t sensor_type;
+    uint8_t action;
+    int64_t delay;
+    int64_t latency;
+    int32_t data[12];
+} __attribute__((packed)) hf_manager_cmd;
+
+typedef struct hf_manager_event {
+    int64_t timestamp;
+    uint8_t sensor_type;
+    uint8_t accurancy;
+    uint8_t action;
+    uint8_t reserved;
+    union {
+        int32_t word[6];
+        int8_t byte[0];
+    };
+} __attribute__((packed)) hf_manager_event;
+
+typedef struct ioctl_packet {
+    uint8_t sensor_type;
+    bool status;
+} __attribute__((packed)) ioctl_packet;
+
+#define HF_MANAGER_REQUEST_REGISTER_STATUS  _IOWR('a', 1, struct ioctl_packet)
+#define HF_MANAGER_REQUEST_BIAS_DATA        _IOW('a', 2, struct ioctl_packet)
+#define HF_MANAGER_REQUEST_CALI_DATA        _IOW('a', 3, struct ioctl_packet)
+#define HF_MANAGER_REQUEST_TEMP_DATA        _IOW('a', 4, struct ioctl_packet)
+#define HF_MANAGER_REQUEST_TEST_DATA        _IOW('a', 5, struct ioctl_packet)
+
+#endif
diff --git a/src/navigation/sensor/2.0/core/HfSensorType.h b/src/navigation/sensor/2.0/core/HfSensorType.h
new file mode 100644
index 0000000..c165153
--- /dev/null
+++ b/src/navigation/sensor/2.0/core/HfSensorType.h
@@ -0,0 +1,112 @@
+/*
+* Copyright Statement:
+*
+* This software/firmware and related documentation ("MediaTek Software") are
+* protected under relevant copyright laws. The information contained herein is
+* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+* the prior written permission of MediaTek inc. and/or its licensors, any
+* reproduction, modification, use or disclosure of MediaTek Software, and
+* information contained herein, in whole or in part, shall be strictly
+* prohibited.
+*
+* MediaTek Inc. (C) 2017. All rights reserved.
+*
+* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*/
+
+
+#ifndef _HF_SENSOR_TYPE_H_
+#define _HF_SENSOR_TYPE_H_
+
+#include "sensors.h"
+
+#define SENSOR_STRING_TYPE_PEDOMETER        "android.sensor.pedometer"
+#define SENSOR_STRING_TYPE_IN_POCKET        "android.sensor.in_pocket"
+#define SENSOR_STRING_TYPE_ACTIVITY         "android.sensor.activity"
+#define SENSOR_STRING_TYPE_PDR              "android.sensor.pdr"
+#define SENSOR_STRING_TYPE_FREEFALL         "android.sensor.freefall"
+#define SENSOR_STRING_TYPE_FLAT             "android.sensor.flat"
+#define SENSOR_STRING_TYPE_FACE_DOWN        "android.sensor.face_down"
+#define SENSOR_STRING_TYPE_SHAKE            "android.sensor.shake"
+#define SENSOR_STRING_TYPE_BRINGTOSEE       "android.sensor.bring_to_see"
+#define SENSOR_STRING_TYPE_ANSWERCALL       "android.sensor.answer_call"
+#define SENSOR_STRING_TYPE_FLOOR_COUNTER    "android.sensor.floor_count"
+#define SENSOR_STRING_TYPE_EKG              "android.sensor.ekg"
+#define SENSOR_STRING_TYPE_PPG1             "android.sensor.ppg1"
+#define SENSOR_STRING_TYPE_PPG2             "android.sensor.ppg2"
+#define SENSOR_STRING_TYPE_RGBW             "android.sensor.rgbw"
+#define SENSOR_STRING_TYPE_GYRO_TEMPERATURE "android.sensor.gyro_temperature"
+#define SENSOR_STRING_TYPE_SAR              "android.sensor.sar"
+
+#define WAKEUP_SENSOR_BASE 100
+
+enum {
+    /* follow mtk add sensor type */
+    SENSOR_TYPE_PEDOMETER = 55,
+    SENSOR_TYPE_IN_POCKET,
+    SENSOR_TYPE_ACTIVITY,
+    SENSOR_TYPE_PDR,
+    SENSOR_TYPE_FREEFALL,
+    SENSOR_TYPE_FLAT,
+    SENSOR_TYPE_FACE_DOWN,
+    SENSOR_TYPE_SHAKE,
+    SENSOR_TYPE_BRINGTOSEE,
+    SENSOR_TYPE_ANSWER_CALL,
+    SENSOR_TYPE_GEOFENCE,
+    SENSOR_TYPE_FLOOR_COUNTER,
+    SENSOR_TYPE_EKG,
+    SENSOR_TYPE_PPG1,
+    SENSOR_TYPE_PPG2,
+    SENSOR_TYPE_RGBW,
+    SENSOR_TYPE_GYRO_TEMPERATURE,
+    SENSOR_TYPE_SAR,
+    SENSOR_TYPE_GYRO_SECONDARY,
+    SENSOR_TYPE_SENSOR_MAX,
+
+    SENSOR_TYPE_STEP_DETECTOR_WAKEUP = SENSOR_TYPE_STEP_DETECTOR + WAKEUP_SENSOR_BASE,
+};
+
+#if SENSOR_TYPE_SENSOR_MAX >= WAKEUP_SENSOR_BASE
+#error sensor type over the upper limit
+#endif
+
+enum {
+    SENSOR_ACCURANCY_UNRELIALE,
+    SENSOR_ACCURANCY_LOW,
+    SENSOR_ACCURANCY_MEDIUM,
+    SENSOR_ACCURANCY_HIGH,
+};
+
+
+#define ACC_DIV        1000.0f
+#define GYRO_DIV       7505747.0f
+#define MAG_DIV        100.0f
+#define ORI_DIV        1000.0f
+#define RV_DIV         1000000.0f
+#define GRV_DIV        1000000.0f
+#define MRV_DIV        1000000.0f
+#define LA_DIV         1000.0f
+#define GRA_DIV        1000.0f
+#define PRES_DIV       100.0f
+#define GYRO_SEC_DIV   57295787.785569f
+#define GYRO_TEMP_DIV  100.0f
+
+#endif
diff --git a/src/navigation/sensor/2.0/core/Makefile b/src/navigation/sensor/2.0/core/Makefile
new file mode 100644
index 0000000..394a1a1
--- /dev/null
+++ b/src/navigation/sensor/2.0/core/Makefile
@@ -0,0 +1,37 @@
+INCLUDES := ./
+
+TARGET = libhfmanager.so
+
+CFLAGS += -std=c++11 -Wall -Os
+
+SHARE   := -fPIC -shared
+
+CPP_FILES  += HfManager.cpp
+CPP_FILES  += HfManagerWrapper.cpp
+
+C_FILES    := $(patsubst ./%,%,$(C_FILES))
+C_OBJS     := $(sort $(C_FILES:%.c=%.o))
+
+CPP_FILES  := $(patsubst ./%,%,$(CPP_FILES))
+CPP_OBJS   := $(sort $(CPP_FILES:%.cpp=%.o))
+
+TMP_OBJS   += $(CPP_OBJS)
+TMP_OBJS   += $(C_OBJS)
+OBJS       += $(sort $(TMP_OBJS))
+
+INCLUDES := $(patsubst %,-I%,$(patsubst -I%,%,$(INCLUDES)))
+
+
+${TARGET}: ${OBJS}
+	${CXX} ${CFLAGS} ${INCLUDES} ${LDFLAGS} $(SHARE) $^ -o $@
+${CPP_OBJS}: %.o: %.cpp
+	@mkdir -p $(dir $@)
+	${CXX} ${CFLAGS}  ${LDFLAGS} ${INCLUDES} -c $^ -o $@
+${C_OBJS}: %.o: %.c
+	@mkdir -p $(dir $@)
+	${CXX} ${CFLAGS}  ${LDFLAGS} ${INCLUDES} -c $^ -o $@
+
+.PHONY: clean
+clean:
+	@rm -rf ${TARGET} ${OBJS}
+	@echo Clean done
diff --git a/src/navigation/sensor/2.0/core/MediatekProprietary b/src/navigation/sensor/2.0/core/MediatekProprietary
new file mode 100644
index 0000000..4f06a18
--- /dev/null
+++ b/src/navigation/sensor/2.0/core/MediatekProprietary
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2017. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
\ No newline at end of file
diff --git a/src/navigation/sensor/2.0/core/sensors-base.h b/src/navigation/sensor/2.0/core/sensors-base.h
new file mode 100644
index 0000000..6a86133
--- /dev/null
+++ b/src/navigation/sensor/2.0/core/sensors-base.h
@@ -0,0 +1,86 @@
+/*
+* Copyright Statement:
+*
+* This software/firmware and related documentation ("MediaTek Software") are
+* protected under relevant copyright laws. The information contained herein is
+* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+* the prior written permission of MediaTek inc. and/or its licensors, any
+* reproduction, modification, use or disclosure of MediaTek Software, and
+* information contained herein, in whole or in part, shall be strictly
+* prohibited.
+*
+* MediaTek Inc. (C) 2017. All rights reserved.
+*
+* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*/
+
+// This file is autogenerated by hidl-gen. Do not edit manually.
+// Source: android.hardware.sensors@1.0
+// Root: android.hardware:hardware/interfaces
+
+#ifndef _SENSORS_BASE_H_
+#define _SENSORS_BASE_H_
+
+enum {
+    SENSOR_TYPE_META_DATA = 0,
+    SENSOR_TYPE_ACCELEROMETER = 1,
+    SENSOR_TYPE_MAGNETIC_FIELD = 2,
+    SENSOR_TYPE_ORIENTATION = 3,
+    SENSOR_TYPE_GYROSCOPE = 4,
+    SENSOR_TYPE_LIGHT = 5,
+    SENSOR_TYPE_PRESSURE = 6,
+    SENSOR_TYPE_TEMPERATURE = 7,
+    SENSOR_TYPE_PROXIMITY = 8,
+    SENSOR_TYPE_GRAVITY = 9,
+    SENSOR_TYPE_LINEAR_ACCELERATION = 10,
+    SENSOR_TYPE_ROTATION_VECTOR = 11,
+    SENSOR_TYPE_RELATIVE_HUMIDITY = 12,
+    SENSOR_TYPE_AMBIENT_TEMPERATURE = 13,
+    SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED = 14,
+    SENSOR_TYPE_GAME_ROTATION_VECTOR = 15,
+    SENSOR_TYPE_GYROSCOPE_UNCALIBRATED = 16,
+    SENSOR_TYPE_SIGNIFICANT_MOTION = 17,
+    SENSOR_TYPE_STEP_DETECTOR = 18,
+    SENSOR_TYPE_STEP_COUNTER = 19,
+    SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR = 20,
+    SENSOR_TYPE_HEART_RATE = 21,
+    SENSOR_TYPE_TILT_DETECTOR = 22,
+    SENSOR_TYPE_WAKE_GESTURE = 23,
+    SENSOR_TYPE_GLANCE_GESTURE = 24,
+    SENSOR_TYPE_PICK_UP_GESTURE = 25,
+    SENSOR_TYPE_WRIST_TILT_GESTURE = 26,
+    SENSOR_TYPE_DEVICE_ORIENTATION = 27,
+    SENSOR_TYPE_POSE_6DOF = 28,
+    SENSOR_TYPE_STATIONARY_DETECT = 29,
+    SENSOR_TYPE_MOTION_DETECT = 30,
+    SENSOR_TYPE_HEART_BEAT = 31,
+    SENSOR_TYPE_DYNAMIC_SENSOR_META = 32,
+    SENSOR_TYPE_ADDITIONAL_INFO = 33,
+    SENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT = 34,
+    SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED = 35,
+    SENSOR_TYPE_DEVICE_PRIVATE_BASE = 65536, // 0x10000
+};
+
+enum {
+    META_DATA_FLUSH_COMPLETE = 1u, // 1
+};
+
+#endif
diff --git a/src/navigation/sensor/2.0/core/sensors.h b/src/navigation/sensor/2.0/core/sensors.h
new file mode 100644
index 0000000..5da83ff
--- /dev/null
+++ b/src/navigation/sensor/2.0/core/sensors.h
@@ -0,0 +1,235 @@
+/*
+* Copyright Statement:
+*
+* This software/firmware and related documentation ("MediaTek Software") are
+* protected under relevant copyright laws. The information contained herein is
+* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+* the prior written permission of MediaTek inc. and/or its licensors, any
+* reproduction, modification, use or disclosure of MediaTek Software, and
+* information contained herein, in whole or in part, shall be strictly
+* prohibited.
+*
+* MediaTek Inc. (C) 2017. All rights reserved.
+*
+* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*/
+
+
+#ifndef _SENSORS_H_
+#define _SENSORS_H_
+
+#include "sensors-base.h"
+#include <stdint.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+/*
+ * what field for meta_data_event_t
+ */
+enum {
+    /* a previous flush operation has completed */
+    // META_DATA_FLUSH_COMPLETE = 1,
+    META_DATA_VERSION   /* always last, leave auto-assigned */
+};
+
+/**
+ * sensor event data
+ */
+typedef struct {
+    union {
+        float v[3];
+        struct {
+            float x;
+            float y;
+            float z;
+        };
+        struct {
+            float azimuth;
+            float pitch;
+            float roll;
+        };
+    };
+    int8_t status;
+    uint8_t reserved[3];
+} sensors_vec_t;
+
+/**
+ * uncalibrated accelerometer, gyroscope and magnetometer event data
+ */
+typedef struct {
+  union {
+    float uncalib[3];
+    struct {
+      float x_uncalib;
+      float y_uncalib;
+      float z_uncalib;
+    };
+  };
+  union {
+    float bias[3];
+    struct {
+      float x_bias;
+      float y_bias;
+      float z_bias;
+    };
+  };
+} uncalibrated_event_t;
+
+/**
+ * Meta data event data
+ */
+typedef struct meta_data_event {
+    int32_t what;
+    int32_t sensor;
+} meta_data_event_t;
+
+/**
+ * Dynamic sensor meta event. See the description of SENSOR_TYPE_DYNAMIC_SENSOR_META type for
+ * details.
+ */
+typedef struct dynamic_sensor_meta_event {
+    int32_t  connected;
+    int32_t  handle;
+    const struct sensor_t * sensor; // should be NULL if connected == false
+    uint8_t uuid[16];               // UUID of a dynamic sensor (using RFC 4122 byte order)
+                                    // For UUID 12345678-90AB-CDEF-1122-334455667788 the uuid field
+                                    // should be initialized as:
+                                    // {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x11, ...}
+} dynamic_sensor_meta_event_t;
+
+/**
+ * Heart rate event data
+ */
+typedef struct {
+  // Heart rate in beats per minute.
+  // Set to 0 when status is SENSOR_STATUS_UNRELIABLE or ..._NO_CONTACT
+  float bpm;
+  // Status of the sensor for this reading. Set to one SENSOR_STATUS_...
+  // Note that this value should only be set for sensors that explicitly define
+  // the meaning of this field. This field is not piped through the framework
+  // for other sensors.
+  int8_t status;
+} heart_rate_event_t;
+
+typedef struct {
+    int32_t type;                           // type of payload data, see additional_info_type_t
+    int32_t serial;                         // sequence number of this frame for this type
+    union {
+        // for each frame, a single data type, either int32_t or float, should be used.
+        int32_t data_int32[14];
+        float   data_float[14];
+    };
+} additional_info_event_t;
+
+/**
+ * Union of the various types of sensor data
+ * that can be returned.
+ */
+typedef struct sensors_event_t {
+    /* must be sizeof(struct sensors_event_t) */
+    int32_t version;
+
+    /* sensor identifier */
+    int32_t sensor;
+
+    /* sensor type */
+    int32_t type;
+
+    /* reserved */
+    int32_t reserved0;
+
+    /* time is in nanosecond */
+    int64_t timestamp;
+
+    union {
+        union {
+            float           data[16];
+
+            /* acceleration values are in meter per second per second (m/s^2) */
+            sensors_vec_t   acceleration;
+
+            /* magnetic vector values are in micro-Tesla (uT) */
+            sensors_vec_t   magnetic;
+
+            /* orientation values are in degrees */
+            sensors_vec_t   orientation;
+
+            /* gyroscope values are in rad/s */
+            sensors_vec_t   gyro;
+
+            /* temperature is in degrees centigrade (Celsius) */
+            float           temperature;
+
+            /* distance in centimeters */
+            float           distance;
+
+            /* light in SI lux units */
+            float           light;
+
+            /* pressure in hectopascal (hPa) */
+            float           pressure;
+
+            /* relative humidity in percent */
+            float           relative_humidity;
+
+            /* uncalibrated gyroscope values are in rad/s */
+            uncalibrated_event_t uncalibrated_gyro;
+
+            /* uncalibrated magnetometer values are in micro-Teslas */
+            uncalibrated_event_t uncalibrated_magnetic;
+
+            /* uncalibrated accelerometer values are in  meter per second per second (m/s^2) */
+            uncalibrated_event_t uncalibrated_accelerometer;
+
+            /* heart rate data containing value in bpm and status */
+            heart_rate_event_t heart_rate;
+
+            /* this is a special event. see SENSOR_TYPE_META_DATA above.
+             * sensors_meta_data_event_t events are all reported with a type of
+             * SENSOR_TYPE_META_DATA. The handle is ignored and must be zero.
+             */
+            meta_data_event_t meta_data;
+
+            /* dynamic sensor meta event. See SENSOR_TYPE_DYNAMIC_SENSOR_META type for details */
+            dynamic_sensor_meta_event_t dynamic_sensor_meta;
+
+            /*
+             * special additional sensor information frame, see
+             * SENSOR_TYPE_ADDITIONAL_INFO for details.
+             */
+            additional_info_event_t additional_info;
+        };
+
+        union {
+            uint64_t        data[8];
+
+            /* step-counter */
+            uint64_t        step_counter;
+        } u64;
+    };
+
+    /* Reserved flags for internal use. Set to zero. */
+    uint32_t flags;
+
+    uint32_t reserved1[3];
+} sensors_event_t;
+
+#endif  // ANDROID_SENSORS_INTERFACE_H
diff --git a/src/navigation/sensor/2.0/test/MakeTool b/src/navigation/sensor/2.0/test/MakeTool
new file mode 100644
index 0000000..46ba4f6
--- /dev/null
+++ b/src/navigation/sensor/2.0/test/MakeTool
@@ -0,0 +1,33 @@
+TARGET = high_freq_sensor_tool
+CFLAGS   += -Wall -O2 -std=c++11 -pthread
+
+INCLUDES := ./
+
+CPP_FILES := main.cpp
+LIBFLAGS := -llog -lhfmanager
+
+C_FILES    := $(patsubst ./%,%,$(C_FILES))
+C_OBJS     := $(sort $(C_FILES:%.c=%.o))
+
+CPP_FILES  := $(patsubst ./%,%,$(CPP_FILES))
+CPP_OBJS   := $(sort $(CPP_FILES:%.cpp=%.o))
+
+TMP_OBJS   += $(CPP_OBJS)
+TMP_OBJS   += $(C_OBJS)
+OBJS       += $(sort $(TMP_OBJS))
+
+INCLUDES := $(patsubst %,-I%,$(patsubst -I%,%,$(INCLUDES)))
+
+${TARGET}: ${OBJS}
+	${CXX} ${CFLAGS}  ${LDFLAGS} ${INCLUDES} -o $@ $^ -Wl,--start-group ${LIBFLAGS} -Wl,--end-group
+${CPP_OBJS}: %.o: %.cpp
+	@mkdir -p $(dir $@)
+	${CXX} ${CFLAGS}  ${LDFLAGS} ${INCLUDES} -c $^ -o $@
+${C_OBJS}: %.o: %.c
+	@mkdir -p $(dir $@)
+	${CXX} ${CFLAGS}  ${LDFLAGS} ${INCLUDES} -c $^ -o $@
+
+.PHONY: clean
+clean:
+	@rm -rf ${TARGET} ${OBJS}
+	@echo Clean done
diff --git a/src/navigation/sensor/2.0/test/MakeToolWrapper b/src/navigation/sensor/2.0/test/MakeToolWrapper
new file mode 100644
index 0000000..9d99d0e
--- /dev/null
+++ b/src/navigation/sensor/2.0/test/MakeToolWrapper
@@ -0,0 +1,33 @@
+TARGET = high_freq_sensor_tool_c_wrapper
+CFLAGS   += -Wall -O2 -std=c++11 -pthread
+
+INCLUDES := ./
+
+C_FILES := main.c
+LIBFLAGS :=  -llog -lhfmanager
+
+C_FILES    := $(patsubst ./%,%,$(C_FILES))
+C_OBJS     := $(sort $(C_FILES:%.c=%.o))
+
+CPP_FILES  := $(patsubst ./%,%,$(CPP_FILES))
+CPP_OBJS   := $(sort $(CPP_FILES:%.cpp=%.o))
+
+TMP_OBJS   += $(CPP_OBJS)
+TMP_OBJS   += $(C_OBJS)
+OBJS       += $(sort $(TMP_OBJS))
+
+INCLUDES := $(patsubst %,-I%,$(patsubst -I%,%,$(INCLUDES)))
+
+${TARGET}: ${OBJS}
+	${CXX} ${CFLAGS}  ${LDFLAGS} ${INCLUDES} -o $@ $^ -Wl,--start-group ${LIBFLAGS} -Wl,--end-group
+${CPP_OBJS}: %.o: %.cpp
+	@mkdir -p $(dir $@)
+	${CXX} ${CFLAGS}  ${LDFLAGS} ${INCLUDES} -c $^ -o $@
+${C_OBJS}: %.o: %.c
+	@mkdir -p $(dir $@)
+	${CXX} ${CFLAGS}  ${LDFLAGS} ${INCLUDES} -c $^ -o $@
+
+.PHONY: clean
+clean:
+	@rm -rf ${TARGET} ${OBJS}
+	@echo Clean done
diff --git a/src/navigation/sensor/2.0/test/MediatekProprietary b/src/navigation/sensor/2.0/test/MediatekProprietary
new file mode 100644
index 0000000..6e16090
--- /dev/null
+++ b/src/navigation/sensor/2.0/test/MediatekProprietary
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2017. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/src/navigation/sensor/2.0/test/main.c b/src/navigation/sensor/2.0/test/main.c
new file mode 100644
index 0000000..275c2f0
--- /dev/null
+++ b/src/navigation/sensor/2.0/test/main.c
@@ -0,0 +1,94 @@
+/*
+* Copyright Statement:
+*
+* This software/firmware and related documentation ("MediaTek Software") are
+* protected under relevant copyright laws. The information contained herein is
+* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+* the prior written permission of MediaTek inc. and/or its licensors, any
+* reproduction, modification, use or disclosure of MediaTek Software, and
+* information contained herein, in whole or in part, shall be strictly
+* prohibited.
+*
+* MediaTek Inc. (C) 2017. All rights reserved.
+*
+* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*/
+
+
+#include <stdio.h>
+#include <stdint.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <inttypes.h>
+#include <stdlib.h>
+#include <functional>
+
+#include <HfManagerWrapper.h>
+
+int main(int argc, char **argv) {
+    int sensor = 0, action = 0, delay = 0, latency = 0;
+    sensors_event_t data[32];
+
+    if (argc != 5) {
+        fprintf(stderr, "usage:         execute        sensor  action  delay  latency\n");
+        fprintf(stderr, "       ./high_freq_sensor_tool   1       1   5000000    0\n");
+        return -1;
+    }
+
+    sensor = atoi(argv[1]);
+    action = atoi(argv[2]);
+    delay = atoi(argv[3]);
+    latency = atoi(argv[4]);
+
+    fprintf(stderr, "cwrapper command: [%d,%d,%d,%d]\n", sensor, action, delay, latency);
+
+    void *mHfManager = HfManagerCreate();
+    void *mHfLooper = HfLooperCreate(HfManagerGetFd(mHfManager), 64);
+
+    if (HfManagerFindSensor(mHfManager, sensor) < 0)
+        return -2;
+    switch (action) {
+    case HF_MANAGER_SENSOR_DISABLE:
+        HfManagerDisableSensor(mHfManager, sensor);
+        break;
+    case HF_MANAGER_SENSOR_ENABLE:
+        HfManagerEnableSensor(mHfManager, sensor, delay, latency);
+        break;
+    case HF_MANAGER_SENSOR_RAWDATA:
+        HfManagerEnableRawData(mHfManager, sensor);
+        break;
+    }
+    while (1) {
+        int err = HfLooperEventLooper(mHfLooper, data, 32);
+        switch (err) {
+            case -ENODEV:
+            fprintf(stderr, "cwrapper looper stop nodevice error\n");
+            return -3;
+        }
+        for (int i = 0; i < err; ++i) {
+            fprintf(stderr, "cwrapper data: [%d,%d,%" PRId64 ",%f,%f,%f]\n",
+                    data[i].sensor, data[i].reserved0, data[i].timestamp,
+                        data[i].data[0], data[i].data[1], data[i].data[2]);
+        }
+    }
+    return 0;
+}
diff --git a/src/navigation/sensor/2.0/test/main.cpp b/src/navigation/sensor/2.0/test/main.cpp
new file mode 100644
index 0000000..1126b7d
--- /dev/null
+++ b/src/navigation/sensor/2.0/test/main.cpp
@@ -0,0 +1,102 @@
+/*
+* Copyright Statement:
+*
+* This software/firmware and related documentation ("MediaTek Software") are
+* protected under relevant copyright laws. The information contained herein is
+* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+* the prior written permission of MediaTek inc. and/or its licensors, any
+* reproduction, modification, use or disclosure of MediaTek Software, and
+* information contained herein, in whole or in part, shall be strictly
+* prohibited.
+*
+* MediaTek Inc. (C) 2017. All rights reserved.
+*
+* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*/
+
+#include <stdint.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <inttypes.h>
+
+#include <memory>
+#include <thread>
+#include <functional>
+
+#include <HfManager.h>
+
+int main(int argc, char **argv) {
+    int fd = -1;
+    int sensor = 0, action = 0, delay = 0, latency = 0;
+
+    if (argc != 5) {
+        fprintf(stderr, "usage:         execute        sensor  action  delay  latency\n");
+        fprintf(stderr, "       ./high_freq_sensor_tool   1       1   5000000    0\n");
+        return -1;
+    }
+
+    sensor = atoi(argv[1]);
+    action = atoi(argv[2]);
+    delay = atoi(argv[3]);
+    latency = atoi(argv[4]);
+
+    fprintf(stderr, "command: [%d,%d,%d,%d]\n", sensor, action, delay, latency);
+
+    std::unique_ptr<HfManager> mHfManager(new HfManager());
+    fd = mHfManager->getFd();
+    std::thread looperThread([fd]() {
+        std::unique_ptr<HfLooper> mHfLooper(new HfLooper(fd, 64));
+        while (1) {
+            int err = mHfLooper->eventLooper([](sensors_event_t const * event) {
+                fprintf(stderr, "data: [%d,%d,%" PRId64 ",%f,%f,%f]\n",
+                    event->sensor, event->reserved0, event->timestamp,
+                        event->data[0], event->data[1], event->data[2]);
+            });
+            switch (err) {
+            case -ENODEV:
+                fprintf(stderr, "looper stop nodevice error\n");
+                return;
+            }
+        };
+    });
+    looperThread.detach();
+    if (mHfManager->findSensor(sensor) < 0)
+        return -2;
+    switch (action) {
+    case HF_MANAGER_SENSOR_DISABLE:
+        mHfManager->disableSensor(sensor);
+        break;
+    case HF_MANAGER_SENSOR_ENABLE:
+        mHfManager->enableSensor(sensor, delay, latency);
+        break;
+    case HF_MANAGER_SENSOR_ENABLE_CALI:
+        mHfManager->requestFactoryCalibration(sensor, true);
+        mHfManager->enableFactoryCalibration(sensor);
+        break;
+    case HF_MANAGER_SENSOR_RAWDATA:
+        mHfManager->enableRawData(sensor);
+        break;
+    }
+    while (1)
+        sleep(1);
+    return 0;
+}