summaryrefslogtreecommitdiff
path: root/sensors/1.0/default/Sensors.cpp
diff options
context:
space:
mode:
authorPeng Xu <pengxu@google.com>2017-01-19 00:56:04 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2017-01-19 00:56:04 +0000
commit84660153a996dd6eb6aaef661232013d366936c7 (patch)
tree146c40b32c88f07c96a6c5724d579c294f447cad /sensors/1.0/default/Sensors.cpp
parentf19d03bb0fe5136f9d3284b89112a2f7afe77698 (diff)
parent89df2e70642a380357960e07f53e46929e9be002 (diff)
Merge "[sensors] Default implementation and vts of direct report"
Diffstat (limited to 'sensors/1.0/default/Sensors.cpp')
-rw-r--r--sensors/1.0/default/Sensors.cpp69
1 files changed, 56 insertions, 13 deletions
diff --git a/sensors/1.0/default/Sensors.cpp b/sensors/1.0/default/Sensors.cpp
index e4ef99db16..41eb945167 100644
--- a/sensors/1.0/default/Sensors.cpp
+++ b/sensors/1.0/default/Sensors.cpp
@@ -42,10 +42,12 @@ static Result ResultFromStatus(status_t err) {
switch (err) {
case OK:
return Result::OK;
- case BAD_VALUE:
- return Result::BAD_VALUE;
case PERMISSION_DENIED:
return Result::PERMISSION_DENIED;
+ case NO_MEMORY:
+ return Result::NO_MEMORY;
+ case BAD_VALUE:
+ return Result::BAD_VALUE;
default:
return Result::INVALID_OPERATION;
}
@@ -227,27 +229,68 @@ Return<Result> Sensors::injectSensorData(const Event& event) {
Return<void> Sensors::registerDirectChannel(
const SharedMemInfo& mem, registerDirectChannel_cb _hidl_cb) {
- //TODO(b/30985702): finish implementation
- (void) mem;
- _hidl_cb(Result::INVALID_OPERATION, -1);
+ if (mSensorDevice->register_direct_channel == nullptr
+ || mSensorDevice->config_direct_report == nullptr) {
+ // HAL does not support
+ _hidl_cb(Result::INVALID_OPERATION, -1);
+ return Void();
+ }
+
+ sensors_direct_mem_t m;
+ if (!convertFromSharedMemInfo(mem, &m)) {
+ _hidl_cb(Result::BAD_VALUE, -1);
+ return Void();
+ }
+
+ int err = mSensorDevice->register_direct_channel(mSensorDevice, &m, -1);
+
+ if (err < 0) {
+ _hidl_cb(ResultFromStatus(err), -1);
+ } else {
+ int32_t channelHandle = static_cast<int32_t>(err);
+ _hidl_cb(Result::OK, channelHandle);
+ }
return Void();
}
Return<Result> Sensors::unregisterDirectChannel(int32_t channelHandle) {
- //TODO(b/30985702): finish implementation
- (void) channelHandle;
- return Result::INVALID_OPERATION;
+ if (mSensorDevice->register_direct_channel == nullptr
+ || mSensorDevice->config_direct_report == nullptr) {
+ // HAL does not support
+ return Result::INVALID_OPERATION;
+ }
+
+ mSensorDevice->register_direct_channel(mSensorDevice, nullptr, channelHandle);
+
+ return Result::OK;
}
Return<void> Sensors::configDirectReport(
int32_t sensorHandle, int32_t channelHandle, RateLevel rate,
configDirectReport_cb _hidl_cb) {
- //TODO(b/30985702): finish implementation
- (void) sensorHandle;
- (void) channelHandle;
- (void) rate;
+ if (mSensorDevice->register_direct_channel == nullptr
+ || mSensorDevice->config_direct_report == nullptr) {
+ // HAL does not support
+ _hidl_cb(Result::INVALID_OPERATION, -1);
+ return Void();
+ }
- _hidl_cb(Result::INVALID_OPERATION, -1);
+ sensors_direct_cfg_t cfg = {
+ .rate_level = convertFromRateLevel(rate)
+ };
+ if (cfg.rate_level < 0) {
+ _hidl_cb(Result::BAD_VALUE, -1);
+ return Void();
+ }
+
+ int err = mSensorDevice->config_direct_report(mSensorDevice,
+ sensorHandle, channelHandle, &cfg);
+
+ if (rate == RateLevel::STOP) {
+ _hidl_cb(ResultFromStatus(err), -1);
+ } else {
+ _hidl_cb(err > 0 ? Result::OK : ResultFromStatus(err), err);
+ }
return Void();
}