diff options
author | Peng Xu <pengxu@google.com> | 2017-01-19 00:56:04 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2017-01-19 00:56:04 +0000 |
commit | 84660153a996dd6eb6aaef661232013d366936c7 (patch) | |
tree | 146c40b32c88f07c96a6c5724d579c294f447cad /sensors/1.0/default/Sensors.cpp | |
parent | f19d03bb0fe5136f9d3284b89112a2f7afe77698 (diff) | |
parent | 89df2e70642a380357960e07f53e46929e9be002 (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.cpp | 69 |
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(); } |