From 1bc99f564c452a0c219913cf08e9654be8bbd418 Mon Sep 17 00:00:00 2001 From: Tim Zimmermann Date: Tue, 23 Nov 2021 20:45:19 +0100 Subject: [PATCH] samsung: vibrator: convert to AIDL implementation Change-Id: I785178a05d323a02b557cdd6fc22db49eb952df0 --- aidl/vibrator/Android.bp | 22 ++ aidl/vibrator/Vibrator.cpp | 296 ++++++++++++++++++ aidl/vibrator/Vibrator.h | 75 +++++ ...droid.hardware.vibrator-service.samsung.rc | 5 + ...roid.hardware.vibrator-service.samsung.xml | 6 + aidl/vibrator/service.cpp | 25 ++ hidl/vibrator/Android.bp | 35 --- hidl/vibrator/Vibrator.cpp | 259 --------------- hidl/vibrator/Vibrator.h | 94 ------ ...d.hardware.vibrator@1.3-service.samsung.rc | 4 - ....hardware.vibrator@1.3-service.samsung.xml | 11 - hidl/vibrator/service.cpp | 65 ---- 12 files changed, 429 insertions(+), 468 deletions(-) create mode 100644 aidl/vibrator/Android.bp create mode 100644 aidl/vibrator/Vibrator.cpp create mode 100644 aidl/vibrator/Vibrator.h create mode 100644 aidl/vibrator/android.hardware.vibrator-service.samsung.rc create mode 100644 aidl/vibrator/android.hardware.vibrator-service.samsung.xml create mode 100644 aidl/vibrator/service.cpp delete mode 100644 hidl/vibrator/Android.bp delete mode 100644 hidl/vibrator/Vibrator.cpp delete mode 100644 hidl/vibrator/Vibrator.h delete mode 100644 hidl/vibrator/android.hardware.vibrator@1.3-service.samsung.rc delete mode 100644 hidl/vibrator/android.hardware.vibrator@1.3-service.samsung.xml delete mode 100644 hidl/vibrator/service.cpp diff --git a/aidl/vibrator/Android.bp b/aidl/vibrator/Android.bp new file mode 100644 index 00000000..097301ca --- /dev/null +++ b/aidl/vibrator/Android.bp @@ -0,0 +1,22 @@ +// +// Copyright (C) 2021 The LineageOS Project +// +// SPDX-License-Identifier: Apache-2.0 +// + +cc_binary { + name: "android.hardware.vibrator-service.samsung", + relative_install_path: "hw", + init_rc: ["android.hardware.vibrator-service.samsung.rc"], + vintf_fragments: ["android.hardware.vibrator-service.samsung.xml"], + srcs: [ + "Vibrator.cpp", + "service.cpp", + ], + shared_libs: [ + "libbase", + "libbinder_ndk", + "android.hardware.vibrator-V2-ndk_platform", + ], + vendor: true, +} diff --git a/aidl/vibrator/Vibrator.cpp b/aidl/vibrator/Vibrator.cpp new file mode 100644 index 00000000..df2ed907 --- /dev/null +++ b/aidl/vibrator/Vibrator.cpp @@ -0,0 +1,296 @@ +/* + * Copyright (C) 2021 The LineageOS Project + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "Vibrator.h" + +#include + +#include +#include +#include +#include + +namespace aidl { +namespace android { +namespace hardware { +namespace vibrator { + +/* + * Write value to path and close file. + */ +template +static ndk::ScopedAStatus writeNode(const std::string& path, const T& value) { + std::ofstream node(path); + if (!node) { + LOG(ERROR) << "Failed to open: " << path; + return ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_ERROR); + } + + LOG(DEBUG) << "writeNode node: " << path << " value: " << value; + + node << value << std::endl; + if (!node) { + LOG(ERROR) << "Failed to write: " << value; + return ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_ERROR); + } + + return ndk::ScopedAStatus::ok(); +} + +static bool nodeExists(const std::string& path) { + std::ofstream f(path.c_str()); + return f.good(); +} + +Vibrator::Vibrator() { + mIsTimedOutVibrator = nodeExists(VIBRATOR_TIMEOUT_PATH); + mHasTimedOutIntensity = nodeExists(VIBRATOR_INTENSITY_PATH); +} + +ndk::ScopedAStatus Vibrator::getCapabilities(int32_t* _aidl_return) { + *_aidl_return = IVibrator::CAP_ON_CALLBACK | IVibrator::CAP_PERFORM_CALLBACK | + IVibrator::CAP_EXTERNAL_CONTROL /*| IVibrator::CAP_COMPOSE_EFFECTS | + IVibrator::CAP_ALWAYS_ON_CONTROL*/; + + if (mHasTimedOutIntensity) { + *_aidl_return = *_aidl_return | IVibrator::CAP_AMPLITUDE_CONTROL | + IVibrator::CAP_EXTERNAL_AMPLITUDE_CONTROL; + } + + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus Vibrator::off() { + return activate(0); +} + +ndk::ScopedAStatus Vibrator::on(int32_t timeoutMs, const std::shared_ptr& callback) { + ndk::ScopedAStatus status = activate(timeoutMs); + + if (callback != nullptr) { + std::thread([=] { + LOG(INFO) << "Starting on on another thread"; + usleep(timeoutMs * 1000); + LOG(INFO) << "Notifying on complete"; + if (!callback->onComplete().isOk()) { + LOG(ERROR) << "Failed to call onComplete"; + } + }).detach(); + } + + return status; +} + +ndk::ScopedAStatus Vibrator::perform(Effect effect, EffectStrength strength, const std::shared_ptr& callback, int32_t* _aidl_return) { + ndk::ScopedAStatus status; + uint8_t amplitude; + uint32_t ms; + + amplitude = strengthToAmplitude(strength, &status); + if (!status.isOk()) { + return status; + } + setAmplitude(amplitude); + + ms = effectToMs(effect, &status); + if (!status.isOk()) { + return status; + } + status = activate(ms); + + if (callback != nullptr) { + std::thread([=] { + LOG(INFO) << "Starting perform on another thread"; + usleep(ms * 1000); + LOG(INFO) << "Notifying perform complete"; + callback->onComplete(); + }).detach(); + } + + *_aidl_return = ms; + return status; +} + +ndk::ScopedAStatus Vibrator::getSupportedEffects(std::vector* _aidl_return) { + *_aidl_return = {Effect::CLICK, Effect::DOUBLE_CLICK, Effect::HEAVY_CLICK, + Effect::TICK, Effect::TEXTURE_TICK, Effect::THUD, Effect::POP, + Effect::RINGTONE_1, Effect::RINGTONE_2, Effect::RINGTONE_3, + Effect::RINGTONE_4, Effect::RINGTONE_5, Effect::RINGTONE_6, + Effect::RINGTONE_7, Effect::RINGTONE_7, Effect::RINGTONE_8, + Effect::RINGTONE_9, Effect::RINGTONE_10, Effect::RINGTONE_11, + Effect::RINGTONE_12, Effect::RINGTONE_13, Effect::RINGTONE_14, + Effect::RINGTONE_15}; + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus Vibrator::setAmplitude(float amplitude) { + uint32_t intensity; + + if (amplitude == 0) { + return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); + } + + LOG(DEBUG) << "Setting amplitude: " << (uint32_t)amplitude; + + intensity = std::lround((amplitude - 1) * INTENSITY_MAX / 254.0); + if (intensity > INTENSITY_MAX) { + intensity = INTENSITY_MAX; + } + LOG(DEBUG) << "Setting intensity: " << intensity; + + if (mHasTimedOutIntensity) { + return writeNode(VIBRATOR_INTENSITY_PATH, intensity); + } + + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus Vibrator::setExternalControl(bool enabled) { + if (mEnabled) { + LOG(WARNING) << "Setting external control while the vibrator is enabled is " + "unsupported!"; + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); + } + + LOG(INFO) << "ExternalControl: " << mExternalControl << " -> " << enabled; + mExternalControl = enabled; + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus Vibrator::getCompositionDelayMax(int32_t* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::getCompositionSizeMax(int32_t* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::getSupportedPrimitives(std::vector* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::getPrimitiveDuration(CompositePrimitive /*primitive*/, int32_t* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::compose(const std::vector& /*composite*/, const std::shared_ptr& /*callback*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::getSupportedAlwaysOnEffects(std::vector* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::alwaysOnEnable(int32_t /*id*/, Effect /*effect*/, EffectStrength /*strength*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::alwaysOnDisable(int32_t /*id*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::getResonantFrequency(float* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::getQFactor(float* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::getFrequencyResolution(float* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::getFrequencyMinimum(float* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::getBandwidthAmplitudeMap(std::vector* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::getPwlePrimitiveDurationMax(int32_t* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::getPwleCompositionSizeMax(int32_t* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::getSupportedBraking(std::vector* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::composePwle(const std::vector& /*composite*/, const std::shared_ptr& /*callback*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::activate(uint32_t timeoutMs) { + std::lock_guard lock{mMutex}; + if (!mIsTimedOutVibrator) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); + } + + return writeNode(VIBRATOR_TIMEOUT_PATH, timeoutMs); +} + +uint8_t Vibrator::strengthToAmplitude(EffectStrength strength, ndk::ScopedAStatus* status) { + *status = ndk::ScopedAStatus::ok(); + + switch (strength) { + case EffectStrength::LIGHT: + return 78; + case EffectStrength::MEDIUM: + return 128; + case EffectStrength::STRONG: + return 204; + } + + *status = ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); + return 0; +} + +uint32_t Vibrator::effectToMs(Effect effect, ndk::ScopedAStatus* status) { + *status = ndk::ScopedAStatus::ok(); + + switch (effect) { + case Effect::CLICK: + return 20; + case Effect::DOUBLE_CLICK: + return 25; + case Effect::HEAVY_CLICK: + return 30; + case Effect::TICK: + case Effect::TEXTURE_TICK: + case Effect::THUD: + case Effect::POP: + return 15; + case Effect::RINGTONE_1: + case Effect::RINGTONE_2: + case Effect::RINGTONE_3: + case Effect::RINGTONE_4: + case Effect::RINGTONE_5: + case Effect::RINGTONE_6: + case Effect::RINGTONE_7: + case Effect::RINGTONE_8: + case Effect::RINGTONE_9: + case Effect::RINGTONE_10: + case Effect::RINGTONE_11: + case Effect::RINGTONE_12: + case Effect::RINGTONE_13: + case Effect::RINGTONE_14: + case Effect::RINGTONE_15: + return 300; + } + + *status = ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); + return 0; +} + +} // namespace vibrator +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/aidl/vibrator/Vibrator.h b/aidl/vibrator/Vibrator.h new file mode 100644 index 00000000..67705275 --- /dev/null +++ b/aidl/vibrator/Vibrator.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2021 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 VIBRATOR_TIMEOUT_PATH "/sys/class/timed_output/vibrator/enable" +#define VIBRATOR_INTENSITY_PATH "/sys/class/timed_output/vibrator/intensity" + +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); + static uint32_t effectToMs(Effect effect, ndk::ScopedAStatus* status); + static uint8_t strengthToAmplitude(EffectStrength strength, ndk::ScopedAStatus* status); + + bool mEnabled{false}; + bool mExternalControl{false}; + std::mutex mMutex; + + bool mIsTimedOutVibrator; + bool mHasTimedOutIntensity; +}; + +} // namespace vibrator +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/aidl/vibrator/android.hardware.vibrator-service.samsung.rc b/aidl/vibrator/android.hardware.vibrator-service.samsung.rc new file mode 100644 index 00000000..3f439057 --- /dev/null +++ b/aidl/vibrator/android.hardware.vibrator-service.samsung.rc @@ -0,0 +1,5 @@ +service vendor.vibrator-default /vendor/bin/hw/android.hardware.vibrator-service.samsung + class hal + user system + group system + shutdown critical diff --git a/aidl/vibrator/android.hardware.vibrator-service.samsung.xml b/aidl/vibrator/android.hardware.vibrator-service.samsung.xml new file mode 100644 index 00000000..49b11ec8 --- /dev/null +++ b/aidl/vibrator/android.hardware.vibrator-service.samsung.xml @@ -0,0 +1,6 @@ + + + android.hardware.vibrator + IVibrator/default + + diff --git a/aidl/vibrator/service.cpp b/aidl/vibrator/service.cpp new file mode 100644 index 00000000..db782c8f --- /dev/null +++ b/aidl/vibrator/service.cpp @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2021 The LineageOS Project + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "Vibrator.h" + +#include +#include +#include + +using ::aidl::android::hardware::vibrator::Vibrator; + +int main() { + ABinderProcess_setThreadPoolMaxThreadCount(0); + std::shared_ptr vibrator = ndk::SharedRefBase::make(); + + const std::string instance = std::string() + Vibrator::descriptor + "/default"; + binder_status_t status = AServiceManager_addService(vibrator->asBinder().get(), instance.c_str()); + CHECK(status == STATUS_OK); + + ABinderProcess_joinThreadPool(); + return EXIT_FAILURE; // should not reach +} diff --git a/hidl/vibrator/Android.bp b/hidl/vibrator/Android.bp deleted file mode 100644 index 2eca7e25..00000000 --- a/hidl/vibrator/Android.bp +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (C) 2020 The LineageOS 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. - -cc_binary { - name: "android.hardware.vibrator@1.3-service.samsung", - defaults: ["hidl_defaults"], - vendor: true, - relative_install_path: "hw", - init_rc: ["android.hardware.vibrator@1.3-service.samsung.rc"], - vintf_fragments: ["android.hardware.vibrator@1.3-service.samsung.xml"], - srcs: ["service.cpp", "Vibrator.cpp"], - cflags: ["-Wall", "-Wextra", "-Werror"], - shared_libs: [ - "libbase", - "libhidlbase", - "liblog", - "libutils", - "libhardware", - "android.hardware.vibrator@1.0", - "android.hardware.vibrator@1.1", - "android.hardware.vibrator@1.2", - "android.hardware.vibrator@1.3", - ], -} diff --git a/hidl/vibrator/Vibrator.cpp b/hidl/vibrator/Vibrator.cpp deleted file mode 100644 index 110ca9db..00000000 --- a/hidl/vibrator/Vibrator.cpp +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (C) 2020 The LineageOS 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. - */ - -#define LOG_TAG "vibrator@1.3-samsung" - -#include "Vibrator.h" - -#include -#include -#include -#include - -#include -#include -#include -#include - -namespace android { -namespace hardware { -namespace vibrator { -namespace V1_3 { -namespace implementation { - -/* - * Write value to path and close file. - */ -template -static Return writeNode(const std::string& path, const T& value) { - std::ofstream node(path); - if (!node) { - LOG(ERROR) << "Failed to open: " << path; - return Status::UNKNOWN_ERROR; - } - - LOG(DEBUG) << "writeNode node: " << path << " value: " << value; - - node << value << std::endl; - if (!node) { - LOG(ERROR) << "Failed to write: " << value; - return Status::UNKNOWN_ERROR; - } - - return Status::OK; -} - -static bool nodeExists(const std::string& path) { - std::ofstream f(path.c_str()); - return f.good(); -} - -Vibrator::Vibrator() { - bool ok; - - ok = nodeExists(VIBRATOR_TIMEOUT_PATH); - if (ok) { - mIsTimedOutVibriator = true; - } - - ok = nodeExists(VIBRATOR_INTENSITY_PATH); - if (ok) { - mhasTimedOutIntensity = true; - } -} - -// Methods from ::android::hardware::vibrator::V1_0::IVibrator follow. - -Return Vibrator::on(uint32_t timeoutMs) { - return activate(timeoutMs); -} - -Return Vibrator::off() { - return activate(0); -} - -Return Vibrator::supportsAmplitudeControl() { - return true; -} - -Return Vibrator::setAmplitude(uint8_t amplitude) { - uint32_t intensity; - - if (amplitude == 0) { - return Status::BAD_VALUE; - } - - LOG(DEBUG) << "setting amplitude: " << (uint32_t)amplitude; - - intensity = std::lround((amplitude - 1) * 10000.0 / 254.0); - if (intensity > INTENSITY_MAX) { - intensity = INTENSITY_MAX; - } - LOG(DEBUG) << "setting intensity: " << intensity; - - if (mhasTimedOutIntensity) { - return writeNode(VIBRATOR_INTENSITY_PATH, intensity); - } - - return Status::OK; -} - -Return Vibrator::perform(V1_0::Effect effect, EffectStrength strength, perform_cb _hidl_cb) { - return perform(effect, strength, _hidl_cb); -} - -// Methods from ::android::hardware::vibrator::V1_1::IVibrator follow. - -Return Vibrator::perform_1_1(V1_1::Effect_1_1 effect, EffectStrength strength, - perform_cb _hidl_cb) { - return perform(effect, strength, _hidl_cb); -} - -// Methods from ::android::hardware::vibrator::V1_2::IVibrator follow. - -Return Vibrator::perform_1_2(V1_2::Effect effect, EffectStrength strength, - perform_cb _hidl_cb) { - return perform(effect, strength, _hidl_cb); -} - -// Methods from ::android::hardware::vibrator::V1_3::IVibrator follow. - -Return Vibrator::supportsExternalControl() { - return true; -} - -Return Vibrator::setExternalControl(bool enabled) { - if (mEnabled) { - LOG(WARNING) << "Setting external control while the vibrator is enabled is " - "unsupported!"; - return Status::UNSUPPORTED_OPERATION; - } - - LOG(INFO) << "ExternalControl: " << mExternalControl << " -> " << enabled; - mExternalControl = enabled; - return Status::OK; -} - -Return Vibrator::perform_1_3(Effect effect, EffectStrength strength, perform_cb _hidl_cb) { - return perform(effect, strength, _hidl_cb); -} - -// Private methods follow. - -Return Vibrator::perform(Effect effect, EffectStrength strength, perform_cb _hidl_cb) { - Status status = Status::OK; - uint8_t amplitude; - uint32_t ms; - - LOG(DEBUG) << "perform effect: " << toString(effect) - << ", strength: " << toString(strength); - - amplitude = strengthToAmplitude(strength, &status); - if (status != Status::OK) { - _hidl_cb(status, 0); - return Void(); - } - setAmplitude(amplitude); - - ms = effectToMs(effect, &status); - if (status != Status::OK) { - _hidl_cb(status, 0); - return Void(); - } - status = activate(ms); - - _hidl_cb(status, ms); - - return Void(); -} - -template -Return Vibrator::perform(T effect, EffectStrength strength, perform_cb _hidl_cb) { - auto validRange = hidl_enum_range(); - if (effect < *validRange.begin() || effect > *std::prev(validRange.end())) { - _hidl_cb(Status::UNSUPPORTED_OPERATION, 0); - return Void(); - } - return perform(static_cast(effect), strength, _hidl_cb); -} - -Status Vibrator::activate(uint32_t timeoutMs) { - std::lock_guard lock{mMutex}; - if (!mIsTimedOutVibriator) { - return Status::UNSUPPORTED_OPERATION; - } - - return writeNode(VIBRATOR_TIMEOUT_PATH, timeoutMs); -} - -uint8_t Vibrator::strengthToAmplitude(EffectStrength strength, Status* status) { - *status = Status::OK; - - switch (strength) { - case EffectStrength::LIGHT: - return 78; - case EffectStrength::MEDIUM: - return 128; - case EffectStrength::STRONG: - return 204; - } - - *status = Status::UNSUPPORTED_OPERATION; - return 0; -} - -uint32_t Vibrator::effectToMs(Effect effect, Status* status) { - *status = Status::OK; - - switch (effect) { - case Effect::CLICK: - return 20; - case Effect::DOUBLE_CLICK: - return 25; - case Effect::HEAVY_CLICK: - return 30; - case Effect::TICK: - case Effect::TEXTURE_TICK: - case Effect::THUD: - case Effect::POP: - return 15; - case Effect::RINGTONE_1: - case Effect::RINGTONE_2: - case Effect::RINGTONE_3: - case Effect::RINGTONE_4: - case Effect::RINGTONE_5: - case Effect::RINGTONE_6: - case Effect::RINGTONE_7: - case Effect::RINGTONE_8: - case Effect::RINGTONE_9: - case Effect::RINGTONE_10: - case Effect::RINGTONE_11: - case Effect::RINGTONE_12: - case Effect::RINGTONE_13: - case Effect::RINGTONE_14: - case Effect::RINGTONE_15: - return 300; - } - - *status = Status::UNSUPPORTED_OPERATION; - return 0; -} - -} // namespace implementation -} // namespace V1_3 -} // namespace vibrator -} // namespace hardware -} // namespace android diff --git a/hidl/vibrator/Vibrator.h b/hidl/vibrator/Vibrator.h deleted file mode 100644 index aba75f54..00000000 --- a/hidl/vibrator/Vibrator.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2020 The LineageOS 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. - */ - -#ifndef ANDROID_HARDWARE_VIBRATOR_V1_3_VIBRATOR_H -#define ANDROID_HARDWARE_VIBRATOR_V1_3_VIBRATOR_H - -#include -#include - -#include - -#define INTENSITY_MIN 1000 -#define INTENSITY_MAX 10000 -#define INENSITY_DEFAULT INTENSITY_MAX - -#define CLICK_TIMING_MS 20 - -#define VIBRATOR_TIMEOUT_PATH "/sys/class/timed_output/vibrator/enable" -#define VIBRATOR_INTENSITY_PATH "/sys/class/timed_output/vibrator/intensity" - -namespace android { -namespace hardware { -namespace vibrator { -namespace V1_3 { -namespace implementation { - -using android::hardware::vibrator::V1_0::EffectStrength; -using android::hardware::vibrator::V1_0::Status; - -class Vibrator : public IVibrator { - public: - Vibrator(); - - // Methods from ::android::hardware::vibrator::V1_0::IVibrator follow. - Return on(uint32_t timeoutMs) override; - Return off() override; - Return supportsAmplitudeControl() override; - Return setAmplitude(uint8_t amplitude) override; - Return perform(V1_0::Effect effect, EffectStrength strength, - perform_cb _hidl_cb) override; - - // Methods from ::android::hardware::vibrator::V1_1::IVibrator follow. - Return perform_1_1(V1_1::Effect_1_1 effect, EffectStrength strength, - perform_cb _hidl_cb) override; - - // Methods from ::android::hardware::vibrator::V1_2::IVibrator follow. - Return perform_1_2(V1_2::Effect effect, EffectStrength strength, - perform_cb _hidl_cb) override; - - // Methods from ::android::hardware::vibrator::V1_3::IVibrator follow. - Return supportsExternalControl() override; - Return setExternalControl(bool enabled) override; - Return perform_1_3(Effect effect, EffectStrength strength, perform_cb _hidl_cb) override; - - private: - Return perform(Effect effect, EffectStrength strength, perform_cb _hidl_cb); - template - Return perform(T effect, EffectStrength strength, perform_cb _hidl_cb); - Status enable(bool enabled); - Status activate(uint32_t ms); - - static uint32_t effectToMs(Effect effect, Status* status); - static uint8_t strengthToAmplitude(EffectStrength strength, Status* status); - - bool mEnabled{false}; - uint8_t mAmplitude{UINT8_MAX}; - bool mExternalControl{false}; - std::mutex mMutex; - timer_t mTimer{nullptr}; - - bool mIsTimedOutVibriator; - bool mhasTimedOutIntensity; -}; - -} // namespace implementation -} // namespace V1_3 -} // namespace vibrator -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_VIBRATOR_V1_3_VIBRATOR_H diff --git a/hidl/vibrator/android.hardware.vibrator@1.3-service.samsung.rc b/hidl/vibrator/android.hardware.vibrator@1.3-service.samsung.rc deleted file mode 100644 index 9281acbb..00000000 --- a/hidl/vibrator/android.hardware.vibrator@1.3-service.samsung.rc +++ /dev/null @@ -1,4 +0,0 @@ -service vendor.vibrator-1-3 /vendor/bin/hw/android.hardware.vibrator@1.3-service.samsung - class hal - user system - group system diff --git a/hidl/vibrator/android.hardware.vibrator@1.3-service.samsung.xml b/hidl/vibrator/android.hardware.vibrator@1.3-service.samsung.xml deleted file mode 100644 index 172aa217..00000000 --- a/hidl/vibrator/android.hardware.vibrator@1.3-service.samsung.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - android.hardware.vibrator - hwbinder - 1.3 - - IVibrator - default - - - diff --git a/hidl/vibrator/service.cpp b/hidl/vibrator/service.cpp deleted file mode 100644 index bfa98b35..00000000 --- a/hidl/vibrator/service.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2020 The LineageOS 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. - */ - -#define LOG_TAG "vibrator@1.3-samsung" - -#include -#include -#include -#include -#include -#include - -#include "Vibrator.h" - -using android::hardware::configureRpcThreadpool; -using android::hardware::joinRpcThreadpool; -using android::hardware::vibrator::V1_3::IVibrator; -using android::hardware::vibrator::V1_3::implementation::Vibrator; - -using android::OK; -using android::sp; -using android::status_t; - -int main() { - status_t status; - sp vibrator; - - LOG(INFO) << "Vibrator HAL service is starting."; - - vibrator = new Vibrator(); - if (vibrator == nullptr) { - LOG(ERROR) << "Can not create an instance of Vibrator HAL IVibrator, " - "exiting."; - goto shutdown; - } - - configureRpcThreadpool(1, true); - - status = vibrator->registerAsService(); - if (status != OK) { - LOG(ERROR) << "Could not register service for Vibrator HAL"; - goto shutdown; - } - - LOG(INFO) << "Vibrator HAL service is Ready."; - joinRpcThreadpool(); - -shutdown: - // In normal operation, we don't expect the thread pool to shutdown - LOG(ERROR) << "Vibrator HAL failed to join thread pool."; - return 1; -}