blob: 0dcde845808de81fab088d2c1522d13a6e37c5cb [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <aidl/android/hardware/vibrator/BnVibrator.h>
#ifdef VIBRATOR_SUPPORTS_EFFECTS
#include <map>
#endif
namespace aidl {
namespace android {
namespace hardware {
namespace vibrator {
const std::string kVibratorPropPrefix = "ro.vendor.vibrator.hal.";
const std::string kVibratorPropDuration = ".duration";
const std::string kVibratorState = "/sys/class/leds/vibrator/state";
const std::string kVibratorDuration = "/sys/class/leds/vibrator/duration";
const std::string kVibratorActivate = "/sys/class/leds/vibrator/activate";
#ifdef VIBRATOR_SUPPORTS_EFFECTS
const std::string kVibratorStrength = "/sys/kernel/thunderquake_engine/level";
const std::string kVibratorStrengthMax = "/sys/kernel/thunderquake_engine/max";
static std::map<EffectStrength, float> vibStrengths = {
{ EffectStrength::LIGHT, 0.25 },
{ EffectStrength::MEDIUM, 0.5 },
{ EffectStrength::STRONG, 1 }
};
#endif
class Vibrator : public BnVibrator {
public:
#ifdef VIBRATOR_SUPPORTS_EFFECTS
Vibrator();
#endif
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* maxDelayMs);
ndk::ScopedAStatus getCompositionSizeMax(int32_t* maxSize);
ndk::ScopedAStatus getSupportedPrimitives(std::vector<CompositePrimitive>* supported) override;
ndk::ScopedAStatus getPrimitiveDuration(CompositePrimitive primitive,
int32_t* durationMs) 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 *resonantFreqHz) override;
ndk::ScopedAStatus getQFactor(float *qFactor) override;
ndk::ScopedAStatus getFrequencyResolution(float *freqResolutionHz) override;
ndk::ScopedAStatus getFrequencyMinimum(float *freqMinimumHz) override;
ndk::ScopedAStatus getBandwidthAmplitudeMap(std::vector<float> *_aidl_return) override;
ndk::ScopedAStatus getPwlePrimitiveDurationMax(int32_t *durationMs) override;
ndk::ScopedAStatus getPwleCompositionSizeMax(int32_t *maxSize) override;
ndk::ScopedAStatus getSupportedBraking(std::vector<Braking>* supported) override;
ndk::ScopedAStatus composePwle(const std::vector<PrimitivePwle> &composite,
const std::shared_ptr<IVibratorCallback> &callback) override;
private:
static ndk::ScopedAStatus setNode(const std::string path, const int32_t value);
static int getIntProperty(const std::string& key, const int fallback);
#ifdef VIBRATOR_SUPPORTS_EFFECTS
static bool exists(const std::string path);
static int getNode(const std::string path, const int fallback);
std::map<Effect, int32_t> vibEffects = {
{ Effect::CLICK, getIntProperty("click" + kVibratorPropDuration, 50) },
{ Effect::TICK, getIntProperty("tick" + kVibratorPropDuration, 32) },
{ Effect::TEXTURE_TICK, getIntProperty("texture_tick" + kVibratorPropDuration, 25) },
};
bool mVibratorStrengthSupported;
int mVibratorStrengthMax;
#endif
ndk::ScopedAStatus activate(const int32_t timeoutMs);
};
} // namespace vibrator
} // namespace hardware
} // namespace android
} // namespace aidl