diff options
| author | 2021-12-26 19:09:54 +0000 | |
|---|---|---|
| committer | 2021-12-26 19:17:50 +0000 | |
| commit | 65b5981900ba3e5cc654c46eee3bffd938ec5d70 (patch) | |
| tree | f67b39143413548287b658ed29e9f60b8e888ddc | |
| parent | 39e04c65ded1c43bbe0e39325bde03db21428619 (diff) | |
Refactor dynamic sensors logic
Bug: 195593357
Test: Load on device
Change-Id: Ia1fffc52a23b77e077802edce729722f25e722f0
| -rw-r--r-- | services/sensorservice/HidlSensorHalWrapper.cpp | 60 | ||||
| -rw-r--r-- | services/sensorservice/HidlSensorHalWrapper.h | 11 | ||||
| -rw-r--r-- | services/sensorservice/SensorDevice.cpp | 23 | ||||
| -rw-r--r-- | services/sensorservice/SensorDevice.h | 1 |
4 files changed, 44 insertions, 51 deletions
diff --git a/services/sensorservice/HidlSensorHalWrapper.cpp b/services/sensorservice/HidlSensorHalWrapper.cpp index 31652adaa5..4c64e59615 100644 --- a/services/sensorservice/HidlSensorHalWrapper.cpp +++ b/services/sensorservice/HidlSensorHalWrapper.cpp @@ -143,18 +143,19 @@ ssize_t HidlSensorHalWrapper::poll(sensors_event_t* buffer, size_t count) { bool hidlTransportError = false; do { - auto ret = mSensors->poll( - count, [&](auto result, const auto& events, const auto& dynamicSensorsAdded) { - if (result == Result::OK) { - convertToSensorEventsAndQuantize(convertToNewEvents(events), - convertToNewSensorInfos( - dynamicSensorsAdded), - buffer); - err = (ssize_t)events.size(); - } else { - err = statusFromResult(result); - } - }); + auto ret = mSensors->poll(count, + [&](auto result, const auto& events, + const auto& dynamicSensorsAdded) { + if (result == Result::OK) { + convertToSensorEvents(convertToNewEvents(events), + convertToNewSensorInfos( + dynamicSensorsAdded), + buffer); + err = (ssize_t)events.size(); + } else { + err = statusFromResult(result); + } + }); if (ret.isOk()) { hidlTransportError = false; @@ -497,44 +498,17 @@ ISensorHalWrapper::HalConnectionStatus HidlSensorHalWrapper::initializeHidlServi void HidlSensorHalWrapper::convertToSensorEvent(const Event& src, sensors_event_t* dst) { android::hardware::sensors::V2_1::implementation::convertToSensorEvent(src, dst); - - if (src.sensorType == android::hardware::sensors::V2_1::SensorType::DYNAMIC_SENSOR_META) { - const hardware::sensors::V1_0::DynamicSensorInfo& dyn = src.u.dynamic; - - dst->dynamic_sensor_meta.connected = dyn.connected; - dst->dynamic_sensor_meta.handle = dyn.sensorHandle; - if (dyn.connected) { - std::unique_lock<std::mutex> lock(mDynamicSensorsMutex); - // Give MAX_DYN_SENSOR_WAIT_SEC for onDynamicSensorsConnected to be invoked since it - // can be received out of order from this event due to a bug in the HIDL spec that - // marks it as oneway. - auto it = mConnectedDynamicSensors.find(dyn.sensorHandle); - if (it == mConnectedDynamicSensors.end()) { - mDynamicSensorsCv.wait_for(lock, MAX_DYN_SENSOR_WAIT, [&, dyn] { - return mConnectedDynamicSensors.find(dyn.sensorHandle) != - mConnectedDynamicSensors.end(); - }); - it = mConnectedDynamicSensors.find(dyn.sensorHandle); - CHECK(it != mConnectedDynamicSensors.end()); - } - - dst->dynamic_sensor_meta.sensor = &it->second; - - memcpy(dst->dynamic_sensor_meta.uuid, dyn.uuid.data(), - sizeof(dst->dynamic_sensor_meta.uuid)); - } - } } -void HidlSensorHalWrapper::convertToSensorEventsAndQuantize( - const hidl_vec<Event>& src, const hidl_vec<SensorInfo>& dynamicSensorsAdded, - sensors_event_t* dst) { +void HidlSensorHalWrapper::convertToSensorEvents(const hidl_vec<Event>& src, + const hidl_vec<SensorInfo>& dynamicSensorsAdded, + sensors_event_t* dst) { if (dynamicSensorsAdded.size() > 0 && mCallback != nullptr) { mCallback->onDynamicSensorsConnected_2_1(dynamicSensorsAdded); } for (size_t i = 0; i < src.size(); ++i) { - android::hardware::sensors::V2_1::implementation::convertToSensorEvent(src[i], &dst[i]); + convertToSensorEvent(src[i], &dst[i]); } } diff --git a/services/sensorservice/HidlSensorHalWrapper.h b/services/sensorservice/HidlSensorHalWrapper.h index 2a3a4f4bae..71c3512742 100644 --- a/services/sensorservice/HidlSensorHalWrapper.h +++ b/services/sensorservice/HidlSensorHalWrapper.h @@ -124,11 +124,6 @@ public: private: sp<::android::hardware::sensors::V2_1::implementation::ISensorsWrapperBase> mSensors; sp<::android::hardware::sensors::V2_1::ISensorsCallback> mCallback; - std::unordered_map<int32_t, sensor_t> mConnectedDynamicSensors; - - std::mutex mDynamicSensorsMutex; - std::condition_variable mDynamicSensorsCv; - static constexpr std::chrono::seconds MAX_DYN_SENSOR_WAIT{5}; // Keep track of any hidl transport failures SensorServiceUtil::RingBuffer<HidlTransportErrorLog> mHidlTransportErrors; @@ -152,9 +147,9 @@ private: void convertToSensorEvent(const Event& src, sensors_event_t* dst); - void convertToSensorEventsAndQuantize(const hardware::hidl_vec<Event>& src, - const hardware::hidl_vec<SensorInfo>& dynamicSensorsAdded, - sensors_event_t* dst); + void convertToSensorEvents(const hardware::hidl_vec<Event>& src, + const hardware::hidl_vec<SensorInfo>& dynamicSensorsAdded, + sensors_event_t* dst); bool connectHidlService(); diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp index ee63735921..3ed4d5ea7f 100644 --- a/services/sensorservice/SensorDevice.cpp +++ b/services/sensorservice/SensorDevice.cpp @@ -24,6 +24,8 @@ #include <android/util/ProtoOutputStream.h> #include <cutils/atomic.h> #include <frameworks/base/core/proto/android/service/sensor_service.proto.h> +#include <hardware/sensors-base.h> +#include <hardware/sensors.h> #include <sensors/convert.h> #include <utils/Errors.h> #include <utils/Singleton.h> @@ -354,6 +356,27 @@ ssize_t SensorDevice::poll(sensors_event_t* buffer, size_t count) { for (ssize_t i = 0; i < eventsRead; i++) { float resolution = getResolutionForSensor(buffer[i].sensor); android::SensorDeviceUtils::quantizeSensorEventValues(&buffer[i], resolution); + + if (buffer[i].type == SENSOR_TYPE_DYNAMIC_SENSOR_META) { + struct dynamic_sensor_meta_event& dyn = buffer[i].dynamic_sensor_meta; + if (dyn.connected) { + std::unique_lock<std::mutex> lock(mDynamicSensorsMutex); + // Give MAX_DYN_SENSOR_WAIT_SEC for onDynamicSensorsConnected to be invoked + // since it can be received out of order from this event due to a bug in the + // HIDL spec that marks it as oneway. + auto it = mConnectedDynamicSensors.find(dyn.handle); + if (it == mConnectedDynamicSensors.end()) { + mDynamicSensorsCv.wait_for(lock, MAX_DYN_SENSOR_WAIT, [&, dyn] { + return mConnectedDynamicSensors.find(dyn.handle) != + mConnectedDynamicSensors.end(); + }); + it = mConnectedDynamicSensors.find(dyn.handle); + CHECK(it != mConnectedDynamicSensors.end()); + } + + dyn.sensor = &it->second; + } + } } } diff --git a/services/sensorservice/SensorDevice.h b/services/sensorservice/SensorDevice.h index 80e77d96d4..747a6b0926 100644 --- a/services/sensorservice/SensorDevice.h +++ b/services/sensorservice/SensorDevice.h @@ -119,6 +119,7 @@ private: // HAL implementations. std::mutex mDynamicSensorsMutex; std::condition_variable mDynamicSensorsCv; + static constexpr std::chrono::seconds MAX_DYN_SENSOR_WAIT{5}; static const nsecs_t MINIMUM_EVENTS_PERIOD = 1000000; // 1000 Hz mutable Mutex mLock; // protect mActivationCount[].batchParams |