diff --git a/vibrator/Vibrator.cpp b/vibrator/Vibrator.cpp index 96576848..ff66d8e0 100644 --- a/vibrator/Vibrator.cpp +++ b/vibrator/Vibrator.cpp @@ -176,15 +176,30 @@ static uint8_t convertEffectStrength(EffectStrength strength) { } Return Vibrator::perform(V1_0::Effect effect, EffectStrength strength, perform_cb _hidl_cb) { - return performEffect(static_cast(effect), strength, _hidl_cb); + return performWrapper(effect, strength, _hidl_cb); } Return Vibrator::perform_1_1(V1_1::Effect_1_1 effect, EffectStrength strength, perform_cb _hidl_cb) { - return performEffect(static_cast(effect), strength, _hidl_cb); + return performWrapper(effect, strength, _hidl_cb); } Return Vibrator::perform_1_2(Effect effect, EffectStrength strength, perform_cb _hidl_cb) { + return performWrapper(effect, strength, _hidl_cb); +} + +template +Return Vibrator::performWrapper(T effect, EffectStrength strength, perform_cb _hidl_cb) { + auto validEffectRange = hidl_enum_range(); + if (effect < *validEffectRange.begin() || effect > *std::prev(validEffectRange.end())) { + _hidl_cb(Status::UNSUPPORTED_OPERATION, 0); + return Void(); + } + auto validStrengthRange = hidl_enum_range(); + if (strength < *validStrengthRange.begin() || strength > *std::prev(validStrengthRange.end())) { + _hidl_cb(Status::UNSUPPORTED_OPERATION, 0); + return Void(); + } return performEffect(static_cast(effect), strength, _hidl_cb); } diff --git a/vibrator/Vibrator.h b/vibrator/Vibrator.h index f9daf7cd..24510d76 100644 --- a/vibrator/Vibrator.h +++ b/vibrator/Vibrator.h @@ -50,6 +50,8 @@ public: private: Return on(uint32_t timeoutMs, bool forceOpenLoop, bool isWaveform); + template + Return performWrapper(T effect, EffectStrength strength, perform_cb _hidl_cb); Return performEffect(Effect effect, EffectStrength strength, perform_cb _hidl_cb); std::ofstream mActivate; std::ofstream mDuration;