From 4526faf7e8f952b7b96344da787bf3da91e7030f Mon Sep 17 00:00:00 2001 From: Lais Andrade Date: Fri, 9 Aug 2024 11:57:20 +0100 Subject: [PATCH] Update vendor VibrationEffect to support scale factor Update VendorEffect.aidl to support 2 continuous float scale parameters, one that reflects the user intensity settings for that effect and a second that is forwarded from the vendor vibrator controller service for that vibration usage. This allows vendors to apply the 2-tier scaling function to the vibrations, one reflecting the user settings and a second reflecting the vendor parameter sent to the platform based on the device current state. Bug: 345409060 Test: VtsHalVibratorTargetTest Flag: EXEMPT HAL interface changes Change-Id: Ic88f90fd0ff1eae8797a7fe7d84d5b11f6c2f6bf --- .../hardware/vibrator/VendorEffect.aidl | 1 + .../hardware/vibrator/VendorEffect.aidl | 25 ++++++++++++++++--- vibrator/aidl/default/Vibrator.cpp | 4 +++ .../aidl/vts/VtsHalVibratorTargetTest.cpp | 18 ++++++++++--- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/VendorEffect.aidl b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/VendorEffect.aidl index 190008440d..62a738076c 100644 --- a/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/VendorEffect.aidl +++ b/vibrator/aidl/aidl_api/android.hardware.vibrator/current/android/hardware/vibrator/VendorEffect.aidl @@ -37,4 +37,5 @@ parcelable VendorEffect { android.os.PersistableBundle vendorData; android.hardware.vibrator.EffectStrength strength = android.hardware.vibrator.EffectStrength.MEDIUM; float scale; + float vendorScale; } diff --git a/vibrator/aidl/android/hardware/vibrator/VendorEffect.aidl b/vibrator/aidl/android/hardware/vibrator/VendorEffect.aidl index 2155aca276..6b1af534c9 100644 --- a/vibrator/aidl/android/hardware/vibrator/VendorEffect.aidl +++ b/vibrator/aidl/android/hardware/vibrator/VendorEffect.aidl @@ -36,16 +36,35 @@ parcelable VendorEffect { /** * The intensity of the haptic effect. + * + * This value is defined by discrete scale levels that represents the intensity of this haptic + * effect. This is a discrete representation of the scale parameter below. */ EffectStrength strength = EffectStrength.MEDIUM; /** - * A scale to be applied to the haptic effect intensity. + * The intensity of the haptic effect. * - * This value represents a linear scale that should be applied on top of the effect strength to - * dynamically adapt to the device state. + * This value is defined by continuous scale that represents the intensity of this haptic + * effect. The vendor implementation can follow the platform scaling function or customize the + * implementation to their needs. This is a continuous representation of the strength parameter + * above. * * Values in [0,1) should scale down. Values > 1 should scale up within hardware bounds. */ float scale; + + /** + * The dynamic scale parameter provided by the vendor vibrator controller. + * + * This value is the same provided by the vendor to the platform IVibratorControlService and + * should be applied on top of the effect intensity provided by the strength/scale fields. + * The vendor can use this to dynamically adapt the haptic effect intensity to the device state. + * + * See frameworks/hardware/interfaces/vibrator for more documentation on vendor vibrator + * controller, and ScaleParam for more about this scale parameter. + * + * Values in [0,1) should scale down. Values > 1 should scale up within hardware bounds. + */ + float vendorScale; } diff --git a/vibrator/aidl/default/Vibrator.cpp b/vibrator/aidl/default/Vibrator.cpp index acf7d34266..29e7d1830e 100644 --- a/vibrator/aidl/default/Vibrator.cpp +++ b/vibrator/aidl/default/Vibrator.cpp @@ -117,6 +117,10 @@ ndk::ScopedAStatus Vibrator::performVendorEffect( if (scale <= 0) { return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); } + float vendorScale = effect.vendorScale; + if (vendorScale <= 0) { + return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); + } int32_t durationMs = 0; if (!effect.vendorData.getInt("DURATION_MS", &durationMs) || durationMs <= 0) { diff --git a/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp b/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp index 706ab416b3..2502589f9f 100644 --- a/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp +++ b/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp @@ -366,7 +366,8 @@ TEST_P(VibratorAidl, InvalidEffectsUnsupported) { TEST_P(VibratorAidl, PerformVendorEffectSupported) { if ((capabilities & IVibrator::CAP_PERFORM_VENDOR_EFFECTS) == 0) return; - float scale = 0.5f; + float scale = 0.0f; + float vendorScale = 0.0f; for (EffectStrength strength : kEffectStrengths) { PersistableBundle vendorData; ::aidl::android::hardware::vibrator::testing::fillBasicData(&vendorData); @@ -379,7 +380,9 @@ TEST_P(VibratorAidl, PerformVendorEffectSupported) { effect.vendorData = vendorData; effect.strength = strength; effect.scale = scale; - scale *= 1.5f; + effect.vendorScale = vendorScale; + scale += 0.5f; + vendorScale += 0.2f; auto callback = ndk::SharedRefBase::make([] {}); ndk::ScopedAStatus status = vibrator->performVendorEffect(effect, callback); @@ -408,6 +411,7 @@ TEST_P(VibratorAidl, PerformVendorEffectStability) { for (EffectStrength strength : kEffectStrengths) { float scale = 0.5f; + float vendorScale = 0.2f; for (uint8_t i = 0; i < iterations; i++) { PersistableBundle vendorData; ::aidl::android::hardware::vibrator::testing::fillRandomData(&vendorData); @@ -416,7 +420,9 @@ TEST_P(VibratorAidl, PerformVendorEffectStability) { effect.vendorData = vendorData; effect.strength = strength; effect.scale = scale; + effect.vendorScale = vendorScale; scale *= 2; + vendorScale *= 1.5f; auto callback = ndk::SharedRefBase::make([] {}); ndk::ScopedAStatus status = vibrator->performVendorEffect(effect, callback); @@ -444,6 +450,7 @@ TEST_P(VibratorAidl, PerformVendorEffectEmptyVendorData) { VendorEffect effect; effect.strength = strength; effect.scale = 1.0f; + effect.vendorScale = 1.0f; ndk::ScopedAStatus status = vibrator->performVendorEffect(effect, nullptr /*callback*/); @@ -459,10 +466,12 @@ TEST_P(VibratorAidl, PerformVendorEffectInvalidScale) { VendorEffect effect; effect.strength = EffectStrength::MEDIUM; - effect.scale = 0.0f; + effect.scale = -1.0f; + effect.vendorScale = 1.0f; EXPECT_ILLEGAL_ARGUMENT(vibrator->performVendorEffect(effect, nullptr /*callback*/)); - effect.scale = -1.0f; + effect.scale = 1.0f; + effect.vendorScale = -1.0f; EXPECT_ILLEGAL_ARGUMENT(vibrator->performVendorEffect(effect, nullptr /*callback*/)); } @@ -473,6 +482,7 @@ TEST_P(VibratorAidl, PerformVendorEffectUnsupported) { VendorEffect effect; effect.strength = strength; effect.scale = 1.0f; + effect.vendorScale = 1.0f; EXPECT_UNKNOWN_OR_UNSUPPORTED(vibrator->performVendorEffect(effect, nullptr /*callback*/)) << "\n For vendor effect with strength " << toString(strength);