Loading services/sensorservice/SensorDevice.cpp +27 −27 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ using android::hardware::sensors::V2_1::ISensorsCallback; using android::hardware::sensors::V2_1::implementation::convertToNewEvents; using android::hardware::sensors::V2_1::implementation::convertToNewSensorInfos; using android::hardware::sensors::V2_1::implementation::convertToOldSensorInfo; using android::hardware::sensors::V2_1::implementation::convertToSensor; using android::hardware::sensors::V2_1::implementation::ISensorsWrapperV1_0; using android::hardware::sensors::V2_1::implementation::ISensorsWrapperV2_0; using android::hardware::sensors::V2_1::implementation::ISensorsWrapperV2_1; Loading Loading @@ -98,19 +99,26 @@ struct SensorsCallback : public ISensorsCallback { Return<void> onDynamicSensorsConnected_2_1( const hidl_vec<SensorInfo>& dynamicSensorsAdded) override { return SensorDevice::getInstance().onDynamicSensorsConnected(dynamicSensorsAdded); std::vector<sensor_t> sensors; for (const V2_1::SensorInfo& info : dynamicSensorsAdded) { sensor_t sensor; convertToSensor(info, &sensor); sensors.push_back(sensor); } SensorDevice::getInstance().onDynamicSensorsConnected(sensors); return Return<void>(); } Return<void> onDynamicSensorsConnected( const hidl_vec<V1_0::SensorInfo>& dynamicSensorsAdded) override { return SensorDevice::getInstance().onDynamicSensorsConnected( convertToNewSensorInfos(dynamicSensorsAdded)); return onDynamicSensorsConnected_2_1(convertToNewSensorInfos(dynamicSensorsAdded)); } Return<void> onDynamicSensorsDisconnected( const hidl_vec<int32_t>& dynamicSensorHandlesRemoved) override { return SensorDevice::getInstance().onDynamicSensorsDisconnected( dynamicSensorHandlesRemoved); SensorDevice::getInstance().onDynamicSensorsDisconnected(dynamicSensorHandlesRemoved); return Return<void>(); } }; Loading Loading @@ -138,7 +146,7 @@ void SensorDevice::initializeSensorList() { Info model; for (size_t i = 0; i < count; i++) { sensor_t sensor; convertToSensor(convertToOldSensorInfo(list[i]), &sensor); convertToSensor(list[i], &sensor); if (sensor.type < static_cast<int>(SensorType::DEVICE_PRIVATE_BASE)) { sensor.resolution = SensorDeviceUtils::resolutionForSensor(sensor); Loading Loading @@ -289,8 +297,9 @@ SensorDevice::HalConnectionStatus SensorDevice::initializeHidlServiceV2_X() { CHECK(mSensors != nullptr && mWakeLockQueue != nullptr && mEventQueueFlag != nullptr && mWakeLockQueueFlag != nullptr); status_t status = checkReturnAndGetStatus( mSensors->initialize(*mWakeLockQueue->getDesc(), new SensorsCallback())); mCallback = new SensorsCallback(); status_t status = checkReturnAndGetStatus(mSensors->initialize(*mWakeLockQueue->getDesc(), mCallback)); if (status != NO_ERROR) { connectionStatus = HalConnectionStatus::FAILED_TO_CONNECT; Loading Loading @@ -609,34 +618,26 @@ ssize_t SensorDevice::pollFmq(sensors_event_t* buffer, size_t maxNumEventsToRead return eventsRead; } Return<void> SensorDevice::onDynamicSensorsConnected( const hidl_vec<SensorInfo>& dynamicSensorsAdded) { void SensorDevice::onDynamicSensorsConnected(const std::vector<sensor_t>& dynamicSensorsAdded) { std::unique_lock<std::mutex> lock(mDynamicSensorsMutex); // Allocate a sensor_t structure for each dynamic sensor added and insert // it into the dictionary of connected dynamic sensors keyed by handle. for (size_t i = 0; i < dynamicSensorsAdded.size(); ++i) { const SensorInfo& info = dynamicSensorsAdded[i]; const sensor_t& sensor = dynamicSensorsAdded[i]; auto it = mConnectedDynamicSensors.find(info.sensorHandle); auto it = mConnectedDynamicSensors.find(sensor.handle); CHECK(it == mConnectedDynamicSensors.end()); sensor_t* sensor = new sensor_t(); convertToSensor(convertToOldSensorInfo(info), sensor); mConnectedDynamicSensors.insert(std::make_pair(sensor->handle, sensor)); mConnectedDynamicSensors.insert(std::make_pair(sensor.handle, sensor)); } mDynamicSensorsCv.notify_all(); return Return<void>(); } Return<void> SensorDevice::onDynamicSensorsDisconnected( const hidl_vec<int32_t>& dynamicSensorHandlesRemoved) { (void)dynamicSensorHandlesRemoved; void SensorDevice::onDynamicSensorsDisconnected( const std::vector<int32_t>& /* dynamicSensorHandlesRemoved */) { // TODO: Currently dynamic sensors do not seem to be removed return Return<void>(); } void SensorDevice::writeWakeLockHandled(uint32_t count) { Loading Loading @@ -710,7 +711,6 @@ status_t SensorDevice::activateLocked(void* ident, int handle, int enabled) { // dictionary. auto it = mConnectedDynamicSensors.find(handle); if (it != mConnectedDynamicSensors.end()) { delete it->second; mConnectedDynamicSensors.erase(it); } Loading Loading @@ -1176,7 +1176,7 @@ void SensorDevice::convertToSensorEvent(const Event& src, sensors_event_t* dst) CHECK(it != mConnectedDynamicSensors.end()); } dst->dynamic_sensor_meta.sensor = it->second; dst->dynamic_sensor_meta.sensor = &it->second; memcpy(dst->dynamic_sensor_meta.uuid, dyn.uuid.data(), sizeof(dst->dynamic_sensor_meta.uuid)); Loading @@ -1187,8 +1187,8 @@ void SensorDevice::convertToSensorEvent(const Event& src, sensors_event_t* dst) void SensorDevice::convertToSensorEventsAndQuantize(const hidl_vec<Event>& src, const hidl_vec<SensorInfo>& dynamicSensorsAdded, sensors_event_t* dst) { if (dynamicSensorsAdded.size() > 0) { onDynamicSensorsConnected(dynamicSensorsAdded); if (dynamicSensorsAdded.size() > 0 && mCallback != nullptr) { mCallback->onDynamicSensorsConnected_2_1(dynamicSensorsAdded); } for (size_t i = 0; i < src.size(); ++i) { Loading @@ -1208,7 +1208,7 @@ float SensorDevice::getResolutionForSensor(int sensorHandle) { auto it = mConnectedDynamicSensors.find(sensorHandle); if (it != mConnectedDynamicSensors.end()) { return it->second->resolution; return it->second.resolution; } return 0; Loading services/sensorservice/SensorDevice.h +7 −6 Original line number Diff line number Diff line Loading @@ -43,6 +43,8 @@ namespace android { using Result = ::android::hardware::sensors::V1_0::Result; // --------------------------------------------------------------------------- class SensorsHalDeathReceivier : public android::hardware::hidl_death_recipient { virtual void serviceDied(uint64_t cookie, Loading Loading @@ -110,11 +112,8 @@ public: status_t injectSensorData(const sensors_event_t* event); void notifyConnectionDestroyed(void* ident); using Result = ::android::hardware::sensors::V1_0::Result; hardware::Return<void> onDynamicSensorsConnected( const hardware::hidl_vec<hardware::sensors::V2_1::SensorInfo>& dynamicSensorsAdded); hardware::Return<void> onDynamicSensorsDisconnected( const hardware::hidl_vec<int32_t>& dynamicSensorHandlesRemoved); void onDynamicSensorsConnected(const std::vector<sensor_t>& dynamicSensorsAdded); void onDynamicSensorsDisconnected(const std::vector<int32_t>& dynamicSensorHandlesRemoved); void setUidStateForConnection(void* ident, SensorService::UidState state); Loading @@ -134,8 +133,9 @@ private: friend class Singleton<SensorDevice>; sp<::android::hardware::sensors::V2_1::implementation::ISensorsWrapperBase> mSensors; sp<::android::hardware::sensors::V2_1::ISensorsCallback> mCallback; std::vector<sensor_t> mSensorList; std::unordered_map<int32_t, sensor_t*> mConnectedDynamicSensors; std::unordered_map<int32_t, sensor_t> mConnectedDynamicSensors; // A bug in the Sensors HIDL spec which marks onDynamicSensorsConnected as oneway causes dynamic // meta events and onDynamicSensorsConnected to be received out of order. This mutex + CV are Loading Loading @@ -262,6 +262,7 @@ private: handleHidlDeath(ret.description()); } } status_t checkReturnAndGetStatus(const Return<Result>& ret); // TODO(b/67425500): remove waiter after bug is resolved. sp<SensorDeviceUtils::HidlServiceRegistrationWaiter> mRestartWaiter; Loading Loading
services/sensorservice/SensorDevice.cpp +27 −27 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ using android::hardware::sensors::V2_1::ISensorsCallback; using android::hardware::sensors::V2_1::implementation::convertToNewEvents; using android::hardware::sensors::V2_1::implementation::convertToNewSensorInfos; using android::hardware::sensors::V2_1::implementation::convertToOldSensorInfo; using android::hardware::sensors::V2_1::implementation::convertToSensor; using android::hardware::sensors::V2_1::implementation::ISensorsWrapperV1_0; using android::hardware::sensors::V2_1::implementation::ISensorsWrapperV2_0; using android::hardware::sensors::V2_1::implementation::ISensorsWrapperV2_1; Loading Loading @@ -98,19 +99,26 @@ struct SensorsCallback : public ISensorsCallback { Return<void> onDynamicSensorsConnected_2_1( const hidl_vec<SensorInfo>& dynamicSensorsAdded) override { return SensorDevice::getInstance().onDynamicSensorsConnected(dynamicSensorsAdded); std::vector<sensor_t> sensors; for (const V2_1::SensorInfo& info : dynamicSensorsAdded) { sensor_t sensor; convertToSensor(info, &sensor); sensors.push_back(sensor); } SensorDevice::getInstance().onDynamicSensorsConnected(sensors); return Return<void>(); } Return<void> onDynamicSensorsConnected( const hidl_vec<V1_0::SensorInfo>& dynamicSensorsAdded) override { return SensorDevice::getInstance().onDynamicSensorsConnected( convertToNewSensorInfos(dynamicSensorsAdded)); return onDynamicSensorsConnected_2_1(convertToNewSensorInfos(dynamicSensorsAdded)); } Return<void> onDynamicSensorsDisconnected( const hidl_vec<int32_t>& dynamicSensorHandlesRemoved) override { return SensorDevice::getInstance().onDynamicSensorsDisconnected( dynamicSensorHandlesRemoved); SensorDevice::getInstance().onDynamicSensorsDisconnected(dynamicSensorHandlesRemoved); return Return<void>(); } }; Loading Loading @@ -138,7 +146,7 @@ void SensorDevice::initializeSensorList() { Info model; for (size_t i = 0; i < count; i++) { sensor_t sensor; convertToSensor(convertToOldSensorInfo(list[i]), &sensor); convertToSensor(list[i], &sensor); if (sensor.type < static_cast<int>(SensorType::DEVICE_PRIVATE_BASE)) { sensor.resolution = SensorDeviceUtils::resolutionForSensor(sensor); Loading Loading @@ -289,8 +297,9 @@ SensorDevice::HalConnectionStatus SensorDevice::initializeHidlServiceV2_X() { CHECK(mSensors != nullptr && mWakeLockQueue != nullptr && mEventQueueFlag != nullptr && mWakeLockQueueFlag != nullptr); status_t status = checkReturnAndGetStatus( mSensors->initialize(*mWakeLockQueue->getDesc(), new SensorsCallback())); mCallback = new SensorsCallback(); status_t status = checkReturnAndGetStatus(mSensors->initialize(*mWakeLockQueue->getDesc(), mCallback)); if (status != NO_ERROR) { connectionStatus = HalConnectionStatus::FAILED_TO_CONNECT; Loading Loading @@ -609,34 +618,26 @@ ssize_t SensorDevice::pollFmq(sensors_event_t* buffer, size_t maxNumEventsToRead return eventsRead; } Return<void> SensorDevice::onDynamicSensorsConnected( const hidl_vec<SensorInfo>& dynamicSensorsAdded) { void SensorDevice::onDynamicSensorsConnected(const std::vector<sensor_t>& dynamicSensorsAdded) { std::unique_lock<std::mutex> lock(mDynamicSensorsMutex); // Allocate a sensor_t structure for each dynamic sensor added and insert // it into the dictionary of connected dynamic sensors keyed by handle. for (size_t i = 0; i < dynamicSensorsAdded.size(); ++i) { const SensorInfo& info = dynamicSensorsAdded[i]; const sensor_t& sensor = dynamicSensorsAdded[i]; auto it = mConnectedDynamicSensors.find(info.sensorHandle); auto it = mConnectedDynamicSensors.find(sensor.handle); CHECK(it == mConnectedDynamicSensors.end()); sensor_t* sensor = new sensor_t(); convertToSensor(convertToOldSensorInfo(info), sensor); mConnectedDynamicSensors.insert(std::make_pair(sensor->handle, sensor)); mConnectedDynamicSensors.insert(std::make_pair(sensor.handle, sensor)); } mDynamicSensorsCv.notify_all(); return Return<void>(); } Return<void> SensorDevice::onDynamicSensorsDisconnected( const hidl_vec<int32_t>& dynamicSensorHandlesRemoved) { (void)dynamicSensorHandlesRemoved; void SensorDevice::onDynamicSensorsDisconnected( const std::vector<int32_t>& /* dynamicSensorHandlesRemoved */) { // TODO: Currently dynamic sensors do not seem to be removed return Return<void>(); } void SensorDevice::writeWakeLockHandled(uint32_t count) { Loading Loading @@ -710,7 +711,6 @@ status_t SensorDevice::activateLocked(void* ident, int handle, int enabled) { // dictionary. auto it = mConnectedDynamicSensors.find(handle); if (it != mConnectedDynamicSensors.end()) { delete it->second; mConnectedDynamicSensors.erase(it); } Loading Loading @@ -1176,7 +1176,7 @@ void SensorDevice::convertToSensorEvent(const Event& src, sensors_event_t* dst) CHECK(it != mConnectedDynamicSensors.end()); } dst->dynamic_sensor_meta.sensor = it->second; dst->dynamic_sensor_meta.sensor = &it->second; memcpy(dst->dynamic_sensor_meta.uuid, dyn.uuid.data(), sizeof(dst->dynamic_sensor_meta.uuid)); Loading @@ -1187,8 +1187,8 @@ void SensorDevice::convertToSensorEvent(const Event& src, sensors_event_t* dst) void SensorDevice::convertToSensorEventsAndQuantize(const hidl_vec<Event>& src, const hidl_vec<SensorInfo>& dynamicSensorsAdded, sensors_event_t* dst) { if (dynamicSensorsAdded.size() > 0) { onDynamicSensorsConnected(dynamicSensorsAdded); if (dynamicSensorsAdded.size() > 0 && mCallback != nullptr) { mCallback->onDynamicSensorsConnected_2_1(dynamicSensorsAdded); } for (size_t i = 0; i < src.size(); ++i) { Loading @@ -1208,7 +1208,7 @@ float SensorDevice::getResolutionForSensor(int sensorHandle) { auto it = mConnectedDynamicSensors.find(sensorHandle); if (it != mConnectedDynamicSensors.end()) { return it->second->resolution; return it->second.resolution; } return 0; Loading
services/sensorservice/SensorDevice.h +7 −6 Original line number Diff line number Diff line Loading @@ -43,6 +43,8 @@ namespace android { using Result = ::android::hardware::sensors::V1_0::Result; // --------------------------------------------------------------------------- class SensorsHalDeathReceivier : public android::hardware::hidl_death_recipient { virtual void serviceDied(uint64_t cookie, Loading Loading @@ -110,11 +112,8 @@ public: status_t injectSensorData(const sensors_event_t* event); void notifyConnectionDestroyed(void* ident); using Result = ::android::hardware::sensors::V1_0::Result; hardware::Return<void> onDynamicSensorsConnected( const hardware::hidl_vec<hardware::sensors::V2_1::SensorInfo>& dynamicSensorsAdded); hardware::Return<void> onDynamicSensorsDisconnected( const hardware::hidl_vec<int32_t>& dynamicSensorHandlesRemoved); void onDynamicSensorsConnected(const std::vector<sensor_t>& dynamicSensorsAdded); void onDynamicSensorsDisconnected(const std::vector<int32_t>& dynamicSensorHandlesRemoved); void setUidStateForConnection(void* ident, SensorService::UidState state); Loading @@ -134,8 +133,9 @@ private: friend class Singleton<SensorDevice>; sp<::android::hardware::sensors::V2_1::implementation::ISensorsWrapperBase> mSensors; sp<::android::hardware::sensors::V2_1::ISensorsCallback> mCallback; std::vector<sensor_t> mSensorList; std::unordered_map<int32_t, sensor_t*> mConnectedDynamicSensors; std::unordered_map<int32_t, sensor_t> mConnectedDynamicSensors; // A bug in the Sensors HIDL spec which marks onDynamicSensorsConnected as oneway causes dynamic // meta events and onDynamicSensorsConnected to be received out of order. This mutex + CV are Loading Loading @@ -262,6 +262,7 @@ private: handleHidlDeath(ret.description()); } } status_t checkReturnAndGetStatus(const Return<Result>& ret); // TODO(b/67425500): remove waiter after bug is resolved. sp<SensorDeviceUtils::HidlServiceRegistrationWaiter> mRestartWaiter; Loading