You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
4.0 KiB
92 lines
4.0 KiB
/*
|
|
* Copyright (C) 2021-2023 The LineageOS Project
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <aidl/android/hardware/vibrator/BnVibrator.h>
|
|
|
|
#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<IVibratorCallback>& callback) override;
|
|
ndk::ScopedAStatus perform(Effect effect, EffectStrength strength, const std::shared_ptr<IVibratorCallback>& callback, int32_t* _aidl_return) override;
|
|
ndk::ScopedAStatus getSupportedEffects(std::vector<Effect>* _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<CompositePrimitive>* _aidl_return) override;
|
|
ndk::ScopedAStatus getPrimitiveDuration(CompositePrimitive primitive, int32_t* _aidl_return) override;
|
|
ndk::ScopedAStatus compose(const std::vector<CompositeEffect>& composite, const std::shared_ptr<IVibratorCallback>& callback) override;
|
|
ndk::ScopedAStatus getSupportedAlwaysOnEffects(std::vector<Effect>* _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<float>* _aidl_return) override;
|
|
ndk::ScopedAStatus getPwlePrimitiveDurationMax(int32_t* _aidl_return) override;
|
|
ndk::ScopedAStatus getPwleCompositionSizeMax(int32_t* _aidl_return) override;
|
|
ndk::ScopedAStatus getSupportedBraking(std::vector<Braking>* _aidl_return) override;
|
|
ndk::ScopedAStatus composePwle(const std::vector<PrimitivePwle>& composite, const std::shared_ptr<IVibratorCallback>& 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
|
|
|