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

Commit 93af2abe authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add support for querying resonant frequency and Q factor." into sc-dev

parents c04b9206 ba9a6ce9
Loading
Loading
Loading
Loading
+12 −0
Original line number Original line Diff line number Diff line
@@ -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) {
+35 −0
Original line number Original line Diff line number Diff line
@@ -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();
@@ -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;
@@ -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()>&) {
+3 −0
Original line number Original line Diff line number Diff line
@@ -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;
+17 −0
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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;
@@ -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
@@ -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(
@@ -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();
};
};


@@ -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;
+41 −13
Original line number Original line Diff line number Diff line
@@ -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),
@@ -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))
@@ -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));
@@ -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));
        }
        }
    }
    }
};
};
@@ -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());
@@ -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());
@@ -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);
@@ -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>(), []() {})
@@ -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);
@@ -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(
@@ -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