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
This commit is contained in:
Lais Andrade
2024-08-09 11:57:20 +01:00
parent f02779e068
commit 4526faf7e8
4 changed files with 41 additions and 7 deletions

View File

@@ -37,4 +37,5 @@ parcelable VendorEffect {
android.os.PersistableBundle vendorData;
android.hardware.vibrator.EffectStrength strength = android.hardware.vibrator.EffectStrength.MEDIUM;
float scale;
float vendorScale;
}

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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<CompletionCallback>([] {});
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<CompletionCallback>([] {});
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);