Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 65b59819 authored by Arthur Ishiguro's avatar Arthur Ishiguro
Browse files

Refactor dynamic sensors logic

Bug: 195593357
Test: Load on device
Change-Id: Ia1fffc52a23b77e077802edce729722f25e722f0
parent 39e04c65
Loading
Loading
Loading
Loading
+17 −43
Original line number Diff line number Diff line
@@ -143,10 +143,11 @@ 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) {
        auto ret = mSensors->poll(count,
                                  [&](auto result, const auto& events,
                                      const auto& dynamicSensorsAdded) {
                                      if (result == Result::OK) {
                        convertToSensorEventsAndQuantize(convertToNewEvents(events),
                                          convertToSensorEvents(convertToNewEvents(events),
                                                                convertToNewSensorInfos(
                                                                        dynamicSensorsAdded),
                                                                buffer);
@@ -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,
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]);
    }
}

+3 −8
Original line number Diff line number Diff line
@@ -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,7 +147,7 @@ private:

    void convertToSensorEvent(const Event& src, sensors_event_t* dst);

    void convertToSensorEventsAndQuantize(const hardware::hidl_vec<Event>& src,
    void convertToSensorEvents(const hardware::hidl_vec<Event>& src,
                               const hardware::hidl_vec<SensorInfo>& dynamicSensorsAdded,
                               sensors_event_t* dst);

+23 −0
Original line number Diff line number Diff line
@@ -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;
                }
            }
        }
    }

+1 −0
Original line number Diff line number Diff line
@@ -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