diff --git a/vibrator/cs40l26/Vibrator.cpp b/vibrator/cs40l26/Vibrator.cpp index 131a376..c390766 100644 --- a/vibrator/cs40l26/Vibrator.cpp +++ b/vibrator/cs40l26/Vibrator.cpp @@ -529,6 +529,7 @@ Vibrator::Vibrator(std::unique_ptr hwApiDefault, std::unique_ptr 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 &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(e_curr.primitive)]) { + effectScale = mPrimitiveMaxScale[static_cast(e_curr.primitive)]; + } if (effectScale < mPrimitiveMinScale[static_cast(e_curr.primitive)]) { effectScale = mPrimitiveMinScale[static_cast(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); diff --git a/vibrator/cs40l26/Vibrator.h b/vibrator/cs40l26/Vibrator.h index 6a29343..5b1ff90 100644 --- a/vibrator/cs40l26/Vibrator.h +++ b/vibrator/cs40l26/Vibrator.h @@ -231,6 +231,7 @@ class Vibrator : public BnVibrator { bool mIsChirpEnabled; uint32_t mSupportedPrimitivesBits = 0x0; std::vector mSupportedPrimitives; + std::vector mPrimitiveMaxScale; std::vector mPrimitiveMinScale; bool mConfigHapticAlsaDeviceDone{false}; bool mGPIOStatus;