You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
5.8 KiB
203 lines
5.8 KiB
/* |
|
* 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(); |
|
}
|
|
|