[sensors] Default implementation and vts of direct report
Added support for newly added HAL function for sensor event direct
report feature, replace dummy implementation with funtional ones for
the following:
* registerDirectChannel
* unregisterDirectChannel
* configDirectReport
Added a vts test case for direct report.
Added new offset definition to types.hal. This will not affect
existing client/calling code.
Bug: 30985702
Bug: 32022776
Test: vts pass
Change-Id: Ie5e3cddd7c37664e8c59d69cf70aaa1310fd3f58
diff --git a/sensors/1.0/default/Sensors.cpp b/sensors/1.0/default/Sensors.cpp
index 8903397..aadf848 100644
--- a/sensors/1.0/default/Sensors.cpp
+++ b/sensors/1.0/default/Sensors.cpp
@@ -42,10 +42,12 @@
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;
}
@@ -226,27 +228,68 @@
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();
}