diff options
Diffstat (limited to '6515/libsensors_iio/CompassSensor.AKM.cpp')
-rw-r--r-- | 6515/libsensors_iio/CompassSensor.AKM.cpp | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/6515/libsensors_iio/CompassSensor.AKM.cpp b/6515/libsensors_iio/CompassSensor.AKM.cpp new file mode 100644 index 0000000..45699fe --- /dev/null +++ b/6515/libsensors_iio/CompassSensor.AKM.cpp @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2012 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(); +} |