cs40l26: Add a maximum scale protection for primitive effects

Bug: 267419872
Test: HW test
Change-Id: I18f0e096e63ae6844bb0b47c43011cd012845f75
This commit is contained in:
Chase Wu 2023-02-01 16:48:15 +08:00
parent ea50a3e631
commit e4e692f74d
2 changed files with 11 additions and 0 deletions

View file

@ -529,6 +529,7 @@ Vibrator::Vibrator(std::unique_ptr<HwApi> hwApiDefault, std::unique_ptr<HwCal> h
mSupportedPrimitives = defaultSupportedPrimitives;
}
mPrimitiveMaxScale = {1.0f, 0.95f, 0.75f, 0.9f, 1.0f, 1.0f, 1.0f, 0.75f, 0.75f};
mPrimitiveMinScale = {0.0f, 0.01f, 0.11f, 0.23f, 0.0f, 0.25f, 0.02f, 0.03f, 0.16f};
// ====== Get GPIO status and init it ================
@ -771,6 +772,11 @@ ndk::ScopedAStatus Vibrator::compose(const std::vector<CompositeEffect> &composi
if (!status.isOk()) {
return status;
}
// Add a max and min threshold to prevent the device crash(overcurrent) or no
// feeling
if (effectScale > mPrimitiveMaxScale[static_cast<uint32_t>(e_curr.primitive)]) {
effectScale = mPrimitiveMaxScale[static_cast<uint32_t>(e_curr.primitive)];
}
if (effectScale < mPrimitiveMinScale[static_cast<uint32_t>(e_curr.primitive)]) {
effectScale = mPrimitiveMinScale[static_cast<uint32_t>(e_curr.primitive)];
}
@ -1444,6 +1450,10 @@ ndk::ScopedAStatus Vibrator::getSimpleDetails(Effect effect, EffectStrength stre
case Effect::HEAVY_CLICK:
effectIndex = WAVEFORM_CLICK_INDEX;
intensity *= 1.0f;
// WAVEFORM_CLICK_INDEX is 2, but the primitive CLICK index is 1.
if (intensity > mPrimitiveMaxScale[WAVEFORM_CLICK_INDEX - 1]) {
intensity = mPrimitiveMaxScale[WAVEFORM_CLICK_INDEX - 1];
}
break;
default:
return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);

View file

@ -231,6 +231,7 @@ class Vibrator : public BnVibrator {
bool mIsChirpEnabled;
uint32_t mSupportedPrimitivesBits = 0x0;
std::vector<CompositePrimitive> mSupportedPrimitives;
std::vector<float> mPrimitiveMaxScale;
std::vector<float> mPrimitiveMinScale;
bool mConfigHapticAlsaDeviceDone{false};
bool mGPIOStatus;