diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2019-11-28 02:09:57 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2019-11-28 02:09:57 +0000 |
commit | 91b14d539d8848f55b30e477f8d7744e246bd330 (patch) | |
tree | 94e220d414491e463617f4adf45fb64ebd215a95 | |
parent | 8eec43905a9e58fef95aaa54844c71625ca2e5ed (diff) | |
parent | 3a8400fa91f817fdb59e572f1c6745a7d16cf2f8 (diff) | |
download | native-91b14d539d8848f55b30e477f8d7744e246bd330.tar.gz |
Merge "vibrator: Add Composition APIs"
-rw-r--r-- | cmds/idlcli/Android.bp | 3 | ||||
-rw-r--r-- | cmds/idlcli/vibrator/CommandCompose.cpp | 101 | ||||
-rw-r--r-- | cmds/idlcli/vibrator/CommandGetCompositionDelayMax.cpp | 72 | ||||
-rw-r--r-- | cmds/idlcli/vibrator/CommandGetCompositionSizeMax.cpp | 72 | ||||
-rw-r--r-- | cmds/idlcli/vibrator/CommandSetAmplitude.cpp | 3 |
5 files changed, 250 insertions, 1 deletions
diff --git a/cmds/idlcli/Android.bp b/cmds/idlcli/Android.bp index bb92fd3ac0..5476319f31 100644 --- a/cmds/idlcli/Android.bp +++ b/cmds/idlcli/Android.bp @@ -36,7 +36,10 @@ cc_library { defaults: ["idlcli-defaults"], srcs: [ "CommandVibrator.cpp", + "vibrator/CommandCompose.cpp", "vibrator/CommandGetCapabilities.cpp", + "vibrator/CommandGetCompositionDelayMax.cpp", + "vibrator/CommandGetCompositionSizeMax.cpp", "vibrator/CommandOff.cpp", "vibrator/CommandOn.cpp", "vibrator/CommandPerform.cpp", diff --git a/cmds/idlcli/vibrator/CommandCompose.cpp b/cmds/idlcli/vibrator/CommandCompose.cpp new file mode 100644 index 0000000000..705e40bbf2 --- /dev/null +++ b/cmds/idlcli/vibrator/CommandCompose.cpp @@ -0,0 +1,101 @@ +/* + * 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. + */ + +#include "utils.h" +#include "vibrator.h" + +namespace android { +namespace idlcli { + +class CommandVibrator; + +namespace vibrator { + +using aidl::CompositeEffect; + +class CommandCompose : public Command { + std::string getDescription() const override { return "Compose vibration."; } + + std::string getUsageSummary() const override { return "<delay> <primitive> <scale> ..."; } + + UsageDetails getUsageDetails() const override { + UsageDetails details{ + {"<delay>", {"In milliseconds"}}, + {"<primitive>", {"Primitive ID."}}, + {"<scale>", {"0.0 (exclusive) - 1.0 (inclusive)."}}, + {"...", {"May repeat multiple times."}}, + }; + return details; + } + + Status doArgs(Args &args) override { + while (!args.empty()) { + CompositeEffect effect; + if (auto delay = args.pop<decltype(effect.delayMs)>()) { + effect.delayMs = *delay; + std::cout << "Delay: " << effect.delayMs << std::endl; + } else { + std::cerr << "Missing or Invalid Delay!" << std::endl; + return USAGE; + } + // TODO: Use range validation when supported by AIDL + if (auto primitive = args.pop<std::underlying_type_t<decltype(effect.primitive)>>()) { + effect.primitive = static_cast<decltype(effect.primitive)>(*primitive); + std::cout << "Primitive: " << toString(effect.primitive) << std::endl; + } else { + std::cerr << "Missing or Invalid Primitive!" << std::endl; + return USAGE; + } + if (auto scale = args.pop<decltype(effect.scale)>(); + scale && *scale > 0.0 && scale <= 1.0) { + effect.scale = *scale; + std::cout << "Scale: " << effect.scale << std::endl; + } else { + std::cerr << "Missing or Invalid Scale!" << std::endl; + return USAGE; + } + mComposite.emplace_back(std::move(effect)); + } + 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::compose, mComposite, nullptr); + statusStr = status.toString8(); + ret = status.isOk() ? OK : ERROR; + } else { + return UNAVAILABLE; + } + + std::cout << "Status: " << statusStr << std::endl; + + return ret; + } + + std::vector<CompositeEffect> mComposite; +}; + +static const auto Command = CommandRegistry<CommandVibrator>::Register<CommandCompose>("compose"); + +} // namespace vibrator +} // namespace idlcli +} // namespace android diff --git a/cmds/idlcli/vibrator/CommandGetCompositionDelayMax.cpp b/cmds/idlcli/vibrator/CommandGetCompositionDelayMax.cpp new file mode 100644 index 0000000000..b4143075b3 --- /dev/null +++ b/cmds/idlcli/vibrator/CommandGetCompositionDelayMax.cpp @@ -0,0 +1,72 @@ +/* + * 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. + */ + +#include "utils.h" +#include "vibrator.h" + +namespace android { +namespace idlcli { + +class CommandVibrator; + +namespace vibrator { + +class CommandGetCompositionDelayMax : public Command { + std::string getDescription() const override { + return "Retrieves vibrator composition delay max."; + } + + std::string getUsageSummary() const override { return ""; } + + UsageDetails getUsageDetails() const override { + UsageDetails details{}; + return details; + } + + Status doArgs(Args &args) override { + if (!args.empty()) { + std::cerr << "Unexpected Arguments!" << std::endl; + return USAGE; + } + return OK; + } + + Status doMain(Args && /*args*/) override { + std::string statusStr; + int32_t maxDelayMs; + Status ret; + + if (auto hal = getHal<aidl::IVibrator>()) { + auto status = hal->call(&aidl::IVibrator::getCompositionDelayMax, &maxDelayMs); + statusStr = status.toString8(); + ret = status.isOk() ? OK : ERROR; + } else { + return UNAVAILABLE; + } + + std::cout << "Status: " << statusStr << std::endl; + std::cout << "Max Delay: " << maxDelayMs << " ms" << std::endl; + + return ret; + } +}; + +static const auto Command = + CommandRegistry<CommandVibrator>::Register<CommandGetCompositionDelayMax>( + "getCompositionDelayMax"); + +} // namespace vibrator +} // namespace idlcli +} // namespace android diff --git a/cmds/idlcli/vibrator/CommandGetCompositionSizeMax.cpp b/cmds/idlcli/vibrator/CommandGetCompositionSizeMax.cpp new file mode 100644 index 0000000000..360fc9d9e2 --- /dev/null +++ b/cmds/idlcli/vibrator/CommandGetCompositionSizeMax.cpp @@ -0,0 +1,72 @@ +/* + * 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. + */ + +#include "utils.h" +#include "vibrator.h" + +namespace android { +namespace idlcli { + +class CommandVibrator; + +namespace vibrator { + +class CommandGetCompositionSizeMax : public Command { + std::string getDescription() const override { + return "Retrieves vibrator composition size max."; + } + + std::string getUsageSummary() const override { return ""; } + + UsageDetails getUsageDetails() const override { + UsageDetails details{}; + return details; + } + + Status doArgs(Args &args) override { + if (!args.empty()) { + std::cerr << "Unexpected Arguments!" << std::endl; + return USAGE; + } + return OK; + } + + Status doMain(Args && /*args*/) override { + std::string statusStr; + int32_t maxSize; + Status ret; + + if (auto hal = getHal<aidl::IVibrator>()) { + auto status = hal->call(&aidl::IVibrator::getCompositionSizeMax, &maxSize); + statusStr = status.toString8(); + ret = status.isOk() ? OK : ERROR; + } else { + return UNAVAILABLE; + } + + std::cout << "Status: " << statusStr << std::endl; + std::cout << "Max Size: " << maxSize << std::endl; + + return ret; + } +}; + +static const auto Command = + CommandRegistry<CommandVibrator>::Register<CommandGetCompositionSizeMax>( + "getCompositionSizeMax"); + +} // namespace vibrator +} // namespace idlcli +} // namespace android diff --git a/cmds/idlcli/vibrator/CommandSetAmplitude.cpp b/cmds/idlcli/vibrator/CommandSetAmplitude.cpp index 6e2261f61e..33d7eed5be 100644 --- a/cmds/idlcli/vibrator/CommandSetAmplitude.cpp +++ b/cmds/idlcli/vibrator/CommandSetAmplitude.cpp @@ -54,7 +54,8 @@ class CommandSetAmplitude : public Command { Status ret; if (auto hal = getHal<aidl::IVibrator>()) { - auto status = hal->call(&aidl::IVibrator::setAmplitude, mAmplitude); + auto status = hal->call(&aidl::IVibrator::setAmplitude, + static_cast<float>(mAmplitude) / UINT8_MAX); statusStr = status.toString8(); ret = status.isOk() ? OK : ERROR; } else if (auto hal = getHal<V1_0::IVibrator>()) { |