diff --git a/vibrator/Android.bp b/vibrator/Android.bp new file mode 100644 index 0000000..2478d0b --- /dev/null +++ b/vibrator/Android.bp @@ -0,0 +1,22 @@ +// +// Copyright (C) 2022 The LineageOS Project +// +// SPDX-License-Identifier: Apache-2.0 +// + +cc_binary { + name: "android.hardware.vibrator-service.RMX3031", + relative_install_path: "hw", + init_rc: ["android.hardware.vibrator-service.RMX3031.rc"], + vintf_fragments: ["android.hardware.vibrator-service.RMX3031.xml"], + srcs: [ + "Vibrator.cpp", + "service.cpp", + ], + shared_libs: [ + "libbase", + "libbinder_ndk", + "android.hardware.vibrator-V2-ndk_platform", + ], + vendor: true, +} diff --git a/vibrator/Vibrator.cpp b/vibrator/Vibrator.cpp new file mode 100644 index 0000000..9df533d --- /dev/null +++ b/vibrator/Vibrator.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2022 The LineageOS Project + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "Vibrator.h" + +namespace aidl { +namespace android { +namespace hardware { +namespace vibrator { + +ndk::ScopedAStatus Vibrator::getCapabilities(int32_t* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::off() { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::on(int32_t /*timeoutMs*/, const std::shared_ptr& /*callback*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::perform(Effect /*effect*/, EffectStrength /*strength*/, const std::shared_ptr& /*callback*/, int32_t* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::getSupportedEffects(std::vector* /*_aidl_return*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::setAmplitude(float /*amplitude*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Vibrator::setExternalControl(bool /*enabled*/) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +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); +} + +} // namespace vibrator +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/vibrator/Vibrator.h b/vibrator/Vibrator.h new file mode 100644 index 0000000..0bd42d2 --- /dev/null +++ b/vibrator/Vibrator.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2022 The LineageOS Project + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include + +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: + 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; +}; + +} // namespace vibrator +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/vibrator/android.hardware.vibrator-service.RMX3031.rc b/vibrator/android.hardware.vibrator-service.RMX3031.rc new file mode 100644 index 0000000..dfdfc32 --- /dev/null +++ b/vibrator/android.hardware.vibrator-service.RMX3031.rc @@ -0,0 +1,5 @@ +service vendor.vibrator-default /vendor/bin/hw/android.hardware.vibrator-service.RMX3031 + class hal + user system + group system + shutdown critical diff --git a/vibrator/android.hardware.vibrator-service.RMX3031.xml b/vibrator/android.hardware.vibrator-service.RMX3031.xml new file mode 100644 index 0000000..49b11ec --- /dev/null +++ b/vibrator/android.hardware.vibrator-service.RMX3031.xml @@ -0,0 +1,6 @@ + + + android.hardware.vibrator + IVibrator/default + + diff --git a/vibrator/service.cpp b/vibrator/service.cpp new file mode 100644 index 0000000..c345b6e --- /dev/null +++ b/vibrator/service.cpp @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2022 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 +}