Loading services/vibratorservice/VibratorHalController.cpp +12 −0 Original line number Original line Diff line number Diff line Loading @@ -209,6 +209,18 @@ HalResult<std::vector<CompositePrimitive>> HalController::getSupportedPrimitives return apply(getSupportedPrimitivesFn, "getSupportedPrimitives"); return apply(getSupportedPrimitivesFn, "getSupportedPrimitives"); } } HalResult<float> HalController::getResonantFrequency() { hal_fn<float> getResonantFrequencyFn = [](std::shared_ptr<HalWrapper> hal) { return hal->getResonantFrequency(); }; return apply(getResonantFrequencyFn, "getResonantFrequency"); } HalResult<float> HalController::getQFactor() { hal_fn<float> getQFactorFn = [](std::shared_ptr<HalWrapper> hal) { return hal->getQFactor(); }; return apply(getQFactorFn, "getQFactor"); } HalResult<milliseconds> HalController::performEffect( HalResult<milliseconds> HalController::performEffect( Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) { Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) { hal_fn<milliseconds> performEffectFn = [&](std::shared_ptr<HalWrapper> hal) { hal_fn<milliseconds> performEffectFn = [&](std::shared_ptr<HalWrapper> hal) { Loading services/vibratorservice/VibratorHalWrapper.cpp +35 −0 Original line number Original line Diff line number Diff line Loading @@ -205,6 +205,17 @@ HalResult<std::vector<CompositePrimitive>> AidlHalWrapper::getSupportedPrimitive mSupportedPrimitives); mSupportedPrimitives); } } HalResult<float> AidlHalWrapper::getResonantFrequency() { std::lock_guard<std::mutex> lock(mResonantFrequencyMutex); return loadCached<float>(std::bind(&AidlHalWrapper::getResonantFrequencyInternal, this), mResonantFrequency); } HalResult<float> AidlHalWrapper::getQFactor() { std::lock_guard<std::mutex> lock(mQFactorMutex); return loadCached<float>(std::bind(&AidlHalWrapper::getQFactorInternal, this), mQFactor); } HalResult<milliseconds> AidlHalWrapper::performEffect( HalResult<milliseconds> AidlHalWrapper::performEffect( Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) { Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) { HalResult<Capabilities> capabilities = getCapabilities(); HalResult<Capabilities> capabilities = getCapabilities(); Loading Loading @@ -283,6 +294,18 @@ HalResult<std::vector<CompositePrimitive>> AidlHalWrapper::getSupportedPrimitive return HalResult<std::vector<CompositePrimitive>>::fromStatus(result, supportedPrimitives); return HalResult<std::vector<CompositePrimitive>>::fromStatus(result, supportedPrimitives); } } HalResult<float> AidlHalWrapper::getResonantFrequencyInternal() { float f0 = 0; auto result = getHal()->getResonantFrequency(&f0); return HalResult<float>::fromStatus(result, f0); } HalResult<float> AidlHalWrapper::getQFactorInternal() { float qFactor = 0; auto result = getHal()->getQFactor(&qFactor); return HalResult<float>::fromStatus(result, qFactor); } sp<Aidl::IVibrator> AidlHalWrapper::getHal() { sp<Aidl::IVibrator> AidlHalWrapper::getHal() { std::lock_guard<std::mutex> lock(mHandleMutex); std::lock_guard<std::mutex> lock(mHandleMutex); return mHandle; return mHandle; Loading Loading @@ -365,6 +388,18 @@ HalResult<std::vector<CompositePrimitive>> HidlHalWrapper<I>::getSupportedPrimit return HalResult<std::vector<CompositePrimitive>>::unsupported(); return HalResult<std::vector<CompositePrimitive>>::unsupported(); } } template <typename I> HalResult<float> HidlHalWrapper<I>::getResonantFrequency() { ALOGV("Skipped getResonantFrequency because Vibrator HAL AIDL is not available"); return HalResult<float>::unsupported(); } template <typename I> HalResult<float> HidlHalWrapper<I>::getQFactor() { ALOGV("Skipped getQFactor because Vibrator HAL AIDL is not available"); return HalResult<float>::unsupported(); } template <typename I> template <typename I> HalResult<std::chrono::milliseconds> HidlHalWrapper<I>::performComposedEffect( HalResult<std::chrono::milliseconds> HidlHalWrapper<I>::performComposedEffect( const std::vector<CompositeEffect>&, const std::function<void()>&) { const std::vector<CompositeEffect>&, const std::function<void()>&) { Loading services/vibratorservice/include/vibratorservice/VibratorHalController.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -73,6 +73,9 @@ public: HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() final override; final override; HalResult<float> getResonantFrequency() final override; HalResult<float> getQFactor() final override; HalResult<std::chrono::milliseconds> performEffect( HalResult<std::chrono::milliseconds> performEffect( hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, const std::function<void()>& completionCallback) final override; const std::function<void()>& completionCallback) final override; Loading services/vibratorservice/include/vibratorservice/VibratorHalWrapper.h +17 −0 Original line number Original line Diff line number Diff line Loading @@ -185,6 +185,9 @@ public: virtual HalResult<std::vector<hardware::vibrator::CompositePrimitive>> virtual HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() = 0; getSupportedPrimitives() = 0; virtual HalResult<float> getResonantFrequency() = 0; virtual HalResult<float> getQFactor() = 0; virtual HalResult<std::chrono::milliseconds> performEffect( virtual HalResult<std::chrono::milliseconds> performEffect( hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, const std::function<void()>& completionCallback) = 0; const std::function<void()>& completionCallback) = 0; Loading Loading @@ -232,6 +235,9 @@ public: HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() override final; override final; HalResult<float> getResonantFrequency() override final; HalResult<float> getQFactor() override final; HalResult<std::chrono::milliseconds> performEffect( HalResult<std::chrono::milliseconds> performEffect( hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, const std::function<void()>& completionCallback) override final; const std::function<void()>& completionCallback) override final; Loading @@ -246,6 +252,8 @@ private: std::mutex mCapabilitiesMutex; std::mutex mCapabilitiesMutex; std::mutex mSupportedEffectsMutex; std::mutex mSupportedEffectsMutex; std::mutex mSupportedPrimitivesMutex; std::mutex mSupportedPrimitivesMutex; std::mutex mResonantFrequencyMutex; std::mutex mQFactorMutex; sp<hardware::vibrator::IVibrator> mHandle GUARDED_BY(mHandleMutex); sp<hardware::vibrator::IVibrator> mHandle GUARDED_BY(mHandleMutex); std::optional<Capabilities> mCapabilities GUARDED_BY(mCapabilitiesMutex); std::optional<Capabilities> mCapabilities GUARDED_BY(mCapabilitiesMutex); std::optional<std::vector<hardware::vibrator::Effect>> mSupportedEffects std::optional<std::vector<hardware::vibrator::Effect>> mSupportedEffects Loading @@ -254,6 +262,8 @@ private: GUARDED_BY(mSupportedPrimitivesMutex); GUARDED_BY(mSupportedPrimitivesMutex); std::vector<std::optional<std::chrono::milliseconds>> mPrimitiveDurations std::vector<std::optional<std::chrono::milliseconds>> mPrimitiveDurations GUARDED_BY(mSupportedPrimitivesMutex); GUARDED_BY(mSupportedPrimitivesMutex); std::optional<float> mResonantFrequency GUARDED_BY(mResonantFrequencyMutex); std::optional<float> mQFactor GUARDED_BY(mQFactorMutex); // Loads and caches from IVibrator. // Loads and caches from IVibrator. HalResult<std::chrono::milliseconds> getPrimitiveDuration( HalResult<std::chrono::milliseconds> getPrimitiveDuration( Loading @@ -263,6 +273,10 @@ private: HalResult<Capabilities> getCapabilitiesInternal(); HalResult<Capabilities> getCapabilitiesInternal(); HalResult<std::vector<hardware::vibrator::Effect>> getSupportedEffectsInternal(); HalResult<std::vector<hardware::vibrator::Effect>> getSupportedEffectsInternal(); HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitivesInternal(); HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitivesInternal(); HalResult<float> getResonantFrequencyInternal(); HalResult<float> getQFactorInternal(); sp<hardware::vibrator::IVibrator> getHal(); sp<hardware::vibrator::IVibrator> getHal(); }; }; Loading Loading @@ -293,6 +307,9 @@ public: HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() override final; override final; HalResult<float> getResonantFrequency() override final; HalResult<float> getQFactor() override final; HalResult<std::chrono::milliseconds> performComposedEffect( HalResult<std::chrono::milliseconds> performComposedEffect( const std::vector<hardware::vibrator::CompositeEffect>& primitiveEffects, const std::vector<hardware::vibrator::CompositeEffect>& primitiveEffects, const std::function<void()>& completionCallback) override final; const std::function<void()>& completionCallback) override final; Loading services/vibratorservice/test/VibratorHalControllerTest.cpp +41 −13 Original line number Original line Diff line number Diff line Loading @@ -67,6 +67,10 @@ public: MOCK_METHOD(vibrator::HalResult<std::vector<Effect>>, getSupportedEffects, (), (override)); MOCK_METHOD(vibrator::HalResult<std::vector<Effect>>, getSupportedEffects, (), (override)); MOCK_METHOD(vibrator::HalResult<std::vector<CompositePrimitive>>, getSupportedPrimitives, (), MOCK_METHOD(vibrator::HalResult<std::vector<CompositePrimitive>>, getSupportedPrimitives, (), (override)); (override)); MOCK_METHOD(vibrator::HalResult<float>, getResonantFrequency, (), (override)); MOCK_METHOD(vibrator::HalResult<float>, getQFactor, (), (override)); MOCK_METHOD(vibrator::HalResult<milliseconds>, performEffect, MOCK_METHOD(vibrator::HalResult<milliseconds>, performEffect, (Effect effect, EffectStrength strength, (Effect effect, EffectStrength strength, const std::function<void()>& completionCallback), const std::function<void()>& completionCallback), Loading Loading @@ -106,6 +110,8 @@ protected: vibrator::HalResult<vibrator::Capabilities> capabilitiesResult, vibrator::HalResult<vibrator::Capabilities> capabilitiesResult, vibrator::HalResult<std::vector<Effect>> effectsResult, vibrator::HalResult<std::vector<Effect>> effectsResult, vibrator::HalResult<std::vector<CompositePrimitive>> primitivesResult, vibrator::HalResult<std::vector<CompositePrimitive>> primitivesResult, vibrator::HalResult<float> resonantFrequencyResult, vibrator::HalResult<float> qFactorResult, vibrator::HalResult<milliseconds> durationResult) { vibrator::HalResult<milliseconds> durationResult) { EXPECT_CALL(*mMockHal.get(), ping()) EXPECT_CALL(*mMockHal.get(), ping()) .Times(Exactly(cardinality)) .Times(Exactly(cardinality)) Loading Loading @@ -138,6 +144,12 @@ protected: EXPECT_CALL(*mMockHal.get(), getSupportedPrimitives()) EXPECT_CALL(*mMockHal.get(), getSupportedPrimitives()) .Times(Exactly(cardinality)) .Times(Exactly(cardinality)) .WillRepeatedly(Return(primitivesResult)); .WillRepeatedly(Return(primitivesResult)); EXPECT_CALL(*mMockHal.get(), getResonantFrequency()) .Times(Exactly(cardinality)) .WillRepeatedly(Return(resonantFrequencyResult)); EXPECT_CALL(*mMockHal.get(), getQFactor()) .Times(Exactly(cardinality)) .WillRepeatedly(Return(qFactorResult)); EXPECT_CALL(*mMockHal.get(), performEffect(Eq(Effect::CLICK), Eq(EffectStrength::LIGHT), _)) EXPECT_CALL(*mMockHal.get(), performEffect(Eq(Effect::CLICK), Eq(EffectStrength::LIGHT), _)) .Times(Exactly(cardinality)) .Times(Exactly(cardinality)) .WillRepeatedly(Return(durationResult)); .WillRepeatedly(Return(durationResult)); Loading @@ -147,7 +159,7 @@ protected: if (cardinality > 1) { if (cardinality > 1) { // One reconnection call after each failure. // One reconnection call after each failure. EXPECT_CALL(*mMockHal.get(), tryReconnect()).Times(Exactly(12 * cardinality)); EXPECT_CALL(*mMockHal.get(), tryReconnect()).Times(Exactly(14 * cardinality)); } } } } }; }; Loading @@ -164,23 +176,21 @@ TEST_F(VibratorHalControllerTest, TestInit) { } } TEST_F(VibratorHalControllerTest, TestApiCallsAreForwardedToHal) { TEST_F(VibratorHalControllerTest, TestApiCallsAreForwardedToHal) { std::vector<Effect> effects; std::vector<Effect> effects = {Effect::CLICK, Effect::TICK}; effects.push_back(Effect::CLICK); std::vector<CompositePrimitive> primitives = {CompositePrimitive::CLICK, effects.push_back(Effect::TICK); CompositePrimitive::THUD}; std::vector<CompositePrimitive> primitives; constexpr float F0 = 123.f; primitives.push_back(CompositePrimitive::CLICK); constexpr float Q_FACTOR = 12.f; primitives.push_back(CompositePrimitive::THUD); const std::vector<CompositeEffect> compositeEffects = std::vector<CompositeEffect> compositeEffects; {vibrator::TestFactory::createCompositeEffect(CompositePrimitive::SPIN, 100ms, 0.5f), compositeEffects.push_back( vibrator::TestFactory::createCompositeEffect(CompositePrimitive::THUD, 1000ms, 1.0f)}; vibrator::TestFactory::createCompositeEffect(CompositePrimitive::SPIN, 100ms, 0.5f)); compositeEffects.push_back( vibrator::TestFactory::createCompositeEffect(CompositePrimitive::THUD, 1000ms, 1.0f)); setHalExpectations(/* cardinality= */ 1, compositeEffects, vibrator::HalResult<void>::ok(), setHalExpectations(/* cardinality= */ 1, compositeEffects, vibrator::HalResult<void>::ok(), vibrator::HalResult<vibrator::Capabilities>::ok( vibrator::HalResult<vibrator::Capabilities>::ok( vibrator::Capabilities::ON_CALLBACK), vibrator::Capabilities::ON_CALLBACK), vibrator::HalResult<std::vector<Effect>>::ok(effects), vibrator::HalResult<std::vector<Effect>>::ok(effects), vibrator::HalResult<std::vector<CompositePrimitive>>::ok(primitives), vibrator::HalResult<std::vector<CompositePrimitive>>::ok(primitives), vibrator::HalResult<float>::ok(F0), vibrator::HalResult<float>::ok(Q_FACTOR), vibrator::HalResult<milliseconds>::ok(100ms)); vibrator::HalResult<milliseconds>::ok(100ms)); ASSERT_TRUE(mController->ping().isOk()); ASSERT_TRUE(mController->ping().isOk()); Loading @@ -203,6 +213,14 @@ TEST_F(VibratorHalControllerTest, TestApiCallsAreForwardedToHal) { ASSERT_TRUE(getSupportedPrimitivesResult.isOk()); ASSERT_TRUE(getSupportedPrimitivesResult.isOk()); ASSERT_EQ(primitives, getSupportedPrimitivesResult.value()); ASSERT_EQ(primitives, getSupportedPrimitivesResult.value()); auto getResonantFrequencyResult = mController->getResonantFrequency(); ASSERT_TRUE(getResonantFrequencyResult.isOk()); ASSERT_EQ(F0, getResonantFrequencyResult.value()); auto getQFactorResult = mController->getQFactor(); ASSERT_TRUE(getQFactorResult.isOk()); ASSERT_EQ(Q_FACTOR, getQFactorResult.value()); auto performEffectResult = auto performEffectResult = mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}); mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}); ASSERT_TRUE(performEffectResult.isOk()); ASSERT_TRUE(performEffectResult.isOk()); Loading @@ -222,6 +240,8 @@ TEST_F(VibratorHalControllerTest, TestUnsupportedApiResultDoNotResetHalConnectio vibrator::HalResult<vibrator::Capabilities>::unsupported(), vibrator::HalResult<vibrator::Capabilities>::unsupported(), vibrator::HalResult<std::vector<Effect>>::unsupported(), vibrator::HalResult<std::vector<Effect>>::unsupported(), vibrator::HalResult<std::vector<CompositePrimitive>>::unsupported(), vibrator::HalResult<std::vector<CompositePrimitive>>::unsupported(), vibrator::HalResult<float>::unsupported(), vibrator::HalResult<float>::unsupported(), vibrator::HalResult<milliseconds>::unsupported()); vibrator::HalResult<milliseconds>::unsupported()); ASSERT_EQ(0, mConnectCounter); ASSERT_EQ(0, mConnectCounter); Loading @@ -237,6 +257,8 @@ TEST_F(VibratorHalControllerTest, TestUnsupportedApiResultDoNotResetHalConnectio ASSERT_TRUE(mController->getCapabilities().isUnsupported()); ASSERT_TRUE(mController->getCapabilities().isUnsupported()); ASSERT_TRUE(mController->getSupportedEffects().isUnsupported()); ASSERT_TRUE(mController->getSupportedEffects().isUnsupported()); ASSERT_TRUE(mController->getSupportedPrimitives().isUnsupported()); ASSERT_TRUE(mController->getSupportedPrimitives().isUnsupported()); ASSERT_TRUE(mController->getResonantFrequency().isUnsupported()); ASSERT_TRUE(mController->getQFactor().isUnsupported()); ASSERT_TRUE(mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}) ASSERT_TRUE(mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}) .isUnsupported()); .isUnsupported()); ASSERT_TRUE(mController->performComposedEffect(std::vector<CompositeEffect>(), []() {}) ASSERT_TRUE(mController->performComposedEffect(std::vector<CompositeEffect>(), []() {}) Loading @@ -251,6 +273,8 @@ TEST_F(VibratorHalControllerTest, TestFailedApiResultResetsHalConnection) { vibrator::HalResult<vibrator::Capabilities>::failed("message"), vibrator::HalResult<vibrator::Capabilities>::failed("message"), vibrator::HalResult<std::vector<Effect>>::failed("message"), vibrator::HalResult<std::vector<Effect>>::failed("message"), vibrator::HalResult<std::vector<CompositePrimitive>>::failed("message"), vibrator::HalResult<std::vector<CompositePrimitive>>::failed("message"), vibrator::HalResult<float>::failed("message"), vibrator::HalResult<float>::failed("message"), vibrator::HalResult<milliseconds>::failed("message")); vibrator::HalResult<milliseconds>::failed("message")); ASSERT_EQ(0, mConnectCounter); ASSERT_EQ(0, mConnectCounter); Loading @@ -265,6 +289,8 @@ TEST_F(VibratorHalControllerTest, TestFailedApiResultResetsHalConnection) { ASSERT_TRUE(mController->getCapabilities().isFailed()); ASSERT_TRUE(mController->getCapabilities().isFailed()); ASSERT_TRUE(mController->getSupportedEffects().isFailed()); ASSERT_TRUE(mController->getSupportedEffects().isFailed()); ASSERT_TRUE(mController->getSupportedPrimitives().isFailed()); ASSERT_TRUE(mController->getSupportedPrimitives().isFailed()); ASSERT_TRUE(mController->getResonantFrequency().isFailed()); ASSERT_TRUE(mController->getQFactor().isFailed()); ASSERT_TRUE( ASSERT_TRUE( mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}).isFailed()); mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}).isFailed()); ASSERT_TRUE( ASSERT_TRUE( Loading Loading @@ -327,13 +353,15 @@ TEST_F(VibratorHalControllerTest, TestNoVibratorReturnsUnsupportedAndAttemptsToR ASSERT_TRUE(mController->getCapabilities().isUnsupported()); ASSERT_TRUE(mController->getCapabilities().isUnsupported()); ASSERT_TRUE(mController->getSupportedEffects().isUnsupported()); ASSERT_TRUE(mController->getSupportedEffects().isUnsupported()); ASSERT_TRUE(mController->getSupportedPrimitives().isUnsupported()); ASSERT_TRUE(mController->getSupportedPrimitives().isUnsupported()); ASSERT_TRUE(mController->getResonantFrequency().isUnsupported()); ASSERT_TRUE(mController->getQFactor().isUnsupported()); ASSERT_TRUE(mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}) ASSERT_TRUE(mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}) .isUnsupported()); .isUnsupported()); ASSERT_TRUE(mController->performComposedEffect(std::vector<CompositeEffect>(), []() {}) ASSERT_TRUE(mController->performComposedEffect(std::vector<CompositeEffect>(), []() {}) .isUnsupported()); .isUnsupported()); // One connection attempt per api call. // One connection attempt per api call. ASSERT_EQ(13, mConnectCounter); ASSERT_EQ(15, mConnectCounter); } } TEST_F(VibratorHalControllerTest, TestScheduledCallbackSurvivesReconnection) { TEST_F(VibratorHalControllerTest, TestScheduledCallbackSurvivesReconnection) { Loading Loading
services/vibratorservice/VibratorHalController.cpp +12 −0 Original line number Original line Diff line number Diff line Loading @@ -209,6 +209,18 @@ HalResult<std::vector<CompositePrimitive>> HalController::getSupportedPrimitives return apply(getSupportedPrimitivesFn, "getSupportedPrimitives"); return apply(getSupportedPrimitivesFn, "getSupportedPrimitives"); } } HalResult<float> HalController::getResonantFrequency() { hal_fn<float> getResonantFrequencyFn = [](std::shared_ptr<HalWrapper> hal) { return hal->getResonantFrequency(); }; return apply(getResonantFrequencyFn, "getResonantFrequency"); } HalResult<float> HalController::getQFactor() { hal_fn<float> getQFactorFn = [](std::shared_ptr<HalWrapper> hal) { return hal->getQFactor(); }; return apply(getQFactorFn, "getQFactor"); } HalResult<milliseconds> HalController::performEffect( HalResult<milliseconds> HalController::performEffect( Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) { Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) { hal_fn<milliseconds> performEffectFn = [&](std::shared_ptr<HalWrapper> hal) { hal_fn<milliseconds> performEffectFn = [&](std::shared_ptr<HalWrapper> hal) { Loading
services/vibratorservice/VibratorHalWrapper.cpp +35 −0 Original line number Original line Diff line number Diff line Loading @@ -205,6 +205,17 @@ HalResult<std::vector<CompositePrimitive>> AidlHalWrapper::getSupportedPrimitive mSupportedPrimitives); mSupportedPrimitives); } } HalResult<float> AidlHalWrapper::getResonantFrequency() { std::lock_guard<std::mutex> lock(mResonantFrequencyMutex); return loadCached<float>(std::bind(&AidlHalWrapper::getResonantFrequencyInternal, this), mResonantFrequency); } HalResult<float> AidlHalWrapper::getQFactor() { std::lock_guard<std::mutex> lock(mQFactorMutex); return loadCached<float>(std::bind(&AidlHalWrapper::getQFactorInternal, this), mQFactor); } HalResult<milliseconds> AidlHalWrapper::performEffect( HalResult<milliseconds> AidlHalWrapper::performEffect( Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) { Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) { HalResult<Capabilities> capabilities = getCapabilities(); HalResult<Capabilities> capabilities = getCapabilities(); Loading Loading @@ -283,6 +294,18 @@ HalResult<std::vector<CompositePrimitive>> AidlHalWrapper::getSupportedPrimitive return HalResult<std::vector<CompositePrimitive>>::fromStatus(result, supportedPrimitives); return HalResult<std::vector<CompositePrimitive>>::fromStatus(result, supportedPrimitives); } } HalResult<float> AidlHalWrapper::getResonantFrequencyInternal() { float f0 = 0; auto result = getHal()->getResonantFrequency(&f0); return HalResult<float>::fromStatus(result, f0); } HalResult<float> AidlHalWrapper::getQFactorInternal() { float qFactor = 0; auto result = getHal()->getQFactor(&qFactor); return HalResult<float>::fromStatus(result, qFactor); } sp<Aidl::IVibrator> AidlHalWrapper::getHal() { sp<Aidl::IVibrator> AidlHalWrapper::getHal() { std::lock_guard<std::mutex> lock(mHandleMutex); std::lock_guard<std::mutex> lock(mHandleMutex); return mHandle; return mHandle; Loading Loading @@ -365,6 +388,18 @@ HalResult<std::vector<CompositePrimitive>> HidlHalWrapper<I>::getSupportedPrimit return HalResult<std::vector<CompositePrimitive>>::unsupported(); return HalResult<std::vector<CompositePrimitive>>::unsupported(); } } template <typename I> HalResult<float> HidlHalWrapper<I>::getResonantFrequency() { ALOGV("Skipped getResonantFrequency because Vibrator HAL AIDL is not available"); return HalResult<float>::unsupported(); } template <typename I> HalResult<float> HidlHalWrapper<I>::getQFactor() { ALOGV("Skipped getQFactor because Vibrator HAL AIDL is not available"); return HalResult<float>::unsupported(); } template <typename I> template <typename I> HalResult<std::chrono::milliseconds> HidlHalWrapper<I>::performComposedEffect( HalResult<std::chrono::milliseconds> HidlHalWrapper<I>::performComposedEffect( const std::vector<CompositeEffect>&, const std::function<void()>&) { const std::vector<CompositeEffect>&, const std::function<void()>&) { Loading
services/vibratorservice/include/vibratorservice/VibratorHalController.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -73,6 +73,9 @@ public: HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() final override; final override; HalResult<float> getResonantFrequency() final override; HalResult<float> getQFactor() final override; HalResult<std::chrono::milliseconds> performEffect( HalResult<std::chrono::milliseconds> performEffect( hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, const std::function<void()>& completionCallback) final override; const std::function<void()>& completionCallback) final override; Loading
services/vibratorservice/include/vibratorservice/VibratorHalWrapper.h +17 −0 Original line number Original line Diff line number Diff line Loading @@ -185,6 +185,9 @@ public: virtual HalResult<std::vector<hardware::vibrator::CompositePrimitive>> virtual HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() = 0; getSupportedPrimitives() = 0; virtual HalResult<float> getResonantFrequency() = 0; virtual HalResult<float> getQFactor() = 0; virtual HalResult<std::chrono::milliseconds> performEffect( virtual HalResult<std::chrono::milliseconds> performEffect( hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, const std::function<void()>& completionCallback) = 0; const std::function<void()>& completionCallback) = 0; Loading Loading @@ -232,6 +235,9 @@ public: HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() override final; override final; HalResult<float> getResonantFrequency() override final; HalResult<float> getQFactor() override final; HalResult<std::chrono::milliseconds> performEffect( HalResult<std::chrono::milliseconds> performEffect( hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, const std::function<void()>& completionCallback) override final; const std::function<void()>& completionCallback) override final; Loading @@ -246,6 +252,8 @@ private: std::mutex mCapabilitiesMutex; std::mutex mCapabilitiesMutex; std::mutex mSupportedEffectsMutex; std::mutex mSupportedEffectsMutex; std::mutex mSupportedPrimitivesMutex; std::mutex mSupportedPrimitivesMutex; std::mutex mResonantFrequencyMutex; std::mutex mQFactorMutex; sp<hardware::vibrator::IVibrator> mHandle GUARDED_BY(mHandleMutex); sp<hardware::vibrator::IVibrator> mHandle GUARDED_BY(mHandleMutex); std::optional<Capabilities> mCapabilities GUARDED_BY(mCapabilitiesMutex); std::optional<Capabilities> mCapabilities GUARDED_BY(mCapabilitiesMutex); std::optional<std::vector<hardware::vibrator::Effect>> mSupportedEffects std::optional<std::vector<hardware::vibrator::Effect>> mSupportedEffects Loading @@ -254,6 +262,8 @@ private: GUARDED_BY(mSupportedPrimitivesMutex); GUARDED_BY(mSupportedPrimitivesMutex); std::vector<std::optional<std::chrono::milliseconds>> mPrimitiveDurations std::vector<std::optional<std::chrono::milliseconds>> mPrimitiveDurations GUARDED_BY(mSupportedPrimitivesMutex); GUARDED_BY(mSupportedPrimitivesMutex); std::optional<float> mResonantFrequency GUARDED_BY(mResonantFrequencyMutex); std::optional<float> mQFactor GUARDED_BY(mQFactorMutex); // Loads and caches from IVibrator. // Loads and caches from IVibrator. HalResult<std::chrono::milliseconds> getPrimitiveDuration( HalResult<std::chrono::milliseconds> getPrimitiveDuration( Loading @@ -263,6 +273,10 @@ private: HalResult<Capabilities> getCapabilitiesInternal(); HalResult<Capabilities> getCapabilitiesInternal(); HalResult<std::vector<hardware::vibrator::Effect>> getSupportedEffectsInternal(); HalResult<std::vector<hardware::vibrator::Effect>> getSupportedEffectsInternal(); HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitivesInternal(); HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitivesInternal(); HalResult<float> getResonantFrequencyInternal(); HalResult<float> getQFactorInternal(); sp<hardware::vibrator::IVibrator> getHal(); sp<hardware::vibrator::IVibrator> getHal(); }; }; Loading Loading @@ -293,6 +307,9 @@ public: HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitives() override final; override final; HalResult<float> getResonantFrequency() override final; HalResult<float> getQFactor() override final; HalResult<std::chrono::milliseconds> performComposedEffect( HalResult<std::chrono::milliseconds> performComposedEffect( const std::vector<hardware::vibrator::CompositeEffect>& primitiveEffects, const std::vector<hardware::vibrator::CompositeEffect>& primitiveEffects, const std::function<void()>& completionCallback) override final; const std::function<void()>& completionCallback) override final; Loading
services/vibratorservice/test/VibratorHalControllerTest.cpp +41 −13 Original line number Original line Diff line number Diff line Loading @@ -67,6 +67,10 @@ public: MOCK_METHOD(vibrator::HalResult<std::vector<Effect>>, getSupportedEffects, (), (override)); MOCK_METHOD(vibrator::HalResult<std::vector<Effect>>, getSupportedEffects, (), (override)); MOCK_METHOD(vibrator::HalResult<std::vector<CompositePrimitive>>, getSupportedPrimitives, (), MOCK_METHOD(vibrator::HalResult<std::vector<CompositePrimitive>>, getSupportedPrimitives, (), (override)); (override)); MOCK_METHOD(vibrator::HalResult<float>, getResonantFrequency, (), (override)); MOCK_METHOD(vibrator::HalResult<float>, getQFactor, (), (override)); MOCK_METHOD(vibrator::HalResult<milliseconds>, performEffect, MOCK_METHOD(vibrator::HalResult<milliseconds>, performEffect, (Effect effect, EffectStrength strength, (Effect effect, EffectStrength strength, const std::function<void()>& completionCallback), const std::function<void()>& completionCallback), Loading Loading @@ -106,6 +110,8 @@ protected: vibrator::HalResult<vibrator::Capabilities> capabilitiesResult, vibrator::HalResult<vibrator::Capabilities> capabilitiesResult, vibrator::HalResult<std::vector<Effect>> effectsResult, vibrator::HalResult<std::vector<Effect>> effectsResult, vibrator::HalResult<std::vector<CompositePrimitive>> primitivesResult, vibrator::HalResult<std::vector<CompositePrimitive>> primitivesResult, vibrator::HalResult<float> resonantFrequencyResult, vibrator::HalResult<float> qFactorResult, vibrator::HalResult<milliseconds> durationResult) { vibrator::HalResult<milliseconds> durationResult) { EXPECT_CALL(*mMockHal.get(), ping()) EXPECT_CALL(*mMockHal.get(), ping()) .Times(Exactly(cardinality)) .Times(Exactly(cardinality)) Loading Loading @@ -138,6 +144,12 @@ protected: EXPECT_CALL(*mMockHal.get(), getSupportedPrimitives()) EXPECT_CALL(*mMockHal.get(), getSupportedPrimitives()) .Times(Exactly(cardinality)) .Times(Exactly(cardinality)) .WillRepeatedly(Return(primitivesResult)); .WillRepeatedly(Return(primitivesResult)); EXPECT_CALL(*mMockHal.get(), getResonantFrequency()) .Times(Exactly(cardinality)) .WillRepeatedly(Return(resonantFrequencyResult)); EXPECT_CALL(*mMockHal.get(), getQFactor()) .Times(Exactly(cardinality)) .WillRepeatedly(Return(qFactorResult)); EXPECT_CALL(*mMockHal.get(), performEffect(Eq(Effect::CLICK), Eq(EffectStrength::LIGHT), _)) EXPECT_CALL(*mMockHal.get(), performEffect(Eq(Effect::CLICK), Eq(EffectStrength::LIGHT), _)) .Times(Exactly(cardinality)) .Times(Exactly(cardinality)) .WillRepeatedly(Return(durationResult)); .WillRepeatedly(Return(durationResult)); Loading @@ -147,7 +159,7 @@ protected: if (cardinality > 1) { if (cardinality > 1) { // One reconnection call after each failure. // One reconnection call after each failure. EXPECT_CALL(*mMockHal.get(), tryReconnect()).Times(Exactly(12 * cardinality)); EXPECT_CALL(*mMockHal.get(), tryReconnect()).Times(Exactly(14 * cardinality)); } } } } }; }; Loading @@ -164,23 +176,21 @@ TEST_F(VibratorHalControllerTest, TestInit) { } } TEST_F(VibratorHalControllerTest, TestApiCallsAreForwardedToHal) { TEST_F(VibratorHalControllerTest, TestApiCallsAreForwardedToHal) { std::vector<Effect> effects; std::vector<Effect> effects = {Effect::CLICK, Effect::TICK}; effects.push_back(Effect::CLICK); std::vector<CompositePrimitive> primitives = {CompositePrimitive::CLICK, effects.push_back(Effect::TICK); CompositePrimitive::THUD}; std::vector<CompositePrimitive> primitives; constexpr float F0 = 123.f; primitives.push_back(CompositePrimitive::CLICK); constexpr float Q_FACTOR = 12.f; primitives.push_back(CompositePrimitive::THUD); const std::vector<CompositeEffect> compositeEffects = std::vector<CompositeEffect> compositeEffects; {vibrator::TestFactory::createCompositeEffect(CompositePrimitive::SPIN, 100ms, 0.5f), compositeEffects.push_back( vibrator::TestFactory::createCompositeEffect(CompositePrimitive::THUD, 1000ms, 1.0f)}; vibrator::TestFactory::createCompositeEffect(CompositePrimitive::SPIN, 100ms, 0.5f)); compositeEffects.push_back( vibrator::TestFactory::createCompositeEffect(CompositePrimitive::THUD, 1000ms, 1.0f)); setHalExpectations(/* cardinality= */ 1, compositeEffects, vibrator::HalResult<void>::ok(), setHalExpectations(/* cardinality= */ 1, compositeEffects, vibrator::HalResult<void>::ok(), vibrator::HalResult<vibrator::Capabilities>::ok( vibrator::HalResult<vibrator::Capabilities>::ok( vibrator::Capabilities::ON_CALLBACK), vibrator::Capabilities::ON_CALLBACK), vibrator::HalResult<std::vector<Effect>>::ok(effects), vibrator::HalResult<std::vector<Effect>>::ok(effects), vibrator::HalResult<std::vector<CompositePrimitive>>::ok(primitives), vibrator::HalResult<std::vector<CompositePrimitive>>::ok(primitives), vibrator::HalResult<float>::ok(F0), vibrator::HalResult<float>::ok(Q_FACTOR), vibrator::HalResult<milliseconds>::ok(100ms)); vibrator::HalResult<milliseconds>::ok(100ms)); ASSERT_TRUE(mController->ping().isOk()); ASSERT_TRUE(mController->ping().isOk()); Loading @@ -203,6 +213,14 @@ TEST_F(VibratorHalControllerTest, TestApiCallsAreForwardedToHal) { ASSERT_TRUE(getSupportedPrimitivesResult.isOk()); ASSERT_TRUE(getSupportedPrimitivesResult.isOk()); ASSERT_EQ(primitives, getSupportedPrimitivesResult.value()); ASSERT_EQ(primitives, getSupportedPrimitivesResult.value()); auto getResonantFrequencyResult = mController->getResonantFrequency(); ASSERT_TRUE(getResonantFrequencyResult.isOk()); ASSERT_EQ(F0, getResonantFrequencyResult.value()); auto getQFactorResult = mController->getQFactor(); ASSERT_TRUE(getQFactorResult.isOk()); ASSERT_EQ(Q_FACTOR, getQFactorResult.value()); auto performEffectResult = auto performEffectResult = mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}); mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}); ASSERT_TRUE(performEffectResult.isOk()); ASSERT_TRUE(performEffectResult.isOk()); Loading @@ -222,6 +240,8 @@ TEST_F(VibratorHalControllerTest, TestUnsupportedApiResultDoNotResetHalConnectio vibrator::HalResult<vibrator::Capabilities>::unsupported(), vibrator::HalResult<vibrator::Capabilities>::unsupported(), vibrator::HalResult<std::vector<Effect>>::unsupported(), vibrator::HalResult<std::vector<Effect>>::unsupported(), vibrator::HalResult<std::vector<CompositePrimitive>>::unsupported(), vibrator::HalResult<std::vector<CompositePrimitive>>::unsupported(), vibrator::HalResult<float>::unsupported(), vibrator::HalResult<float>::unsupported(), vibrator::HalResult<milliseconds>::unsupported()); vibrator::HalResult<milliseconds>::unsupported()); ASSERT_EQ(0, mConnectCounter); ASSERT_EQ(0, mConnectCounter); Loading @@ -237,6 +257,8 @@ TEST_F(VibratorHalControllerTest, TestUnsupportedApiResultDoNotResetHalConnectio ASSERT_TRUE(mController->getCapabilities().isUnsupported()); ASSERT_TRUE(mController->getCapabilities().isUnsupported()); ASSERT_TRUE(mController->getSupportedEffects().isUnsupported()); ASSERT_TRUE(mController->getSupportedEffects().isUnsupported()); ASSERT_TRUE(mController->getSupportedPrimitives().isUnsupported()); ASSERT_TRUE(mController->getSupportedPrimitives().isUnsupported()); ASSERT_TRUE(mController->getResonantFrequency().isUnsupported()); ASSERT_TRUE(mController->getQFactor().isUnsupported()); ASSERT_TRUE(mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}) ASSERT_TRUE(mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}) .isUnsupported()); .isUnsupported()); ASSERT_TRUE(mController->performComposedEffect(std::vector<CompositeEffect>(), []() {}) ASSERT_TRUE(mController->performComposedEffect(std::vector<CompositeEffect>(), []() {}) Loading @@ -251,6 +273,8 @@ TEST_F(VibratorHalControllerTest, TestFailedApiResultResetsHalConnection) { vibrator::HalResult<vibrator::Capabilities>::failed("message"), vibrator::HalResult<vibrator::Capabilities>::failed("message"), vibrator::HalResult<std::vector<Effect>>::failed("message"), vibrator::HalResult<std::vector<Effect>>::failed("message"), vibrator::HalResult<std::vector<CompositePrimitive>>::failed("message"), vibrator::HalResult<std::vector<CompositePrimitive>>::failed("message"), vibrator::HalResult<float>::failed("message"), vibrator::HalResult<float>::failed("message"), vibrator::HalResult<milliseconds>::failed("message")); vibrator::HalResult<milliseconds>::failed("message")); ASSERT_EQ(0, mConnectCounter); ASSERT_EQ(0, mConnectCounter); Loading @@ -265,6 +289,8 @@ TEST_F(VibratorHalControllerTest, TestFailedApiResultResetsHalConnection) { ASSERT_TRUE(mController->getCapabilities().isFailed()); ASSERT_TRUE(mController->getCapabilities().isFailed()); ASSERT_TRUE(mController->getSupportedEffects().isFailed()); ASSERT_TRUE(mController->getSupportedEffects().isFailed()); ASSERT_TRUE(mController->getSupportedPrimitives().isFailed()); ASSERT_TRUE(mController->getSupportedPrimitives().isFailed()); ASSERT_TRUE(mController->getResonantFrequency().isFailed()); ASSERT_TRUE(mController->getQFactor().isFailed()); ASSERT_TRUE( ASSERT_TRUE( mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}).isFailed()); mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}).isFailed()); ASSERT_TRUE( ASSERT_TRUE( Loading Loading @@ -327,13 +353,15 @@ TEST_F(VibratorHalControllerTest, TestNoVibratorReturnsUnsupportedAndAttemptsToR ASSERT_TRUE(mController->getCapabilities().isUnsupported()); ASSERT_TRUE(mController->getCapabilities().isUnsupported()); ASSERT_TRUE(mController->getSupportedEffects().isUnsupported()); ASSERT_TRUE(mController->getSupportedEffects().isUnsupported()); ASSERT_TRUE(mController->getSupportedPrimitives().isUnsupported()); ASSERT_TRUE(mController->getSupportedPrimitives().isUnsupported()); ASSERT_TRUE(mController->getResonantFrequency().isUnsupported()); ASSERT_TRUE(mController->getQFactor().isUnsupported()); ASSERT_TRUE(mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}) ASSERT_TRUE(mController->performEffect(Effect::CLICK, EffectStrength::LIGHT, []() {}) .isUnsupported()); .isUnsupported()); ASSERT_TRUE(mController->performComposedEffect(std::vector<CompositeEffect>(), []() {}) ASSERT_TRUE(mController->performComposedEffect(std::vector<CompositeEffect>(), []() {}) .isUnsupported()); .isUnsupported()); // One connection attempt per api call. // One connection attempt per api call. ASSERT_EQ(13, mConnectCounter); ASSERT_EQ(15, mConnectCounter); } } TEST_F(VibratorHalControllerTest, TestScheduledCallbackSurvivesReconnection) { TEST_F(VibratorHalControllerTest, TestScheduledCallbackSurvivesReconnection) { Loading