[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;
+}