/* * Copyright (C) 2021-2023 The LineageOS Project * * SPDX-License-Identifier: Apache-2.0 */ #pragma once #include #define INTENSITY_MIN 1000 #define INTENSITY_MAX 10000 #define INTENSITY_DEFAULT INTENSITY_MAX #define AMPLITUDE_LIGHT 0.25 #define AMPLITUDE_MEDIUM 0.5 #define AMPLITUDE_STRONG 1 #ifdef VIBRATOR_SUPPORTS_DURATION_AMPLITUDE_CONTROL #define DURATION_AMPLITUDE_LIGHT 0.65 #define DURATION_AMPLITUDE_MEDIUM 0.8 #define DURATION_AMPLITUDE_STRONG 1 #endif #define VIBRATOR_TIMEOUT_PATH "/sys/class/timed_output/vibrator/enable" #define VIBRATOR_INTENSITY_PATH "/sys/class/timed_output/vibrator/intensity" #define VIBRATOR_CP_TRIGGER_PATH "/sys/class/timed_output/vibrator/cp_trigger_index" using ::aidl::android::hardware::vibrator::IVibratorCallback; using ::aidl::android::hardware::vibrator::Braking; using ::aidl::android::hardware::vibrator::Effect; using ::aidl::android::hardware::vibrator::EffectStrength; using ::aidl::android::hardware::vibrator::CompositeEffect; using ::aidl::android::hardware::vibrator::CompositePrimitive; using ::aidl::android::hardware::vibrator::PrimitivePwle; namespace aidl { namespace android { namespace hardware { namespace vibrator { class Vibrator : public BnVibrator { public: Vibrator(); ndk::ScopedAStatus getCapabilities(int32_t* _aidl_return) override; ndk::ScopedAStatus off() override; ndk::ScopedAStatus on(int32_t timeoutMs, const std::shared_ptr& callback) override; ndk::ScopedAStatus perform(Effect effect, EffectStrength strength, const std::shared_ptr& callback, int32_t* _aidl_return) override; ndk::ScopedAStatus getSupportedEffects(std::vector* _aidl_return) override; ndk::ScopedAStatus setAmplitude(float amplitude) override; ndk::ScopedAStatus setExternalControl(bool enabled) override; ndk::ScopedAStatus getCompositionDelayMax(int32_t* _aidl_return) override; ndk::ScopedAStatus getCompositionSizeMax(int32_t* _aidl_return) override; ndk::ScopedAStatus getSupportedPrimitives(std::vector* _aidl_return) override; ndk::ScopedAStatus getPrimitiveDuration(CompositePrimitive primitive, int32_t* _aidl_return) override; ndk::ScopedAStatus compose(const std::vector& composite, const std::shared_ptr& callback) override; ndk::ScopedAStatus getSupportedAlwaysOnEffects(std::vector* _aidl_return) override; ndk::ScopedAStatus alwaysOnEnable(int32_t id, Effect effect, EffectStrength strength) override; ndk::ScopedAStatus alwaysOnDisable(int32_t id) override; ndk::ScopedAStatus getResonantFrequency(float* _aidl_return) override; ndk::ScopedAStatus getQFactor(float* _aidl_return) override; ndk::ScopedAStatus getFrequencyResolution(float* _aidl_return) override; ndk::ScopedAStatus getFrequencyMinimum(float* _aidl_return) override; ndk::ScopedAStatus getBandwidthAmplitudeMap(std::vector* _aidl_return) override; ndk::ScopedAStatus getPwlePrimitiveDurationMax(int32_t* _aidl_return) override; ndk::ScopedAStatus getPwleCompositionSizeMax(int32_t* _aidl_return) override; ndk::ScopedAStatus getSupportedBraking(std::vector* _aidl_return) override; ndk::ScopedAStatus composePwle(const std::vector& composite, const std::shared_ptr& callback) override; private: ndk::ScopedAStatus activate(uint32_t ms); uint32_t effectToMs(Effect effect, ndk::ScopedAStatus* status); static float strengthToAmplitude(EffectStrength strength, ndk::ScopedAStatus* status); #ifdef VIBRATOR_SUPPORTS_DURATION_AMPLITUDE_CONTROL static float durationAmplitude(float amplitude); float mDurationAmplitude; #endif bool mEnabled{false}; bool mExternalControl{false}; std::mutex mMutex; bool mIsTimedOutVibrator; bool mHasTimedOutIntensity; bool mHasTimedOutEffect; }; } // namespace vibrator } // namespace hardware } // namespace android } // namespace aidl