/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <fcntl.h> #include <errno.h> #include <math.h> #include <poll.h> #include <unistd.h> #include <dirent.h> #include <sys/select.h> #include <cutils/log.h> #include <linux/input.h> #include "sensor_params.h" #include "MPLSupport.h" // TODO: include corresponding header file for 3rd party compass sensor #include "CompassSensor.AKM.h" // TODO: specify this for "fillList()" API #define COMPASS_NAME "AKM8963" /*****************************************************************************/ CompassSensor::CompassSensor() : SensorBase(NULL, NULL) { VFUNC_LOG; // TODO: initiate 3rd-party's class, and disable its funtionalities // proper commands mCompassSensor = new AkmSensor(); LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)", 0, "/sys/class/compass/akm8963/enable_mag", getTimestamp()); write_sysfs_int((char*)"/sys/class/compass/akm8963/enable_mag", 0); } CompassSensor::~CompassSensor() { VFUNC_LOG; // TODO: disable 3rd-party's funtionalities and delete the object LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)", 0, "/sys/class/compass/akm8963/enable_mag", getTimestamp()); write_sysfs_int((char*)"/sys/class/compass/akm8963/enable_mag", 0); delete mCompassSensor; } int CompassSensor::getFd(void) const { VFUNC_LOG; // TODO: return 3rd-party's file descriptor return mCompassSensor->getFd(); } /** * @brief This function will enable/disable sensor. * @param[in] handle which sensor to enable/disable. * @param[in] en en=1 enable, en=0 disable * @return if the operation is successful. */ int CompassSensor::enable(int32_t handle, int en) { VFUNC_LOG; // TODO: called 3rd-party's "set enable/disable" function return mCompassSensor->setEnable(handle, en); } int CompassSensor::setDelay(int32_t handle, int64_t ns) { VFUNC_LOG; // TODO: called 3rd-party's "set delay" function return mCompassSensor->setDelay(handle, ns); } /** @brief This function will return the state of the sensor. @return 1=enabled; 0=disabled **/ int CompassSensor::getEnable(int32_t handle) { VFUNC_LOG; // TODO: return if 3rd-party compass is enabled return mCompassSensor->getEnable(handle); } /** @brief This function will return the current delay for this sensor. @return delay in nanoseconds. **/ int64_t CompassSensor::getDelay(int32_t handle) { VFUNC_LOG; // TODO: return 3rd-party's delay time (should be in ns) return mCompassSensor->getDelay(handle); } /** @brief Integrators need to implement this function per 3rd-party solution @param[out] data sensor data is stored in this variable. Scaled such that 1 uT = 2^16 @para[in] timestamp data's timestamp @return 1, if 1 sample read, 0, if not, negative if error **/ int CompassSensor::readSample(long *data, int64_t *timestamp) { VFUNC_LOG; // TODO: need to implement "readSample()" for MPL in 3rd-party's .cpp file return mCompassSensor->readSample(data, timestamp); } /** @brief Integrators need to implement this function per 3rd-party solution @param[out] data sensor data is stored in this variable. Scaled such that 1 uT = 2^16 @para[in] timestamp data's timestamp @return 1, if 1 sample read, 0, if not, negative if error **/ int CompassSensor::readRawSample(float *data, int64_t *timestamp) { VFUNC_LOG; long ldata[3]; int res = mCompassSensor->readSample(ldata, timestamp); for(int i=0; i<3; i++) { data[i] = (float)ldata[i]; } return res; } void CompassSensor::fillList(struct sensor_t *list) { VFUNC_LOG; const char *compass = COMPASS_NAME; if (compass) { if (!strcmp(compass, "AKM8963")) { list->maxRange = COMPASS_AKM8963_RANGE; list->resolution = COMPASS_AKM8963_RESOLUTION; list->power = COMPASS_AKM8963_POWER; list->minDelay = COMPASS_AKM8963_MINDELAY; return; } if (!strcmp(compass, "AKM8975")) { list->maxRange = COMPASS_AKM8975_RANGE; list->resolution = COMPASS_AKM8975_RESOLUTION; list->power = COMPASS_AKM8975_POWER; list->minDelay = COMPASS_AKM8975_MINDELAY; LOGW("HAL:support for AKM8975 is incomplete"); } } LOGE("HAL:unsupported compass id %s -- " "this implementation only supports AKM compasses", compass); list->maxRange = COMPASS_AKM8975_RANGE; list->resolution = COMPASS_AKM8975_RESOLUTION; list->power = COMPASS_AKM8975_POWER; list->minDelay = COMPASS_AKM8975_MINDELAY; } // TODO: specify compass sensor's mounting matrix for MPL void CompassSensor::getOrientationMatrix(signed char *orient) { VFUNC_LOG; orient[0] = 1; orient[1] = 0; orient[2] = 0; orient[3] = 0; orient[4] = 1; orient[5] = 0; orient[6] = 0; orient[7] = 0; orient[8] = 1; } int CompassSensor::getAccuracy(void) { VFUNC_LOG; // TODO: need to implement "getAccuracy()" for MPL in 3rd-party's .cpp file return mCompassSensor->getAccuracy(); }