Loading cmds/idlcli/Android.bp +6 −0 Original line number Diff line number Diff line Loading @@ -37,10 +37,16 @@ cc_library { defaults: ["idlcli-defaults"], srcs: [ "CommandVibrator.cpp", "vibrator/CommandAlwaysOnDisable.cpp", "vibrator/CommandAlwaysOnEnable.cpp", "vibrator/CommandCompose.cpp", "vibrator/CommandGetCapabilities.cpp", "vibrator/CommandGetCompositionDelayMax.cpp", "vibrator/CommandGetCompositionSizeMax.cpp", "vibrator/CommandGetPrimitiveDuration.cpp", "vibrator/CommandGetSupportedAlwaysOnEffects.cpp", "vibrator/CommandGetSupportedEffects.cpp", "vibrator/CommandGetSupportedPrimitives.cpp", "vibrator/CommandOff.cpp", "vibrator/CommandOn.cpp", "vibrator/CommandPerform.cpp", Loading cmds/idlcli/utils.h +2 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #ifndef FRAMEWORK_NATIVE_CMDS_IDLCLI_UTILS_H_ #define FRAMEWORK_NATIVE_CMDS_IDLCLI_UTILS_H_ #include <android/binder_enums.h> #include <hidl/HidlSupport.h> #include <iomanip> Loading Loading @@ -66,7 +67,7 @@ inline std::istream &operator>>(std::istream &stream, uint8_t &out) { } // namespace overrides template <typename T, typename R = hardware::hidl_enum_range<T>> template <typename T, typename R = ndk::enum_range<T>> inline std::istream &operator>>(std::istream &stream, T &out) { using overrides::operator>>; auto validRange = R(); Loading cmds/idlcli/vibrator.h +16 −0 Original line number Diff line number Diff line Loading @@ -16,8 +16,12 @@ #ifndef FRAMEWORK_NATIVE_CMDS_IDLCLI_VIBRATOR_H_ #define FRAMEWORK_NATIVE_CMDS_IDLCLI_VIBRATOR_H_ #include <future> #include <aidl/android/hardware/vibrator/BnVibratorCallback.h> #include <aidl/android/hardware/vibrator/IVibrator.h> #include <android/binder_manager.h> #include <android/binder_process.h> #include <android/hardware/vibrator/1.3/IVibrator.h> #include "utils.h" Loading Loading @@ -101,6 +105,18 @@ namespace V1_2 = ::android::hardware::vibrator::V1_2; namespace V1_3 = ::android::hardware::vibrator::V1_3; namespace aidl = ::aidl::android::hardware::vibrator; class VibratorCallback : public aidl::BnVibratorCallback { public: ndk::ScopedAStatus onComplete() override { mPromise.set_value(); return ndk::ScopedAStatus::ok(); } void waitForComplete() { mPromise.get_future().wait(); } private: std::promise<void> mPromise; }; } // namespace vibrator } // namespace idlcli Loading cmds/idlcli/vibrator/CommandAlwaysOnDisable.cpp 0 → 100644 +79 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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. */ #include "utils.h" #include "vibrator.h" namespace android { namespace idlcli { class CommandVibrator; namespace vibrator { class CommandAlwaysOnDisable : public Command { std::string getDescription() const override { return "Disarm always-on haptic source."; } std::string getUsageSummary() const override { return "<id>"; } UsageDetails getUsageDetails() const override { UsageDetails details{ {"<id>", {"Source ID (device-specific)."}}, }; return details; } Status doArgs(Args &args) override { if (auto id = args.pop<decltype(mId)>()) { mId = *id; std::cout << "Source ID: " << mId << std::endl; } else { std::cerr << "Missing or Invalid Source ID!" << std::endl; return USAGE; } if (!args.empty()) { std::cerr << "Unexpected Arguments!" << std::endl; return USAGE; } return OK; } Status doMain(Args && /*args*/) override { std::string statusStr; Status ret; if (auto hal = getHal<aidl::IVibrator>()) { auto status = hal->call(&aidl::IVibrator::alwaysOnDisable, mId); statusStr = status.getDescription(); ret = status.isOk() ? OK : ERROR; } else { return UNAVAILABLE; } std::cout << "Status: " << statusStr << std::endl; return ret; } int32_t mId; }; static const auto Command = CommandRegistry<CommandVibrator>::Register<CommandAlwaysOnDisable>("alwaysOnDisable"); } // namespace vibrator } // namespace idlcli } // namespace android cmds/idlcli/vibrator/CommandAlwaysOnEnable.cpp 0 → 100644 +102 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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. */ #include "utils.h" #include "vibrator.h" namespace android { namespace idlcli { class CommandVibrator; namespace vibrator { using aidl::Effect; using aidl::EffectStrength; class CommandAlwaysOnEnable : public Command { std::string getDescription() const override { return "Arm always-on haptic source with an effect."; } std::string getUsageSummary() const override { return "<id> <effect> <strength>"; } UsageDetails getUsageDetails() const override { UsageDetails details{ {"<id>", {"Source ID (device-specific)."}}, {"<effect>", {"Effect ID."}}, {"<strength>", {"0-2."}}, }; return details; } Status doArgs(Args &args) override { if (auto id = args.pop<decltype(mId)>()) { mId = *id; std::cout << "Source ID: " << mId << std::endl; } else { std::cerr << "Missing or Invalid Source ID!" << std::endl; return USAGE; } if (auto effect = args.pop<decltype(mEffect)>()) { mEffect = *effect; std::cout << "Effect: " << toString(mEffect) << std::endl; } else { std::cerr << "Missing or Invalid Effect!" << std::endl; return USAGE; } if (auto strength = args.pop<decltype(mStrength)>()) { mStrength = *strength; std::cout << "Strength: " << toString(mStrength) << std::endl; } else { std::cerr << "Missing or Invalid Strength!" << std::endl; return USAGE; } if (!args.empty()) { std::cerr << "Unexpected Arguments!" << std::endl; return USAGE; } return OK; } Status doMain(Args && /*args*/) override { std::string statusStr; Status ret; if (auto hal = getHal<aidl::IVibrator>()) { auto status = hal->call(&aidl::IVibrator::alwaysOnEnable, mId, mEffect, mStrength); statusStr = status.getDescription(); ret = status.isOk() ? OK : ERROR; } else { return UNAVAILABLE; } std::cout << "Status: " << statusStr << std::endl; return ret; } int32_t mId; Effect mEffect; EffectStrength mStrength; }; static const auto Command = CommandRegistry<CommandVibrator>::Register<CommandAlwaysOnEnable>("alwaysOnEnable"); } // namespace vibrator } // namespace idlcli } // namespace android Loading
cmds/idlcli/Android.bp +6 −0 Original line number Diff line number Diff line Loading @@ -37,10 +37,16 @@ cc_library { defaults: ["idlcli-defaults"], srcs: [ "CommandVibrator.cpp", "vibrator/CommandAlwaysOnDisable.cpp", "vibrator/CommandAlwaysOnEnable.cpp", "vibrator/CommandCompose.cpp", "vibrator/CommandGetCapabilities.cpp", "vibrator/CommandGetCompositionDelayMax.cpp", "vibrator/CommandGetCompositionSizeMax.cpp", "vibrator/CommandGetPrimitiveDuration.cpp", "vibrator/CommandGetSupportedAlwaysOnEffects.cpp", "vibrator/CommandGetSupportedEffects.cpp", "vibrator/CommandGetSupportedPrimitives.cpp", "vibrator/CommandOff.cpp", "vibrator/CommandOn.cpp", "vibrator/CommandPerform.cpp", Loading
cmds/idlcli/utils.h +2 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #ifndef FRAMEWORK_NATIVE_CMDS_IDLCLI_UTILS_H_ #define FRAMEWORK_NATIVE_CMDS_IDLCLI_UTILS_H_ #include <android/binder_enums.h> #include <hidl/HidlSupport.h> #include <iomanip> Loading Loading @@ -66,7 +67,7 @@ inline std::istream &operator>>(std::istream &stream, uint8_t &out) { } // namespace overrides template <typename T, typename R = hardware::hidl_enum_range<T>> template <typename T, typename R = ndk::enum_range<T>> inline std::istream &operator>>(std::istream &stream, T &out) { using overrides::operator>>; auto validRange = R(); Loading
cmds/idlcli/vibrator.h +16 −0 Original line number Diff line number Diff line Loading @@ -16,8 +16,12 @@ #ifndef FRAMEWORK_NATIVE_CMDS_IDLCLI_VIBRATOR_H_ #define FRAMEWORK_NATIVE_CMDS_IDLCLI_VIBRATOR_H_ #include <future> #include <aidl/android/hardware/vibrator/BnVibratorCallback.h> #include <aidl/android/hardware/vibrator/IVibrator.h> #include <android/binder_manager.h> #include <android/binder_process.h> #include <android/hardware/vibrator/1.3/IVibrator.h> #include "utils.h" Loading Loading @@ -101,6 +105,18 @@ namespace V1_2 = ::android::hardware::vibrator::V1_2; namespace V1_3 = ::android::hardware::vibrator::V1_3; namespace aidl = ::aidl::android::hardware::vibrator; class VibratorCallback : public aidl::BnVibratorCallback { public: ndk::ScopedAStatus onComplete() override { mPromise.set_value(); return ndk::ScopedAStatus::ok(); } void waitForComplete() { mPromise.get_future().wait(); } private: std::promise<void> mPromise; }; } // namespace vibrator } // namespace idlcli Loading
cmds/idlcli/vibrator/CommandAlwaysOnDisable.cpp 0 → 100644 +79 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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. */ #include "utils.h" #include "vibrator.h" namespace android { namespace idlcli { class CommandVibrator; namespace vibrator { class CommandAlwaysOnDisable : public Command { std::string getDescription() const override { return "Disarm always-on haptic source."; } std::string getUsageSummary() const override { return "<id>"; } UsageDetails getUsageDetails() const override { UsageDetails details{ {"<id>", {"Source ID (device-specific)."}}, }; return details; } Status doArgs(Args &args) override { if (auto id = args.pop<decltype(mId)>()) { mId = *id; std::cout << "Source ID: " << mId << std::endl; } else { std::cerr << "Missing or Invalid Source ID!" << std::endl; return USAGE; } if (!args.empty()) { std::cerr << "Unexpected Arguments!" << std::endl; return USAGE; } return OK; } Status doMain(Args && /*args*/) override { std::string statusStr; Status ret; if (auto hal = getHal<aidl::IVibrator>()) { auto status = hal->call(&aidl::IVibrator::alwaysOnDisable, mId); statusStr = status.getDescription(); ret = status.isOk() ? OK : ERROR; } else { return UNAVAILABLE; } std::cout << "Status: " << statusStr << std::endl; return ret; } int32_t mId; }; static const auto Command = CommandRegistry<CommandVibrator>::Register<CommandAlwaysOnDisable>("alwaysOnDisable"); } // namespace vibrator } // namespace idlcli } // namespace android
cmds/idlcli/vibrator/CommandAlwaysOnEnable.cpp 0 → 100644 +102 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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. */ #include "utils.h" #include "vibrator.h" namespace android { namespace idlcli { class CommandVibrator; namespace vibrator { using aidl::Effect; using aidl::EffectStrength; class CommandAlwaysOnEnable : public Command { std::string getDescription() const override { return "Arm always-on haptic source with an effect."; } std::string getUsageSummary() const override { return "<id> <effect> <strength>"; } UsageDetails getUsageDetails() const override { UsageDetails details{ {"<id>", {"Source ID (device-specific)."}}, {"<effect>", {"Effect ID."}}, {"<strength>", {"0-2."}}, }; return details; } Status doArgs(Args &args) override { if (auto id = args.pop<decltype(mId)>()) { mId = *id; std::cout << "Source ID: " << mId << std::endl; } else { std::cerr << "Missing or Invalid Source ID!" << std::endl; return USAGE; } if (auto effect = args.pop<decltype(mEffect)>()) { mEffect = *effect; std::cout << "Effect: " << toString(mEffect) << std::endl; } else { std::cerr << "Missing or Invalid Effect!" << std::endl; return USAGE; } if (auto strength = args.pop<decltype(mStrength)>()) { mStrength = *strength; std::cout << "Strength: " << toString(mStrength) << std::endl; } else { std::cerr << "Missing or Invalid Strength!" << std::endl; return USAGE; } if (!args.empty()) { std::cerr << "Unexpected Arguments!" << std::endl; return USAGE; } return OK; } Status doMain(Args && /*args*/) override { std::string statusStr; Status ret; if (auto hal = getHal<aidl::IVibrator>()) { auto status = hal->call(&aidl::IVibrator::alwaysOnEnable, mId, mEffect, mStrength); statusStr = status.getDescription(); ret = status.isOk() ? OK : ERROR; } else { return UNAVAILABLE; } std::cout << "Status: " << statusStr << std::endl; return ret; } int32_t mId; Effect mEffect; EffectStrength mStrength; }; static const auto Command = CommandRegistry<CommandVibrator>::Register<CommandAlwaysOnEnable>("alwaysOnEnable"); } // namespace vibrator } // namespace idlcli } // namespace android