diff options
author | Haamed Gheibi <haamed@google.com> | 2021-09-30 03:31:03 +0000 |
---|---|---|
committer | Haamed Gheibi <haamed@google.com> | 2021-09-30 03:32:37 +0000 |
commit | 0d25a36c4a05b7dc1fe833d311cba0abd1979db7 (patch) | |
tree | b9bb668d79bdb511337c63d71f724fd7c5d16cad | |
parent | 41b783ac627a1562c9959d2a309339c43e89ee95 (diff) | |
parent | e58dbcf0de859ade425f22b62a45259449ae538d (diff) |
Merge TP1A.210812.002
Bug: 198367246
Change-Id: I64df13aefdc06c8bb9f9b3a4256c41879e15e515
742 files changed, 40448 insertions, 3206 deletions
diff --git a/atrace/1.0/vts/functional/OWNERS b/atrace/1.0/vts/functional/OWNERS new file mode 100644 index 0000000000..31043aa716 --- /dev/null +++ b/atrace/1.0/vts/functional/OWNERS @@ -0,0 +1,2 @@ +# Bug component: 837454 +wvw@google.com diff --git a/audio/7.0/config/update_audio_policy_config.sh b/audio/7.0/config/update_audio_policy_config.sh index 159fa35946..c475dd17f0 100755 --- a/audio/7.0/config/update_audio_policy_config.sh +++ b/audio/7.0/config/update_audio_policy_config.sh @@ -41,7 +41,7 @@ set -euo pipefail -if (echo "$@" | grep -qe -h); then +if (echo "$@" | grep -qe "^-h"); then echo "This script will update Audio Policy Manager config file" echo "to the format required by V7.0 XSD schema from a previous" echo "version." diff --git a/audio/common/all-versions/default/service/service.cpp b/audio/common/all-versions/default/service/service.cpp index eab9c3ef94..4f4e88bbc2 100644 --- a/audio/common/all-versions/default/service/service.cpp +++ b/audio/common/all-versions/default/service/service.cpp @@ -16,6 +16,7 @@ #define LOG_TAG "audiohalservice" +#include <signal.h> #include <string> #include <vector> @@ -61,6 +62,7 @@ int main(int /* argc */, char* /* argv */ []) { #ifdef ARCH_ARM_32 android::hardware::ProcessState::initWithMmapSize(getHWBinderMmapSize()); #endif + ::android::ProcessState::initWithDriver("/dev/vndbinder"); // start a threadpool for vndbinder interactions ::android::ProcessState::self()->startThreadPool(); diff --git a/audio/core/all-versions/default/Android.bp b/audio/core/all-versions/default/Android.bp index 901b7eeab9..392642d383 100644 --- a/audio/core/all-versions/default/Android.bp +++ b/audio/core/all-versions/default/Android.bp @@ -48,6 +48,8 @@ cc_defaults { "libhidlbase", "liblog", "libmedia_helper", + "libmediautils_vendor", + "libmemunreachable", "libutils", "android.hardware.audio.common-util", ], diff --git a/audio/core/all-versions/default/Device.cpp b/audio/core/all-versions/default/Device.cpp index 130dfba95b..c33e6f30fa 100644 --- a/audio/core/all-versions/default/Device.cpp +++ b/audio/core/all-versions/default/Device.cpp @@ -30,6 +30,8 @@ #include <algorithm> #include <android/log.h> +#include <mediautils/MemoryLeakTrackUtil.h> +#include <memunreachable/memunreachable.h> #include <HidlUtils.h> @@ -456,9 +458,32 @@ Return<void> Device::debugDump(const hidl_handle& fd) { } #endif -Return<void> Device::debug(const hidl_handle& fd, const hidl_vec<hidl_string>& /* options */) { +Return<void> Device::debug(const hidl_handle& fd, const hidl_vec<hidl_string>& options) { if (fd.getNativeHandle() != nullptr && fd->numFds == 1) { - analyzeStatus("dump", mDevice->dump(mDevice, fd->data[0])); + const int fd0 = fd->data[0]; + bool dumpMem = false; + bool unreachableMemory = false; + for (const auto& option : options) { + if (option == "-m") { + dumpMem = true; + } else if (option == "--unreachable") { + unreachableMemory = true; + } + } + + if (dumpMem) { + dprintf(fd0, "\nDumping memory:\n"); + std::string s = dumpMemoryAddresses(100 /* limit */); + write(fd0, s.c_str(), s.size()); + } + if (unreachableMemory) { + dprintf(fd0, "\nDumping unreachable memory:\n"); + // TODO - should limit be an argument parameter? + std::string s = GetUnreachableMemoryString(true /* contents */, 100 /* limit */); + write(fd0, s.c_str(), s.size()); + } + + analyzeStatus("dump", mDevice->dump(mDevice, fd0)); } return Void(); } diff --git a/audio/core/all-versions/vts/functional/Android.bp b/audio/core/all-versions/vts/functional/Android.bp index e446a7f2cf..9f4a2952c6 100644 --- a/audio/core/all-versions/vts/functional/Android.bp +++ b/audio/core/all-versions/vts/functional/Android.bp @@ -30,6 +30,7 @@ cc_defaults { "android.hardware.audio.common.test.utility", "audioclient-types-aidl-cpp", "libaudioclient_aidl_conversion", + "libstagefright_foundation", ], shared_libs: [ "libbinder", diff --git a/audio/core/all-versions/vts/functional/AudioPrimaryHidlHalTest.h b/audio/core/all-versions/vts/functional/AudioPrimaryHidlHalTest.h index aa7fd8e857..340903a4ea 100644 --- a/audio/core/all-versions/vts/functional/AudioPrimaryHidlHalTest.h +++ b/audio/core/all-versions/vts/functional/AudioPrimaryHidlHalTest.h @@ -1390,6 +1390,9 @@ static void testSetAudioProperties(IStream* stream) { config.channelMask.value(channelMask); auto ret = stream->setAudioProperties(config); EXPECT_TRUE(ret.isOk()); + if (ret == Result::NOT_SUPPORTED) { + GTEST_SKIP() << "setAudioProperties is not supported"; + } EXPECT_EQ(Result::OK, ret) << profile.format << "; " << sampleRate << "; " << channelMask; } diff --git a/audio/effect/all-versions/OWNERS b/audio/effect/all-versions/OWNERS index 24071af220..f9a2d6b27b 100644 --- a/audio/effect/all-versions/OWNERS +++ b/audio/effect/all-versions/OWNERS @@ -1,2 +1,3 @@ +# Bug component: 48436 elaurent@google.com mnaganov@google.com diff --git a/authsecret/aidl/default/Android.bp b/authsecret/aidl/default/Android.bp index a6c0bc4001..7ce83fd9ea 100644 --- a/authsecret/aidl/default/Android.bp +++ b/authsecret/aidl/default/Android.bp @@ -34,7 +34,7 @@ cc_binary { "AuthSecret.cpp", ], shared_libs: [ - "android.hardware.authsecret-V1-ndk_platform", + "android.hardware.authsecret-V1-ndk", "libbase", "libbinder_ndk", ], diff --git a/authsecret/aidl/vts/Android.bp b/authsecret/aidl/vts/Android.bp index dca70465ab..5ec9947660 100644 --- a/authsecret/aidl/vts/Android.bp +++ b/authsecret/aidl/vts/Android.bp @@ -30,7 +30,7 @@ cc_test { "use_libaidlvintf_gtest_helper_static", ], srcs: ["VtsHalAuthSecretTargetTest.cpp"], - static_libs: ["android.hardware.authsecret-V1-ndk_platform"], + static_libs: ["android.hardware.authsecret-V1-ndk"], shared_libs: ["libbinder_ndk"], test_suites: [ "general-tests", diff --git a/automotive/audiocontrol/aidl/default/Android.bp b/automotive/audiocontrol/aidl/default/Android.bp index 7694bdf160..1439cce606 100644 --- a/automotive/audiocontrol/aidl/default/Android.bp +++ b/automotive/audiocontrol/aidl/default/Android.bp @@ -29,8 +29,8 @@ cc_binary { vendor: true, shared_libs: [ "android.hardware.audio.common@7.0-enums", - "android.frameworks.automotive.powerpolicy-V1-ndk_platform", - "android.hardware.automotive.audiocontrol-V1-ndk_platform", + "android.frameworks.automotive.powerpolicy-V1-ndk", + "android.hardware.automotive.audiocontrol-V1-ndk", "libbase", "libbinder_ndk", "libcutils", diff --git a/automotive/can/1.0/default/libnl++/Android.bp b/automotive/can/1.0/default/libnl++/Android.bp index 790adcd073..2ebd1b4732 100644 --- a/automotive/can/1.0/default/libnl++/Android.bp +++ b/automotive/can/1.0/default/libnl++/Android.bp @@ -35,6 +35,7 @@ cc_library_static { "protocols/generic/Generic.cpp", "protocols/generic/GenericMessageBase.cpp", "protocols/generic/Unknown.cpp", + "protocols/generic/families/Mac80211hwsim.cpp", "protocols/generic/families/Nl80211.cpp", "protocols/route/Link.cpp", "protocols/route/Route.cpp", @@ -42,6 +43,7 @@ cc_library_static { "protocols/MessageDefinition.cpp", "protocols/NetlinkProtocol.cpp", "protocols/all.cpp", + "protocols/structs.cpp", "Attributes.cpp", "MessageFactory.cpp", "MessageMutator.cpp", diff --git a/automotive/can/1.0/default/libnl++/MessageMutator.cpp b/automotive/can/1.0/default/libnl++/MessageMutator.cpp index 00b48a66ae..de2a2b1e47 100644 --- a/automotive/can/1.0/default/libnl++/MessageMutator.cpp +++ b/automotive/can/1.0/default/libnl++/MessageMutator.cpp @@ -19,7 +19,7 @@ namespace android::nl { MessageMutator::MessageMutator(nlmsghdr* buffer, size_t totalLen) - : mConstBuffer(buffer, totalLen), mMutableBuffer(buffer) { + : mMutableBuffer(buffer), mTotalLen(totalLen) { CHECK(totalLen >= sizeof(nlmsghdr)); } @@ -27,8 +27,12 @@ nlmsghdr* MessageMutator::operator->() const { return mMutableBuffer; } +Buffer<nlmsghdr> MessageMutator::constBuffer() const { + return {mMutableBuffer, mTotalLen}; +} + MessageMutator::operator Buffer<nlmsghdr>() const { - return mConstBuffer; + return constBuffer(); } uint64_t MessageMutator::read(Buffer<nlattr> attr) const { @@ -37,7 +41,8 @@ uint64_t MessageMutator::read(Buffer<nlattr> attr) const { void MessageMutator::write(Buffer<nlattr> attr, uint64_t val) const { const auto attrData = attr.data<uint64_t>(); - const auto offset = mConstBuffer.getOffset(attrData); + // TODO(b/177251183): deduplicate this code against fragment() + const auto offset = constBuffer().getOffset(attrData); CHECK(offset.has_value()) << "Trying to write attribute that's not a member of this message"; const auto writeableBuffer = reinterpret_cast<uint8_t*>(mMutableBuffer) + *offset; @@ -47,4 +52,40 @@ void MessageMutator::write(Buffer<nlattr> attr, uint64_t val) const { memcpy(writeableBuffer, &val, std::min(sizeof(val), attrSize)); } +MessageMutator MessageMutator::fragment(Buffer<nlmsghdr> buf) const { + const auto offset = constBuffer().getOffset(buf); + CHECK(offset.has_value()) << "Trying to modify a fragment outside of buffer range"; + + const auto writeableBuffer = reinterpret_cast<nlmsghdr*>(uintptr_t(mMutableBuffer) + *offset); + const auto len = buf.getRaw().len(); + CHECK(len <= mTotalLen - *offset); + + return {writeableBuffer, len}; +} + +MessageMutator::iterator MessageMutator::begin() const { + return {*this, constBuffer().begin()}; +} + +MessageMutator::iterator MessageMutator::end() const { + return {*this, constBuffer().end()}; +} + +MessageMutator::iterator::iterator(const MessageMutator& container, + Buffer<nlmsghdr>::iterator current) + : mContainer(container), mCurrent(current) {} + +MessageMutator::iterator MessageMutator::iterator::operator++() { + ++mCurrent; + return *this; +} + +bool MessageMutator::iterator::operator==(const iterator& other) const { + return other.mCurrent == mCurrent; +} + +const MessageMutator MessageMutator::iterator::operator*() const { + return mContainer.fragment(*mCurrent); +} + } // namespace android::nl diff --git a/automotive/can/1.0/default/libnl++/Socket.cpp b/automotive/can/1.0/default/libnl++/Socket.cpp index 514d9bb1b9..cc1d839434 100644 --- a/automotive/can/1.0/default/libnl++/Socket.cpp +++ b/automotive/can/1.0/default/libnl++/Socket.cpp @@ -68,6 +68,11 @@ bool Socket::send(const Buffer<nlmsghdr>& msg, const sockaddr_nl& sa) { return true; } +bool Socket::send(const Buffer<nlmsghdr>& msg, uint32_t destination) { + sockaddr_nl sa = {.nl_family = AF_NETLINK, .nl_pad = 0, .nl_pid = destination, .nl_groups = 0}; + return send(msg, sa); +} + bool Socket::increaseReceiveBuffer(size_t maxSize) { if (maxSize == 0) { LOG(ERROR) << "Maximum receive size should not be zero"; @@ -157,6 +162,26 @@ pollfd Socket::preparePoll(short events) { return {mFd.get(), events, 0}; } +bool Socket::addMembership(unsigned group) { + const auto res = + setsockopt(mFd.get(), SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, &group, sizeof(group)); + if (res < 0) { + PLOG(ERROR) << "Failed joining multicast group " << group; + return false; + } + return true; +} + +bool Socket::dropMembership(unsigned group) { + const auto res = + setsockopt(mFd.get(), SOL_NETLINK, NETLINK_DROP_MEMBERSHIP, &group, sizeof(group)); + if (res < 0) { + PLOG(ERROR) << "Failed leaving multicast group " << group; + return false; + } + return true; +} + Socket::receive_iterator::receive_iterator(Socket& socket, bool end) : mSocket(socket), mIsEnd(end) { if (!end) receive(); diff --git a/automotive/can/1.0/default/libnl++/include/libnl++/Buffer.h b/automotive/can/1.0/default/libnl++/include/libnl++/Buffer.h index d759a0a570..4cabb9af87 100644 --- a/automotive/can/1.0/default/libnl++/include/libnl++/Buffer.h +++ b/automotive/can/1.0/default/libnl++/include/libnl++/Buffer.h @@ -138,7 +138,7 @@ class Buffer { class raw_iterator : public iterator { public: iterator operator++() { - this->mCurrent.mData++; // ignore alignment + ++this->mCurrent.mData; // ignore alignment return *this; } const T& operator*() const { return *this->mCurrent.mData; } diff --git a/automotive/can/1.0/default/libnl++/include/libnl++/Message.h b/automotive/can/1.0/default/libnl++/include/libnl++/Message.h index 50b3c4b05d..29f397d430 100644 --- a/automotive/can/1.0/default/libnl++/include/libnl++/Message.h +++ b/automotive/can/1.0/default/libnl++/include/libnl++/Message.h @@ -34,7 +34,7 @@ namespace android::nl { * a single instance can only be used by a single thread - the one owning the underlying buffer). */ template <typename T> -class Message { +class Message : public Buffer<nlmsghdr> { public: /** * Validate buffer contents as a message carrying T data and create instance of parsed message. @@ -51,7 +51,7 @@ class Message { const auto attributes = buf.data<nlattr>(sizeof(T)); - return Message<T>(nlHeader, dataHeader, attributes); + return Message<T>(buf, nlHeader, dataHeader, attributes); } /** @@ -94,8 +94,9 @@ class Message { const T* operator->() const { return &data; } private: - Message(const nlmsghdr& nlHeader, const T& dataHeader, Attributes attributes) - : header(nlHeader), data(dataHeader), attributes(attributes) {} + Message(Buffer<nlmsghdr> buffer, const nlmsghdr& nlHeader, const T& dataHeader, + Attributes attributes) + : Buffer<nlmsghdr>(buffer), header(nlHeader), data(dataHeader), attributes(attributes) {} }; } // namespace android::nl diff --git a/automotive/can/1.0/default/libnl++/include/libnl++/MessageMutator.h b/automotive/can/1.0/default/libnl++/include/libnl++/MessageMutator.h index 7d495e9a5b..baadc44689 100644 --- a/automotive/can/1.0/default/libnl++/include/libnl++/MessageMutator.h +++ b/automotive/can/1.0/default/libnl++/include/libnl++/MessageMutator.h @@ -53,9 +53,27 @@ class MessageMutator { */ void write(Buffer<nlattr> attr, uint64_t val) const; + class iterator { + public: + iterator(const MessageMutator& container, Buffer<nlmsghdr>::iterator current); + + iterator operator++(); + bool operator==(const iterator& other) const; + const MessageMutator operator*() const; + + protected: + const MessageMutator& mContainer; + Buffer<nlmsghdr>::iterator mCurrent; + }; + iterator begin() const; + iterator end() const; + private: - const Buffer<nlmsghdr> mConstBuffer; nlmsghdr* mMutableBuffer; + size_t mTotalLen; + + Buffer<nlmsghdr> constBuffer() const; + MessageMutator fragment(Buffer<nlmsghdr> buf) const; }; } // namespace android::nl diff --git a/automotive/can/1.0/default/libnl++/include/libnl++/Socket.h b/automotive/can/1.0/default/libnl++/include/libnl++/Socket.h index 8ea3575720..7ec0f7bdf9 100644 --- a/automotive/can/1.0/default/libnl++/include/libnl++/Socket.h +++ b/automotive/can/1.0/default/libnl++/include/libnl++/Socket.h @@ -95,6 +95,15 @@ class Socket { bool send(const Buffer<nlmsghdr>& msg, const sockaddr_nl& sa); /** + * Send Netlink message. + * + * \param msg Message to send. + * \param destination Destination PID. + * \return true, if succeeded. + */ + bool send(const Buffer<nlmsghdr>& msg, uint32_t destination); + + /** * Receive one or multiple Netlink messages. * * WARNING: the underlying buffer is owned by Socket class and the data is valid until the next @@ -183,6 +192,22 @@ class Socket { pollfd preparePoll(short events = 0); /** + * Join a multicast group. + * + * \param group Group ID (*not* a bitfield) + * \return whether the operation succeeded + */ + bool addMembership(unsigned group); + + /** + * Leave a multicast group. + * + * \param group Group ID (*not* a bitfield) + * \return whether the operation succeeded + */ + bool dropMembership(unsigned group); + + /** * Live iterator continuously receiving messages from Netlink socket. * * Iteration ends when socket fails to receive a buffer. diff --git a/automotive/can/1.0/default/libnl++/include/libnl++/generic/families/mac80211_hwsim.h b/automotive/can/1.0/default/libnl++/include/libnl++/generic/families/mac80211_hwsim.h new file mode 100644 index 0000000000..9b811f8a3d --- /dev/null +++ b/automotive/can/1.0/default/libnl++/include/libnl++/generic/families/mac80211_hwsim.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2021 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. + */ + +// API definitions from kernel drivers/net/wireless/mac80211_hwsim.h + +#define BIT(n) (1 << (n)) + +enum hwsim_tx_control_flags { + HWSIM_TX_CTL_REQ_TX_STATUS = BIT(0), + HWSIM_TX_CTL_NO_ACK = BIT(1), + HWSIM_TX_STAT_ACK = BIT(2), +}; + +enum { + HWSIM_CMD_UNSPEC, + HWSIM_CMD_REGISTER, + HWSIM_CMD_FRAME, + HWSIM_CMD_TX_INFO_FRAME, + HWSIM_CMD_NEW_RADIO, + HWSIM_CMD_DEL_RADIO, + HWSIM_CMD_GET_RADIO, + HWSIM_CMD_ADD_MAC_ADDR, + HWSIM_CMD_DEL_MAC_ADDR, +}; + +enum { + HWSIM_ATTR_UNSPEC, + HWSIM_ATTR_ADDR_RECEIVER, + HWSIM_ATTR_ADDR_TRANSMITTER, + HWSIM_ATTR_FRAME, + HWSIM_ATTR_FLAGS, + HWSIM_ATTR_RX_RATE, + HWSIM_ATTR_SIGNAL, + HWSIM_ATTR_TX_INFO, + HWSIM_ATTR_COOKIE, + HWSIM_ATTR_CHANNELS, + HWSIM_ATTR_RADIO_ID, + HWSIM_ATTR_REG_HINT_ALPHA2, + HWSIM_ATTR_REG_CUSTOM_REG, + HWSIM_ATTR_REG_STRICT_REG, + HWSIM_ATTR_SUPPORT_P2P_DEVICE, + HWSIM_ATTR_USE_CHANCTX, + HWSIM_ATTR_DESTROY_RADIO_ON_CLOSE, + HWSIM_ATTR_RADIO_NAME, + HWSIM_ATTR_NO_VIF, + HWSIM_ATTR_FREQ, + HWSIM_ATTR_PAD, + HWSIM_ATTR_TX_INFO_FLAGS, + HWSIM_ATTR_PERM_ADDR, + HWSIM_ATTR_IFTYPE_SUPPORT, + HWSIM_ATTR_CIPHER_SUPPORT, +}; + +struct hwsim_tx_rate { + int8_t idx; + uint8_t count; +} __packed; +static_assert(sizeof(hwsim_tx_rate) == 2); + +#undef BIT diff --git a/automotive/can/1.0/default/libnl++/printer.cpp b/automotive/can/1.0/default/libnl++/printer.cpp index f08897e951..d5404825b8 100644 --- a/automotive/can/1.0/default/libnl++/printer.cpp +++ b/automotive/can/1.0/default/libnl++/printer.cpp @@ -154,16 +154,19 @@ static void toStream(std::stringstream& ss, const Buffer<nlattr> attr, } } -std::string toString(const Buffer<nlmsghdr> hdr, int protocol, bool printPayload) { - if (!hdr.firstOk()) return "nlmsg{buffer overflow}"; +static void toStream(std::stringstream& ss, const Buffer<nlmsghdr> hdr, int protocol, + bool printPayload) { + if (!hdr.firstOk()) { + ss << "nlmsg{buffer overflow}"; + return; + } - std::stringstream ss; ss << std::setfill('0'); auto protocolMaybe = protocols::get(protocol); if (!protocolMaybe.has_value()) { ss << "nlmsg{protocol=" << protocol << "}"; - return ss.str(); + return; } protocols::NetlinkProtocol& protocolDescr = *protocolMaybe; @@ -187,7 +190,7 @@ std::string toString(const Buffer<nlmsghdr> hdr, int protocol, bool printPayload ss << ", crc=" << std::hex << std::setw(4) << crc16(hdr.data<uint8_t>()) << std::dec; ss << '}'; - if (!printPayload) return ss.str(); + if (!printPayload) return; ss << ' '; if (!msgDescMaybe.has_value()) { @@ -210,6 +213,17 @@ std::string toString(const Buffer<nlmsghdr> hdr, int protocol, bool printPayload } ss << "}"; +} + +std::string toString(const Buffer<nlmsghdr> hdrs, int protocol, bool printPayload) { + std::stringstream ss; + bool first = true; + for (const auto hdr : hdrs) { + if (!first) ss << std::endl; + first = false; + + toStream(ss, hdr, protocol, printPayload); + } return ss.str(); } diff --git a/automotive/can/1.0/default/libnl++/protocols/generic/Ctrl.cpp b/automotive/can/1.0/default/libnl++/protocols/generic/Ctrl.cpp index 1e1ad12c84..478c3831cf 100644 --- a/automotive/can/1.0/default/libnl++/protocols/generic/Ctrl.cpp +++ b/automotive/can/1.0/default/libnl++/protocols/generic/Ctrl.cpp @@ -16,6 +16,7 @@ #include "Ctrl.h" +#include "families/Mac80211hwsim.h" #include "families/Nl80211.h" #include <libnl++/Message.h> @@ -68,12 +69,15 @@ void Ctrl::track(const Buffer<nlmsghdr> hdr) { const auto familyId = msg.attributes.get<uint16_t>(CTRL_ATTR_FAMILY_ID); const auto familyName = msg.attributes.get<std::string>(CTRL_ATTR_FAMILY_NAME); - /* For now, we support just a single family. But if you add more, please define proper + /* For now, we support just two families. But if you add more, please define proper * abstraction and not hardcode every name and class here. */ if (familyName == "nl80211") { mFamilyRegister[familyId] = std::make_shared<families::Nl80211>(familyId); } + if (familyName == "MAC80211_HWSIM") { + mFamilyRegister[familyId] = std::make_shared<families::Mac80211hwsim>(familyId); + } } } // namespace android::nl::protocols::generic diff --git a/automotive/can/1.0/default/libnl++/protocols/generic/GenericMessageBase.cpp b/automotive/can/1.0/default/libnl++/protocols/generic/GenericMessageBase.cpp index b7b811b629..f92d6c000b 100644 --- a/automotive/can/1.0/default/libnl++/protocols/generic/GenericMessageBase.cpp +++ b/automotive/can/1.0/default/libnl++/protocols/generic/GenericMessageBase.cpp @@ -40,9 +40,9 @@ void GenericMessageBase::toStream(std::stringstream& ss, const genlmsghdr& data) ss << "genlmsghdr{"; if (commandName.has_value()) { - ss << "cmd=" << unsigned(data.cmd); - } else { ss << "cmd=" << *commandName; + } else { + ss << "cmd=" << unsigned(data.cmd); } ss << ", version=" << unsigned(data.version); if (data.reserved != 0) ss << ", reserved=" << data.reserved; diff --git a/automotive/can/1.0/default/libnl++/protocols/generic/families/Mac80211hwsim.cpp b/automotive/can/1.0/default/libnl++/protocols/generic/families/Mac80211hwsim.cpp new file mode 100644 index 0000000000..f85309e7a2 --- /dev/null +++ b/automotive/can/1.0/default/libnl++/protocols/generic/families/Mac80211hwsim.cpp @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2021 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 "Mac80211hwsim.h" + +#include "../../structs.h" +#include "common.h" + +#include <libnl++/generic/families/mac80211_hwsim.h> + +namespace android::nl::protocols::generic::families { + +using DataType = AttributeDefinition::DataType; +using Flags = AttributeDefinition::Flags; + +static void hwsim_tx_rateToStream(std::stringstream& ss, const Buffer<nlattr> attr); + +static const FlagsMap txControlFlags{ + {HWSIM_TX_CTL_REQ_TX_STATUS, "REQ_TX"}, + {HWSIM_TX_CTL_NO_ACK, "NO_ACK"}, + {HWSIM_TX_STAT_ACK, "ACK"}, +}; + +// clang-format off +Mac80211hwsim::Mac80211hwsim(nlmsgtype_t familyId) : GenericMessageBase(familyId, "hwsim", { + {HWSIM_CMD_UNSPEC, "UNSPEC"}, + {HWSIM_CMD_REGISTER, "REGISTER"}, + {HWSIM_CMD_FRAME, "FRAME"}, + {HWSIM_CMD_TX_INFO_FRAME, "TX_INFO_FRAME"}, + {HWSIM_CMD_NEW_RADIO, "NEW_RADIO"}, + {HWSIM_CMD_DEL_RADIO, "DEL_RADIO"}, + {HWSIM_CMD_GET_RADIO, "GET_RADIO"}, + {HWSIM_CMD_ADD_MAC_ADDR, "ADD_MAC_ADDR"}, + {HWSIM_CMD_DEL_MAC_ADDR, "DEL_MAC_ADDR"}, +}, { + {HWSIM_ATTR_UNSPEC, {"UNSPEC"}}, + {HWSIM_ATTR_ADDR_RECEIVER, {"ADDR_RECEIVER", DataType::Struct, hwaddrToStream}}, + {HWSIM_ATTR_ADDR_TRANSMITTER, {"ADDR_TRANSMITTER", DataType::Struct, hwaddrToStream}}, + {HWSIM_ATTR_FRAME, {"FRAME", DataType::Raw, AttributeMap{}, Flags::Verbose}}, + {HWSIM_ATTR_FLAGS, {"FLAGS", DataType::Struct, flagsToStream(txControlFlags)}}, + {HWSIM_ATTR_RX_RATE, {"RX_RATE", DataType::Uint}}, + {HWSIM_ATTR_SIGNAL, {"SIGNAL", DataType::Uint}}, + {HWSIM_ATTR_TX_INFO, {"TX_INFO", DataType::Struct, hwsim_tx_rateToStream}}, + {HWSIM_ATTR_COOKIE, {"COOKIE", DataType::Uint}}, + {HWSIM_ATTR_CHANNELS, {"CHANNELS", DataType::Uint}}, + {HWSIM_ATTR_RADIO_ID, {"RADIO_ID", DataType::Uint}}, + {HWSIM_ATTR_REG_HINT_ALPHA2, {"REG_HINT_ALPHA2", DataType::String}}, + {HWSIM_ATTR_REG_CUSTOM_REG, {"REG_CUSTOM_REG", DataType::Uint}}, + {HWSIM_ATTR_REG_STRICT_REG, {"REG_STRICT_REG", DataType::Flag}}, + {HWSIM_ATTR_SUPPORT_P2P_DEVICE, {"SUPPORT_P2P_DEVICE", DataType::Flag}}, + {HWSIM_ATTR_USE_CHANCTX, {"USE_CHANCTX", DataType::Flag}}, + {HWSIM_ATTR_DESTROY_RADIO_ON_CLOSE, {"DESTROY_RADIO_ON_CLOSE", DataType::Flag}}, + {HWSIM_ATTR_RADIO_NAME, {"RADIO_NAME", DataType::String}}, + {HWSIM_ATTR_NO_VIF, {"NO_VIF", DataType::Flag}}, + {HWSIM_ATTR_FREQ, {"FREQ", DataType::Uint}}, + {HWSIM_ATTR_PAD, {"PAD", DataType::Uint}}, + {HWSIM_ATTR_TX_INFO_FLAGS, {"TX_INFO_FLAGS"}}, // hwsim_tx_rate_flag + {HWSIM_ATTR_PERM_ADDR, {"PERM_ADDR"}}, + {HWSIM_ATTR_IFTYPE_SUPPORT, {"IFTYPE_SUPPORT", DataType::Uint}}, // NL80211_IFTYPE_STATION etc + {HWSIM_ATTR_CIPHER_SUPPORT, {"CIPHER_SUPPORT", DataType::Struct, arrayToStream<int32_t>}}, +}) {} +// clang-format on + +static void hwsim_tx_rateToStream(std::stringstream& ss, const Buffer<nlattr> attr) { + ss << '{'; + bool first = true; + for (const auto rate : attr.data<hwsim_tx_rate>().getRaw()) { + if (rate.idx == -1) continue; + + ss << (int)rate.idx << ": " << (unsigned)rate.count; + + if (!first) ss << ", "; + first = false; + } + ss << '}'; +} + +} // namespace android::nl::protocols::generic::families diff --git a/automotive/can/1.0/default/libnl++/protocols/generic/families/Mac80211hwsim.h b/automotive/can/1.0/default/libnl++/protocols/generic/families/Mac80211hwsim.h new file mode 100644 index 0000000000..c01eb93b91 --- /dev/null +++ b/automotive/can/1.0/default/libnl++/protocols/generic/families/Mac80211hwsim.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2021 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 "../GenericMessageBase.h" + +namespace android::nl::protocols::generic::families { + +class Mac80211hwsim : public GenericMessageBase { + public: + Mac80211hwsim(nlmsgtype_t familyId); +}; + +} // namespace android::nl::protocols::generic::families diff --git a/automotive/can/1.0/default/libnl++/protocols/structs.cpp b/automotive/can/1.0/default/libnl++/protocols/structs.cpp new file mode 100644 index 0000000000..8ff71f006a --- /dev/null +++ b/automotive/can/1.0/default/libnl++/protocols/structs.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2021 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 "structs.h" + +#include <iomanip> + +namespace android::nl::protocols { + +AttributeDefinition::ToStream flagsToStream(FlagsMap flags) { + return [flags](std::stringstream& ss, const Buffer<nlattr> attr) { + auto val = attr.data<uint64_t>().copyFirst(); + + bool first = true; + for (const auto& [flag, name] : flags) { + if ((val & flag) != flag) continue; + val &= ~flag; + + if (!first) ss << '|'; + first = false; + + ss << name; + } + + if (val == 0) return; + + if (!first) ss << '|'; + ss << std::hex << val << std::dec; + }; +} + +void hwaddrToStream(std::stringstream& ss, const Buffer<nlattr> attr) { + ss << std::hex; + bool first = true; + for (const auto byte : attr.data<uint8_t>().getRaw()) { + if (!first) ss << ':'; + first = false; + + ss << std::setw(2) << unsigned(byte); + } + ss << std::dec; +} + +} // namespace android::nl::protocols diff --git a/automotive/can/1.0/default/libnl++/protocols/structs.h b/automotive/can/1.0/default/libnl++/protocols/structs.h index 44c17b84b9..f3a8c44afe 100644 --- a/automotive/can/1.0/default/libnl++/protocols/structs.h +++ b/automotive/can/1.0/default/libnl++/protocols/structs.h @@ -16,6 +16,8 @@ #pragma once +#include "MessageDefinition.h" + #include <sstream> namespace android::nl::protocols { @@ -30,4 +32,9 @@ void arrayToStream(std::stringstream& ss, const Buffer<nlattr> attr) { ss << '}'; } +typedef std::map<uint64_t, std::string> FlagsMap; +AttributeDefinition::ToStream flagsToStream(FlagsMap flags); + +void hwaddrToStream(std::stringstream& ss, const Buffer<nlattr> attr); + } // namespace android::nl::protocols diff --git a/automotive/occupant_awareness/aidl/Android.bp b/automotive/occupant_awareness/aidl/Android.bp index 26c53fa4bb..288dc6d0c0 100644 --- a/automotive/occupant_awareness/aidl/Android.bp +++ b/automotive/occupant_awareness/aidl/Android.bp @@ -16,7 +16,7 @@ aidl_interface { stability: "vintf", backend: { java: { - platform_apis: true, + sdk_version: "module_current", }, ndk: { vndk: { diff --git a/automotive/occupant_awareness/aidl/default/Android.bp b/automotive/occupant_awareness/aidl/default/Android.bp index 4db43bbd85..66af9deed0 100644 --- a/automotive/occupant_awareness/aidl/default/Android.bp +++ b/automotive/occupant_awareness/aidl/default/Android.bp @@ -36,6 +36,6 @@ cc_binary { "libbase", "libbinder_ndk", "libutils", - "android.hardware.automotive.occupant_awareness-V1-ndk_platform", + "android.hardware.automotive.occupant_awareness-V1-ndk", ], } diff --git a/automotive/occupant_awareness/aidl/mock/Android.bp b/automotive/occupant_awareness/aidl/mock/Android.bp index 275eb22f31..b80462249d 100644 --- a/automotive/occupant_awareness/aidl/mock/Android.bp +++ b/automotive/occupant_awareness/aidl/mock/Android.bp @@ -36,6 +36,6 @@ cc_binary { "libbase", "libbinder_ndk", "libutils", - "android.hardware.automotive.occupant_awareness-V1-ndk_platform", + "android.hardware.automotive.occupant_awareness-V1-ndk", ], } diff --git a/automotive/vehicle/2.0/default/Android.bp b/automotive/vehicle/2.0/default/Android.bp index ffa0c13958..f96654f056 100644 --- a/automotive/vehicle/2.0/default/Android.bp +++ b/automotive/vehicle/2.0/default/Android.bp @@ -41,12 +41,13 @@ cc_defaults { defaults: ["vhal_v2_0_defaults"], shared_libs: [ "libbinder_ndk", - "android.automotive.watchdog-V2-ndk_platform", + "android.automotive.watchdog-V2-ndk", ], } cc_library_headers { name: "vhal_v2_0_common_headers", + visibility: ["//visibility:public"], vendor: true, export_include_dirs: ["common/include/vhal_v2_0"], } @@ -58,6 +59,7 @@ cc_library { defaults: ["vhal_v2_0_target_defaults"], srcs: [ "common/src/Obd2SensorStore.cpp", + "common/src/ProtoMessageConverter.cpp", "common/src/SubscriptionManager.cpp", "common/src/VehicleHalManager.cpp", "common/src/VehicleObjectPool.cpp", @@ -68,9 +70,13 @@ cc_library { ], shared_libs: [ "libbase", + "libprotobuf-cpp-lite", ], local_include_dirs: ["common/include/vhal_v2_0"], export_include_dirs: ["common/include"], + static_libs: [ + "android.hardware.automotive.vehicle@2.0-libproto-native", + ], } // Vehicle default VehicleHAL implementation @@ -80,19 +86,13 @@ cc_library_static { defaults: ["vhal_v2_0_target_defaults"], cflags: ["-DENABLE_VENDOR_CLUSTER_PROPERTY_FOR_TESTING"], srcs: [ - "impl/vhal_v2_0/CommConn.cpp", - "impl/vhal_v2_0/EmulatedVehicleConnector.cpp", - "impl/vhal_v2_0/EmulatedVehicleHal.cpp", + "impl/vhal_v2_0/DefaultVehicleHal.cpp", "impl/vhal_v2_0/VehicleHalClient.cpp", - "impl/vhal_v2_0/VehicleHalServer.cpp", - "impl/vhal_v2_0/VehicleEmulator.cpp", - "impl/vhal_v2_0/PipeComm.cpp", - "impl/vhal_v2_0/ProtoMessageConverter.cpp", - "impl/vhal_v2_0/SocketComm.cpp", + "impl/vhal_v2_0/DefaultVehicleHalServer.cpp", "impl/vhal_v2_0/LinearFakeValueGenerator.cpp", "impl/vhal_v2_0/JsonFakeValueGenerator.cpp", "impl/vhal_v2_0/GeneratorHub.cpp", - "impl/vhal_v2_0/qemu_pipe.cpp", + "impl/vhal_v2_0/FakeObd2Frame.cpp", ], local_include_dirs: ["common/include/vhal_v2_0"], export_include_dirs: ["impl"], @@ -110,19 +110,6 @@ cc_library_static { ], } -// Library used to emulate User HAL behavior through lshal debug requests. -cc_library_static { - name: "android.hardware.automotive.vehicle@2.0-emulated-user-hal-lib", - vendor: true, - defaults: ["vhal_v2_0_target_defaults"], - srcs: [ - "impl/vhal_v2_0/EmulatedUserHal.cpp", - ], - whole_static_libs: [ - "android.hardware.automotive.vehicle@2.0-user-hal-helper-lib", - ], -} - // Vehicle HAL Server reference impl lib cc_library_static { name: "android.hardware.automotive.vehicle@2.0-server-common-lib", @@ -133,10 +120,14 @@ cc_library_static { export_include_dirs: ["common/include"], srcs: [ "common/src/Obd2SensorStore.cpp", + "common/src/ProtoMessageConverter.cpp", "common/src/VehicleObjectPool.cpp", "common/src/VehiclePropertyStore.cpp", "common/src/VehicleUtils.cpp", ], + static_libs: [ + "android.hardware.automotive.vehicle@2.0-libproto-native", + ], } // Vehicle HAL Server default implementation @@ -151,12 +142,11 @@ cc_library_static { "impl/vhal_v2_0/GeneratorHub.cpp", "impl/vhal_v2_0/JsonFakeValueGenerator.cpp", "impl/vhal_v2_0/LinearFakeValueGenerator.cpp", - "impl/vhal_v2_0/ProtoMessageConverter.cpp", - "impl/vhal_v2_0/VehicleHalServer.cpp", + "impl/vhal_v2_0/DefaultVehicleHalServer.cpp", + "impl/vhal_v2_0/FakeObd2Frame.cpp", ], whole_static_libs: [ "android.hardware.automotive.vehicle@2.0-server-common-lib", - "android.hardware.automotive.vehicle@2.0-user-hal-helper-lib", ], static_libs: [ "android.hardware.automotive.vehicle@2.0-libproto-native", @@ -182,6 +172,17 @@ cc_test { ], shared_libs: [ "libbase", + "libcutils", + ], + // Exclude share libraries from default because they might be missing on + // some test platforms and we are using static libraries instead. + exclude_shared_libs: [ + "android.automotive.watchdog-V2-ndk", + "android.hardware.automotive.vehicle@2.0", + ], + static_libs: [ + "android.automotive.watchdog-V2-ndk", + "android.hardware.automotive.vehicle@2.0", ], header_libs: ["libbase_headers"], test_suites: ["general-tests"], @@ -193,22 +194,41 @@ cc_test { defaults: ["vhal_v2_0_target_defaults"], srcs: [ "impl/vhal_v2_0/tests/ProtoMessageConverter_test.cpp", + "impl/vhal_v2_0/tests/DefaultVhalImpl_test.cpp", ], static_libs: [ + "libbase", + "libcutils", + "libgmock", + "libjsoncpp", + "libprotobuf-cpp-lite", + ], + // Exclude share libraries from default because they might be missing on + // some test platforms and we are using static libraries instead. + exclude_shared_libs: [ + "android.automotive.watchdog-V2-ndk", + "android.hardware.automotive.vehicle@2.0", + ], + whole_static_libs: [ + "android.automotive.watchdog-V2-ndk", + "android.hardware.automotive.vehicle@2.0", "android.hardware.automotive.vehicle@2.0-default-impl-lib", "android.hardware.automotive.vehicle@2.0-libproto-native", - "libprotobuf-cpp-lite", + ], + data: [ + ":vhal_test_json", + ":vhal_test_override_json", ], test_suites: ["general-tests"], } cc_binary { - name: "android.hardware.automotive.vehicle@2.0-service", + name: "android.hardware.automotive.vehicle@2.0-default-service", defaults: ["vhal_v2_0_target_defaults"], vintf_fragments: [ - "android.hardware.automotive.vehicle@2.0-service.xml", + "android.hardware.automotive.vehicle@2.0-default-service.xml", ], - init_rc: ["android.hardware.automotive.vehicle@2.0-service.rc"], + init_rc: ["android.hardware.automotive.vehicle@2.0-default-service.rc"], vendor: true, relative_install_path: "hw", srcs: ["VehicleService.cpp"], @@ -219,8 +239,8 @@ cc_binary { ], static_libs: [ "android.hardware.automotive.vehicle@2.0-manager-lib", - "android.hardware.automotive.vehicle@2.0-default-impl-lib", "android.hardware.automotive.vehicle@2.0-libproto-native", + "android.hardware.automotive.vehicle@2.0-default-impl-lib", ], } diff --git a/automotive/vehicle/2.0/default/TEST_MAPPING b/automotive/vehicle/2.0/default/TEST_MAPPING new file mode 100644 index 0000000000..bb58700f62 --- /dev/null +++ b/automotive/vehicle/2.0/default/TEST_MAPPING @@ -0,0 +1,10 @@ +{ + "presubmit": [ + { + "name": "android.hardware.automotive.vehicle@2.0-manager-unit-tests" + }, + { + "name": "android.hardware.automotive.vehicle@2.0-default-impl-unit-tests" + } + ] +} diff --git a/automotive/vehicle/2.0/default/VehicleService.cpp b/automotive/vehicle/2.0/default/VehicleService.cpp index 7e8deb6777..12e15f9db3 100644 --- a/automotive/vehicle/2.0/default/VehicleService.cpp +++ b/automotive/vehicle/2.0/default/VehicleService.cpp @@ -14,42 +14,40 @@ * limitations under the License. */ -#define LOG_TAG "automotive.vehicle@2.0-service" +#define LOG_TAG "automotive.vehicle@2.0-default-service" #include <android/log.h> #include <hidl/HidlTransportSupport.h> #include <iostream> -#include <vhal_v2_0/EmulatedUserHal.h> -#include <vhal_v2_0/EmulatedVehicleConnector.h> -#include <vhal_v2_0/EmulatedVehicleHal.h> +#include <vhal_v2_0/DefaultVehicleConnector.h> +#include <vhal_v2_0/DefaultVehicleHal.h> #include <vhal_v2_0/VehicleHalManager.h> -using namespace android; -using namespace android::hardware; -using namespace android::hardware::automotive::vehicle::V2_0; +using ::android::hardware::automotive::vehicle::V2_0::VehicleHalManager; +using ::android::hardware::automotive::vehicle::V2_0::VehiclePropertyStore; +using ::android::hardware::automotive::vehicle::V2_0::impl::DefaultVehicleConnector; +using ::android::hardware::automotive::vehicle::V2_0::impl::DefaultVehicleHal; int main(int /* argc */, char* /* argv */ []) { auto store = std::make_unique<VehiclePropertyStore>(); - auto connector = std::make_unique<impl::EmulatedVehicleConnector>(); - auto userHal = connector->getEmulatedUserHal(); - auto hal = std::make_unique<impl::EmulatedVehicleHal>(store.get(), connector.get(), userHal); - auto emulator = std::make_unique<impl::VehicleEmulator>(hal.get()); + auto connector = std::make_unique<DefaultVehicleConnector>(); + auto hal = std::make_unique<DefaultVehicleHal>(store.get(), connector.get()); auto service = std::make_unique<VehicleHalManager>(hal.get()); connector->setValuePool(hal->getValuePool()); - configureRpcThreadpool(4, true /* callerWillJoin */); + android::hardware::configureRpcThreadpool(4, true /* callerWillJoin */); ALOGI("Registering as service..."); - status_t status = service->registerAsService(); + android::status_t status = service->registerAsService(); - if (status != OK) { + if (status != android::OK) { ALOGE("Unable to register vehicle service (%d)", status); return 1; } ALOGI("Ready"); - joinRpcThreadpool(); + android::hardware::joinRpcThreadpool(); - return 1; + return 0; } diff --git a/automotive/vehicle/2.0/default/android.hardware.automotive.vehicle@2.0-service.rc b/automotive/vehicle/2.0/default/android.hardware.automotive.vehicle@2.0-default-service.rc index c8c89dc821..8279af71c9 100644 --- a/automotive/vehicle/2.0/default/android.hardware.automotive.vehicle@2.0-service.rc +++ b/automotive/vehicle/2.0/default/android.hardware.automotive.vehicle@2.0-default-service.rc @@ -1,4 +1,4 @@ -service vendor.vehicle-hal-2.0 /vendor/bin/hw/android.hardware.automotive.vehicle@2.0-service - class hal +service vendor.vehicle-hal-2.0 /vendor/bin/hw/android.hardware.automotive.vehicle@2.0-default-service + class early_hal user vehicle_network group system inet diff --git a/automotive/vehicle/2.0/default/android.hardware.automotive.vehicle@2.0-service.xml b/automotive/vehicle/2.0/default/android.hardware.automotive.vehicle@2.0-default-service.xml index 660b03d9cf..660b03d9cf 100644 --- a/automotive/vehicle/2.0/default/android.hardware.automotive.vehicle@2.0-service.xml +++ b/automotive/vehicle/2.0/default/android.hardware.automotive.vehicle@2.0-default-service.xml diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/ProtoMessageConverter.h b/automotive/vehicle/2.0/default/common/include/vhal_v2_0/ProtoMessageConverter.h index 01f3beb49b..01f3beb49b 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/ProtoMessageConverter.h +++ b/automotive/vehicle/2.0/default/common/include/vhal_v2_0/ProtoMessageConverter.h diff --git a/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleConnector.h b/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleConnector.h index 2908a55c25..345c356714 100644 --- a/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleConnector.h +++ b/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleConnector.h @@ -20,6 +20,7 @@ #include <vector> #include <android/hardware/automotive/vehicle/2.0/types.h> +#include <utils/Log.h> #include "VehicleClient.h" #include "VehicleServer.h" @@ -72,7 +73,21 @@ class IPassThroughConnector : public VehicleClientType, public VehicleServerType } bool dump(const hidl_handle& handle, const hidl_vec<hidl_string>& options) override { - return this->onDump(handle, options); + // Calls server's onDump function and print the dumped info to the handle. + std::vector<std::string> stdOptions; + for (size_t i = 0; i < options.size(); i++) { + stdOptions.push_back(options[i]); + } + IVehicleServer::DumpResult result = this->onDump(stdOptions); + int fd = handle->data[0]; + if (fd < 0) { + ALOGW("Invalid fd from HIDL handle: %d", fd); + return false; + } + if (result.buffer.size() != 0) { + dprintf(fd, "[VehicleHalServer] Dumped info: %s\n", result.buffer.c_str()); + } + return result.callerShouldDumpState; } // To be implemented: diff --git a/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleHalManager.h b/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleHalManager.h index fcfe7612ac..6706258717 100644 --- a/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleHalManager.h +++ b/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleHalManager.h @@ -76,6 +76,9 @@ public: Return<void> debug(const hidl_handle& fd, const hidl_vec<hidl_string>& options) override; private: + // Set unit test class as friend class to test private functions. + friend class VehicleHalManagerTestHelper; + using VehiclePropValuePtr = VehicleHal::VehiclePropValuePtr; // Returns true if needs to call again shortly. using RetriableAction = std::function<bool()>; @@ -105,14 +108,20 @@ public: void cmdDumpOneProperty(int fd, int32_t prop, int32_t areaId); void cmdDumpOneProperty(int fd, int rowNumber, const VehiclePropConfig& config); + bool cmdSetOneProperty(int fd, const hidl_vec<hidl_string>& options); + static bool checkArgumentsSize(int fd, const hidl_vec<hidl_string>& options, size_t minSize); static bool checkCallerHasWritePermissions(int fd); - static bool safelyParseInt(int fd, int index, std::string s, int* out); + template <typename T> + static bool safelyParseInt(int fd, int index, const std::string& s, T* out); + static bool safelyParseFloat(int fd, int index, const std::string& s, float* out); + // Parses "s" as a hex string and populate "*bytes". The hex string must be in the format of + // valid hex format, e.g. "0xABCD". + static bool parseHexString(int fd, const std::string& s, std::vector<uint8_t>* bytes); void cmdHelp(int fd) const; void cmdListAllProperties(int fd) const; void cmdDumpAllProperties(int fd); void cmdDumpSpecificProperties(int fd, const hidl_vec<hidl_string>& options); - void cmdSetOneProperty(int fd, const hidl_vec<hidl_string>& options); static bool isSubscribable(const VehiclePropConfig& config, SubscribeFlags flags); @@ -120,7 +129,18 @@ public: static float checkSampleRate(const VehiclePropConfig& config, float sampleRate); static ClientId getClientId(const sp<IVehicleCallback>& callback); -private: + + // Parses the cmdline options for "--set" command. "*prop" would be populated with the + // the properties to be set. Returns true when the cmdline options are valid, false otherwise. + static bool parseSetPropOptions(int fd, const hidl_vec<hidl_string>& options, + VehiclePropValue* prop); + // Parses the options and get the values for the current option specified by "*index". "*index" + // would advance to the next option field (e.g., the next "-f"). Returns a list of values for + // the current option. + static std::vector<std::string> getOptionValues(const hidl_vec<hidl_string>& options, + size_t* index); + + private: VehicleHal* mHal; std::unique_ptr<VehiclePropConfigIndex> mConfigIndex; SubscriptionManager mSubscriptionManager; diff --git a/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleServer.h b/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleServer.h index ba9799af1b..2c484e8462 100644 --- a/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleServer.h +++ b/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleServer.h @@ -28,6 +28,16 @@ namespace android::hardware::automotive::vehicle::V2_0 { */ class IVehicleServer { public: + // The return structure for onDump function. + struct DumpResult { + // If callerShouldDumpState is true, caller would print the information in buffer and + // continue to dump its state, otherwise would just dump the buffer and skip its own + // dumping logic. + bool callerShouldDumpState; + // The dumped information for the caller to print. + std::string buffer; + }; + IVehicleServer() = default; IVehicleServer(const IVehicleServer&) = delete; @@ -54,15 +64,9 @@ class IVehicleServer { // generated by car (ECU/fake generator/injected) virtual void onPropertyValueFromCar(const VehiclePropValue& value, bool updateStatus) = 0; - // TODO (chenhaosjtuacm): fix this since there are no HIDL in non-Android OS -#ifdef __ANDROID__ // Dump method forwarded from HIDL's debug() // If implemented, it must return whether the caller should dump its state. - virtual bool onDump(const hidl_handle& /* handle */, - const hidl_vec<hidl_string>& /* options */) { - return true; - } -#endif // __ANDROID__ + virtual DumpResult onDump(const std::vector<std::string>& options) = 0; }; } // namespace android::hardware::automotive::vehicle::V2_0 diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/ProtoMessageConverter.cpp b/automotive/vehicle/2.0/default/common/src/ProtoMessageConverter.cpp index 77cb114164..77cb114164 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/ProtoMessageConverter.cpp +++ b/automotive/vehicle/2.0/default/common/src/ProtoMessageConverter.cpp diff --git a/automotive/vehicle/2.0/default/common/src/VehicleHalManager.cpp b/automotive/vehicle/2.0/default/common/src/VehicleHalManager.cpp index dc5d3d300e..e34e692bfc 100644 --- a/automotive/vehicle/2.0/default/common/src/VehicleHalManager.cpp +++ b/automotive/vehicle/2.0/default/common/src/VehicleHalManager.cpp @@ -20,7 +20,9 @@ #include <cmath> #include <fstream> +#include <unordered_set> +#include <android-base/parsedouble.h> #include <android-base/parseint.h> #include <android-base/strings.h> #include <android/hardware/automotive/vehicle/2.0/BpHwVehicleCallback.h> @@ -44,15 +46,34 @@ using ::android::base::EqualsIgnoreCase; using ::android::hardware::hidl_handle; using ::android::hardware::hidl_string; +namespace { + constexpr std::chrono::milliseconds kHalEventBatchingTimeWindow(10); const VehiclePropValue kEmptyValue{}; +// A list of supported options for "--set" command. +const std::unordered_set<std::string> kSetPropOptions = { + // integer. + "-i", + // 64bit integer. + "-i64", + // float. + "-f", + // string. + "-s", + // bytes in hex format, e.g. 0xDEADBEEF. + "-b", + // Area id in integer. + "-a"}; + +} // namespace + /** * Indicates what's the maximum size of hidl_vec<VehiclePropValue> we want * to store in reusable object pool. */ -constexpr auto kMaxHidlVecOfVehiclPropValuePoolSize = 20; +constexpr auto kMaxHidlVecOfVehiclePropValuePoolSize = 20; Return<void> VehicleHalManager::getAllPropConfigs(getAllPropConfigs_cb _hidl_cb) { ALOGI("getAllPropConfigs called"); @@ -213,6 +234,11 @@ void VehicleHalManager::cmdDump(int fd, const hidl_vec<hidl_string>& options) { } else if (EqualsIgnoreCase(option, "--get")) { cmdDumpSpecificProperties(fd, options); } else if (EqualsIgnoreCase(option, "--set")) { + if (!checkCallerHasWritePermissions(fd)) { + dprintf(fd, "Caller does not have write permission\n"); + return; + } + // Ignore the return value for this. cmdSetOneProperty(fd, options); } else { dprintf(fd, "Invalid option: %s\n", option.c_str()); @@ -239,7 +265,8 @@ bool VehicleHalManager::checkArgumentsSize(int fd, const hidl_vec<hidl_string>& return false; } -bool VehicleHalManager::safelyParseInt(int fd, int index, std::string s, int* out) { +template <typename T> +bool VehicleHalManager::safelyParseInt(int fd, int index, const std::string& s, T* out) { if (!android::base::ParseInt(s, out)) { dprintf(fd, "non-integer argument at index %d: %s\n", index, s.c_str()); return false; @@ -247,19 +274,27 @@ bool VehicleHalManager::safelyParseInt(int fd, int index, std::string s, int* ou return true; } +bool VehicleHalManager::safelyParseFloat(int fd, int index, const std::string& s, float* out) { + if (!android::base::ParseFloat(s, out)) { + dprintf(fd, "non-float argument at index %d: %s\n", index, s.c_str()); + return false; + } + return true; +} + void VehicleHalManager::cmdHelp(int fd) const { dprintf(fd, "Usage: \n\n"); dprintf(fd, "[no args]: dumps (id and value) all supported properties \n"); dprintf(fd, "--help: shows this help\n"); dprintf(fd, "--list: lists the ids of all supported properties\n"); dprintf(fd, "--get <PROP1> [PROP2] [PROPN]: dumps the value of specific properties \n"); - // TODO: support other formats (int64, float, bytes) dprintf(fd, - "--set <PROP> <i|s> <VALUE_1> [<i|s> <VALUE_N>] [a AREA_ID] : sets the value of " - "property PROP, using arbitrary number of key/value parameters (i for int32, " - "s for string) and an optional area.\n" - "Notice that the string value can be set just once, while the other can have multiple " - "values (so they're used in the respective array)\n"); + "--set <PROP> [-i INT_VALUE [INT_VALUE ...]] [-i64 INT64_VALUE [INT64_VALUE ...]] " + "[-f FLOAT_VALUE [FLOAT_VALUE ...]] [-s STR_VALUE] " + "[-b BYTES_VALUE] [-a AREA_ID] : sets the value of property PROP. " + "Notice that the string, bytes and area value can be set just once, while the other can" + " have multiple values (so they're used in the respective array), " + "BYTES_VALUE is in the form of 0xXXXX, e.g. 0xdeadbeef.\n"); } void VehicleHalManager::cmdListAllProperties(int fd) const { @@ -337,102 +372,49 @@ void VehicleHalManager::cmdDumpOneProperty(int fd, int32_t prop, int32_t areaId) VehiclePropValue input; input.prop = prop; input.areaId = areaId; - auto callback = [&](StatusCode status, const VehiclePropValue& output) { + auto callback = [&fd, &prop](StatusCode status, const VehiclePropValue& output) { if (status == StatusCode::OK) { dprintf(fd, "%s\n", toString(output).c_str()); } else { dprintf(fd, "Could not get property %d. Error: %s\n", prop, toString(status).c_str()); } }; - get(input, callback); -} - -void VehicleHalManager::cmdSetOneProperty(int fd, const hidl_vec<hidl_string>& options) { - if (!checkCallerHasWritePermissions(fd) || !checkArgumentsSize(fd, options, 3)) return; - size_t size = options.size(); + StatusCode status; + auto value = mHal->get(input, &status); + callback(status, value.get() ? *value : kEmptyValue); +} - // Syntax is --set PROP Type1 Value1 TypeN ValueN, so number of arguments must be even - if (size % 2 != 0) { - dprintf(fd, "must pass even number of arguments (passed %zu)\n", size); - return; +bool VehicleHalManager::cmdSetOneProperty(int fd, const hidl_vec<hidl_string>& options) { + if (!checkArgumentsSize(fd, options, 4)) { + dprintf(fd, "Requires at least 4 options, see help\n"); + return false; } - int numberValues = (size - 2) / 2; - - VehiclePropValue prop; - if (!safelyParseInt(fd, 1, options[1], &prop.prop)) return; - prop.timestamp = elapsedRealtimeNano(); - prop.status = VehiclePropertyStatus::AVAILABLE; - - // First pass: calculate sizes - int sizeInt32 = 0; - int stringIndex = 0; - int areaIndex = 0; - for (int i = 2, kv = 1; kv <= numberValues; kv++) { - // iterate through the kv=1..n key/value pairs, accessing indexes i / i+1 at each step - std::string type = options[i]; - std::string value = options[i + 1]; - if (EqualsIgnoreCase(type, "i")) { - sizeInt32++; - } else if (EqualsIgnoreCase(type, "s")) { - if (stringIndex != 0) { - dprintf(fd, - "defining string value (%s) again at index %d (already defined at %d=%s" - ")\n", - value.c_str(), i, stringIndex, options[stringIndex + 1].c_str()); - return; - } - stringIndex = i; - } else if (EqualsIgnoreCase(type, "a")) { - if (areaIndex != 0) { - dprintf(fd, - "defining area value (%s) again at index %d (already defined at %d=%s" - ")\n", - value.c_str(), i, areaIndex, options[areaIndex + 1].c_str()); - return; - } - areaIndex = i; - } else { - dprintf(fd, "invalid (%s) type at index %d\n", type.c_str(), i); - return; - } - i += 2; - } - prop.value.int32Values.resize(sizeInt32); - - // Second pass: populate it - int indexInt32 = 0; - for (int i = 2, kv = 1; kv <= numberValues; kv++) { - // iterate through the kv=1..n key/value pairs, accessing indexes i / i+1 at each step - int valueIndex = i + 1; - std::string type = options[i]; - std::string value = options[valueIndex]; - if (EqualsIgnoreCase(type, "i")) { - int safeInt; - if (!safelyParseInt(fd, valueIndex, value, &safeInt)) return; - prop.value.int32Values[indexInt32++] = safeInt; - } else if (EqualsIgnoreCase(type, "s")) { - prop.value.stringValue = value; - } else if (EqualsIgnoreCase(type, "a")) { - if (!safelyParseInt(fd, valueIndex, value, &prop.areaId)) return; - } - i += 2; + + VehiclePropValue prop = {}; + if (!parseSetPropOptions(fd, options, &prop)) { + return false; } ALOGD("Setting prop %s", toString(prop).c_str()); - auto status = set(prop); + + // Do not use VehicleHalManager::set here because we don't want to check write permission. + // Caller should be able to use the debug interface to set read-only properties. + handlePropertySetEvent(prop); + auto status = mHal->set(prop); + if (status == StatusCode::OK) { dprintf(fd, "Set property %s\n", toString(prop).c_str()); - } else { - dprintf(fd, "Failed to set property %s: %s\n", toString(prop).c_str(), - toString(status).c_str()); + return true; } + dprintf(fd, "Failed to set property %s: %s\n", toString(prop).c_str(), + toString(status).c_str()); + return false; } void VehicleHalManager::init() { ALOGI("VehicleHalManager::init"); - mHidlVecOfVehiclePropValuePool.resize(kMaxHidlVecOfVehiclPropValuePoolSize); - + mHidlVecOfVehiclePropValuePool.resize(kMaxHidlVecOfVehiclePropValuePoolSize); mBatchingConsumer.run(&mEventQueue, kHalEventBatchingTimeWindow, @@ -486,7 +468,7 @@ void VehicleHalManager::onBatchHalEvent(const std::vector<VehiclePropValuePtr>& for (const HalClientValues& cv : clientValues) { auto vecSize = cv.values.size(); hidl_vec<VehiclePropValue> vec; - if (vecSize < kMaxHidlVecOfVehiclPropValuePoolSize) { + if (vecSize < kMaxHidlVecOfVehiclePropValuePoolSize) { vec.setToExternal(&mHidlVecOfVehiclePropValuePool[0], vecSize); } else { vec.resize(vecSize); @@ -595,6 +577,158 @@ ClientId VehicleHalManager::getClientId(const sp<IVehicleCallback>& callback) { } } +std::vector<std::string> VehicleHalManager::getOptionValues(const hidl_vec<hidl_string>& options, + size_t* index) { + std::vector<std::string> values; + while (*index < options.size()) { + std::string option = options[*index]; + if (kSetPropOptions.find(option) != kSetPropOptions.end()) { + return std::move(values); + } + values.push_back(option); + (*index)++; + } + return std::move(values); +} + +bool VehicleHalManager::parseSetPropOptions(int fd, const hidl_vec<hidl_string>& options, + VehiclePropValue* prop) { + // Options format: + // --set PROP [-f f1 f2...] [-i i1 i2...] [-i64 i1 i2...] [-s s1 s2...] [-b b1 b2...] [-a a] + size_t optionIndex = 1; + int propValue; + if (!safelyParseInt(fd, optionIndex, options[optionIndex], &propValue)) { + dprintf(fd, "property value: \"%s\" is not a valid int\n", options[optionIndex].c_str()); + return false; + } + prop->prop = propValue; + prop->timestamp = elapsedRealtimeNano(); + prop->status = VehiclePropertyStatus::AVAILABLE; + optionIndex++; + std::unordered_set<std::string> parsedOptions; + + while (optionIndex < options.size()) { + std::string type = options[optionIndex]; + optionIndex++; + size_t currentIndex = optionIndex; + std::vector<std::string> values = getOptionValues(options, &optionIndex); + if (parsedOptions.find(type) != parsedOptions.end()) { + dprintf(fd, "duplicate \"%s\" options\n", type.c_str()); + return false; + } + parsedOptions.insert(type); + if (EqualsIgnoreCase(type, "-i")) { + if (values.size() == 0) { + dprintf(fd, "no values specified when using \"-i\"\n"); + return false; + } + prop->value.int32Values.resize(values.size()); + for (size_t i = 0; i < values.size(); i++) { + int32_t safeInt; + if (!safelyParseInt(fd, currentIndex + i, values[i], &safeInt)) { + dprintf(fd, "value: \"%s\" is not a valid int\n", values[i].c_str()); + return false; + } + prop->value.int32Values[i] = safeInt; + } + } else if (EqualsIgnoreCase(type, "-i64")) { + if (values.size() == 0) { + dprintf(fd, "no values specified when using \"-i64\"\n"); + return false; + } + prop->value.int64Values.resize(values.size()); + for (size_t i = 0; i < values.size(); i++) { + int64_t safeInt; + if (!safelyParseInt(fd, currentIndex + i, values[i], &safeInt)) { + dprintf(fd, "value: \"%s\" is not a valid int64\n", values[i].c_str()); + return false; + } + prop->value.int64Values[i] = safeInt; + } + } else if (EqualsIgnoreCase(type, "-f")) { + if (values.size() == 0) { + dprintf(fd, "no values specified when using \"-f\"\n"); + return false; + } + prop->value.floatValues.resize(values.size()); + for (size_t i = 0; i < values.size(); i++) { + float safeFloat; + if (!safelyParseFloat(fd, currentIndex + i, values[i], &safeFloat)) { + dprintf(fd, "value: \"%s\" is not a valid float\n", values[i].c_str()); + return false; + } + prop->value.floatValues[i] = safeFloat; + } + } else if (EqualsIgnoreCase(type, "-s")) { + if (values.size() != 1) { + dprintf(fd, "expect exact one value when using \"-s\"\n"); + return false; + } + prop->value.stringValue = values[0]; + } else if (EqualsIgnoreCase(type, "-b")) { + if (values.size() != 1) { + dprintf(fd, "expect exact one value when using \"-b\"\n"); + return false; + } + std::vector<uint8_t> bytes; + if (!parseHexString(fd, values[0], &bytes)) { + dprintf(fd, "value: \"%s\" is not a valid hex string\n", values[0].c_str()); + return false; + } + prop->value.bytes = bytes; + } else if (EqualsIgnoreCase(type, "-a")) { + if (values.size() != 1) { + dprintf(fd, "expect exact one value when using \"-a\"\n"); + return false; + } + if (!safelyParseInt(fd, currentIndex, values[0], &(prop->areaId))) { + dprintf(fd, "area ID: \"%s\" is not a valid int\n", values[0].c_str()); + return false; + } + } else { + dprintf(fd, "unknown option: %s\n", type.c_str()); + return false; + } + } + + return true; +} + +bool VehicleHalManager::parseHexString(int fd, const std::string& s, std::vector<uint8_t>* bytes) { + if (s.size() % 2 != 0) { + dprintf(fd, "invalid hex string: %s, should have even size\n", s.c_str()); + return false; + } + if (strncmp(s.substr(0, 2).c_str(), "0x", 2)) { + dprintf(fd, "hex string should start with \"0x\", got %s\n", s.c_str()); + return false; + } + std::string subs = s.substr(2); + std::transform(subs.begin(), subs.end(), subs.begin(), + [](unsigned char c) { return std::tolower(c); }); + + bool highDigit = true; + for (size_t i = 0; i < subs.size(); i++) { + char c = subs[i]; + uint8_t v; + if (c >= '0' && c <= '9') { + v = c - '0'; + } else if (c >= 'a' && c <= 'f') { + v = c - 'a' + 10; + } else { + dprintf(fd, "invalid character %c in hex string %s\n", c, subs.c_str()); + return false; + } + if (highDigit) { + (*bytes).push_back(v * 16); + } else { + (*bytes)[bytes->size() - 1] += v; + } + highDigit = !highDigit; + } + return true; +} + } // namespace V2_0 } // namespace vehicle } // namespace automotive diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/CommConn.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/CommConn.cpp deleted file mode 100644 index 136b2e0758..0000000000 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/CommConn.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2018 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. - */ - -#define LOG_TAG "CommConn" - -#include <thread> - -#include <android/hardware/automotive/vehicle/2.0/IVehicle.h> -#include <log/log.h> - -#include "CommConn.h" - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_0 { - -namespace impl { - -void CommConn::start() { - mReadThread = std::make_unique<std::thread>(std::bind(&CommConn::readThread, this)); -} - -void CommConn::stop() { - if (mReadThread->joinable()) { - mReadThread->join(); - } -} - -void CommConn::sendMessage(vhal_proto::EmulatorMessage const& msg) { - int numBytes = msg.ByteSize(); - std::vector<uint8_t> buffer(static_cast<size_t>(numBytes)); - if (!msg.SerializeToArray(buffer.data(), numBytes)) { - ALOGE("%s: SerializeToString failed!", __func__); - return; - } - - write(buffer); -} - -void CommConn::readThread() { - std::vector<uint8_t> buffer; - while (isOpen()) { - buffer = read(); - if (buffer.size() == 0) { - ALOGI("%s: Read returned empty message, exiting read loop.", __func__); - break; - } - - vhal_proto::EmulatorMessage rxMsg; - if (rxMsg.ParseFromArray(buffer.data(), static_cast<int32_t>(buffer.size()))) { - vhal_proto::EmulatorMessage respMsg; - mMessageProcessor->processMessage(rxMsg, respMsg); - - sendMessage(respMsg); - } - } -} - -} // namespace impl - -} // namespace V2_0 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/CommConn.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/CommConn.h deleted file mode 100644 index 6d36da417f..0000000000 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/CommConn.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2017 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. - */ - -#ifndef android_hardware_automotive_vehicle_V2_0_impl_CommBase_H_ -#define android_hardware_automotive_vehicle_V2_0_impl_CommBase_H_ - -#include <android/hardware/automotive/vehicle/2.0/IVehicle.h> -#include <string> -#include <thread> -#include <vector> - -#include "VehicleHalProto.pb.h" - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_0 { - -namespace impl { - -/** - * MessageProcess is an interface implemented by VehicleEmulator to process messages received - * over a CommConn. - */ -class MessageProcessor { - public: - virtual ~MessageProcessor() = default; - - /** - * Process a single message received over a CommConn. Populate the given respMsg with the reply - * message we should send. - */ - virtual void processMessage(vhal_proto::EmulatorMessage const& rxMsg, - vhal_proto::EmulatorMessage& respMsg) = 0; -}; - -/** - * This is the interface that both PipeComm and SocketComm use to represent a connection. The - * connection will listen for commands on a separate 'read' thread. - */ -class CommConn { - public: - CommConn(MessageProcessor* messageProcessor) : mMessageProcessor(messageProcessor) {} - - virtual ~CommConn() {} - - /** - * Start the read thread reading messages from this connection. - */ - virtual void start(); - - /** - * Closes a connection if it is open. - */ - virtual void stop(); - - /** - * Returns true if the connection is open and available to send/receive. - */ - virtual bool isOpen() = 0; - - /** - * Blocking call to read data from the connection. - * - * @return std::vector<uint8_t> Serialized protobuf data received from emulator. This will be - * an empty vector if the connection was closed or some other error occurred. - */ - virtual std::vector<uint8_t> read() = 0; - - /** - * Transmits a string of data to the emulator. - * - * @param data Serialized protobuf data to transmit. - * - * @return int Number of bytes transmitted, or -1 if failed. - */ - virtual int write(const std::vector<uint8_t>& data) = 0; - - /** - * Serialized and send the given message to the other side. - */ - void sendMessage(vhal_proto::EmulatorMessage const& msg); - - protected: - std::unique_ptr<std::thread> mReadThread; - MessageProcessor* mMessageProcessor; - - /** - * A thread that reads messages in a loop, and responds. You can stop this thread by calling - * stop(). - */ - void readThread(); -}; - -} // namespace impl - -} // namespace V2_0 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android - -#endif // android_hardware_automotive_vehicle_V2_0_impl_CommBase_H_ diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h index f09d75ba21..b7c0493e10 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h @@ -481,8 +481,12 @@ const ConfigDeclaration kVehicleProperties[]{ .changeMode = VehiclePropertyChangeMode::STATIC, .areaConfigs = {VehicleAreaConfig{.areaId = HVAC_ALL}}}, .initialValue = {.int32Values = {FAN_DIRECTION_FACE, FAN_DIRECTION_FLOOR, - FAN_DIRECTION_FACE | FAN_DIRECTION_FLOOR}}}, - + FAN_DIRECTION_FACE | FAN_DIRECTION_FLOOR, + FAN_DIRECTION_DEFROST, + FAN_DIRECTION_FACE | FAN_DIRECTION_DEFROST, + FAN_DIRECTION_FLOOR | FAN_DIRECTION_DEFROST, + FAN_DIRECTION_FLOOR | FAN_DIRECTION_DEFROST | + FAN_DIRECTION_FACE}}}, {.config = {.prop = toInt(VehicleProperty::HVAC_SEAT_VENTILATION), .access = VehiclePropertyAccess::READ_WRITE, .changeMode = VehiclePropertyChangeMode::ON_CHANGE, @@ -630,46 +634,6 @@ const ConfigDeclaration kVehicleProperties[]{ .initialValue = {.floatValues = {101.0f}}}, { - .config = - { - .prop = kGenerateFakeDataControllingProperty, - .access = VehiclePropertyAccess::WRITE, - .changeMode = VehiclePropertyChangeMode::ON_CHANGE, - .configArray = {1, 0, 0, 2, 0, 0, 0, 0, 0}, - }, - }, - - { - .config = - { - .prop = kSetIntPropertyFromVehicleForTest, - .access = VehiclePropertyAccess::WRITE, - .changeMode = VehiclePropertyChangeMode::ON_CHANGE, - .configArray = {0, 0, 0, 2, 1, 0, 0, 0, 0}, - }, - }, - - { - .config = - { - .prop = kSetFloatPropertyFromVehicleForTest, - .access = VehiclePropertyAccess::WRITE, - .changeMode = VehiclePropertyChangeMode::ON_CHANGE, - .configArray = {0, 0, 1, 0, 1, 0, 1, 0, 0}, - }, - }, - - { - .config = - { - .prop = kSetBooleanPropertyFromVehicleForTest, - .access = VehiclePropertyAccess::WRITE, - .changeMode = VehiclePropertyChangeMode::ON_CHANGE, - .configArray = {0, 1, 1, 0, 1, 0, 0, 0, 0}, - }, - }, - - { .config = {.prop = kMixedTypePropertyForTest, .access = VehiclePropertyAccess::READ_WRITE, .changeMode = VehiclePropertyChangeMode::ON_CHANGE, @@ -1032,14 +996,6 @@ const ConfigDeclaration kVehicleProperties[]{ { .config = { - .prop = toInt(VehicleProperty::STORAGE_ENCRYPTION_BINDING_SEED), - .access = VehiclePropertyAccess::READ_WRITE, - .changeMode = VehiclePropertyChangeMode::ON_CHANGE, - }, - }, - { - .config = - { .prop = toInt(VehicleProperty::WATCHDOG_ALIVE), .access = VehiclePropertyAccess::WRITE, .changeMode = VehiclePropertyChangeMode::ON_CHANGE, diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleConnector.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleConnector.h index 31ac7d8fb5..c3affb04b3 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleConnector.h +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleConnector.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 The Android Open Source Project + * Copyright (C) 2021 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. @@ -14,14 +14,13 @@ * limitations under the License. */ -#ifndef android_hardware_automotive_vehicle_V2_0_impl_EmulatedVehicleConnector_H_ -#define android_hardware_automotive_vehicle_V2_0_impl_EmulatedVehicleConnector_H_ +#ifndef android_hardware_automotive_vehicle_V2_0_impl_DefaultVehicleConnector_H_ +#define android_hardware_automotive_vehicle_V2_0_impl_DefaultVehicleConnector_H_ #include <vhal_v2_0/VehicleConnector.h> -#include "EmulatedUserHal.h" +#include "DefaultVehicleHalServer.h" #include "VehicleHalClient.h" -#include "VehicleHalServer.h" namespace android { namespace hardware { @@ -31,21 +30,12 @@ namespace V2_0 { namespace impl { -class EmulatedVehicleConnector : public IPassThroughConnector<VehicleHalClient, VehicleHalServer> { +class DefaultVehicleConnector + : public IPassThroughConnector<VehicleHalClient, DefaultVehicleHalServer> { public: - EmulatedVehicleConnector() = default; + DefaultVehicleConnector() = default; - EmulatedUserHal* getEmulatedUserHal(); - - // Methods from VehicleHalServer - void triggerSendAllValues() override; - - StatusCode onSetProperty(const VehiclePropValue& value, bool updateStatus) override; - - bool onDump(const hidl_handle& fd, const hidl_vec<hidl_string>& options) override; - - private: - EmulatedUserHal mEmulatedUserHal; + void triggerSendAllValues() { this->sendAllValuesToClient(); } }; } // namespace impl @@ -56,4 +46,4 @@ class EmulatedVehicleConnector : public IPassThroughConnector<VehicleHalClient, } // namespace hardware } // namespace android -#endif // android_hardware_automotive_vehicle_V2_0_impl_EmulatedVehicleConnector_H_ +#endif // android_hardware_automotive_vehicle_V2_0_impl_DefaultVehicleConnector_H_ diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.cpp new file mode 100644 index 0000000000..7bc7198959 --- /dev/null +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.cpp @@ -0,0 +1,591 @@ +/* + * Copyright (C) 2021 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. + */ +#define LOG_TAG "DefaultVehicleHal_v2_0" + +#include <android-base/chrono_utils.h> +#include <assert.h> +#include <stdio.h> +#include <utils/Log.h> +#include <utils/SystemClock.h> +#include <vhal_v2_0/RecurrentTimer.h> +#include <unordered_set> + +#include "FakeObd2Frame.h" +#include "PropertyUtils.h" +#include "VehicleUtils.h" + +#include "DefaultVehicleHal.h" + +namespace android { +namespace hardware { +namespace automotive { +namespace vehicle { +namespace V2_0 { + +namespace impl { + +namespace { +constexpr std::chrono::nanoseconds kHeartBeatIntervalNs = 3s; + +const VehicleAreaConfig* getAreaConfig(const VehiclePropValue& propValue, + const VehiclePropConfig* config) { + if (isGlobalProp(propValue.prop)) { + if (config->areaConfigs.size() == 0) { + return nullptr; + } + return &(config->areaConfigs[0]); + } else { + for (auto& c : config->areaConfigs) { + if (c.areaId == propValue.areaId) { + return &c; + } + } + } + return nullptr; +} + +VehicleHal::VehiclePropValuePtr addTimestamp(VehicleHal::VehiclePropValuePtr v) { + if (v.get()) { + v->timestamp = elapsedRealtimeNano(); + } + return v; +} +} // namespace + +VehicleHal::VehiclePropValuePtr DefaultVehicleHal::createVhalHeartBeatProp() { + VehicleHal::VehiclePropValuePtr v = getValuePool()->obtainInt64(uptimeMillis()); + v->prop = static_cast<int32_t>(VehicleProperty::VHAL_HEARTBEAT); + v->areaId = 0; + v->status = VehiclePropertyStatus::AVAILABLE; + return v; +} + +DefaultVehicleHal::DefaultVehicleHal(VehiclePropertyStore* propStore, VehicleHalClient* client) + : mPropStore(propStore), mRecurrentTimer(getTimerAction()), mVehicleClient(client) { + initStaticConfig(); + mVehicleClient->registerPropertyValueCallback( + [this](const VehiclePropValue& value, bool updateStatus) { + onPropertyValue(value, updateStatus); + }); +} + +VehicleHal::VehiclePropValuePtr DefaultVehicleHal::getUserHalProp( + const VehiclePropValue& requestedPropValue, StatusCode* outStatus) { + auto propId = requestedPropValue.prop; + ALOGI("get(): getting value for prop %d from User HAL", propId); + const auto& ret = mEmulatedUserHal.onGetProperty(requestedPropValue); + VehicleHal::VehiclePropValuePtr v = nullptr; + if (!ret.ok()) { + ALOGE("get(): User HAL returned error: %s", ret.error().message().c_str()); + *outStatus = StatusCode(ret.error().code()); + } else { + auto value = ret.value().get(); + if (value != nullptr) { + ALOGI("get(): User HAL returned value: %s", toString(*value).c_str()); + v = getValuePool()->obtain(*value); + *outStatus = StatusCode::OK; + } else { + ALOGE("get(): User HAL returned null value"); + *outStatus = StatusCode::INTERNAL_ERROR; + } + } + return addTimestamp(std::move(v)); +} + +VehicleHal::VehiclePropValuePtr DefaultVehicleHal::get(const VehiclePropValue& requestedPropValue, + StatusCode* outStatus) { + auto propId = requestedPropValue.prop; + ALOGV("get(%d)", propId); + + if (mEmulatedUserHal.isSupported(propId)) { + return getUserHalProp(requestedPropValue, outStatus); + } + + VehiclePropValuePtr v = nullptr; + if (propId == OBD2_FREEZE_FRAME) { + v = getValuePool()->obtainComplex(); + *outStatus = fillObd2FreezeFrame(mPropStore, requestedPropValue, v.get()); + return addTimestamp(std::move(v)); + } + + if (propId == OBD2_FREEZE_FRAME_INFO) { + v = getValuePool()->obtainComplex(); + *outStatus = fillObd2DtcInfo(mPropStore, v.get()); + return addTimestamp(std::move(v)); + } + + auto internalPropValue = mPropStore->readValueOrNull(requestedPropValue); + if (internalPropValue != nullptr) { + v = getValuePool()->obtain(*internalPropValue); + } + + if (!v) { + *outStatus = StatusCode::INVALID_ARG; + } else if (v->status == VehiclePropertyStatus::AVAILABLE) { + *outStatus = StatusCode::OK; + } else { + *outStatus = StatusCode::TRY_AGAIN; + } + return addTimestamp(std::move(v)); +} + +std::vector<VehiclePropConfig> DefaultVehicleHal::listProperties() { + return mPropStore->getAllConfigs(); +} + +bool DefaultVehicleHal::dump(const hidl_handle& fd, const hidl_vec<hidl_string>& options) { + int nativeFd = fd->data[0]; + if (nativeFd < 0) { + ALOGW("Invalid fd from HIDL handle: %d", nativeFd); + return false; + } + if (options.size() > 0) { + if (options[0] == "--help") { + std::string buffer; + buffer += "Emulated user hal usage:\n"; + buffer += mEmulatedUserHal.showDumpHelp(); + buffer += "\n"; + buffer += "VHAL server debug usage:\n"; + buffer += "--debughal: send debug command to VHAL server, see '--debughal --help'\n"; + buffer += "\n"; + dprintf(nativeFd, "%s", buffer.c_str()); + return false; + } else if (options[0] == kUserHalDumpOption) { + dprintf(nativeFd, "%s", mEmulatedUserHal.dump("").c_str()); + return false; + } + } else { + // No options, dump the emulated user hal state first and then send command to VHAL server + // to dump its state. + std::string buffer; + buffer += "Emulator user hal state:\n"; + buffer += mEmulatedUserHal.dump(" "); + buffer += "\n"; + dprintf(nativeFd, "%s", buffer.c_str()); + } + + return mVehicleClient->dump(fd, options); +} + +StatusCode DefaultVehicleHal::checkPropValue(const VehiclePropValue& value, + const VehiclePropConfig* config) { + int32_t property = value.prop; + VehiclePropertyType type = getPropType(property); + switch (type) { + case VehiclePropertyType::BOOLEAN: + case VehiclePropertyType::INT32: + if (value.value.int32Values.size() != 1) { + return StatusCode::INVALID_ARG; + } + break; + case VehiclePropertyType::INT32_VEC: + if (value.value.int32Values.size() < 1) { + return StatusCode::INVALID_ARG; + } + break; + case VehiclePropertyType::INT64: + if (value.value.int64Values.size() != 1) { + return StatusCode::INVALID_ARG; + } + break; + case VehiclePropertyType::INT64_VEC: + if (value.value.int64Values.size() < 1) { + return StatusCode::INVALID_ARG; + } + break; + case VehiclePropertyType::FLOAT: + if (value.value.floatValues.size() != 1) { + return StatusCode::INVALID_ARG; + } + break; + case VehiclePropertyType::FLOAT_VEC: + if (value.value.floatValues.size() < 1) { + return StatusCode::INVALID_ARG; + } + break; + case VehiclePropertyType::BYTES: + // We allow setting an empty bytes array. + break; + case VehiclePropertyType::STRING: + // We allow setting an empty string. + break; + case VehiclePropertyType::MIXED: + if (getPropGroup(property) == VehiclePropertyGroup::VENDOR) { + // We only checks vendor mixed properties. + return checkVendorMixedPropValue(value, config); + } + break; + default: + ALOGW("Unknown property type: %d", type); + return StatusCode::INVALID_ARG; + } + return StatusCode::OK; +} + +StatusCode DefaultVehicleHal::checkVendorMixedPropValue(const VehiclePropValue& value, + const VehiclePropConfig* config) { + auto configArray = config->configArray; + // configArray[0], 1 indicates the property has a String value, we allow the string value to + // be empty. + + size_t int32Count = 0; + // configArray[1], 1 indicates the property has a Boolean value. + if (configArray[1] == 1) { + int32Count++; + } + // configArray[2], 1 indicates the property has an Integer value. + if (configArray[2] == 1) { + int32Count++; + } + // configArray[3], the number indicates the size of Integer[] in the property. + int32Count += static_cast<size_t>(configArray[3]); + if (value.value.int32Values.size() != int32Count) { + return StatusCode::INVALID_ARG; + } + + size_t int64Count = 0; + // configArray[4], 1 indicates the property has a Long value. + if (configArray[4] == 1) { + int64Count++; + } + // configArray[5], the number indicates the size of Long[] in the property. + int64Count += static_cast<size_t>(configArray[5]); + if (value.value.int64Values.size() != int64Count) { + return StatusCode::INVALID_ARG; + } + + size_t floatCount = 0; + // configArray[6], 1 indicates the property has a Float value. + if (configArray[6] == 1) { + floatCount++; + } + // configArray[7], the number indicates the size of Float[] in the property. + floatCount += static_cast<size_t>(configArray[7]); + if (value.value.floatValues.size() != floatCount) { + return StatusCode::INVALID_ARG; + } + + // configArray[8], the number indicates the size of byte[] in the property. + if (configArray[8] != 0 && value.value.bytes.size() != static_cast<size_t>(configArray[8])) { + return StatusCode::INVALID_ARG; + } + return StatusCode::OK; +} + +StatusCode DefaultVehicleHal::checkValueRange(const VehiclePropValue& value, + const VehicleAreaConfig* areaConfig) { + if (areaConfig == nullptr) { + return StatusCode::OK; + } + int32_t property = value.prop; + VehiclePropertyType type = getPropType(property); + switch (type) { + case VehiclePropertyType::INT32: + if (areaConfig->minInt32Value == 0 && areaConfig->maxInt32Value == 0) { + break; + } + // We already checked this in checkPropValue. + assert(value.value.int32Values.size() > 0); + if (value.value.int32Values[0] < areaConfig->minInt32Value || + value.value.int32Values[0] > areaConfig->maxInt32Value) { + return StatusCode::INVALID_ARG; + } + break; + case VehiclePropertyType::INT64: + if (areaConfig->minInt64Value == 0 && areaConfig->maxInt64Value == 0) { + break; + } + // We already checked this in checkPropValue. + assert(value.value.int64Values.size() > 0); + if (value.value.int64Values[0] < areaConfig->minInt64Value || + value.value.int64Values[0] > areaConfig->maxInt64Value) { + return StatusCode::INVALID_ARG; + } + break; + case VehiclePropertyType::FLOAT: + if (areaConfig->minFloatValue == 0 && areaConfig->maxFloatValue == 0) { + break; + } + // We already checked this in checkPropValue. + assert(value.value.floatValues.size() > 0); + if (value.value.floatValues[0] < areaConfig->minFloatValue || + value.value.floatValues[0] > areaConfig->maxFloatValue) { + return StatusCode::INVALID_ARG; + } + break; + default: + // We don't check the rest of property types. Additional logic needs to be added if + // required for real implementation. E.g., you might want to enforce the range + // checks on vector as well or you might want to check the range for mixed property. + break; + } + return StatusCode::OK; +} + +StatusCode DefaultVehicleHal::setUserHalProp(const VehiclePropValue& propValue) { + ALOGI("onSetProperty(): property %d will be handled by UserHal", propValue.prop); + + const auto& ret = mEmulatedUserHal.onSetProperty(propValue); + if (!ret.ok()) { + ALOGE("onSetProperty(): HAL returned error: %s", ret.error().message().c_str()); + return StatusCode(ret.error().code()); + } + auto updatedValue = ret.value().get(); + if (updatedValue != nullptr) { + ALOGI("onSetProperty(): updating property returned by HAL: %s", + toString(*updatedValue).c_str()); + onPropertyValue(*updatedValue, true); + } + return StatusCode::OK; +} + +StatusCode DefaultVehicleHal::set(const VehiclePropValue& propValue) { + if (propValue.status != VehiclePropertyStatus::AVAILABLE) { + // Android side cannot set property status - this value is the + // purview of the HAL implementation to reflect the state of + // its underlying hardware + return StatusCode::INVALID_ARG; + } + + if (mEmulatedUserHal.isSupported(propValue.prop)) { + return setUserHalProp(propValue); + } + + std::unordered_set<int32_t> powerProps(std::begin(kHvacPowerProperties), + std::end(kHvacPowerProperties)); + if (powerProps.count(propValue.prop)) { + auto hvacPowerOn = mPropStore->readValueOrNull( + toInt(VehicleProperty::HVAC_POWER_ON), + (VehicleAreaSeat::ROW_1_LEFT | VehicleAreaSeat::ROW_1_RIGHT | + VehicleAreaSeat::ROW_2_LEFT | VehicleAreaSeat::ROW_2_CENTER | + VehicleAreaSeat::ROW_2_RIGHT)); + + if (hvacPowerOn && hvacPowerOn->value.int32Values.size() == 1 && + hvacPowerOn->value.int32Values[0] == 0) { + return StatusCode::NOT_AVAILABLE; + } + } + + if (propValue.prop == OBD2_FREEZE_FRAME_CLEAR) { + return clearObd2FreezeFrames(mPropStore, propValue); + } + if (propValue.prop == VEHICLE_MAP_SERVICE) { + // Placeholder for future implementation of VMS property in the default hal. For + // now, just returns OK; otherwise, hal clients crash with property not supported. + return StatusCode::OK; + } + + int32_t property = propValue.prop; + const VehiclePropConfig* config = mPropStore->getConfigOrNull(property); + if (config == nullptr) { + ALOGW("no config for prop 0x%x", property); + return StatusCode::INVALID_ARG; + } + const VehicleAreaConfig* areaConfig = getAreaConfig(propValue, config); + if (!isGlobalProp(property) && areaConfig == nullptr) { + // Ignore areaId for global property. For non global property, check whether areaId is + // allowed. areaId must appear in areaConfig. + ALOGW("invalid area ID: 0x%x for prop 0x%x, not listed in config", propValue.areaId, + property); + return StatusCode::INVALID_ARG; + } + auto status = checkPropValue(propValue, config); + if (status != StatusCode::OK) { + ALOGW("invalid property value: %s", toString(propValue).c_str()); + return status; + } + status = checkValueRange(propValue, areaConfig); + if (status != StatusCode::OK) { + ALOGW("property value out of range: %s", toString(propValue).c_str()); + return status; + } + + auto currentPropValue = mPropStore->readValueOrNull(propValue); + if (currentPropValue && currentPropValue->status != VehiclePropertyStatus::AVAILABLE) { + // do not allow Android side to set() a disabled/error property + return StatusCode::NOT_AVAILABLE; + } + + // Send the value to the vehicle server, the server will talk to the (real or emulated) car + return mVehicleClient->setProperty(propValue, /*updateStatus=*/false); +} + +// Parse supported properties list and generate vector of property values to hold current values. +void DefaultVehicleHal::onCreate() { + auto configs = mVehicleClient->getAllPropertyConfig(); + + for (const auto& cfg : configs) { + if (isDiagnosticProperty(cfg)) { + // do not write an initial empty value for the diagnostic properties + // as we will initialize those separately. + continue; + } + + int32_t numAreas = isGlobalProp(cfg.prop) ? 1 : cfg.areaConfigs.size(); + + for (int i = 0; i < numAreas; i++) { + int32_t curArea = isGlobalProp(cfg.prop) ? 0 : cfg.areaConfigs[i].areaId; + + // Create a separate instance for each individual zone + VehiclePropValue prop = { + .areaId = curArea, + .prop = cfg.prop, + .status = VehiclePropertyStatus::UNAVAILABLE, + }; + // Allow the initial values to set status. + mPropStore->writeValue(prop, /*updateStatus=*/true); + } + } + + mVehicleClient->triggerSendAllValues(); + + initObd2LiveFrame(mPropStore, *mPropStore->getConfigOrDie(OBD2_LIVE_FRAME)); + initObd2FreezeFrame(mPropStore, *mPropStore->getConfigOrDie(OBD2_FREEZE_FRAME)); + + registerHeartBeatEvent(); +} + +DefaultVehicleHal::~DefaultVehicleHal() { + mRecurrentTimer.unregisterRecurrentEvent(static_cast<int32_t>(VehicleProperty::VHAL_HEARTBEAT)); +} + +void DefaultVehicleHal::registerHeartBeatEvent() { + mRecurrentTimer.registerRecurrentEvent(kHeartBeatIntervalNs, + static_cast<int32_t>(VehicleProperty::VHAL_HEARTBEAT)); +} + +VehicleHal::VehiclePropValuePtr DefaultVehicleHal::doInternalHealthCheck() { + VehicleHal::VehiclePropValuePtr v = nullptr; + + // This is an example of very simple health checking. VHAL is considered healthy if we can read + // PERF_VEHICLE_SPEED. The more comprehensive health checking is required. + VehiclePropValue propValue = { + .prop = static_cast<int32_t>(VehicleProperty::PERF_VEHICLE_SPEED), + }; + auto internalPropValue = mPropStore->readValueOrNull(propValue); + if (internalPropValue != nullptr) { + v = createVhalHeartBeatProp(); + } else { + ALOGW("VHAL health check failed"); + } + return v; +} + +void DefaultVehicleHal::onContinuousPropertyTimer(const std::vector<int32_t>& properties) { + auto& pool = *getValuePool(); + + for (int32_t property : properties) { + VehiclePropValuePtr v; + if (isContinuousProperty(property)) { + auto internalPropValue = mPropStore->readValueOrNull(property); + if (internalPropValue != nullptr) { + v = pool.obtain(*internalPropValue); + } + } else if (property == static_cast<int32_t>(VehicleProperty::VHAL_HEARTBEAT)) { + // VHAL_HEARTBEAT is not a continuous value, but it needs to be updated periodically. + // So, the update is done through onContinuousPropertyTimer. + v = doInternalHealthCheck(); + } else { + ALOGE("Unexpected onContinuousPropertyTimer for property: 0x%x", property); + continue; + } + + if (v.get()) { + v->timestamp = elapsedRealtimeNano(); + doHalEvent(std::move(v)); + } + } +} + +RecurrentTimer::Action DefaultVehicleHal::getTimerAction() { + return [this](const std::vector<int32_t>& properties) { + onContinuousPropertyTimer(properties); + }; +} + +StatusCode DefaultVehicleHal::subscribe(int32_t property, float sampleRate) { + ALOGI("%s propId: 0x%x, sampleRate: %f", __func__, property, sampleRate); + + if (!isContinuousProperty(property)) { + return StatusCode::INVALID_ARG; + } + + // If the config does not exist, isContinuousProperty should return false. + const VehiclePropConfig* config = mPropStore->getConfigOrNull(property); + if (sampleRate < config->minSampleRate || sampleRate > config->maxSampleRate) { + ALOGW("sampleRate out of range"); + return StatusCode::INVALID_ARG; + } + + mRecurrentTimer.registerRecurrentEvent(hertzToNanoseconds(sampleRate), property); + return StatusCode::OK; +} + +StatusCode DefaultVehicleHal::unsubscribe(int32_t property) { + ALOGI("%s propId: 0x%x", __func__, property); + if (!isContinuousProperty(property)) { + return StatusCode::INVALID_ARG; + } + // If the event was not registered before, this would do nothing. + mRecurrentTimer.unregisterRecurrentEvent(property); + return StatusCode::OK; +} + +bool DefaultVehicleHal::isContinuousProperty(int32_t propId) const { + const VehiclePropConfig* config = mPropStore->getConfigOrNull(propId); + if (config == nullptr) { + ALOGW("Config not found for property: 0x%x", propId); + return false; + } + return config->changeMode == VehiclePropertyChangeMode::CONTINUOUS; +} + +void DefaultVehicleHal::onPropertyValue(const VehiclePropValue& value, bool updateStatus) { + VehiclePropValuePtr updatedPropValue = getValuePool()->obtain(value); + + if (mPropStore->writeValue(*updatedPropValue, updateStatus)) { + doHalEvent(std::move(updatedPropValue)); + } +} + +void DefaultVehicleHal::initStaticConfig() { + auto configs = mVehicleClient->getAllPropertyConfig(); + for (auto&& cfg : configs) { + VehiclePropertyStore::TokenFunction tokenFunction = nullptr; + + switch (cfg.prop) { + case OBD2_FREEZE_FRAME: { + // We use timestamp as token for OBD2_FREEZE_FRAME + tokenFunction = [](const VehiclePropValue& propValue) { + return propValue.timestamp; + }; + break; + } + default: + break; + } + + mPropStore->registerProperty(cfg, tokenFunction); + } +} + +} // namespace impl + +} // namespace V2_0 +} // namespace vehicle +} // namespace automotive +} // namespace hardware +} // namespace android diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.h new file mode 100644 index 0000000000..7cd7ac2a38 --- /dev/null +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.h @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2021 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. + */ + +#ifndef android_hardware_automotive_vehicle_V2_0_impl_DefaultVehicleHal_H_ +#define android_hardware_automotive_vehicle_V2_0_impl_DefaultVehicleHal_H_ + +#include <vhal_v2_0/RecurrentTimer.h> +#include <vhal_v2_0/VehicleHal.h> +#include <vhal_v2_0/VehiclePropertyStore.h> + +#include "EmulatedUserHal.h" +#include "VehicleHalClient.h" + +namespace android { +namespace hardware { +namespace automotive { +namespace vehicle { +namespace V2_0 { + +namespace impl { + +/** Implementation of VehicleHal that connected to emulator instead of real vehicle network. */ +class DefaultVehicleHal : public VehicleHal { + public: + DefaultVehicleHal(VehiclePropertyStore* propStore, VehicleHalClient* client); + ~DefaultVehicleHal(); + + // Initialize VHAL. Should always call registerHeartBeatEvent() during onCreate. + void onCreate() override; + std::vector<VehiclePropConfig> listProperties() override; + VehiclePropValuePtr get(const VehiclePropValue& requestedPropValue, + StatusCode* outStatus) override; + StatusCode set(const VehiclePropValue& propValue) override; + StatusCode subscribe(int32_t property, float sampleRate) override; + StatusCode unsubscribe(int32_t property) override; + bool dump(const hidl_handle& fd, const hidl_vec<hidl_string>& options) override; + + protected: + constexpr std::chrono::nanoseconds hertzToNanoseconds(float hz) const { + return std::chrono::nanoseconds(static_cast<int64_t>(1000000000L / hz)); + } + + VehiclePropertyStore* mPropStore; + RecurrentTimer mRecurrentTimer; + VehicleHalClient* mVehicleClient; + EmulatedUserHal mEmulatedUserHal; + + // The callback that would be called when a property value is updated. This function could + // be extended to handle specific property update event. + virtual void onPropertyValue(const VehiclePropValue& value, bool updateStatus); + // Do an internal health check, vendor should add health check logic in this function. + virtual VehicleHal::VehiclePropValuePtr doInternalHealthCheck(); + + // The callback that would be called for every event generated by 'subscribe' or heartbeat. + // Properties contains a list of properties that need to be handled. + void onContinuousPropertyTimer(const std::vector<int32_t>& properties); + // Initiate config for all properties, would be called during onCreate(). + void initStaticConfig(); + // Whether the property is a continuous property. + bool isContinuousProperty(int32_t propId) const; + // Returns a lambda that could be used in mRecurrentTimer. + RecurrentTimer::Action getTimerAction(); + // Check whether a propValue is valid according to its type. + StatusCode checkPropValue(const VehiclePropValue& propValue, const VehiclePropConfig* config); + // Check whether the property value is within the range according to area config. + StatusCode checkValueRange(const VehiclePropValue& propValue, + const VehicleAreaConfig* areaConfig); + // Register the heart beat event to be sent every 3s. This is required to inform watch dog that + // VHAL is alive. Subclasses should always calls this function during onCreate. + void registerHeartBeatEvent(); + // Get a user HAL property. + VehiclePropValuePtr getUserHalProp(const VehiclePropValue& requestedPropValue, + StatusCode* outStatus); + // Set a user HAL property. + StatusCode setUserHalProp(const VehiclePropValue& propValue); + // Create a VHAL heart beat property. + VehicleHal::VehiclePropValuePtr createVhalHeartBeatProp(); + + private: + // Check whether a vendor mixed value property is valid according to its config array. + // See 'VehiclePropertyType' documentation in 'types.hal' for detail. + StatusCode checkVendorMixedPropValue(const VehiclePropValue& value, + const VehiclePropConfig* config); + // Read the override properties from a config file. + void getAllPropertiesOverride(); +}; + +} // namespace impl + +} // namespace V2_0 +} // namespace vehicle +} // namespace automotive +} // namespace hardware +} // namespace android + +#endif // android_hardware_automotive_vehicle_V2_0_impl_DefaultVehicleHal_H_ diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHalServer.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHalServer.cpp new file mode 100644 index 0000000000..4704917286 --- /dev/null +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHalServer.cpp @@ -0,0 +1,571 @@ +/* + * Copyright (C) 2021 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. + */ + +#define LOG_TAG "DefaultVehicleHalServer" + +#include <fstream> +#include <regex> + +#include <android-base/format.h> +#include <android-base/logging.h> +#include <android-base/parsedouble.h> +#include <android-base/parseint.h> +#include <android-base/properties.h> +#include <utils/SystemClock.h> + +#include "DefaultConfig.h" +#include "FakeObd2Frame.h" +#include "JsonFakeValueGenerator.h" +#include "LinearFakeValueGenerator.h" + +#include "DefaultVehicleHalServer.h" + +namespace android { +namespace hardware { +namespace automotive { +namespace vehicle { +namespace V2_0 { + +namespace impl { + +namespace { +const char* VENDOR_OVERRIDE_DIR = "/vendor/etc/vhaloverride/"; +} // namespace + +void DefaultVehicleHalServer::storePropInitialValue(const ConfigDeclaration& config) { + VehiclePropConfig cfg = config.config; + + // A global property will have only a single area + int32_t numAreas = isGlobalProp(cfg.prop) ? 1 : cfg.areaConfigs.size(); + + for (int i = 0; i < numAreas; i++) { + int32_t curArea = isGlobalProp(cfg.prop) ? 0 : cfg.areaConfigs[i].areaId; + + // Create a separate instance for each individual zone + VehiclePropValue prop = { + .areaId = curArea, + .prop = cfg.prop, + }; + + if (config.initialAreaValues.empty()) { + prop.value = config.initialValue; + } else if (auto valueForAreaIt = config.initialAreaValues.find(curArea); + valueForAreaIt != config.initialAreaValues.end()) { + prop.value = valueForAreaIt->second; + } else { + LOG(WARNING) << __func__ << " failed to get default value for" + << " prop 0x" << std::hex << cfg.prop << " area 0x" << std::hex << curArea; + prop.status = VehiclePropertyStatus::UNAVAILABLE; + } + + mServerSidePropStore.writeValue(prop, true); + } +} + +DefaultVehicleHalServer::DefaultVehicleHalServer() { + for (auto& it : kVehicleProperties) { + VehiclePropConfig cfg = it.config; + mServerSidePropStore.registerProperty(cfg); + // Skip diagnostic properties since there is special logic to handle those. + if (isDiagnosticProperty(cfg)) { + continue; + } + storePropInitialValue(it); + } + maybeOverrideProperties(VENDOR_OVERRIDE_DIR); +} + +void DefaultVehicleHalServer::sendAllValuesToClient() { + constexpr bool update_status = true; + auto values = mServerSidePropStore.readAllValues(); + for (const auto& value : values) { + onPropertyValueFromCar(value, update_status); + } +} + +GeneratorHub* DefaultVehicleHalServer::getGeneratorHub() { + return &mGeneratorHub; +} + +VehiclePropValuePool* DefaultVehicleHalServer::getValuePool() const { + if (!mValuePool) { + LOG(WARNING) << __func__ << ": Value pool not set!"; + } + return mValuePool; +} + +void DefaultVehicleHalServer::setValuePool(VehiclePropValuePool* valuePool) { + if (!valuePool) { + LOG(WARNING) << __func__ << ": Setting value pool to nullptr!"; + } + mValuePool = valuePool; +} + +void DefaultVehicleHalServer::onFakeValueGenerated(const VehiclePropValue& value) { + constexpr bool updateStatus = true; + LOG(DEBUG) << __func__ << ": " << toString(value); + auto updatedPropValue = getValuePool()->obtain(value); + if (updatedPropValue) { + updatedPropValue->timestamp = value.timestamp; + updatedPropValue->status = VehiclePropertyStatus::AVAILABLE; + mServerSidePropStore.writeValue(*updatedPropValue, updateStatus); + onPropertyValueFromCar(*updatedPropValue, updateStatus); + } +} + +std::vector<VehiclePropConfig> DefaultVehicleHalServer::onGetAllPropertyConfig() const { + return mServerSidePropStore.getAllConfigs(); +} + +DefaultVehicleHalServer::VehiclePropValuePtr DefaultVehicleHalServer::createApPowerStateReq( + VehicleApPowerStateReq state, int32_t param) { + auto req = getValuePool()->obtain(VehiclePropertyType::INT32_VEC, 2); + req->prop = toInt(VehicleProperty::AP_POWER_STATE_REQ); + req->areaId = 0; + req->timestamp = elapsedRealtimeNano(); + req->status = VehiclePropertyStatus::AVAILABLE; + req->value.int32Values[0] = toInt(state); + req->value.int32Values[1] = param; + return req; +} + +DefaultVehicleHalServer::VehiclePropValuePtr DefaultVehicleHalServer::createHwInputKeyProp( + VehicleHwKeyInputAction action, int32_t keyCode, int32_t targetDisplay) { + auto keyEvent = getValuePool()->obtain(VehiclePropertyType::INT32_VEC, 3); + keyEvent->prop = toInt(VehicleProperty::HW_KEY_INPUT); + keyEvent->areaId = 0; + keyEvent->timestamp = elapsedRealtimeNano(); + keyEvent->status = VehiclePropertyStatus::AVAILABLE; + keyEvent->value.int32Values[0] = toInt(action); + keyEvent->value.int32Values[1] = keyCode; + keyEvent->value.int32Values[2] = targetDisplay; + return keyEvent; +} + +StatusCode DefaultVehicleHalServer::onSetProperty(const VehiclePropValue& value, + bool updateStatus) { + LOG(DEBUG) << "onSetProperty(" << value.prop << ")"; + + // Some properties need to be treated non-trivially + switch (value.prop) { + case AP_POWER_STATE_REPORT: + switch (value.value.int32Values[0]) { + case toInt(VehicleApPowerStateReport::DEEP_SLEEP_EXIT): + case toInt(VehicleApPowerStateReport::SHUTDOWN_CANCELLED): + case toInt(VehicleApPowerStateReport::WAIT_FOR_VHAL): + // CPMS is in WAIT_FOR_VHAL state, simply move to ON + // Send back to HAL + // ALWAYS update status for generated property value + onPropertyValueFromCar(*createApPowerStateReq(VehicleApPowerStateReq::ON, 0), + true /* updateStatus */); + break; + case toInt(VehicleApPowerStateReport::DEEP_SLEEP_ENTRY): + case toInt(VehicleApPowerStateReport::SHUTDOWN_START): + // CPMS is in WAIT_FOR_FINISH state, send the FINISHED command + // Send back to HAL + // ALWAYS update status for generated property value + onPropertyValueFromCar( + *createApPowerStateReq(VehicleApPowerStateReq::FINISHED, 0), + true /* updateStatus */); + break; + case toInt(VehicleApPowerStateReport::ON): + case toInt(VehicleApPowerStateReport::SHUTDOWN_POSTPONE): + case toInt(VehicleApPowerStateReport::SHUTDOWN_PREPARE): + // Do nothing + break; + default: + // Unknown state + break; + } + break; + +#ifdef ENABLE_VENDOR_CLUSTER_PROPERTY_FOR_TESTING + case toInt(VehicleProperty::CLUSTER_REPORT_STATE): + case toInt(VehicleProperty::CLUSTER_REQUEST_DISPLAY): + case toInt(VehicleProperty::CLUSTER_NAVIGATION_STATE): + case VENDOR_CLUSTER_SWITCH_UI: + case VENDOR_CLUSTER_DISPLAY_STATE: { + auto updatedPropValue = createVehiclePropValue(getPropType(value.prop), 0); + updatedPropValue->prop = value.prop & ~toInt(VehiclePropertyGroup::MASK); + if (isSystemProperty(value.prop)) { + updatedPropValue->prop |= toInt(VehiclePropertyGroup::VENDOR); + } else { + updatedPropValue->prop |= toInt(VehiclePropertyGroup::SYSTEM); + } + updatedPropValue->value = value.value; + updatedPropValue->timestamp = elapsedRealtimeNano(); + updatedPropValue->areaId = value.areaId; + onPropertyValueFromCar(*updatedPropValue, updateStatus); + return StatusCode::OK; + } +#endif // ENABLE_VENDOR_CLUSTER_PROPERTY_FOR_TESTING + + default: + break; + } + + // In the real vhal, the value will be sent to Car ECU. + // We just pretend it is done here and send back to HAL + auto updatedPropValue = getValuePool()->obtain(value); + updatedPropValue->timestamp = elapsedRealtimeNano(); + + mServerSidePropStore.writeValue(*updatedPropValue, updateStatus); + onPropertyValueFromCar(*updatedPropValue, updateStatus); + return StatusCode::OK; +} + +IVehicleServer::DumpResult DefaultVehicleHalServer::onDump( + const std::vector<std::string>& options) { + DumpResult result; + if (options.size() == 0) { + // No options, dump all stored properties. + result.callerShouldDumpState = true; + result.buffer += "Server side properties: \n"; + auto values = mServerSidePropStore.readAllValues(); + size_t i = 0; + for (const auto& value : values) { + result.buffer += fmt::format("[{}]: {}\n", i, toString(value)); + i++; + } + return result; + } + if (options[0] != "--debughal") { + // We only expect "debughal" command. This might be some commands that the caller knows + // about, so let caller handle it. + result.callerShouldDumpState = true; + return result; + } + + return debugCommand(options); +} + +IVehicleServer::DumpResult DefaultVehicleHalServer::debugCommand( + const std::vector<std::string>& options) { + DumpResult result; + // This is a debug command for the HAL, caller should not continue to dump state. + result.callerShouldDumpState = false; + + if (options.size() < 2) { + result.buffer += "No command specified\n"; + result.buffer += getHelpInfo(); + return result; + } + + std::string command = options[1]; + if (command == "--help") { + result.buffer += getHelpInfo(); + return result; + } else if (command == "--genfakedata") { + return genFakeDataCommand(options); + } else if (command == "--setint" || command == "--setfloat" || command == "--setbool") { + return setValueCommand(options); + } + + result.buffer += "Unknown command: \"" + command + "\"\n"; + result.buffer += getHelpInfo(); + return result; +} + +std::string DefaultVehicleHalServer::getHelpInfo() { + return "Help: \n" + "Generate Fake Data: \n" + "\tStart a linear generator: \n" + "\t--debughal --genfakedata --startlinear [propID(int32)] [middleValue(float)] " + "[currentValue(float)] [dispersion(float)] [increment(float)] [interval(int64)]\n" + "\tStop a linear generator: \n" + "\t--debughal --genfakedata --stoplinear [propID(int32)]\n" + "\tStart a json generator: \n" + "\t--debughal --genfakedata --startjson [jsonFilePath(string)] " + "[repetition(int32)(optional)]\n" + "\tStop a json generator: \n" + "\t--debughal --genfakedata --stopjson [jsonFilePath(string)]\n" + "\tGenerate key press: \n" + "\t--debughal --genfakedata --keypress [keyCode(int32)] [display[int32]]\n" + "\tSet a int property value: \n" + "\t--setint [propID(int32)] [value(int32)] [timestamp(int64)] " + "[areaID(int32)(optional)]\n" + "\tSet a boolean property value: \n" + "\t--setbool [propID(int32)] [value(\"true\"/\"false\")] [timestamp(int64)] " + "[areaID(int32)(optional)]\n" + "\tSet a float property value: \n" + "\t--setfloat [propID(int32)] [value(float)] [timestamp(int64)] " + "[areaID(int32)(optional)]\n"; +} + +IVehicleServer::DumpResult DefaultVehicleHalServer::genFakeDataCommand( + const std::vector<std::string>& options) { + DumpResult result; + // This is a debug command for the HAL, caller should not continue to dump state. + result.callerShouldDumpState = false; + + if (options.size() < 3) { + result.buffer += "No subcommand specified for genfakedata\n"; + result.buffer += getHelpInfo(); + return result; + } + + std::string command = options[2]; + if (command == "--startlinear") { + LOG(INFO) << __func__ << "FakeDataCommand::StartLinear"; + // --debughal --genfakedata --startlinear [propID(int32)] [middleValue(float)] + // [currentValue(float)] [dispersion(float)] [increment(float)] [interval(int64)] + if (options.size() != 9) { + result.buffer += + "incorrect argument count, need 9 arguments for --genfakedata --startlinear\n"; + result.buffer += getHelpInfo(); + return result; + } + int32_t propId; + float middleValue; + float currentValue; + float dispersion; + float increment; + int64_t interval; + if (!android::base::ParseInt(options[3], &propId)) { + result.buffer += "failed to parse propdID as int: \"" + options[3] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + if (!android::base::ParseFloat(options[4], &middleValue)) { + result.buffer += "failed to parse middleValue as float: \"" + options[4] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + if (!android::base::ParseFloat(options[5], ¤tValue)) { + result.buffer += "failed to parse currentValue as float: \"" + options[5] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + if (!android::base::ParseFloat(options[6], &dispersion)) { + result.buffer += "failed to parse dispersion as float: \"" + options[6] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + if (!android::base::ParseFloat(options[7], &increment)) { + result.buffer += "failed to parse increment as float: \"" + options[7] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + if (!android::base::ParseInt(options[8], &interval)) { + result.buffer += "failed to parse interval as int: \"" + options[8] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + auto generator = std::make_unique<LinearFakeValueGenerator>( + propId, middleValue, currentValue, dispersion, increment, interval); + getGeneratorHub()->registerGenerator(propId, std::move(generator)); + return result; + } else if (command == "--stoplinear") { + LOG(INFO) << __func__ << "FakeDataCommand::StopLinear"; + // --debughal --genfakedata --stoplinear [propID(int32)] + if (options.size() != 4) { + result.buffer += + "incorrect argument count, need 4 arguments for --genfakedata --stoplinear\n"; + result.buffer += getHelpInfo(); + return result; + } + int32_t propId; + if (!android::base::ParseInt(options[3], &propId)) { + result.buffer += "failed to parse propdID as int: \"" + options[3] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + getGeneratorHub()->unregisterGenerator(propId); + return result; + } else if (command == "--startjson") { + LOG(INFO) << __func__ << "FakeDataCommand::StartJson"; + // --debughal --genfakedata --startjson [jsonFilePath(string)] [repetition(int32)(optional)] + if (options.size() != 4 && options.size() != 5) { + result.buffer += + "incorrect argument count, need 4 or 5 arguments for --genfakedata " + "--startjson\n"; + result.buffer += getHelpInfo(); + return result; + } + std::string fileName = options[3]; + int32_t cookie = std::hash<std::string>()(fileName); + // Iterate infinitely if repetition number is not provided + int32_t repetition = -1; + if (options.size() == 5) { + if (!android::base::ParseInt(options[4], &repetition)) { + result.buffer += "failed to parse repetition as int: \"" + options[4] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + } + auto generator = std::make_unique<JsonFakeValueGenerator>(fileName, repetition); + if (!generator->hasNext()) { + result.buffer += "invalid JSON file, no events"; + return result; + } + getGeneratorHub()->registerGenerator(cookie, std::move(generator)); + return result; + } else if (command == "--stopjson") { + LOG(INFO) << __func__ << "FakeDataCommand::StopJson"; + // --debughal --genfakedata --stopjson [jsonFilePath(string)] + if (options.size() != 4) { + result.buffer += + "incorrect argument count, need 4 arguments for --genfakedata --stopjson\n"; + result.buffer += getHelpInfo(); + return result; + } + std::string fileName = options[3]; + int32_t cookie = std::hash<std::string>()(fileName); + getGeneratorHub()->unregisterGenerator(cookie); + return result; + } else if (command == "--keypress") { + LOG(INFO) << __func__ << "FakeDataCommand::KeyPress"; + int32_t keyCode; + int32_t display; + // --debughal --genfakedata --keypress [keyCode(int32)] [display[int32]] + if (options.size() != 5) { + result.buffer += + "incorrect argument count, need 5 arguments for --genfakedata --keypress\n"; + result.buffer += getHelpInfo(); + return result; + } + if (!android::base::ParseInt(options[3], &keyCode)) { + result.buffer += "failed to parse keyCode as int: \"" + options[3] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + if (!android::base::ParseInt(options[4], &display)) { + result.buffer += "failed to parse display as int: \"" + options[4] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + // Send back to HAL + onPropertyValueFromCar( + *createHwInputKeyProp(VehicleHwKeyInputAction::ACTION_DOWN, keyCode, display), + /*updateStatus=*/true); + onPropertyValueFromCar( + *createHwInputKeyProp(VehicleHwKeyInputAction::ACTION_UP, keyCode, display), + /*updateStatus=*/true); + return result; + } + + result.buffer += "Unknown command: \"" + command + "\"\n"; + result.buffer += getHelpInfo(); + return result; +} + +void DefaultVehicleHalServer::maybeOverrideProperties(const char* overrideDir) { + if (android::base::GetBoolProperty("persist.vendor.vhal_init_value_override", false)) { + overrideProperties(overrideDir); + } +} + +void DefaultVehicleHalServer::overrideProperties(const char* overrideDir) { + LOG(INFO) << "loading vendor override properties from " << overrideDir; + if (auto dir = opendir(overrideDir)) { + std::regex reg_json(".*[.]json", std::regex::icase); + while (auto f = readdir(dir)) { + if (!regex_match(f->d_name, reg_json)) { + continue; + } + std::string file = overrideDir + std::string(f->d_name); + JsonFakeValueGenerator tmpGenerator(file); + + std::vector<VehiclePropValue> propValues = tmpGenerator.getAllEvents(); + for (const VehiclePropValue& prop : propValues) { + mServerSidePropStore.writeValue(prop, true); + } + } + closedir(dir); + } +} + +IVehicleServer::DumpResult DefaultVehicleHalServer::setValueCommand( + const std::vector<std::string>& options) { + DumpResult result; + // This is a debug command for the HAL, caller should not continue to dump state. + result.callerShouldDumpState = false; + // --debughal --set* [propID(int32)] [value] [timestamp(int64)] + // [areaId(int32)(optional)] + if (options.size() != 5 && options.size() != 6) { + result.buffer += + "incorrect argument count, need 5 or 6 arguments for --setint or --setfloat or " + "--setbool\n"; + result.buffer += getHelpInfo(); + return result; + } + std::unique_ptr<VehiclePropValue> updatedPropValue; + int32_t propId; + int32_t intValue; + float floatValue; + int64_t timestamp; + int32_t areaId = 0; + if (options[1] == "--setint") { + updatedPropValue = std::move(createVehiclePropValue(VehiclePropertyType::INT32, 1)); + if (!android::base::ParseInt(options[3], &intValue)) { + result.buffer += "failed to parse value as int: \"" + options[3] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + updatedPropValue->value.int32Values[0] = intValue; + } else if (options[1] == "--setbool") { + updatedPropValue = std::move(createVehiclePropValue(VehiclePropertyType::BOOLEAN, 1)); + if (options[3] == "true" || options[3] == "True") { + updatedPropValue->value.int32Values[0] = 1; + } else if (options[3] == "false" || options[3] == "False") { + updatedPropValue->value.int32Values[0] = 0; + } else { + result.buffer += "failed to parse value as bool, only accepts true/false: \"" + + options[3] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + } else { + updatedPropValue = std::move(createVehiclePropValue(VehiclePropertyType::FLOAT, 1)); + if (!android::base::ParseFloat(options[3], &floatValue)) { + result.buffer += "failed to parse value as float: \"" + options[3] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + updatedPropValue->value.floatValues[0] = floatValue; + } + if (!android::base::ParseInt(options[2], &propId)) { + result.buffer += "failed to parse propID as int: \"" + options[2] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + updatedPropValue->prop = propId; + if (!android::base::ParseInt(options[4], ×tamp)) { + result.buffer += "failed to parse timestamp as int: \"" + options[4] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + updatedPropValue->timestamp = timestamp; + if (options.size() == 6) { + if (!android::base::ParseInt(options[5], &areaId)) { + result.buffer += "failed to parse areaID as int: \"" + options[5] + "\"\n"; + result.buffer += getHelpInfo(); + return result; + } + } + updatedPropValue->areaId = areaId; + + onPropertyValueFromCar(*updatedPropValue, /*updateStatus=*/true); + return result; +} + +} // namespace impl + +} // namespace V2_0 +} // namespace vehicle +} // namespace automotive +} // namespace hardware +} // namespace android diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHalServer.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHalServer.h new file mode 100644 index 0000000000..87548465aa --- /dev/null +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHalServer.h @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2021 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 <vhal_v2_0/VehicleObjectPool.h> +#include <vhal_v2_0/VehiclePropertyStore.h> +#include <vhal_v2_0/VehicleServer.h> + +#include "DefaultConfig.h" +#include "GeneratorHub.h" + +namespace android { +namespace hardware { +namespace automotive { +namespace vehicle { +namespace V2_0 { + +namespace impl { + +// This contains the server operation for VHAL running in emulator. +class DefaultVehicleHalServer : public IVehicleServer { + public: + DefaultVehicleHalServer(); + + // Send all the property values to client. + void sendAllValuesToClient(); + + // Methods from IVehicleServer + + std::vector<VehiclePropConfig> onGetAllPropertyConfig() const override; + + StatusCode onSetProperty(const VehiclePropValue& value, bool updateStatus) override; + + // Dump/debug the Default VHAL server. If options is empty, the internal information for the + // server would be dumped. Otherwise, the options would be treated as debug commands and sent + // to debug function to handle the commands. + DumpResult onDump(const std::vector<std::string>& options) override; + + // Set the Property Value Pool used in this server + void setValuePool(VehiclePropValuePool* valuePool); + + protected: + using VehiclePropValuePtr = recyclable_ptr<VehiclePropValue>; + GeneratorHub* getGeneratorHub(); + + VehiclePropValuePool* getValuePool() const; + + void onFakeValueGenerated(const VehiclePropValue& value); + + StatusCode handleGenerateFakeDataRequest(const VehiclePropValue& request); + + VehiclePropValuePtr createApPowerStateReq(VehicleApPowerStateReq req, int32_t param); + + VehiclePropValuePtr createHwInputKeyProp(VehicleHwKeyInputAction action, int32_t keyCode, + int32_t targetDisplay); + + void storePropInitialValue(const ConfigDeclaration& config); + + // Handles debug commands. The first option must be "--debughal" otherwise the command would be + // ignored. The second option specifies the operations to execute. Different operations require + // different input options, for detail, see the helpInfo printed by getHelpInfo(). + DumpResult debugCommand(const std::vector<std::string>& options); + + // Gets help info. Contains the usage for different debug commands. + std::string getHelpInfo(); + + // If "persist.vendor.vhal_init_value_override" is true, try to override the properties default + // values according to JSON files in 'overrideDir'. Would be called in constructor using + // VENDOR_OVERRIDE_DIR as overrideDir. + void maybeOverrideProperties(const char* overrideDir); + + // Handles "--genfakedata" debug command. + DumpResult genFakeDataCommand(const std::vector<std::string>& options); + + // Handles "--setint" or "--setfloat" or "--setbool" debug command. + DumpResult setValueCommand(const std::vector<std::string>& options); + + protected: + GeneratorHub mGeneratorHub{ + [this](const VehiclePropValue& value) { return onFakeValueGenerated(value); }}; + + VehiclePropValuePool* mValuePool{nullptr}; + VehiclePropertyStore mServerSidePropStore; + + private: + // Expose protected methods to unit test. + friend class DefaultVhalImplTestHelper; + // Override the properties using config files in 'overrideDir'. + void overrideProperties(const char* overrideDir); +}; + +} // namespace impl + +} // namespace V2_0 +} // namespace vehicle +} // namespace automotive +} // namespace hardware +} // namespace android diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleConnector.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleConnector.cpp deleted file mode 100644 index eae58d0759..0000000000 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleConnector.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * 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. - */ - -#define LOG_TAG "automotive.vehicle@2.0-connector" - -#include <fstream> - -#include <android-base/logging.h> -#include <utils/SystemClock.h> - -#include "EmulatedVehicleConnector.h" -#include "JsonFakeValueGenerator.h" -#include "LinearFakeValueGenerator.h" -#include "Obd2SensorStore.h" - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_0 { - -namespace impl { - -EmulatedUserHal* EmulatedVehicleConnector::getEmulatedUserHal() { - return &mEmulatedUserHal; -} - -void EmulatedVehicleConnector::triggerSendAllValues() { - sendAllValuesToClient(); -} - -StatusCode EmulatedVehicleConnector::onSetProperty(const VehiclePropValue& value, - bool updateStatus) { - if (mEmulatedUserHal.isSupported(value.prop)) { - LOG(INFO) << "onSetProperty(): property " << value.prop << " will be handled by UserHal"; - - const auto& ret = mEmulatedUserHal.onSetProperty(value); - if (!ret.ok()) { - LOG(ERROR) << "onSetProperty(): HAL returned error: " << ret.error().message(); - return StatusCode(ret.error().code()); - } - auto updatedValue = ret.value().get(); - if (updatedValue != nullptr) { - LOG(INFO) << "onSetProperty(): updating property returned by HAL: " - << toString(*updatedValue); - onPropertyValueFromCar(*updatedValue, updateStatus); - } - return StatusCode::OK; - } - return this->VehicleHalServer::onSetProperty(value, updateStatus); -} - -bool EmulatedVehicleConnector::onDump(const hidl_handle& handle, - const hidl_vec<hidl_string>& options) { - int fd = handle->data[0]; - - if (options.size() > 0) { - if (options[0] == "--help") { - dprintf(fd, "Emulator-specific usage:\n"); - mEmulatedUserHal.showDumpHelp(fd); - dprintf(fd, "\n"); - // Include caller's help options - return true; - } else if (options[0] == kUserHalDumpOption) { - mEmulatedUserHal.dump(fd, ""); - return false; - - } else { - // Let caller handle the options... - return true; - } - } - - dprintf(fd, "Emulator-specific state:\n"); - mEmulatedUserHal.dump(fd, " "); - dprintf(fd, "\n"); - - return true; -} - -} // namespace impl - -} // namespace V2_0 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp deleted file mode 100644 index e8b79dc394..0000000000 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.cpp +++ /dev/null @@ -1,532 +0,0 @@ -/* - * Copyright (C) 2016 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. - */ -#define LOG_TAG "DefaultVehicleHal_v2_0" - -#include <android-base/chrono_utils.h> -#include <android-base/macros.h> -#include <android-base/properties.h> -#include <android/log.h> -#include <dirent.h> -#include <sys/system_properties.h> -#include <utils/SystemClock.h> -#include <fstream> -#include <regex> - -#include "EmulatedVehicleHal.h" -#include "JsonFakeValueGenerator.h" -#include "LinearFakeValueGenerator.h" -#include "Obd2SensorStore.h" - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_0 { - -namespace impl { - -static constexpr std::chrono::nanoseconds kHeartBeatIntervalNs = 3s; - -static std::unique_ptr<Obd2SensorStore> fillDefaultObd2Frame(size_t numVendorIntegerSensors, - size_t numVendorFloatSensors) { - std::unique_ptr<Obd2SensorStore> sensorStore( - new Obd2SensorStore(numVendorIntegerSensors, numVendorFloatSensors)); - - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::FUEL_SYSTEM_STATUS, - toInt(Obd2FuelSystemStatus::CLOSED_LOOP)); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::MALFUNCTION_INDICATOR_LIGHT_ON, 0); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::IGNITION_MONITORS_SUPPORTED, - toInt(Obd2IgnitionMonitorKind::SPARK)); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::IGNITION_SPECIFIC_MONITORS, - Obd2CommonIgnitionMonitors::COMPONENTS_AVAILABLE | - Obd2CommonIgnitionMonitors::MISFIRE_AVAILABLE | - Obd2SparkIgnitionMonitors::AC_REFRIGERANT_AVAILABLE | - Obd2SparkIgnitionMonitors::EVAPORATIVE_SYSTEM_AVAILABLE); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::INTAKE_AIR_TEMPERATURE, 35); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::COMMANDED_SECONDARY_AIR_STATUS, - toInt(Obd2SecondaryAirStatus::FROM_OUTSIDE_OR_OFF)); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::NUM_OXYGEN_SENSORS_PRESENT, 1); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::RUNTIME_SINCE_ENGINE_START, 500); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON, 0); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::WARMUPS_SINCE_CODES_CLEARED, 51); - sensorStore->setIntegerSensor( - DiagnosticIntegerSensorIndex::DISTANCE_TRAVELED_SINCE_CODES_CLEARED, 365); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::ABSOLUTE_BAROMETRIC_PRESSURE, 30); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::CONTROL_MODULE_VOLTAGE, 12); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::AMBIENT_AIR_TEMPERATURE, 18); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::MAX_FUEL_AIR_EQUIVALENCE_RATIO, 1); - sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::FUEL_TYPE, - toInt(Obd2FuelType::GASOLINE)); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::CALCULATED_ENGINE_LOAD, 0.153); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK1, -0.16); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK1, -0.16); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK2, -0.16); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK2, -0.16); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::INTAKE_MANIFOLD_ABSOLUTE_PRESSURE, 7.5); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::ENGINE_RPM, 1250.); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::VEHICLE_SPEED, 40.); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::TIMING_ADVANCE, 2.5); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::THROTTLE_POSITION, 19.75); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::OXYGEN_SENSOR1_VOLTAGE, 0.265); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::FUEL_TANK_LEVEL_INPUT, 0.824); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::EVAPORATION_SYSTEM_VAPOR_PRESSURE, - -0.373); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::CATALYST_TEMPERATURE_BANK1_SENSOR1, - 190.); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::RELATIVE_THROTTLE_POSITION, 3.); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::ABSOLUTE_THROTTLE_POSITION_B, 0.306); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::ACCELERATOR_PEDAL_POSITION_D, 0.188); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::ACCELERATOR_PEDAL_POSITION_E, 0.094); - sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::COMMANDED_THROTTLE_ACTUATOR, 0.024); - - return sensorStore; -} - -EmulatedVehicleHal::EmulatedVehicleHal(VehiclePropertyStore* propStore, VehicleHalClient* client, - EmulatedUserHal* emulatedUserHal) - : mPropStore(propStore), - mHvacPowerProps(std::begin(kHvacPowerProperties), std::end(kHvacPowerProperties)), - mRecurrentTimer(std::bind(&EmulatedVehicleHal::onContinuousPropertyTimer, this, - std::placeholders::_1)), - mVehicleClient(client), - mEmulatedUserHal(emulatedUserHal) { - initStaticConfig(); - mVehicleClient->registerPropertyValueCallback(std::bind(&EmulatedVehicleHal::onPropertyValue, - this, std::placeholders::_1, - std::placeholders::_2)); - - mInitVhalValueOverride = - android::base::GetBoolProperty("persist.vendor.vhal_init_value_override", false); - if (mInitVhalValueOverride) { - getAllPropertiesOverride(); - } -} - -void EmulatedVehicleHal::getAllPropertiesOverride() { - if (auto dir = opendir("/vendor/etc/vhaloverride/")) { - std::regex reg_json(".*[.]json", std::regex::icase); - while (auto f = readdir(dir)) { - if (!regex_match(f->d_name, reg_json)) { - continue; - } - std::string file = "/vendor/etc/vhaloverride/" + std::string(f->d_name); - JsonFakeValueGenerator tmpGenerator(file); - - std::vector<VehiclePropValue> propvalues = tmpGenerator.getAllEvents(); - mVehiclePropertiesOverride.insert(std::end(mVehiclePropertiesOverride), - std::begin(propvalues), std::end(propvalues)); - } - closedir(dir); - } -} - -VehicleHal::VehiclePropValuePtr EmulatedVehicleHal::get( - const VehiclePropValue& requestedPropValue, StatusCode* outStatus) { - auto propId = requestedPropValue.prop; - ALOGV("get(%d)", propId); - - auto& pool = *getValuePool(); - VehiclePropValuePtr v = nullptr; - - switch (propId) { - case OBD2_FREEZE_FRAME: - v = pool.obtainComplex(); - *outStatus = fillObd2FreezeFrame(requestedPropValue, v.get()); - break; - case OBD2_FREEZE_FRAME_INFO: - v = pool.obtainComplex(); - *outStatus = fillObd2DtcInfo(v.get()); - break; - default: - if (mEmulatedUserHal != nullptr && mEmulatedUserHal->isSupported(propId)) { - ALOGI("get(): getting value for prop %d from User HAL", propId); - const auto& ret = mEmulatedUserHal->onGetProperty(requestedPropValue); - if (!ret.ok()) { - ALOGE("get(): User HAL returned error: %s", ret.error().message().c_str()); - *outStatus = StatusCode(ret.error().code()); - } else { - auto value = ret.value().get(); - if (value != nullptr) { - ALOGI("get(): User HAL returned value: %s", toString(*value).c_str()); - v = getValuePool()->obtain(*value); - *outStatus = StatusCode::OK; - } else { - ALOGE("get(): User HAL returned null value"); - *outStatus = StatusCode::INTERNAL_ERROR; - } - } - break; - } - - auto internalPropValue = mPropStore->readValueOrNull(requestedPropValue); - if (internalPropValue != nullptr) { - v = getValuePool()->obtain(*internalPropValue); - } - - if (!v) { - *outStatus = StatusCode::INVALID_ARG; - } else if (v->status == VehiclePropertyStatus::AVAILABLE) { - *outStatus = StatusCode::OK; - } else { - *outStatus = StatusCode::TRY_AGAIN; - } - break; - } - if (v.get()) { - v->timestamp = elapsedRealtimeNano(); - } - return v; -} - -bool EmulatedVehicleHal::dump(const hidl_handle& fd, const hidl_vec<hidl_string>& options) { - return mVehicleClient->dump(fd, options); -} - -StatusCode EmulatedVehicleHal::set(const VehiclePropValue& propValue) { - constexpr bool updateStatus = false; - - if (propValue.prop == kGenerateFakeDataControllingProperty) { - // Send the generator controlling request to the server. - // 'updateStatus' flag is only for the value sent by setProperty (propValue in this case) - // instead of the generated values triggered by it. 'propValue' works as a control signal - // here, since we never send the control signal back, the value of 'updateStatus' flag - // does not matter here. - auto status = mVehicleClient->setProperty(propValue, updateStatus); - return status; - } else if (mHvacPowerProps.count(propValue.prop)) { - auto hvacPowerOn = mPropStore->readValueOrNull( - toInt(VehicleProperty::HVAC_POWER_ON), - (VehicleAreaSeat::ROW_1_LEFT | VehicleAreaSeat::ROW_1_RIGHT | - VehicleAreaSeat::ROW_2_LEFT | VehicleAreaSeat::ROW_2_CENTER | - VehicleAreaSeat::ROW_2_RIGHT)); - - if (hvacPowerOn && hvacPowerOn->value.int32Values.size() == 1 - && hvacPowerOn->value.int32Values[0] == 0) { - return StatusCode::NOT_AVAILABLE; - } - } else { - // Handle property specific code - switch (propValue.prop) { - case OBD2_FREEZE_FRAME_CLEAR: - return clearObd2FreezeFrames(propValue); - case VEHICLE_MAP_SERVICE: - // Placeholder for future implementation of VMS property in the default hal. For - // now, just returns OK; otherwise, hal clients crash with property not supported. - return StatusCode::OK; - } - } - - if (propValue.status != VehiclePropertyStatus::AVAILABLE) { - // Android side cannot set property status - this value is the - // purview of the HAL implementation to reflect the state of - // its underlying hardware - return StatusCode::INVALID_ARG; - } - auto currentPropValue = mPropStore->readValueOrNull(propValue); - - if (currentPropValue == nullptr) { - return StatusCode::INVALID_ARG; - } - if (currentPropValue->status != VehiclePropertyStatus::AVAILABLE) { - // do not allow Android side to set() a disabled/error property - return StatusCode::NOT_AVAILABLE; - } - - if (mInEmulator && propValue.prop == toInt(VehicleProperty::DISPLAY_BRIGHTNESS)) { - // Emulator does not support remote brightness control, b/139959479 - // do not send it down so that it does not bring unnecessary property change event - // return other error code, such NOT_AVAILABLE, causes Emulator to be freezing - // TODO: return StatusCode::NOT_AVAILABLE once the above issue is fixed - return StatusCode::OK; - } - - /** - * After checking all conditions, such as the property is available, a real vhal will - * sent the events to Car ECU to take actions. - */ - - // Send the value to the vehicle server, the server will talk to the (real or emulated) car - auto setValueStatus = mVehicleClient->setProperty(propValue, updateStatus); - if (setValueStatus != StatusCode::OK) { - return setValueStatus; - } - - return StatusCode::OK; -} - -static bool isDiagnosticProperty(VehiclePropConfig propConfig) { - switch (propConfig.prop) { - case OBD2_LIVE_FRAME: - case OBD2_FREEZE_FRAME: - case OBD2_FREEZE_FRAME_CLEAR: - case OBD2_FREEZE_FRAME_INFO: - return true; - } - return false; -} - -// Parse supported properties list and generate vector of property values to hold current values. -void EmulatedVehicleHal::onCreate() { - static constexpr bool shouldUpdateStatus = true; - - auto configs = mVehicleClient->getAllPropertyConfig(); - - for (const auto& cfg : configs) { - if (isDiagnosticProperty(cfg)) { - // do not write an initial empty value for the diagnostic properties - // as we will initialize those separately. - continue; - } - - int32_t numAreas = isGlobalProp(cfg.prop) ? 0 : cfg.areaConfigs.size(); - - for (int i = 0; i < numAreas; i++) { - int32_t curArea = isGlobalProp(cfg.prop) ? 0 : cfg.areaConfigs[i].areaId; - - // Create a separate instance for each individual zone - VehiclePropValue prop = { - .areaId = curArea, - .prop = cfg.prop, - .status = VehiclePropertyStatus::UNAVAILABLE, - }; - - if (mInitVhalValueOverride) { - for (auto& itOverride : mVehiclePropertiesOverride) { - if (itOverride.prop == cfg.prop) { - prop.status = VehiclePropertyStatus::AVAILABLE; - prop.value = itOverride.value; - } - } - } - mPropStore->writeValue(prop, shouldUpdateStatus); - } - } - - mVehicleClient->triggerSendAllValues(); - - initObd2LiveFrame(*mPropStore->getConfigOrDie(OBD2_LIVE_FRAME)); - initObd2FreezeFrame(*mPropStore->getConfigOrDie(OBD2_FREEZE_FRAME)); - mInEmulator = isInEmulator(); - ALOGD("mInEmulator=%s", mInEmulator ? "true" : "false"); - mRecurrentTimer.registerRecurrentEvent(kHeartBeatIntervalNs, - static_cast<int32_t>(VehicleProperty::VHAL_HEARTBEAT)); -} - -std::vector<VehiclePropConfig> EmulatedVehicleHal::listProperties() { - return mPropStore->getAllConfigs(); -} - -void EmulatedVehicleHal::onContinuousPropertyTimer(const std::vector<int32_t>& properties) { - VehiclePropValuePtr v; - - auto& pool = *getValuePool(); - - for (int32_t property : properties) { - if (isContinuousProperty(property)) { - auto internalPropValue = mPropStore->readValueOrNull(property); - if (internalPropValue != nullptr) { - v = pool.obtain(*internalPropValue); - } - } else if (property == static_cast<int32_t>(VehicleProperty::VHAL_HEARTBEAT)) { - // VHAL_HEARTBEAT is not a continuous value, but it needs to be updated periodically. - // So, the update is done through onContinuousPropertyTimer. - v = doInternalHealthCheck(); - } else { - ALOGE("Unexpected onContinuousPropertyTimer for property: 0x%x", property); - } - - if (v.get()) { - v->timestamp = elapsedRealtimeNano(); - doHalEvent(std::move(v)); - } - } -} - -StatusCode EmulatedVehicleHal::subscribe(int32_t property, float sampleRate) { - ALOGI("%s propId: 0x%x, sampleRate: %f", __func__, property, sampleRate); - - if (isContinuousProperty(property)) { - mRecurrentTimer.registerRecurrentEvent(hertzToNanoseconds(sampleRate), property); - } - return StatusCode::OK; -} - -StatusCode EmulatedVehicleHal::unsubscribe(int32_t property) { - ALOGI("%s propId: 0x%x", __func__, property); - if (isContinuousProperty(property)) { - mRecurrentTimer.unregisterRecurrentEvent(property); - } - return StatusCode::OK; -} - -bool EmulatedVehicleHal::isContinuousProperty(int32_t propId) const { - const VehiclePropConfig* config = mPropStore->getConfigOrNull(propId); - if (config == nullptr) { - ALOGW("Config not found for property: 0x%x", propId); - return false; - } - return config->changeMode == VehiclePropertyChangeMode::CONTINUOUS; -} - -bool EmulatedVehicleHal::setPropertyFromVehicle(const VehiclePropValue& propValue) { - constexpr bool updateStatus = true; - return mVehicleClient->setProperty(propValue, updateStatus) == StatusCode::OK; -} - -std::vector<VehiclePropValue> EmulatedVehicleHal::getAllProperties() const { - return mPropStore->readAllValues(); -} - -void EmulatedVehicleHal::onPropertyValue(const VehiclePropValue& value, bool updateStatus) { - VehiclePropValuePtr updatedPropValue = getValuePool()->obtain(value); - - if (mPropStore->writeValue(*updatedPropValue, updateStatus)) { - getEmulatorOrDie()->doSetValueFromClient(*updatedPropValue); - doHalEvent(std::move(updatedPropValue)); - } -} - -void EmulatedVehicleHal::initStaticConfig() { - auto configs = mVehicleClient->getAllPropertyConfig(); - for (auto&& cfg : configs) { - VehiclePropertyStore::TokenFunction tokenFunction = nullptr; - - switch (cfg.prop) { - case OBD2_FREEZE_FRAME: { - tokenFunction = [](const VehiclePropValue& propValue) { - return propValue.timestamp; - }; - break; - } - default: - break; - } - - mPropStore->registerProperty(cfg, tokenFunction); - } -} - -void EmulatedVehicleHal::initObd2LiveFrame(const VehiclePropConfig& propConfig) { - static constexpr bool shouldUpdateStatus = true; - - auto liveObd2Frame = createVehiclePropValue(VehiclePropertyType::MIXED, 0); - auto sensorStore = fillDefaultObd2Frame(static_cast<size_t>(propConfig.configArray[0]), - static_cast<size_t>(propConfig.configArray[1])); - sensorStore->fillPropValue("", liveObd2Frame.get()); - liveObd2Frame->prop = OBD2_LIVE_FRAME; - - mPropStore->writeValue(*liveObd2Frame, shouldUpdateStatus); -} - -void EmulatedVehicleHal::initObd2FreezeFrame(const VehiclePropConfig& propConfig) { - static constexpr bool shouldUpdateStatus = true; - - auto sensorStore = fillDefaultObd2Frame(static_cast<size_t>(propConfig.configArray[0]), - static_cast<size_t>(propConfig.configArray[1])); - - static std::vector<std::string> sampleDtcs = {"P0070", - "P0102" - "P0123"}; - for (auto&& dtc : sampleDtcs) { - auto freezeFrame = createVehiclePropValue(VehiclePropertyType::MIXED, 0); - sensorStore->fillPropValue(dtc, freezeFrame.get()); - freezeFrame->prop = OBD2_FREEZE_FRAME; - - mPropStore->writeValue(*freezeFrame, shouldUpdateStatus); - } -} - -StatusCode EmulatedVehicleHal::fillObd2FreezeFrame(const VehiclePropValue& requestedPropValue, - VehiclePropValue* outValue) { - if (requestedPropValue.value.int64Values.size() != 1) { - ALOGE("asked for OBD2_FREEZE_FRAME without valid timestamp"); - return StatusCode::INVALID_ARG; - } - auto timestamp = requestedPropValue.value.int64Values[0]; - auto freezeFrame = mPropStore->readValueOrNull(OBD2_FREEZE_FRAME, 0, timestamp); - if (freezeFrame == nullptr) { - ALOGE("asked for OBD2_FREEZE_FRAME at invalid timestamp"); - return StatusCode::INVALID_ARG; - } - outValue->prop = OBD2_FREEZE_FRAME; - outValue->value.int32Values = freezeFrame->value.int32Values; - outValue->value.floatValues = freezeFrame->value.floatValues; - outValue->value.bytes = freezeFrame->value.bytes; - outValue->value.stringValue = freezeFrame->value.stringValue; - outValue->timestamp = freezeFrame->timestamp; - return StatusCode::OK; -} - -StatusCode EmulatedVehicleHal::clearObd2FreezeFrames(const VehiclePropValue& propValue) { - if (propValue.value.int64Values.size() == 0) { - mPropStore->removeValuesForProperty(OBD2_FREEZE_FRAME); - return StatusCode::OK; - } else { - for (int64_t timestamp : propValue.value.int64Values) { - auto freezeFrame = mPropStore->readValueOrNull(OBD2_FREEZE_FRAME, 0, timestamp); - if (freezeFrame == nullptr) { - ALOGE("asked for OBD2_FREEZE_FRAME at invalid timestamp"); - return StatusCode::INVALID_ARG; - } - mPropStore->removeValue(*freezeFrame); - } - } - return StatusCode::OK; -} - -StatusCode EmulatedVehicleHal::fillObd2DtcInfo(VehiclePropValue* outValue) { - std::vector<int64_t> timestamps; - for (const auto& freezeFrame : mPropStore->readValuesForProperty(OBD2_FREEZE_FRAME)) { - timestamps.push_back(freezeFrame.timestamp); - } - outValue->value.int64Values = timestamps; - outValue->prop = OBD2_FREEZE_FRAME_INFO; - return StatusCode::OK; -} - -VehicleHal::VehiclePropValuePtr EmulatedVehicleHal::doInternalHealthCheck() { - VehicleHal::VehiclePropValuePtr v = nullptr; - - // This is an example of very simpe health checking. VHAL is considered healthy if we can read - // PERF_VEHICLE_SPEED. The more comprehensive health checking is required. - VehiclePropValue propValue = { - .prop = static_cast<int32_t>(VehicleProperty::PERF_VEHICLE_SPEED), - }; - auto internalPropValue = mPropStore->readValueOrNull(propValue); - if (internalPropValue != nullptr) { - v = createVhalHeartBeatProp(); - } else { - ALOGW("VHAL health check failed"); - } - return v; -} - -VehicleHal::VehiclePropValuePtr EmulatedVehicleHal::createVhalHeartBeatProp() { - VehicleHal::VehiclePropValuePtr v = getValuePool()->obtainInt64(uptimeMillis()); - v->prop = static_cast<int32_t>(VehicleProperty::VHAL_HEARTBEAT); - v->areaId = 0; - v->status = VehiclePropertyStatus::AVAILABLE; - return v; -} - -} // impl - -} // namespace V2_0 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.h index 7871c7b41a..1387f851ef 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.h +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedVehicleHal.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 The Android Open Source Project + * Copyright (C) 2021 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. @@ -14,26 +14,14 @@ * limitations under the License. */ -#ifndef android_hardware_automotive_vehicle_V2_0_impl_EmulatedVehicleHal_H_ -#define android_hardware_automotive_vehicle_V2_0_impl_EmulatedVehicleHal_H_ +// This file is just used for soft migration from EmulatedVehicleHal to DefaultVehicleHal. +// The virtualized VHAL that uses EmulatedVehicleHal is at a different repo and cannot be updated +// together with this repo, so we need a soft migration. Once the rename is finished at the +// virtualized VHAL side, this file would be removed. -#include <map> -#include <memory> -#include <sys/socket.h> -#include <thread> -#include <unordered_set> +#pragma once -#include <utils/SystemClock.h> - -#include <vhal_v2_0/RecurrentTimer.h> -#include <vhal_v2_0/VehicleHal.h> -#include "vhal_v2_0/VehiclePropertyStore.h" - -#include "EmulatedUserHal.h" -#include "EmulatedVehicleConnector.h" -#include "GeneratorHub.h" -#include "PropertyUtils.h" -#include "VehicleEmulator.h" +#include "DefaultVehicleHal.h" namespace android { namespace hardware { @@ -43,66 +31,16 @@ namespace V2_0 { namespace impl { -/** Implementation of VehicleHal that connected to emulator instead of real vehicle network. */ -class EmulatedVehicleHal : public EmulatedVehicleHalIface { -public: - EmulatedVehicleHal(VehiclePropertyStore* propStore, VehicleHalClient* client, - EmulatedUserHal* emulatedUserHal = nullptr); - ~EmulatedVehicleHal() = default; - - // Methods from VehicleHal - void onCreate() override; - std::vector<VehiclePropConfig> listProperties() override; - VehiclePropValuePtr get(const VehiclePropValue& requestedPropValue, - StatusCode* outStatus) override; - StatusCode set(const VehiclePropValue& propValue) override; - StatusCode subscribe(int32_t property, float sampleRate) override; - StatusCode unsubscribe(int32_t property) override; - bool dump(const hidl_handle& fd, const hidl_vec<hidl_string>& options) override; - - // Methods from EmulatedVehicleHalIface - bool setPropertyFromVehicle(const VehiclePropValue& propValue) override; - std::vector<VehiclePropValue> getAllProperties() const override; - void getAllPropertiesOverride(); - -private: - constexpr std::chrono::nanoseconds hertzToNanoseconds(float hz) const { - return std::chrono::nanoseconds(static_cast<int64_t>(1000000000L / hz)); - } - - StatusCode handleGenerateFakeDataRequest(const VehiclePropValue& request); - void onPropertyValue(const VehiclePropValue& value, bool updateStatus); - - void onContinuousPropertyTimer(const std::vector<int32_t>& properties); - bool isContinuousProperty(int32_t propId) const; - void initStaticConfig(); - void initObd2LiveFrame(const VehiclePropConfig& propConfig); - void initObd2FreezeFrame(const VehiclePropConfig& propConfig); - StatusCode fillObd2FreezeFrame(const VehiclePropValue& requestedPropValue, - VehiclePropValue* outValue); - StatusCode fillObd2DtcInfo(VehiclePropValue* outValue); - StatusCode clearObd2FreezeFrames(const VehiclePropValue& propValue); - VehicleHal::VehiclePropValuePtr doInternalHealthCheck(); - VehicleHal::VehiclePropValuePtr createVhalHeartBeatProp(); - - /* Private members */ - VehiclePropertyStore* mPropStore; - std::unordered_set<int32_t> mHvacPowerProps; - RecurrentTimer mRecurrentTimer; - VehicleHalClient* mVehicleClient; - bool mInEmulator; - bool mInitVhalValueOverride; - std::vector<VehiclePropValue> mVehiclePropertiesOverride; - EmulatedUserHal* mEmulatedUserHal; +class EmulatedVehicleHal : public DefaultVehicleHal { + public: + EmulatedVehicleHal(VehiclePropertyStore* propStore, VehicleHalClient* client) + : DefaultVehicleHal(propStore, client){}; }; -} // impl +} // namespace impl } // namespace V2_0 } // namespace vehicle } // namespace automotive } // namespace hardware } // namespace android - - -#endif // android_hardware_automotive_vehicle_V2_0_impl_EmulatedVehicleHal_H_ diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/FakeObd2Frame.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/FakeObd2Frame.cpp new file mode 100644 index 0000000000..d95584d2ee --- /dev/null +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/FakeObd2Frame.cpp @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2021 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 <android/hardware/automotive/vehicle/2.0/types.h> +#include <utils/Log.h> +#include <vhal_v2_0/Obd2SensorStore.h> +#include <vhal_v2_0/PropertyUtils.h> +#include <vhal_v2_0/VehiclePropertyStore.h> +#include <vhal_v2_0/VehicleUtils.h> + +namespace android { +namespace hardware { +namespace automotive { +namespace vehicle { +namespace V2_0 { + +namespace impl { + +namespace { + +std::unique_ptr<Obd2SensorStore> fillDefaultObd2Frame(size_t numVendorIntegerSensors, + size_t numVendorFloatSensors) { + std::unique_ptr<Obd2SensorStore> sensorStore( + new Obd2SensorStore(numVendorIntegerSensors, numVendorFloatSensors)); + + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::FUEL_SYSTEM_STATUS, + toInt(Obd2FuelSystemStatus::CLOSED_LOOP)); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::MALFUNCTION_INDICATOR_LIGHT_ON, 0); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::IGNITION_MONITORS_SUPPORTED, + toInt(Obd2IgnitionMonitorKind::SPARK)); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::IGNITION_SPECIFIC_MONITORS, + Obd2CommonIgnitionMonitors::COMPONENTS_AVAILABLE | + Obd2CommonIgnitionMonitors::MISFIRE_AVAILABLE | + Obd2SparkIgnitionMonitors::AC_REFRIGERANT_AVAILABLE | + Obd2SparkIgnitionMonitors::EVAPORATIVE_SYSTEM_AVAILABLE); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::INTAKE_AIR_TEMPERATURE, 35); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::COMMANDED_SECONDARY_AIR_STATUS, + toInt(Obd2SecondaryAirStatus::FROM_OUTSIDE_OR_OFF)); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::NUM_OXYGEN_SENSORS_PRESENT, 1); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::RUNTIME_SINCE_ENGINE_START, 500); + sensorStore->setIntegerSensor( + DiagnosticIntegerSensorIndex::DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON, 0); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::WARMUPS_SINCE_CODES_CLEARED, 51); + sensorStore->setIntegerSensor( + DiagnosticIntegerSensorIndex::DISTANCE_TRAVELED_SINCE_CODES_CLEARED, 365); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::ABSOLUTE_BAROMETRIC_PRESSURE, 30); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::CONTROL_MODULE_VOLTAGE, 12); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::AMBIENT_AIR_TEMPERATURE, 18); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::MAX_FUEL_AIR_EQUIVALENCE_RATIO, 1); + sensorStore->setIntegerSensor(DiagnosticIntegerSensorIndex::FUEL_TYPE, + toInt(Obd2FuelType::GASOLINE)); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::CALCULATED_ENGINE_LOAD, 0.153); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK1, -0.16); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK1, -0.16); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::SHORT_TERM_FUEL_TRIM_BANK2, -0.16); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::LONG_TERM_FUEL_TRIM_BANK2, -0.16); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::INTAKE_MANIFOLD_ABSOLUTE_PRESSURE, 7.5); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::ENGINE_RPM, 1250.); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::VEHICLE_SPEED, 40.); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::TIMING_ADVANCE, 2.5); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::THROTTLE_POSITION, 19.75); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::OXYGEN_SENSOR1_VOLTAGE, 0.265); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::FUEL_TANK_LEVEL_INPUT, 0.824); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::EVAPORATION_SYSTEM_VAPOR_PRESSURE, + -0.373); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::CATALYST_TEMPERATURE_BANK1_SENSOR1, + 190.); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::RELATIVE_THROTTLE_POSITION, 3.); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::ABSOLUTE_THROTTLE_POSITION_B, 0.306); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::ACCELERATOR_PEDAL_POSITION_D, 0.188); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::ACCELERATOR_PEDAL_POSITION_E, 0.094); + sensorStore->setFloatSensor(DiagnosticFloatSensorIndex::COMMANDED_THROTTLE_ACTUATOR, 0.024); + + return sensorStore; +} + +} // namespace + +void initObd2LiveFrame(VehiclePropertyStore* propStore, const VehiclePropConfig& propConfig) { + auto liveObd2Frame = createVehiclePropValue(VehiclePropertyType::MIXED, 0); + auto sensorStore = fillDefaultObd2Frame(static_cast<size_t>(propConfig.configArray[0]), + static_cast<size_t>(propConfig.configArray[1])); + sensorStore->fillPropValue("", liveObd2Frame.get()); + liveObd2Frame->prop = OBD2_LIVE_FRAME; + + propStore->writeValue(*liveObd2Frame, true); +} + +void initObd2FreezeFrame(VehiclePropertyStore* propStore, const VehiclePropConfig& propConfig) { + auto sensorStore = fillDefaultObd2Frame(static_cast<size_t>(propConfig.configArray[0]), + static_cast<size_t>(propConfig.configArray[1])); + + static std::vector<std::string> sampleDtcs = {"P0070", "P0102", "P0123"}; + for (auto&& dtc : sampleDtcs) { + auto freezeFrame = createVehiclePropValue(VehiclePropertyType::MIXED, 0); + sensorStore->fillPropValue(dtc, freezeFrame.get()); + freezeFrame->prop = OBD2_FREEZE_FRAME; + ALOGE("freeze frame: %lld", (long long)freezeFrame->timestamp); + + propStore->writeValue(*freezeFrame, true); + } +} + +StatusCode fillObd2FreezeFrame(VehiclePropertyStore* propStore, + const VehiclePropValue& requestedPropValue, + VehiclePropValue* outValue) { + if (requestedPropValue.value.int64Values.size() != 1) { + ALOGE("asked for OBD2_FREEZE_FRAME without valid timestamp"); + return StatusCode::INVALID_ARG; + } + if (propStore->readValuesForProperty(OBD2_FREEZE_FRAME).size() == 0) { + // Should no freeze frame be available at the given timestamp, a response of NOT_AVAILABLE + // must be returned by the implementation + return StatusCode::NOT_AVAILABLE; + } + auto timestamp = requestedPropValue.value.int64Values[0]; + auto freezeFrame = propStore->readValueOrNull(OBD2_FREEZE_FRAME, 0, timestamp); + if (freezeFrame == nullptr) { + ALOGE("asked for OBD2_FREEZE_FRAME at invalid timestamp"); + return StatusCode::INVALID_ARG; + } + outValue->prop = OBD2_FREEZE_FRAME; + outValue->value.int32Values = freezeFrame->value.int32Values; + outValue->value.floatValues = freezeFrame->value.floatValues; + outValue->value.bytes = freezeFrame->value.bytes; + outValue->value.stringValue = freezeFrame->value.stringValue; + outValue->timestamp = freezeFrame->timestamp; + return StatusCode::OK; +} + +StatusCode fillObd2DtcInfo(VehiclePropertyStore* propStore, VehiclePropValue* outValue) { + std::vector<int64_t> timestamps; + for (const auto& freezeFrame : propStore->readValuesForProperty(OBD2_FREEZE_FRAME)) { + timestamps.push_back(freezeFrame.timestamp); + } + outValue->value.int64Values = timestamps; + outValue->prop = OBD2_FREEZE_FRAME_INFO; + return StatusCode::OK; +} + +StatusCode clearObd2FreezeFrames(VehiclePropertyStore* propStore, + const VehiclePropValue& propValue) { + if (propValue.value.int64Values.size() == 0) { + propStore->removeValuesForProperty(OBD2_FREEZE_FRAME); + return StatusCode::OK; + } else { + for (int64_t timestamp : propValue.value.int64Values) { + auto freezeFrame = propStore->readValueOrNull(OBD2_FREEZE_FRAME, 0, timestamp); + if (freezeFrame == nullptr) { + ALOGE("asked for OBD2_FREEZE_FRAME at invalid timestamp"); + return StatusCode::INVALID_ARG; + } + propStore->removeValue(*freezeFrame); + } + } + return StatusCode::OK; +} + +bool isDiagnosticProperty(const VehiclePropConfig& propConfig) { + return (propConfig.prop == OBD2_LIVE_FRAME || propConfig.prop == OBD2_FREEZE_FRAME || + propConfig.prop == OBD2_FREEZE_FRAME_CLEAR || + propConfig.prop == OBD2_FREEZE_FRAME_INFO); +} + +} // namespace impl + +} // namespace V2_0 +} // namespace vehicle +} // namespace automotive +} // namespace hardware +} // namespace android diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/FakeObd2Frame.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/FakeObd2Frame.h new file mode 100644 index 0000000000..704964ca5e --- /dev/null +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/FakeObd2Frame.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2021 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. + */ +#ifndef android_hardware_automotive_vehicle_V2_0_impl_FakeObd2Frame_H_ +#define android_hardware_automotive_vehicle_V2_0_impl_FakeObd2Frame_H_ + +#include <android/hardware/automotive/vehicle/2.0/types.h> +#include <vhal_v2_0/VehiclePropertyStore.h> + +namespace android { +namespace hardware { +namespace automotive { +namespace vehicle { +namespace V2_0 { + +namespace impl { + +void initObd2LiveFrame(VehiclePropertyStore* propStore, const VehiclePropConfig& propConfig); +void initObd2FreezeFrame(VehiclePropertyStore* propStore, const VehiclePropConfig& propConfig); +StatusCode fillObd2FreezeFrame(VehiclePropertyStore* propStore, + const VehiclePropValue& requestedPropValue, + VehiclePropValue* outValue); +StatusCode fillObd2DtcInfo(VehiclePropertyStore* propStore, VehiclePropValue* outValue); +StatusCode clearObd2FreezeFrames(VehiclePropertyStore* propStore, + const VehiclePropValue& propValue); +bool isDiagnosticProperty(const VehiclePropConfig& propConfig); + +} // namespace impl + +} // namespace V2_0 +} // namespace vehicle +} // namespace automotive +} // namespace hardware +} // namespace android + +#endif // android_hardware_automotive_vehicle_V2_0_impl_FakeObd2Frame_H_ diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/JsonFakeValueGenerator.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/JsonFakeValueGenerator.cpp index b62918f61e..b728d62e25 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/JsonFakeValueGenerator.cpp +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/JsonFakeValueGenerator.cpp @@ -33,12 +33,37 @@ namespace V2_0 { namespace impl { +JsonFakeValueGenerator::JsonFakeValueGenerator(const std::string& path, int32_t repetition) { + const char* file = path.c_str(); + std::ifstream ifs(file); + if (!ifs) { + ALOGE("%s: couldn't open %s for parsing.", __func__, file); + mGenCfg = { + .index = 0, + .events = {}, + }; + mNumOfIterations = 0; + return; + } + mGenCfg = { + .index = 0, + .events = parseFakeValueJson(ifs), + }; + mNumOfIterations = repetition; +} + JsonFakeValueGenerator::JsonFakeValueGenerator(const VehiclePropValue& request) { const auto& v = request.value; const char* file = v.stringValue.c_str(); std::ifstream ifs(file); if (!ifs) { ALOGE("%s: couldn't open %s for parsing.", __func__, file); + mGenCfg = { + .index = 0, + .events = {}, + }; + mNumOfIterations = 0; + return; } mGenCfg = { .index = 0, @@ -48,10 +73,16 @@ JsonFakeValueGenerator::JsonFakeValueGenerator(const VehiclePropValue& request) mNumOfIterations = v.int32Values.size() < 2 ? -1 : v.int32Values[1]; } -JsonFakeValueGenerator::JsonFakeValueGenerator(std::string path) { +JsonFakeValueGenerator::JsonFakeValueGenerator(const std::string& path) { std::ifstream ifs(path); if (!ifs) { ALOGE("%s: couldn't open %s for parsing.", __func__, path.c_str()); + mGenCfg = { + .index = 0, + .events = {}, + }; + mNumOfIterations = 0; + return; } mGenCfg = { .index = 0, diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/JsonFakeValueGenerator.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/JsonFakeValueGenerator.h index dc8ff6680c..caa3417b6d 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/JsonFakeValueGenerator.h +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/JsonFakeValueGenerator.h @@ -41,7 +41,8 @@ private: public: JsonFakeValueGenerator(const VehiclePropValue& request); - JsonFakeValueGenerator(std::string path); + JsonFakeValueGenerator(const std::string& path, int32_t repetition); + JsonFakeValueGenerator(const std::string& path); ~JsonFakeValueGenerator() = default; diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/LinearFakeValueGenerator.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/LinearFakeValueGenerator.cpp index 96aaafe0b0..a2278bd088 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/LinearFakeValueGenerator.cpp +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/LinearFakeValueGenerator.cpp @@ -29,23 +29,36 @@ namespace V2_0 { namespace impl { +LinearFakeValueGenerator::LinearFakeValueGenerator(int32_t propId, float middleValue, + float currentValue, float dispersion, + float increment, int64_t interval) { + initGenCfg(propId, middleValue, currentValue, dispersion, increment, interval); +} + LinearFakeValueGenerator::LinearFakeValueGenerator(const VehiclePropValue& request) { const auto& v = request.value; + initGenCfg(v.int32Values[1], v.floatValues[0], v.floatValues[0], v.floatValues[1], + v.floatValues[2], v.int64Values[0]); +} + +void LinearFakeValueGenerator::initGenCfg(int32_t propId, float middleValue, float currentValue, + float dispersion, float increment, int64_t interval) { + if (currentValue < middleValue - dispersion || currentValue >= middleValue + dispersion) { + ALOGW("%s: invalid initValue: %f, out of range, default to %f", __func__, currentValue, + middleValue); + currentValue = middleValue; + } mGenCfg = GeneratorCfg{ - .propId = v.int32Values[1], - .initialValue = v.floatValues[0], - .currentValue = v.floatValues[0], - .dispersion = v.floatValues[1], - .increment = v.floatValues[2], - .interval = Nanos(v.int64Values[0]), + .propId = propId, + .middleValue = middleValue, + .currentValue = currentValue, + .dispersion = dispersion, + .increment = increment, + .interval = Nanos(interval), }; } VehiclePropValue LinearFakeValueGenerator::nextEvent() { - mGenCfg.currentValue += mGenCfg.increment; - if (mGenCfg.currentValue > mGenCfg.initialValue + mGenCfg.dispersion) { - mGenCfg.currentValue = mGenCfg.initialValue - mGenCfg.dispersion; - } // TODO: (chenhaosjtuacm) remove "{}" if AGL compiler updated VehiclePropValue event = {.timestamp = {}, .areaId = {}, .prop = mGenCfg.propId}; auto& value = event.value; @@ -67,6 +80,12 @@ VehiclePropValue LinearFakeValueGenerator::nextEvent() { } TimePoint eventTime = Clock::now() + mGenCfg.interval; event.timestamp = eventTime.time_since_epoch().count(); + + mGenCfg.currentValue += mGenCfg.increment; + if (mGenCfg.currentValue >= mGenCfg.middleValue + mGenCfg.dispersion) { + // Wrap around, (i - d) + c - (i + d) = c - 2 * d + mGenCfg.currentValue = mGenCfg.currentValue - 2 * mGenCfg.dispersion; + } return event; } diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/LinearFakeValueGenerator.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/LinearFakeValueGenerator.h index d3b666dd9d..d870209409 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/LinearFakeValueGenerator.h +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/LinearFakeValueGenerator.h @@ -35,8 +35,8 @@ private: struct GeneratorCfg { int32_t propId; - float initialValue; - float currentValue; // Should be in range (initialValue +/- dispersion). + float middleValue; + float currentValue; // Should be in range (middleValue +/- dispersion). float dispersion; // Defines minimum and maximum value based on initial value. float increment; // Value that we will be added to currentValue with each timer tick. Nanos interval; @@ -44,6 +44,11 @@ private: public: LinearFakeValueGenerator(const VehiclePropValue& request); + // A linear value generator in range [middleValue - dispersion, middleValue + dispersion), + // starts at 'currentValue' and at each 'interval', increase by 'increment' and loop back if + // exceeds middleValue + dispersion. + LinearFakeValueGenerator(int32_t propId, float middleValue, float currentValue, + float dispersion, float increment, int64_t interval); ~LinearFakeValueGenerator() = default; VehiclePropValue nextEvent(); @@ -52,6 +57,9 @@ public: private: GeneratorCfg mGenCfg; + + void initGenCfg(int32_t propId, float middleValue, float currentValue, float dispersion, + float increment, int64_t interval); }; } // namespace impl diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/PipeComm.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/PipeComm.cpp deleted file mode 100644 index 81e7c781c2..0000000000 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/PipeComm.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2017 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. - */ - -#define LOG_TAG "PipeComm" - -#include <android/hardware/automotive/vehicle/2.0/IVehicle.h> -#include <log/log.h> - -#include "PipeComm.h" -#include "qemu_pipe.h" - -#define CAR_SERVICE_NAME "pipe:qemud:car" - - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_0 { - -namespace impl { - -PipeComm::PipeComm(MessageProcessor* messageProcessor) : CommConn(messageProcessor), mPipeFd(-1) {} - -void PipeComm::start() { - int fd = qemu_pipe_open(CAR_SERVICE_NAME); - - if (fd < 0) { - ALOGE("%s: Could not open connection to service: %s %d", __FUNCTION__, strerror(errno), fd); - return; - } - - ALOGI("%s: Starting pipe connection, fd=%d", __FUNCTION__, fd); - mPipeFd = fd; - - CommConn::start(); -} - -void PipeComm::stop() { - if (mPipeFd > 0) { - ::close(mPipeFd); - mPipeFd = -1; - } - CommConn::stop(); -} - -std::vector<uint8_t> PipeComm::read() { - static constexpr int MAX_RX_MSG_SZ = 2048; - std::vector<uint8_t> msg = std::vector<uint8_t>(MAX_RX_MSG_SZ); - int numBytes; - - numBytes = qemu_pipe_frame_recv(mPipeFd, msg.data(), msg.size()); - - if (numBytes == MAX_RX_MSG_SZ) { - ALOGE("%s: Received max size = %d", __FUNCTION__, MAX_RX_MSG_SZ); - } else if (numBytes > 0) { - msg.resize(numBytes); - return msg; - } else { - ALOGD("%s: Connection terminated on pipe %d, numBytes=%d", __FUNCTION__, mPipeFd, numBytes); - mPipeFd = -1; - } - - return std::vector<uint8_t>(); -} - -int PipeComm::write(const std::vector<uint8_t>& data) { - int retVal = 0; - - if (mPipeFd != -1) { - retVal = qemu_pipe_frame_send(mPipeFd, data.data(), data.size()); - } - - if (retVal < 0) { - retVal = -errno; - ALOGE("%s: send_cmd: (fd=%d): ERROR: %s", __FUNCTION__, mPipeFd, strerror(errno)); - } - - return retVal; -} - - -} // impl - -} // namespace V2_0 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android - - - diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/PipeComm.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/PipeComm.h deleted file mode 100644 index c8eabb8aa7..0000000000 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/PipeComm.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2017 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. - */ - -#ifndef android_hardware_automotive_vehicle_V2_0_impl_PipeComm_H_ -#define android_hardware_automotive_vehicle_V2_0_impl_PipeComm_H_ - -#include <mutex> -#include <vector> -#include "CommConn.h" - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_0 { - -namespace impl { - -/** - * PipeComm opens a qemu pipe to connect to the emulator, allowing the emulator UI to access the - * Vehicle HAL and simulate changing properties. - * - * Since the pipe is a client, it directly implements CommConn, and only one PipeComm can be open - * at a time. - */ -class PipeComm : public CommConn { - public: - PipeComm(MessageProcessor* messageProcessor); - - void start() override; - void stop() override; - - std::vector<uint8_t> read() override; - int write(const std::vector<uint8_t>& data) override; - - inline bool isOpen() override { return mPipeFd > 0; } - - private: - int mPipeFd; -}; - -} // impl - -} // namespace V2_0 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android - - -#endif // android_hardware_automotive_vehicle_V2_0_impl_PipeComm_H_ diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/PropertyUtils.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/PropertyUtils.h index d5f6a1841e..ec43e8db5d 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/PropertyUtils.h +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/PropertyUtils.h @@ -37,6 +37,7 @@ constexpr int WINDOW_2_RIGHT = (int)VehicleAreaWindow::ROW_2_RIGHT; constexpr int WINDOW_ROOF_TOP_1 = (int)VehicleAreaWindow::ROOF_TOP_1; constexpr int FAN_DIRECTION_FACE = (int)VehicleHvacFanDirection::FACE; constexpr int FAN_DIRECTION_FLOOR = (int)VehicleHvacFanDirection::FLOOR; +constexpr int FAN_DIRECTION_DEFROST = (int)VehicleHvacFanDirection::DEFROST; constexpr int OBD2_LIVE_FRAME = (int)VehicleProperty::OBD2_LIVE_FRAME; constexpr int OBD2_FREEZE_FRAME = (int)VehicleProperty::OBD2_FREEZE_FRAME; constexpr int OBD2_FREEZE_FRAME_INFO = (int)VehicleProperty::OBD2_FREEZE_FRAME_INFO; @@ -72,35 +73,6 @@ constexpr int WHEEL_REAR_LEFT = (int)VehicleAreaWheel::LEFT_REAR; constexpr int WHEEL_REAR_RIGHT = (int)VehicleAreaWheel::RIGHT_REAR; /** - * This property is used for test purpose to generate fake events. Here is the test package that - * is referencing this property definition: packages/services/Car/tests/vehiclehal_test - */ -const int32_t kGenerateFakeDataControllingProperty = - 0x0666 | VehiclePropertyGroup::VENDOR | VehicleArea::GLOBAL | VehiclePropertyType::MIXED; - -/** - * This property is used for test purpose to set properties' value from vehicle. - * For example: Mocking hard button press triggering a HVAC fan speed change. - * Android set kSetPropertyFromVehicleForTest with an array of integer {HVAC_FAN_SPEED, value of - * fan speed} and a long value indicates the timestamp of the events . - * It only works with integer type properties. - */ -const int32_t kSetIntPropertyFromVehicleForTest = - 0x1112 | VehiclePropertyGroup::VENDOR | VehicleArea::GLOBAL | VehiclePropertyType::MIXED; -/** - * This property is used for test purpose to set properties' value from vehicle. - * It only works with float type properties. - */ -const int32_t kSetFloatPropertyFromVehicleForTest = - 0x1113 | VehiclePropertyGroup::VENDOR | VehicleArea::GLOBAL | VehiclePropertyType::MIXED; -/** - * This property is used for test purpose to set properties' value from vehicle. - * It only works with boolean type properties. - */ -const int32_t kSetBooleanPropertyFromVehicleForTest = - 0x1114 | VehiclePropertyGroup::VENDOR | VehicleArea::GLOBAL | VehiclePropertyType::MIXED; - -/** * This property is used for test purpose. End to end tests use this property to test set and get * method for MIXED type properties. */ @@ -128,67 +100,6 @@ constexpr int32_t VENDOR_CLUSTER_NAVIGATION_STATE = toVendor(VehicleProperty::CLUSTER_NAVIGATION_STATE); #endif // ENABLE_VENDOR_CLUSTER_PROPERTY_FOR_TESTING -/** - * FakeDataCommand enum defines the supported command type for kGenerateFakeDataControllingProperty. - * All those commands can be send independently with each other. And each will override the one sent - * previously. - * - * The controlling property has the following format: - * - * int32Values[0] - command enum defined in FakeDataCommand - * - * The format of the arguments is defined for each command type as below: - */ -enum class FakeDataCommand : int32_t { - /** - * Starts linear fake data generation. Caller must provide additional data: - * int32Values[1] - vehicle property to which command applies - * int64Values[0] - periodic interval in nanoseconds - * floatValues[0] - initial value - * floatValues[1] - dispersion defines the min/max value relative to initial value, where - * max = initial_value + dispersion, min = initial_value - dispersion. - * Dispersion should be non-negative, otherwise the behavior is undefined. - * floatValues[2] - increment, with every timer tick the value will be incremented by this - * amount. When reaching to max value, the current value will be set to - * min. It should be non-negative, otherwise the behavior is undefined. - */ - StartLinear = 0, - - /** Stops linear fake data generation that was triggered by StartLinear commands. - * int32Values[1] - vehicle property to which command applies. VHAL will stop the - * corresponding linear generation for that property. - */ - StopLinear = 1, - - /** - * Starts JSON-based fake data generation. It iterates through JSON-encoded VHAL events from a - * file and inject them to VHAL. The iteration can be repeated multiple times or infinitely. - * Caller must provide additional data: - * int32Values[1] - number of iterations. If it is not provided or -1. The iteration will be - * repeated infinite times. - * stringValue - path to the fake values JSON file - */ - StartJson = 2, - - /** - * Stops JSON-based fake data generation. As multiple JSON-based generation can happen at the - * same time. Caller must provide the path of fake value JSON file to stop the corresponding - * generation: - * stringValue - path to the fake values JSON file - */ - StopJson = 3, - - /** - * Injects key press event (HAL incorporates UP/DOWN acction and triggers 2 HAL events for every - * key-press). We set the enum with high number to leave space for future start/stop commands. - * Caller must provide the following data: - * int32Values[2] - Android key code - * int32Values[3] - target display (0 - for main display, 1 - for instrument cluster, see - * VehicleDisplay) - */ - KeyPress = 100, -}; - const int32_t kHvacPowerProperties[] = { toInt(VehicleProperty::HVAC_FAN_SPEED), toInt(VehicleProperty::HVAC_FAN_DIRECTION), diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/SocketComm.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/SocketComm.cpp deleted file mode 100644 index 916c320b90..0000000000 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/SocketComm.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (C) 2017 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. - */ - -#define LOG_TAG "SocketComm" - -#include <android/hardware/automotive/vehicle/2.0/IVehicle.h> -#include <android/log.h> -#include <arpa/inet.h> -#include <log/log.h> -#include <netinet/in.h> -#include <sys/socket.h> - -#include "SocketComm.h" - -// Socket to use when communicating with Host PC -static constexpr int DEBUG_SOCKET = 33452; - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_0 { - -namespace impl { - -SocketComm::SocketComm(MessageProcessor* messageProcessor) - : mListenFd(-1), mMessageProcessor(messageProcessor) {} - -SocketComm::~SocketComm() { -} - -void SocketComm::start() { - if (!listen()) { - return; - } - - mListenThread = std::make_unique<std::thread>(std::bind(&SocketComm::listenThread, this)); -} - -void SocketComm::stop() { - if (mListenFd > 0) { - ::close(mListenFd); - if (mListenThread->joinable()) { - mListenThread->join(); - } - mListenFd = -1; - } -} - -void SocketComm::sendMessage(vhal_proto::EmulatorMessage const& msg) { - std::lock_guard<std::mutex> lock(mMutex); - for (std::unique_ptr<SocketConn> const& conn : mOpenConnections) { - conn->sendMessage(msg); - } -} - -bool SocketComm::listen() { - int retVal; - struct sockaddr_in servAddr; - - mListenFd = socket(AF_INET, SOCK_STREAM, 0); - if (mListenFd < 0) { - ALOGE("%s: socket() failed, mSockFd=%d, errno=%d", __FUNCTION__, mListenFd, errno); - mListenFd = -1; - return false; - } - - memset(&servAddr, 0, sizeof(servAddr)); - servAddr.sin_family = AF_INET; - servAddr.sin_addr.s_addr = INADDR_ANY; - servAddr.sin_port = htons(DEBUG_SOCKET); - - retVal = bind(mListenFd, reinterpret_cast<struct sockaddr*>(&servAddr), sizeof(servAddr)); - if(retVal < 0) { - ALOGE("%s: Error on binding: retVal=%d, errno=%d", __FUNCTION__, retVal, errno); - close(mListenFd); - mListenFd = -1; - return false; - } - - ALOGI("%s: Listening for connections on port %d", __FUNCTION__, DEBUG_SOCKET); - if (::listen(mListenFd, 1) == -1) { - ALOGE("%s: Error on listening: errno: %d: %s", __FUNCTION__, errno, strerror(errno)); - return false; - } - return true; -} - -SocketConn* SocketComm::accept() { - sockaddr_in cliAddr; - socklen_t cliLen = sizeof(cliAddr); - int sfd = ::accept(mListenFd, reinterpret_cast<struct sockaddr*>(&cliAddr), &cliLen); - - if (sfd > 0) { - char addr[INET_ADDRSTRLEN]; - inet_ntop(AF_INET, &cliAddr.sin_addr, addr, INET_ADDRSTRLEN); - - ALOGD("%s: Incoming connection received from %s:%d", __FUNCTION__, addr, cliAddr.sin_port); - return new SocketConn(mMessageProcessor, sfd); - } - - return nullptr; -} - -void SocketComm::listenThread() { - while (true) { - SocketConn* conn = accept(); - if (conn == nullptr) { - return; - } - - conn->start(); - { - std::lock_guard<std::mutex> lock(mMutex); - mOpenConnections.push_back(std::unique_ptr<SocketConn>(conn)); - } - } -} - -/** - * Called occasionally to clean up connections that have been closed. - */ -void SocketComm::removeClosedConnections() { - std::lock_guard<std::mutex> lock(mMutex); - std::remove_if(mOpenConnections.begin(), mOpenConnections.end(), - [](std::unique_ptr<SocketConn> const& c) { return !c->isOpen(); }); -} - -SocketConn::SocketConn(MessageProcessor* messageProcessor, int sfd) - : CommConn(messageProcessor), mSockFd(sfd) {} - -/** - * Reads, in a loop, exactly numBytes from the given fd. If the connection is closed, returns - * an empty buffer, otherwise will return exactly the given number of bytes. - */ -std::vector<uint8_t> readExactly(int fd, int numBytes) { - std::vector<uint8_t> buffer(numBytes); - int totalRead = 0; - int offset = 0; - while (totalRead < numBytes) { - int numRead = ::read(fd, &buffer.data()[offset], numBytes - offset); - if (numRead == 0) { - buffer.resize(0); - return buffer; - } - - totalRead += numRead; - } - return buffer; -} - -/** - * Reads an int, guaranteed to be non-zero, from the given fd. If the connection is closed, returns - * -1. - */ -int32_t readInt(int fd) { - std::vector<uint8_t> buffer = readExactly(fd, sizeof(int32_t)); - if (buffer.size() == 0) { - return -1; - } - - int32_t value = *reinterpret_cast<int32_t*>(buffer.data()); - return ntohl(value); -} - -std::vector<uint8_t> SocketConn::read() { - int32_t msgSize = readInt(mSockFd); - if (msgSize <= 0) { - ALOGD("%s: Connection terminated on socket %d", __FUNCTION__, mSockFd); - return std::vector<uint8_t>(); - } - - return readExactly(mSockFd, msgSize); -} - -void SocketConn::stop() { - if (mSockFd > 0) { - close(mSockFd); - mSockFd = -1; - } -} - -int SocketConn::write(const std::vector<uint8_t>& data) { - static constexpr int MSG_HEADER_LEN = 4; - int retVal = 0; - union { - uint32_t msgLen; - uint8_t msgLenBytes[MSG_HEADER_LEN]; - }; - - // Prepare header for the message - msgLen = static_cast<uint32_t>(data.size()); - msgLen = htonl(msgLen); - - if (mSockFd > 0) { - retVal = ::write(mSockFd, msgLenBytes, MSG_HEADER_LEN); - - if (retVal == MSG_HEADER_LEN) { - retVal = ::write(mSockFd, data.data(), data.size()); - } - } - - return retVal; -} - -} // impl - -} // namespace V2_0 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android - diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/SocketComm.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/SocketComm.h deleted file mode 100644 index 52326b9fc7..0000000000 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/SocketComm.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2017 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. - */ - -#ifndef android_hardware_automotive_vehicle_V2_0_impl_SocketComm_H_ -#define android_hardware_automotive_vehicle_V2_0_impl_SocketComm_H_ - -#include <mutex> -#include <thread> -#include <vector> -#include "CommConn.h" - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_0 { - -namespace impl { - -class SocketConn; - -/** - * SocketComm opens a socket, and listens for connections from clients. Typically the client will be - * adb's TCP port-forwarding to enable a host PC to connect to the VehicleHAL. - */ -class SocketComm { - public: - SocketComm(MessageProcessor* messageProcessor); - virtual ~SocketComm(); - - void start(); - void stop(); - - /** - * Serialized and send the given message to all connected clients. - */ - void sendMessage(vhal_proto::EmulatorMessage const& msg); - - private: - int mListenFd; - std::unique_ptr<std::thread> mListenThread; - std::vector<std::unique_ptr<SocketConn>> mOpenConnections; - MessageProcessor* mMessageProcessor; - std::mutex mMutex; - - /** - * Opens the socket and begins listening. - * - * @return bool Returns true on success. - */ - bool listen(); - - /** - * Blocks and waits for a connection from a client, returns a new SocketConn with the connection - * or null, if the connection has been closed. - * - * @return int Returns fd or socket number if connection is successful. - * Otherwise, returns -1 if no connection is availble. - */ - SocketConn* accept(); - - void listenThread(); - - void removeClosedConnections(); -}; - -/** - * SocketConn represents a single connection to a client. - */ -class SocketConn : public CommConn { - public: - SocketConn(MessageProcessor* messageProcessor, int sfd); - virtual ~SocketConn() = default; - - /** - * Blocking call to read data from the connection. - * - * @return std::vector<uint8_t> Serialized protobuf data received from emulator. This will be - * an empty vector if the connection was closed or some other error occurred. - */ - std::vector<uint8_t> read() override; - - /** - * Closes a connection if it is open. - */ - void stop() override; - - /** - * Transmits a string of data to the emulator. - * - * @param data Serialized protobuf data to transmit. - * - * @return int Number of bytes transmitted, or -1 if failed. - */ - int write(const std::vector<uint8_t>& data) override; - - inline bool isOpen() override { return mSockFd > 0; } - - private: - int mSockFd; -}; - -} // impl - -} // namespace V2_0 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android - - -#endif // android_hardware_automotive_vehicle_V2_0_impl_SocketComm_H_ diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleEmulator.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleEmulator.cpp deleted file mode 100644 index f7d0854d1c..0000000000 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleEmulator.cpp +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (C) 2017 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. - */ -#define LOG_TAG "VehicleEmulator_v2_0" -#include <android/log.h> - -#include <android-base/properties.h> -#include <log/log.h> -#include <utils/SystemClock.h> -#include <algorithm> - -#include <vhal_v2_0/VehicleUtils.h> - -#include "PipeComm.h" -#include "ProtoMessageConverter.h" -#include "SocketComm.h" - -#include "VehicleEmulator.h" - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_0 { - -namespace impl { - -VehicleEmulator::VehicleEmulator(EmulatedVehicleHalIface* hal) : mHal{hal} { - mHal->registerEmulator(this); - - ALOGI("Starting SocketComm"); - mSocketComm = std::make_unique<SocketComm>(this); - mSocketComm->start(); - - if (isInEmulator()) { - ALOGI("Starting PipeComm"); - mPipeComm = std::make_unique<PipeComm>(this); - mPipeComm->start(); - } -} - -VehicleEmulator::~VehicleEmulator() { - mSocketComm->stop(); - if (mPipeComm) { - mPipeComm->stop(); - } -} - -/** - * This is called by the HAL when a property changes. We need to notify our clients that it has - * changed. - */ -void VehicleEmulator::doSetValueFromClient(const VehiclePropValue& propValue) { - vhal_proto::EmulatorMessage msg; - vhal_proto::VehiclePropValue* val = msg.add_value(); - populateProtoVehiclePropValue(val, &propValue); - msg.set_status(vhal_proto::RESULT_OK); - msg.set_msg_type(vhal_proto::SET_PROPERTY_ASYNC); - - mSocketComm->sendMessage(msg); - if (mPipeComm) { - mPipeComm->sendMessage(msg); - } -} - -void VehicleEmulator::doGetConfig(VehicleEmulator::EmulatorMessage const& rxMsg, - VehicleEmulator::EmulatorMessage& respMsg) { - std::vector<VehiclePropConfig> configs = mHal->listProperties(); - vhal_proto::VehiclePropGet getProp = rxMsg.prop(0); - - respMsg.set_msg_type(vhal_proto::GET_CONFIG_RESP); - respMsg.set_status(vhal_proto::ERROR_INVALID_PROPERTY); - - for (auto& config : configs) { - // Find the config we are looking for - if (config.prop == getProp.prop()) { - vhal_proto::VehiclePropConfig* protoCfg = respMsg.add_config(); - populateProtoVehicleConfig(protoCfg, config); - respMsg.set_status(vhal_proto::RESULT_OK); - break; - } - } -} - -void VehicleEmulator::doGetConfigAll(VehicleEmulator::EmulatorMessage const& /* rxMsg */, - VehicleEmulator::EmulatorMessage& respMsg) { - std::vector<VehiclePropConfig> configs = mHal->listProperties(); - - respMsg.set_msg_type(vhal_proto::GET_CONFIG_ALL_RESP); - respMsg.set_status(vhal_proto::RESULT_OK); - - for (auto& config : configs) { - vhal_proto::VehiclePropConfig* protoCfg = respMsg.add_config(); - populateProtoVehicleConfig(protoCfg, config); - } -} - -void VehicleEmulator::doGetProperty(VehicleEmulator::EmulatorMessage const& rxMsg, - VehicleEmulator::EmulatorMessage& respMsg) { - int32_t areaId = 0; - vhal_proto::VehiclePropGet getProp = rxMsg.prop(0); - int32_t propId = getProp.prop(); - vhal_proto::Status status = vhal_proto::ERROR_INVALID_PROPERTY; - - respMsg.set_msg_type(vhal_proto::GET_PROPERTY_RESP); - - if (getProp.has_area_id()) { - areaId = getProp.area_id(); - } - - { - VehiclePropValue request = { - .areaId = areaId, - .prop = propId, - }; - StatusCode halStatus; - auto val = mHal->get(request, &halStatus); - if (val != nullptr) { - vhal_proto::VehiclePropValue* protoVal = respMsg.add_value(); - populateProtoVehiclePropValue(protoVal, val.get()); - status = vhal_proto::RESULT_OK; - } - } - - respMsg.set_status(status); -} - -void VehicleEmulator::doGetPropertyAll(VehicleEmulator::EmulatorMessage const& /* rxMsg */, - VehicleEmulator::EmulatorMessage& respMsg) { - respMsg.set_msg_type(vhal_proto::GET_PROPERTY_ALL_RESP); - respMsg.set_status(vhal_proto::RESULT_OK); - - { - for (const auto& prop : mHal->getAllProperties()) { - vhal_proto::VehiclePropValue* protoVal = respMsg.add_value(); - populateProtoVehiclePropValue(protoVal, &prop); - } - } -} - -void VehicleEmulator::doSetProperty(VehicleEmulator::EmulatorMessage const& rxMsg, - VehicleEmulator::EmulatorMessage& respMsg) { - vhal_proto::VehiclePropValue protoVal = rxMsg.value(0); - VehiclePropValue val = { - .timestamp = elapsedRealtimeNano(), - .areaId = protoVal.area_id(), - .prop = protoVal.prop(), - .status = (VehiclePropertyStatus)protoVal.status(), - }; - - respMsg.set_msg_type(vhal_proto::SET_PROPERTY_RESP); - - // Copy value data if it is set. This automatically handles complex data types if needed. - if (protoVal.has_string_value()) { - val.value.stringValue = protoVal.string_value().c_str(); - } - - if (protoVal.has_bytes_value()) { - val.value.bytes = std::vector<uint8_t> { protoVal.bytes_value().begin(), - protoVal.bytes_value().end() }; - } - - if (protoVal.int32_values_size() > 0) { - val.value.int32Values = std::vector<int32_t> { protoVal.int32_values().begin(), - protoVal.int32_values().end() }; - } - - if (protoVal.int64_values_size() > 0) { - val.value.int64Values = std::vector<int64_t> { protoVal.int64_values().begin(), - protoVal.int64_values().end() }; - } - - if (protoVal.float_values_size() > 0) { - val.value.floatValues = std::vector<float> { protoVal.float_values().begin(), - protoVal.float_values().end() }; - } - - bool halRes = mHal->setPropertyFromVehicle(val); - respMsg.set_status(halRes ? vhal_proto::RESULT_OK : vhal_proto::ERROR_INVALID_PROPERTY); -} - -void VehicleEmulator::processMessage(vhal_proto::EmulatorMessage const& rxMsg, - vhal_proto::EmulatorMessage& respMsg) { - switch (rxMsg.msg_type()) { - case vhal_proto::GET_CONFIG_CMD: - doGetConfig(rxMsg, respMsg); - break; - case vhal_proto::GET_CONFIG_ALL_CMD: - doGetConfigAll(rxMsg, respMsg); - break; - case vhal_proto::GET_PROPERTY_CMD: - doGetProperty(rxMsg, respMsg); - break; - case vhal_proto::GET_PROPERTY_ALL_CMD: - doGetPropertyAll(rxMsg, respMsg); - break; - case vhal_proto::SET_PROPERTY_CMD: - doSetProperty(rxMsg, respMsg); - break; - default: - ALOGW("%s: Unknown message received, type = %d", __func__, rxMsg.msg_type()); - respMsg.set_status(vhal_proto::ERROR_UNIMPLEMENTED_CMD); - break; - } -} - -void VehicleEmulator::populateProtoVehicleConfig(vhal_proto::VehiclePropConfig* protoCfg, - const VehiclePropConfig& cfg) { - return proto_msg_converter::toProto(protoCfg, cfg); -} - -void VehicleEmulator::populateProtoVehiclePropValue(vhal_proto::VehiclePropValue* protoVal, - const VehiclePropValue* val) { - return proto_msg_converter::toProto(protoVal, *val); -} - -bool isInEmulator() { - return android::base::GetBoolProperty("ro.boot.qemu", false); -} - -} // impl - -} // namespace V2_0 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleEmulator.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleEmulator.h deleted file mode 100644 index 434d79b542..0000000000 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleEmulator.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2017 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. - */ - -#ifndef android_hardware_automotive_vehicle_V2_0_impl_VehicleHalEmulator_H_ -#define android_hardware_automotive_vehicle_V2_0_impl_VehicleHalEmulator_H_ - -#include <log/log.h> -#include <memory> -#include <thread> -#include <vector> - -#include "vhal_v2_0/VehicleHal.h" - -#include "CommConn.h" -#include "PipeComm.h" -#include "SocketComm.h" -#include "VehicleHalProto.pb.h" - -namespace android { -namespace hardware { -namespace automotive { -namespace vehicle { -namespace V2_0 { - -namespace impl { - -class VehicleEmulator; // Forward declaration. - -/** Extension of VehicleHal that used by VehicleEmulator. */ -class EmulatedVehicleHalIface : public VehicleHal { -public: - virtual bool setPropertyFromVehicle(const VehiclePropValue& propValue) = 0; - virtual std::vector<VehiclePropValue> getAllProperties() const = 0; - - void registerEmulator(VehicleEmulator* emulator) { - ALOGI("%s, emulator: %p", __func__, emulator); - std::lock_guard<std::mutex> g(mEmulatorLock); - mEmulator = emulator; - } - -protected: - VehicleEmulator* getEmulatorOrDie() { - std::lock_guard<std::mutex> g(mEmulatorLock); - if (mEmulator == nullptr) abort(); - return mEmulator; - } - -private: - mutable std::mutex mEmulatorLock; - VehicleEmulator* mEmulator; -}; - -/** - * Emulates vehicle by providing controlling interface from host side either through ADB or Pipe. - */ -class VehicleEmulator : public MessageProcessor { - public: - VehicleEmulator(EmulatedVehicleHalIface* hal); - virtual ~VehicleEmulator(); - - void doSetValueFromClient(const VehiclePropValue& propValue); - void processMessage(vhal_proto::EmulatorMessage const& rxMsg, - vhal_proto::EmulatorMessage& respMsg) override; - - private: - friend class ConnectionThread; - using EmulatorMessage = vhal_proto::EmulatorMessage; - - void doGetConfig(EmulatorMessage const& rxMsg, EmulatorMessage& respMsg); - void doGetConfigAll(EmulatorMessage const& rxMsg, EmulatorMessage& respMsg); - void doGetProperty(EmulatorMessage const& rxMsg, EmulatorMessage& respMsg); - void doGetPropertyAll(EmulatorMessage const& rxMsg, EmulatorMessage& respMsg); - void doSetProperty(EmulatorMessage const& rxMsg, EmulatorMessage& respMsg); - void populateProtoVehicleConfig(vhal_proto::VehiclePropConfig* protoCfg, - const VehiclePropConfig& cfg); - void populateProtoVehiclePropValue(vhal_proto::VehiclePropValue* protoVal, - const VehiclePropValue* val); - -private: - EmulatedVehicleHalIface* mHal; - std::unique_ptr<SocketComm> mSocketComm; - std::unique_ptr<PipeComm> mPipeComm; -}; - -// determine if it's running inside Android Emulator -bool isInEmulator(); - -} // impl - -} // namespace V2_0 -} // namespace vehicle -} // namespace automotive -} // namespace hardware -} // namespace android - -#endif // android_hardware_automotive_vehicle_V2_0_impl_VehicleHalEmulator_H_ diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalClient.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalClient.cpp index 25ffc6d70d..bafd170dcc 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalClient.cpp +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalClient.cpp @@ -18,7 +18,13 @@ #include <android-base/logging.h> -namespace android::hardware::automotive::vehicle::V2_0::impl { +namespace android { +namespace hardware { +namespace automotive { +namespace vehicle { +namespace V2_0 { + +namespace impl { void VehicleHalClient::onPropertyValue(const VehiclePropValue& value, bool updateStatus) { if (!mPropCallback) { @@ -36,4 +42,10 @@ void VehicleHalClient::registerPropertyValueCallback(PropertyCallBackType&& call mPropCallback = std::move(callback); } -} // namespace android::hardware::automotive::vehicle::V2_0::impl +} // namespace impl + +} // namespace V2_0 +} // namespace vehicle +} // namespace automotive +} // namespace hardware +} // namespace android diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalClient.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalClient.h index 81dfca1b06..2473f194c5 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalClient.h +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalClient.h @@ -18,7 +18,13 @@ #include <vhal_v2_0/VehicleClient.h> -namespace android::hardware::automotive::vehicle::V2_0::impl { +namespace android { +namespace hardware { +namespace automotive { +namespace vehicle { +namespace V2_0 { + +namespace impl { // The common client operations that may be used by both native and // virtualized VHAL clients. @@ -40,4 +46,10 @@ class VehicleHalClient : public IVehicleClient { PropertyCallBackType mPropCallback; }; -} // namespace android::hardware::automotive::vehicle::V2_0::impl +} // namespace impl + +} // namespace V2_0 +} // namespace vehicle +} // namespace automotive +} // namespace hardware +} // namespace android diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalServer.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalServer.cpp deleted file mode 100644 index 57dd7d4215..0000000000 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalServer.cpp +++ /dev/null @@ -1,340 +0,0 @@ -/* - * 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. - */ - -#define LOG_TAG "VehicleHalServer" - -#include "VehicleHalServer.h" - -#include <fstream> - -#include <android-base/logging.h> -#include <utils/SystemClock.h> - -#include "DefaultConfig.h" -#include "JsonFakeValueGenerator.h" -#include "LinearFakeValueGenerator.h" -#include "Obd2SensorStore.h" - -namespace android::hardware::automotive::vehicle::V2_0::impl { - -static bool isDiagnosticProperty(VehiclePropConfig propConfig) { - switch (propConfig.prop) { - case OBD2_LIVE_FRAME: - case OBD2_FREEZE_FRAME: - case OBD2_FREEZE_FRAME_CLEAR: - case OBD2_FREEZE_FRAME_INFO: - return true; - } - return false; -} - -VehicleHalServer::VehicleHalServer() { - constexpr bool shouldUpdateStatus = true; - - for (auto& it : kVehicleProperties) { - VehiclePropConfig cfg = it.config; - - mServerSidePropStore.registerProperty(cfg); - - if (isDiagnosticProperty(cfg)) { - continue; - } - - // A global property will have only a single area - int32_t numAreas = isGlobalProp(cfg.prop) ? 1 : cfg.areaConfigs.size(); - - for (int i = 0; i < numAreas; i++) { - int32_t curArea = isGlobalProp(cfg.prop) ? 0 : cfg.areaConfigs[i].areaId; - - // Create a separate instance for each individual zone - VehiclePropValue prop = { - .areaId = curArea, - .prop = cfg.prop, - }; - - if (it.initialAreaValues.empty()) { - prop.value = it.initialValue; - } else if (auto valueForAreaIt = it.initialAreaValues.find(curArea); - valueForAreaIt != it.initialAreaValues.end()) { - prop.value = valueForAreaIt->second; - } else { - LOG(WARNING) << __func__ << " failed to get default value for" - << " prop 0x" << std::hex << cfg.prop << " area 0x" << std::hex - << curArea; - prop.status = VehiclePropertyStatus::UNAVAILABLE; - } - - mServerSidePropStore.writeValue(prop, shouldUpdateStatus); - } - } -} - -void VehicleHalServer::sendAllValuesToClient() { - constexpr bool update_status = true; - auto values = mServerSidePropStore.readAllValues(); - for (const auto& value : values) { - onPropertyValueFromCar(value, update_status); - } -} - -GeneratorHub* VehicleHalServer::getGenerator() { - return &mGeneratorHub; -} - -VehiclePropValuePool* VehicleHalServer::getValuePool() const { - if (!mValuePool) { - LOG(WARNING) << __func__ << ": Value pool not set!"; - } - return mValuePool; -} - -void VehicleHalServer::setValuePool(VehiclePropValuePool* valuePool) { - if (!valuePool) { - LOG(WARNING) << __func__ << ": Setting value pool to nullptr!"; - } - mValuePool = valuePool; -} - -void VehicleHalServer::onFakeValueGenerated(const VehiclePropValue& value) { - constexpr bool updateStatus = true; - LOG(DEBUG) << __func__ << ": " << toString(value); - auto updatedPropValue = getValuePool()->obtain(value); - if (updatedPropValue) { - updatedPropValue->timestamp = value.timestamp; - updatedPropValue->status = VehiclePropertyStatus::AVAILABLE; - mServerSidePropStore.writeValue(*updatedPropValue, updateStatus); - onPropertyValueFromCar(*updatedPropValue, updateStatus); - } -} - -std::vector<VehiclePropConfig> VehicleHalServer::onGetAllPropertyConfig() const { - return mServerSidePropStore.getAllConfigs(); -} - -StatusCode VehicleHalServer::handleGenerateFakeDataRequest(const VehiclePropValue& request) { - constexpr bool updateStatus = true; - - LOG(INFO) << __func__; - const auto& v = request.value; - if (!v.int32Values.size()) { - LOG(ERROR) << __func__ << ": expected at least \"command\" field in int32Values"; - return StatusCode::INVALID_ARG; - } - - FakeDataCommand command = static_cast<FakeDataCommand>(v.int32Values[0]); - - switch (command) { - case FakeDataCommand::StartLinear: { - LOG(INFO) << __func__ << ", FakeDataCommand::StartLinear"; - if (v.int32Values.size() < 2) { - LOG(ERROR) << __func__ << ": expected property ID in int32Values"; - return StatusCode::INVALID_ARG; - } - if (!v.int64Values.size()) { - LOG(ERROR) << __func__ << ": interval is not provided in int64Values"; - return StatusCode::INVALID_ARG; - } - if (v.floatValues.size() < 3) { - LOG(ERROR) << __func__ << ": expected at least 3 elements in floatValues, got: " - << v.floatValues.size(); - return StatusCode::INVALID_ARG; - } - int32_t cookie = v.int32Values[1]; - getGenerator()->registerGenerator(cookie, - std::make_unique<LinearFakeValueGenerator>(request)); - break; - } - case FakeDataCommand::StartJson: { - LOG(INFO) << __func__ << ", FakeDataCommand::StartJson"; - if (v.stringValue.empty()) { - LOG(ERROR) << __func__ << ": path to JSON file is missing"; - return StatusCode::INVALID_ARG; - } - int32_t cookie = std::hash<std::string>()(v.stringValue); - getGenerator()->registerGenerator(cookie, - std::make_unique<JsonFakeValueGenerator>(request)); - break; - } - case FakeDataCommand::StopLinear: { - LOG(INFO) << __func__ << ", FakeDataCommand::StopLinear"; - if (v.int32Values.size() < 2) { - LOG(ERROR) << __func__ << ": expected property ID in int32Values"; - return StatusCode::INVALID_ARG; - } - int32_t cookie = v.int32Values[1]; - getGenerator()->unregisterGenerator(cookie); - break; - } - case FakeDataCommand::StopJson: { - LOG(INFO) << __func__ << ", FakeDataCommand::StopJson"; - if (v.stringValue.empty()) { - LOG(ERROR) << __func__ << ": path to JSON file is missing"; - return StatusCode::INVALID_ARG; - } - int32_t cookie = std::hash<std::string>()(v.stringValue); - getGenerator()->unregisterGenerator(cookie); - break; - } - case FakeDataCommand::KeyPress: { - LOG(INFO) << __func__ << ", FakeDataCommand::KeyPress"; - int32_t keyCode = request.value.int32Values[2]; - int32_t display = request.value.int32Values[3]; - // Send back to HAL - onPropertyValueFromCar( - *createHwInputKeyProp(VehicleHwKeyInputAction::ACTION_DOWN, keyCode, display), - updateStatus); - onPropertyValueFromCar( - *createHwInputKeyProp(VehicleHwKeyInputAction::ACTION_UP, keyCode, display), - updateStatus); - break; - } - default: { - LOG(ERROR) << __func__ << ": unexpected command: " << toInt(command); - return StatusCode::INVALID_ARG; - } - } - return StatusCode::OK; -} - -VehicleHalServer::VehiclePropValuePtr VehicleHalServer::createApPowerStateReq( - VehicleApPowerStateReq state, int32_t param) { - auto req = getValuePool()->obtain(VehiclePropertyType::INT32_VEC, 2); - req->prop = toInt(VehicleProperty::AP_POWER_STATE_REQ); - req->areaId = 0; - req->timestamp = elapsedRealtimeNano(); - req->status = VehiclePropertyStatus::AVAILABLE; - req->value.int32Values[0] = toInt(state); - req->value.int32Values[1] = param; - return req; -} - -VehicleHalServer::VehiclePropValuePtr VehicleHalServer::createHwInputKeyProp( - VehicleHwKeyInputAction action, int32_t keyCode, int32_t targetDisplay) { - auto keyEvent = getValuePool()->obtain(VehiclePropertyType::INT32_VEC, 3); - keyEvent->prop = toInt(VehicleProperty::HW_KEY_INPUT); - keyEvent->areaId = 0; - keyEvent->timestamp = elapsedRealtimeNano(); - keyEvent->status = VehiclePropertyStatus::AVAILABLE; - keyEvent->value.int32Values[0] = toInt(action); - keyEvent->value.int32Values[1] = keyCode; - keyEvent->value.int32Values[2] = targetDisplay; - return keyEvent; -} - -StatusCode VehicleHalServer::onSetProperty(const VehiclePropValue& value, bool updateStatus) { - LOG(DEBUG) << "onSetProperty(" << value.prop << ")"; - - // Some properties need to be treated non-trivially - switch (value.prop) { - case kGenerateFakeDataControllingProperty: - return handleGenerateFakeDataRequest(value); - - // set the value from vehicle side, used in end to end test. - case kSetIntPropertyFromVehicleForTest: { - auto updatedPropValue = createVehiclePropValue(VehiclePropertyType::INT32, 1); - updatedPropValue->prop = value.value.int32Values[0]; - updatedPropValue->value.int32Values[0] = value.value.int32Values[1]; - updatedPropValue->timestamp = value.value.int64Values[0]; - updatedPropValue->areaId = value.areaId; - onPropertyValueFromCar(*updatedPropValue, updateStatus); - return StatusCode::OK; - } - case kSetFloatPropertyFromVehicleForTest: { - auto updatedPropValue = createVehiclePropValue(VehiclePropertyType::FLOAT, 1); - updatedPropValue->prop = value.value.int32Values[0]; - updatedPropValue->value.floatValues[0] = value.value.floatValues[0]; - updatedPropValue->timestamp = value.value.int64Values[0]; - updatedPropValue->areaId = value.areaId; - onPropertyValueFromCar(*updatedPropValue, updateStatus); - return StatusCode::OK; - } - case kSetBooleanPropertyFromVehicleForTest: { - auto updatedPropValue = createVehiclePropValue(VehiclePropertyType::BOOLEAN, 1); - updatedPropValue->prop = value.value.int32Values[1]; - updatedPropValue->value.int32Values[0] = value.value.int32Values[0]; - updatedPropValue->timestamp = value.value.int64Values[0]; - updatedPropValue->areaId = value.areaId; - onPropertyValueFromCar(*updatedPropValue, updateStatus); - return StatusCode::OK; - } - - case AP_POWER_STATE_REPORT: - switch (value.value.int32Values[0]) { - case toInt(VehicleApPowerStateReport::DEEP_SLEEP_EXIT): - case toInt(VehicleApPowerStateReport::SHUTDOWN_CANCELLED): - case toInt(VehicleApPowerStateReport::WAIT_FOR_VHAL): - // CPMS is in WAIT_FOR_VHAL state, simply move to ON - // Send back to HAL - // ALWAYS update status for generated property value - onPropertyValueFromCar(*createApPowerStateReq(VehicleApPowerStateReq::ON, 0), - true /* updateStatus */); - break; - case toInt(VehicleApPowerStateReport::DEEP_SLEEP_ENTRY): - case toInt(VehicleApPowerStateReport::SHUTDOWN_START): - // CPMS is in WAIT_FOR_FINISH state, send the FINISHED command - // Send back to HAL - // ALWAYS update status for generated property value - onPropertyValueFromCar( - *createApPowerStateReq(VehicleApPowerStateReq::FINISHED, 0), - true /* updateStatus */); - break; - case toInt(VehicleApPowerStateReport::ON): - case toInt(VehicleApPowerStateReport::SHUTDOWN_POSTPONE): - case toInt(VehicleApPowerStateReport::SHUTDOWN_PREPARE): - // Do nothing - break; - default: - // Unknown state - break; - } - break; - -#ifdef ENABLE_VENDOR_CLUSTER_PROPERTY_FOR_TESTING - case toInt(VehicleProperty::CLUSTER_REPORT_STATE): - case toInt(VehicleProperty::CLUSTER_REQUEST_DISPLAY): - case toInt(VehicleProperty::CLUSTER_NAVIGATION_STATE): - case VENDOR_CLUSTER_SWITCH_UI: - case VENDOR_CLUSTER_DISPLAY_STATE: { - auto updatedPropValue = createVehiclePropValue(getPropType(value.prop), 0); - updatedPropValue->prop = value.prop & ~toInt(VehiclePropertyGroup::MASK); - if (isSystemProperty(value.prop)) { - updatedPropValue->prop |= toInt(VehiclePropertyGroup::VENDOR); - } else { - updatedPropValue->prop |= toInt(VehiclePropertyGroup::SYSTEM); - } - updatedPropValue->value = value.value; - updatedPropValue->timestamp = elapsedRealtimeNano(); - updatedPropValue->areaId = value.areaId; - onPropertyValueFromCar(*updatedPropValue, updateStatus); - return StatusCode::OK; - } -#endif // ENABLE_VENDOR_CLUSTER_PROPERTY_FOR_TESTING - - default: - break; - } - - // In the real vhal, the value will be sent to Car ECU. - // We just pretend it is done here and send back to HAL - auto updatedPropValue = getValuePool()->obtain(value); - updatedPropValue->timestamp = elapsedRealtimeNano(); - - mServerSidePropStore.writeValue(*updatedPropValue, updateStatus); - onPropertyValueFromCar(*updatedPropValue, updateStatus); - return StatusCode::OK; -} - -} // namespace android::hardware::automotive::vehicle::V2_0::impl diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalServer.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalServer.h index be88cd94cd..1290f30a9e 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalServer.h +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/VehicleHalServer.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020 The Android Open Source Project + * Copyright (C) 2021 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. @@ -14,56 +14,32 @@ * limitations under the License. */ +// This file is just used for soft migration from VehicleHalServer to DefaultVehicleHalServer. +// The virtualized VHAL that uses VehichleHalServer is at a different repo and cannot be updated +// together with this repo, so we need a soft migration. Once the rename is finished at the +// virtualized VHAL side, this file would be removed. + #pragma once -#include <vhal_v2_0/VehicleObjectPool.h> -#include <vhal_v2_0/VehiclePropertyStore.h> -#include <vhal_v2_0/VehicleServer.h> +#include "DefaultVehicleHalServer.h" -#include "GeneratorHub.h" +namespace android { +namespace hardware { +namespace automotive { +namespace vehicle { +namespace V2_0 { -namespace android::hardware::automotive::vehicle::V2_0::impl { +namespace impl { -// This contains the common server operations that will be used by -// both native and virtualized VHAL server. Notice that in the virtualized -// scenario, the server may be run on a different OS than Android. -class VehicleHalServer : public IVehicleServer { +class VehicleHalServer : public DefaultVehicleHalServer { public: - VehicleHalServer(); - - void sendAllValuesToClient(); - - // Methods from IVehicleServer - - std::vector<VehiclePropConfig> onGetAllPropertyConfig() const override; - - StatusCode onSetProperty(const VehiclePropValue& value, bool updateStatus) override; - - // Set the Property Value Pool used in this server - void setValuePool(VehiclePropValuePool* valuePool); - - private: - using VehiclePropValuePtr = recyclable_ptr<VehiclePropValue>; - - GeneratorHub* getGenerator(); - - VehiclePropValuePool* getValuePool() const; - - void onFakeValueGenerated(const VehiclePropValue& value); - - StatusCode handleGenerateFakeDataRequest(const VehiclePropValue& request); - - VehiclePropValuePtr createApPowerStateReq(VehicleApPowerStateReq req, int32_t param); - - VehiclePropValuePtr createHwInputKeyProp(VehicleHwKeyInputAction action, int32_t keyCode, - int32_t targetDisplay); - - private: - GeneratorHub mGeneratorHub{ - std::bind(&VehicleHalServer::onFakeValueGenerated, this, std::placeholders::_1)}; - - VehiclePropValuePool* mValuePool{nullptr}; - VehiclePropertyStore mServerSidePropStore; + VehicleHalServer() : DefaultVehicleHalServer(){}; }; -} // namespace android::hardware::automotive::vehicle::V2_0::impl +} // namespace impl + +} // namespace V2_0 +} // namespace vehicle +} // namespace automotive +} // namespace hardware +} // namespace android diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/Android.bp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/Android.bp index 6e85ae96ee..3307bd62a3 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/Android.bp +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/Android.bp @@ -24,6 +24,10 @@ package { cc_library_static { name: "android.hardware.automotive.vehicle@2.0-libproto-native", + visibility: [ + "//hardware/interfaces/automotive/vehicle/2.0/default:__subpackages__", + "//device/generic/car/emulator/vhal_v2_0:__subpackages__", + ], vendor: true, host_supported: true, proto: { diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/VehicleHalProto.proto b/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/VehicleHalProto.proto index 4902a5d8fb..58daca619c 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/VehicleHalProto.proto +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/proto/VehicleHalProto.proto @@ -32,6 +32,8 @@ enum MsgType { SET_PROPERTY_CMD = 8; SET_PROPERTY_RESP = 9; SET_PROPERTY_ASYNC = 10; + DEBUG_CMD = 11; + DEBUG_RESP = 12; } enum Status { RESULT_OK = 0; @@ -98,9 +100,11 @@ message VehiclePropGet { }; message EmulatorMessage { - required MsgType msg_type = 1; - optional Status status = 2; // Only for RESP messages - repeated VehiclePropGet prop = 3; // Provided for getConfig, getProperty commands - repeated VehiclePropConfig config = 4; - repeated VehiclePropValue value = 5; + required MsgType msg_type = 1; + optional Status status = 2; // Only for RESP messages + repeated VehiclePropGet prop = 3; // Provided for getConfig, getProperty commands + repeated VehiclePropConfig config = 4; + repeated VehiclePropValue value = 5; + repeated string debug_commands = 6; // Required for debug command + optional string debug_result = 7; // Required for debug RESP messages }; diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/qemu_pipe.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/qemu_pipe.cpp deleted file mode 100644 index cf1a002479..0000000000 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/qemu_pipe.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2011 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 "qemu_pipe.h" - -#include <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -#include <android-base/file.h> - -using android::base::ReadFully; -using android::base::WriteFully; - -// Define QEMU_PIPE_DEBUG if you want to print error messages when an error -// occurs during pipe operations. The macro should simply take a printf-style -// formatting string followed by optional arguments. -#ifndef QEMU_PIPE_DEBUG -#define QEMU_PIPE_DEBUG(...) (void)0 -#endif - -int qemu_pipe_open(const char* pipeName) { - if (!pipeName) { - errno = EINVAL; - return -1; - } - - int fd = TEMP_FAILURE_RETRY(open("/dev/qemu_pipe", O_RDWR)); - if (fd < 0) { - QEMU_PIPE_DEBUG("%s: Could not open /dev/qemu_pipe: %s", __FUNCTION__, strerror(errno)); - return -1; - } - - // Write the pipe name, *including* the trailing zero which is necessary. - size_t pipeNameLen = strlen(pipeName); - if (WriteFully(fd, pipeName, pipeNameLen + 1U)) { - return fd; - } - - // now, add 'pipe:' prefix and try again - // Note: host side will wait for the trailing '\0' to start - // service lookup. - const char pipe_prefix[] = "pipe:"; - if (WriteFully(fd, pipe_prefix, strlen(pipe_prefix)) && - WriteFully(fd, pipeName, pipeNameLen + 1U)) { - return fd; - } - QEMU_PIPE_DEBUG("%s: Could not write to %s pipe service: %s", __FUNCTION__, pipeName, - strerror(errno)); - close(fd); - return -1; -} - -int qemu_pipe_frame_send(int fd, const void* buff, size_t len) { - char header[5]; - snprintf(header, sizeof(header), "%04zx", len); - if (!WriteFully(fd, header, 4)) { - QEMU_PIPE_DEBUG("Can't write qemud frame header: %s", strerror(errno)); - return -1; - } - if (!WriteFully(fd, buff, len)) { - QEMU_PIPE_DEBUG("Can't write qemud frame payload: %s", strerror(errno)); - return -1; - } - return 0; -} - -int qemu_pipe_frame_recv(int fd, void* buff, size_t len) { - char header[5]; - if (!ReadFully(fd, header, 4)) { - QEMU_PIPE_DEBUG("Can't read qemud frame header: %s", strerror(errno)); - return -1; - } - header[4] = '\0'; - size_t size; - if (sscanf(header, "%04zx", &size) != 1) { - QEMU_PIPE_DEBUG("Malformed qemud frame header: [%.*s]", 4, header); - return -1; - } - if (size > len) { - QEMU_PIPE_DEBUG("Oversized qemud frame (% bytes, expected <= %)", size, len); - return -1; - } - if (!ReadFully(fd, buff, size)) { - QEMU_PIPE_DEBUG("Could not read qemud frame payload: %s", strerror(errno)); - return -1; - } - return size; -} diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/qemu_pipe.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/qemu_pipe.h deleted file mode 100644 index 0987498990..0000000000 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/qemu_pipe.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2011 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. - */ -#ifndef ANDROID_CORE_INCLUDE_QEMU_PIPE_H -#define ANDROID_CORE_INCLUDE_QEMU_PIPE_H - -#include <stddef.h> - -#ifdef __cplusplus -extern "C" { -#endif -// Try to open a new Qemu fast-pipe. This function returns a file descriptor -// that can be used to communicate with a named service managed by the -// emulator. -// -// This file descriptor can be used as a standard pipe/socket descriptor. -// -// 'pipeName' is the name of the emulator service you want to connect to, -// and should begin with 'pipe:' (e.g. 'pipe:camera' or 'pipe:opengles'). -// For backward compatibility, the 'pipe:' prefix can be omitted, and in -// that case, qemu_pipe_open will add it for you. - -// On success, return a valid file descriptor, or -1/errno on failure. E.g.: -// -// EINVAL -> unknown/unsupported pipeName -// ENOSYS -> fast pipes not available in this system. -// -// ENOSYS should never happen, except if you're trying to run within a -// misconfigured emulator. -// -// You should be able to open several pipes to the same pipe service, -// except for a few special cases (e.g. GSM modem), where EBUSY will be -// returned if more than one client tries to connect to it. -int qemu_pipe_open(const char* pipeName); - -// Send a framed message |buff| of |len| bytes through the |fd| descriptor. -// This really adds a 4-hexchar prefix describing the payload size. -// Returns 0 on success, and -1 on error. -int qemu_pipe_frame_send(int fd, const void* buff, size_t len); - -// Read a frame message from |fd|, and store it into |buff| of |len| bytes. -// If the framed message is larger than |len|, then this returns -1 and the -// content is lost. Otherwise, this returns the size of the message. NOTE: -// empty messages are possible in a framed wire protocol and do not mean -// end-of-stream. -int qemu_pipe_frame_recv(int fd, void* buff, size_t len); - -#ifdef __cplusplus -} -#endif - -#endif /* ANDROID_CORE_INCLUDE_QEMU_PIPE_H */ diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/Android.bp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/Android.bp new file mode 100644 index 0000000000..a7d5440b39 --- /dev/null +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/Android.bp @@ -0,0 +1,23 @@ +// Copyright (C) 2021 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. + +filegroup { + name: "vhal_test_json", + srcs: ["prop.json"], +} + +filegroup { + name: "vhal_test_override_json", + srcs: ["override/*"], +} diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/DefaultVhalImpl_test.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/DefaultVhalImpl_test.cpp new file mode 100644 index 0000000000..0233bddb88 --- /dev/null +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/DefaultVhalImpl_test.cpp @@ -0,0 +1,1394 @@ +/* + * Copyright (C) 2021 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 <android-base/file.h> +#include <android/hardware/automotive/vehicle/2.0/types.h> +#include <gmock/gmock.h> +#include <gtest/gtest.h> +#include <sys/mman.h> +#include <vhal_v2_0/ConcurrentQueue.h> +#include <vhal_v2_0/DefaultConfig.h> +#include <vhal_v2_0/DefaultVehicleConnector.h> +#include <vhal_v2_0/DefaultVehicleHal.h> +#include <vhal_v2_0/PropertyUtils.h> +#include <vhal_v2_0/VehicleObjectPool.h> +#include <vhal_v2_0/VehiclePropertyStore.h> + +namespace android { +namespace hardware { +namespace automotive { +namespace vehicle { +namespace V2_0 { +namespace impl { + +class DefaultVhalImplTestHelper { + public: + DefaultVhalImplTestHelper(DefaultVehicleHalServer* server) { mServer = server; } + + void overrideProperties(const char* overrideDir) { + mServer->overrideProperties(overrideDir); + } + + private: + DefaultVehicleHalServer* mServer; +}; + +} // namespace impl +} // namespace V2_0 +} // namespace vehicle +} // namespace automotive +} // namespace hardware +} // namespace android + +namespace { + +using ::android::hardware::hidl_handle; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::automotive::vehicle::V2_0::FuelType; +using ::android::hardware::automotive::vehicle::V2_0::recyclable_ptr; +using ::android::hardware::automotive::vehicle::V2_0::StatusCode; +using ::android::hardware::automotive::vehicle::V2_0::VehicleHwKeyInputAction; +using ::android::hardware::automotive::vehicle::V2_0::VehiclePropConfig; +using ::android::hardware::automotive::vehicle::V2_0::VehicleProperty; +using ::android::hardware::automotive::vehicle::V2_0::VehiclePropertyStatus; +using ::android::hardware::automotive::vehicle::V2_0::VehiclePropertyStore; +using ::android::hardware::automotive::vehicle::V2_0::VehiclePropValue; +using ::android::hardware::automotive::vehicle::V2_0::VehiclePropValuePool; +using ::android::hardware::automotive::vehicle::V2_0::impl::DefaultVehicleConnector; +using ::android::hardware::automotive::vehicle::V2_0::impl::DefaultVehicleHal; +using ::android::hardware::automotive::vehicle::V2_0::impl::DefaultVhalImplTestHelper; +using ::android::hardware::automotive::vehicle::V2_0::impl::DOOR_1_LEFT; +using ::android::hardware::automotive::vehicle::V2_0::impl::DOOR_1_RIGHT; +using ::android::hardware::automotive::vehicle::V2_0::impl::HVAC_ALL; +using ::android::hardware::automotive::vehicle::V2_0::impl::HVAC_LEFT; +using ::android::hardware::automotive::vehicle::V2_0::impl::HVAC_RIGHT; +using ::android::hardware::automotive::vehicle::V2_0::impl::kMixedTypePropertyForTest; +using ::android::hardware::automotive::vehicle::V2_0::impl::OBD2_FREEZE_FRAME; +using ::android::hardware::automotive::vehicle::V2_0::impl::OBD2_FREEZE_FRAME_CLEAR; +using ::android::hardware::automotive::vehicle::V2_0::impl::OBD2_FREEZE_FRAME_INFO; +using ::android::hardware::automotive::vehicle::V2_0::impl::OBD2_LIVE_FRAME; + +using ::testing::HasSubstr; + +using VehiclePropValuePtr = recyclable_ptr<VehiclePropValue>; + +// The maximum length of property ID in string. +const size_t MAX_PROP_ID_LENGTH = 100; + +class DefaultVhalImplTest : public ::testing::Test { + public: + ~DefaultVhalImplTest() { + mEventQueue.deactivate(); + mHeartBeatQueue.deactivate(); + // Destroy mHal before destroying its dependencies. + mHal.reset(); + mConnector.reset(); + mPropStore.reset(); + } + + protected: + void SetUp() override { + mPropStore.reset(new VehiclePropertyStore); + mConnector.reset(new DefaultVehicleConnector); + mConnector->setValuePool(&mValueObjectPool); + mHal.reset(new DefaultVehicleHal(mPropStore.get(), mConnector.get())); + initHal(); + } + + void initHal() { + mHal->init(&mValueObjectPool, + std::bind(&DefaultVhalImplTest::onHalEvent, this, std::placeholders::_1), + std::bind(&DefaultVhalImplTest::onHalPropertySetError, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + } + + protected: + std::unique_ptr<DefaultVehicleHal> mHal; + std::unique_ptr<DefaultVehicleConnector> mConnector; + std::unique_ptr<VehiclePropertyStore> mPropStore; + VehiclePropValuePool mValueObjectPool; + android::ConcurrentQueue<VehiclePropValuePtr> mEventQueue; + android::ConcurrentQueue<VehiclePropValuePtr> mHeartBeatQueue; + + private: + void onHalEvent(VehiclePropValuePtr v) { + if (v->prop != toInt(VehicleProperty::VHAL_HEARTBEAT)) { + // Ignore heartbeat properties. + mEventQueue.push(std::move(v)); + } else { + mHeartBeatQueue.push(std::move(v)); + } + } + + void onHalPropertySetError(StatusCode /*errorCode*/, int32_t /*property*/, int32_t /*areaId*/) { + } +}; + +TEST_F(DefaultVhalImplTest, testListProperties) { + std::vector<VehiclePropConfig> configs = mHal->listProperties(); + + EXPECT_EQ((size_t)117, configs.size()); +} + +TEST_F(DefaultVhalImplTest, testGetDefaultPropertyFloat) { + VehiclePropValue value; + StatusCode status; + value.prop = toInt(VehicleProperty::INFO_FUEL_CAPACITY); + + auto gotValue = mHal->get(value, &status); + + EXPECT_EQ(StatusCode::OK, status); + ASSERT_EQ((unsigned int)1, gotValue->value.floatValues.size()); + EXPECT_EQ(15000.0f, gotValue->value.floatValues[0]); +} + +TEST_F(DefaultVhalImplTest, testGetDefaultPropertyEnum) { + VehiclePropValue value; + StatusCode status; + value.prop = toInt(VehicleProperty::INFO_FUEL_TYPE); + + auto gotValue = mHal->get(value, &status); + + EXPECT_EQ(StatusCode::OK, status); + ASSERT_EQ((unsigned int)1, gotValue->value.int32Values.size()); + EXPECT_EQ((int)FuelType::FUEL_TYPE_UNLEADED, gotValue->value.int32Values[0]); +} + +TEST_F(DefaultVhalImplTest, testGetDefaultPropertyInt) { + VehiclePropValue value; + StatusCode status; + value.prop = toInt(VehicleProperty::INFO_MODEL_YEAR); + + auto gotValue = mHal->get(value, &status); + + EXPECT_EQ(StatusCode::OK, status); + ASSERT_EQ((unsigned int)1, gotValue->value.int32Values.size()); + EXPECT_EQ(2020, gotValue->value.int32Values[0]); +} + +TEST_F(DefaultVhalImplTest, testGetDefaultPropertyString) { + VehiclePropValue value; + StatusCode status; + value.prop = toInt(VehicleProperty::INFO_MAKE); + + auto gotValue = mHal->get(value, &status); + + EXPECT_EQ(StatusCode::OK, status); + EXPECT_EQ("Toy Vehicle", gotValue->value.stringValue); +} + +TEST_F(DefaultVhalImplTest, testGetUnknownProperty) { + VehiclePropValue value; + StatusCode status; + value.prop = 0; + + auto gotValue = mHal->get(value, &status); + + EXPECT_EQ(StatusCode::INVALID_ARG, status); +} + +TEST_F(DefaultVhalImplTest, testSetFloat) { + VehiclePropValue value; + value.prop = toInt(VehicleProperty::INFO_FUEL_CAPACITY); + value.value.floatValues.resize(1); + value.value.floatValues[0] = 1.0f; + + StatusCode status = mHal->set(value); + ASSERT_EQ(StatusCode::OK, status); + + auto gotValue = mHal->get(value, &status); + EXPECT_EQ(StatusCode::OK, status); + ASSERT_EQ((unsigned int)1, gotValue->value.floatValues.size()); + EXPECT_EQ(1.0f, gotValue->value.floatValues[0]); +} + +TEST_F(DefaultVhalImplTest, testSetEnum) { + VehiclePropValue value; + value.prop = toInt(VehicleProperty::INFO_FUEL_TYPE); + value.value.int32Values.resize(1); + value.value.int32Values[0] = (int)FuelType::FUEL_TYPE_LEADED; + + StatusCode status = mHal->set(value); + ASSERT_EQ(StatusCode::OK, status); + + auto gotValue = mHal->get(value, &status); + EXPECT_EQ(StatusCode::OK, status); + ASSERT_EQ((unsigned int)1, gotValue->value.int32Values.size()); + EXPECT_EQ((int)FuelType::FUEL_TYPE_LEADED, gotValue->value.int32Values[0]); +} + +TEST_F(DefaultVhalImplTest, testSetInt) { + VehiclePropValue value; + value.prop = toInt(VehicleProperty::INFO_MODEL_YEAR); + value.value.int32Values.resize(1); + value.value.int32Values[0] = 2021; + + StatusCode status = mHal->set(value); + EXPECT_EQ(StatusCode::OK, status); + + auto gotValue = mHal->get(value, &status); + EXPECT_EQ(StatusCode::OK, status); + EXPECT_EQ((unsigned int)1, gotValue->value.int32Values.size()); + EXPECT_EQ(2021, gotValue->value.int32Values[0]); +} + +TEST_F(DefaultVhalImplTest, testSetString) { + VehiclePropValue value; + value.prop = toInt(VehicleProperty::INFO_MAKE); + value.value.stringValue = "My Vehicle"; + + StatusCode status = mHal->set(value); + ASSERT_EQ(StatusCode::OK, status); + + auto gotValue = mHal->get(value, &status); + EXPECT_EQ(StatusCode::OK, status); + EXPECT_EQ("My Vehicle", gotValue->value.stringValue); +} + +TEST_F(DefaultVhalImplTest, testSetMixed) { + VehiclePropValue value; + value.prop = kMixedTypePropertyForTest; + // mixed prop. + // .configArray = {1, 1, 0, 2, 0, 0, 1, 0, 0} + // 1 string, 1 int, 0 bool, 2 ints, 0 int64, 0 int64s, 1 float, 0 floats, 0 bytes + value.value.stringValue = "test"; + value.value.int32Values.resize(3); + value.value.int32Values[0] = 1; + value.value.int32Values[1] = 2; + value.value.int32Values[2] = 3; + value.value.floatValues.resize(1); + value.value.floatValues[0] = 1.0f; + + StatusCode status = mHal->set(value); + ASSERT_EQ(StatusCode::OK, status); + + auto gotValue = mHal->get(value, &status); + EXPECT_EQ(StatusCode::OK, status); + EXPECT_EQ("test", gotValue->value.stringValue); + ASSERT_EQ((size_t)3, gotValue->value.int32Values.size()); + EXPECT_EQ(1, gotValue->value.int32Values[0]); + EXPECT_EQ(2, gotValue->value.int32Values[1]); + EXPECT_EQ(3, gotValue->value.int32Values[2]); + ASSERT_EQ((size_t)1, gotValue->value.floatValues.size()); + EXPECT_EQ(1.0f, gotValue->value.floatValues[0]); +} + +TEST_F(DefaultVhalImplTest, testSetUnknownProperty) { + VehiclePropValue value; + value.prop = 0; + + EXPECT_EQ(StatusCode::INVALID_ARG, mHal->set(value)); +} + +TEST_F(DefaultVhalImplTest, testSetStatusNotAllowed) { + VehiclePropValue value; + value.prop = toInt(VehicleProperty::INFO_FUEL_CAPACITY); + value.status = VehiclePropertyStatus::UNAVAILABLE; + value.value.floatValues.resize(1); + value.value.floatValues[0] = 1.0f; + + StatusCode status = mHal->set(value); + + EXPECT_EQ(StatusCode::INVALID_ARG, status); +} + +TEST_F(DefaultVhalImplTest, testSubscribe) { + // Clear existing events. + mEventQueue.flush(); + + auto status = mHal->subscribe(toInt(VehicleProperty::PERF_VEHICLE_SPEED), 10); + + ASSERT_EQ(StatusCode::OK, status); + + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + + // Modify the speed after 0.5 seconds. + VehiclePropValue value; + value.prop = toInt(VehicleProperty::PERF_VEHICLE_SPEED); + value.value.floatValues.resize(1); + value.value.floatValues[0] = 1.0f; + ASSERT_EQ(StatusCode::OK, mHal->set(value)); + + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + + auto events = mEventQueue.flush(); + ASSERT_LE((size_t)10, events.size()); + + // The first event should be the default value. + ASSERT_EQ((size_t)1, events[0]->value.floatValues.size()); + EXPECT_EQ(0.0f, events[0]->value.floatValues[0]); + // The last event should be the value after update. + ASSERT_EQ((size_t)1, events[events.size() - 1]->value.floatValues.size()); + EXPECT_EQ(1.0f, events[events.size() - 1]->value.floatValues[0]); +} + +TEST_F(DefaultVhalImplTest, testSubscribeInvalidProp) { + EXPECT_EQ(StatusCode::INVALID_ARG, mHal->subscribe(toInt(VehicleProperty::INFO_MAKE), 10)); +} + +TEST_F(DefaultVhalImplTest, testSubscribeSampleRateOutOfRange) { + EXPECT_EQ(StatusCode::INVALID_ARG, + mHal->subscribe(toInt(VehicleProperty::PERF_VEHICLE_SPEED), 10.1)); + EXPECT_EQ(StatusCode::INVALID_ARG, + mHal->subscribe(toInt(VehicleProperty::PERF_VEHICLE_SPEED), 0.5)); +} + +TEST_F(DefaultVhalImplTest, testUnsubscribe) { + auto status = mHal->subscribe(toInt(VehicleProperty::PERF_VEHICLE_SPEED), 10); + ASSERT_EQ(StatusCode::OK, status); + + // Wait for 0.5 seconds to generate some events. + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + + status = mHal->unsubscribe(toInt(VehicleProperty::PERF_VEHICLE_SPEED)); + ASSERT_EQ(StatusCode::OK, status); + + // Clear all the events. + mEventQueue.flush(); + + // Wait for 0.5 seconds. + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + + // There should be no new events generated. + auto events = mEventQueue.flush(); + EXPECT_EQ((size_t)0, events.size()); +} + +TEST_F(DefaultVhalImplTest, testUnsubscribeInvalidProp) { + EXPECT_EQ(StatusCode::INVALID_ARG, mHal->unsubscribe(toInt(VehicleProperty::INFO_MAKE))); +} + +int createMemfd(hidl_handle* fd) { + native_handle_t* handle = native_handle_create(/*numFds=*/1, /*numInts=*/0); + int memfd = memfd_create("memfile", 0); + handle->data[0] = dup(memfd); + fd->setTo(handle, /*shouldOwn=*/true); + return memfd; +} + +TEST_F(DefaultVhalImplTest, testDump) { + hidl_vec<hidl_string> options; + hidl_handle fd = {}; + int memfd = createMemfd(&fd); + + ASSERT_TRUE(mHal->dump(fd, options)); + + lseek(memfd, 0, SEEK_SET); + char buf[10240] = {}; + read(memfd, buf, sizeof(buf)); + close(memfd); + + // Read one property and check that it is in the dumped info. + VehiclePropValue value; + StatusCode status; + value.prop = toInt(VehicleProperty::INFO_MAKE); + auto gotValue = mHal->get(value, &status); + ASSERT_EQ(StatusCode::OK, status); + // Server side prop store does not have timestamp. + gotValue->timestamp = 0; + + std::string infoMake = toString(*gotValue); + EXPECT_THAT(std::string(buf), HasSubstr(infoMake)); +} + +TEST_F(DefaultVhalImplTest, testSetPropInvalidAreaId) { + VehiclePropValue propNormal = {.prop = toInt(VehicleProperty::HVAC_FAN_SPEED), + .areaId = HVAC_ALL, + .value.int32Values = {3}}; + StatusCode status = mHal->set(propNormal); + + EXPECT_EQ(StatusCode::OK, status); + + // HVAC_FAN_SPEED only have HVAC_ALL area config and is not allowed to set by LEFT/RIGHT. + VehiclePropValue propWrongId = {.prop = toInt(VehicleProperty::HVAC_FAN_SPEED), + .areaId = HVAC_LEFT, + .value.int32Values = {3}}; + + status = mHal->set(propWrongId); + + EXPECT_EQ(StatusCode::INVALID_ARG, status); +} + +class DefaultVhalImplSetInvalidPropTest : public DefaultVhalImplTest, + public testing::WithParamInterface<VehiclePropValue> {}; + +std::vector<VehiclePropValue> GenSetInvalidPropParams() { + std::vector<VehiclePropValue> props; + // int prop with no value. + VehiclePropValue intProp = {.prop = toInt(VehicleProperty::INFO_MODEL_YEAR)}; + props.push_back(intProp); + + // int prop with more than one value. + VehiclePropValue intPropWithValues = {.prop = toInt(VehicleProperty::INFO_MODEL_YEAR)}; + intPropWithValues.value.int32Values.resize(2); + props.push_back(intPropWithValues); + + // int vec prop with no value. + VehiclePropValue intVecProp = {.prop = toInt(VehicleProperty::INFO_FUEL_TYPE)}; + props.push_back(intVecProp); + + // int64 prop with no value. + VehiclePropValue int64Prop = {.prop = toInt(VehicleProperty::EPOCH_TIME)}; + props.push_back(int64Prop); + + // int64 prop with more than one value. + VehiclePropValue int64PropWithValues = {.prop = toInt(VehicleProperty::EPOCH_TIME)}; + int64PropWithValues.value.int64Values.resize(2); + props.push_back(int64PropWithValues); + + // int64 vec prop with no value. + VehiclePropValue int64VecProp = {.prop = toInt(VehicleProperty::WHEEL_TICK)}; + props.push_back(int64VecProp); + + // float prop with no value. + VehiclePropValue floatProp = {.prop = toInt(VehicleProperty::INFO_FUEL_CAPACITY)}; + props.push_back(floatProp); + + // float prop with more than one value. + VehiclePropValue floatPropWithValues = {.prop = toInt(VehicleProperty::INFO_FUEL_CAPACITY)}; + floatPropWithValues.value.floatValues.resize(2); + props.push_back(floatPropWithValues); + + // float vec prop with no value. + VehiclePropValue floatVecProp = { + .prop = toInt(VehicleProperty::HVAC_TEMPERATURE_VALUE_SUGGESTION)}; + props.push_back(floatVecProp); + + // bool prop with no value. + VehiclePropValue boolProp = { + .prop = toInt(VehicleProperty::FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME)}; + props.push_back(boolProp); + + // bool prop with more than one value. + VehiclePropValue boolPropWithValues = { + .prop = toInt(VehicleProperty::FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME)}; + boolPropWithValues.value.int32Values.resize(2); + props.push_back(boolPropWithValues); + + // mixed prop. + // .configArray = {1, 1, 0, 2, 0, 0, 1, 0, 0} + // 1 string, 1 int, 0 bool, 2 ints, 0 int64, 0 int64s, 1 float, 0 floats, 0 bytes + VehiclePropValue mixedProp1 = {.prop = kMixedTypePropertyForTest}; + // Expect 1 bool, and 2 ints, we only have 1 value. + mixedProp1.value.int32Values.resize(1); + mixedProp1.value.floatValues.resize(1); + props.push_back(mixedProp1); + + VehiclePropValue mixedProp2 = {.prop = kMixedTypePropertyForTest}; + mixedProp2.value.int32Values.resize(3); + // Missing float value. + mixedProp2.value.floatValues.resize(0); + props.push_back(mixedProp2); + + return props; +} + +TEST_P(DefaultVhalImplSetInvalidPropTest, testSetInvalidPropValue) { + VehiclePropValue value = GetParam(); + + StatusCode status = mHal->set(value); + + EXPECT_EQ(StatusCode::INVALID_ARG, status); +} + +INSTANTIATE_TEST_SUITE_P(DefaultVhalImplSetInvalidPropTests, DefaultVhalImplSetInvalidPropTest, + testing::ValuesIn(GenSetInvalidPropParams())); + +struct SetPropRangeTestCase { + std::string name; + VehiclePropValue prop; + StatusCode code; +}; + +class DefaultVhalImplSetPropRangeTest : public DefaultVhalImplTest, + public testing::WithParamInterface<SetPropRangeTestCase> {}; + +std::vector<SetPropRangeTestCase> GenSetPropRangeParams() { + std::vector<SetPropRangeTestCase> tc; + VehiclePropValue intPropNormal = {.prop = toInt(VehicleProperty::HVAC_FAN_SPEED), + .areaId = HVAC_ALL, + // min: 1, max: 7 + .value.int32Values = {3}}; + tc.push_back({"normal_case_int", intPropNormal, StatusCode::OK}); + + VehiclePropValue intPropSmall = {.prop = toInt(VehicleProperty::HVAC_FAN_SPEED), + .areaId = HVAC_ALL, + // min: 1, max: 7 + .value.int32Values = {0}}; + tc.push_back({"normal_case_int_too_small", intPropSmall, StatusCode::INVALID_ARG}); + + VehiclePropValue intPropLarge = {.prop = toInt(VehicleProperty::HVAC_FAN_SPEED), + .areaId = HVAC_ALL, + // min: 1, max: 7 + .value.int32Values = {8}}; + tc.push_back({"normal_case_int_too_large", intPropLarge, StatusCode::INVALID_ARG}); + + VehiclePropValue floatPropNormal = {.prop = toInt(VehicleProperty::HVAC_TEMPERATURE_SET), + .areaId = HVAC_LEFT, + // min: 16, max: 32 + .value.floatValues = {26}}; + tc.push_back({"normal_case_float", floatPropNormal, StatusCode::OK}); + VehiclePropValue floatPropSmall = {.prop = toInt(VehicleProperty::HVAC_TEMPERATURE_SET), + .areaId = HVAC_LEFT, + // min: 16, max: 32 + .value.floatValues = {15.5}}; + tc.push_back({"normal_case_float_too_small", floatPropSmall, StatusCode::INVALID_ARG}); + VehiclePropValue floatPropLarge = {.prop = toInt(VehicleProperty::HVAC_TEMPERATURE_SET), + .areaId = HVAC_LEFT, + // min: 16, max: 32 + .value.floatValues = {32.6}}; + tc.push_back({"normal_case_float_too_large", floatPropLarge, StatusCode::INVALID_ARG}); + + return tc; +} + +TEST_P(DefaultVhalImplSetPropRangeTest, testSetPropRange) { + SetPropRangeTestCase tc = GetParam(); + + StatusCode status = mHal->set(tc.prop); + + EXPECT_EQ(tc.code, status); +} + +INSTANTIATE_TEST_SUITE_P( + DefaultVhalImplSetPropRangeTests, DefaultVhalImplSetPropRangeTest, + testing::ValuesIn(GenSetPropRangeParams()), + [](const testing::TestParamInfo<DefaultVhalImplSetPropRangeTest::ParamType>& info) { + return info.param.name; + }); + +std::string getPropIdString(VehicleProperty prop) { + char s[MAX_PROP_ID_LENGTH] = {}; + snprintf(s, sizeof(s), "%d", toInt(prop)); + return std::string(s); +} + +struct OptionsTestCase { + std::string name; + hidl_vec<hidl_string> options; + std::string expectMsg; +}; + +class DefaultVhalImplOptionsTest : public DefaultVhalImplTest, + public testing::WithParamInterface<OptionsTestCase> {}; + +TEST_P(DefaultVhalImplOptionsTest, testInvalidOptions) { + auto tc = GetParam(); + hidl_handle fd = {}; + int memfd = createMemfd(&fd); + + bool shouldDump = mHal->dump(fd, tc.options); + + EXPECT_FALSE(shouldDump); + char buf[10240] = {}; + lseek(memfd, 0, SEEK_SET); + read(memfd, buf, sizeof(buf)); + EXPECT_THAT(std::string(buf), HasSubstr(tc.expectMsg)); +} + +std::vector<OptionsTestCase> GenInvalidOptions() { + return {{"no_command", {"--debughal"}, "No command specified"}, + {"unknown_command", {"--debughal", "--unknown"}, "Unknown command: \"--unknown\""}, + {"help", {"--debughal", "--help"}, "Help:"}, + {"genfakedata_no_subcommand", + {"--debughal", "--genfakedata"}, + "No subcommand specified for genfakedata"}, + {"genfakedata_unknown_subcommand", + {"--debughal", "--genfakedata", "--unknown"}, + "Unknown command: \"--unknown\""}, + {"genfakedata_start_linear_no_args", + {"--debughal", "--genfakedata", "--startlinear"}, + "incorrect argument count"}, + {"genfakedata_start_linear_invalid_propId", + {"--debughal", "--genfakedata", "--startlinear", "abcd", "0.1", "0.1", "0.1", "0.1", + "100000000"}, + "failed to parse propdID as int: \"abcd\""}, + {"genfakedata_start_linear_invalid_middleValue", + {"--debughal", "--genfakedata", "--startlinear", "1", "abcd", "0.1", "0.1", "0.1", + "100000000"}, + "failed to parse middleValue as float: \"abcd\""}, + {"genfakedata_start_linear_invalid_currentValue", + {"--debughal", "--genfakedata", "--startlinear", "1", "0.1", "abcd", "0.1", "0.1", + "100000000"}, + "failed to parse currentValue as float: \"abcd\""}, + {"genfakedata_start_linear_invalid_dispersion", + {"--debughal", "--genfakedata", "--startlinear", "1", "0.1", "0.1", "abcd", "0.1", + "100000000"}, + "failed to parse dispersion as float: \"abcd\""}, + {"genfakedata_start_linear_invalid_increment", + {"--debughal", "--genfakedata", "--startlinear", "1", "0.1", "0.1", "0.1", "abcd", + "100000000"}, + "failed to parse increment as float: \"abcd\""}, + {"genfakedata_start_linear_invalid_interval", + {"--debughal", "--genfakedata", "--startlinear", "1", "0.1", "0.1", "0.1", "0.1", + "0.1"}, + "failed to parse interval as int: \"0.1\""}, + {"genfakedata_stop_linear_no_args", + {"--debughal", "--genfakedata", "--stoplinear"}, + "incorrect argument count"}, + {"genfakedata_stop_linear_invalid_propId", + {"--debughal", "--genfakedata", "--stoplinear", "abcd"}, + "failed to parse propdID as int: \"abcd\""}, + {"genfakedata_startjson_no_args", + {"--debughal", "--genfakedata", "--startjson"}, + "incorrect argument count"}, + {"genfakedata_startjson_invalid_repetition", + {"--debughal", "--genfakedata", "--startjson", "file", "0.1"}, + "failed to parse repetition as int: \"0.1\""}, + {"genfakedata_startjson_invalid_json_file", + {"--debughal", "--genfakedata", "--startjson", "file", "1"}, + "invalid JSON file"}, + {"genfakedata_stopjson_no_args", + {"--debughal", "--genfakedata", "--stopjson"}, + "incorrect argument count"}, + {"genfakedata_keypress_no_args", + {"--debughal", "--genfakedata", "--keypress"}, + "incorrect argument count"}, + {"genfakedata_keypress_invalid_keyCode", + {"--debughal", "--genfakedata", "--keypress", "0.1", "1"}, + "failed to parse keyCode as int: \"0.1\""}, + {"genfakedata_keypress_invalid_display", + {"--debughal", "--genfakedata", "--keypress", "1", "0.1"}, + "failed to parse display as int: \"0.1\""}, + {"setint_no_args", {"--debughal", "--setint"}, "incorrect argument count"}, + {"setint_invalid_prop_id", + {"--debughal", "--setint", "abcd", "0", "0", "0"}, + "failed to parse propID as int: \"abcd\""}, + {"setint_invalid_value", + {"--debughal", "--setint", "0", "1.1", "0", "0"}, + "failed to parse value as int: \"1.1\""}, + {"setint_invalid_timestamp", + {"--debughal", "--setint", "0", "0", "1.1", "0"}, + "failed to parse timestamp as int: \"1.1\""}, + {"setint_invalid_areaId", + {"--debughal", "--setint", "0", "0", "0", "1.1"}, + "failed to parse areaID as int: \"1.1\""}, + {"setbool_no_args", {"--debughal", "--setbool"}, "incorrect argument count"}, + {"setbool_invalid_value", + {"--debughal", "--setbool", "0", "1", "0", "0"}, + "failed to parse value as bool"}, + {"setfloat_no_args", {"--debughal", "--setfloat"}, "incorrect argument count"}, + {"setfloat_invalid_value", + {"--debughal", "--setfloat", "0", "abcd", "0", "0"}, + "failed to parse value as float: \"abcd\""}}; +} + +INSTANTIATE_TEST_SUITE_P( + DefaultVhalImplOptionsTests, DefaultVhalImplOptionsTest, + testing::ValuesIn(GenInvalidOptions()), + [](const testing::TestParamInfo<DefaultVhalImplOptionsTest::ParamType>& info) { + return info.param.name; + }); + +TEST_F(DefaultVhalImplTest, testDebugGenFakeDataLinear) { + // Start a fake linear data generator for vehicle speed at 0.1s interval. + // range: 0 - 100, current value: 30, step: 20. + hidl_vec<hidl_string> options = {"--debughal", + "--genfakedata", + "--startlinear", + getPropIdString(VehicleProperty::PERF_VEHICLE_SPEED), + /*middleValue=*/"50", + /*currentValue=*/"30", + /*dispersion=*/"50", + /*increment=*/"20", + /*interval=*/"100000000"}; + hidl_handle fd = {}; + int memfd = createMemfd(&fd); + // Clear existing events. + mEventQueue.flush(); + + EXPECT_FALSE(mHal->dump(fd, options)); + + lseek(memfd, 0, SEEK_SET); + char buf[10240] = {}; + // The dumped info should be empty. + read(memfd, buf, sizeof(buf)); + EXPECT_STREQ("", buf); + + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + + auto events = mEventQueue.flush(); + // We should get 10 events ideally, but let's be safe here. + ASSERT_LE((size_t)5, events.size()); + int32_t value = 30; + for (size_t i = 0; i < 5; i++) { + ASSERT_EQ((size_t)1, events[i]->value.floatValues.size()); + EXPECT_EQ((float)value, events[i]->value.floatValues[0]); + value = (value + 20) % 100; + } + + // Stop the linear generator. + options = {"--debughal", "--genfakedata", "--stoplinear", + getPropIdString(VehicleProperty::PERF_VEHICLE_SPEED)}; + EXPECT_FALSE(mHal->dump(fd, options)); + + // The dumped info should be empty. + lseek(memfd, 0, SEEK_SET); + read(memfd, buf, sizeof(buf)); + EXPECT_STREQ("", buf); + + close(memfd); + + // Clear existing events. + mEventQueue.flush(); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + // There should be no new events generated. + EXPECT_EQ((size_t)0, mEventQueue.flush().size()); +} + +std::string getTestFilePath(const char* filename) { + static std::string baseDir = android::base::GetExecutableDirectory(); + return baseDir + "/" + filename; +} + +TEST_F(DefaultVhalImplTest, testDebugGenFakeDataJson) { + hidl_vec<hidl_string> options = {"--debughal", "--genfakedata", "--startjson", + getTestFilePath("prop.json"), "2"}; + hidl_handle fd = {}; + int memfd = createMemfd(&fd); + // Clear existing events. + mEventQueue.flush(); + + EXPECT_FALSE(mHal->dump(fd, options)); + + lseek(memfd, 0, SEEK_SET); + char buf[10240] = {}; + // The dumped info should be empty. + read(memfd, buf, sizeof(buf)); + EXPECT_STREQ("", buf); + + // wait for some time. + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + auto events = mEventQueue.flush(); + ASSERT_EQ((size_t)8, events.size()); + // First set of events, we test 1st and the last. + EXPECT_EQ((size_t)1, events[0]->value.int32Values.size()); + EXPECT_EQ(8, events[0]->value.int32Values[0]); + EXPECT_EQ((size_t)1, events[3]->value.int32Values.size()); + EXPECT_EQ(10, events[3]->value.int32Values[0]); + // Second set of the same events. + EXPECT_EQ((size_t)1, events[4]->value.int32Values.size()); + EXPECT_EQ(8, events[4]->value.int32Values[0]); + EXPECT_EQ((size_t)1, events[7]->value.int32Values.size()); + EXPECT_EQ(10, events[7]->value.int32Values[0]); +} + +TEST_F(DefaultVhalImplTest, testDebugGenFakeDataKeyPress) { + hidl_vec<hidl_string> options = {"--debughal", "--genfakedata", "--keypress", "1", "2"}; + hidl_handle fd = {}; + int memfd = createMemfd(&fd); + // Clear existing events. + mEventQueue.flush(); + + EXPECT_FALSE(mHal->dump(fd, options)); + + lseek(memfd, 0, SEEK_SET); + char buf[10240] = {}; + // The dumped info should be empty. + read(memfd, buf, sizeof(buf)); + EXPECT_STREQ("", buf); + + auto events = mEventQueue.flush(); + ASSERT_EQ((size_t)2, events.size()); + EXPECT_EQ(toInt(VehicleProperty::HW_KEY_INPUT), events[0]->prop); + EXPECT_EQ(toInt(VehicleProperty::HW_KEY_INPUT), events[1]->prop); + ASSERT_EQ((size_t)3, events[0]->value.int32Values.size()); + ASSERT_EQ((size_t)3, events[1]->value.int32Values.size()); + EXPECT_EQ(toInt(VehicleHwKeyInputAction::ACTION_DOWN), events[0]->value.int32Values[0]); + EXPECT_EQ(1, events[0]->value.int32Values[1]); + EXPECT_EQ(2, events[0]->value.int32Values[2]); + EXPECT_EQ(toInt(VehicleHwKeyInputAction::ACTION_UP), events[1]->value.int32Values[0]); + EXPECT_EQ(1, events[1]->value.int32Values[1]); + EXPECT_EQ(2, events[1]->value.int32Values[2]); +} + +TEST_F(DefaultVhalImplTest, testHeartBeatEvent) { + // A heart beat would be sent every 3s, but let's wait for 6s to be sure at least 2 events have + // been generated (at 0s and 3s). + std::this_thread::sleep_for(std::chrono::milliseconds(6000)); + + auto events = mHeartBeatQueue.flush(); + ASSERT_GE(events.size(), (size_t)2); + ASSERT_EQ(toInt(VehicleProperty::VHAL_HEARTBEAT), events[0]->prop); +} + +TEST_F(DefaultVhalImplTest, testVendorOverrideProperties) { + // Destroy the existing VHAL first to prevent it using destroyed connector or propstore. + mHal.reset(); + // Create a new Default VHAL and reinitialize it to load the override properties. + std::string overrideDir = android::base::GetExecutableDirectory() + "/override/"; + mPropStore.reset(new VehiclePropertyStore); + mConnector.reset(new DefaultVehicleConnector); + mConnector->setValuePool(&mValueObjectPool); + mHal.reset(new DefaultVehicleHal(mPropStore.get(), mConnector.get())); + // Set vendor override directory. + DefaultVhalImplTestHelper helper(mConnector.get()); + helper.overrideProperties(overrideDir.c_str()); + + initHal(); + + VehiclePropValue value; + StatusCode status; + // This is the same as the prop in 'gear_selection.json'. + value.prop = toInt(VehicleProperty::GEAR_SELECTION); + + auto gotValue = mHal->get(value, &status); + + ASSERT_EQ(StatusCode::OK, status); + ASSERT_EQ((size_t)1, gotValue->value.int32Values.size()); + ASSERT_EQ(8, gotValue->value.int32Values[0]); + + // If we set the value, it should update despite the override. + value.prop = toInt(VehicleProperty::GEAR_SELECTION); + value.value.int32Values.resize(1); + value.value.int32Values[0] = 5; + + status = mHal->set(value); + ASSERT_EQ(StatusCode::OK, status); + + gotValue = mHal->get(value, &status); + ASSERT_EQ(StatusCode::OK, status); + ASSERT_EQ((size_t)1, gotValue->value.int32Values.size()); + ASSERT_EQ(5, gotValue->value.int32Values[0]); +} + +TEST_F(DefaultVhalImplTest, testVendorOverridePropertiesMultipleAreas) { + // Destroy the existing VHAL first to prevent it using destroyed connector or propstore. + mHal.reset(); + // Create a new Default VHAL and reinitialize it to load the override properties. + std::string overrideDir = android::base::GetExecutableDirectory() + "/override/"; + mPropStore.reset(new VehiclePropertyStore); + mConnector.reset(new DefaultVehicleConnector); + mConnector->setValuePool(&mValueObjectPool); + mHal.reset(new DefaultVehicleHal(mPropStore.get(), mConnector.get())); + // Set vendor override directory. + DefaultVhalImplTestHelper helper(mConnector.get()); + helper.overrideProperties(overrideDir.c_str()); + + initHal(); + + VehiclePropValue value; + StatusCode status; + // This is the same as the prop in 'hvac_temperature_set.json'. + value.prop = toInt(VehicleProperty::HVAC_TEMPERATURE_SET); + value.areaId = HVAC_LEFT; + + auto gotValue = mHal->get(value, &status); + + ASSERT_EQ(StatusCode::OK, status); + ASSERT_EQ((size_t)1, gotValue->value.floatValues.size()); + ASSERT_EQ(30.0f, gotValue->value.floatValues[0]); + + // HVAC_RIGHT should not be affected and return the default value. + value.areaId = HVAC_RIGHT; + + gotValue = mHal->get(value, &status); + + ASSERT_EQ(StatusCode::OK, status); + ASSERT_EQ((size_t)1, gotValue->value.floatValues.size()); + ASSERT_EQ(20.0f, gotValue->value.floatValues[0]); +} + +TEST_F(DefaultVhalImplTest, testVendorOverridePropertiesDirDoesNotExist) { + // Destroy the existing VHAL first to prevent it using destroyed connector or propstore. + mHal.reset(); + // Create a new Default VHAL and reinitialize it to load the override properties. + mPropStore.reset(new VehiclePropertyStore); + mConnector.reset(new DefaultVehicleConnector); + mConnector->setValuePool(&mValueObjectPool); + mHal.reset(new DefaultVehicleHal(mPropStore.get(), mConnector.get())); + // Set vendor override directory to a non-existing dir + DefaultVhalImplTestHelper helper(mConnector.get()); + helper.overrideProperties("123"); + initHal(); + + VehiclePropValue value; + StatusCode status; + value.prop = toInt(VehicleProperty::GEAR_SELECTION); + + auto gotValue = mHal->get(value, &status); + + // We should get the default value. + ASSERT_EQ(StatusCode::OK, status); + ASSERT_EQ((size_t)1, gotValue->value.int32Values.size()); + ASSERT_EQ(4, gotValue->value.int32Values[0]); +} + +TEST_F(DefaultVhalImplTest, testGetObd2FreezeFrameNoTimestamp) { + VehiclePropValue value; + value.prop = OBD2_FREEZE_FRAME; + StatusCode status; + + auto gotValue = mHal->get(value, &status); + + ASSERT_EQ(StatusCode::INVALID_ARG, status); +} + +TEST_F(DefaultVhalImplTest, testGetObd2FreezeFrameInvalidTimestamp) { + VehiclePropValue value; + value.prop = OBD2_FREEZE_FRAME; + value.value.int64Values.resize(1); + value.value.int64Values[0] = 0; + StatusCode status; + + auto gotValue = mHal->get(value, &status); + + ASSERT_EQ(StatusCode::INVALID_ARG, status); +} + +TEST_F(DefaultVhalImplTest, testGetObd2FreezeFrameInfoGetObd2FreezeFrame) { + VehiclePropValue value; + value.prop = OBD2_FREEZE_FRAME_INFO; + StatusCode status; + + auto gotValue = mHal->get(value, &status); + + ASSERT_EQ(StatusCode::OK, status); + ASSERT_EQ((size_t)3, gotValue->value.int64Values.size()); + + std::vector<std::string> dtcs; + std::vector<std::string> sampleDtcs = {"P0070", "P0102", "P0123"}; + for (int64_t timestamp : gotValue->value.int64Values) { + VehiclePropValue freezeFrameRequest; + freezeFrameRequest.prop = OBD2_FREEZE_FRAME; + freezeFrameRequest.value.int64Values.resize(1); + freezeFrameRequest.value.int64Values[0] = timestamp; + + auto freezeFrameValue = mHal->get(freezeFrameRequest, &status); + + ASSERT_EQ(StatusCode::OK, status); + // Obd2IntegerSensorIndex.LAST_SYSTEM_INDEX + 1 + EXPECT_EQ((size_t)32, freezeFrameValue->value.int32Values.size()); + // Obd2FloatSensorIndex.LAST_SYSTEM_INDEX + 1 + EXPECT_EQ((size_t)71, freezeFrameValue->value.floatValues.size()); + // (intValues.size() + floatValues.size()) / 8 + EXPECT_EQ((size_t)13, freezeFrameValue->value.bytes.size()); + + dtcs.push_back(freezeFrameValue->value.stringValue); + } + + for (std::string expectDtc : sampleDtcs) { + EXPECT_NE(std::find(dtcs.begin(), dtcs.end(), expectDtc), dtcs.end()); + } +} + +TEST_F(DefaultVhalImplTest, testGetObd2LiveFrame) { + VehiclePropValue value; + value.prop = OBD2_LIVE_FRAME; + StatusCode status; + + auto gotValue = mHal->get(value, &status); + + ASSERT_EQ(StatusCode::OK, status); + // Obd2IntegerSensorIndex.LAST_SYSTEM_INDEX + 1 + EXPECT_EQ((size_t)32, gotValue->value.int32Values.size()); + // Obd2FloatSensorIndex.LAST_SYSTEM_INDEX + 1 + EXPECT_EQ((size_t)71, gotValue->value.floatValues.size()); + // (intValues.size() + floatValues.size()) / 8 + EXPECT_EQ((size_t)13, gotValue->value.bytes.size()); +} + +TEST_F(DefaultVhalImplTest, testClearObd2FreezeFrameAll) { + VehiclePropValue value; + value.prop = OBD2_FREEZE_FRAME_CLEAR; + // No int64Values is to clear all frames. + + auto status = mHal->set(value); + + EXPECT_EQ(StatusCode::OK, status); + + VehiclePropValue freezeFrameRequest; + freezeFrameRequest.prop = OBD2_FREEZE_FRAME; + freezeFrameRequest.value.int64Values.resize(1); + + auto gotValue = mHal->get(freezeFrameRequest, &status); + + EXPECT_EQ(StatusCode::NOT_AVAILABLE, status); + + VehiclePropValue freezeFrameInfoRequest; + freezeFrameInfoRequest.prop = OBD2_FREEZE_FRAME_INFO; + + gotValue = mHal->get(freezeFrameInfoRequest, &status); + + EXPECT_EQ(StatusCode::OK, status); + EXPECT_EQ((size_t)0, gotValue->value.int64Values.size()); +} + +TEST_F(DefaultVhalImplTest, testClearObd2FreezeFrameOneFrame) { + // Get existing freeze frame info first. + VehiclePropValue frameInfoRequest; + frameInfoRequest.prop = OBD2_FREEZE_FRAME_INFO; + StatusCode status; + auto gotValue = mHal->get(frameInfoRequest, &status); + ASSERT_EQ(StatusCode::OK, status); + ASSERT_EQ((size_t)3, gotValue->value.int64Values.size()); + + VehiclePropValue clearRequest; + int64_t timestamp = gotValue->value.int64Values[0]; + clearRequest.prop = OBD2_FREEZE_FRAME_CLEAR; + clearRequest.value.int64Values.resize(1); + clearRequest.value.int64Values[0] = timestamp; + + // Try to clear the first frame. + status = mHal->set(clearRequest); + + // Get freeze frame info again. + gotValue = mHal->get(frameInfoRequest, &status); + + ASSERT_EQ(StatusCode::OK, status); + // Now we should only have 2 frames. + ASSERT_EQ((size_t)2, gotValue->value.int64Values.size()); + + // Try to get the deleted frame, should fail. + VehiclePropValue frameRequest; + frameRequest.prop = OBD2_FREEZE_FRAME; + frameRequest.value.int64Values.resize(1); + frameRequest.value.int64Values[0] = timestamp; + + gotValue = mHal->get(frameRequest, &status); + + ASSERT_EQ(StatusCode::INVALID_ARG, status); + + // Clear the same frame again should fail. + status = mHal->set(clearRequest); + + ASSERT_EQ(StatusCode::INVALID_ARG, status); +} + +TEST_F(DefaultVhalImplTest, testGetUserPropertySetOnly) { + VehiclePropValue value; + value.prop = toInt(VehicleProperty::INITIAL_USER_INFO); + StatusCode status; + + mHal->get(value, &status); + + ASSERT_EQ(StatusCode::INVALID_ARG, status); + + value.prop = toInt(VehicleProperty::SWITCH_USER); + + mHal->get(value, &status); + + ASSERT_EQ(StatusCode::INVALID_ARG, status); + + value.prop = toInt(VehicleProperty::CREATE_USER); + + mHal->get(value, &status); + + ASSERT_EQ(StatusCode::INVALID_ARG, status); + + value.prop = toInt(VehicleProperty::REMOVE_USER); + + mHal->get(value, &status); + + ASSERT_EQ(StatusCode::INVALID_ARG, status); +} + +TEST_F(DefaultVhalImplTest, testGetUserIdAssoc) { + VehiclePropValue value; + value.prop = toInt(VehicleProperty::USER_IDENTIFICATION_ASSOCIATION); + StatusCode status; + + mHal->get(value, &status); + + // Default returns NOT_AVAILABLE. + ASSERT_EQ(StatusCode::NOT_AVAILABLE, status); + + // This is the same example as used in User HAL Emulation doc. + VehiclePropValue setValue = { + .prop = toInt(VehicleProperty::USER_IDENTIFICATION_ASSOCIATION), + .areaId = 1, + .value.int32Values = {666, 1, 1, 2}, + }; + + status = mHal->set(setValue); + + ASSERT_EQ(StatusCode::OK, status); + + auto gotValue = mHal->get(value, &status); + + ASSERT_EQ(StatusCode::OK, status); + ASSERT_EQ((size_t)4, gotValue->value.int32Values.size()); + EXPECT_EQ(1, gotValue->areaId); + EXPECT_EQ(666, gotValue->value.int32Values[0]); + EXPECT_EQ(1, gotValue->value.int32Values[1]); + EXPECT_EQ(1, gotValue->value.int32Values[2]); + EXPECT_EQ(2, gotValue->value.int32Values[3]); + EXPECT_EQ(toInt(VehicleProperty::USER_IDENTIFICATION_ASSOCIATION), gotValue->prop); +} + +TEST_F(DefaultVhalImplTest, testSwitchUser) { + // This is the same example as used in User HAL Emulation doc. + VehiclePropValue setValue = { + .prop = toInt(VehicleProperty::SWITCH_USER), + .areaId = 1, + .value.int32Values = {666, 3, 2}, + }; + + auto status = mHal->set(setValue); + + ASSERT_EQ(StatusCode::OK, status); + + // Simulate a request from Android side. + setValue = { + .prop = toInt(VehicleProperty::SWITCH_USER), + .areaId = 0, + .value.int32Values = {666, 3}, + }; + // Clear existing events. + mEventQueue.flush(); + + status = mHal->set(setValue); + + ASSERT_EQ(StatusCode::OK, status); + + // Should generate an event for user hal response. + auto events = mEventQueue.flush(); + ASSERT_EQ((size_t)1, events.size()); + EXPECT_EQ(1, events[0]->areaId); + EXPECT_EQ(toInt(VehicleProperty::SWITCH_USER), events[0]->prop); + ASSERT_EQ((size_t)3, events[0]->value.int32Values.size()); + EXPECT_EQ(666, events[0]->value.int32Values[0]); + EXPECT_EQ(3, events[0]->value.int32Values[1]); + EXPECT_EQ(2, events[0]->value.int32Values[2]); + + // Try to get switch_user again, should return default value. + status = mHal->set(setValue); + ASSERT_EQ(StatusCode::OK, status); + + events = mEventQueue.flush(); + ASSERT_EQ((size_t)1, events.size()); + EXPECT_EQ(0, events[0]->areaId); + EXPECT_EQ(toInt(VehicleProperty::SWITCH_USER), events[0]->prop); + ASSERT_EQ((size_t)3, events[0]->value.int32Values.size()); + // Request ID + EXPECT_EQ(666, events[0]->value.int32Values[0]); + // VEHICLE_RESPONSE + EXPECT_EQ(3, events[0]->value.int32Values[1]); + // SUCCESS + EXPECT_EQ(1, events[0]->value.int32Values[2]); +} + +TEST_F(DefaultVhalImplTest, testCreateUser) { + // This is the same example as used in User HAL Emulation doc. + VehiclePropValue setValue = { + .prop = toInt(VehicleProperty::CREATE_USER), + .areaId = 1, + .value.int32Values = {666, 2}, + }; + + auto status = mHal->set(setValue); + + ASSERT_EQ(StatusCode::OK, status); + + // Simulate a request from Android side. + setValue = { + .prop = toInt(VehicleProperty::CREATE_USER), + .areaId = 0, + .value.int32Values = {666}, + }; + // Clear existing events. + mEventQueue.flush(); + + status = mHal->set(setValue); + + ASSERT_EQ(StatusCode::OK, status); + + // Should generate an event for user hal response. + auto events = mEventQueue.flush(); + ASSERT_EQ((size_t)1, events.size()); + EXPECT_EQ(1, events[0]->areaId); + EXPECT_EQ(toInt(VehicleProperty::CREATE_USER), events[0]->prop); + ASSERT_EQ((size_t)2, events[0]->value.int32Values.size()); + EXPECT_EQ(666, events[0]->value.int32Values[0]); + EXPECT_EQ(2, events[0]->value.int32Values[1]); + + // Try to get create_user again, should return default value. + status = mHal->set(setValue); + ASSERT_EQ(StatusCode::OK, status); + + events = mEventQueue.flush(); + ASSERT_EQ((size_t)1, events.size()); + EXPECT_EQ(0, events[0]->areaId); + EXPECT_EQ(toInt(VehicleProperty::CREATE_USER), events[0]->prop); + ASSERT_EQ((size_t)2, events[0]->value.int32Values.size()); + // Request ID + EXPECT_EQ(666, events[0]->value.int32Values[0]); + // SUCCESS + EXPECT_EQ(1, events[0]->value.int32Values[1]); +} + +TEST_F(DefaultVhalImplTest, testInitialUserInfo) { + // This is the same example as used in User HAL Emulation doc. + VehiclePropValue setValue = { + .prop = toInt(VehicleProperty::INITIAL_USER_INFO), + .areaId = 1, + .value.int32Values = {666, 1, 11}, + }; + + auto status = mHal->set(setValue); + + ASSERT_EQ(StatusCode::OK, status); + + // Simulate a request from Android side. + setValue = { + .prop = toInt(VehicleProperty::INITIAL_USER_INFO), + .areaId = 0, + .value.int32Values = {3}, + }; + // Clear existing events. + mEventQueue.flush(); + + status = mHal->set(setValue); + + ASSERT_EQ(StatusCode::OK, status); + + // Should generate an event for user hal response. + auto events = mEventQueue.flush(); + ASSERT_EQ((size_t)1, events.size()); + EXPECT_EQ(1, events[0]->areaId); + EXPECT_EQ(toInt(VehicleProperty::INITIAL_USER_INFO), events[0]->prop); + ASSERT_EQ((size_t)3, events[0]->value.int32Values.size()); + EXPECT_EQ(3, events[0]->value.int32Values[0]); + EXPECT_EQ(1, events[0]->value.int32Values[1]); + EXPECT_EQ(11, events[0]->value.int32Values[2]); + + // Try to get create_user again, should return default value. + status = mHal->set(setValue); + ASSERT_EQ(StatusCode::OK, status); + + events = mEventQueue.flush(); + ASSERT_EQ((size_t)1, events.size()); + EXPECT_EQ(0, events[0]->areaId); + EXPECT_EQ(toInt(VehicleProperty::INITIAL_USER_INFO), events[0]->prop); + ASSERT_EQ((size_t)4, events[0]->value.int32Values.size()); + // Request ID + EXPECT_EQ(3, events[0]->value.int32Values[0]); + // ACTION: DEFAULT + EXPECT_EQ(0, events[0]->value.int32Values[1]); + // User id: 0 + EXPECT_EQ(0, events[0]->value.int32Values[2]); + // Flags: 0 + EXPECT_EQ(0, events[0]->value.int32Values[3]); +} + +TEST_F(DefaultVhalImplTest, testDebugSetInt) { + hidl_vec<hidl_string> options = {"--debughal", "--setint", + getPropIdString(VehicleProperty::INFO_MODEL_YEAR), "2022", + "1000"}; + hidl_handle fd = {}; + int memfd = createMemfd(&fd); + // Clear existing events. + mEventQueue.flush(); + + EXPECT_FALSE(mHal->dump(fd, options)); + + lseek(memfd, 0, SEEK_SET); + char buf[10240] = {}; + // The dumped info should be empty. + read(memfd, buf, sizeof(buf)); + EXPECT_STREQ("", buf); + + auto events = mEventQueue.flush(); + ASSERT_EQ((size_t)1, events.size()); + ASSERT_EQ((size_t)1, events[0]->value.int32Values.size()); + EXPECT_EQ(2022, events[0]->value.int32Values[0]); + EXPECT_EQ(1000, events[0]->timestamp); + + VehiclePropValue value; + StatusCode status; + value.prop = toInt(VehicleProperty::INFO_MODEL_YEAR); + auto gotValue = mHal->get(value, &status); + ASSERT_EQ(StatusCode::OK, status); + ASSERT_EQ((size_t)1, gotValue->value.int32Values.size()); + EXPECT_EQ(2022, gotValue->value.int32Values[0]); +} + +TEST_F(DefaultVhalImplTest, testDebugSetBool) { + char doorLeft[100]; + snprintf(doorLeft, sizeof(doorLeft), "%d", DOOR_1_LEFT); + hidl_vec<hidl_string> options = { + "--debughal", "--setbool", getPropIdString(VehicleProperty::DOOR_LOCK), + "false", "1000", doorLeft}; + hidl_handle fd = {}; + int memfd = createMemfd(&fd); + // Clear existing events. + mEventQueue.flush(); + + EXPECT_FALSE(mHal->dump(fd, options)); + + lseek(memfd, 0, SEEK_SET); + char buf[10240] = {}; + // The dumped info should be empty. + read(memfd, buf, sizeof(buf)); + EXPECT_STREQ("", buf); + + auto events = mEventQueue.flush(); + ASSERT_EQ((size_t)1, events.size()); + EXPECT_EQ(0, events[0]->value.int32Values[0]); + EXPECT_EQ(DOOR_1_LEFT, events[0]->areaId); + EXPECT_EQ(1000, events[0]->timestamp); + + VehiclePropValue value; + StatusCode status; + value.prop = toInt(VehicleProperty::DOOR_LOCK); + value.areaId = DOOR_1_LEFT; + auto gotValue = mHal->get(value, &status); + ASSERT_EQ(StatusCode::OK, status); + ASSERT_EQ((size_t)1, gotValue->value.int32Values.size()); + EXPECT_EQ(0, gotValue->value.int32Values[0]); + + value.areaId = DOOR_1_RIGHT; + gotValue = mHal->get(value, &status); + ASSERT_EQ(StatusCode::OK, status); + ASSERT_EQ((size_t)1, gotValue->value.int32Values.size()); + EXPECT_EQ(1, gotValue->value.int32Values[0]); +} + +TEST_F(DefaultVhalImplTest, testDebugSetFloat) { + hidl_vec<hidl_string> options = {"--debughal", "--setfloat", + getPropIdString(VehicleProperty::INFO_FUEL_CAPACITY), "10.5", + "1000"}; + hidl_handle fd = {}; + int memfd = createMemfd(&fd); + // Clear existing events. + mEventQueue.flush(); + + EXPECT_FALSE(mHal->dump(fd, options)); + + lseek(memfd, 0, SEEK_SET); + char buf[10240] = {}; + // The dumped info should be empty. + read(memfd, buf, sizeof(buf)); + EXPECT_STREQ("", buf); + + auto events = mEventQueue.flush(); + ASSERT_EQ((size_t)1, events.size()); + ASSERT_EQ((size_t)1, events[0]->value.floatValues.size()); + EXPECT_EQ(10.5, events[0]->value.floatValues[0]); + EXPECT_EQ(1000, events[0]->timestamp); + + VehiclePropValue value; + StatusCode status; + value.prop = toInt(VehicleProperty::INFO_FUEL_CAPACITY); + auto gotValue = mHal->get(value, &status); + ASSERT_EQ(StatusCode::OK, status); + ASSERT_EQ((size_t)1, gotValue->value.floatValues.size()); + EXPECT_EQ(10.5, gotValue->value.floatValues[0]); +} + +} // namespace diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/ProtoMessageConverter_test.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/ProtoMessageConverter_test.cpp index 3817e4406e..a507b501b8 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/ProtoMessageConverter_test.cpp +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/ProtoMessageConverter_test.cpp @@ -17,9 +17,9 @@ #include <gtest/gtest.h> #include <utils/SystemClock.h> +#include <vhal_v2_0/ProtoMessageConverter.h> #include "vhal_v2_0/DefaultConfig.h" -#include "vhal_v2_0/ProtoMessageConverter.h" #include "vhal_v2_0/VehicleUtils.h" namespace android { diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/override/gear_selection.json b/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/override/gear_selection.json new file mode 100644 index 0000000000..59666b8046 --- /dev/null +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/override/gear_selection.json @@ -0,0 +1,9 @@ +[ + { + "timestamp": 1000000, + "areaId": 0, + "value": 8, + // GEAR_SELECTION + "prop": 289408000 + } +] diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/override/hvac_temperature_set.json b/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/override/hvac_temperature_set.json new file mode 100644 index 0000000000..93a97ed095 --- /dev/null +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/override/hvac_temperature_set.json @@ -0,0 +1,10 @@ +[ + { + "timestamp": 1000000, + // HVAC_LEFT + "areaId": 49, + "value": 30, + // HVAC_TEMPERATURE_SET + "prop": 358614275 + } +] diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/prop.json b/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/prop.json new file mode 100644 index 0000000000..b881109237 --- /dev/null +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/tests/prop.json @@ -0,0 +1,26 @@ +[ + { + "timestamp": 1000000, + "areaId": 0, + "value": 8, + "prop": 289408000 + }, + { + "timestamp": 2000000, + "areaId": 0, + "value": 4, + "prop": 289408000 + }, + { + "timestamp": 3000000, + "areaId": 0, + "value": 16, + "prop": 289408000 + }, + { + "timestamp": 4000000, + "areaId": 0, + "value": 10, + "prop": 289408000 + } +] diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/userhal/Android.bp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/userhal/Android.bp new file mode 100644 index 0000000000..0058d33a6a --- /dev/null +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/userhal/Android.bp @@ -0,0 +1,31 @@ +// Copyright (C) 2021 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. + +// Library used to emulate User HAL behavior through lshal debug requests. +cc_library { + name: "android.hardware.automotive.vehicle@2.0-emulated-user-hal-lib", + vendor: true, + defaults: ["vhal_v2_0_target_defaults"], + srcs: ["EmulatedUserHal.cpp"], + shared_libs: [ + "libbase", + "libutils", + "libcutils", + ], + local_include_dirs: ["include"], + export_include_dirs: ["include"], + whole_static_libs: [ + "android.hardware.automotive.vehicle@2.0-user-hal-helper-lib", + ], +} diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedUserHal.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/userhal/EmulatedUserHal.cpp index 3bdf5a84a0..55dc01a4e6 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedUserHal.cpp +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/userhal/EmulatedUserHal.cpp @@ -15,13 +15,13 @@ */ #define LOG_TAG "EmulatedUserHal" -#include "EmulatedUserHal.h" - #include <cutils/log.h> #include <utils/SystemClock.h> #include "UserHalHelper.h" +#include "EmulatedUserHal.h" + namespace android { namespace hardware { namespace automotive { @@ -311,35 +311,37 @@ Result<std::unique_ptr<VehiclePropValue>> EmulatedUserHal::sendUserHalResponse( return response; } -void EmulatedUserHal::showDumpHelp(int fd) { - dprintf(fd, "%s: dumps state used for user management\n", kUserHalDumpOption); +std::string EmulatedUserHal::showDumpHelp() { + return fmt::format("{}: dumps state used for user management\n", kUserHalDumpOption); } -void EmulatedUserHal::dump(int fd, std::string indent) { +std::string EmulatedUserHal::dump(std::string indent) { + std::string info; if (mInitialUserResponseFromCmd != nullptr) { - dprintf(fd, "%sInitialUserInfo response: %s\n", indent.c_str(), - toString(*mInitialUserResponseFromCmd).c_str()); + info += fmt::format("{}InitialUserInfo response: {}\n", indent.c_str(), + toString(*mInitialUserResponseFromCmd).c_str()); } else { - dprintf(fd, "%sNo InitialUserInfo response\n", indent.c_str()); + info += fmt::format("{}No InitialUserInfo response\n", indent.c_str()); } if (mSwitchUserResponseFromCmd != nullptr) { - dprintf(fd, "%sSwitchUser response: %s\n", indent.c_str(), - toString(*mSwitchUserResponseFromCmd).c_str()); + info += fmt::format("{}SwitchUser response: {}\n", indent.c_str(), + toString(*mSwitchUserResponseFromCmd).c_str()); } else { - dprintf(fd, "%sNo SwitchUser response\n", indent.c_str()); + info += fmt::format("{}No SwitchUser response\n", indent.c_str()); } if (mCreateUserResponseFromCmd != nullptr) { - dprintf(fd, "%sCreateUser response: %s\n", indent.c_str(), - toString(*mCreateUserResponseFromCmd).c_str()); + info += fmt::format("{}CreateUser response: {}\n", indent.c_str(), + toString(*mCreateUserResponseFromCmd).c_str()); } else { - dprintf(fd, "%sNo CreateUser response\n", indent.c_str()); + info += fmt::format("{}No CreateUser response\n", indent.c_str()); } if (mSetUserIdentificationAssociationResponseFromCmd != nullptr) { - dprintf(fd, "%sSetUserIdentificationAssociation response: %s\n", indent.c_str(), - toString(*mSetUserIdentificationAssociationResponseFromCmd).c_str()); + info += fmt::format("{}SetUserIdentificationAssociation response: {}\n", indent.c_str(), + toString(*mSetUserIdentificationAssociationResponseFromCmd).c_str()); } else { - dprintf(fd, "%sNo SetUserIdentificationAssociation response\n", indent.c_str()); + info += fmt::format("{}No SetUserIdentificationAssociation response\n", indent.c_str()); } + return info; } } // namespace impl diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedUserHal.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/userhal/include/EmulatedUserHal.h index db2f117e3e..46f6d0f2dc 100644 --- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/EmulatedUserHal.h +++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/userhal/include/EmulatedUserHal.h @@ -17,6 +17,7 @@ #ifndef android_hardware_automotive_vehicle_V2_0_impl_EmulatedUserHal_H_ #define android_hardware_automotive_vehicle_V2_0_impl_EmulatedUserHal_H_ +#include <android-base/format.h> #include <android-base/result.h> #include <android/hardware/automotive/vehicle/2.0/types.h> @@ -32,7 +33,7 @@ namespace impl { constexpr char kUserHalDumpOption[] = "--user-hal"; /** - * Class used to emulate User HAL behavior through lshal debug requests. + * Class used to emulate a real User HAL behavior through lshal debug requests. */ class EmulatedUserHal { public: @@ -64,12 +65,12 @@ class EmulatedUserHal { /** * Shows the User HAL emulation help. */ - void showDumpHelp(int fd); + std::string showDumpHelp(); /** * Dump its contents. */ - void dump(int fd, std::string indent); + std::string dump(std::string indent); private: /** diff --git a/automotive/vehicle/2.0/default/tests/RecurrentTimer_test.cpp b/automotive/vehicle/2.0/default/tests/RecurrentTimer_test.cpp index 9fc17c6652..d7547f6556 100644 --- a/automotive/vehicle/2.0/default/tests/RecurrentTimer_test.cpp +++ b/automotive/vehicle/2.0/default/tests/RecurrentTimer_test.cpp @@ -41,7 +41,8 @@ TEST(RecurrentTimerTest, oneInterval) { timer.registerRecurrentEvent(milliseconds(1), 0xdead); std::this_thread::sleep_for(milliseconds(100)); - ASSERT_EQ_WITH_TOLERANCE(100, counter.load(), 20); + // This test is unstable, so set the tolerance to 50. + ASSERT_EQ_WITH_TOLERANCE(100, counter.load(), 50); } TEST(RecurrentTimerTest, multipleIntervals) { @@ -66,7 +67,8 @@ TEST(RecurrentTimerTest, multipleIntervals) { timer.registerRecurrentEvent(milliseconds(5), 0xbeef); std::this_thread::sleep_for(milliseconds(100)); - ASSERT_EQ_WITH_TOLERANCE(100, counter1ms.load(), 20); + // This test is unstable, so set the tolerance to 50. + ASSERT_EQ_WITH_TOLERANCE(100, counter1ms.load(), 50); ASSERT_EQ_WITH_TOLERANCE(20, counter5ms.load(), 5); } diff --git a/automotive/vehicle/2.0/default/tests/VehicleHalManager_test.cpp b/automotive/vehicle/2.0/default/tests/VehicleHalManager_test.cpp index 09750718a0..bdf46fb24c 100644 --- a/automotive/vehicle/2.0/default/tests/VehicleHalManager_test.cpp +++ b/automotive/vehicle/2.0/default/tests/VehicleHalManager_test.cpp @@ -18,6 +18,7 @@ #include <iostream> #include <android-base/macros.h> +#include <cutils/native_handle.h> #include <utils/SystemClock.h> #include <gtest/gtest.h> @@ -32,6 +33,18 @@ namespace automotive { namespace vehicle { namespace V2_0 { +// A simple helper class to expose 'cmdSetOneProperty' to the unit tests. +class VehicleHalManagerTestHelper { + public: + VehicleHalManagerTestHelper(VehicleHalManager* manager) { mManager = manager; } + bool cmdSetOneProperty(int fd, const hidl_vec<hidl_string>& options) { + return mManager->cmdSetOneProperty(fd, options); + } + + public: + VehicleHalManager* mManager; +}; + namespace { using namespace std::placeholders; @@ -57,33 +70,21 @@ public: auto property = static_cast<VehicleProperty>(requestedPropValue.prop); int32_t areaId = requestedPropValue.areaId; - switch (property) { - case VehicleProperty::INFO_MAKE: - pValue = getValuePool()->obtainString(kCarMake); - break; - case VehicleProperty::INFO_FUEL_CAPACITY: - if (fuelCapacityAttemptsLeft-- > 0) { - // Emulate property not ready yet. - *outStatus = StatusCode::TRY_AGAIN; - } else { - pValue = getValuePool()->obtainFloat(42.42); - } - break; - default: - if (requestedPropValue.prop == kCustomComplexProperty) { - pValue = getValuePool()->obtainComplex(); - pValue->value.int32Values = hidl_vec<int32_t> { 10, 20 }; - pValue->value.int64Values = hidl_vec<int64_t> { 30, 40 }; - pValue->value.floatValues = hidl_vec<float_t> { 1.1, 2.2 }; - pValue->value.bytes = hidl_vec<uint8_t> { 1, 2, 3 }; - pValue->value.stringValue = kCarMake; - break; - } - auto key = makeKey(toInt(property), areaId); - if (mValues.count(key) == 0) { - ALOGW(""); - } - pValue = getValuePool()->obtain(mValues[key]); + if (property == VehicleProperty::INFO_FUEL_CAPACITY) { + if (fuelCapacityAttemptsLeft-- > 0) { + // Emulate property not ready yet. + *outStatus = StatusCode::TRY_AGAIN; + } else { + pValue = getValuePool()->obtainFloat(42.42); + } + } else { + auto key = makeKey(requestedPropValue); + if (mValues.count(key) == 0) { + ALOGW("key not found\n"); + *outStatus = StatusCode::INVALID_ARG; + return pValue; + } + pValue = getValuePool()->obtain(mValues[key]); } if (*outStatus == StatusCode::OK && pValue.get() != nullptr) { @@ -100,7 +101,6 @@ public: && mirrorFoldAttemptsLeft-- > 0) { return StatusCode::TRY_AGAIN; } - mValues[makeKey(propValue)] = propValue; return StatusCode::OK; } @@ -181,6 +181,18 @@ public: actualStatusCode = refStatus; } + MockedVehicleHal::VehiclePropValuePtr getComplexProperty() { + auto pValue = objectPool->obtainComplex(); + pValue->prop = kCustomComplexProperty; + pValue->areaId = 0; + pValue->value.int32Values = hidl_vec<int32_t>{10, 20}; + pValue->value.int64Values = hidl_vec<int64_t>{30, 40}; + pValue->value.floatValues = hidl_vec<float_t>{1.1, 2.2}; + pValue->value.bytes = hidl_vec<uint8_t>{1, 2, 3}; + pValue->value.stringValue = kCarMake; + return pValue; + } + public: VehiclePropValue actualValue; StatusCode actualStatusCode; @@ -308,6 +320,8 @@ TEST_F(VehicleHalManagerTest, subscribe_WriteOnly) { } TEST_F(VehicleHalManagerTest, get_Complex) { + ASSERT_EQ(StatusCode::OK, hal->set(*getComplexProperty().get())); + invokeGet(kCustomComplexProperty, 0); ASSERT_EQ(StatusCode::OK, actualStatusCode); @@ -334,6 +348,11 @@ TEST_F(VehicleHalManagerTest, get_Complex) { } TEST_F(VehicleHalManagerTest, get_StaticString) { + auto pValue = objectPool->obtainString(kCarMake); + pValue->prop = toInt(VehicleProperty::INFO_MAKE); + pValue->areaId = 0; + ASSERT_EQ(StatusCode::OK, hal->set(*pValue.get())); + invokeGet(toInt(VehicleProperty::INFO_MAKE), 0); ASSERT_EQ(StatusCode::OK, actualStatusCode); @@ -458,6 +477,138 @@ TEST(HalClientVectorTest, basic) { ASSERT_TRUE(clients.isEmpty()); } +TEST_F(VehicleHalManagerTest, debug) { + hidl_handle fd = {}; + fd.setTo(native_handle_create(/*numFds=*/1, /*numInts=*/0), /*shouldOwn=*/true); + + // Because debug function returns void, so no way to check return value. + manager->debug(fd, {}); + manager->debug(fd, {"--help"}); + manager->debug(fd, {"--list"}); + manager->debug(fd, {"--get"}); + manager->debug(fd, {"--set"}); + manager->debug(fd, {"invalid"}); +} + +struct SetPropTestCase { + std::string test_name; + const hidl_vec<hidl_string> configs; + bool success; +}; + +class VehicleHalManagerSetPropTest : public VehicleHalManagerTest, + public testing::WithParamInterface<SetPropTestCase> {}; + +TEST_P(VehicleHalManagerSetPropTest, cmdSetOneProperty) { + const SetPropTestCase& tc = GetParam(); + VehicleHalManagerTestHelper helper(manager.get()); + ASSERT_EQ(tc.success, helper.cmdSetOneProperty(STDERR_FILENO, tc.configs)); +} + +std::vector<SetPropTestCase> GenSetPropParams() { + char infoMakeProperty[100] = {}; + snprintf(infoMakeProperty, sizeof(infoMakeProperty), "%d", toInt(VehicleProperty::INFO_MAKE)); + return { + {"success_set_string", {"--set", infoMakeProperty, "-s", kCarMake}, true}, + {"success_set_bytes", {"--set", infoMakeProperty, "-b", "0xdeadbeef"}, true}, + {"success_set_bytes_caps", {"--set", infoMakeProperty, "-b", "0xDEADBEEF"}, true}, + {"success_set_int", {"--set", infoMakeProperty, "-i", "2147483647"}, true}, + {"success_set_ints", + {"--set", infoMakeProperty, "-i", "2147483647", "0", "-2147483648"}, + true}, + {"success_set_int64", + {"--set", infoMakeProperty, "-i64", "-9223372036854775808"}, + true}, + {"success_set_int64s", + {"--set", infoMakeProperty, "-i64", "-9223372036854775808", "0", + "9223372036854775807"}, + true}, + {"success_set_float", {"--set", infoMakeProperty, "-f", "1.175494351E-38"}, true}, + {"success_set_floats", + {"--set", infoMakeProperty, "-f", "-3.402823466E+38", "0", "3.402823466E+38"}, + true}, + {"success_set_area", {"--set", infoMakeProperty, "-a", "2147483647"}, true}, + {"fail_no_options", {}, false}, + {"fail_less_than_4_options", {"--set", infoMakeProperty, "-i"}, false}, + {"fail_unknown_options", {"--set", infoMakeProperty, "-s", kCarMake, "-abcd"}, false}, + {"fail_invalid_property", {"--set", "not valid", "-s", kCarMake}, false}, + {"fail_duplicate_string", + {"--set", infoMakeProperty, "-s", kCarMake, "-s", kCarMake}, + false}, + {"fail_multiple_strings", {"--set", infoMakeProperty, "-s", kCarMake, kCarMake}, false}, + {"fail_no_string_value", {"--set", infoMakeProperty, "-s", "-a", "1234"}, false}, + {"fail_duplicate_bytes", + {"--set", infoMakeProperty, "-b", "0xdeadbeef", "-b", "0xdeadbeef"}, + false}, + {"fail_multiple_bytes", + {"--set", infoMakeProperty, "-b", "0xdeadbeef", "0xdeadbeef"}, + false}, + {"fail_invalid_bytes", {"--set", infoMakeProperty, "-b", "0xgood"}, false}, + {"fail_invalid_bytes_no_prefix", {"--set", infoMakeProperty, "-b", "deadbeef"}, false}, + {"fail_invalid_int", {"--set", infoMakeProperty, "-i", "abc"}, false}, + {"fail_int_out_of_range", {"--set", infoMakeProperty, "-i", "2147483648"}, false}, + {"fail_no_int_value", {"--set", infoMakeProperty, "-i", "-s", kCarMake}, false}, + {"fail_invalid_int64", {"--set", infoMakeProperty, "-i64", "abc"}, false}, + {"fail_int64_out_of_range", + {"--set", infoMakeProperty, "-i64", "-9223372036854775809"}, + false}, + {"fail_no_int64_value", {"--set", infoMakeProperty, "-i64", "-s", kCarMake}, false}, + {"fail_invalid_float", {"--set", infoMakeProperty, "-f", "abc"}, false}, + {"fail_float_out_of_range", + {"--set", infoMakeProperty, "-f", "-3.402823466E+39"}, + false}, + {"fail_no_float_value", {"--set", infoMakeProperty, "-f", "-s", kCarMake}, false}, + {"fail_multiple_areas", {"--set", infoMakeProperty, "-a", "2147483648", "0"}, false}, + {"fail_invalid_area", {"--set", infoMakeProperty, "-a", "abc"}, false}, + {"fail_area_out_of_range", {"--set", infoMakeProperty, "-a", "2147483648"}, false}, + {"fail_no_area_value", {"--set", infoMakeProperty, "-a", "-s", kCarMake}, false}, + }; +} + +INSTANTIATE_TEST_SUITE_P( + VehicleHalManagerSetPropTests, VehicleHalManagerSetPropTest, + testing::ValuesIn(GenSetPropParams()), + [](const testing::TestParamInfo<VehicleHalManagerSetPropTest::ParamType>& info) { + return info.param.test_name; + }); + +TEST_F(VehicleHalManagerTest, SetComplexPropTest) { + char infoMakeProperty[100] = {}; + snprintf(infoMakeProperty, sizeof(infoMakeProperty), "%d", toInt(VehicleProperty::INFO_MAKE)); + VehicleHalManagerTestHelper helper(manager.get()); + ASSERT_TRUE(helper.cmdSetOneProperty( + STDERR_FILENO, {"--set", infoMakeProperty, "-s", kCarMake, + "-b", "0xdeadbeef", "-i", "2147483647", + "0", "-2147483648", "-i64", "-9223372036854775808", + "0", "9223372036854775807", "-f", "-3.402823466E+38", + "0", "3.402823466E+38", "-a", "123"})); + StatusCode status = StatusCode::OK; + VehiclePropValue requestProp; + requestProp.prop = toInt(VehicleProperty::INFO_MAKE); + requestProp.areaId = 123; + auto value = hal->get(requestProp, &status); + ASSERT_EQ(StatusCode::OK, status); + ASSERT_EQ(value->prop, toInt(VehicleProperty::INFO_MAKE)); + ASSERT_EQ(value->areaId, 123); + ASSERT_STREQ(kCarMake, value->value.stringValue.c_str()); + uint8_t bytes[] = {0xde, 0xad, 0xbe, 0xef}; + ASSERT_FALSE(memcmp(bytes, value->value.bytes.data(), sizeof(bytes))); + ASSERT_EQ(3u, value->value.int32Values.size()); + ASSERT_EQ(2147483647, value->value.int32Values[0]); + ASSERT_EQ(0, value->value.int32Values[1]); + ASSERT_EQ(-2147483648, value->value.int32Values[2]); + ASSERT_EQ(3u, value->value.int64Values.size()); + // -9223372036854775808 is not a valid literal since '-' and '9223372036854775808' would be two + // tokens and the later does not fit in unsigned long long. + ASSERT_EQ(-9223372036854775807 - 1, value->value.int64Values[0]); + ASSERT_EQ(0, value->value.int64Values[1]); + ASSERT_EQ(9223372036854775807, value->value.int64Values[2]); + ASSERT_EQ(3u, value->value.floatValues.size()); + ASSERT_EQ(-3.402823466E+38f, value->value.floatValues[0]); + ASSERT_EQ(0.0f, value->value.floatValues[1]); + ASSERT_EQ(3.402823466E+38f, value->value.floatValues[2]); +} + } // namespace anonymous } // namespace V2_0 diff --git a/automotive/vehicle/2.0/default/tests/VehicleObjectPool_test.cpp b/automotive/vehicle/2.0/default/tests/VehicleObjectPool_test.cpp index 4e3ade15a3..096816600f 100644 --- a/automotive/vehicle/2.0/default/tests/VehicleObjectPool_test.cpp +++ b/automotive/vehicle/2.0/default/tests/VehicleObjectPool_test.cpp @@ -58,10 +58,12 @@ public: TEST_F(VehicleObjectPoolTest, valuePoolBasicCorrectness) { auto value = valuePool->obtain(VehiclePropertyType::INT32); - // At this point, v1 should be recycled and the only object in the pool. - ASSERT_EQ(value.get(), valuePool->obtain(VehiclePropertyType::INT32).get()); + void* raw = value.get(); + value.reset(); + // At this point, value should be recycled and the only object in the pool. + ASSERT_EQ(raw, valuePool->obtain(VehiclePropertyType::INT32).get()); // Obtaining value of another type - should return a new object - ASSERT_NE(value.get(), valuePool->obtain(VehiclePropertyType::FLOAT).get()); + ASSERT_NE(raw, valuePool->obtain(VehiclePropertyType::FLOAT).get()); ASSERT_EQ(3u, stats->Obtained); ASSERT_EQ(2u, stats->Created); diff --git a/automotive/vehicle/aidl/Android.bp b/automotive/vehicle/aidl/Android.bp new file mode 100644 index 0000000000..477f8ed3e6 --- /dev/null +++ b/automotive/vehicle/aidl/Android.bp @@ -0,0 +1,40 @@ +// Copyright (C) 2021 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. + +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "hardware_interfaces_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["hardware_interfaces_license"], +} + +aidl_interface { + name: "android.hardware.automotive.vehicle", + vendor_available: true, + srcs: [ + "android/hardware/automotive/vehicle/**/*.aidl", + ], + // TODO(b/148703287) Make it stable with new APIs + unstable: true, + backend: { + cpp: { + enabled: true, + }, + java: { + sdk_version: "module_current", + }, + }, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/CreateUserRequest.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/CreateUserRequest.aidl new file mode 100644 index 0000000000..95537dc368 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/CreateUserRequest.aidl @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.UserInfo; +import android.hardware.automotive.vehicle.UsersInfo; + +/** + * Defines the format of a CREATE_USER property. + * + * NOTE: this struct is not used in the HAL properties directly, it must be converted to + * VehiclePropValue.RawValue through libraries provided by the default Vehicle HAL implementation. + */ +// @VintfStability +parcelable CreateUserRequest { + /** + * Arbitrary id used to map the response to the request. + */ + int requestId; + /** + * Basic information about Android user that was created. + */ + UserInfo newUserInfo; + /** + * Name of the new Android user. + */ + @utf8InCpp String newUserName; + /** + * Information about the current state of the Android system. + */ + UsersInfo usersInfo; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/CreateUserResponse.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/CreateUserResponse.aidl new file mode 100644 index 0000000000..0588052ef4 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/CreateUserResponse.aidl @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.CreateUserStatus; + +/** + * Defines the result of a CreateUserRequest. + * + * NOTE: this struct is not used in the HAL properties directly, it must be converted to + * VehiclePropValue.RawValue through libraries provided by the default Vehicle HAL implementation. + */ +// @VintfStability +parcelable CreateUserResponse { + /** + * Id of the request being responded. + */ + int requestId; + /** + * Status of the request. + */ + CreateUserStatus status; + /** + * HAL-specific error message. + * + * This argument is optional, and when defined, it's passed "as-is" to the caller. It could be + * used to show custom error messages to the end user. + */ + @utf8InCpp String errorMessage; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/CreateUserStatus.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/CreateUserStatus.aidl new file mode 100644 index 0000000000..f841ff6578 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/CreateUserStatus.aidl @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Status of the response to a CreateUserRequest. + */ +// @VintfStability +@Backing(type="int") +enum CreateUserStatus { + /** + * The request succeeded (for example, HAL created a new internal user, or associated the + * Android user to an existing internal user). + */ + SUCCESS = 1, + /** + * The request failed (and Android will remove the Android user). + */ + FAILURE = 2, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/CustomInputType.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/CustomInputType.aidl new file mode 100644 index 0000000000..1335eea669 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/CustomInputType.aidl @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Input code values for HW_CUSTOM_INPUT. + */ +// @VintfStability +@Backing(type="int") +enum CustomInputType { + /** + * Ten functions representing the custom input code to be defined and implemented by OEM + * partners. + * + * OEMs need to formally contact Android team if more than 10 functions are required. + */ + CUSTOM_EVENT_F1 = 1001, + CUSTOM_EVENT_F2 = 1002, + CUSTOM_EVENT_F3 = 1003, + CUSTOM_EVENT_F4 = 1004, + CUSTOM_EVENT_F5 = 1005, + CUSTOM_EVENT_F6 = 1006, + CUSTOM_EVENT_F7 = 1007, + CUSTOM_EVENT_F8 = 1008, + CUSTOM_EVENT_F9 = 1009, + CUSTOM_EVENT_F10 = 1010, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/DiagnosticFloatSensorIndex.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/DiagnosticFloatSensorIndex.aidl new file mode 100644 index 0000000000..017589fe6e --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/DiagnosticFloatSensorIndex.aidl @@ -0,0 +1,314 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * This enum provides the canonical mapping for sensor properties that have a floating-point value. + * The ordering of the values is taken from the OBD2 specification. + * Any value greater than the last reserved index is available to vendors to map their extensions. + * While these values do not directly map to SAE J1979 PIDs, an equivalence is listed next + * to each one to aid implementors. + */ +// @VintfStability +@Backing(type="int") +enum DiagnosticFloatSensorIndex { + CALCULATED_ENGINE_LOAD = 0, + /* + * PID 0x04 + */ + ENGINE_COOLANT_TEMPERATURE = 1, + /* + * PID 0x05 + */ + SHORT_TERM_FUEL_TRIM_BANK1 = 2, + /* + * PID 0x06 + */ + LONG_TERM_FUEL_TRIM_BANK1 = 3, + /* + * PID 0x07 + */ + SHORT_TERM_FUEL_TRIM_BANK2 = 4, + /* + * PID 0x08 + */ + LONG_TERM_FUEL_TRIM_BANK2 = 5, + /* + * PID 0x09 + */ + FUEL_PRESSURE = 6, + /* + * PID 0x0A + */ + INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 7, + /* + * PID 0x0B + */ + ENGINE_RPM = 8, + /* + * PID 0x0C + */ + VEHICLE_SPEED = 9, + /* + * PID 0x0D + */ + TIMING_ADVANCE = 10, + /* + * PID 0x0E + */ + MAF_AIR_FLOW_RATE = 11, + /* + * PID 0x10 + */ + THROTTLE_POSITION = 12, + /* + * PID 0x11 + */ + OXYGEN_SENSOR1_VOLTAGE = 13, + /* + * PID 0x14 + */ + OXYGEN_SENSOR1_SHORT_TERM_FUEL_TRIM = 14, + /* + * PID 0x14 + */ + OXYGEN_SENSOR1_FUEL_AIR_EQUIVALENCE_RATIO = 15, + /* + * PID 0x24 + */ + OXYGEN_SENSOR2_VOLTAGE = 16, + /* + * PID 0x15 + */ + OXYGEN_SENSOR2_SHORT_TERM_FUEL_TRIM = 17, + /* + * PID 0x15 + */ + OXYGEN_SENSOR2_FUEL_AIR_EQUIVALENCE_RATIO = 18, + /* + * PID 0x25 + */ + OXYGEN_SENSOR3_VOLTAGE = 19, + /* + * PID 0x16 + */ + OXYGEN_SENSOR3_SHORT_TERM_FUEL_TRIM = 20, + /* + * PID 0x16 + */ + OXYGEN_SENSOR3_FUEL_AIR_EQUIVALENCE_RATIO = 21, + /* + * PID 0x26 + */ + OXYGEN_SENSOR4_VOLTAGE = 22, + /* + * PID 0x17 + */ + OXYGEN_SENSOR4_SHORT_TERM_FUEL_TRIM = 23, + /* + * PID 0x17 + */ + OXYGEN_SENSOR4_FUEL_AIR_EQUIVALENCE_RATIO = 24, + /* + * PID 0x27 + */ + OXYGEN_SENSOR5_VOLTAGE = 25, + /* + * PID 0x18 + */ + OXYGEN_SENSOR5_SHORT_TERM_FUEL_TRIM = 26, + /* + * PID 0x18 + */ + OXYGEN_SENSOR5_FUEL_AIR_EQUIVALENCE_RATIO = 27, + /* + * PID 0x28 + */ + OXYGEN_SENSOR6_VOLTAGE = 28, + /* + * PID 0x19 + */ + OXYGEN_SENSOR6_SHORT_TERM_FUEL_TRIM = 29, + /* + * PID 0x19 + */ + OXYGEN_SENSOR6_FUEL_AIR_EQUIVALENCE_RATIO = 30, + /* + * PID 0x29 + */ + OXYGEN_SENSOR7_VOLTAGE = 31, + /* + * PID 0x1A + */ + OXYGEN_SENSOR7_SHORT_TERM_FUEL_TRIM = 32, + /* + * PID 0x1A + */ + OXYGEN_SENSOR7_FUEL_AIR_EQUIVALENCE_RATIO = 33, + /* + * PID 0x2A + */ + OXYGEN_SENSOR8_VOLTAGE = 34, + /* + * PID 0x1B + */ + OXYGEN_SENSOR8_SHORT_TERM_FUEL_TRIM = 35, + /* + * PID 0x1B + */ + OXYGEN_SENSOR8_FUEL_AIR_EQUIVALENCE_RATIO = 36, + /* + * PID 0x2B + */ + FUEL_RAIL_PRESSURE = 37, + /* + * PID 0x22 + */ + FUEL_RAIL_GAUGE_PRESSURE = 38, + /* + * PID 0x23 + */ + COMMANDED_EXHAUST_GAS_RECIRCULATION = 39, + /* + * PID 0x2C + */ + EXHAUST_GAS_RECIRCULATION_ERROR = 40, + /* + * PID 0x2D + */ + COMMANDED_EVAPORATIVE_PURGE = 41, + /* + * PID 0x2E + */ + FUEL_TANK_LEVEL_INPUT = 42, + /* + * PID 0x2F + */ + EVAPORATION_SYSTEM_VAPOR_PRESSURE = 43, + /* + * PID 0x32 + */ + CATALYST_TEMPERATURE_BANK1_SENSOR1 = 44, + /* + * PID 0x3C + */ + CATALYST_TEMPERATURE_BANK2_SENSOR1 = 45, + /* + * PID 0x3D + */ + CATALYST_TEMPERATURE_BANK1_SENSOR2 = 46, + /* + * PID 0x3E + */ + CATALYST_TEMPERATURE_BANK2_SENSOR2 = 47, + /* + * PID 0x3F + */ + ABSOLUTE_LOAD_VALUE = 48, + /* + * PID 0x43 + */ + FUEL_AIR_COMMANDED_EQUIVALENCE_RATIO = 49, + /* + * PID 0x44 + */ + RELATIVE_THROTTLE_POSITION = 50, + /* + * PID 0x45 + */ + ABSOLUTE_THROTTLE_POSITION_B = 51, + /* + * PID 0x47 + */ + ABSOLUTE_THROTTLE_POSITION_C = 52, + /* + * PID 0x48 + */ + ACCELERATOR_PEDAL_POSITION_D = 53, + /* + * PID 0x49 + */ + ACCELERATOR_PEDAL_POSITION_E = 54, + /* + * PID 0x4A + */ + ACCELERATOR_PEDAL_POSITION_F = 55, + /* + * PID 0x4B + */ + COMMANDED_THROTTLE_ACTUATOR = 56, + /* + * PID 0x4C + */ + ETHANOL_FUEL_PERCENTAGE = 57, + /* + * PID 0x52 + */ + ABSOLUTE_EVAPORATION_SYSTEM_VAPOR_PRESSURE = 58, + /* + * PID 0x53 + */ + SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 59, + /* + * PID 0x55 + */ + SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 60, + /* + * PID 0x57 + */ + SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 61, + /* + * PID 0x55 + */ + SHORT_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 62, + /* + * PID 0x57 + */ + LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK1 = 63, + /* + * PID 0x56 + */ + LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK2 = 64, + /* + * PID 0x58 + */ + LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK3 = 65, + /* + * PID 0x56 + */ + LONG_TERM_SECONDARY_OXYGEN_SENSOR_TRIM_BANK4 = 66, + /* + * PID 0x58 + */ + RELATIVE_ACCELERATOR_PEDAL_POSITION = 67, + /* + * PID 0x5A + */ + HYBRID_BATTERY_PACK_REMAINING_LIFE = 68, + /* + * PID 0x5B + */ + FUEL_INJECTION_TIMING = 69, + /* + * PID 0x5D + */ + ENGINE_FUEL_RATE = 70, + /* + * PID 0x5E + */ + // LAST_SYSTEM_INDEX = ENGINE_FUEL_RATE, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/DiagnosticIntegerSensorIndex.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/DiagnosticIntegerSensorIndex.aidl new file mode 100644 index 0000000000..86c8a459c4 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/DiagnosticIntegerSensorIndex.aidl @@ -0,0 +1,178 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * This enum provides the canonical mapping for sensor properties that have an integer value. + * The ordering of the values is taken from the OBD2 specification. + * Some of the properties are represented as an integer mapping to another enum. In those cases + * expect a comment by the property definition describing the enum to look at for the mapping. + * Any value greater than the last reserved index is available to vendors to map their extensions. + * While these values do not directly map to SAE J1979 PIDs, an equivalence is listed next + * to each one to aid implementors. + */ +// @VintfStability +@Backing(type="int") +enum DiagnosticIntegerSensorIndex { + /** + * refer to FuelSystemStatus for a description of this value. + */ + FUEL_SYSTEM_STATUS = 0, + /* + * PID 0x03 + */ + MALFUNCTION_INDICATOR_LIGHT_ON = 1, + /* + * PID 0x01 + * + * + * refer to IgnitionMonitorKind for a description of this value. + */ + IGNITION_MONITORS_SUPPORTED = 2, + /* + * PID 0x01 + * + * + * The value of this sensor is a bitmask that specifies whether ignition-specific + * tests are available and whether they are complete. The semantics of the individual + * bits in this value are given by, respectively, SparkIgnitionMonitors and + * CompressionIgnitionMonitors depending on the value of IGNITION_MONITORS_SUPPORTED. + */ + IGNITION_SPECIFIC_MONITORS = 3, + /* + * PID 0x01 + */ + INTAKE_AIR_TEMPERATURE = 4, + /* + * PID 0x0F + * + * + * refer to SecondaryAirStatus for a description of this value. + */ + COMMANDED_SECONDARY_AIR_STATUS = 5, + /* + * PID 0x12 + */ + NUM_OXYGEN_SENSORS_PRESENT = 6, + /* + * PID 0x13 + */ + RUNTIME_SINCE_ENGINE_START = 7, + /* + * PID 0x1F + */ + DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON = 8, + /* + * PID 0x21 + */ + WARMUPS_SINCE_CODES_CLEARED = 9, + /* + * PID 0x30 + */ + DISTANCE_TRAVELED_SINCE_CODES_CLEARED = 10, + /* + * PID 0x31 + */ + ABSOLUTE_BAROMETRIC_PRESSURE = 11, + /* + * PID 0x33 + */ + CONTROL_MODULE_VOLTAGE = 12, + /* + * PID 0x42 + */ + AMBIENT_AIR_TEMPERATURE = 13, + /* + * PID 0x46 + */ + TIME_WITH_MALFUNCTION_LIGHT_ON = 14, + /* + * PID 0x4D + */ + TIME_SINCE_TROUBLE_CODES_CLEARED = 15, + /* + * PID 0x4E + */ + MAX_FUEL_AIR_EQUIVALENCE_RATIO = 16, + /* + * PID 0x4F + */ + MAX_OXYGEN_SENSOR_VOLTAGE = 17, + /* + * PID 0x4F + */ + MAX_OXYGEN_SENSOR_CURRENT = 18, + /* + * PID 0x4F + */ + MAX_INTAKE_MANIFOLD_ABSOLUTE_PRESSURE = 19, + /* + * PID 0x4F + */ + MAX_AIR_FLOW_RATE_FROM_MASS_AIR_FLOW_SENSOR = 20, + /* + * PID 0x50 + * + * + * refer to FuelType for a description of this value. + */ + FUEL_TYPE = 21, + /* + * PID 0x51 + */ + FUEL_RAIL_ABSOLUTE_PRESSURE = 22, + /* + * PID 0x59 + */ + ENGINE_OIL_TEMPERATURE = 23, + /* + * PID 0x5C + */ + DRIVER_DEMAND_PERCENT_TORQUE = 24, + /* + * PID 0x61 + */ + ENGINE_ACTUAL_PERCENT_TORQUE = 25, + /* + * PID 0x62 + */ + ENGINE_REFERENCE_PERCENT_TORQUE = 26, + /* + * PID 0x63 + */ + ENGINE_PERCENT_TORQUE_DATA_IDLE = 27, + /* + * PID 0x64 + */ + ENGINE_PERCENT_TORQUE_DATA_POINT1 = 28, + /* + * PID 0x64 + */ + ENGINE_PERCENT_TORQUE_DATA_POINT2 = 29, + /* + * PID 0x64 + */ + ENGINE_PERCENT_TORQUE_DATA_POINT3 = 30, + /* + * PID 0x64 + */ + ENGINE_PERCENT_TORQUE_DATA_POINT4 = 31, + /* + * PID 0x64 + */ + // LAST_SYSTEM_INDEX = 31, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ElectronicTollCollectionCardStatus.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ElectronicTollCollectionCardStatus.aidl new file mode 100644 index 0000000000..cb55ffa10b --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ElectronicTollCollectionCardStatus.aidl @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Used by ELECTRONIC_TOLL_COLLECTION_CARD_STATUS. + */ +// @VintfStability +@Backing(type="int") +enum ElectronicTollCollectionCardStatus { + UNKNOWN = 0, + ELECTRONIC_TOLL_COLLECTION_CARD_VALID = 1, + ELECTRONIC_TOLL_COLLECTION_CARD_INVALID = 2, + ELECTRONIC_TOLL_COLLECTION_CARD_NOT_INSERTED = 3, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ElectronicTollCollectionCardType.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ElectronicTollCollectionCardType.aidl new file mode 100644 index 0000000000..78254fb30f --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ElectronicTollCollectionCardType.aidl @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Used by ELECTRONIC_TOLL_COLLECTION_CARD_TYPE. + */ +// @VintfStability +@Backing(type="int") +enum ElectronicTollCollectionCardType { + UNKNOWN = 0, + JP_ELECTRONIC_TOLL_COLLECTION_CARD = 1, + JP_ELECTRONIC_TOLL_COLLECTION_CARD_V2 = 2, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/EvConnectorType.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/EvConnectorType.aidl new file mode 100644 index 0000000000..fc95bb0f10 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/EvConnectorType.aidl @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Used by INFO_EV_CONNECTOR_TYPE to enumerate the type of connectors + * available to charge the vehicle. + */ +// @VintfStability +@Backing(type="int") +enum EvConnectorType { + /** + * Default type if the vehicle does not know or report the EV connector + * type. + */ + UNKNOWN = 0, + IEC_TYPE_1_AC = 1, + IEC_TYPE_2_AC = 2, + IEC_TYPE_3_AC = 3, + IEC_TYPE_4_DC = 4, + IEC_TYPE_1_CCS_DC = 5, + IEC_TYPE_2_CCS_DC = 6, + TESLA_ROADSTER = 7, + TESLA_HPWC = 8, + TESLA_SUPERCHARGER = 9, + GBT_AC = 10, + GBT_DC = 11, + /** + * Connector type to use when no other types apply. Before using this + * value, work with Google to see if the EvConnectorType enum can be + * extended with an appropriate value. + */ + OTHER = 101, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/EvsServiceRequestIndex.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/EvsServiceRequestIndex.aidl new file mode 100644 index 0000000000..6853ccd570 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/EvsServiceRequestIndex.aidl @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Index in int32VAlues for VehicleProperty#EVS_SERVICE_REQUEST property. + */ +// @VintfStability +@Backing(type="int") +enum EvsServiceRequestIndex { + TYPE = 0, + STATE = 1, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/EvsServiceState.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/EvsServiceState.aidl new file mode 100644 index 0000000000..e351949f71 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/EvsServiceState.aidl @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Used by EVS_SERVICE_REQUEST to enumerate the service's state. + */ +// @VintfStability +@Backing(type="int") +enum EvsServiceState { + OFF = 0, + ON = 1, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/EvsServiceType.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/EvsServiceType.aidl new file mode 100644 index 0000000000..4ca241a308 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/EvsServiceType.aidl @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Used by EVS_SERVICE_REQUEST to enumerate the service's type. + */ +// @VintfStability +@Backing(type="int") +enum EvsServiceType { + REARVIEW = 0, + SURROUNDVIEW = 1, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/FuelType.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/FuelType.aidl new file mode 100644 index 0000000000..131ac148ee --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/FuelType.aidl @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Used by INFO_FUEL_TYPE to enumerate the type of fuels this vehicle uses. + * Consistent with projection protocol. + */ +// @VintfStability +@Backing(type="int") +enum FuelType { + /** + * Fuel type to use if the HU does not know on which types of fuel the vehicle + * runs. The use of this value is generally discouraged outside of aftermarket units. + */ + FUEL_TYPE_UNKNOWN = 0, + /** + * Unleaded gasoline + */ + FUEL_TYPE_UNLEADED = 1, + /** + * Leaded gasoline + */ + FUEL_TYPE_LEADED = 2, + /** + * Diesel #1 + */ + FUEL_TYPE_DIESEL_1 = 3, + /** + * Diesel #2 + */ + FUEL_TYPE_DIESEL_2 = 4, + /** + * Biodiesel + */ + FUEL_TYPE_BIODIESEL = 5, + /** + * 85% ethanol/gasoline blend + */ + FUEL_TYPE_E85 = 6, + /** + * Liquified petroleum gas + */ + FUEL_TYPE_LPG = 7, + /** + * Compressed natural gas + */ + FUEL_TYPE_CNG = 8, + /** + * Liquified natural gas + */ + FUEL_TYPE_LNG = 9, + /** + * Electric + */ + FUEL_TYPE_ELECTRIC = 10, + /** + * Hydrogen fuel cell + */ + FUEL_TYPE_HYDROGEN = 11, + /** + * Fuel type to use when no other types apply. Before using this value, work with + * Google to see if the FuelType enum can be extended with an appropriate value. + */ + FUEL_TYPE_OTHER = 12, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicle.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicle.aidl new file mode 100644 index 0000000000..acb840995e --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicle.aidl @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.IVehicleCallback; +import android.hardware.automotive.vehicle.StatusCode; +import android.hardware.automotive.vehicle.SubscribeOptions; +import android.hardware.automotive.vehicle.VehiclePropConfig; +import android.hardware.automotive.vehicle.VehiclePropValue; + +// @VintfStability +interface IVehicle { + // Adding return type to method instead of out param String s since there is only one return + // value. + /** + * Print out debugging state for the vehicle hal. + * + * The text must be in ASCII encoding only. + * + * Performance requirements: + * + * The HAL must return from this call in less than 10ms. This call must avoid + * deadlocks, as it may be called at any point of operation. Any synchronization + * primitives used (such as mutex locks or semaphores) must be acquired + * with a timeout. + * + */ + String debugDump(); + + /** + * Get a vehicle property value. + * + * For VehiclePropertyChangeMode::STATIC properties, this method must always + * return the same value always. + * For VehiclePropertyChangeMode::ON_CHANGE properties, it must return the + * latest available value. + * + * Some properties like RADIO_PRESET requires to pass additional data in + * GET request in VehiclePropValue object. + * + * If there is no data available yet, which can happen during initial stage, + * this call must return immediately with an error code of + * StatusCode::TRY_AGAIN. + */ + StatusCode get(in VehiclePropValue requestedPropValue, out VehiclePropValue propValue); + + // Adding return type to method instead of out param VehiclePropConfig[] propConfigs since there + // is only one return value. + /** + * Returns a list of all property configurations supported by this vehicle + * HAL. + */ + VehiclePropConfig[] getAllPropConfigs(); + + /** + * Returns a list of property configurations for given properties. + * + * If requested VehicleProperty wasn't found it must return + * StatusCode::INVALID_ARG, otherwise a list of vehicle property + * configurations with StatusCode::OK + */ + StatusCode getPropConfigs(in int[] props, out VehiclePropConfig[] propConfigs); + + // Adding return type to method instead of out param StatusCode status since there is only one + // return value. + /** + * Set a vehicle property value. + * + * Timestamp of data must be ignored for set operation. + * + * Setting some properties require having initial state available. If initial + * data is not available yet this call must return StatusCode::TRY_AGAIN. + * For a property with separate power control this call must return + * StatusCode::NOT_AVAILABLE error if property is not powered on. + */ + StatusCode set(in VehiclePropValue propValue); + + // Adding return type to method instead of out param StatusCode status since there is only one + // return value. + /** + * Subscribes to property events. + * + * Clients must be able to subscribe to multiple properties at a time + * depending on data provided in options argument. + * + * @param listener This client must be called on appropriate event. + * @param options List of options to subscribe. SubscribeOption contains + * information such as property Id, area Id, sample rate, etc. + */ + StatusCode subscribe(in IVehicleCallback callback, in SubscribeOptions[] options); + + // Adding return type to method instead of out param StatusCode status since there is only one + // return value. + /** + * Unsubscribes from property events. + * + * If this client wasn't subscribed to the given property, this method + * must return StatusCode::INVALID_ARG. + */ + StatusCode unsubscribe(in IVehicleCallback callback, in int propId); +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicleCallback.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicleCallback.aidl new file mode 100644 index 0000000000..1b5a1e2027 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/IVehicleCallback.aidl @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.StatusCode; +import android.hardware.automotive.vehicle.VehiclePropValue; + +// @VintfStability +interface IVehicleCallback { + /** + * Event callback happens whenever a variable that the API user has + * subscribed to needs to be reported. This may be based purely on + * threshold and frequency (a regular subscription, see subscribe call's + * arguments) or when the IVehicle#set method was called and the actual + * change needs to be reported. + * + * These callbacks are chunked. + * + * @param values that has been updated. + */ + oneway void onPropertyEvent(in VehiclePropValue[] propValues); + + /** + * This method gets called if the client was subscribed to a property using + * SubscribeFlags::EVENTS_FROM_ANDROID flag and IVehicle#set(...) method was called. + * + * These events must be delivered to subscriber immediately without any + * batching. + * + * @param value Value that was set by a client. + */ + oneway void onPropertySet(in VehiclePropValue propValue); + + /** + * Set property value is usually asynchronous operation. Thus even if + * client received StatusCode::OK from the IVehicle::set(...) this + * doesn't guarantee that the value was successfully propagated to the + * vehicle network. If such rare event occurs this method must be called. + * + * @param errorCode - any value from StatusCode enum. + * @param property - a property where error has happened. + * @param areaId - bitmask that specifies in which areas the problem has + * occurred, must be 0 for global properties + */ + oneway void onPropertySetError(in StatusCode errorCode, in int propId, in int areaId); +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/InitialUserInfoRequest.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/InitialUserInfoRequest.aidl new file mode 100644 index 0000000000..12746ce993 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/InitialUserInfoRequest.aidl @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.InitialUserInfoRequestType; +import android.hardware.automotive.vehicle.UsersInfo; + +/** + * Defines the format of a INITIAL_USER_INFO request made by the Android system. + * + * NOTE: this struct is not used in the HAL properties directly, it must be converted to + * VehiclePropValue.RawValue through libraries provided by the default Vehicle HAL implementation. + */ +// @VintfStability +parcelable InitialUserInfoRequest { + /** + * Arbitrary id used to map the HAL response to the request. + */ + int requestId; + /** + * Type of request. + */ + InitialUserInfoRequestType requestType; + /** + * Information about the current state of the Android system. + */ + UsersInfo usersInfo; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/InitialUserInfoRequestType.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/InitialUserInfoRequestType.aidl new file mode 100644 index 0000000000..12fec24475 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/InitialUserInfoRequestType.aidl @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Defines when a INITIAL_USER_INFO request was made. + */ +// @VintfStability +@Backing(type="int") +enum InitialUserInfoRequestType { + /** + * At the first time Android was booted (or after a factory reset). + */ + FIRST_BOOT = 1, + /** + * At the first time Android was booted after the system was updated. + */ + FIRST_BOOT_AFTER_OTA = 2, + /** + * When Android was booted "from scratch". + */ + COLD_BOOT = 3, + /** + * When Android was resumed after the system was suspended to memory. + */ + RESUME = 4, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/InitialUserInfoResponse.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/InitialUserInfoResponse.aidl new file mode 100644 index 0000000000..34d9062618 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/InitialUserInfoResponse.aidl @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.InitialUserInfoResponseAction; +import android.hardware.automotive.vehicle.UserInfo; + +/** + * Defines the format of a HAL response to a INITIAL_USER_INFO request. + * + * NOTE: this struct is not used in the HAL properties directly, it must be converted to + * VehiclePropValue.RawValue through libraries provided by the default Vehicle HAL implementation. + */ +// @VintfStability +parcelable InitialUserInfoResponse { + /** + * Id of the request being responded. + */ + int requestId; + /** + * which action the Android system should take. + */ + InitialUserInfoResponseAction action; + /** + * Information about the user that should be switched to or created. + */ + UserInfo userToSwitchOrCreate; + /** + * System locales of the initial user (value will be passed as-is to + * android.provider.Settings.System.SYSTEM_LOCALES) + */ + @utf8InCpp String userLocales; + /** + * Name of the user that should be created. + */ + @utf8InCpp String userNameToCreate; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/InitialUserInfoResponseAction.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/InitialUserInfoResponseAction.aidl new file mode 100644 index 0000000000..e35fa9ab03 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/InitialUserInfoResponseAction.aidl @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Defines which action the Android system should take in an INITIAL_USER_INFO request. + */ +// @VintfStability +@Backing(type="int") +enum InitialUserInfoResponseAction { + /** + * Let the Android System decide what to do. + * + * For example, it might create a new user on first boot, and switch to the last + * active user afterwards. + */ + DEFAULT = 0, + /** + * Switch to an existing Android user. + */ + SWITCH = 1, + /** + * Create a new Android user (and switch to it). + */ + CREATE = 2, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2CommonIgnitionMonitors.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2CommonIgnitionMonitors.aidl new file mode 100644 index 0000000000..775d53112a --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2CommonIgnitionMonitors.aidl @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Ignition monitors common to both SPARK and COMPRESSION. + * These values come from the SAE J1979 standard. + */ +// @VintfStability +@Backing(type="int") +enum Obd2CommonIgnitionMonitors { + COMPONENTS_AVAILABLE = 0x1 << 0, + COMPONENTS_INCOMPLETE = 0x1 << 1, + FUEL_SYSTEM_AVAILABLE = 0x1 << 2, + FUEL_SYSTEM_INCOMPLETE = 0x1 << 3, + MISFIRE_AVAILABLE = 0x1 << 4, + MISFIRE_INCOMPLETE = 0x1 << 5, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2CompressionIgnitionMonitors.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2CompressionIgnitionMonitors.aidl new file mode 100644 index 0000000000..ab444e16e0 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2CompressionIgnitionMonitors.aidl @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.Obd2CommonIgnitionMonitors; + +/** + * Ignition monitors only available for COMPRESSION vehicles. + * These values come from the SAE J1979 standard. + */ +// @VintfStability +@Backing(type="int") +enum Obd2CompressionIgnitionMonitors { + COMPONENTS_AVAILABLE = 0x1 << 0, + COMPONENTS_INCOMPLETE = 0x1 << 1, + FUEL_SYSTEM_AVAILABLE = 0x1 << 2, + FUEL_SYSTEM_INCOMPLETE = 0x1 << 3, + MISFIRE_AVAILABLE = 0x1 << 4, + MISFIRE_INCOMPLETE = 0x1 << 5, + EGR_OR_VVT_AVAILABLE = 0x1 << 6, + EGR_OR_VVT_INCOMPLETE = 0x1 << 7, + PM_FILTER_AVAILABLE = 0x1 << 8, + PM_FILTER_INCOMPLETE = 0x1 << 9, + EXHAUST_GAS_SENSOR_AVAILABLE = 0x1 << 10, + EXHAUST_GAS_SENSOR_INCOMPLETE = 0x1 << 11, + BOOST_PRESSURE_AVAILABLE = 0x1 << 12, + BOOST_PRESSURE_INCOMPLETE = 0x1 << 13, + NOx_SCR_AVAILABLE = 0x1 << 14, + NOx_SCR_INCOMPLETE = 0x1 << 15, + NMHC_CATALYST_AVAILABLE = 0x1 << 16, + NMHC_CATALYST_INCOMPLETE = 0x1 << 17, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2FuelSystemStatus.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2FuelSystemStatus.aidl new file mode 100644 index 0000000000..9b4ce8f976 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2FuelSystemStatus.aidl @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * The status of the vehicle's fuel system. + * These values come from the SAE J1979 standard. + */ +// @VintfStability +@Backing(type="int") +enum Obd2FuelSystemStatus { + OPEN_INSUFFICIENT_ENGINE_TEMPERATURE = 1, + CLOSED_LOOP = 2, + OPEN_ENGINE_LOAD_OR_DECELERATION = 4, + OPEN_SYSTEM_FAILURE = 8, + CLOSED_LOOP_BUT_FEEDBACK_FAULT = 16, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2FuelType.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2FuelType.aidl new file mode 100644 index 0000000000..1428f2c05a --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2FuelType.aidl @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * The fuel type(s) supported by a vehicle. + * These values come from the SAE J1979 standard. + */ +// @VintfStability +@Backing(type="int") +enum Obd2FuelType { + NOT_AVAILABLE = 0, + GASOLINE = 1, + METHANOL = 2, + ETHANOL = 3, + DIESEL = 4, + LPG = 5, + CNG = 6, + PROPANE = 7, + ELECTRIC = 8, + BIFUEL_RUNNING_GASOLINE = 9, + BIFUEL_RUNNING_METHANOL = 10, + BIFUEL_RUNNING_ETHANOL = 11, + BIFUEL_RUNNING_LPG = 12, + BIFUEL_RUNNING_CNG = 13, + BIFUEL_RUNNING_PROPANE = 14, + BIFUEL_RUNNING_ELECTRIC = 15, + BIFUEL_RUNNING_ELECTRIC_AND_COMBUSTION = 16, + HYBRID_GASOLINE = 17, + HYBRID_ETHANOL = 18, + HYBRID_DIESEL = 19, + HYBRID_ELECTRIC = 20, + HYBRID_RUNNING_ELECTRIC_AND_COMBUSTION = 21, + HYBRID_REGENERATIVE = 22, + BIFUEL_RUNNING_DIESEL = 23, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2IgnitionMonitorKind.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2IgnitionMonitorKind.aidl new file mode 100644 index 0000000000..477b38d358 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2IgnitionMonitorKind.aidl @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Defines which ignition monitors are available to be read. + */ +// @VintfStability +@Backing(type="int") +enum Obd2IgnitionMonitorKind { + SPARK = 0, + COMPRESSION = 1, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2SecondaryAirStatus.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2SecondaryAirStatus.aidl new file mode 100644 index 0000000000..f257164066 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2SecondaryAirStatus.aidl @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * The status of the vehicle's secondary air system. + * These values come from the SAE J1979 standard. + */ +// @VintfStability +@Backing(type="int") +enum Obd2SecondaryAirStatus { + UPSTREAM = 1, + DOWNSTREAM_OF_CATALYCIC_CONVERTER = 2, + FROM_OUTSIDE_OR_OFF = 4, + PUMP_ON_FOR_DIAGNOSTICS = 8, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2SparkIgnitionMonitors.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2SparkIgnitionMonitors.aidl new file mode 100644 index 0000000000..75504df675 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/Obd2SparkIgnitionMonitors.aidl @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.Obd2CommonIgnitionMonitors; + +/** + * Ignition monitors available for SPARK vehicles. + * These values come from the SAE J1979 standard. + */ +// @VintfStability +@Backing(type="int") +enum Obd2SparkIgnitionMonitors { + COMPONENTS_AVAILABLE = 0x1 << 0, + COMPONENTS_INCOMPLETE = 0x1 << 1, + FUEL_SYSTEM_AVAILABLE = 0x1 << 2, + FUEL_SYSTEM_INCOMPLETE = 0x1 << 3, + MISFIRE_AVAILABLE = 0x1 << 4, + MISFIRE_INCOMPLETE = 0x1 << 5, + EGR_AVAILABLE = 0x1 << 6, + EGR_INCOMPLETE = 0x1 << 7, + OXYGEN_SENSOR_HEATER_AVAILABLE = 0x1 << 8, + OXYGEN_SENSOR_HEATER_INCOMPLETE = 0x1 << 9, + OXYGEN_SENSOR_AVAILABLE = 0x1 << 10, + OXYGEN_SENSOR_INCOMPLETE = 0x1 << 11, + AC_REFRIGERANT_AVAILABLE = 0x1 << 12, + AC_REFRIGERANT_INCOMPLETE = 0x1 << 13, + SECONDARY_AIR_SYSTEM_AVAILABLE = 0x1 << 14, + SECONDARY_AIR_SYSTEM_INCOMPLETE = 0x1 << 15, + EVAPORATIVE_SYSTEM_AVAILABLE = 0x1 << 16, + EVAPORATIVE_SYSTEM_INCOMPLETE = 0x1 << 17, + HEATED_CATALYST_AVAILABLE = 0x1 << 18, + HEATED_CATALYST_INCOMPLETE = 0x1 << 19, + CATALYST_AVAILABLE = 0x1 << 20, + CATALYST_INCOMPLETE = 0x1 << 21, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/PortLocationType.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/PortLocationType.aidl new file mode 100644 index 0000000000..260dd42ee4 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/PortLocationType.aidl @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Used by INFO_FUEL_DOOR_LOCATION/INFO_CHARGE_PORT_LOCATION to enumerate fuel door or + * ev port location. + */ +// @VintfStability +@Backing(type="int") +enum PortLocationType { + /** + * Default type if the vehicle does not know or report the Fuel door + * and ev port location. + */ + UNKNOWN = 0, + FRONT_LEFT = 1, + FRONT_RIGHT = 2, + REAR_RIGHT = 3, + REAR_LEFT = 4, + FRONT = 5, + REAR = 6, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ProcessTerminationReason.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ProcessTerminationReason.aidl new file mode 100644 index 0000000000..e54a08b3be --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ProcessTerminationReason.aidl @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * The reason why a process is terminated by car watchdog. + * This is used with WATCHDOG_TERMINATED_PROCESS property. + */ +// @VintfStability +@Backing(type="int") +enum ProcessTerminationReason { + /** + * A process doesn't respond to car watchdog within the timeout. + */ + NOT_RESPONDING = 1, + /** + * A process uses more IO operations than what is allowed. + */ + IO_OVERUSE = 2, + /** + * A process uses more memory space than what is allowed. + */ + MEMORY_OVERUSE = 3, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/RemoveUserRequest.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/RemoveUserRequest.aidl new file mode 100644 index 0000000000..79a8c598dc --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/RemoveUserRequest.aidl @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.UserInfo; +import android.hardware.automotive.vehicle.UsersInfo; + +/** + * Defines the format of a REMOVE_USER property. + * + * NOTE: this struct is not used in the HAL properties directly, it must be converted to + * VehiclePropValue.RawValue through libraries provided by the default Vehicle HAL implementation. + */ +// @VintfStability +parcelable RemoveUserRequest { + /** + * Arbitrary id used to map the response to the request. + */ + int requestId; + /** + * Information about the Android user that was removed. + */ + UserInfo removedUserInfo; + /** + * Information about the current state of the Android system. + */ + UsersInfo usersInfo; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/RotaryInputType.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/RotaryInputType.aidl new file mode 100644 index 0000000000..eca703a9c2 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/RotaryInputType.aidl @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * A rotary control which can rotate without limits. These controls use HW_ROTARY_INPUT to report + * relative clockwise or counterclockwise motion. They have no absolute position. + */ +// @VintfStability +@Backing(type="int") +enum RotaryInputType { + /** + * Main rotary control, typically in the center console, used to navigate the user interface. + */ + ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION = 0, + /** + * Volume control for adjusting audio volume. + */ + ROTARY_INPUT_TYPE_AUDIO_VOLUME = 1, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/StatusCode.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/StatusCode.aidl new file mode 100644 index 0000000000..9b29229757 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/StatusCode.aidl @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Error codes used in vehicle HAL interface. + */ +// @VintfStability +@Backing(type="int") +enum StatusCode { + OK = 0, + /** + * Try again. + */ + TRY_AGAIN = 1, + /** + * Invalid argument provided. + */ + INVALID_ARG = 2, + /** + * This code must be returned when device that associated with the vehicle + * property is not available. For example, when client tries to set HVAC + * temperature when the whole HVAC unit is turned OFF. + */ + NOT_AVAILABLE = 3, + /** + * Access denied + */ + ACCESS_DENIED = 4, + /** + * Something unexpected has happened in Vehicle HAL + */ + INTERNAL_ERROR = 5, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SubscribeFlags.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SubscribeFlags.aidl new file mode 100644 index 0000000000..d997990d1d --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SubscribeFlags.aidl @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum SubscribeFlags { + UNDEFINED = 0x0, + + /** + * Subscribe to event that was originated in vehicle HAL + * (most likely this event came from the vehicle itself). + */ + EVENTS_FROM_CAR = 0x1, + + /** + * Use this flag to subscribe on events when IVehicle#set(...) was called by + * vehicle HAL's client (e.g. Car Service). + */ + EVENTS_FROM_ANDROID = 0x2, + + /** + * Property event for this property should be passed through shared memory with only this + * property's data included. This can be helpful for reducing memory copy in upper layer + * for data with bigger payload. If payload size is small, VHAL can send this through non-shared + * memory path instead. + */ + EXCLUSIVE_SHARED_MEMORY = 0x4, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SubscribeOptions.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SubscribeOptions.aidl new file mode 100644 index 0000000000..0769f286cb --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SubscribeOptions.aidl @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.SubscribeFlags; + +/** + * Encapsulates information about subscription to vehicle property events. + */ +// @VintfStability +parcelable SubscribeOptions { + /** Property to subscribe */ + int propId; + + /** + * Sample rate in Hz. + * + * Must be provided for properties with + * VehiclePropertyChangeMode::CONTINUOUS. The value must be within + * VehiclePropConfig#minSamplingRate .. VehiclePropConfig#maxSamplingRate + * for a given property. + * This value indicates how many updates per second client wants to receive. + */ + float sampleRate; + + /** Flags that indicate to which event sources to listen. */ + SubscribeFlags flags; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SwitchUserMessageType.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SwitchUserMessageType.aidl new file mode 100644 index 0000000000..c0b5d68be1 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SwitchUserMessageType.aidl @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Defines the reason a SWITCH_USER call was made. + * + * The meaning of each constant is explained in that property. + */ +// @VintfStability +@Backing(type="int") +enum SwitchUserMessageType { + LEGACY_ANDROID_SWITCH = 1, + ANDROID_SWITCH = 2, + VEHICLE_RESPONSE = 3, + VEHICLE_REQUEST = 4, + ANDROID_POST_SWITCH = 5, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SwitchUserRequest.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SwitchUserRequest.aidl new file mode 100644 index 0000000000..9a324f417a --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SwitchUserRequest.aidl @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.SwitchUserMessageType; +import android.hardware.automotive.vehicle.UserInfo; +import android.hardware.automotive.vehicle.UsersInfo; + +/** + * Defines the format of a SWITCH_USER property. + * + * NOTE: this struct is not used in the HAL properties directly, it must be converted to + * VehiclePropValue.RawValue through libraries provided by the default Vehicle HAL implementation. + */ +// @VintfStability +parcelable SwitchUserRequest { + /** + * Arbitrary id used to map the response to the request. + */ + int requestId; + /** + * Type of message. + */ + SwitchUserMessageType messageType; + /** + * Information about the Android user being switched to. + * + * Only the user id (but not the flags) should be set when the request is made by HAL. + */ + UserInfo targetUser; + /** + * Information about the current state of the Android system. + * + * Should not be set when the request is made by HAL. + */ + UsersInfo usersInfo; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SwitchUserResponse.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SwitchUserResponse.aidl new file mode 100644 index 0000000000..175859d4dd --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SwitchUserResponse.aidl @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.SwitchUserMessageType; +import android.hardware.automotive.vehicle.SwitchUserStatus; + +/** + * Defines the result of a SwitchUserRequest. + * + * NOTE: this struct is not used in the HAL properties directly, it must be converted to + * VehiclePropValue.RawValue through libraries provided by the default Vehicle HAL implementation. + */ +// @VintfStability +parcelable SwitchUserResponse { + /** + * Id of the request being responded. + */ + int requestId; + /** + * Type of message. + */ + SwitchUserMessageType messageType; + /** + * Status of the request. + */ + SwitchUserStatus status; + /** + * HAL-specific error message. + * + * This argument is optional, and when defined, it's passed "as-is" to the caller. It could be + * used to show custom error messages to the end user. + */ + @utf8InCpp String errorMessage; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SwitchUserStatus.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SwitchUserStatus.aidl new file mode 100644 index 0000000000..11dc5f291d --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/SwitchUserStatus.aidl @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Status of the response to a SwitchUserRequest. + */ +// @VintfStability +@Backing(type="int") +enum SwitchUserStatus { + /** + * The request succeeded and the HAL user was switched. + */ + SUCCESS = 1, + /** + * The request failed and the HAL user remained the same. + */ + FAILURE = 2, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserFlags.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserFlags.aidl new file mode 100644 index 0000000000..8daa0c1c09 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserFlags.aidl @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Flags used to define the characteristics of an Android user. + */ +// @VintfStability +@Backing(type="int") +enum UserFlags { + /** + * No flags. + */ + NONE = 0x0, + /** + * System user. + * On automotive, that user is always running, although never on foreground (except during + * boot or exceptional circumstances). + */ + SYSTEM = 0x01, + /** + * Guest users have restrictions. + */ + GUEST = 0x02, + /** + * Ephemeral users have non-persistent state. + */ + EPHEMERAL = 0x04, + /** + * Admin users have additional privileges such as permission to create other users. + */ + ADMIN = 0x08, + /** + * Disabled users are marked for deletion. + */ + DISABLED = 0x10, + /** + * Profile user is a profile of another user. + */ + PROFILE = 0x20, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationAssociation.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationAssociation.aidl new file mode 100644 index 0000000000..9531bb39ca --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationAssociation.aidl @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.UserIdentificationAssociationType; +import android.hardware.automotive.vehicle.UserIdentificationAssociationValue; + +/** + * Helper struct used when getting a user/identification association type. + */ +// @VintfStability +parcelable UserIdentificationAssociation { + UserIdentificationAssociationType type = UserIdentificationAssociationType.INVALID; + UserIdentificationAssociationValue value = UserIdentificationAssociationValue.UNKNOWN; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationAssociationSetValue.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationAssociationSetValue.aidl new file mode 100644 index 0000000000..5be7f99c8e --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationAssociationSetValue.aidl @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Used to set a UserIdentificationAssociationType with an Android user. + */ +// @VintfStability +@Backing(type="int") +enum UserIdentificationAssociationSetValue { + INVALID = 0, + /** + * Associate the identification type with the current foreground Android user. + */ + ASSOCIATE_CURRENT_USER = 1, + /** + * Disassociate the identification type from the current foreground Android user. + */ + DISASSOCIATE_CURRENT_USER = 2, + /** + * Disassociate the identification type from all Android users. + */ + DISASSOCIATE_ALL_USERS = 3, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationAssociationType.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationAssociationType.aidl new file mode 100644 index 0000000000..141aca883c --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationAssociationType.aidl @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Types of mechanisms used to identify an Android user. + * + * See USER_IDENTIFICATION_ASSOCIATION for more details and example. + */ +// @VintfStability +@Backing(type="int") +enum UserIdentificationAssociationType { + INVALID = 0, + /** + * Key used to unlock the car. + */ + KEY_FOB = 1, + /** + * Custom mechanism defined by the OEM. + */ + CUSTOM_1 = 101, + /** + * Custom mechanism defined by the OEM. + */ + CUSTOM_2 = 102, + /** + * Custom mechanism defined by the OEM. + */ + CUSTOM_3 = 103, + /** + * Custom mechanism defined by the OEM. + */ + CUSTOM_4 = 104, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationAssociationValue.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationAssociationValue.aidl new file mode 100644 index 0000000000..c11ad2a41e --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationAssociationValue.aidl @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Whether a UserIdentificationAssociationType is associate with an Android user. + */ +// @VintfStability +@Backing(type="int") +enum UserIdentificationAssociationValue { + /** + * Used when the status of an association could not be determined. + * + * For example, in a set() request, it would indicate a failure to set the given type. + */ + UNKNOWN = 1, + /** + * The identification type is associated with the current foreground Android user. + */ + ASSOCIATED_CURRENT_USER = 2, + /** + * The identification type is associated with another Android user. + */ + ASSOCIATED_ANOTHER_USER = 3, + /** + * The identification type is not associated with any Android user. + */ + NOT_ASSOCIATED_ANY_USER = 4, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationGetRequest.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationGetRequest.aidl new file mode 100644 index 0000000000..cb4b8cf60e --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationGetRequest.aidl @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.UserIdentificationAssociationType; +import android.hardware.automotive.vehicle.UserInfo; + +/** + * Defines the format of a get() call to USER_IDENTIFICATION_ASSOCIATION. + * + * NOTE: this struct is not used in the HAL properties directly, it must be converted to + * VehiclePropValue.RawValue through libraries provided by the default Vehicle HAL implementation. + */ +// @VintfStability +parcelable UserIdentificationGetRequest { + /** + * Id of the request being responded. + */ + int requestId; + /** + * Information about the current foreground Android user. + */ + UserInfo userInfo; + /** + * Number of association being queried. + */ + int numberAssociationTypes; + /** + * Types of association being queried. + */ + UserIdentificationAssociationType[] associationTypes; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationResponse.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationResponse.aidl new file mode 100644 index 0000000000..e8eb3a36c2 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationResponse.aidl @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.UserIdentificationAssociation; + +/** + * Defines the result of a USER_IDENTIFICATION_ASSOCIATION - both for get() and set(). + * + * NOTE: this struct is not used in the HAL properties directly, it must be converted to + * VehiclePropValue.RawValue through libraries provided by the default Vehicle HAL implementation. + */ +// @VintfStability +parcelable UserIdentificationResponse { + /** + * Id of the request being responded. + */ + int requestId; + /** + * Number of associations being returned. + */ + int numberAssociation; + /** + * Values associated with the user. + */ + UserIdentificationAssociation[] associations; + /** + * HAL-specific error message. + * + * This argument is optional, and when defined, it's passed "as-is" to the caller. It could be + * used to show custom error messages to the end user. + */ + @utf8InCpp String errorMessage; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationSetAssociation.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationSetAssociation.aidl new file mode 100644 index 0000000000..392ae995aa --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationSetAssociation.aidl @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.UserIdentificationAssociationSetValue; +import android.hardware.automotive.vehicle.UserIdentificationAssociationType; + +/** + * Helper struct used when setting a user/identification association type. + */ +// @VintfStability +parcelable UserIdentificationSetAssociation { + UserIdentificationAssociationType type = UserIdentificationAssociationType.INVALID; + UserIdentificationAssociationSetValue value = UserIdentificationAssociationSetValue.INVALID; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationSetRequest.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationSetRequest.aidl new file mode 100644 index 0000000000..dafb1d1436 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserIdentificationSetRequest.aidl @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2021 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. + */ +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.UserIdentificationSetAssociation; +import android.hardware.automotive.vehicle.UserInfo; + +/** + * Defines the format of a set() call to USER_IDENTIFICATION_ASSOCIATION. + * + * NOTE: this struct is not used in the HAL properties directly, it must be converted to + * VehiclePropValue.RawValue through libraries provided by the default Vehicle HAL implementation. + */ +// @VintfStability +parcelable UserIdentificationSetRequest { + /** + * Id of the request being responded. + */ + int requestId; + /** + * Information about the current foreground Android user. + */ + UserInfo userInfo; + /** + * Number of association being set. + */ + int numberAssociations; + /** + * Associations being set. + */ + UserIdentificationSetAssociation[] associations; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserInfo.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserInfo.aidl new file mode 100644 index 0000000000..0a84308c75 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UserInfo.aidl @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.UserFlags; + +/** + * Information about a specific Android user. + */ +// @VintfStability +parcelable UserInfo { + int userId = 0; + UserFlags flags = UserFlags.NONE; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UsersInfo.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UsersInfo.aidl new file mode 100644 index 0000000000..28b3f95679 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/UsersInfo.aidl @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.UserInfo; + +/** + * Information about all Android users. + * + * NOTE: this struct is not used in the HAL properties directly, it's part of other structs, which + * in turn are converted to a VehiclePropValue.RawValue through libraries provided by the default + * Vehicle HAL implementation. + */ +// @VintfStability +parcelable UsersInfo { + /** + * The current foreground user. + */ + UserInfo currentUser; + /** + * Number of existing users; includes the current user, recently removed users (with DISABLED + * flag), and profile users (with PROFILE flag). + */ + int numberUsers; + /** + * List of existing users; includes the current user, recently removed users (with DISABLED + * flag), and profile users (with PROFILE flag). + */ + UserInfo[] existingUsers; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateConfigFlag.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateConfigFlag.aidl new file mode 100644 index 0000000000..9e593c5f26 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateConfigFlag.aidl @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehicleApPowerStateConfigFlag { + /** + * AP can enter deep sleep state. If not set, AP will always shutdown from + * VehicleApPowerState#SHUTDOWN_PREPARE power state. + */ + ENABLE_DEEP_SLEEP_FLAG = 0x1, + /** + * The power controller can power on AP from off state after timeout + * specified in VehicleApPowerSet VEHICLE_AP_POWER_SET_SHUTDOWN_READY message. + */ + CONFIG_SUPPORT_TIMER_POWER_ON_FLAG = 0x2, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateReport.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateReport.aidl new file mode 100644 index 0000000000..b6cc70d34d --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateReport.aidl @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehicleApPowerStateReport { + /** + * The device has booted. CarService has initialized and is ready to accept commands + * from VHAL. The user is not logged in, and vendor apps and services are expected to + * control the display and audio. + * After reporting this state, AP will accept VehicleApPowerStateReq#ON or + * VehicleApPowerStateReq#SHUTDOWN_PREPARE. Other power state requests are ignored. + */ + WAIT_FOR_VHAL = 0x1, + /** + * AP is ready to suspend. + * The AP will not send any more state reports after this. + * After reporting this state, AP will accept VehicleApPowerStateReq#FINISHED. + * Other power state requests are ignored. + * + * int32Values[1]: Time to turn AP back on, in seconds. Power controller should turn on + * AP after the specified time has elapsed, so AP can run tasks like + * update. If this value is 0, no wake up is requested. The power + * controller may not necessarily support timed wake-up. + */ + DEEP_SLEEP_ENTRY = 0x2, + /** + * AP is exiting from deep sleep state. + * After reporting this state, AP will accept VehicleApPowerStateReq#ON or + * VehicleApPowerStateReq#SHUTDOWN_PREPARE. Other power state requests are ignored. + */ + DEEP_SLEEP_EXIT = 0x3, + /** + * AP sends this message repeatedly while cleanup and idle tasks execute. + * After reporting this state, AP will accept VehicleApPowerStateReq#SHUTDOWN_PREPARE + * requesting immediate shutdown or VehicleApPowerStateReq#CANCEL_SHUTDOWN. Other + * power state requests are ignored. + * + * int32Values[1]: Time to postpone shutdown in ms. Maximum value is + * 5000 ms. + * If AP needs more time, it will send another SHUTDOWN_POSTPONE + * message before the previous one expires. + */ + SHUTDOWN_POSTPONE = 0x4, + /** + * AP is ready to shutdown. + * The AP will not send any more state reports after this. + * After reporting this state, AP will accept VehicleApPowerStateReq#FINISHED. + * Other power state requests are ignored. + * + * int32Values[1]: Time to turn AP back on, in seconds. Power controller should turn on + * AP after the specified time has elapsed so AP can run tasks like + * update. If this value is 0, no wake up is specified. The power + * controller may not necessarily support timed wake-up. + */ + SHUTDOWN_START = 0x5, + /** + * AP is entering its normal operating state. + * After reporting this state, AP will accept VehicleApPowerStateReq#SHUTDOWN_PREPARE. + * Other power state requests are ignored. + */ + ON = 0x6, + /** + * AP is preparing to shut down. In this state, Garage Mode is active and idle + * tasks are allowed to run. + * After reporting this state, AP will accept VehicleApPowerStateReq#SHUTDOWN_PREPARE + * requesting immediate shutdown or VehicleApPowerStateReq#CANCEL_SHUTDOWN. Other + * power state requests are ignored. + */ + SHUTDOWN_PREPARE = 0x7, + /** + * AP has stopped preparing to shut down. + * After reporting this state, AP will accept VehicleApPowerStateReq#ON or + * VehicleApPowerStateReq#SHUTDOWN_PREPARE. Other power state requests are ignored. + */ + SHUTDOWN_CANCELLED = 0x8, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateReq.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateReq.aidl new file mode 100644 index 0000000000..06bc073287 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateReq.aidl @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehicleApPowerStateReq { + /** + * This requests Android to enter its normal operating state. + * This may be sent after the AP has reported + * VehicleApPowerStateReport#DEEP_SLEEP_EXIT, + * VehicleApPowerStateReport#SHUTDOWN_CANCELLED, or + * VehicleApPowerStateReport#WAIT_FOR_VHAL. + */ + ON = 0, + /** + * The power controller issues this request to shutdown the system. + * This may be sent after the AP has reported + * VehicleApPowerStateReport#DEEP_SLEEP_EXIT, + * VehicleApPowerStateReport#ON, + * VehicleApPowerStateReport#SHUTDOWN_CANCELLED, + * VehicleApPowerStateReport#SHUTDOWN_POSTPONE, + * VehicleApPowerStateReport#SHUTDOWN_PREPARE, or + * VehicleApPowerStateReport#WAIT_FOR_VHAL. + * + * int32Values[1] : One of VehicleApPowerStateShutdownParam. + * This parameter indicates if the AP should shut + * down fully or sleep. This parameter also + * indicates if the shutdown should be immediate + * or if it can be postponed. If the shutdown can + * be postponed, AP requests postponing by sending + * VehicleApPowerStateReport#SHUTDOWN_POSTPONE. + */ + SHUTDOWN_PREPARE = 1, + /** + * Cancel the shutdown. + * This may be sent after the AP has reported + * VehicleApPowerStateReport#SHUTDOWN_POSTPONE or + * VehicleApPowerStateReport#SHUTDOWN_PREPARE. + * After receiving this request, the AP will report + * VehicleApPowerStateReport#WAIT_FOR_VHAL in preparation to going ON. + */ + CANCEL_SHUTDOWN = 2, + /** + * Completes the shutdown process. + * This may be sent after the AP has reported + * VehicleApPowerStateReport#DEEP_SLEEP_ENTRY or + * VehicleApPowerStateReport#SHUTDOWN_START. The AP will not report new + * state information after receiving this request. + */ + FINISHED = 3, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateReqIndex.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateReqIndex.aidl new file mode 100644 index 0000000000..a3d6c7f812 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateReqIndex.aidl @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Index in int32Values for VehicleProperty#AP_POWER_STATE_REQ property. + */ +// @VintfStability +@Backing(type="int") +enum VehicleApPowerStateReqIndex { + STATE = 0, + ADDITIONAL = 1, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateShutdownParam.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateShutdownParam.aidl new file mode 100644 index 0000000000..f4ab08052d --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleApPowerStateShutdownParam.aidl @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehicleApPowerStateShutdownParam { + /** + * AP must shutdown immediately. Postponing is not allowed. + */ + SHUTDOWN_IMMEDIATELY = 1, + /** + * AP can enter deep sleep instead of shutting down completely. + */ + CAN_SLEEP = 2, + /** + * AP can only shutdown with postponing allowed. + */ + SHUTDOWN_ONLY = 3, + /** + * AP may enter deep sleep, but must either sleep or shut down immediately. + * Postponing is not allowed. + */ + SLEEP_IMMEDIATELY = 4, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleArea.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleArea.aidl new file mode 100644 index 0000000000..53b85ebdde --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleArea.aidl @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehicleArea { + GLOBAL = 0x01000000, + /** WINDOW maps to enum VehicleAreaWindow */ + WINDOW = 0x03000000, + /** MIRROR maps to enum VehicleAreaMirror */ + MIRROR = 0x04000000, + /** SEAT maps to enum VehicleAreaSeat */ + SEAT = 0x05000000, + /** DOOR maps to enum VehicleAreaDoor */ + DOOR = 0x06000000, + /** WHEEL maps to enum VehicleAreaWheel */ + WHEEL = 0x07000000, + + MASK = 0x0f000000, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl new file mode 100644 index 0000000000..0a688c0edc --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaConfig.aidl @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +parcelable VehicleAreaConfig { + /** + * Area id is ignored for VehiclePropertyGroup:GLOBAL properties. + */ + int areaId; + + /** + * If the property has @data_enum, leave the range to zero. + * + * Range will be ignored in the following cases: + * - The VehiclePropertyType is not INT32, INT64 or FLOAT. + * - Both of min value and max value are zero. + */ + + int minInt32Value; + int maxInt32Value; + + long minInt64Value; + long maxInt64Value; + + float minFloatValue; + float maxFloatValue; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaDoor.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaDoor.aidl new file mode 100644 index 0000000000..c85b171c00 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaDoor.aidl @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehicleAreaDoor { + ROW_1_LEFT = 0x00000001, + ROW_1_RIGHT = 0x00000004, + ROW_2_LEFT = 0x00000010, + ROW_2_RIGHT = 0x00000040, + ROW_3_LEFT = 0x00000100, + ROW_3_RIGHT = 0x00000400, + HOOD = 0x10000000, + REAR = 0x20000000, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaMirror.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaMirror.aidl new file mode 100644 index 0000000000..daecf0b612 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaMirror.aidl @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehicleAreaMirror { + DRIVER_LEFT = 0x00000001, + DRIVER_RIGHT = 0x00000002, + DRIVER_CENTER = 0x00000004, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaSeat.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaSeat.aidl new file mode 100644 index 0000000000..9d16c8678c --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaSeat.aidl @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Various Seats in the car. + */ +// @VintfStability +@Backing(type="int") +enum VehicleAreaSeat { + ROW_1_LEFT = 0x0001, + ROW_1_CENTER = 0x0002, + ROW_1_RIGHT = 0x0004, + ROW_2_LEFT = 0x0010, + ROW_2_CENTER = 0x0020, + ROW_2_RIGHT = 0x0040, + ROW_3_LEFT = 0x0100, + ROW_3_CENTER = 0x0200, + ROW_3_RIGHT = 0x0400, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaWheel.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaWheel.aidl new file mode 100644 index 0000000000..0e5b995531 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaWheel.aidl @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehicleAreaWheel { + UNKNOWN = 0x0, + LEFT_FRONT = 0x1, + RIGHT_FRONT = 0x2, + LEFT_REAR = 0x4, + RIGHT_REAR = 0x8, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaWindow.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaWindow.aidl new file mode 100644 index 0000000000..bab0a3f802 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleAreaWindow.aidl @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Various windshields/windows in the car. + */ +// @VintfStability +@Backing(type="int") +enum VehicleAreaWindow { + FRONT_WINDSHIELD = 0x00000001, + REAR_WINDSHIELD = 0x00000002, + ROW_1_LEFT = 0x00000010, + ROW_1_RIGHT = 0x00000040, + ROW_2_LEFT = 0x00000100, + ROW_2_RIGHT = 0x00000400, + ROW_3_LEFT = 0x00001000, + ROW_3_RIGHT = 0x00004000, + ROOF_TOP_1 = 0x00010000, + ROOF_TOP_2 = 0x00020000, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleDisplay.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleDisplay.aidl new file mode 100644 index 0000000000..a7531c4965 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleDisplay.aidl @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehicleDisplay { + /** + * The primary Android display (for example, center console) + */ + MAIN = 0, + INSTRUMENT_CLUSTER = 1, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleGear.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleGear.aidl new file mode 100644 index 0000000000..8b08ff8079 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleGear.aidl @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Various gears which can be selected by user and chosen in system. + */ +// @VintfStability +@Backing(type="int") +enum VehicleGear { + GEAR_UNKNOWN = 0x0000, + GEAR_NEUTRAL = 0x0001, + GEAR_REVERSE = 0x0002, + GEAR_PARK = 0x0004, + GEAR_DRIVE = 0x0008, + GEAR_1 = 0x0010, + GEAR_2 = 0x0020, + GEAR_3 = 0x0040, + GEAR_4 = 0x0080, + GEAR_5 = 0x0100, + GEAR_6 = 0x0200, + GEAR_7 = 0x0400, + GEAR_8 = 0x0800, + GEAR_9 = 0x1000, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleHvacFanDirection.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleHvacFanDirection.aidl new file mode 100644 index 0000000000..19676790c6 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleHvacFanDirection.aidl @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Bit flags for fan direction + */ +// @VintfStability +@Backing(type="int") +enum VehicleHvacFanDirection { + UNKNOWN = 0x0, + FACE = 0x1, + FLOOR = 0x2, + /** + * FACE_AND_FLOOR = FACE | FLOOR + */ + FACE_AND_FLOOR = 0x3, + DEFROST = 0x4, + /** + * DEFROST_AND_FLOOR = DEFROST | FLOOR + */ + DEFROST_AND_FLOOR = 0x06, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleHwKeyInputAction.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleHwKeyInputAction.aidl new file mode 100644 index 0000000000..2dfd070eaa --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleHwKeyInputAction.aidl @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehicleHwKeyInputAction { + /** + * Key down + */ + ACTION_DOWN = 0, + /** + * Key up + */ + ACTION_UP = 1, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleIgnitionState.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleIgnitionState.aidl new file mode 100644 index 0000000000..cf9db976b8 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleIgnitionState.aidl @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehicleIgnitionState { + UNDEFINED = 0, + /** + * Steering wheel is locked + */ + LOCK = 1, + /** + * Steering wheel is not locked, engine and all accessories are OFF. If + * car can be in LOCK and OFF state at the same time than HAL must report + * LOCK state. + */ + OFF, + /** + * Typically in this state accessories become available (e.g. radio). + * Instrument cluster and engine are turned off + */ + ACC, + /** + * Ignition is in state ON. Accessories and instrument cluster available, + * engine might be running or ready to be started. + */ + ON, + /** + * Typically in this state engine is starting (cranking). + */ + START, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleLightState.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleLightState.aidl new file mode 100644 index 0000000000..bfe9163dc7 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleLightState.aidl @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Used by lights state properties to enumerate the current state of the lights. + * + * Most XXX_LIGHTS_STATE properties will only report ON and OFF states. Only + * the HEADLIGHTS_STATE property will report DAYTIME_RUNNING. + */ +// @VintfStability +@Backing(type="int") +enum VehicleLightState { + OFF = 0, + ON = 1, + DAYTIME_RUNNING = 2, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleLightSwitch.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleLightSwitch.aidl new file mode 100644 index 0000000000..061f85d714 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleLightSwitch.aidl @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Used by lights switch properties to enumerate user selected switch setting. + * + * XXX_LIGHTS_SWITCH properties report the switch settings that the user + * selects. The switch setting may be decoupled from the state reported if the + * user selects AUTOMATIC. + */ +// @VintfStability +@Backing(type="int") +enum VehicleLightSwitch { + OFF = 0, + ON = 1, + /** + * Daytime running lights mode. Most cars automatically use DRL but some + * cars allow the user to activate them manually. + */ + DAYTIME_RUNNING = 2, + /** + * Allows the vehicle ECU to set the lights automatically + */ + AUTOMATIC = 0x100, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleOilLevel.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleOilLevel.aidl new file mode 100644 index 0000000000..8ea629321b --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleOilLevel.aidl @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehicleOilLevel { + /** + * Oil level values + */ + CRITICALLY_LOW = 0, + LOW = 1, + NORMAL = 2, + HIGH = 3, + ERROR = 4, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropConfig.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropConfig.aidl new file mode 100644 index 0000000000..3b4e10a1ff --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropConfig.aidl @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.VehicleAreaConfig; +import android.hardware.automotive.vehicle.VehiclePropertyAccess; +import android.hardware.automotive.vehicle.VehiclePropertyChangeMode; + +// @VintfStability +parcelable VehiclePropConfig { + /** Property identifier */ + int prop; + + /** + * Defines if the property is read or write or both. + */ + VehiclePropertyAccess access = VehiclePropertyAccess.NONE; + + /** + * Defines the change mode of the property. + */ + VehiclePropertyChangeMode changeMode = VehiclePropertyChangeMode.STATIC; + + /** + * Contains per-area configuration. + */ + VehicleAreaConfig[] areaConfigs; + + /** Contains additional configuration parameters */ + int[] configArray; + + /** + * Some properties may require additional information passed over this + * string. Most properties do not need to set this. + */ + @utf8InCpp String configString; + + /** + * Min sample rate in Hz. + * Must be defined for VehiclePropertyChangeMode::CONTINUOUS + */ + float minSampleRate; + + /** + * Must be defined for VehiclePropertyChangeMode::CONTINUOUS + * Max sample rate in Hz. + */ + float maxSampleRate; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropValue.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropValue.aidl new file mode 100644 index 0000000000..4d403f93be --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropValue.aidl @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.VehiclePropertyStatus; + +/** + * Encapsulates the property name and the associated value. It + * is used across various API calls to set values, get values or to register for + * events. + */ +// @VintfStability +parcelable VehiclePropValue { + /** Time is elapsed nanoseconds since boot */ + long timestamp; + + /** + * Area type(s) for non-global property it must be one of the value from + * VehicleArea* enums or 0 for global properties. + */ + int areaId; + + /** Property identifier */ + int prop; + + /** Status of the property */ + VehiclePropertyStatus status; + + /** + * This is used for properties of types VehiclePropertyType#INT + * and VehiclePropertyType#INT_VEC + */ + int[] int32Values; + + /** + * This is used for properties of types VehiclePropertyType#FLOAT + * and VehiclePropertyType#FLOAT_VEC + */ + float[] floatValues; + + /** This is used for properties of type VehiclePropertyType#INT64 */ + long[] int64Values; + + /** This is used for properties of type VehiclePropertyType#BYTES */ + byte[] byteValues; + + /** This is used for properties of type VehiclePropertyType#STRING */ + @utf8InCpp String stringValue; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropValueRawValue.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropValueRawValue.aidl new file mode 100644 index 0000000000..325b7f0efa --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropValueRawValue.aidl @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Contains value for a single property. Depending on property data type of + * this property (VehiclePropetyType) one field of this structure must be filled in. + */ +// @VintfStability +parcelable VehiclePropValueRawValue { + /** + * This is used for properties of types VehiclePropertyType#INT + * and VehiclePropertyType#INT_VEC + */ + int[] int32Values; + /** + * This is used for properties of types VehiclePropertyType#FLOAT + * and VehiclePropertyType#FLOAT_VEC + */ + float[] floatValues; + /** + * This is used for properties of type VehiclePropertyType#INT64 + */ + long[] int64Values; + /** + * This is used for properties of type VehiclePropertyType#BYTES + */ + byte[] bytes; + /** + * This is used for properties of type VehiclePropertyType#STRING + */ + @utf8InCpp String stringValue; +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleProperty.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleProperty.aidl new file mode 100644 index 0000000000..a3a4b3d62f --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleProperty.aidl @@ -0,0 +1,2587 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.VehiclePropertyType; +/** + * Declares all vehicle properties. VehicleProperty has a bitwise structure. + * Each property must have: + * - a unique id from range 0x0100 - 0xffff + * - associated data type using VehiclePropertyType + * - property group (VehiclePropertyGroup) + * - vehicle area (VehicleArea) + * + * Vendors are allowed to extend this enum with their own properties. In this + * case they must use VehiclePropertyGroup:VENDOR flag when the property is + * declared. + * + * When a property's status field is not set to AVAILABLE: + * - IVehicle#set may return StatusCode::NOT_AVAILABLE. + * - IVehicle#get is not guaranteed to work. + * + * Properties set to values out of range must be ignored and no action taken + * in response to such ill formed requests. + */ +// @VintfStability +@Backing(type="int") +enum VehicleProperty { + /** + * Undefined property. + */ + INVALID = 0x00000000, + /** + * VIN of vehicle + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + */ + INFO_VIN = 0x0100 + 0x10000000 + 0x01000000 + + 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING + /** + * Manufacturer of vehicle + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + */ + INFO_MAKE = 0x0101 + 0x10000000 + 0x01000000 + + 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING + /** + * Model of vehicle + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + */ + INFO_MODEL = 0x0102 + 0x10000000 + 0x01000000 + + 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING + /** + * Model year of vehicle. + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:YEAR + */ + INFO_MODEL_YEAR = 0x0103 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Fuel capacity of the vehicle in milliliters + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:MILLILITER + */ + INFO_FUEL_CAPACITY = 0x0104 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * List of fuels the vehicle may use + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + * @data_enum FuelType + */ + INFO_FUEL_TYPE = 0x0105 + 0x10000000 + 0x01000000 + + 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC + /** + * Battery capacity of the vehicle, if EV or hybrid. This is the nominal + * battery capacity when the vehicle is new. + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:WH + */ + INFO_EV_BATTERY_CAPACITY = 0x0106 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * List of connectors this EV may use + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @data_enum EvConnectorType + * @access VehiclePropertyAccess:READ + */ + INFO_EV_CONNECTOR_TYPE = 0x0107 + 0x10000000 + 0x01000000 + + 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC + /** + * Fuel door location + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @data_enum PortLocationType + * @access VehiclePropertyAccess:READ + */ + INFO_FUEL_DOOR_LOCATION = 0x0108 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * EV port location + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + * @data_enum PortLocationType + */ + INFO_EV_PORT_LOCATION = 0x0109 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Driver's seat location + * VHAL implementations must ignore the areaId. Use VehicleArea:GLOBAL. + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @data_enum VehicleAreaSeat + * @access VehiclePropertyAccess:READ + */ + INFO_DRIVER_SEAT = 0x010A + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Exterior dimensions of vehicle. + * + * int32Values[0] = height + * int32Values[1] = length + * int32Values[2] = width + * int32Values[3] = width including mirrors + * int32Values[4] = wheel base + * int32Values[5] = track width front + * int32Values[6] = track width rear + * int32Values[7] = curb to curb turning radius + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:MILLIMETER + */ + INFO_EXTERIOR_DIMENSIONS = 0x010B + 0x10000000 + 0x01000000 + + 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC + /** + * Multiple EV port locations + * + * Implement this property if the vehicle has multiple EV ports. + * Port locations are defined in PortLocationType. + * For example, a car has one port in front left and one port in rear left: + * int32Values[0] = PortLocationType::FRONT_LEFT + * int32Values[0] = PortLocationType::REAR_LEFT + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + * @data_enum PortLocationType + */ + INFO_MULTI_EV_PORT_LOCATIONS = 0x010C + 0x10000000 + 0x01000000 + + 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC + /** + * Current odometer value of the vehicle + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:KILOMETER + */ + PERF_ODOMETER = 0x0204 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * Speed of the vehicle + * + * The value must be positive when the vehicle is moving forward and negative when + * the vehicle is moving backward. This value is independent of gear value + * (CURRENT_GEAR or GEAR_SELECTION), for example, if GEAR_SELECTION is GEAR_NEUTRAL, + * PERF_VEHICLE_SPEED is positive when the vehicle is moving forward, negative when moving + * backward, and zero when not moving. + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:METER_PER_SEC + */ + PERF_VEHICLE_SPEED = 0x0207 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * Speed of the vehicle for displays + * + * Some cars display a slightly slower speed than the actual speed. This is + * usually displayed on the speedometer. + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:METER_PER_SEC + */ + PERF_VEHICLE_SPEED_DISPLAY = 0x0208 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * Front bicycle model steering angle for vehicle + * + * Angle is in degrees. Left is negative. + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:DEGREES + */ + PERF_STEERING_ANGLE = 0x0209 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * Rear bicycle model steering angle for vehicle + * + * Angle is in degrees. Left is negative. + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:DEGREES + */ + PERF_REAR_STEERING_ANGLE = 0x0210 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * Temperature of engine coolant + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:CELSIUS + */ + ENGINE_COOLANT_TEMP = 0x0301 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * Engine oil level + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum VehicleOilLevel + */ + ENGINE_OIL_LEVEL = 0x0303 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Temperature of engine oil + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:CELSIUS + */ + ENGINE_OIL_TEMP = 0x0304 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * Engine rpm + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:RPM + */ + ENGINE_RPM = 0x0305 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * Reports wheel ticks + * + * The first element in the vector is a reset count. A reset indicates + * previous tick counts are not comparable with this and future ones. Some + * sort of discontinuity in tick counting has occurred. + * + * The next four elements represent ticks for individual wheels in the + * following order: front left, front right, rear right, rear left. All + * tick counts are cumulative. Tick counts increment when the vehicle + * moves forward, and decrement when vehicles moves in reverse. The ticks + * should be reset to 0 when the vehicle is started by the user. + * + * int64Values[0] = reset count + * int64Values[1] = front left ticks + * int64Values[2] = front right ticks + * int64Values[3] = rear right ticks + * int64Values[4] = rear left ticks + * + * configArray is used to indicate the micrometers-per-wheel-tick value and + * which wheels are supported. configArray is set as follows: + * + * configArray[0], bits [0:3] = supported wheels. Uses enum Wheel. + * configArray[1] = micrometers per front left wheel tick + * configArray[2] = micrometers per front right wheel tick + * configArray[3] = micrometers per rear right wheel tick + * configArray[4] = micrometers per rear left wheel tick + * + * NOTE: If a wheel is not supported, its value shall always be set to 0. + * + * VehiclePropValue.timestamp must be correctly filled in. + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + */ + WHEEL_TICK = 0x0306 + 0x10000000 + 0x01000000 + + 0x00510000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT64_VEC + /** + * Fuel remaining in the vehicle, in milliliters + * + * Value may not exceed INFO_FUEL_CAPACITY + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:MILLILITER + */ + FUEL_LEVEL = 0x0307 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * Fuel door open + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + FUEL_DOOR_OPEN = 0x0308 + 0x10000000 + 0x01000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN + /** + * EV battery level in WH, if EV or hybrid + * + * Value may not exceed INFO_EV_BATTERY_CAPACITY + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:WH + */ + EV_BATTERY_LEVEL = 0x0309 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * EV charge port open + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + EV_CHARGE_PORT_OPEN = 0x030A + 0x10000000 + 0x01000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN + /** + * EV charge port connected + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + EV_CHARGE_PORT_CONNECTED = 0x030B + 0x10000000 + 0x01000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN + /** + * EV instantaneous charge rate in milliwatts + * + * Positive value indicates battery is being charged. + * Negative value indicates battery being discharged. + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:MW + */ + EV_BATTERY_INSTANTANEOUS_CHARGE_RATE = 0x030C + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * Range remaining + * + * Meters remaining of fuel and charge. Range remaining shall account for + * all energy sources in a vehicle. For example, a hybrid car's range will + * be the sum of the ranges based on fuel and battery. + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ_WRITE + * @unit VehicleUnit:METER + */ + RANGE_REMAINING = 0x0308 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * Tire pressure + * + * Each tires is identified by its areaConfig.areaId config and their + * minFloatValue/maxFloatValue are used to store OEM recommended pressure + * range. + * The Min value in the areaConfig data represents the lower bound of + * the recommended tire pressure. + * The Max value in the areaConfig data represents the upper bound of + * the recommended tire pressure. + * For example: + * The following areaConfig indicates the recommended tire pressure + * of left_front tire is from 200.0 KILOPASCAL to 240.0 KILOPASCAL. + * .areaConfigs = { + * VehicleAreaConfig { + * .areaId = VehicleAreaWheel::LEFT_FRONT, + * .minFloatValue = 200.0, + * .maxFloatValue = 240.0, + * } + * }, + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:KILOPASCAL + */ + TIRE_PRESSURE = 0x0309 + 0x10000000 + 0x07000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WHEEL,VehiclePropertyType:FLOAT + /** + * Critically low tire pressure + * + * This property indicates the critically low pressure threshold for each tire. + * It indicates when it is time for tires to be replaced or fixed. The value + * must be less than or equal to minFloatValue in TIRE_PRESSURE. + * Minimum and maximum property values (that is, minFloatValue, maxFloatValue) + * are not applicable to this property. + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:KILOPASCAL + */ + CRITICALLY_LOW_TIRE_PRESSURE = 0x030A + 0x10000000 + 0x07000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WHEEL,VehiclePropertyType:FLOAT + /** + * Currently selected gear + * + * This is the gear selected by the user. + * + * Values in the config data must represent the list of supported gears + * for this vehicle. For example, config data for an automatic transmission + * must contain {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_PARK, GEAR_DRIVE, + * GEAR_1, GEAR_2,...} and for manual transmission the list must be + * {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_1, GEAR_2,...} + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum VehicleGear + */ + GEAR_SELECTION = 0x0400 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Current gear. In non-manual case, selected gear may not + * match the current gear. For example, if the selected gear is GEAR_DRIVE, + * the current gear will be one of GEAR_1, GEAR_2 etc, which reflects + * the actual gear the transmission is currently running in. + * + * Values in the config data must represent the list of supported gears + * for this vehicle. For example, config data for an automatic transmission + * must contain {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_PARK, GEAR_1, GEAR_2,...} + * and for manual transmission the list must be + * {GEAR_NEUTRAL, GEAR_REVERSE, GEAR_1, GEAR_2,...}. This list need not be the + * same as that of the supported gears reported in GEAR_SELECTION. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum VehicleGear + */ + CURRENT_GEAR = 0x0401 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Parking brake state. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + PARKING_BRAKE_ON = 0x0402 + 0x10000000 + 0x01000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN + /** + * Auto-apply parking brake. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + PARKING_BRAKE_AUTO_APPLY = 0x0403 + 0x10000000 + 0x01000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN + /** + * Warning for fuel low level. + * + * This property corresponds to the low fuel warning on the dashboard. + * Once FUEL_LEVEL_LOW is set, it should not be cleared until more fuel is + * added to the vehicle. This property may take into account all fuel + * sources for a vehicle - for example: + * + * For a gas powered vehicle, this property is based soley on gas level. + * For a battery powered vehicle, this property is based solely on battery level. + * For a hybrid vehicle, this property may be based on the combination of gas and battery + * levels, at the OEM's discretion. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + FUEL_LEVEL_LOW = 0x0405 + 0x10000000 + 0x01000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN + /** + * Night mode + * + * True indicates that the night mode sensor has detected that the car cabin environment has + * low light. The platform could use this, for example, to enable appropriate UI for + * better viewing in dark or low light environments. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + NIGHT_MODE = 0x0407 + 0x10000000 + 0x01000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN + /** + * State of the vehicles turn signals + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum VehicleTurnSignal + */ + TURN_SIGNAL_STATE = 0x0408 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Represents ignition state + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum VehicleIgnitionState + */ + IGNITION_STATE = 0x0409 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * ABS is active + * + * Set to true when ABS is active. Reset to false when ABS is off. This + * property may be intermittently set (pulsing) based on the real-time + * state of the ABS system. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + ABS_ACTIVE = 0x040A + 0x10000000 + 0x01000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN + /** + * Traction Control is active + * + * Set to true when traction control (TC) is active. Reset to false when + * TC is off. This property may be intermittently set (pulsing) based on + * the real-time state of the TC system. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + TRACTION_CONTROL_ACTIVE = 0x040B + 0x10000000 + 0x01000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN + /* + * HVAC Properties + * + * Additional rules for mapping a zoned HVAC property (except + * HVAC_MAX_DEFROST_ON) to AreaIDs: + * - Every seat in VehicleAreaSeat that is available in the car, must be + * part of an AreaID in the AreaID array. + * + * Example 1: A car has two front seats (ROW_1_LEFT, ROW_1_RIGHT) and three + * back seats (ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT). There are two + * temperature control units -- driver side and passenger side. + * - A valid mapping set of AreaIDs for HVAC_TEMPERATURE_SET would be a + * two element array: + * - ROW_1_LEFT | ROW_2_LEFT + * - ROW_1_RIGHT | ROW_2_CENTER | ROW_2_RIGHT + * - An alternative mapping for the same hardware configuration would be: + * - ROW_1_LEFT | ROW_2_CENTER | ROW_2_LEFT + * - ROW_1_RIGHT | ROW_2_RIGHT + * The temperature controllers are assigned to the seats which they + * "most influence", but every seat must be included exactly once. The + * assignment of the center rear seat to the left or right AreaID may seem + * arbitrary, but the inclusion of every seat in exactly one AreaID ensures + * that the seats in the car are all expressed and that a "reasonable" way + * to affect each seat is available. + * + * Example 2: A car has three seat rows with two seats in the front row (ROW_1_LEFT, + * ROW_1_RIGHT) and three seats in the second (ROW_2_LEFT, ROW_2_CENTER, + * ROW_2_RIGHT) and third rows (ROW_3_LEFT, ROW_3_CENTER, ROW_3_RIGHT). There + * are three temperature control units -- driver side, passenger side, and rear. + * - A reasonable way to map HVAC_TEMPERATURE_SET to AreaIDs is a three + * element array: + * - ROW_1_LEFT + * - ROW_1_RIGHT + * - ROW_2_LEFT | ROW_2_CENTER | ROW_2_RIGHT | ROW_3_LEFT | ROW_3_CENTER | ROW_3_RIGHT + * + * + * Fan speed setting + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_FAN_SPEED = 0x0500 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Fan direction setting + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @data_enum VehicleHvacFanDirection + */ + HVAC_FAN_DIRECTION = 0x0501 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * HVAC current temperature. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:CELSIUS + */ + HVAC_TEMPERATURE_CURRENT = 0x0502 + 0x10000000 + 0x05000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:FLOAT + /** + * HVAC, target temperature set. + * + * The configArray is used to indicate the valid values for HVAC in Fahrenheit and Celsius. + * Android might use it in the HVAC app UI. + * The configArray is set as follows: + * configArray[0] = [the lower bound of the supported temperature in Celsius] * 10. + * configArray[1] = [the upper bound of the supported temperature in Celsius] * 10. + * configArray[2] = [the increment in Celsius] * 10. + * configArray[3] = [the lower bound of the supported temperature in Fahrenheit] * 10. + * configArray[4] = [the upper bound of the supported temperature in Fahrenheit] * 10. + * configArray[5] = [the increment in Fahrenheit] * 10. + * For example, if the vehicle supports temperature values as: + * [16.0, 16.5, 17.0 ,..., 28.0] in Celsius + * [60.5, 61.5, 62.5 ,..., 85.5] in Fahrenheit. + * The configArray should be configArray = {160, 280, 5, 605, 825, 10}. + * + * If the vehicle supports HVAC_TEMPERATURE_VALUE_SUGGESTION, the application can use + * that property to get the suggested value before setting HVAC_TEMPERATURE_SET. Otherwise, + * the application may choose the value in HVAC_TEMPERATURE_SET configArray by itself. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @unit VehicleUnit:CELSIUS + */ + HVAC_TEMPERATURE_SET = 0x0503 + 0x10000000 + 0x05000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:FLOAT + /** + * Fan-based defrost for designated window. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_DEFROSTER = 0x0504 + 0x10000000 + 0x03000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:BOOLEAN + /** + * On/off AC for designated areaId + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @config_flags Supported areaIds + */ + HVAC_AC_ON = 0x0505 + 0x10000000 + 0x05000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN + /** + * On/off max AC + * + * When MAX AC is on, the ECU may adjust the vent position, fan speed, + * temperature, etc as necessary to cool the vehicle as quickly as possible. + * Any parameters modified as a side effect of turning on/off the MAX AC + * parameter shall generate onPropertyEvent() callbacks to the VHAL. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_MAX_AC_ON = 0x0506 + 0x10000000 + 0x05000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN + /** + * On/off max defrost + * + * When MAX DEFROST is on, the ECU may adjust the vent position, fan speed, + * temperature, etc as necessary to defrost the windows as quickly as + * possible. Any parameters modified as a side effect of turning on/off + * the MAX DEFROST parameter shall generate onPropertyEvent() callbacks to + * the VHAL. + * The AreaIDs for HVAC_MAX_DEFROST_ON indicate MAX DEFROST can be controlled + * in the area. + * For example: + * areaConfig.areaId = {ROW_1_LEFT | ROW_1_RIGHT} indicates HVAC_MAX_DEFROST_ON + * only can be controlled for the front rows. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_MAX_DEFROST_ON = 0x0507 + 0x10000000 + 0x05000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN + /** + * Recirculation on/off + * + * Controls the supply of exterior air to the cabin. Recirc “on” means the + * majority of the airflow into the cabin is originating in the cabin. + * Recirc “off” means the majority of the airflow into the cabin is coming + * from outside the car. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_RECIRC_ON = 0x0508 + 0x10000000 + 0x05000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN + /** + * Enable temperature coupling between areas. + * + * The AreaIDs for HVAC_DUAL_ON property shall contain a combination of + * HVAC_TEMPERATURE_SET AreaIDs that can be coupled together. If + * HVAC_TEMPERATURE_SET is mapped to AreaIDs [a_1, a_2, ..., a_n], and if + * HVAC_DUAL_ON can be enabled to couple a_i and a_j, then HVAC_DUAL_ON + * property must be mapped to [a_i | a_j]. Further, if a_k and a_l can also + * be coupled together separately then HVAC_DUAL_ON must be mapped to + * [a_i | a_j, a_k | a_l]. + * + * Example: A car has two front seats (ROW_1_LEFT, ROW_1_RIGHT) and three + * back seats (ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT). There are two + * temperature control units -- driver side and passenger side -- which can + * be optionally synchronized. This may be expressed in the AreaIDs this way: + * - HVAC_TEMPERATURE_SET->[ROW_1_LEFT | ROW_2_LEFT, ROW_1_RIGHT | ROW_2_CENTER | ROW_2_RIGHT] + * - HVAC_DUAL_ON->[ROW_1_LEFT | ROW_2_LEFT | ROW_1_RIGHT | ROW_2_CENTER | ROW_2_RIGHT] + * + * When the property is enabled, the ECU must synchronize the temperature + * for the affected areas. Any parameters modified as a side effect + * of turning on/off the DUAL_ON parameter shall generate + * onPropertyEvent() callbacks to the VHAL. In addition, if setting + * a temperature (i.e. driver's temperature) changes another temperature + * (i.e. front passenger's temperature), then the appropriate + * onPropertyEvent() callbacks must be generated. If a user changes a + * temperature that breaks the coupling (e.g. setting the passenger + * temperature independently) then the VHAL must send the appropriate + * onPropertyEvent() callbacks (i.e. HVAC_DUAL_ON = false, + * HVAC_TEMPERATURE_SET[AreaID] = xxx, etc). + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_DUAL_ON = 0x0509 + 0x10000000 + 0x05000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN + /** + * On/off automatic mode + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_AUTO_ON = 0x050A + 0x10000000 + 0x05000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN + /** + * Seat heating/cooling + * + * Negative values indicate cooling. + * 0 indicates off. + * Positive values indicate heating. + * + * Some vehicles may have multiple levels of heating and cooling. The + * min/max range defines the allowable range and number of steps in each + * direction. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_SEAT_TEMPERATURE = 0x050B + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Side Mirror Heat + * + * Increasing values denote higher heating levels for side mirrors. + * The Max value in the config data represents the highest heating level. + * The Min value in the config data MUST be zero and indicates no heating. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_SIDE_MIRROR_HEAT = 0x050C + 0x10000000 + 0x04000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:MIRROR,VehiclePropertyType:INT32 + /** + * Steering Wheel Heating/Cooling + * + * Sets the amount of heating/cooling for the steering wheel + * config data Min and Max MUST be set appropriately. + * Positive value indicates heating. + * Negative value indicates cooling. + * 0 indicates temperature control is off. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_STEERING_WHEEL_HEAT = 0x050D + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Temperature units for display + * + * Indicates whether the vehicle is displaying temperature to the user as + * Celsius or Fahrenheit. + * VehiclePropConfig.configArray is used to indicate the supported temperature display units. + * For example: configArray[0] = CELSIUS + * configArray[1] = FAHRENHEIT + * + * This parameter MAY be used for displaying any HVAC temperature in the system. + * Values must be one of VehicleUnit::CELSIUS or VehicleUnit::FAHRENHEIT + * Note that internally, all temperatures are represented in floating point Celsius. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @data_enum VehicleUnit + */ + HVAC_TEMPERATURE_DISPLAY_UNITS = 0x050E + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Actual fan speed + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + HVAC_ACTUAL_FAN_SPEED_RPM = 0x050F + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Represents global power state for HVAC. Setting this property to false + * MAY mark some properties that control individual HVAC features/subsystems + * to UNAVAILABLE state. Setting this property to true MAY mark some + * properties that control individual HVAC features/subsystems to AVAILABLE + * state (unless any/all of them are UNAVAILABLE on their own individual + * merits). + * + * [Definition] HvacPower_DependentProperties: Properties that need HVAC to be + * powered on in order to enable their functionality. For example, in some cars, + * in order to turn on the AC, HVAC must be powered on first. + * + * HvacPower_DependentProperties list must be set in the + * VehiclePropConfig.configArray. HvacPower_DependentProperties must only contain + * properties that are associated with VehicleArea:SEAT. Properties that are not + * associated with VehicleArea:SEAT, for example, HVAC_DEFROSTER, must never + * depend on HVAC_POWER_ON property and must never be part of + * HvacPower_DependentProperties list. + * + * AreaID mapping for HVAC_POWER_ON property must contain all AreaIDs that + * HvacPower_DependentProperties are mapped to. + * + * Example 1: A car has two front seats (ROW_1_LEFT, ROW_1_RIGHT) and three back + * seats (ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT). If the HVAC features (AC, + * Temperature etc.) throughout the car are dependent on a single HVAC power + * controller then HVAC_POWER_ON must be mapped to + * [ROW_1_LEFT | ROW_1_RIGHT | ROW_2_LEFT | ROW_2_CENTER | ROW_2_RIGHT]. + * + * Example 2: A car has two seats in the front row (ROW_1_LEFT, ROW_1_RIGHT) and + * three seats in the second (ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT) and third + * rows (ROW_3_LEFT, ROW_3_CENTER, ROW_3_RIGHT). If the car has temperature + * controllers in the front row which can operate entirely independently of + * temperature controllers in the back of the vehicle, then HVAC_POWER_ON + * must be mapped to a two element array: + * - ROW_1_LEFT | ROW_1_RIGHT + * - ROW_2_LEFT | ROW_2_CENTER | ROW_2_RIGHT | ROW_3_LEFT | ROW_3_CENTER | ROW_3_RIGHT + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_POWER_ON = 0x0510 + 0x10000000 + 0x05000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN + /** + * Fan Positions Available + * + * This is a bit mask of fan positions available for the zone. Each + * available fan direction is denoted by a separate entry in the vector. A + * fan direction may have multiple bits from vehicle_hvac_fan_direction set. + * For instance, a typical car may have the following fan positions: + * - FAN_DIRECTION_FACE (0x1) + * - FAN_DIRECTION_FLOOR (0x2) + * - FAN_DIRECTION_FACE | FAN_DIRECTION_FLOOR (0x3) + * - FAN_DIRECTION_DEFROST (0x4) + * - FAN_DIRECTION_FLOOR | FAN_DIRECTION_DEFROST (0x6) + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + * @data_enum VehicleHvacFanDirection + */ + HVAC_FAN_DIRECTION_AVAILABLE = 0x0511 + 0x10000000 + 0x05000000 + + 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32_VEC + /** + * Automatic recirculation on/off + * + * When automatic recirculation is ON, the HVAC system may automatically + * switch to recirculation mode if the vehicle detects poor incoming air + * quality. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_AUTO_RECIRC_ON = 0x0512 + 0x10000000 + 0x05000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN + /** + * Seat ventilation + * + * 0 indicates off. + * Positive values indicates ventilation level. + * + * Used by HVAC apps and Assistant to enable, change, or read state of seat + * ventilation. This is different than seating cooling. It can be on at the + * same time as cooling, or not. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_SEAT_VENTILATION = 0x0513 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Electric defrosters' status + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_ELECTRIC_DEFROSTER_ON = 0x0514 + 0x10000000 + 0x03000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:BOOLEAN + /** + * Suggested values for setting HVAC temperature. + * + * Implement the property to help applications understand the closest supported temperature + * value in Celsius or Fahrenheit. + * + * floatValues[0] = the requested value that an application wants to set a temperature to. + * floatValues[1] = the unit for floatValues[0]. It should be one of + * {VehicleUnit:CELSIUS, VehicleUnit:FAHRENHEIT}. + * floatValues[2] = the value OEMs suggested in CELSIUS. This value is not included + * in the request. + * floatValues[3] = the value OEMs suggested in FAHRENHEIT. This value is not included + * in the request. + * + * An application calls set(VehiclePropValue propValue) with the requested value and unit for + * the value. OEMs need to return the suggested values in floatValues[2] and floatValues[3] by + * onPropertyEvent() callbacks. + * + * For example, when a user uses the voice assistant to set HVAC temperature to 66.2 in + * Fahrenheit. + * First, an application will set this property with the value + * [66.2, (float)VehicleUnit:FAHRENHEIT,0,0]. + * If OEMs suggest to set 19.0 in Celsius or 66.5 in Fahrenheit for user's request, then VHAL + * must generate a callback with property value + * [66.2, (float)VehicleUnit:FAHRENHEIT, 19.0, 66.5]. After the voice assistant gets the + * callback, it will inform the user and set HVAC temperature to the suggested value. + * + * Another example, an application receives 21 Celsius as the current temperature value by + * querying HVC_TEMPERATURE_SET. But the application wants to know what value is displayed on + * the car's UI in Fahrenheit. + * For this, the application sets the property to [21, (float)VehicleUnit:CELSIUS, 0, 0]. If + * the suggested value by the OEM for 21 Celsius is 70 Fahrenheit, then VHAL must generate a + * callback with property value [21, (float)VehicleUnit:CELSIUS, 21.0, 70.0]. + * In this case, the application can know that the value is 70.0 Fahrenheit in the car’s UI. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + HVAC_TEMPERATURE_VALUE_SUGGESTION = 0x0515 + 0x10000000 + 0x01000000 + + 0x00610000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT_VEC + /** + * Distance units for display + * + * Indicates which units the car is using to display distances to the user. Eg. Mile, Meter + * Kilometer. + * + * Distance units are defined in VehicleUnit. + * VehiclePropConfig.configArray is used to indicate the supported distance display units. + * For example: configArray[0] = METER + * configArray[1] = KILOMETER + * configArray[2] = MILE + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @data_enum VehicleUnit + */ + DISTANCE_DISPLAY_UNITS = 0x0600 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Fuel volume units for display + * + * Indicates which units the car is using to display fuel volume to the user. Eg. Liter or + * Gallon. + * + * VehiclePropConfig.configArray is used to indicate the supported fuel volume display units. + * Volume units are defined in VehicleUnit. + * For example: configArray[0] = LITER + * configArray[1] = GALLON + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @data_enum VehicleUnit + */ + FUEL_VOLUME_DISPLAY_UNITS = 0x0601 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Tire pressure units for display + * + * Indicates which units the car is using to display tire pressure to the user. Eg. PSI, Bar or + * Kilopascal. + * + * VehiclePropConfig.configArray is used to indicate the supported pressure display units. + * Pressure units are defined in VehicleUnit. + * For example: configArray[0] = KILOPASCAL + * configArray[1] = PSI + * configArray[2] = BAR + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @data_enum VehicleUnit + */ + TIRE_PRESSURE_DISPLAY_UNITS = 0x0602 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * EV battery units for display + * + * Indicates which units the car is using to display EV battery information to the user. Eg. + * watt-hours(Wh), kilowatt-hours(kWh) or ampere-hours(Ah). + * + * VehiclePropConfig.configArray is used to indicate the supported electrical energy units. + * Electrical energy units are defined in VehicleUnit. + * For example: configArray[0] = WATT_HOUR + * configArray[1] = AMPERE_HOURS + * configArray[2] = KILOWATT_HOUR + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @data_enum VehicleUnit + */ + EV_BATTERY_DISPLAY_UNITS = 0x0603 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Fuel consumption units for display + * + * Indicates type of units the car is using to display fuel consumption information to user + * True indicates units are distance over volume such as MPG. + * False indicates units are volume over distance such as L/100KM. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME = 0x0604 + 0x10000000 + 0x01000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN + /** + * Speed units for display + * + * Indicates type of units the car is using to display speed to user. Eg. m/s, km/h, or mph. + * + * VehiclePropConfig.configArray is used to indicate the supported speed display units. + * Pressure units are defined in VehicleUnit. + * For example: configArray[0] = METER_PER_SEC + * configArray[1] = MILES_PER_HOUR + * configArray[2] = KILOMETERS_PER_HOUR + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + VEHICLE_SPEED_DISPLAY_UNITS = 0x0605 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Current date and time, encoded as Unix time (in milliseconds). + * This value denotes the number of milliseconds seconds that have + * elapsed since 1/1/1970 UTC. + * + * Reading this value will give you the system’s time. This can be + * useful to synchronize other vehicle systems (dash clock etc). + * + * Writing this value will update the ‘ExternalTimeSuggestion’ + * value (if enabled). This value may be consumed by the “Time + * Detector Service”, if other sources do not have a higher + * priority. For information on how to adjust time source + * priorities see Time Detector Service documentation. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @unit VehicleUnit:MILLI_SECS + */ + EPOCH_TIME = 0x0606 + 0x10000000 + 0x01000000 + + 0x00500000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT64 + /** + * External encryption binding seed. + * + * This value is mixed with the local key storage encryption key. + * This property holds 16 bytes, and is expected to be persisted on an ECU separate from + * the IVI. The property is initially set by AAOS, who generates it using a CSRNG. + * AAOS will then read the property on subsequent boots. The binding seed is expected to be + * reliably persisted. Any loss of the seed results in a factory reset of the IVI. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + STORAGE_ENCRYPTION_BINDING_SEED = 0x0607 + 0x10000000 + 0x01000000 + + 0x00700000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BYTES + /** + * Outside temperature + * + * @change_mode VehiclePropertyChangeMode:CONTINUOUS + * @access VehiclePropertyAccess:READ + * @unit VehicleUnit:CELSIUS + */ + ENV_OUTSIDE_TEMPERATURE = 0x0703 + 0x10000000 + 0x01000000 + + 0x00600000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:FLOAT + /** + * Property to control power state of application processor + * + * It is assumed that AP's power state is controlled by a separate power + * controller. + * + * For configuration information, VehiclePropConfig.configArray can have bit flag combining + * values in VehicleApPowerStateConfigFlag. + * + * int32Values[0] : VehicleApPowerStateReq enum value + * int32Values[1] : additional parameter relevant for each state, + * 0 if not used. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + AP_POWER_STATE_REQ = 0x0A00 + 0x10000000 + 0x01000000 + + 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC + /** + * Property to report power state of application processor + * + * It is assumed that AP's power state is controller by separate power + * controller. + * + * int32Values[0] : VehicleApPowerStateReport enum value + * int32Values[1] : Time in ms to wake up, if necessary. Otherwise 0. + + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + AP_POWER_STATE_REPORT = 0x0A01 + 0x10000000 + 0x01000000 + + 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC + /** + * Property to report bootup reason for the current power on. This is a + * static property that will not change for the whole duration until power + * off. For example, even if user presses power on button after automatic + * power on with door unlock, bootup reason must stay with + * VehicleApPowerBootupReason#USER_UNLOCK. + * + * int32Values[0] must be VehicleApPowerBootupReason. + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + */ + AP_POWER_BOOTUP_REASON = 0x0A02 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Property to represent brightness of the display. Some cars have single + * control for the brightness of all displays and this property is to share + * change in that control. + * + * If this is writable, android side can set this value when user changes + * display brightness from Settings. If this is read only, user may still + * change display brightness from Settings, but that must not be reflected + * to other displays. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + DISPLAY_BRIGHTNESS = 0x0A03 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Property to feed H/W input events to android + * + * int32Values[0] : action defined by VehicleHwKeyInputAction + * int32Values[1] : key code, must use standard android key code + * int32Values[2] : target display defined in VehicleDisplay. Events not + * tied to specific display must be sent to + * VehicleDisplay#MAIN. + * int32Values[3] : [optional] Number of ticks. The value must be equal or + * greater than 1. When omitted, Android will default to 1. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @config_flags + */ + HW_KEY_INPUT = 0x0A10 + 0x10000000 + 0x01000000 + + 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC + /** + * Property to feed H/W rotary events to android + * + * int32Values[0] : RotaryInputType identifying which rotary knob rotated + * int32Values[1] : number of detents (clicks), positive for clockwise, + * negative for counterclockwise + * int32Values[2] : target display defined in VehicleDisplay. Events not + * tied to specific display must be sent to + * VehicleDisplay#MAIN. + * int32values[3 .. 3 + abs(number of detents) - 2]: + * nanosecond deltas between pairs of consecutive detents, + * if the number of detents is > 1 or < -1 + * + * VehiclePropValue.timestamp: when the rotation occurred. If the number of + * detents is > 1 or < -1, this is when the + * first detent of rotation occurred. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @data_enum RotaryInputType + * @access VehiclePropertyAccess:READ + */ + HW_ROTARY_INPUT = 0x0A20 + 0x10000000 + 0x01000000 + + 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC + /** + * Defines a custom OEM partner input event. + * + * This input event must be used by OEM partners who wish to propagate events not supported + * by Android. It is composed by an array of int32 values only. + * + * The Android properties are: + * + * int32Values[0] : Input code identifying the function representing this event. Valid event + * types are defined by CustomInputType.CUSTOM_EVENT_F1 up to + * CustomInputType.CUSTOM_EVENT_F10. They represent the custom event to be + * defined by OEM partners. + * int32Values[1] : target display type defined in VehicleDisplay. Events not tied to specific + * display must be sent to VehicleDisplay#MAIN. + * int32Values[2] : repeat counter, if 0 then event is not repeated. Values 1 or above means + * how many times this event repeated. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @data_enum CustomInputType + * @access VehiclePropertyAccess:READ + */ + HW_CUSTOM_INPUT = 0X0A30 + 0x10000000 + 0x01000000 + + 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC + /*************************************************************************** + * Most Car Cabin properties have both a POSition and MOVE parameter. These + * are used to control the various movements for seats, doors, and windows + * in a vehicle. + * + * A POS parameter allows the user to set the absolution position. For + * instance, for a door, 0 indicates fully closed and max value indicates + * fully open. Thus, a value halfway between min and max must indicate + * the door is halfway open. + * + * A MOVE parameter moves the device in a particular direction. The sign + * indicates direction, and the magnitude indicates speed (if multiple + * speeds are available). For a door, a move of -1 will close the door, and + * a move of +1 will open it. Once a door reaches the limit of open/close, + * the door should automatically stop moving. The user must NOT need to + * send a MOVE(0) command to stop the door at the end of its range. + **************************************************************************/ + + /** + * Door position + * + * This is an integer in case a door may be set to a particular position. + * Max value indicates fully open, min value (0) indicates fully closed. + * + * Some vehicles (minivans) can open the door electronically. Hence, the + * ability to write this property. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + DOOR_POS = 0x0B00 + 0x10000000 + 0x06000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:DOOR,VehiclePropertyType:INT32 + /** + * Door move + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + DOOR_MOVE = 0x0B01 + 0x10000000 + 0x06000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:DOOR,VehiclePropertyType:INT32 + /** + * Door lock + * + * 'true' indicates door is locked + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + DOOR_LOCK = 0x0B02 + 0x10000000 + 0x06000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:DOOR,VehiclePropertyType:BOOLEAN + /** + * Mirror Z Position + * + * Positive value indicates tilt upwards, negative value is downwards + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + MIRROR_Z_POS = 0x0B40 + 0x10000000 + 0x04000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:MIRROR,VehiclePropertyType:INT32 + /** + * Mirror Z Move + * + * Positive value indicates tilt upwards, negative value is downwards + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + MIRROR_Z_MOVE = 0x0B41 + 0x10000000 + 0x04000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:MIRROR,VehiclePropertyType:INT32 + /** + * Mirror Y Position + * + * Positive value indicate tilt right, negative value is left + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + MIRROR_Y_POS = 0x0B42 + 0x10000000 + 0x04000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:MIRROR,VehiclePropertyType:INT32 + /** + * Mirror Y Move + * + * Positive value indicate tilt right, negative value is left + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + MIRROR_Y_MOVE = 0x0B43 + 0x10000000 + 0x04000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:MIRROR,VehiclePropertyType:INT32 + /** + * Mirror Lock + * + * True indicates mirror positions are locked and not changeable + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + MIRROR_LOCK = 0x0B44 + 0x10000000 + 0x01000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN + /** + * Mirror Fold + * + * True indicates mirrors are folded + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + MIRROR_FOLD = 0x0B45 + 0x10000000 + 0x01000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN + /** + * Seat memory select + * + * This parameter selects the memory preset to use to select the seat + * position. The minValue is always 0, and the maxValue determines the + * number of seat positions available. + * + * For instance, if the driver's seat has 3 memory presets, the maxValue + * will be 3. When the user wants to select a preset, the desired preset + * number (1, 2, or 3) is set. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:WRITE + */ + SEAT_MEMORY_SELECT = 0x0B80 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat memory set + * + * This setting allows the user to save the current seat position settings + * into the selected preset slot. The maxValue for each seat position + * must match the maxValue for SEAT_MEMORY_SELECT. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:WRITE + */ + SEAT_MEMORY_SET = 0x0B81 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seatbelt buckled + * + * True indicates belt is buckled. + * + * Write access indicates automatic seat buckling capabilities. There are + * no known cars at this time, but you never know... + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_BELT_BUCKLED = 0x0B82 + 0x10000000 + 0x05000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:BOOLEAN + /** + * Seatbelt height position + * + * Adjusts the shoulder belt anchor point. + * Max value indicates highest position + * Min value indicates lowest position + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_BELT_HEIGHT_POS = 0x0B83 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seatbelt height move + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_BELT_HEIGHT_MOVE = 0x0B84 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat fore/aft position + * + * Sets the seat position forward (closer to steering wheel) and backwards. + * Max value indicates closest to wheel, min value indicates most rearward + * position. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_FORE_AFT_POS = 0x0B85 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat fore/aft move + * + * Moves the seat position forward and aft. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_FORE_AFT_MOVE = 0x0B86 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat backrest angle 1 position + * + * Backrest angle 1 is the actuator closest to the bottom of the seat. + * Max value indicates angling forward towards the steering wheel. + * Min value indicates full recline. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_BACKREST_ANGLE_1_POS = 0x0B87 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat backrest angle 1 move + * + * Moves the backrest forward or recline. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_BACKREST_ANGLE_1_MOVE = 0x0B88 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat backrest angle 2 position + * + * Backrest angle 2 is the next actuator up from the bottom of the seat. + * Max value indicates angling forward towards the steering wheel. + * Min value indicates full recline. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_BACKREST_ANGLE_2_POS = 0x0B89 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat backrest angle 2 move + * + * Moves the backrest forward or recline. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_BACKREST_ANGLE_2_MOVE = 0x0B8A + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat height position + * + * Sets the seat height. + * Max value indicates highest position. + * Min value indicates lowest position. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_HEIGHT_POS = 0x0B8B + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat height move + * + * Moves the seat height. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_HEIGHT_MOVE = 0x0B8C + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat depth position + * + * Sets the seat depth, distance from back rest to front edge of seat. + * Max value indicates longest depth position. + * Min value indicates shortest position. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_DEPTH_POS = 0x0B8D + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat depth move + * + * Adjusts the seat depth. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_DEPTH_MOVE = 0x0B8E + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat tilt position + * + * Sets the seat tilt. + * Max value indicates front edge of seat higher than back edge. + * Min value indicates front edge of seat lower than back edge. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_TILT_POS = 0x0B8F + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat tilt move + * + * Tilts the seat. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_TILT_MOVE = 0x0B90 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Lumber fore/aft position + * + * Pushes the lumbar support forward and backwards + * Max value indicates most forward position. + * Min value indicates most rearward position. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_LUMBAR_FORE_AFT_POS = 0x0B91 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Lumbar fore/aft move + * + * Adjusts the lumbar support. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_LUMBAR_FORE_AFT_MOVE = 0x0B92 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Lumbar side support position + * + * Sets the amount of lateral lumbar support. + * Max value indicates widest lumbar setting (i.e. least support) + * Min value indicates thinnest lumbar setting. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_LUMBAR_SIDE_SUPPORT_POS = 0x0B93 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Lumbar side support move + * + * Adjusts the amount of lateral lumbar support. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_LUMBAR_SIDE_SUPPORT_MOVE = 0x0B94 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Headrest height position + * + * Sets the headrest height. + * Max value indicates tallest setting. + * Min value indicates shortest setting. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_HEADREST_HEIGHT_POS = 0x0B95 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Headrest height move + * + * Moves the headrest up and down. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_HEADREST_HEIGHT_MOVE = 0x0B96 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Headrest angle position + * + * Sets the angle of the headrest. + * Max value indicates most upright angle. + * Min value indicates shallowest headrest angle. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_HEADREST_ANGLE_POS = 0x0B97 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Headrest angle move + * + * Adjusts the angle of the headrest + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_HEADREST_ANGLE_MOVE = 0x0B98 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Headrest fore/aft position + * + * Adjusts the headrest forwards and backwards. + * Max value indicates position closest to front of car. + * Min value indicates position closest to rear of car. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_HEADREST_FORE_AFT_POS = 0x0B99 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Headrest fore/aft move + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SEAT_HEADREST_FORE_AFT_MOVE = 0x0B9A + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Seat Occupancy + * + * Indicates whether a particular seat is occupied or not, to the best of the car's ability + * to determine. Valid values are from the VehicleSeatOccupancyState enum. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum VehicleSeatOccupancyState + */ + SEAT_OCCUPANCY = 0x0BB0 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Window Position + * + * Min = window up / closed + * Max = window down / open + * + * For a window that may open out of plane (i.e. vent mode of sunroof) this + * parameter will work with negative values as follows: + * Max = sunroof completely open + * 0 = sunroof closed. + * Min = sunroof vent completely open + * + * Note that in this mode, 0 indicates the window is closed. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + WINDOW_POS = 0x0BC0 + 0x10000000 + 0x03000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:INT32 + /** + * Window Move + * + * Max = Open the window as fast as possible + * Min = Close the window as fast as possible + * Magnitude denotes relative speed. I.e. +2 is faster than +1 in closing + * the window. + * + * For a window that may open out of plane (i.e. vent mode of sunroof) this + * parameter will work as follows: + * + * If sunroof is open: + * Max = open the sunroof further, automatically stop when fully open. + * Min = close the sunroof, automatically stop when sunroof is closed. + * + * If vent is open: + * Max = close the vent, automatically stop when vent is closed. + * Min = open the vent further, automatically stop when vent is fully open. + * + * If sunroof is in the closed position: + * Max = open the sunroof, automatically stop when sunroof is fully open. + * Min = open the vent, automatically stop when vent is fully open. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + WINDOW_MOVE = 0x0BC1 + 0x10000000 + 0x03000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:INT32 + /** + * Window Lock + * + * True indicates windows are locked and can't be moved. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + WINDOW_LOCK = 0x0BC4 + 0x10000000 + 0x03000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:WINDOW,VehiclePropertyType:BOOLEAN + /** + * Vehicle Maps Service (VMS) message + * + * This property uses MIXED data to communicate vms messages. + * + * Its contents are to be interpreted as follows: + * the indices defined in VmsMessageIntegerValuesIndex are to be used to + * read from int32Values; + * bytes is a serialized VMS message as defined in the vms protocol + * which is opaque to the framework; + * + * IVehicle#get must always return StatusCode::NOT_AVAILABLE. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + VEHICLE_MAP_SERVICE = 0x0C00 + 0x10000000 + 0x01000000 + + 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED + /** + * OBD2 Live Sensor Data + * + * Reports a snapshot of the current (live) values of the OBD2 sensors available. + * + * The configArray is set as follows: + * configArray[0] = number of vendor-specific integer-valued sensors + * configArray[1] = number of vendor-specific float-valued sensors + * + * The values of this property are to be interpreted as in the following example. + * Considering a configArray = {2,3} + * int32Values must be a vector containing Obd2IntegerSensorIndex.LAST_SYSTEM_INDEX + 2 + * elements (that is, 33 elements); + * floatValues must be a vector containing Obd2FloatSensorIndex.LAST_SYSTEM_INDEX + 3 + * elements (that is, 73 elements); + * + * It is possible for each frame to contain a different subset of sensor values, both system + * provided sensors, and vendor-specific ones. In order to support that, the bytes element + * of the property value is used as a bitmask,. + * + * bytes must have a sufficient number of bytes to represent the total number of possible + * sensors (in this case, 14 bytes to represent 106 possible values); it is to be read as + * a contiguous bitmask such that each bit indicates the presence or absence of a sensor + * from the frame, starting with as many bits as the size of int32Values, immediately + * followed by as many bits as the size of floatValues. + * + * For example, should bytes[0] = 0x4C (0b01001100) it would mean that: + * int32Values[0 and 1] are not valid sensor values + * int32Values[2 and 3] are valid sensor values + * int32Values[4 and 5] are not valid sensor values + * int32Values[6] is a valid sensor value + * int32Values[7] is not a valid sensor value + * Should bytes[5] = 0x61 (0b01100001) it would mean that: + * int32Values[32] is a valid sensor value + * floatValues[0 thru 3] are not valid sensor values + * floatValues[4 and 5] are valid sensor values + * floatValues[6] is not a valid sensor value + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + OBD2_LIVE_FRAME = 0x0D00 + 0x10000000 + 0x01000000 + + 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED + /** + * OBD2 Freeze Frame Sensor Data + * + * Reports a snapshot of the value of the OBD2 sensors available at the time that a fault + * occurred and was detected. + * + * A configArray must be provided with the same meaning as defined for OBD2_LIVE_FRAME. + * + * The values of this property are to be interpreted in a similar fashion as those for + * OBD2_LIVE_FRAME, with the exception that the stringValue field may contain a non-empty + * diagnostic troubleshooting code (DTC). + * + * A IVehicle#get request of this property must provide a value for int64Values[0]. + * This will be interpreted as the timestamp of the freeze frame to retrieve. A list of + * timestamps can be obtained by a IVehicle#get of OBD2_FREEZE_FRAME_INFO. + * + * Should no freeze frame be available at the given timestamp, a response of NOT_AVAILABLE + * must be returned by the implementation. Because vehicles may have limited storage for + * freeze frames, it is possible for a frame request to respond with NOT_AVAILABLE even if + * the associated timestamp has been recently obtained via OBD2_FREEZE_FRAME_INFO. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + OBD2_FREEZE_FRAME = 0x0D01 + 0x10000000 + 0x01000000 + + 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED + /** + * OBD2 Freeze Frame Information + * + * This property describes the current freeze frames stored in vehicle + * memory and available for retrieval via OBD2_FREEZE_FRAME. + * + * The values are to be interpreted as follows: + * each element of int64Values must be the timestamp at which a a fault code + * has been detected and the corresponding freeze frame stored, and each + * such element can be used as the key to OBD2_FREEZE_FRAME to retrieve + * the corresponding freeze frame. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + OBD2_FREEZE_FRAME_INFO = 0x0D02 + 0x10000000 + 0x01000000 + + 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED + /** + * OBD2 Freeze Frame Clear + * + * This property allows deletion of any of the freeze frames stored in + * vehicle memory, as described by OBD2_FREEZE_FRAME_INFO. + * + * The configArray is set as follows: + * configArray[0] = 1 if the implementation is able to clear individual freeze frames + * by timestamp, 0 otherwise + * + * IVehicle#set of this property is to be interpreted as follows: + * if int64Values contains no elements, then all frames stored must be cleared; + * if int64Values contains one or more elements, then frames at the timestamps + * stored in int64Values must be cleared, and the others not cleared. Should the + * vehicle not support selective clearing of freeze frames, this latter mode must + * return NOT_AVAILABLE. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:WRITE + */ + OBD2_FREEZE_FRAME_CLEAR = 0x0D03 + 0x10000000 + 0x01000000 + + 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED + /** + * Headlights State + * + * Return the current state of headlights. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum VehicleLightState + */ + HEADLIGHTS_STATE = 0x0E00 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * High beam lights state + * + * Return the current state of high beam lights. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum VehicleLightState + */ + HIGH_BEAM_LIGHTS_STATE = 0x0E01 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Fog light state + * + * Return the current state of fog lights. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum VehicleLightState + */ + FOG_LIGHTS_STATE = 0x0E02 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Hazard light status + * + * Return the current status of hazard lights. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum VehicleLightState + */ + HAZARD_LIGHTS_STATE = 0x0E03 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Headlight switch + * + * The setting that the user wants. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @data_enum VehicleLightSwitch + */ + HEADLIGHTS_SWITCH = 0x0E10 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * High beam light switch + * + * The setting that the user wants. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @data_enum VehicleLightSwitch + */ + HIGH_BEAM_LIGHTS_SWITCH = 0x0E11 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Fog light switch + * + * The setting that the user wants. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @data_enum VehicleLightSwitch + */ + FOG_LIGHTS_SWITCH = 0x0E12 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Hazard light switch + * + * The setting that the user wants. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @data_enum VehicleLightSwitch + */ + HAZARD_LIGHTS_SWITCH = 0x0E13 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Cabin lights + * + * Return current status of cabin lights. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum VehicleLightState + */ + CABIN_LIGHTS_STATE = 0x0F01 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Cabin lights switch + * + * The position of the physical switch which controls the cabin lights. + * This might be different than the CABIN_LIGHTS_STATE if the lights are on because a door + * is open or because of a voice command. + * For example, while the switch is in the "off" or "automatic" position. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @data_enum VehicleLightSwitch + */ + CABIN_LIGHTS_SWITCH = 0x0F02 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Reading lights + * + * Return current status of reading lights. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum VehicleLightState + */ + READING_LIGHTS_STATE = 0x0F03 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Reading lights switch + * + * The position of the physical switch which controls the reading lights. + * This might be different than the READING_LIGHTS_STATE if the lights are on because a door + * is open or because of a voice command. + * For example, while the switch is in the "off" or "automatic" position. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + * @data_enum VehicleLightSwitch + */ + READING_LIGHTS_SWITCH = 0x0F04 + 0x10000000 + 0x05000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32 + /** + * Support customize permissions for vendor properties + * + * Implement this property if vehicle hal support customize vendor permissions feature. + * VehiclePropConfig.configArray is used to indicate vendor properties and permissions + * which selected for this vendor property. The permission must be one of enum in + * VehicleVendorPermission. + * The configArray is set as follows: + * configArray[n] = propId : property ID for the vendor property + * configArray[n+1] = one of enums in VehicleVendorPermission. It indicates the permission + * for reading value of the property. + * configArray[n+2] = one of enums in VehicleVendorPermission. It indicates the permission + * for writing value of the property. + * + * For example: + * configArray = { + * vendor_prop_1, PERMISSION_VENDOR_SEAT_READ, PERMISSION_VENDOR_SEAT_WRITE, + * vendor_prop_2, PERMISSION_VENDOR_INFO, PERMISSION_NOT_ACCESSIBLE, + * } + * If vendor properties are not in this array, they will have the default vendor permission. + * If vendor chose PERMISSION_NOT_ACCESSIBLE, android will not have access to the property. In + * the example, Android can not write value for vendor_prop_2. + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + */ + SUPPORT_CUSTOMIZE_VENDOR_PERMISSION = 0x0F05 + 0x10000000 + 0x01000000 + + 0x00200000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BOOLEAN + /** + * Allow disabling optional featurs from vhal. + * + * This property reports optional features that should be disabled. + * All allowed optional features for the system is declared in Car service overlay, + * config_allowed_optional_car_features. + * This property allows disabling features defined in the overlay. Without this property, + * all the features declared in the overlay will be enabled. + * + * Value read should include all features disabled with ',' separation. + * ex) "com.android.car.user.CarUserNoticeService,storage_monitoring" + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:READ + */ + DISABLED_OPTIONAL_FEATURES = 0x0F06 + 0x10000000 + 0x01000000 + + 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING + /** + * Defines the initial Android user to be used during initialization. + * + * This property is called by the Android system when it initializes and it lets the HAL + * define which Android user should be started. + * + * This request is made by setting a VehiclePropValue (defined by InitialUserInfoRequest), + * and the HAL must respond with a property change event (defined by InitialUserInfoResponse). + * If the HAL doesn't respond after some time (defined by the Android system), the Android + * system will proceed as if HAL returned a response of action + * InitialUserInfoResponseAction:DEFAULT. + * + * For example, on first boot, the request could be: + * + * int32[0]: 42 // request id (arbitrary number set by Android system) + * int32[1]: 1 // InitialUserInfoRequestType::FIRST_BOOT + * int32[2]: 0 // id of current user (usersInfo.currentUser.userId) + * int32[3]: 1 // flag of current user (usersInfo.currentUser.flags = SYSTEM) + * int32[4]: 1 // number of existing users (usersInfo.numberUsers); + * int32[5]: 0 // user #0 (usersInfo.existingUsers[0].userId) + * int32[6]: 1 // flags of user #0 (usersInfo.existingUsers[0].flags) + * + * And if the HAL want to respond with the creation of an admin user called "Owner", the + * response would be: + * + * int32[0]: 42 // must match the request id from the request + * int32[1]: 2 // action = InitialUserInfoResponseAction::CREATE + * int32[2]: -10000 // userToSwitchOrCreate.userId (not used as user will be created) + * int32[3]: 8 // userToSwitchOrCreate.flags = ADMIN + * string: "||Owner" // userLocales + separator + userNameToCreate + * + * Notice the string value represents multiple values, separated by ||. The first value is the + * (optional) system locales for the user to be created (in this case, it's empty, meaning it + * will use Android's default value), while the second value is the (also optional) name of the + * to user to be created (when the type of response is InitialUserInfoResponseAction:CREATE). + * For example, to create the same "Owner" user with "en-US" and "pt-BR" locales, the string + * value of the response would be "en-US,pt-BR||Owner". As such, neither the locale nor the + * name can have || on it, although a single | is fine. + * + * NOTE: if the HAL doesn't support user management, then it should not define this property, + * which in turn would disable the other user-related properties (for example, the Android + * system would never issue them and user-related requests from the HAL layer would be ignored + * by the Android System). But if it supports user management, then it must support all core + * user-related properties (INITIAL_USER_INFO, SWITCH_USER, CREATE_USER, and REMOVE_USER). + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + INITIAL_USER_INFO = 0x0F07 + 0x10000000 + 0x01000000 + + 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED + /** + * Defines a request to switch the foreground Android user. + * + * This property is used primarily by the Android System to inform the HAL that the + * current foreground Android user is switching, but it could also be used by the HAL to request + * the Android system to switch users - the + * + * When the request is made by Android, it sets a VehiclePropValue and the HAL must responde + * with a property change event; when the HAL is making the request, it must also do it through + * a property change event (the main difference is that the request id will be positive in the + * former case, and negative in the latter; the SwitchUserMessageType will also be different). + * + * The format of both request is defined by SwitchUserRequest and the format of the response + * (when needed) is defined by SwitchUserResponse. How the HAL (or Android System) should + * proceed depends on the message type (which is defined by the SwitchUserMessageType + * parameter), as defined below. + * + * 1.LEGACY_ANDROID_SWITCH + * ----------------------- + * + * Called by the Android System to indicate the Android user is about to change, when the change + * request was made in a way that is not integrated with the HAL (for example, through + * adb shell am switch-user). + * + * The HAL can switch its internal user once it receives this request, but it doesn't need to + * reply back to the Android System. If its internal user cannot be changed for some reason, + * then it must wait for the SWITCH_USER(type=ANDROID_POST_SWITCH) call to recover + * (for example, it could issue a SWITCH_USER(type=VEHICLE_REQUEST) to switch back to + * the previous user), but ideally it should never fail (as switching back could result in a + * confusing experience for the end user). + * + * For example, if the system have users (0, 10, 11) and it's switching from 0 to 11 (where none + * of them have any special flag), the request would be: + * + * int32[0]: 42 // request id + * int32[1]: 1 // SwitchUserMessageType::LEGACY_ANDROID_SWITCH + * int32[2]: 11 // target user id + * int32[3]: 0 // target user flags (none) + * int32[4]: 10 // current user + * int32[5]: 0 // current user flags (none) + * int32[6]: 3 // number of users + * int32[7]: 0 // user #0 (Android user id 0) + * int32[8]: 0 // flags of user #0 (none) + * int32[9]: 10 // user #1 (Android user id 10) + * int32[10]: 0 // flags of user #1 (none) + * int32[11]: 11 // user #2 (Android user id 11) + * int32[12]: 0 // flags of user #2 (none) + * + * 2.ANDROID_SWITCH + * ---------------- + * Called by the Android System to indicate the Android user is about to change, but Android + * will wait for the HAL's response (up to some time) before proceeding. + * + * The HAL must switch its internal user once it receives this request, then respond back to + * Android with a SWITCH_USER(type=VEHICLE_RESPONSE) indicating whether its internal + * user was switched or not (through the SwitchUserStatus enum). + * + * For example, if Android has users (0, 10, 11) and it's switching from 10 to 11 (where + * none of them have any special flag), the request would be: + * + * int32[0]: 42 // request id + * int32[1]: 2 // SwitchUserMessageType::ANDROID_SWITCH + * int32[2]: 11 // target user id + * int32[3]: 0 // target user flags (none) + * int32[4]: 10 // current user + * int32[5]: 0 // current user flags (none) + * int32[6]: 3 // number of users + * int32[7]: 0 // 1st user (user 0) + * int32[8]: 1 // 1st user flags (SYSTEM) + * int32[9]: 10 // 2nd user (user 10) + * int32[10]: 0 // 2nd user flags (none) + * int32[11]: 11 // 3rd user (user 11) + * int32[12]: 0 // 3rd user flags (none) + * + * If the request succeeded, the HAL must update the property with: + * + * int32[0]: 42 // request id + * int32[1]: 3 // messageType = SwitchUserMessageType::VEHICLE_RESPONSE + * int32[2]: 1 // status = SwitchUserStatus::SUCCESS + * + * But if it failed, the response would be something like: + * + * int32[0]: 42 // request id + * int32[1]: 3 // messageType = SwitchUserMessageType::VEHICLE_RESPONSE + * int32[2]: 2 // status = SwitchUserStatus::FAILURE + * string: "108-D'OH!" // OEM-specific error message + * + * 3.VEHICLE_RESPONSE + * ------------------ + * Called by the HAL to indicate whether a request of type ANDROID_SWITCH should proceed or + * abort - see the ANDROID_SWITCH section above for more info. + * + * 4.VEHICLE_REQUEST + * ------------------ + * Called by the HAL to request that the current foreground Android user is switched. + * + * This is useful in situations where Android started as one user, but the vehicle identified + * the driver as another user. For example, user A unlocked the car using the key fob of user B; + * the INITIAL_USER_INFO request returned user B, but then a face recognition subsubsystem + * identified the user as A. + * + * The HAL makes this request by a property change event (passing a negative request id), and + * the Android system will response by issue an ANDROID_POST_SWITCH call which the same + * request id. + * + * For example, if the current foreground Android user is 10 and the HAL asked it to switch to + * 11, the request would be: + * + * int32[0]: -108 // request id + * int32[1]: 4 // messageType = SwitchUserMessageType::VEHICLE_REQUEST + * int32[2]: 11 // Android user id + * + * If the request succeeded and Android has 3 users (0, 10, 11), the response would be: + * + * int32[0]: -108 // request id + * int32[1]: 5 // messageType = SwitchUserMessageType::ANDROID_POST_SWITCH + * int32[2]: 11 // target user id + * int32[3]: 0 // target user id flags (none) + * int32[4]: 11 // current user + * int32[5]: 0 // current user flags (none) + * int32[6]: 3 // number of users + * int32[7]: 0 // 1st user (user 0) + * int32[8]: 0 // 1st user flags (none) + * int32[9]: 10 // 2nd user (user 10) + * int32[10]: 4 // 2nd user flags (none) + * int32[11]: 11 // 3rd user (user 11) + * int32[12]: 3 // 3rd user flags (none) + * + * Notice that both the current and target user ids are the same - if the request failed, then + * they would be different (i.e, target user would be 11, but current user would still be 10). + * + * 5.ANDROID_POST_SWITCH + * --------------------- + * Called by the Android System after a request to switch a user was made. + * + * This property is called after switch requests of any type (i.e., LEGACY_ANDROID_SWITCH, + * ANDROID_SWITCH, or VEHICLE_REQUEST) and can be used to determine if the request succeeded or + * failed: + * + * 1. When it succeeded, it's called when the Android user is in the unlocked state and the + * value of the current and target users ids in the response are the same. This would be + * equivalent to receiving an Intent.ACTION_USER_UNLOCKED in an Android app. + * 2. When it failed it's called right away and the value of the current and target users ids + * in the response are different (as the current user didn't change to the target). + * 3. If a new switch request is made before the HAL responded to the previous one or before + * the user was unlocked, then the ANDROID_POST_SWITCH request is not made. For example, + * the driver could accidentally switch to the wrong user which has lock credentials, then + * switch to the right one before entering the credentials. + * + * The HAL can update its internal state once it receives this request, but it doesn't need to + * reply back to the Android System. + * + * Request: the first N values as defined by INITIAL_USER_INFO (where the request-specific + * value at index 1 is SwitchUserMessageType::ANDROID_POST_SWITCH), then 2 more values for the + * target user id (i.e., the Android user id that was requested to be switched to) and its flags + * (as defined by UserFlags). + * + * Response: none. + * + * Example: see VEHICLE_REQUEST section above. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + SWITCH_USER = 0x0F08 + 0x10000000 + 0x01000000 + + 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED + /** + * Called by the Android System after an Android user was created. + * + * The HAL can use this property to create its equivalent user. + * + * This is an async request: Android makes the request by setting a VehiclePropValue, and HAL + * must respond with a property change indicating whether the request succeeded or failed. If + * it failed, the Android system will remove the user. + * + * The format of the request is defined by CreateUserRequest and the format of the response by + * CreateUserResponse. + * + * For example, if system had 2 users (0 and 10) and a 3rd one (which is an ephemeral guest) was + * created, the request would be: + * + * int32[0]: 42 // request id + * int32[1]: 11 // Android id of the created user + * int32[2]: 6 // Android flags (ephemeral guest) of the created user + * int32[3]: 10 // current user + * int32[4]: 0 // current user flags (none) + * int32[5]: 3 // number of users + * int32[6]: 0 // 1st user (user 0) + * int32[7]: 0 // 1st user flags (none) + * int32[8]: 10 // 2nd user (user 10) + * int32[9]: 0 // 2nd user flags (none) + * int32[19]: 11 // 3rd user (user 11) + * int32[11]: 6 // 3rd user flags (ephemeral guest) + * string: "ElGuesto" // name of the new user + * + * Then if the request succeeded, the HAL would return: + * + * int32[0]: 42 // request id + * int32[1]: 1 // CreateUserStatus::SUCCESS + * + * But if it failed: + * + * int32[0]: 42 // request id + * int32[1]: 2 // CreateUserStatus::FAILURE + * string: "D'OH!" // The meaning is a blackbox - it's passed to the caller (like Settings UI), + * // which in turn can take the proper action. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + CREATE_USER = 0x0F09 + 0x10000000 + 0x01000000 + + 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED + /** + * Called by the Android System after an Android user was removed. + * + * The HAL can use this property to remove its equivalent user. + * + * This is write-only call - the Android System is not expecting a reply from the HAL. Hence, + * this request should not fail - if the equivalent HAL user cannot be removed, then HAL should + * mark it as inactive or recover in some other way. + * + * The request is made by setting the VehiclePropValue with the contents defined by + * RemoveUserRequest. + * + * For example, if system had 3 users (0, 10, and 11) and user 11 was removed, the request + * would be: + * + * int32[0]: 42 // request id + * int32[1]: 11 // (Android user id of the removed user) + * int32[2]: 0 // (Android user flags of the removed user) + * int32[3]: 10 // current user + * int32[4]: 0 // current user flags (none) + * int32[5]: 2 // number of users + * int32[6]: 0 // 1st user (user 0) + * int32[7]: 0 // 1st user flags (none) + * int32[8]: 10 // 2nd user (user 10) + * int32[9]: 0 // 2nd user flags (none) + * + * @change_mode VehiclePropertyChangeMode:STATIC + * @access VehiclePropertyAccess:WRITE + */ + REMOVE_USER = 0x0F0A + 0x10000000 + 0x01000000 + + 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED + /** + * Property used to associate (or query the association) the current user with vehicle-specific + * identification mechanisms (such as key FOB). + * + * This is an optional user management property - the OEM could still support user management + * without defining it. In fact, this property could be used without supporting the core + * user-related functions described on INITIAL_USER_INFO. + * + * To query the association, the Android system gets the property, passing a VehiclePropValue + * containing the types of associations are being queried, as defined by + * UserIdentificationGetRequest. The HAL must return right away, returning a VehiclePropValue + * with a UserIdentificationResponse. Notice that user identification should have already + * happened while system is booting up and the VHAL implementation should only return the + * already identified association (like the key FOB used to unlock the car), instead of starting + * a new association from the get call. + * + * To associate types, the Android system sets the property, passing a VehiclePropValue + * containing the types and values of associations being set, as defined by the + * UserIdentificationSetRequest. The HAL will then use a property change event (whose + * VehiclePropValue is defined by UserIdentificationResponse) indicating the current status of + * the types after the request. + * + * For example, to query if the current user (10) is associated with the FOB that unlocked the + * car and a custom mechanism provided by the OEM, the request would be: + * + * int32[0]: 42 // request id + * int32[1]: 10 (Android user id) + * int32[2]: 0 (Android user flags) + * int32[3]: 2 (number of types queried) + * int32[4]: 1 (1st type queried, UserIdentificationAssociationType::KEY_FOB) + * int32[5]: 101 (2nd type queried, UserIdentificationAssociationType::CUSTOM_1) + * + * If the user is associated with the FOB but not with the custom mechanism, the response would + * be: + * + * int32[0]: 42 // request id + * int32[1]: 2 (number of associations in the response) + * int32[2]: 1 (1st type: UserIdentificationAssociationType::KEY_FOB) + * int32[3]: 2 (1st value: UserIdentificationAssociationValue::ASSOCIATED_CURRENT_USER) + * int32[4]: 101 (2st type: UserIdentificationAssociationType::CUSTOM_1) + * int32[5]: 4 (2nd value: UserIdentificationAssociationValue::NOT_ASSOCIATED_ANY_USER) + * + * Then to associate the user with the custom mechanism, a set request would be made: + * + * int32[0]: 43 // request id + * int32[1]: 10 (Android user id) + * int32[2]: 0 (Android user flags) + * int32[3]: 1 (number of associations being set) + * int32[4]: 101 (1st type: UserIdentificationAssociationType::CUSTOM_1) + * int32[5]: 1 (1st value: UserIdentificationAssociationSetValue::ASSOCIATE_CURRENT_USER) + * + * If the request succeeded, the response would be simply: + * + * int32[0]: 43 // request id + * int32[1]: 1 (number of associations in the response) + * int32[2]: 101 (1st type: UserIdentificationAssociationType::CUSTOM_1) + * int32[3]: 1 (1st value: UserIdentificationAssociationValue::ASSOCIATED_CURRENT_USER) + * + * Notice that the set request adds associations, but doesn't remove the existing ones. In the + * example above, the end state would be 2 associations (FOB and CUSTOM_1). If we wanted to + * associate the user with just CUSTOM_1 but not FOB, then the request should have been: + * + * int32[0]: 43 // request id + * int32[1]: 10 (Android user id) + * int32[2]: 2 (number of types set) + * int32[3]: 1 (1st type: UserIdentificationAssociationType::KEY_FOB) + * int32[4]: 2 (1st value: UserIdentificationAssociationValue::DISASSOCIATE_CURRENT_USER) + * int32[5]: 101 (2nd type: UserIdentificationAssociationType::CUSTOM_1) + * int32[6]: 1 (2nd value: UserIdentificationAssociationValue::ASSOCIATE_CURRENT_USER) + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + USER_IDENTIFICATION_ASSOCIATION = 0x0F0B + 0x10000000 + 0x01000000 + + 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED + /** + * Enable/request an EVS service. + * + * The property provides a generalized way to trigger EVS services. VHAL + * should use this property to request Android to start or stop EVS service. + * + * int32Values[0] = a type of the EVS service. The value must be one of enums in + * EvsServiceType. + * int32Values[1] = the state of the EVS service. The value must be one of enums in + * EvsServiceState. + * + * For example, to enable rear view EVS service, android side can set the property value as + * [EvsServiceType::REAR_VIEW, EvsServiceState::ON]. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + EVS_SERVICE_REQUEST = 0x0F10 + 0x10000000 + 0x01000000 + + 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC + /** + * Defines a request to apply power policy. + * + * VHAL sets this property to change car power policy. Car power policy service subscribes to + * this property and actually changes the power policy. + * The request is made by setting the VehiclePropValue with the ID of a power policy which is + * defined at /vendor/etc/power_policy.xml. If the given ID is not defined, car power policy + * service ignores the request and the current power policy is maintained. + * + * string: "sample_policy_id" // power policy ID + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + POWER_POLICY_REQ = 0x0F21 + 0x10000000 + 0x01000000 + + 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING + /** + * Defines a request to set the power polic group used to decide a default power policy per + * power status transition. + * + * VHAL sets this property with the ID of a power policy group in order to set the default power + * policy applied at power status transition. Power policy groups are defined at + * /vendor/etc/power_policy.xml. If the given ID is not defined, car power policy service + * ignores the request. + * Car power policy service subscribes to this property and sets the power policy group. + * The actual application of power policy takes place when the system power status changes and + * there is a valid mapped power policy for the new power status. + * + * string: "sample_policy_group_id" // power policy group ID + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + POWER_POLICY_GROUP_REQ = 0x0F22 + 0x10000000 + 0x01000000 + + 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING + /** + * Notifies the current power policy to VHAL layer. + * + * Car power policy service sets this property when the current power policy is changed. + * + * string: "sample_policy_id" // power policy ID + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ_WRITE + */ + CURRENT_POWER_POLICY = 0x0F23 + 0x10000000 + 0x01000000 + + 0x00100000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:STRING + /** + * Defines an event that car watchdog updates to tell it's alive. + * + * Car watchdog sets this property to system uptime in milliseconds at every 3 second. + * During the boot, the update may take longer time. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:WRITE + */ + WATCHDOG_ALIVE = 0xF31 + 0x10000000 + 0x01000000 + + 0x00500000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT64 + /** + * Defines a process terminated by car watchdog and the reason of termination. + * + * int32Values[0]: 1 // ProcessTerminationReason showing why a process is terminated. + * string: "/system/bin/log" // Process execution command. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:WRITE + */ + WATCHDOG_TERMINATED_PROCESS = 0x0F32 + 0x10000000 + 0x01000000 + + 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED + /** + * Defines an event that VHAL signals to car watchdog as a heartbeat. + * + * If VHAL supports this property, VHAL should write system uptime to this property at every 3 + * second. Car watchdog subscribes to this property and checks if the property is updated at + * every 3 second. With the buffer time of 3 second, car watchdog waits for a heart beat to be + * signaled up to 6 seconds from the last heart beat. If it isn’t, car watchdog considers + * VHAL unhealthy and terminates it. + * If this property is not supported by VHAL, car watchdog doesn't check VHAL health status. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + VHAL_HEARTBEAT = 0x0F33 + 0x10000000 + 0x01000000 + + 0x00500000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT64 + /** + * Starts the ClusterUI in cluster display. + * + * int32: the type of ClusterUI to show + * 0 indicates ClusterHome, that is a home screen of cluster display, and provides + * the default UI and a kind of launcher functionality for cluster display. + * the other values are followed by OEM's definition. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + CLUSTER_SWITCH_UI = 0x0F34 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Changes the state of the cluster display. + * + * Bounds: the area to render the cluster Activity. + * Inset: the area which Activity should avoid from placing any important + * information. + * + * int32[0]: on/off: 0 - off, 1 - on, -1 - don't care + * int32[1]: Bounds - left: positive number - left position in pixels + -1 - don't care (should set all Bounds fields) + * int32[2]: Bounds - top: same format with 'left' + * int32[3]: Bounds - right: same format with 'left' + * int32[4]: Bounds - bottom: same format with 'left' + * int32[5]: Inset - left: positive number - actual left inset value in pixels + -1 - don't care (should set "don't care" all Inset fields) + * int32[6]: Inset - top: same format with 'left' + * int32[7]: Inset - right: same format with 'left' + * int32[8]: Inset - bottom: same format with 'left' + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + */ + CLUSTER_DISPLAY_STATE = 0x0F35 + 0x10000000 + 0x01000000 + + 0x00410000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32_VEC + /** + * Reports the current display state and ClusterUI state. + * + * ClusterHome will send this message when it handles CLUSTER_SWITCH_UI, CLUSTER_DISPLAY_STATE. + * + * In addition, ClusterHome should send this message when it starts for the first time. + * When ClusterOS receives this message and if the internal expectation is different with the + * received message, then it should send CLUSTER_SWITCH_UI, CLUSTER_DISPLAY_STATE again to + * match the state. + * + * int32[0]: on/off: 0 - off, 1 - on + * int32[1]: Bounds - left + * int32[2]: Bounds - top + * int32[3]: Bounds - right + * int32[4]: Bounds - bottom + * int32[5]: Inset - left + * int32[6]: Inset - top + * int32[7]: Inset - right + * int32[8]: Inset - bottom + * int32[9]: the type of ClusterUI in the fullscreen or main screen. + * 0 indicates ClusterHome. + * the other values are followed by OEM's definition. + * int32[10]: the type of ClusterUI in sub screen if the currently two UIs are shown. + * -1 indicates the area isn't used any more. + * bytes: the array to represent the availability of ClusterUI. + * 0 indicates non-available and 1 indicates available. + * For example, let's assume a car supports 3 OEM defined ClusterUI like HOME, MAPS, CALL, + * and it only supports CALL UI only when the cellular network is available. Then, if the + * nework is avaibale, it'll send [1 1 1], and if it's out of network, it'll send [1 1 0]. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:WRITE + */ + CLUSTER_REPORT_STATE = 0x0F36 + 0x10000000 + 0x01000000 + + 0x00e00000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:MIXED + /** + * Requests to change the cluster display state to show some ClusterUI. + * + * When the current display state is off and ClusterHome sends this message to ClusterOS to + * request to turn the display on to show some specific ClusterUI. + * ClusterOS should response this with CLUSTER_DISPLAY_STATE. + * + * int32: the type of ClusterUI to show + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:WRITE + */ + CLUSTER_REQUEST_DISPLAY = 0x0F37 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Informs the current navigation state. + * + * bytes: the serialized message of NavigationStateProto. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:WRITE + */ + CLUSTER_NAVIGATION_STATE = 0x0F38 + 0x10000000 + 0x01000000 + + 0x00700000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:BYTES + /** + * Electronic Toll Collection card type. + * + * This property indicates the type of ETC card in this vehicle. + * If the head unit is aware of an ETC card attached to the vehicle, this property should + * return the type of card attached; otherwise, this property should be UNAVAILABLE. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum ElectronicTollCollectionCardType + */ + ELECTRONIC_TOLL_COLLECTION_CARD_TYPE = 0x0F39 + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 + /** + * Electronic Toll Collection card status. + * + * This property indicates the status of ETC card in this vehicle. + * If the head unit is aware of an ETC card attached to the vehicle, + * ELECTRONIC_TOLL_COLLECTION_CARD_TYPE gives that status of the card; otherwise, + * this property should be UNAVAILABLE. + * + * @change_mode VehiclePropertyChangeMode:ON_CHANGE + * @access VehiclePropertyAccess:READ + * @data_enum ElectronicTollCollectionCardStatus + */ + ELECTRONIC_TOLL_COLLECTION_CARD_STATUS = 0x0F3A + 0x10000000 + 0x01000000 + + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:GLOBAL,VehiclePropertyType:INT32 +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyAccess.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyAccess.aidl new file mode 100644 index 0000000000..055f96f2cc --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyAccess.aidl @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Property config defines the capabilities of it. User of the API + * must first get the property config to understand the output from get() + * commands and also to ensure that set() or events commands are in sync with + * the expected output. + */ +// @VintfStability +@Backing(type="int") +enum VehiclePropertyAccess { + NONE = 0x00, + + READ = 0x01, + WRITE = 0x02, + READ_WRITE = 0x03, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyChangeMode.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyChangeMode.aidl new file mode 100644 index 0000000000..2628730179 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyChangeMode.aidl @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * This describes how value of property can change. + */ +// @VintfStability +@Backing(type="int") +enum VehiclePropertyChangeMode { + /** + * Property of this type must never be changed. Subscription is not supported + * for these properties. + */ + STATIC = 0x00, + + /** + * Properties of this type must report when there is a change. + * IVehicle#get call must return the current value. + * Set operation for this property is assumed to be asynchronous. When the + * property is read (using IVehicle#get) after IVehicle#set, it may still + * return old value until underlying H/W backing this property has actually + * changed the state. Once state is changed, the property must dispatch + * changed value as event. + */ + ON_CHANGE = 0x01, + + /** + * Properties of this type change continuously and require a fixed rate of + * sampling to retrieve the data. Implementers may choose to send extra + * notifications on significant value changes. + */ + CONTINUOUS = 0x02, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyGroup.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyGroup.aidl new file mode 100644 index 0000000000..529a46da6f --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyGroup.aidl @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehiclePropertyGroup { + /** + * Properties declared in AOSP must use this flag. + */ + SYSTEM = 0x10000000, + + /** + * Properties declared by vendors must use this flag. + */ + VENDOR = 0x20000000, + + MASK = 0xf0000000, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyStatus.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyStatus.aidl new file mode 100644 index 0000000000..6dea0d1e2b --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyStatus.aidl @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Property status is a dynamic value that may change based on the vehicle state. + */ +// @VintfStability +@Backing(type="int") +enum VehiclePropertyStatus { + /** Property is available and behaving normally */ + AVAILABLE = 0x00, + /** + * A property in this state is not available for reading and writing. This + * is a transient state that depends on the availability of the underlying + * implementation (e.g. hardware or driver). It MUST NOT be used to + * represent features that this vehicle is always incapable of. A get() of + * a property in this state MAY return an undefined value, but MUST + * correctly describe its status as UNAVAILABLE A set() of a property in + * this state MAY return NOT_AVAILABLE. The HAL implementation MUST ignore + * the value of the status field when writing a property value coming from + * Android. + */ + UNAVAILABLE = 0x01, + /** There is an error with this property. */ + ERROR = 0x02, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyType.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyType.aidl new file mode 100644 index 0000000000..4591e9293a --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehiclePropertyType.aidl @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Enumerates supported data type for VehicleProperty. + * + * Used to create property ID in VehicleProperty enum. + */ +// @VintfStability +@Backing(type="int") +enum VehiclePropertyType { + STRING = 0x00100000, + BOOLEAN = 0x00200000, + INT32 = 0x00400000, + INT32_VEC = 0x00410000, + INT64 = 0x00500000, + INT64_VEC = 0x00510000, + FLOAT = 0x00600000, + FLOAT_VEC = 0x00610000, + BYTES = 0x00700000, + + /** + * Any combination of scalar or vector types. The exact format must be + * provided in the description of the property. + * + * For vendor MIXED type properties, configArray needs to be formatted in this + * structure. + * configArray[0], 1 indicates the property has a String value + * configArray[1], 1 indicates the property has a Boolean value . + * configArray[2], 1 indicates the property has an Integer value. + * configArray[3], the number indicates the size of Integer[] in the property. + * configArray[4], 1 indicates the property has a Long value. + * configArray[5], the number indicates the size of Long[] in the property. + * configArray[6], 1 indicates the property has a Float value. + * configArray[7], the number indicates the size of Float[] in the property. + * configArray[8], the number indicates the size of byte[] in the property. + * For example: + * {@code configArray = {1, 1, 1, 3, 0, 0, 0, 0, 0}} indicates the property has + * a String value, a Boolean value, an Integer value and an array with 3 integers. + */ + MIXED = 0x00e00000, + + MASK = 0x00ff0000, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleSeatOccupancyState.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleSeatOccupancyState.aidl new file mode 100644 index 0000000000..a17c9f0a86 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleSeatOccupancyState.aidl @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Used by seat occupancy to enumerate the current occupancy state of the seat. + */ +// @VintfStability +@Backing(type="int") +enum VehicleSeatOccupancyState { + UNKNOWN = 0, + VACANT = 1, + OCCUPIED = 2, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleTurnSignal.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleTurnSignal.aidl new file mode 100644 index 0000000000..cec86db73c --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleTurnSignal.aidl @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +// @VintfStability +@Backing(type="int") +enum VehicleTurnSignal { + NONE = 0x00, + RIGHT = 0x01, + LEFT = 0x02, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleUnit.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleUnit.aidl new file mode 100644 index 0000000000..3fc69de766 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleUnit.aidl @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Units used for int or float type with no attached enum types. + */ +// @VintfStability +@Backing(type="int") +enum VehicleUnit { + SHOULD_NOT_USE = 0x000, + METER_PER_SEC = 0x01, + RPM = 0x02, + HERTZ = 0x03, + PERCENTILE = 0x10, + MILLIMETER = 0x20, + METER = 0x21, + KILOMETER = 0x23, + MILE = 0x24, + CELSIUS = 0x30, + FAHRENHEIT = 0x31, + KELVIN = 0x32, + MILLILITER = 0x40, + LITER = 0x41, + /** + * deprecated. Use US_GALLON instead. + */ + GALLON = 0x42, + US_GALLON = 0x42, + IMPERIAL_GALLON = 0x43, + NANO_SECS = 0x50, + SECS = 0x53, + YEAR = 0x59, + WATT_HOUR = 0x60, + MILLIAMPERE = 0x61, + MILLIVOLT = 0x62, + MILLIWATTS = 0x63, + AMPERE_HOURS = 0x64, + KILOWATT_HOUR = 0x65, + KILOPASCAL = 0x70, + PSI = 0x71, + BAR = 0x72, + DEGREES = 0x80, + MILES_PER_HOUR = 0x90, + KILOMETERS_PER_HOUR = 0x91, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleVendorPermission.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleVendorPermission.aidl new file mode 100644 index 0000000000..46a66e129a --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VehicleVendorPermission.aidl @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Used by SUPPORT_CUSTOMIZE_VENDOR_PERMISSION to indicate the permission of vendor properties. + */ +// @VintfStability +@Backing(type="int") +enum VehicleVendorPermission { + PERMISSION_DEFAULT = 0x00000000, + PERMISSION_SET_VENDOR_CATEGORY_WINDOW = 0X00000001, + PERMISSION_GET_VENDOR_CATEGORY_WINDOW = 0x00000002, + PERMISSION_SET_VENDOR_CATEGORY_DOOR = 0x00000003, + PERMISSION_GET_VENDOR_CATEGORY_DOOR = 0x00000004, + PERMISSION_SET_VENDOR_CATEGORY_SEAT = 0x00000005, + PERMISSION_GET_VENDOR_CATEGORY_SEAT = 0x00000006, + PERMISSION_SET_VENDOR_CATEGORY_MIRROR = 0x00000007, + PERMISSION_GET_VENDOR_CATEGORY_MIRROR = 0x00000008, + PERMISSION_SET_VENDOR_CATEGORY_INFO = 0x00000009, + PERMISSION_GET_VENDOR_CATEGORY_INFO = 0x0000000A, + PERMISSION_SET_VENDOR_CATEGORY_ENGINE = 0x0000000B, + PERMISSION_GET_VENDOR_CATEGORY_ENGINE = 0x0000000C, + PERMISSION_SET_VENDOR_CATEGORY_HVAC = 0x0000000D, + PERMISSION_GET_VENDOR_CATEGORY_HVAC = 0x0000000E, + PERMISSION_SET_VENDOR_CATEGORY_LIGHT = 0x0000000F, + PERMISSION_GET_VENDOR_CATEGORY_LIGHT = 0x00000010, + PERMISSION_SET_VENDOR_CATEGORY_1 = 0x00010000, + PERMISSION_GET_VENDOR_CATEGORY_1 = 0x00011000, + PERMISSION_SET_VENDOR_CATEGORY_2 = 0x00020000, + PERMISSION_GET_VENDOR_CATEGORY_2 = 0x00021000, + PERMISSION_SET_VENDOR_CATEGORY_3 = 0x00030000, + PERMISSION_GET_VENDOR_CATEGORY_3 = 0x00031000, + PERMISSION_SET_VENDOR_CATEGORY_4 = 0x00040000, + PERMISSION_GET_VENDOR_CATEGORY_4 = 0x00041000, + PERMISSION_SET_VENDOR_CATEGORY_5 = 0x00050000, + PERMISSION_GET_VENDOR_CATEGORY_5 = 0x00051000, + PERMISSION_SET_VENDOR_CATEGORY_6 = 0x00060000, + PERMISSION_GET_VENDOR_CATEGORY_6 = 0x00061000, + PERMISSION_SET_VENDOR_CATEGORY_7 = 0x00070000, + PERMISSION_GET_VENDOR_CATEGORY_7 = 0x00071000, + PERMISSION_SET_VENDOR_CATEGORY_8 = 0x00080000, + PERMISSION_GET_VENDOR_CATEGORY_8 = 0x00081000, + PERMISSION_SET_VENDOR_CATEGORY_9 = 0x00090000, + PERMISSION_GET_VENDOR_CATEGORY_9 = 0x00091000, + PERMISSION_SET_VENDOR_CATEGORY_10 = 0x000A0000, + PERMISSION_GET_VENDOR_CATEGORY_10 = 0x000A1000, + PERMISSION_NOT_ACCESSIBLE = 0xF0000000, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsAvailabilityStateIntegerValuesIndex.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsAvailabilityStateIntegerValuesIndex.aidl new file mode 100644 index 0000000000..74e944ddb7 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsAvailabilityStateIntegerValuesIndex.aidl @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.VmsBaseMessageIntegerValuesIndex; + +/** + * An availability state is sent to the subscribers in response to a change in the available + * layers as part of a VmsMessageType.AVAILABILITY_CHANGE message, or in response to a + * VmsMessageType.AVAILABILITY_REQUEST message as part of a VmsMessageType.AVAILABILITY_RESPONSE. + * The VMS service issues monotonically increasing sequence numbers, and in case a subscriber + * receives a smaller sequence number, it should ignore the message. An available associated layer + * is a layer with a list of publisher IDs: + * - Layer type + * - Layer subtype + * - Layer version + * - Number of publisher IDs (N) + * - N x publisher ID + */ +// @VintfStability +@Backing(type="int") +enum VmsAvailabilityStateIntegerValuesIndex { + /* + * The message type as enumerated by VmsMessageType enum. + */ + MESSAGE_TYPE = 0, + SEQUENCE_NUMBER = 1, + NUMBER_OF_ASSOCIATED_LAYERS = 2, + LAYERS_START = 3, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsBaseMessageIntegerValuesIndex.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsBaseMessageIntegerValuesIndex.aidl new file mode 100644 index 0000000000..a3a2e18759 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsBaseMessageIntegerValuesIndex.aidl @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * Every VMS message starts with the type of the message from the VmsMessageType enum. + * Messages with no parameters such as VmsMessageType.AVAILABILITY_REQUEST, + * VmsMessageType.SUBSCRIPTIONS_REQUEST and VmsMessageType.DATA are also based on this enum. + */ +// @VintfStability +@Backing(type="int") +enum VmsBaseMessageIntegerValuesIndex { + /* + * The message type as enumerated by VmsMessageType enum. + */ + MESSAGE_TYPE = 0, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsMessageType.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsMessageType.aidl new file mode 100644 index 0000000000..bdffde7a6f --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsMessageType.aidl @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +/** + * This enum lists the types of supported VMS messages. It is used as the first + * integer in the vehicle property integers array and determines how the rest of + * the message is decoded. + */ +// @VintfStability +@Backing(type="int") +enum VmsMessageType { + /** + * A request from the subscribers to the VMS service to subscribe to a layer. + * + * This message type uses enum VmsMessageWithLayerIntegerValuesIndex. + */ + SUBSCRIBE = 1, + /** + * A request from the subscribers to the VMS service to subscribe to a layer from a specific + * publisher. + * + * This message type uses enum VmsMessageWithLayerAndPublisherIdIntegerValuesIndex. + */ + SUBSCRIBE_TO_PUBLISHER = 2, + /** + * A request from the subscribers to the VMS service to unsubscribes from a layer. + * + * This message type uses enum VmsMessageWithLayerIntegerValuesIndex. + */ + UNSUBSCRIBE = 3, + /** + * A request from the subscribers to the VMS service to unsubscribes from a layer from a + * specific publisher. + * + * This message type uses enum VmsMessageWithLayerAndPublisherIdIntegerValuesIndex. + */ + UNSUBSCRIBE_TO_PUBLISHER = 4, + /** + * Information from the publishers to the VMS service about the layers which the client can + * publish. + * + * This message type uses enum VmsOfferingMessageIntegerValuesIndex. + */ + OFFERING = 5, + /** + * A request from the subscribers to the VMS service to get the available layers. + * + * This message type uses enum VmsBaseMessageIntegerValuesIndex. + */ + AVAILABILITY_REQUEST = 6, + /** + * A request from the publishers to the VMS service to get the layers with subscribers. + * + * This message type uses enum VmsBaseMessageIntegerValuesIndex. + */ + SUBSCRIPTIONS_REQUEST = 7, + /** + * A response from the VMS service to the subscribers to a VmsMessageType.AVAILABILITY_REQUEST + * + * This message type uses enum VmsAvailabilityStateIntegerValuesIndex. + */ + AVAILABILITY_RESPONSE = 8, + /** + * A notification from the VMS service to the subscribers on a change in the available layers. + * + * This message type uses enum VmsAvailabilityStateIntegerValuesIndex. + */ + AVAILABILITY_CHANGE = 9, + /** + * A response from the VMS service to the publishers to a VmsMessageType.SUBSCRIPTIONS_REQUEST + * + * This message type uses enum VmsSubscriptionsStateIntegerValuesIndex. + */ + SUBSCRIPTIONS_RESPONSE = 10, + /** + * A notification from the VMS service to the publishers on a change in the layers with + * subscribers. + * + * This message type uses enum VmsSubscriptionsStateIntegerValuesIndex. + */ + SUBSCRIPTIONS_CHANGE = 11, + /** + * A message from the VMS service to the subscribers or from the publishers to the VMS service + * with a serialized VMS data packet as defined in the VMS protocol. + * + * This message type uses enum VmsMessageWithLayerAndPublisherIdIntegerValuesIndex. + */ + DATA = 12, + /** + * A request from the publishers to the VMS service to get a Publisher ID for a serialized VMS + * provider description packet as defined in the VMS protocol. + * + * This message type uses enum VmsBaseMessageIntegerValuesIndex. + */ + PUBLISHER_ID_REQUEST = 13, + /** + * A response from the VMS service to the publisher that contains a provider description packet + * and the publisher ID assigned to it. + * + * This message type uses enum VmsPublisherInformationIntegerValuesIndex. + */ + PUBLISHER_ID_RESPONSE = 14, + /** + * A request from the subscribers to the VMS service to get information for a Publisher ID. + * + * This message type uses enum VmsPublisherInformationIntegerValuesIndex. + */ + PUBLISHER_INFORMATION_REQUEST = 15, + /** + * A response from the VMS service to the subscribers that contains a provider description + * packet and the publisher ID assigned to it. + * + * This message type uses enum VmsPublisherInformationIntegerValuesIndex. + */ + PUBLISHER_INFORMATION_RESPONSE = 16, + /** + * A notification indicating that the sender has been reset. + * + * The receiving party must reset its internal state and respond to the + * sender with a START_SESSION message as acknowledgement. + * + * This message type uses enum VmsStartSessionMessageIntegerValuesIndex. + */ + START_SESSION = 17, + // LAST_VMS_MESSAGE_TYPE = START_SESSION, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.aidl new file mode 100644 index 0000000000..594ddbc303 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsMessageWithLayerAndPublisherIdIntegerValuesIndex.aidl @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.VmsMessageWithLayerIntegerValuesIndex; + +/* + * A VMS message with a layer and publisher ID is sent as part of a + * VmsMessageType.SUBSCRIBE_TO_PUBLISHER, VmsMessageType.UNSUBSCRIBE_TO_PUBLISHER messages and + * VmsMessageType.DATA . + */ +// @VintfStability +@Backing(type="int") +enum VmsMessageWithLayerAndPublisherIdIntegerValuesIndex { + /* + * The message type as enumerated by VmsMessageType enum. + */ + MESSAGE_TYPE = 0, + LAYER_TYPE = 1, + LAYER_SUBTYPE = 2, + LAYER_VERSION = 3, + PUBLISHER_ID = 4, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsMessageWithLayerIntegerValuesIndex.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsMessageWithLayerIntegerValuesIndex.aidl new file mode 100644 index 0000000000..e3a6126502 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsMessageWithLayerIntegerValuesIndex.aidl @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.VmsBaseMessageIntegerValuesIndex; + +/* + * A VMS message with a layer is sent as part of a VmsMessageType.SUBSCRIBE or + * VmsMessageType.UNSUBSCRIBE messages. + * + * The layer type is defined in the VMS protocol, and the subtype and version are + * controlled by the implementer of the publisher. + */ +// @VintfStability +@Backing(type="int") +enum VmsMessageWithLayerIntegerValuesIndex { + /* + * The message type as enumerated by VmsMessageType enum. + */ + MESSAGE_TYPE = 0, + LAYER_TYPE = 1, + LAYER_SUBTYPE = 2, + LAYER_VERSION = 3, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsOfferingMessageIntegerValuesIndex.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsOfferingMessageIntegerValuesIndex.aidl new file mode 100644 index 0000000000..9dc7a58736 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsOfferingMessageIntegerValuesIndex.aidl @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.VmsBaseMessageIntegerValuesIndex; + +/* + * An offering can be sent by publishers as part of VmsMessageType.OFFERING in order to + * advertise which layers they can publish and under which constraints: e.g., I can publish Layer X + * if someone else will publish Layer Y. + * The offering contains the publisher ID which was assigned to the publisher by the VMS service. + * A single offering is represented as: + * - Layer type + * - Layer subtype + * - Layer version + * - Number of dependencies (N) + * - N x (Layer type, Layer subtype, Layer version) + */ +// @VintfStability +@Backing(type="int") +enum VmsOfferingMessageIntegerValuesIndex { + /* + * The message type as enumerated by VmsMessageType enum. + */ + MESSAGE_TYPE = 0, + PUBLISHER_ID = 1, + NUMBER_OF_OFFERS = 2, + OFFERING_START = 3, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsPublisherInformationIntegerValuesIndex.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsPublisherInformationIntegerValuesIndex.aidl new file mode 100644 index 0000000000..32049ccb0b --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsPublisherInformationIntegerValuesIndex.aidl @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.VmsBaseMessageIntegerValuesIndex; + +/* + * Publishers send the VMS service their information and assigned in response a publisher ID. + * Subscribers can request the publisher information for a publisher ID they received in other + * messages. + */ +// @VintfStability +@Backing(type="int") +enum VmsPublisherInformationIntegerValuesIndex { + /* + * The message type as enumerated by VmsMessageType enum. + */ + MESSAGE_TYPE = 0, + PUBLISHER_ID = 1, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsStartSessionMessageIntegerValuesIndex.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsStartSessionMessageIntegerValuesIndex.aidl new file mode 100644 index 0000000000..95f2d6d597 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsStartSessionMessageIntegerValuesIndex.aidl @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.VmsBaseMessageIntegerValuesIndex; + +/* + * Handshake data sent as part of a VmsMessageType.START_SESSION message. + * + * A new session is initiated by sending a START_SESSION message with the + * sender's identifier populated and the receiver's identifier set to -1. + * + * Identifier values are independently generated, but must be non-negative, and + * increase monotonically between reboots. + * + * Upon receiving a START_SESSION with a mis-matching identifier, the receiver + * must clear any cached VMS offering or subscription state and acknowledge the + * new session by responding with a START_SESSION message that populates both + * identifier fields. + * + * Any VMS messages received between initiation and completion of the handshake + * must be discarded. + */ +// @VintfStability +@Backing(type="int") +enum VmsStartSessionMessageIntegerValuesIndex { + /* + * The message type as enumerated by VmsMessageType enum. + */ + MESSAGE_TYPE = 0, + /* + * Identifier field for the Android system service. + */ + SERVICE_ID = 1, + /* + * Identifier field for the HAL client process. + */ + CLIENT_ID = 2, +} diff --git a/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsSubscriptionsStateIntegerValuesIndex.aidl b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsSubscriptionsStateIntegerValuesIndex.aidl new file mode 100644 index 0000000000..87d59e5471 --- /dev/null +++ b/automotive/vehicle/aidl/android/hardware/automotive/vehicle/VmsSubscriptionsStateIntegerValuesIndex.aidl @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.automotive.vehicle; + +import android.hardware.automotive.vehicle.VmsBaseMessageIntegerValuesIndex; + +/** + * A subscriptions state is sent to the publishers in response to a change in the subscriptions + * as part of a VmsMessageType.SUBSCRIPTIONS_CHANGE, or in response to a + * VmsMessageType.SUBSCRIPTIONS_REQUEST message as part of VmsMessageType.SUBSCRIPTIONS_RESPONSE. + * The VMS service issues monotonically increasing sequence numbers, and in case a subscriber + * receives a smaller sequence number it should ignore the message. The subscriptions are sent as a + * list of layers followed by a list of associated layers: {Sequence number, N, M, N x layer, M x + * associated layer} A subscribed layer is represented as three integers: + * - Layer type + * - Layer subtype + * - Layer version + * A subscribed associated layer is a layer with a list of publisher IDs. It is represented as: + * - Layer type + * - Layer subtype + * - Layer version + * - Number of publisher IDs (N) + * - N x publisher ID + */ +// @VintfStability +@Backing(type="int") +enum VmsSubscriptionsStateIntegerValuesIndex { + /* + * The message type as enumerated by VmsMessageType enum. + */ + MESSAGE_TYPE = 0, + SEQUENCE_NUMBER = 1, + NUMBER_OF_LAYERS = 2, + NUMBER_OF_ASSOCIATED_LAYERS = 3, + SUBSCRIPTIONS_START = 4, +} diff --git a/automotive/vehicle/tools/translate_vehicle_props.py b/automotive/vehicle/tools/translate_vehicle_props.py new file mode 100644 index 0000000000..59eb17d981 --- /dev/null +++ b/automotive/vehicle/tools/translate_vehicle_props.py @@ -0,0 +1,151 @@ +#!/usr/bin/python + +# Copyright (C) 2021 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. +# +"""Tools to translate VehicleProperty from types.hal into AIDL format. + To store it to a file: + $ python translate_vehicle_props.py types.hal > VehicleProperty.aidl +""" +import re +import sys + +ENUM_TYPE_TO_PARSE = [ "VehiclePropertyType", "VehiclePropertyGroup", "VehicleArea" ] +VEHICLE_PROP_ENUM = "VehicleProperty" + +RE_COMMENT_BEGIN = re.compile("\s*\/\*\*") +RE_COMMENT_END = re.compile("\s*\*\/") +RE_COMMENT_SINGLE_LINE = re.compile("\s*\/\*\*.*\*\/") + +RE_ENUM_START = re.compile("\s*enum\s*(\w+)\s?.*\{") +RE_ENUM_END = re.compile("\s*\}\;") + +RE_ENUM_ELEMENT = re.compile("\s*(\w+)\s*\=\s*(\w+),") + +RE_VEHICLE_PROP_ELEMENT = re.compile("\s*(\w+)\s*\=\s*\(?\s*(\w+)\s*\|?\s*(\w+\:\w+)?\s*\|?\s*(\w+:\w+)?\s*\|?\s*(\w+:\w+)?\s*\)?,") + +DBG_COMMENT = False +DBG_ENUM = False + +class HIDLParser: + def __init__(self): + self.inEnum = False + self.currentEnumName = None + self.inVehicleProperty = False + self.inComment = False + self.recentComments = [] + self.currentType = None + self.enumMap = {} + self.outputMsg = [] + self.multilineFormat = [] + self.outputMsg.append("package android.hardware.automotive.vehicle\n\n") + + def addRecentCommentToMsg(self): + self.outputMsg.extend(self.recentComments) + self.recentComments = [] + + def addToMsg(self, msg): + self.outputMsg.append(msg) + + def printOutputMsg(self): + msg = "".join(self.outputMsg) + print(msg) + + def parseLine(self, line): + if self.inComment: + self.recentComments.append(line) + if RE_COMMENT_END.match(line): + self.inComment = False + if DBG_COMMENT: + print("Comment end:{}".format(self.recentComments)) + return + elif RE_COMMENT_BEGIN.match(line): + self.recentComments = [] + self.recentComments.append(line) + if RE_COMMENT_SINGLE_LINE.match(line): + if DBG_COMMENT: + print("Single line Comment:{}".format(self.recentComments)) + return + self.inComment = True + if DBG_COMMENT: + print("Comment start") + return + + if self.inEnum: + if RE_ENUM_END.match(line): + self.inEnum = False + if DBG_ENUM: + print("End enum {}".format(self.currentEnumName)) + else: + matchElement = RE_ENUM_ELEMENT.match(line); + if matchElement: + elementName = matchElement.group(1) + elementValue = matchElement.group(2) + self.enumMap[self.currentEnumName + ':' + elementName] = elementValue + elif self.inVehicleProperty: + if RE_ENUM_END.match(line): + self.inVehicleProperty = False + self.addToMsg("}\n") + else: + text = line.strip() + if len(text) == 0: + self.multilineFormat = [] + else: + self.multilineFormat.append(text) + textToMatch = "".join(self.multilineFormat) + match = RE_VEHICLE_PROP_ELEMENT.match(textToMatch) + if match: + self.multilineFormat = [] + name = match.group(1) + val = match.group(2) + type1 = match.group(3) + self.addRecentCommentToMsg() + if type1 == None: # one line case + self.addToMsg(" {} = {},\n".format(name, val)) + else: + type2 = match.group(4) + type3 = match.group(5) + self.addToMsg(" {} = {} + {} + {} + {}, // {},{},{}\n".\ + format(name, val, self.enumMap[type1], self.enumMap[type3],\ + self.enumMap[type2], type1, type3, type2)) + else: + matchEnum = RE_ENUM_START.match(line) + if matchEnum: + enumName = matchEnum.group(1) + if enumName in ENUM_TYPE_TO_PARSE: + self.currentEnumName = enumName + self.inEnum = True + if DBG_ENUM: + print("enum {}".format(enumName)) + elif enumName == VEHICLE_PROP_ENUM: + self.inVehicleProperty = True + self.addRecentCommentToMsg() + self.addToMsg("@Backing(type=\"int\")\nenum VehicleProperty {\n") + if DBG_ENUM: + print("VehicleProperty starts, all enum values {}".format(self.enumMap)) + + +def main(): + if len(sys.argv) != 2: + print("Usage: {} types_hal_file".format(sys.argv[0])) + sys.exit(1) + file_name = sys.argv[1] + with open(file_name, 'r') as f: + parser = HIDLParser() + for line in f.readlines(): + parser.parseLine(line) + parser.printOutputMsg() + +if __name__ == "__main__": + main() diff --git a/biometrics/face/1.0/default/android.hardware.biometrics.face@1.0-service.rc b/biometrics/face/1.0/default/android.hardware.biometrics.face@1.0-service.rc index 6c7362f2bb..3fb827d63a 100644 --- a/biometrics/face/1.0/default/android.hardware.biometrics.face@1.0-service.rc +++ b/biometrics/face/1.0/default/android.hardware.biometrics.face@1.0-service.rc @@ -5,6 +5,6 @@ service vendor.face-hal-1-0-default /vendor/bin/hw/android.hardware.biometrics.f class late_start user system group system - writepid /dev/cpuset/foreground/tasks + task_profiles ProcessCapacityHigh capabilities SYS_NICE rlimit rtprio 10 10 diff --git a/biometrics/face/1.0/vts/functional/OWNERS b/biometrics/face/1.0/vts/functional/OWNERS new file mode 100644 index 0000000000..7651b694f4 --- /dev/null +++ b/biometrics/face/1.0/vts/functional/OWNERS @@ -0,0 +1,2 @@ +# Bug component: 432605 +ilyamaty@google.com diff --git a/biometrics/face/aidl/Android.bp b/biometrics/face/aidl/Android.bp index 54d3ecd1e1..3f53fc8cdf 100644 --- a/biometrics/face/aidl/Android.bp +++ b/biometrics/face/aidl/Android.bp @@ -15,13 +15,14 @@ aidl_interface { ], imports: [ "android.hardware.biometrics.common", - "android.hardware.common", + "android.hardware.common-V2", "android.hardware.keymaster", ], stability: "vintf", backend: { java: { platform_apis: true, + srcs_available: true, }, cpp: { enabled: false, diff --git a/biometrics/face/aidl/default/Android.bp b/biometrics/face/aidl/default/Android.bp index d72411e6e2..509231859d 100644 --- a/biometrics/face/aidl/default/Android.bp +++ b/biometrics/face/aidl/default/Android.bp @@ -16,8 +16,8 @@ cc_binary { shared_libs: [ "libbase", "libbinder_ndk", - "android.hardware.biometrics.face-V1-ndk_platform", - "android.hardware.biometrics.common-V1-ndk_platform", + "android.hardware.biometrics.face-V1-ndk", + "android.hardware.biometrics.common-V1-ndk", ], srcs: [ "main.cpp", diff --git a/biometrics/face/aidl/vts/Android.bp b/biometrics/face/aidl/vts/Android.bp index 99c8c99488..09ec4d06e3 100644 --- a/biometrics/face/aidl/vts/Android.bp +++ b/biometrics/face/aidl/vts/Android.bp @@ -15,10 +15,10 @@ cc_test { ], srcs: ["VtsHalBiometricsFaceTargetTest.cpp"], static_libs: [ - "android.hardware.biometrics.common-V1-ndk_platform", - "android.hardware.biometrics.face-V1-ndk_platform", - "android.hardware.common-V2-ndk_platform", - "android.hardware.keymaster-V3-ndk_platform", + "android.hardware.biometrics.common-V1-ndk", + "android.hardware.biometrics.face-V1-ndk", + "android.hardware.common-V2-ndk", + "android.hardware.keymaster-V3-ndk", ], shared_libs: [ "libbinder_ndk", diff --git a/biometrics/fingerprint/2.1/default/android.hardware.biometrics.fingerprint@2.1-service.rc b/biometrics/fingerprint/2.1/default/android.hardware.biometrics.fingerprint@2.1-service.rc index 1667677bfe..e7e8d30bf5 100644 --- a/biometrics/fingerprint/2.1/default/android.hardware.biometrics.fingerprint@2.1-service.rc +++ b/biometrics/fingerprint/2.1/default/android.hardware.biometrics.fingerprint@2.1-service.rc @@ -5,4 +5,4 @@ service vendor.fps_hal /vendor/bin/hw/android.hardware.biometrics.fingerprint@2. class late_start user system group system input uhid - writepid /dev/cpuset/system-background/tasks + task_profiles ServiceCapacityLow diff --git a/biometrics/fingerprint/2.2/default/Android.bp b/biometrics/fingerprint/2.2/default/Android.bp index f4fb57f20c..2d262f01f5 100644 --- a/biometrics/fingerprint/2.2/default/Android.bp +++ b/biometrics/fingerprint/2.2/default/Android.bp @@ -25,6 +25,7 @@ cc_binary { "libhidlbase", "libhardware", "libutils", + "android.hardware.biometrics.fingerprint@2.1", "android.hardware.biometrics.fingerprint@2.2", ], diff --git a/biometrics/fingerprint/aidl/default/Android.bp b/biometrics/fingerprint/aidl/default/Android.bp index 80e6e02cf1..08fe4b04b7 100644 --- a/biometrics/fingerprint/aidl/default/Android.bp +++ b/biometrics/fingerprint/aidl/default/Android.bp @@ -24,8 +24,8 @@ cc_binary { shared_libs: [ "libbase", "libbinder_ndk", - "android.hardware.biometrics.fingerprint-V1-ndk_platform", - "android.hardware.biometrics.common-V1-ndk_platform", + "android.hardware.biometrics.fingerprint-V1-ndk", + "android.hardware.biometrics.common-V1-ndk", ], } diff --git a/biometrics/fingerprint/aidl/vts/Android.bp b/biometrics/fingerprint/aidl/vts/Android.bp index 5539548856..30d5624144 100644 --- a/biometrics/fingerprint/aidl/vts/Android.bp +++ b/biometrics/fingerprint/aidl/vts/Android.bp @@ -15,9 +15,9 @@ cc_test { ], srcs: ["VtsHalBiometricsFingerprintTargetTest.cpp"], static_libs: [ - "android.hardware.biometrics.common-V1-ndk_platform", - "android.hardware.biometrics.fingerprint-V1-ndk_platform", - "android.hardware.keymaster-V3-ndk_platform", + "android.hardware.biometrics.common-V1-ndk", + "android.hardware.biometrics.fingerprint-V1-ndk", + "android.hardware.keymaster-V3-ndk", ], shared_libs: [ "libbinder_ndk", diff --git a/bluetooth/1.0/default/Android.bp b/bluetooth/1.0/default/Android.bp index 70a42b7f9b..ee368fd6eb 100644 --- a/bluetooth/1.0/default/Android.bp +++ b/bluetooth/1.0/default/Android.bp @@ -22,7 +22,7 @@ package { default_applicable_licenses: ["hardware_interfaces_license"], } -cc_library_shared { +cc_library { name: "android.hardware.bluetooth@1.0-impl", defaults: ["hidl_defaults"], vendor: true, diff --git a/bluetooth/audio/2.1/default/Android.bp b/bluetooth/audio/2.1/default/Android.bp index 5c30f79001..3000223f73 100644 --- a/bluetooth/audio/2.1/default/Android.bp +++ b/bluetooth/audio/2.1/default/Android.bp @@ -19,6 +19,7 @@ cc_library_shared { "A2dpSoftwareAudioProvider.cpp", "HearingAidAudioProvider.cpp", "LeAudioAudioProvider.cpp", + "LeAudioOffloadAudioProvider.cpp", ], header_libs: ["libhardware_headers"], shared_libs: [ diff --git a/bluetooth/audio/2.1/default/BluetoothAudioProvidersFactory.cpp b/bluetooth/audio/2.1/default/BluetoothAudioProvidersFactory.cpp index e1b1ac6793..b0d171a7ba 100644 --- a/bluetooth/audio/2.1/default/BluetoothAudioProvidersFactory.cpp +++ b/bluetooth/audio/2.1/default/BluetoothAudioProvidersFactory.cpp @@ -41,8 +41,12 @@ HearingAidAudioProvider BluetoothAudioProvidersFactory::hearing_aid_provider_instance_; LeAudioOutputAudioProvider BluetoothAudioProvidersFactory::leaudio_output_provider_instance_; +LeAudioOffloadOutputAudioProvider + BluetoothAudioProvidersFactory::leaudio_offload_output_provider_instance_; LeAudioInputAudioProvider BluetoothAudioProvidersFactory::leaudio_input_provider_instance_; +LeAudioOffloadInputAudioProvider + BluetoothAudioProvidersFactory::leaudio_offload_input_provider_instance_; Return<void> BluetoothAudioProvidersFactory::openProvider( const V2_0::SessionType sessionType, openProvider_cb _hidl_cb) { @@ -90,9 +94,15 @@ Return<void> BluetoothAudioProvidersFactory::openProvider_2_1( case SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH: provider = &leaudio_output_provider_instance_; break; + case SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH: + provider = &leaudio_offload_output_provider_instance_; + break; case SessionType::LE_AUDIO_SOFTWARE_DECODED_DATAPATH: provider = &leaudio_input_provider_instance_; break; + case SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH: + provider = &leaudio_offload_input_provider_instance_; + break; default: status = BluetoothAudioStatus::FAILURE; } diff --git a/bluetooth/audio/2.1/default/BluetoothAudioProvidersFactory.h b/bluetooth/audio/2.1/default/BluetoothAudioProvidersFactory.h index fd836945d6..f8f557e8c7 100644 --- a/bluetooth/audio/2.1/default/BluetoothAudioProvidersFactory.h +++ b/bluetooth/audio/2.1/default/BluetoothAudioProvidersFactory.h @@ -23,6 +23,7 @@ #include "BluetoothAudioProvider.h" #include "HearingAidAudioProvider.h" #include "LeAudioAudioProvider.h" +#include "LeAudioOffloadAudioProvider.h" namespace android { namespace hardware { @@ -55,6 +56,8 @@ class BluetoothAudioProvidersFactory : public IBluetoothAudioProvidersFactory { static HearingAidAudioProvider hearing_aid_provider_instance_; static LeAudioOutputAudioProvider leaudio_output_provider_instance_; static LeAudioInputAudioProvider leaudio_input_provider_instance_; + static LeAudioOffloadOutputAudioProvider leaudio_offload_output_provider_instance_; + static LeAudioOffloadInputAudioProvider leaudio_offload_input_provider_instance_; }; extern "C" IBluetoothAudioProvidersFactory* diff --git a/bluetooth/audio/2.1/default/LeAudioOffloadAudioProvider.cpp b/bluetooth/audio/2.1/default/LeAudioOffloadAudioProvider.cpp new file mode 100644 index 0000000000..c11bdad2d9 --- /dev/null +++ b/bluetooth/audio/2.1/default/LeAudioOffloadAudioProvider.cpp @@ -0,0 +1,108 @@ +/* + * Copyright 2021 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. + */ + +#define LOG_TAG "BTAudioProviderLeAudioOffload" + +#include "LeAudioOffloadAudioProvider.h" + +#include <android-base/logging.h> + +#include "BluetoothAudioSessionReport_2_1.h" +#include "BluetoothAudioSupportedCodecsDB_2_1.h" + +namespace android { +namespace hardware { +namespace bluetooth { +namespace audio { +namespace V2_1 { +namespace implementation { + +using ::android::bluetooth::audio::BluetoothAudioSessionReport_2_1; +using ::android::hardware::Void; +using ::android::hardware::bluetooth::audio::V2_0::BitsPerSample; +using ::android::hardware::bluetooth::audio::V2_0::ChannelMode; +using ::android::hardware::bluetooth::audio::V2_1::SampleRate; + +using DataMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>; + +LeAudioOffloadOutputAudioProvider::LeAudioOffloadOutputAudioProvider() + : LeAudioOffloadAudioProvider() { + session_type_ = SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH; +} + +LeAudioOffloadInputAudioProvider::LeAudioOffloadInputAudioProvider() + : LeAudioOffloadAudioProvider() { + session_type_ = SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH; +} + +LeAudioOffloadAudioProvider::LeAudioOffloadAudioProvider() + : BluetoothAudioProvider() {} + +bool LeAudioOffloadAudioProvider::isValid(const V2_0::SessionType& sessionType) { + LOG(ERROR) << __func__ << ", invalid session type for Offloaded Le Audio provider: " + << toString(sessionType); + + return false; +} + +bool LeAudioOffloadAudioProvider::isValid(const SessionType& sessionType) { + return (sessionType == session_type_); +} + +Return<void> LeAudioOffloadAudioProvider::startSession_2_1( + const sp<V2_0::IBluetoothAudioPort>& hostIf, + const AudioConfiguration& audioConfig, startSession_cb _hidl_cb) { + /** + * Initialize the audio platform if audioConfiguration is supported. + * Save the IBluetoothAudioPort interface, so that it can be used + * later to send stream control commands to the HAL client, based on + * interaction with Audio framework. + */ + if (audioConfig.getDiscriminator() != + AudioConfiguration::hidl_discriminator::leAudioCodecConfig) { + LOG(WARNING) << __func__ + << " - Invalid Audio Configuration=" << toString(audioConfig); + _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION, + DataMQ::Descriptor()); + return Void(); + } + + if (!android::bluetooth::audio::IsOffloadLeAudioConfigurationValid(session_type_, + audioConfig.leAudioCodecConfig())) { + LOG(WARNING) << __func__ << " - Unsupported LC3 Offloaded Configuration=" + << toString(audioConfig.leAudioCodecConfig()); + _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION, + DataMQ::Descriptor()); + return Void(); + } + + return BluetoothAudioProvider::startSession_2_1(hostIf, audioConfig, + _hidl_cb); +} + +Return<void> LeAudioOffloadAudioProvider::onSessionReady(startSession_cb _hidl_cb) { + BluetoothAudioSessionReport_2_1::OnSessionStarted(session_type_, stack_iface_, + nullptr, audio_config_); + _hidl_cb(BluetoothAudioStatus::SUCCESS, DataMQ::Descriptor()); + return Void(); +} + +} // namespace implementation +} // namespace V2_1 +} // namespace audio +} // namespace bluetooth +} // namespace hardware +} // namespace android diff --git a/bluetooth/audio/2.1/default/LeAudioOffloadAudioProvider.h b/bluetooth/audio/2.1/default/LeAudioOffloadAudioProvider.h new file mode 100644 index 0000000000..564e9a361d --- /dev/null +++ b/bluetooth/audio/2.1/default/LeAudioOffloadAudioProvider.h @@ -0,0 +1,60 @@ +/* + * Copyright 2021 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 <android/hardware/bluetooth/audio/2.1/types.h> + +#include "BluetoothAudioProvider.h" + +namespace android { +namespace hardware { +namespace bluetooth { +namespace audio { +namespace V2_1 { +namespace implementation { + +class LeAudioOffloadAudioProvider : public BluetoothAudioProvider { + public: + LeAudioOffloadAudioProvider(); + + bool isValid(const SessionType& sessionType) override; + bool isValid(const V2_0::SessionType& sessionType) override; + + Return<void> startSession_2_1(const sp<V2_0::IBluetoothAudioPort>& hostIf, + const AudioConfiguration& audioConfig, + startSession_cb _hidl_cb) override; + + private: + Return<void> onSessionReady(startSession_cb _hidl_cb) override; +}; + +class LeAudioOffloadOutputAudioProvider : public LeAudioOffloadAudioProvider { + public: + LeAudioOffloadOutputAudioProvider(); +}; + +class LeAudioOffloadInputAudioProvider : public LeAudioOffloadAudioProvider { + public: + LeAudioOffloadInputAudioProvider(); +}; + +} // namespace implementation +} // namespace V2_1 +} // namespace audio +} // namespace bluetooth +} // namespace hardware +} // namespace android diff --git a/bluetooth/audio/utils/session/BluetoothAudioSessionControl_2_1.h b/bluetooth/audio/utils/session/BluetoothAudioSessionControl_2_1.h index 4d7be21d7a..95f740850f 100644 --- a/bluetooth/audio/utils/session/BluetoothAudioSessionControl_2_1.h +++ b/bluetooth/audio/utils/session/BluetoothAudioSessionControl_2_1.h @@ -35,7 +35,7 @@ class BluetoothAudioSessionControl_2_1 { std::shared_ptr<BluetoothAudioSession_2_1> session_ptr = BluetoothAudioSessionInstance_2_1::GetSessionInstance(session_type); if (session_ptr != nullptr) { - return session_ptr->GetAudioSession()->IsSessionReady(); + return session_ptr->IsSessionReady(); } return false; } diff --git a/bluetooth/audio/utils/session/BluetoothAudioSession_2_1.cpp b/bluetooth/audio/utils/session/BluetoothAudioSession_2_1.cpp index 9d91196d4d..c250ef1f16 100644 --- a/bluetooth/audio/utils/session/BluetoothAudioSession_2_1.cpp +++ b/bluetooth/audio/utils/session/BluetoothAudioSession_2_1.cpp @@ -60,6 +60,16 @@ BluetoothAudioSession_2_1::BluetoothAudioSession_2_1( } } +bool BluetoothAudioSession_2_1::IsSessionReady() { + if (session_type_2_1_ != + SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH) { + return audio_session->IsSessionReady(); + } + + std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_); + return audio_session->stack_iface_ != nullptr; +} + std::shared_ptr<BluetoothAudioSession> BluetoothAudioSession_2_1::GetAudioSession() { return audio_session; @@ -70,7 +80,7 @@ BluetoothAudioSession_2_1::GetAudioSession() { const ::android::hardware::bluetooth::audio::V2_1::AudioConfiguration BluetoothAudioSession_2_1::GetAudioConfig() { std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_); - if (audio_session->IsSessionReady()) { + if (IsSessionReady()) { // If session is unknown it means it should be 2.0 type if (session_type_2_1_ != SessionType_2_1::UNKNOWN) return audio_config_2_1_; @@ -110,20 +120,29 @@ bool BluetoothAudioSession_2_1::UpdateAudioConfig( SessionType_2_1::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH || session_type_2_1_ == SessionType_2_1::LE_AUDIO_SOFTWARE_DECODED_DATAPATH); - bool is_offload_session = + bool is_offload_a2dp_session = (session_type_2_1_ == SessionType_2_1::A2DP_HARDWARE_OFFLOAD_DATAPATH); + bool is_offload_le_audio_session = + (session_type_2_1_ == SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH || + session_type_2_1_ == SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH); auto audio_config_discriminator = audio_config.getDiscriminator(); bool is_software_audio_config = (is_software_session && audio_config_discriminator == ::android::hardware::bluetooth::audio::V2_1::AudioConfiguration:: hidl_discriminator::pcmConfig); - bool is_offload_audio_config = - (is_offload_session && + bool is_a2dp_offload_audio_config = + (is_offload_a2dp_session && audio_config_discriminator == ::android::hardware::bluetooth::audio::V2_1::AudioConfiguration:: hidl_discriminator::codecConfig); - if (!is_software_audio_config && !is_offload_audio_config) { + bool is_le_audio_offload_audio_config = + (is_offload_le_audio_session && + audio_config_discriminator == + ::android::hardware::bluetooth::audio::V2_1::AudioConfiguration:: + hidl_discriminator::leAudioCodecConfig); + if (!is_software_audio_config && !is_a2dp_offload_audio_config && + !is_le_audio_offload_audio_config) { return false; } audio_config_2_1_ = audio_config; diff --git a/bluetooth/audio/utils/session/BluetoothAudioSession_2_1.h b/bluetooth/audio/utils/session/BluetoothAudioSession_2_1.h index 5a351531a3..db82c733f4 100644 --- a/bluetooth/audio/utils/session/BluetoothAudioSession_2_1.h +++ b/bluetooth/audio/utils/session/BluetoothAudioSession_2_1.h @@ -50,6 +50,10 @@ class BluetoothAudioSession_2_1 { const ::android::hardware::bluetooth::audio::V2_1::SessionType& session_type); + // The function helps to check if this session is ready or not + // @return: true if the Bluetooth stack has started the specified session + bool IsSessionReady(); + std::shared_ptr<BluetoothAudioSession> GetAudioSession(); // The report function is used to report that the Bluetooth stack has started diff --git a/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_1.cpp b/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_1.cpp index 8b0b0f743a..c90ce6d197 100644 --- a/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_1.cpp +++ b/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_1.cpp @@ -122,6 +122,21 @@ bool IsOffloadCodecConfigurationValid( return false; } +bool IsOffloadLeAudioConfigurationValid( + const ::android::hardware::bluetooth::audio::V2_1::SessionType& + session_type, + const ::android::hardware::bluetooth::audio::V2_1::Lc3CodecConfiguration&) { + + if (session_type != SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH && + session_type != SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH) { + return false; + } + + //TODO: perform checks on le_audio_codec_config once we know supported parameters + + return true; +} + } // namespace audio } // namespace bluetooth } // namespace android diff --git a/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_1.h b/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_1.h index 746d9c05ed..a52636cfbd 100644 --- a/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_1.h +++ b/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_1.h @@ -41,6 +41,11 @@ bool IsOffloadCodecConfigurationValid( const ::android::hardware::bluetooth::audio::V2_0::CodecConfiguration& codec_config); +bool IsOffloadLeAudioConfigurationValid( + const ::android::hardware::bluetooth::audio::V2_1::SessionType& + session_type, + const ::android::hardware::bluetooth::audio::V2_1::Lc3CodecConfiguration& + le_audio_codec_config); } // namespace audio } // namespace bluetooth } // namespace android diff --git a/broadcastradio/2.0/vts/functional/VtsHalBroadcastradioV2_0TargetTest.cpp b/broadcastradio/2.0/vts/functional/VtsHalBroadcastradioV2_0TargetTest.cpp index 362ab41c4f..615fde0343 100644 --- a/broadcastradio/2.0/vts/functional/VtsHalBroadcastradioV2_0TargetTest.cpp +++ b/broadcastradio/2.0/vts/functional/VtsHalBroadcastradioV2_0TargetTest.cpp @@ -496,10 +496,26 @@ TEST_P(BroadcastRadioHalTest, TuneFailsWithInvalid) { * - program changes exactly to what was requested. */ TEST_P(BroadcastRadioHalTest, DabTune) { + Result halResult; + hidl_vec<DabTableEntry> config; + auto cb = [&](Result result, hidl_vec<DabTableEntry> configCb) { + halResult = result; + config = configCb; + }; + auto hidlResult = mModule->getDabRegionConfig(cb); + ASSERT_TRUE(hidlResult.isOk()); + + if (halResult == Result::NOT_SUPPORTED) { + printSkipped("DAB not supported"); + return; + } + ASSERT_EQ(Result::OK, halResult); + ASSERT_NE(config.size(), 0U); + ASSERT_TRUE(openSession()); ProgramSelector sel = {}; - uint64_t freq = 178352; + uint64_t freq = config[config.size() / 2].frequency; sel.primaryId = make_identifier(IdentifierType::DAB_FREQUENCY,freq); std::this_thread::sleep_for(gTuneWorkaround); diff --git a/camera/provider/2.4/vts/functional/OWNERS b/camera/provider/2.4/vts/functional/OWNERS new file mode 100644 index 0000000000..479f465c69 --- /dev/null +++ b/camera/provider/2.4/vts/functional/OWNERS @@ -0,0 +1,2 @@ +# Bug component: 41727 +epeev@google.com diff --git a/cas/1.0/default/android.hardware.cas@1.0-service-lazy.rc b/cas/1.0/default/android.hardware.cas@1.0-service-lazy.rc index 443549a062..622ee8f6cd 100644 --- a/cas/1.0/default/android.hardware.cas@1.0-service-lazy.rc +++ b/cas/1.0/default/android.hardware.cas@1.0-service-lazy.rc @@ -6,4 +6,4 @@ service vendor.cas-hal-1-0 /vendor/bin/hw/android.hardware.cas@1.0-service-lazy user media group mediadrm drmrpc ioprio rt 4 - writepid /dev/cpuset/foreground/tasks + task_profiles ProcessCapacityHigh diff --git a/cas/1.0/default/android.hardware.cas@1.0-service.rc b/cas/1.0/default/android.hardware.cas@1.0-service.rc index 74f2f9676e..5df4825239 100644 --- a/cas/1.0/default/android.hardware.cas@1.0-service.rc +++ b/cas/1.0/default/android.hardware.cas@1.0-service.rc @@ -3,4 +3,4 @@ service vendor.cas-hal-1-0 /vendor/bin/hw/android.hardware.cas@1.0-service user media group mediadrm drmrpc ioprio rt 4 - writepid /dev/cpuset/foreground/tasks + task_profiles ProcessCapacityHigh diff --git a/cas/1.1/default/android.hardware.cas@1.1-service-lazy.rc b/cas/1.1/default/android.hardware.cas@1.1-service-lazy.rc index 73c505d351..0721dc38f3 100644 --- a/cas/1.1/default/android.hardware.cas@1.1-service-lazy.rc +++ b/cas/1.1/default/android.hardware.cas@1.1-service-lazy.rc @@ -7,4 +7,4 @@ service vendor.cas-hal-1-1 /vendor/bin/hw/android.hardware.cas@1.1-service-lazy user media group mediadrm drmrpc ioprio rt 4 - writepid /dev/cpuset/foreground/tasks + task_profiles ProcessCapacityHigh diff --git a/cas/1.1/default/android.hardware.cas@1.1-service.rc b/cas/1.1/default/android.hardware.cas@1.1-service.rc index 4081fe1e64..132d943e18 100644 --- a/cas/1.1/default/android.hardware.cas@1.1-service.rc +++ b/cas/1.1/default/android.hardware.cas@1.1-service.rc @@ -3,4 +3,4 @@ service vendor.cas-hal-1-1 /vendor/bin/hw/android.hardware.cas@1.1-service user media group mediadrm drmrpc ioprio rt 4 - writepid /dev/cpuset/foreground/tasks + task_profiles ProcessCapacityHigh diff --git a/cas/1.2/default/android.hardware.cas@1.2-service-lazy.rc b/cas/1.2/default/android.hardware.cas@1.2-service-lazy.rc index 1c7510030b..d91fdcecfa 100644 --- a/cas/1.2/default/android.hardware.cas@1.2-service-lazy.rc +++ b/cas/1.2/default/android.hardware.cas@1.2-service-lazy.rc @@ -8,4 +8,4 @@ service vendor.cas-hal-1-2 /vendor/bin/hw/android.hardware.cas@1.2-service-lazy user media group mediadrm drmrpc ioprio rt 4 - writepid /dev/cpuset/foreground/tasks + task_profiles ProcessCapacityHigh diff --git a/cas/1.2/default/android.hardware.cas@1.2-service.rc b/cas/1.2/default/android.hardware.cas@1.2-service.rc index d1c853e40f..b22971a259 100644 --- a/cas/1.2/default/android.hardware.cas@1.2-service.rc +++ b/cas/1.2/default/android.hardware.cas@1.2-service.rc @@ -3,4 +3,4 @@ service vendor.cas-hal-1-2 /vendor/bin/hw/android.hardware.cas@1.2-service user media group mediadrm drmrpc ioprio rt 4 - writepid /dev/cpuset/foreground/tasks + task_profiles ProcessCapacityHigh diff --git a/common/fmq/aidl/Android.bp b/common/fmq/aidl/Android.bp index fb2f4e0651..3c414e7876 100644 --- a/common/fmq/aidl/Android.bp +++ b/common/fmq/aidl/Android.bp @@ -24,7 +24,8 @@ aidl_interface { stability: "vintf", backend: { java: { - enabled: false, + sdk_version: "module_current", + srcs_available: true, }, cpp: { enabled: false, diff --git a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/.hash b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/.hash index da122e601c..b88c5fcacb 100644 --- a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/.hash +++ b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/.hash @@ -1 +1,2 @@ 12cf0ce8614557cc0efe73bdf011f5193f7a8653 +6a780550f6e6965d6969fd7964c3ca81b6b0ccdf diff --git a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/GrantorDescriptor.aidl b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/GrantorDescriptor.aidl index cf7048bc02..0430c6e65c 100644 --- a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/GrantorDescriptor.aidl +++ b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/GrantorDescriptor.aidl @@ -32,6 +32,7 @@ // later when a module using the interface is updated, e.g., Mainline modules. package android.hardware.common.fmq; +/* @hide */ @VintfStability parcelable GrantorDescriptor { int fdIndex; diff --git a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/MQDescriptor.aidl b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/MQDescriptor.aidl index add4b64cf1..ab3af0f5d0 100644 --- a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/MQDescriptor.aidl +++ b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/MQDescriptor.aidl @@ -32,6 +32,7 @@ // later when a module using the interface is updated, e.g., Mainline modules. package android.hardware.common.fmq; +/* @hide */ @VintfStability parcelable MQDescriptor<T, Flavor> { android.hardware.common.fmq.GrantorDescriptor[] grantors; diff --git a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/SynchronizedReadWrite.aidl b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/SynchronizedReadWrite.aidl index 12c61bab2e..72bab1c6e2 100644 --- a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/SynchronizedReadWrite.aidl +++ b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/SynchronizedReadWrite.aidl @@ -32,6 +32,7 @@ // later when a module using the interface is updated, e.g., Mainline modules. package android.hardware.common.fmq; +/* @hide */ @VintfStability enum SynchronizedReadWrite { EMPTY = 0, diff --git a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/UnsynchronizedWrite.aidl b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/UnsynchronizedWrite.aidl index f99528d398..f3086881cb 100644 --- a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/UnsynchronizedWrite.aidl +++ b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/1/android/hardware/common/fmq/UnsynchronizedWrite.aidl @@ -32,6 +32,7 @@ // later when a module using the interface is updated, e.g., Mainline modules. package android.hardware.common.fmq; +/* @hide */ @VintfStability enum UnsynchronizedWrite { EMPTY = 0, diff --git a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/GrantorDescriptor.aidl b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/GrantorDescriptor.aidl index cf7048bc02..0430c6e65c 100644 --- a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/GrantorDescriptor.aidl +++ b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/GrantorDescriptor.aidl @@ -32,6 +32,7 @@ // later when a module using the interface is updated, e.g., Mainline modules. package android.hardware.common.fmq; +/* @hide */ @VintfStability parcelable GrantorDescriptor { int fdIndex; diff --git a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/MQDescriptor.aidl b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/MQDescriptor.aidl index add4b64cf1..ab3af0f5d0 100644 --- a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/MQDescriptor.aidl +++ b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/MQDescriptor.aidl @@ -32,6 +32,7 @@ // later when a module using the interface is updated, e.g., Mainline modules. package android.hardware.common.fmq; +/* @hide */ @VintfStability parcelable MQDescriptor<T, Flavor> { android.hardware.common.fmq.GrantorDescriptor[] grantors; diff --git a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/SynchronizedReadWrite.aidl b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/SynchronizedReadWrite.aidl index 12c61bab2e..72bab1c6e2 100644 --- a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/SynchronizedReadWrite.aidl +++ b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/SynchronizedReadWrite.aidl @@ -32,6 +32,7 @@ // later when a module using the interface is updated, e.g., Mainline modules. package android.hardware.common.fmq; +/* @hide */ @VintfStability enum SynchronizedReadWrite { EMPTY = 0, diff --git a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/UnsynchronizedWrite.aidl b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/UnsynchronizedWrite.aidl index f99528d398..f3086881cb 100644 --- a/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/UnsynchronizedWrite.aidl +++ b/common/fmq/aidl/aidl_api/android.hardware.common.fmq/current/android/hardware/common/fmq/UnsynchronizedWrite.aidl @@ -32,6 +32,7 @@ // later when a module using the interface is updated, e.g., Mainline modules. package android.hardware.common.fmq; +/* @hide */ @VintfStability enum UnsynchronizedWrite { EMPTY = 0, diff --git a/common/fmq/aidl/android/hardware/common/fmq/GrantorDescriptor.aidl b/common/fmq/aidl/android/hardware/common/fmq/GrantorDescriptor.aidl index 672415e65a..c6ca470e91 100644 --- a/common/fmq/aidl/android/hardware/common/fmq/GrantorDescriptor.aidl +++ b/common/fmq/aidl/android/hardware/common/fmq/GrantorDescriptor.aidl @@ -18,6 +18,7 @@ package android.hardware.common.fmq; /* * Included in MQDescriptor, for use with libfmq. + * @hide */ @VintfStability parcelable GrantorDescriptor { diff --git a/common/fmq/aidl/android/hardware/common/fmq/MQDescriptor.aidl b/common/fmq/aidl/android/hardware/common/fmq/MQDescriptor.aidl index 46622f00a9..f2fcb313b7 100644 --- a/common/fmq/aidl/android/hardware/common/fmq/MQDescriptor.aidl +++ b/common/fmq/aidl/android/hardware/common/fmq/MQDescriptor.aidl @@ -26,6 +26,7 @@ import android.hardware.common.fmq.GrantorDescriptor; * T - is used to specify the type of the payload * Flavor - is used to specify the type of the queue using * android.hardware.common.SynchronizedReadWrite or UnsynchronizedWrite + * @hide */ @VintfStability parcelable MQDescriptor<T, Flavor> { diff --git a/common/fmq/aidl/android/hardware/common/fmq/SynchronizedReadWrite.aidl b/common/fmq/aidl/android/hardware/common/fmq/SynchronizedReadWrite.aidl index 8c334423e0..8b1d0a1177 100644 --- a/common/fmq/aidl/android/hardware/common/fmq/SynchronizedReadWrite.aidl +++ b/common/fmq/aidl/android/hardware/common/fmq/SynchronizedReadWrite.aidl @@ -20,6 +20,7 @@ package android.hardware.common.fmq; * For use with android.hardware.common.MQDescriptor to specify which type of * queue to use. SynchronizedReadWrite is single reader, single writer, with no * overflow. All messages written need to be read. + * @hide */ @VintfStability enum SynchronizedReadWrite { diff --git a/common/fmq/aidl/android/hardware/common/fmq/UnsynchronizedWrite.aidl b/common/fmq/aidl/android/hardware/common/fmq/UnsynchronizedWrite.aidl index 24c4cce74c..5fe48c88d3 100644 --- a/common/fmq/aidl/android/hardware/common/fmq/UnsynchronizedWrite.aidl +++ b/common/fmq/aidl/android/hardware/common/fmq/UnsynchronizedWrite.aidl @@ -20,6 +20,7 @@ package android.hardware.common.fmq; * For use with android.hardware.common.MQDescriptor to specify which type of * queue to use. UnsynchronizedWrite is single writer, multiple reader, with * overflow. If messages are not read fast enough, they can be overwritten. + * @hide */ @VintfStability enum UnsynchronizedWrite { diff --git a/common/support/Android.bp b/common/support/Android.bp index 730798d840..b24893b16e 100644 --- a/common/support/Android.bp +++ b/common/support/Android.bp @@ -15,7 +15,7 @@ cc_library_static { srcs: ["NativeHandle.cpp"], export_include_dirs: ["include"], shared_libs: [ - "android.hardware.common-V2-ndk_platform", + "android.hardware.common-V2-ndk", "libcutils", ], apex_available: [ @@ -31,7 +31,7 @@ cc_test { defaults: ["libbinder_ndk_host_user"], srcs: ["test.cpp"], static_libs: [ - "android.hardware.common-V2-ndk_platform", + "android.hardware.common-V2-ndk", "libaidlcommonsupport", ], shared_libs: [ diff --git a/compatibility_matrices/Android.bp b/compatibility_matrices/Android.bp index 31fa1ae403..a59be21482 100644 --- a/compatibility_matrices/Android.bp +++ b/compatibility_matrices/Android.bp @@ -75,14 +75,11 @@ vintf_compatibility_matrix { vintf_compatibility_matrix { name: "framework_compatibility_matrix.current.xml", - enabled: false, stem: "compatibility_matrix.current.xml", srcs: [ "compatibility_matrix.current.xml", ], kernel_configs: [ - "kernel_config_current_4.19", - "kernel_config_current_5.4", "kernel_config_current_5.10", ], } diff --git a/compatibility_matrices/Android.mk b/compatibility_matrices/Android.mk index 4cefb5506e..9e715bf37d 100644 --- a/compatibility_matrices/Android.mk +++ b/compatibility_matrices/Android.mk @@ -102,6 +102,7 @@ my_system_matrix_deps := \ framework_compatibility_matrix.4.xml \ framework_compatibility_matrix.5.xml \ framework_compatibility_matrix.6.xml \ + framework_compatibility_matrix.current.xml \ framework_compatibility_matrix.device.xml \ my_framework_matrix_deps += \ diff --git a/compatibility_matrices/build/vintf_compatibility_matrix.go b/compatibility_matrices/build/vintf_compatibility_matrix.go index f1bd0ae797..c72cbde05c 100644 --- a/compatibility_matrices/build/vintf_compatibility_matrix.go +++ b/compatibility_matrices/build/vintf_compatibility_matrix.go @@ -153,7 +153,7 @@ func (g *vintfCompatibilityMatrixRule) GenerateAndroidBuildActions(ctx android.M if k, ok := m.(*configs.KernelConfigRule); ok { inputPaths = append(inputPaths, k.OutputPath()) } else { - ctx.PropertyErrorf("kernel_config", + ctx.PropertyErrorf("kernel_configs", "module %q is not a kernel_config", ctx.OtherModuleName(m)) } }) diff --git a/compatibility_matrices/compatibility_matrix.current.xml b/compatibility_matrices/compatibility_matrix.current.xml index 55d4f973da..ec0a650f1a 100644 --- a/compatibility_matrices/compatibility_matrix.current.xml +++ b/compatibility_matrices/compatibility_matrix.current.xml @@ -85,12 +85,19 @@ <instance>default</instance> </interface> </hal> + <hal format="aidl" optional="true"> + <name>android.hardware.automotive.vehicle</name> + <interface> + <name>IVehicle</name> + <regex-instance>.*</regex-instance> + </interface> + </hal> <hal format="hidl" optional="true"> <name>android.hardware.automotive.vehicle</name> <version>2.0</version> <interface> <name>IVehicle</name> - <instance>default</instance> + <regex-instance>.*</regex-instance> </interface> </hal> <hal format="hidl" optional="true"> @@ -522,12 +529,20 @@ </hal> <hal format="hidl" optional="true"> <name>android.hardware.soundtrigger</name> - <version>2.3</version> + <version>2.3-4</version> <interface> <name>ISoundTriggerHw</name> <instance>default</instance> </interface> </hal> + <hal format="aidl" optional="true"> + <name>android.hardware.soundtrigger3</name> + <version>1</version> + <interface> + <name>ISoundTriggerHw</name> + <instance>default</instance> + </interface> + </hal> <hal format="hidl" optional="true"> <name>android.hardware.tetheroffload.config</name> <version>1.0</version> @@ -576,6 +591,14 @@ <instance>default</instance> </interface> </hal> + <hal format="aidl" optional="true"> + <name>android.hardware.tv.tuner</name> + <version>1</version> + <interface> + <name>ITuner</name> + <instance>default</instance> + </interface> + </hal> <hal format="hidl" optional="true"> <name>android.hardware.usb</name> <version>1.0-3</version> diff --git a/current.txt b/current.txt index 8c631d9e70..09df92d076 100644 --- a/current.txt +++ b/current.txt @@ -899,4 +899,7 @@ c8a57364f6ad20842be14f4db284df5304f7521ca8eac6bcc1fa6c5b466fb8a6 android.hardwar 2123482b69f3b531c88023aa2a007110e130efbf4ed68ac9ce0bc55d5e82bc8b android.hardware.wifi.supplicant@1.4::ISupplicantStaNetworkCallback 0821f516e4d428bc15251969f7e19411c94d8f2ccbd99e1fc8168d8e49e38b0f android.hardware.wifi.supplicant@1.4::types +# ABI preserving changes to HALs during Android T +62ace52d9c3ff1f60f94118557a2aaf0b953513e59dcd34d5f94ae28d4c7e780 android.hardware.fastboot@1.0::IFastboot + # There should be no more HIDL HALs - please use AIDL instead. diff --git a/drm/1.0/default/android.hardware.drm@1.0-service-lazy.rc b/drm/1.0/default/android.hardware.drm@1.0-service-lazy.rc index 4b32f7f1f3..e5ae5cddea 100644 --- a/drm/1.0/default/android.hardware.drm@1.0-service-lazy.rc +++ b/drm/1.0/default/android.hardware.drm@1.0-service-lazy.rc @@ -7,4 +7,4 @@ service vendor.drm-hal-1-0 /vendor/bin/hw/android.hardware.drm@1.0-service-lazy user media group mediadrm drmrpc ioprio rt 4 - writepid /dev/cpuset/foreground/tasks + task_profiles ProcessCapacityHigh diff --git a/drm/1.0/default/android.hardware.drm@1.0-service.rc b/drm/1.0/default/android.hardware.drm@1.0-service.rc index 790ededbe7..2aba187058 100644 --- a/drm/1.0/default/android.hardware.drm@1.0-service.rc +++ b/drm/1.0/default/android.hardware.drm@1.0-service.rc @@ -5,4 +5,4 @@ service vendor.drm-hal-1-0 /vendor/bin/hw/android.hardware.drm@1.0-service user media group mediadrm drmrpc ioprio rt 4 - writepid /dev/cpuset/foreground/tasks + task_profiles ProcessCapacityHigh diff --git a/fastboot/1.0/IFastboot.hal b/fastboot/1.0/IFastboot.hal index dce3ad796e..b39061cf58 100644 --- a/fastboot/1.0/IFastboot.hal +++ b/fastboot/1.0/IFastboot.hal @@ -33,7 +33,7 @@ interface IFastboot { /** * Executes a fastboot OEM command. * - * @param oemCmdArgs The oem command that is passed to the fastboot HAL. + * @param oemCmd The oem command that is passed to the fastboot HAL. * @return result Returns the status SUCCESS if the operation is successful, * INVALID_ARGUMENT for bad arguments, * FAILURE_UNKNOWN for an invalid/unsupported command. diff --git a/gatekeeper/1.0/vts/functional/VtsHalGatekeeperV1_0TargetTest.cpp b/gatekeeper/1.0/vts/functional/VtsHalGatekeeperV1_0TargetTest.cpp index 7d32ced588..618624e1d4 100644 --- a/gatekeeper/1.0/vts/functional/VtsHalGatekeeperV1_0TargetTest.cpp +++ b/gatekeeper/1.0/vts/functional/VtsHalGatekeeperV1_0TargetTest.cpp @@ -236,6 +236,10 @@ TEST_P(GatekeeperHidlTest, VerifySuccess) { generatePassword(password, 0); enrollNewPassword(password, enrollRsp, true); verifyPassword(password, enrollRsp.data, 1, verifyRsp, true); + + ALOGI("Testing unenrolled password doesn't verify"); + generatePassword(password, 1); + verifyPassword(password, enrollRsp.data, 1, verifyRsp, false); ALOGI("Testing Enroll+Verify done"); } diff --git a/gnss/1.1/default/Android.bp b/gnss/1.1/default/Android.bp index ab87990ed1..3c9c29a7d6 100644 --- a/gnss/1.1/default/Android.bp +++ b/gnss/1.1/default/Android.bp @@ -27,7 +27,7 @@ cc_binary { "android.hardware.gnss@2.0", "android.hardware.gnss@1.1", "android.hardware.gnss@1.0", - "android.hardware.gnss-V1-ndk_platform", + "android.hardware.gnss-V1-ndk", ], static_libs: [ "android.hardware.gnss@common-default-lib", diff --git a/gnss/2.0/default/Android.bp b/gnss/2.0/default/Android.bp index 8ae9f956c4..695246ad53 100644 --- a/gnss/2.0/default/Android.bp +++ b/gnss/2.0/default/Android.bp @@ -50,7 +50,7 @@ cc_binary { "android.hardware.gnss@2.0", "android.hardware.gnss@1.1", "android.hardware.gnss@1.0", - "android.hardware.gnss-V1-ndk_platform", + "android.hardware.gnss-V1-ndk", ], static_libs: [ "android.hardware.gnss@common-default-lib", diff --git a/gnss/2.0/vts/functional/OWNERS b/gnss/2.0/vts/functional/OWNERS new file mode 100644 index 0000000000..b831eb45ff --- /dev/null +++ b/gnss/2.0/vts/functional/OWNERS @@ -0,0 +1,2 @@ +# Bug component: 393449 +yuhany@google.com diff --git a/gnss/2.1/default/Android.bp b/gnss/2.1/default/Android.bp index 609f59e60f..c46c73545c 100644 --- a/gnss/2.1/default/Android.bp +++ b/gnss/2.1/default/Android.bp @@ -44,7 +44,7 @@ cc_binary { "android.hardware.gnss@1.0", "android.hardware.gnss@1.1", "android.hardware.gnss@2.0", - "android.hardware.gnss-V1-ndk_platform", + "android.hardware.gnss-V1-ndk", ], static_libs: [ "android.hardware.gnss@common-default-lib", diff --git a/gnss/aidl/default/Android.bp b/gnss/aidl/default/Android.bp index 4cc2b6e251..c028dd764e 100644 --- a/gnss/aidl/default/Android.bp +++ b/gnss/aidl/default/Android.bp @@ -52,7 +52,7 @@ cc_binary { "android.hardware.gnss.measurement_corrections@1.1", "android.hardware.gnss.measurement_corrections@1.0", "android.hardware.gnss.visibility_control@1.0", - "android.hardware.gnss-V1-ndk_platform", + "android.hardware.gnss-V1-ndk", ], srcs: [ "Gnss.cpp", diff --git a/gnss/aidl/default/GnssMeasurementInterface.cpp b/gnss/aidl/default/GnssMeasurementInterface.cpp index fcc1f986cc..0e489c59e4 100644 --- a/gnss/aidl/default/GnssMeasurementInterface.cpp +++ b/gnss/aidl/default/GnssMeasurementInterface.cpp @@ -19,11 +19,13 @@ #include "GnssMeasurementInterface.h" #include <aidl/android/hardware/gnss/BnGnss.h> #include <log/log.h> +#include "GnssReplayUtils.h" #include "Utils.h" namespace aidl::android::hardware::gnss { using Utils = ::android::hardware::gnss::common::Utils; +using ReplayUtils = ::android::hardware::gnss::common::ReplayUtils; std::shared_ptr<IGnssMeasurementCallback> GnssMeasurementInterface::sCallback = nullptr; @@ -63,9 +65,22 @@ void GnssMeasurementInterface::start(const bool enableCorrVecOutputs) { mIsActive = true; mThread = std::thread([this, enableCorrVecOutputs]() { while (mIsActive == true) { - auto measurement = Utils::getMockMeasurement(enableCorrVecOutputs); - this->reportMeasurement(measurement); - + std::string rawMeasurementStr = ""; + if (ReplayUtils::hasGnssDeviceFile() && + ReplayUtils::isGnssRawMeasurement( + rawMeasurementStr = ReplayUtils::getDataFromDeviceFile( + std::string( + ::android::hardware::gnss::common::CMD_GET_RAWMEASUREMENT), + mMinIntervalMillis))) { + // TODO: implement rawMeasurementStr parser and report measurement. + ALOGD("rawMeasurementStr(size: %zu) from device file: %s", rawMeasurementStr.size(), + rawMeasurementStr.c_str()); + auto measurement = Utils::getMockMeasurement(enableCorrVecOutputs); + this->reportMeasurement(measurement); + } else { + auto measurement = Utils::getMockMeasurement(enableCorrVecOutputs); + this->reportMeasurement(measurement); + } std::this_thread::sleep_for(std::chrono::milliseconds(mMinIntervalMillis)); } }); diff --git a/gnss/common/utils/default/Android.bp b/gnss/common/utils/default/Android.bp index 43db8739d1..ac94cc1bc0 100644 --- a/gnss/common/utils/default/Android.bp +++ b/gnss/common/utils/default/Android.bp @@ -41,6 +41,7 @@ cc_library_static { "MockLocation.cpp", "Utils.cpp", "NmeaFixInfo.cpp", + "GnssReplayUtils.cpp", ], export_include_dirs: ["include"], shared_libs: [ @@ -52,6 +53,6 @@ cc_library_static { "android.hardware.gnss@2.1", "android.hardware.gnss.measurement_corrections@1.1", "android.hardware.gnss.measurement_corrections@1.0", - "android.hardware.gnss-V1-ndk_platform", + "android.hardware.gnss-V1-ndk", ], } diff --git a/gnss/common/utils/default/GnssReplayUtils.cpp b/gnss/common/utils/default/GnssReplayUtils.cpp new file mode 100644 index 0000000000..fc4c477ae8 --- /dev/null +++ b/gnss/common/utils/default/GnssReplayUtils.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2021 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 "GnssReplayUtils.h" + +namespace android { +namespace hardware { +namespace gnss { +namespace common { + +std::string ReplayUtils::getGnssPath() { + char devname_value[PROPERTY_VALUE_MAX] = ""; + if (property_get("debug.location.gnss.devname", devname_value, NULL) > 0) { + return devname_value; + } + return GNSS_PATH; +} + +bool ReplayUtils::hasGnssDeviceFile() { + struct stat sb; + return stat(getGnssPath().c_str(), &sb) != -1; +} + +bool ReplayUtils::isGnssRawMeasurement(const std::string& inputStr) { + // TODO: add more logic check to by pass invalid data. + return !inputStr.empty() && (inputStr.find("Raw") != std::string::npos); +} + +bool ReplayUtils::isNMEA(const std::string& inputStr) { + return !inputStr.empty() && + (inputStr.rfind("$GPRMC,", 0) == 0 || inputStr.rfind("$GPRMA,", 0) == 0); +} + +std::string ReplayUtils::getDataFromDeviceFile(const std::string& command, int mMinIntervalMs) { + char inputBuffer[INPUT_BUFFER_SIZE]; + int mGnssFd = open(getGnssPath().c_str(), O_RDWR | O_NONBLOCK); + + if (mGnssFd == -1) { + return ""; + } + + int bytes_write = write(mGnssFd, command.c_str(), command.size()); + if (bytes_write <= 0) { + return ""; + } + + struct epoll_event ev, events[1]; + ev.data.fd = mGnssFd; + ev.events = EPOLLIN; + int epoll_fd = epoll_create1(0); + epoll_ctl(epoll_fd, EPOLL_CTL_ADD, mGnssFd, &ev); + int bytes_read = -1; + std::string inputStr = ""; + int epoll_ret = epoll_wait(epoll_fd, events, 1, mMinIntervalMs); + + if (epoll_ret == -1) { + return ""; + } + while (true) { + memset(inputBuffer, 0, INPUT_BUFFER_SIZE); + bytes_read = read(mGnssFd, &inputBuffer, INPUT_BUFFER_SIZE); + if (bytes_read <= 0) { + break; + } + inputStr += std::string(inputBuffer, bytes_read); + } + + return inputStr; +} + +} // namespace common +} // namespace gnss +} // namespace hardware +} // namespace android diff --git a/gnss/common/utils/default/Utils.cpp b/gnss/common/utils/default/Utils.cpp index 23e39b26ec..dfcf9a931e 100644 --- a/gnss/common/utils/default/Utils.cpp +++ b/gnss/common/utils/default/Utils.cpp @@ -196,13 +196,13 @@ GnssData Utils::getMockMeasurement(const bool enableCorrVecOutputs) { GnssClock clock = {.gnssClockFlags = GnssClock::HAS_FULL_BIAS | GnssClock::HAS_BIAS | GnssClock::HAS_BIAS_UNCERTAINTY | GnssClock::HAS_DRIFT | GnssClock::HAS_DRIFT_UNCERTAINTY, - .timeNs = 35854545000000, - .fullBiasNs = -234621900521857520, - .biasNs = 0.2352389998626708984, - .biasUncertaintyNs = 274.989972114563, - .driftNsps = -124.3742360, - .driftUncertaintyNsps = 239.6234285828, - .hwClockDiscontinuityCount = 999}; + .timeNs = 2713545000000, + .fullBiasNs = -1226701900521857520, + .biasNs = 0.59689998626708984, + .biasUncertaintyNs = 47514.989972114563, + .driftNsps = -51.757811607455452, + .driftUncertaintyNsps = 310.64968328491528, + .hwClockDiscontinuityCount = 1}; ElapsedRealtime timestamp = { .flags = ElapsedRealtime::HAS_TIMESTAMP_NS | ElapsedRealtime::HAS_TIME_UNCERTAINTY_NS, diff --git a/gnss/common/utils/default/include/Constants.h b/gnss/common/utils/default/include/Constants.h index 22afee1ad1..f205ba603c 100644 --- a/gnss/common/utils/default/include/Constants.h +++ b/gnss/common/utils/default/include/Constants.h @@ -34,6 +34,18 @@ const float kGpsL5FreqHz = 1176.45 * 1e6; const float kGloG1FreqHz = 1602.0 * 1e6; const float kIrnssL5FreqHz = 1176.45 * 1e6; +// Location replay constants +constexpr char GNSS_PATH[] = "/dev/gnss0"; +constexpr int INPUT_BUFFER_SIZE = 256; +constexpr char CMD_GET_LOCATION[] = "CMD_GET_LOCATION"; +constexpr char CMD_GET_RAWMEASUREMENT[] = "CMD_GET_RAWMEASUREMENT"; +constexpr char LINE_SEPARATOR = '\n'; +constexpr char COMMA_SEPARATOR = ','; +constexpr char GPGA_RECORD_TAG[] = "$GPGGA"; +constexpr char GPRMC_RECORD_TAG[] = "$GPRMC"; +constexpr double TIMESTAMP_EPSILON = 0.001; +constexpr int MIN_COL_NUM = 13; + } // namespace common } // namespace gnss } // namespace hardware diff --git a/gnss/common/utils/default/include/GnssReplayUtils.h b/gnss/common/utils/default/include/GnssReplayUtils.h new file mode 100644 index 0000000000..32c0e58c0c --- /dev/null +++ b/gnss/common/utils/default/include/GnssReplayUtils.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2021 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. + */ + +#ifndef android_hardware_gnss_common_GnssReplayUtils_H_ +#define android_hardware_gnss_common_GnssReplayUtils_H_ + +#include <cutils/properties.h> +#include <errno.h> +#include <fcntl.h> +#include <log/log.h> +#include <sys/epoll.h> +#include <sys/stat.h> +#include <chrono> +#include <string> +#include <thread> + +#include "Constants.h" + +namespace android { +namespace hardware { +namespace gnss { +namespace common { + +struct ReplayUtils { + static std::string getGnssPath(); + + static std::string getDataFromDeviceFile(const std::string& command, int mMinIntervalMs); + + static bool hasGnssDeviceFile(); + + static bool isGnssRawMeasurement(const std::string& inputStr); + + static bool isNMEA(const std::string& inputStr); +}; + +} // namespace common +} // namespace gnss +} // namespace hardware +} // namespace android + +#endif // android_hardware_gnss_common_GnssReplayUtils_H_ diff --git a/gnss/common/utils/default/include/NmeaFixInfo.h b/gnss/common/utils/default/include/NmeaFixInfo.h index c96eecea00..5c27045316 100644 --- a/gnss/common/utils/default/include/NmeaFixInfo.h +++ b/gnss/common/utils/default/include/NmeaFixInfo.h @@ -27,13 +27,6 @@ namespace hardware { namespace gnss { namespace common { -constexpr char GPGA_RECORD_TAG[] = "$GPGGA"; -constexpr char GPRMC_RECORD_TAG[] = "$GPRMC"; -constexpr char LINE_SEPARATOR = '\n'; -constexpr char COMMA_SEPARATOR = ','; -constexpr double TIMESTAMP_EPSILON = 0.001; -constexpr int MIN_COL_NUM = 13; - /** Helper class to parse and store the GNSS fix details information. */ class NmeaFixInfo { private: diff --git a/gnss/common/utils/default/include/v2_1/GnssTemplate.h b/gnss/common/utils/default/include/v2_1/GnssTemplate.h index 131af24fbe..4e07af9853 100644 --- a/gnss/common/utils/default/include/v2_1/GnssTemplate.h +++ b/gnss/common/utils/default/include/v2_1/GnssTemplate.h @@ -35,6 +35,7 @@ #include "GnssDebug.h" #include "GnssMeasurement.h" #include "GnssMeasurementCorrections.h" +#include "GnssReplayUtils.h" #include "MockLocation.h" #include "NmeaFixInfo.h" #include "Utils.h" @@ -159,52 +160,19 @@ GnssTemplate<T_IGnss>::~GnssTemplate() { template <class T_IGnss> std::unique_ptr<V2_0::GnssLocation> GnssTemplate<T_IGnss>::getLocationFromHW() { - char inputBuffer[INPUT_BUFFER_SIZE]; if (!mHardwareModeChecked) { - // default using gnss0 - const char * gnss_dev_path = GNSS_PATH; - char devname_value[PROPERTY_VALUE_MAX] = ""; - if (property_get("debug.location.gnss.devname", devname_value, NULL) > 0) { - gnss_dev_path = devname_value; - ALOGD("using %s instead of the default %s", gnss_dev_path, GNSS_PATH); - } + // default using /dev/gnss0 + std::string gnss_dev_path = ReplayUtils::getGnssPath(); - mGnssFd = open(gnss_dev_path, O_RDWR | O_NONBLOCK); + mGnssFd = open(gnss_dev_path.c_str(), O_RDWR | O_NONBLOCK); if (mGnssFd == -1) { - ALOGW("Failed to open %s errno: %d", gnss_dev_path, errno); + ALOGW("Failed to open %s errno: %d", gnss_dev_path.c_str(), errno); } mHardwareModeChecked = true; } - if (mGnssFd == -1) { - return nullptr; - } - - int bytes_write = write(mGnssFd, CMD_GET_LOCATION, strlen(CMD_GET_LOCATION)); - if (bytes_write <= 0) { - return nullptr; - } - - struct epoll_event ev, events[1]; - ev.data.fd = mGnssFd; - ev.events = EPOLLIN; - int epoll_fd = epoll_create1(0); - epoll_ctl(epoll_fd, EPOLL_CTL_ADD, mGnssFd, &ev); - int bytes_read = -1; - std::string inputStr = ""; - int epoll_ret = epoll_wait(epoll_fd, events, 1, mMinIntervalMs); - - if (epoll_ret == -1) { - return nullptr; - } - while (true) { - memset(inputBuffer, 0, INPUT_BUFFER_SIZE); - bytes_read = read(mGnssFd, &inputBuffer, INPUT_BUFFER_SIZE); - if (bytes_read <= 0) { - break; - } - inputStr += std::string(inputBuffer, bytes_read); - } + std::string inputStr = ::android::hardware::gnss::common::ReplayUtils::getDataFromDeviceFile( + CMD_GET_LOCATION, mMinIntervalMs); return NmeaFixInfo::getLocationFromInputStr(inputStr); } diff --git a/graphics/composer/2.1/default/android.hardware.graphics.composer@2.1-service.rc b/graphics/composer/2.1/default/android.hardware.graphics.composer@2.1-service.rc index c8707f5128..6dbd0f935a 100644 --- a/graphics/composer/2.1/default/android.hardware.graphics.composer@2.1-service.rc +++ b/graphics/composer/2.1/default/android.hardware.graphics.composer@2.1-service.rc @@ -5,5 +5,5 @@ service vendor.hwcomposer-2-1 /vendor/bin/hw/android.hardware.graphics.composer@ group graphics drmrpc capabilities SYS_NICE onrestart restart surfaceflinger - writepid /dev/cpuset/system-background/tasks + task_profiles ServiceCapacityLow socket pps stream 0660 system system diff --git a/graphics/composer/2.2/default/android.hardware.graphics.composer@2.2-service.rc b/graphics/composer/2.2/default/android.hardware.graphics.composer@2.2-service.rc index 289a91ca3d..ddb5e8f5b0 100644 --- a/graphics/composer/2.2/default/android.hardware.graphics.composer@2.2-service.rc +++ b/graphics/composer/2.2/default/android.hardware.graphics.composer@2.2-service.rc @@ -5,4 +5,4 @@ service vendor.hwcomposer-2-2 /vendor/bin/hw/android.hardware.graphics.composer@ capabilities SYS_NICE onrestart restart surfaceflinger socket pps stream 0660 system system - writepid /dev/cpuset/system-background/tasks + task_profiles ServiceCapacityLow diff --git a/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2ReadbackTest.cpp b/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2ReadbackTest.cpp index 7a053f1eb7..e2a0f4d22f 100644 --- a/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2ReadbackTest.cpp +++ b/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2ReadbackTest.cpp @@ -97,7 +97,6 @@ class GraphicsCompositionTestBase : public ::testing::Test { renderengine::DisplaySettings clientCompositionDisplay; clientCompositionDisplay.physicalDisplay = Rect(mDisplayWidth, mDisplayHeight); clientCompositionDisplay.clip = clientCompositionDisplay.physicalDisplay; - clientCompositionDisplay.clearRegion = Region(clientCompositionDisplay.physicalDisplay); mTestRenderEngine->initGraphicBuffer( static_cast<uint32_t>(mDisplayWidth), static_cast<uint32_t>(mDisplayHeight), 1, diff --git a/graphics/composer/2.3/default/android.hardware.graphics.composer@2.3-service.rc b/graphics/composer/2.3/default/android.hardware.graphics.composer@2.3-service.rc index 5cc19bb82c..9b941539c2 100644 --- a/graphics/composer/2.3/default/android.hardware.graphics.composer@2.3-service.rc +++ b/graphics/composer/2.3/default/android.hardware.graphics.composer@2.3-service.rc @@ -5,4 +5,4 @@ service vendor.hwcomposer-2-3 /vendor/bin/hw/android.hardware.graphics.composer@ capabilities SYS_NICE onrestart restart surfaceflinger socket pps stream 0660 system system - writepid /dev/cpuset/system-background/tasks + task_profiles ServiceCapacityLow diff --git a/graphics/composer/2.4/default/android.hardware.graphics.composer@2.4-service.rc b/graphics/composer/2.4/default/android.hardware.graphics.composer@2.4-service.rc index 802b99e7de..06003b02b3 100644 --- a/graphics/composer/2.4/default/android.hardware.graphics.composer@2.4-service.rc +++ b/graphics/composer/2.4/default/android.hardware.graphics.composer@2.4-service.rc @@ -4,5 +4,5 @@ service vendor.hwcomposer-2-4 /vendor/bin/hw/android.hardware.graphics.composer@ group graphics drmrpc capabilities SYS_NICE onrestart restart surfaceflinger - writepid /dev/cpuset/system-background/tasks + task_profiles ServiceCapacityLow socket pps stream 0660 system system diff --git a/graphics/mapper/3.0/vts/functional/VtsHalGraphicsMapperV3_0TargetTest.cpp b/graphics/mapper/3.0/vts/functional/VtsHalGraphicsMapperV3_0TargetTest.cpp index 4187dd1354..6c90af407a 100644 --- a/graphics/mapper/3.0/vts/functional/VtsHalGraphicsMapperV3_0TargetTest.cpp +++ b/graphics/mapper/3.0/vts/functional/VtsHalGraphicsMapperV3_0TargetTest.cpp @@ -327,6 +327,39 @@ TEST_P(GraphicsMapperHidlTest, LockUnlockBasic) { } /** + * Test IMapper::lockYCbCr. This locks a YCbCr_P010 buffer and verifies that it's initialized. + */ +TEST_P(GraphicsMapperHidlTest, LockYCbCrP010) { + auto info = mDummyDescriptorInfo; + info.format = PixelFormat::YCBCR_P010; + + const native_handle_t* bufferHandle; + uint32_t stride; + ASSERT_NO_FATAL_FAILURE(bufferHandle = mGralloc->allocate(info, true, &stride)); + + ASSERT_NE(nullptr, bufferHandle); + + const IMapper::Rect region{0, 0, static_cast<int32_t>(info.width), + static_cast<int32_t>(info.height)}; + int fence = -1; + YCbCrLayout y_cb_cr_layout{}; + // lock buffer + ASSERT_NO_FATAL_FAILURE(y_cb_cr_layout = + mGralloc->lockYCbCr(bufferHandle, info.usage, region, fence)); + + ASSERT_NE(nullptr, &y_cb_cr_layout); + EXPECT_EQ(stride, info.width); + EXPECT_EQ(y_cb_cr_layout.yStride, info.height * 2); + EXPECT_EQ(y_cb_cr_layout.cStride, y_cb_cr_layout.yStride); + EXPECT_EQ(4, y_cb_cr_layout.chromaStep); + + ASSERT_NO_FATAL_FAILURE(fence = mGralloc->unlock(bufferHandle)); + if (fence >= 0) { + close(fence); + } +} + +/** * Test IMapper::lockYCbCr. This locks a YV12 buffer, and makes sure we can * write to and read from it. */ diff --git a/graphics/mapper/4.0/vts/functional/Android.bp b/graphics/mapper/4.0/vts/functional/Android.bp index 11ebdc59a1..032bc0f741 100644 --- a/graphics/mapper/4.0/vts/functional/Android.bp +++ b/graphics/mapper/4.0/vts/functional/Android.bp @@ -28,7 +28,7 @@ cc_test { defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalGraphicsMapperV4_0TargetTest.cpp"], static_libs: [ - "android.hardware.graphics.common-V2-ndk_platform", + "android.hardware.graphics.common-V2-ndk", "android.hardware.graphics.mapper@4.0-vts", "libgralloctypes", "libsync", diff --git a/graphics/mapper/4.0/vts/functional/VtsHalGraphicsMapperV4_0TargetTest.cpp b/graphics/mapper/4.0/vts/functional/VtsHalGraphicsMapperV4_0TargetTest.cpp index f55a6b77ed..e18b1faa9f 100644 --- a/graphics/mapper/4.0/vts/functional/VtsHalGraphicsMapperV4_0TargetTest.cpp +++ b/graphics/mapper/4.0/vts/functional/VtsHalGraphicsMapperV4_0TargetTest.cpp @@ -59,6 +59,12 @@ using aidl::android::hardware::graphics::common::StandardMetadataType; using DecodeFunction = std::function<void(const IMapper::BufferDescriptorInfo& descriptorInfo, const hidl_vec<uint8_t>& vec)>; +struct YCbCr { + android_ycbcr yCbCr; + int64_t horizontalSubSampling; + int64_t verticalSubSampling; +}; + class GraphicsMapperHidlTest : public ::testing::TestWithParam<std::tuple<std::string, std::string>> { protected: @@ -215,8 +221,8 @@ class GraphicsMapperHidlTest } ASSERT_EQ(0, planeLayoutComponent.offsetInBits % 8); - uint8_t* tmpData = - data + planeLayout.offsetInBytes + (planeLayoutComponent.offsetInBits / 8); + uint8_t* tmpData = data + planeLayout.offsetInBytes + + bitsToBytes(planeLayoutComponent.offsetInBits); uint64_t sampleIncrementInBytes; auto type = static_cast<PlaneLayoutComponentType>(planeLayoutComponent.type.value); @@ -271,6 +277,96 @@ class GraphicsMapperHidlTest ASSERT_NE(nullptr, outYCbCr->cr); } + YCbCr getAndroidYCbCr_P010(const native_handle_t* bufferHandle, uint8_t* data) { + YCbCr yCbCr_P010; + hidl_vec<uint8_t> vec; + EXPECT_EQ(Error::NONE, + mGralloc->get(bufferHandle, gralloc4::MetadataType_PlaneLayouts, &vec)); + std::vector<PlaneLayout> planeLayouts; + EXPECT_EQ(NO_ERROR, gralloc4::decodePlaneLayouts(vec, &planeLayouts)); + EXPECT_EQ(2, planeLayouts.size()); + EXPECT_EQ(1, planeLayouts[0].components.size()); + EXPECT_EQ(2, planeLayouts[1].components.size()); + + yCbCr_P010.yCbCr.y = nullptr; + yCbCr_P010.yCbCr.cb = nullptr; + yCbCr_P010.yCbCr.cr = nullptr; + yCbCr_P010.yCbCr.ystride = 0; + yCbCr_P010.yCbCr.cstride = 0; + yCbCr_P010.yCbCr.chroma_step = 0; + int64_t cb_offset = 0; + int64_t cr_offset = 0; + + for (const auto& planeLayout : planeLayouts) { + for (const auto& planeLayoutComponent : planeLayout.components) { + if (!gralloc4::isStandardPlaneLayoutComponentType(planeLayoutComponent.type)) { + continue; + } + + uint8_t* tmpData = data + planeLayout.offsetInBytes + + bitsToBytes(planeLayoutComponent.offsetInBits); + uint64_t sampleIncrementInBytes = 0; + auto type = static_cast<PlaneLayoutComponentType>(planeLayoutComponent.type.value); + switch (type) { + case PlaneLayoutComponentType::Y: + // For specs refer: + // https://docs.microsoft.com/en-us/windows/win32/medfound/10-bit-and-16-bit-yuv-video-formats + EXPECT_EQ(6, planeLayoutComponent.offsetInBits); + EXPECT_EQ(nullptr, yCbCr_P010.yCbCr.y); + EXPECT_EQ(10, planeLayoutComponent.sizeInBits); + EXPECT_EQ(16, planeLayout.sampleIncrementInBits); + + yCbCr_P010.yCbCr.y = tmpData; + yCbCr_P010.yCbCr.ystride = planeLayout.strideInBytes; + break; + + case PlaneLayoutComponentType::CB: + case PlaneLayoutComponentType::CR: + sampleIncrementInBytes = bitsToBytes(planeLayout.sampleIncrementInBits); + EXPECT_EQ(4, sampleIncrementInBytes); + + if (yCbCr_P010.yCbCr.cstride == 0 && yCbCr_P010.yCbCr.chroma_step == 0) { + yCbCr_P010.yCbCr.cstride = planeLayout.strideInBytes; + yCbCr_P010.yCbCr.chroma_step = sampleIncrementInBytes; + } else { + EXPECT_EQ(yCbCr_P010.yCbCr.cstride, planeLayout.strideInBytes); + EXPECT_EQ(yCbCr_P010.yCbCr.chroma_step, sampleIncrementInBytes); + } + + if (yCbCr_P010.horizontalSubSampling == 0 && + yCbCr_P010.verticalSubSampling == 0) { + yCbCr_P010.horizontalSubSampling = planeLayout.horizontalSubsampling; + yCbCr_P010.verticalSubSampling = planeLayout.verticalSubsampling; + } else { + EXPECT_EQ(yCbCr_P010.horizontalSubSampling, + planeLayout.horizontalSubsampling); + EXPECT_EQ(yCbCr_P010.verticalSubSampling, + planeLayout.verticalSubsampling); + } + + if (type == PlaneLayoutComponentType::CB) { + EXPECT_EQ(nullptr, yCbCr_P010.yCbCr.cb); + yCbCr_P010.yCbCr.cb = tmpData; + cb_offset = planeLayoutComponent.offsetInBits; + } else { + EXPECT_EQ(nullptr, yCbCr_P010.yCbCr.cr); + yCbCr_P010.yCbCr.cr = tmpData; + cr_offset = planeLayoutComponent.offsetInBits; + } + break; + default: + break; + }; + } + } + + EXPECT_EQ(cb_offset + bytesToBits(2), cr_offset); + EXPECT_NE(nullptr, yCbCr_P010.yCbCr.y); + EXPECT_NE(nullptr, yCbCr_P010.yCbCr.cb); + EXPECT_NE(nullptr, yCbCr_P010.yCbCr.cr); + return yCbCr_P010; + } + void fillRGBA8888(uint8_t* data, uint32_t height, size_t strideInBytes, size_t widthInBytes, uint32_t seed = 0) { for (uint32_t y = 0; y < height; y++) { @@ -297,9 +393,9 @@ class GraphicsMapperHidlTest } } - void traverseYCbCr888Data(const android_ycbcr& yCbCr, int32_t width, int32_t height, - int64_t hSubsampling, int64_t vSubsampling, - std::function<void(uint8_t*, uint8_t)> traverseFuncion) { + void traverseYCbCrData(const android_ycbcr& yCbCr, int32_t width, int32_t height, + int64_t hSubsampling, int64_t vSubsampling, + std::function<void(uint8_t*, uint8_t)> traverseFuncion) { auto yData = static_cast<uint8_t*>(yCbCr.y); auto cbData = static_cast<uint8_t*>(yCbCr.cb); auto crData = static_cast<uint8_t*>(yCbCr.cr); @@ -327,21 +423,25 @@ class GraphicsMapperHidlTest } } - void fillYCbCr888Data(const android_ycbcr& yCbCr, int32_t width, int32_t height, - int64_t hSubsampling, int64_t vSubsampling) { - traverseYCbCr888Data(yCbCr, width, height, hSubsampling, vSubsampling, - [](auto address, auto fillingData) { *address = fillingData; }); + void fillYCbCrData(const android_ycbcr& yCbCr, int32_t width, int32_t height, + int64_t hSubsampling, int64_t vSubsampling) { + traverseYCbCrData(yCbCr, width, height, hSubsampling, vSubsampling, + [](auto address, auto fillingData) { *address = fillingData; }); } - void verifyYCbCr888Data(const android_ycbcr& yCbCr, int32_t width, int32_t height, - int64_t hSubsampling, int64_t vSubsampling) { - traverseYCbCr888Data( + void verifyYCbCrData(const android_ycbcr& yCbCr, int32_t width, int32_t height, + int64_t hSubsampling, int64_t vSubsampling) { + traverseYCbCrData( yCbCr, width, height, hSubsampling, vSubsampling, [](auto address, auto expectedData) { EXPECT_EQ(*address, expectedData); }); } bool isEqual(float a, float b) { return abs(a - b) < 0.0001; } + uint64_t bitsToBytes(int64_t bits) { return bits / 8; } + + uint64_t bytesToBits(int64_t bytes) { return bytes * 8; } + std::unique_ptr<Gralloc> mGralloc; IMapper::BufferDescriptorInfo mDummyDescriptorInfo{}; static const std::set<StandardMetadataType> sRequiredMetadataTypes; @@ -645,7 +745,7 @@ TEST_P(GraphicsMapperHidlTest, Lock_YCRCB_420_SP) { ASSERT_EQ(crData + 1, cbData); ASSERT_EQ(2, yCbCr.chroma_step); - fillYCbCr888Data(yCbCr, info.width, info.height, hSubsampling, vSubsampling); + fillYCbCrData(yCbCr, info.width, info.height, hSubsampling, vSubsampling); ASSERT_NO_FATAL_FAILURE(fence.reset(mGralloc->unlock(bufferHandle))); @@ -656,7 +756,7 @@ TEST_P(GraphicsMapperHidlTest, Lock_YCRCB_420_SP) { ASSERT_NO_FATAL_FAILURE( getAndroidYCbCr(bufferHandle, data, &yCbCr, &hSubsampling, &vSubsampling)); - verifyYCbCr888Data(yCbCr, info.width, info.height, hSubsampling, vSubsampling); + verifyYCbCrData(yCbCr, info.width, info.height, hSubsampling, vSubsampling); ASSERT_NO_FATAL_FAILURE(fence.reset(mGralloc->unlock(bufferHandle))); } @@ -744,7 +844,7 @@ TEST_P(GraphicsMapperHidlTest, Lock_YV12) { ASSERT_EQ(crData + yCbCr.cstride * info.height / vSubsampling, cbData); ASSERT_EQ(1, yCbCr.chroma_step); - fillYCbCr888Data(yCbCr, info.width, info.height, hSubsampling, vSubsampling); + fillYCbCrData(yCbCr, info.width, info.height, hSubsampling, vSubsampling); ASSERT_NO_FATAL_FAILURE(fence.reset(mGralloc->unlock(bufferHandle))); @@ -755,7 +855,7 @@ TEST_P(GraphicsMapperHidlTest, Lock_YV12) { ASSERT_NO_FATAL_FAILURE( getAndroidYCbCr(bufferHandle, data, &yCbCr, &hSubsampling, &vSubsampling)); - verifyYCbCr888Data(yCbCr, info.width, info.height, hSubsampling, vSubsampling); + verifyYCbCrData(yCbCr, info.width, info.height, hSubsampling, vSubsampling); ASSERT_NO_FATAL_FAILURE(fence.reset(mGralloc->unlock(bufferHandle))); } @@ -788,7 +888,7 @@ TEST_P(GraphicsMapperHidlTest, Lock_YCBCR_420_888) { ASSERT_EQ(kCbCrSubSampleFactor, hSubsampling); ASSERT_EQ(kCbCrSubSampleFactor, vSubsampling); - fillYCbCr888Data(yCbCr, info.width, info.height, hSubsampling, vSubsampling); + fillYCbCrData(yCbCr, info.width, info.height, hSubsampling, vSubsampling); ASSERT_NO_FATAL_FAILURE(fence.reset(mGralloc->unlock(bufferHandle))); @@ -799,7 +899,7 @@ TEST_P(GraphicsMapperHidlTest, Lock_YCBCR_420_888) { ASSERT_NO_FATAL_FAILURE( getAndroidYCbCr(bufferHandle, data, &yCbCr, &hSubsampling, &vSubsampling)); - verifyYCbCr888Data(yCbCr, info.width, info.height, hSubsampling, vSubsampling); + verifyYCbCrData(yCbCr, info.width, info.height, hSubsampling, vSubsampling); ASSERT_NO_FATAL_FAILURE(fence.reset(mGralloc->unlock(bufferHandle))); } @@ -888,6 +988,42 @@ TEST_P(GraphicsMapperHidlTest, Lock_RAW12) { ASSERT_NO_FATAL_FAILURE(fence.reset(mGralloc->unlock(bufferHandle))); } +TEST_P(GraphicsMapperHidlTest, Lock_YCBCR_P010) { + auto info = mDummyDescriptorInfo; + info.format = PixelFormat::YCBCR_P010; + + const native_handle_t* bufferHandle; + uint32_t stride; + ASSERT_NO_FATAL_FAILURE( + bufferHandle = mGralloc->allocate(info, true, Tolerance::kToleranceStrict, &stride)); + + const IMapper::Rect region{0, 0, static_cast<int32_t>(info.width), + static_cast<int32_t>(info.height)}; + unique_fd fence; + uint8_t* data; + + ASSERT_NO_FATAL_FAILURE(data = static_cast<uint8_t*>(mGralloc->lock(bufferHandle, info.usage, + region, fence.release()))); + + YCbCr yCbCr; + ASSERT_NO_FATAL_FAILURE(yCbCr = getAndroidYCbCr_P010(bufferHandle, data)); + + constexpr uint32_t kCbCrSubSampleFactor = 2; + ASSERT_EQ(kCbCrSubSampleFactor, yCbCr.horizontalSubSampling); + ASSERT_EQ(kCbCrSubSampleFactor, yCbCr.verticalSubSampling); + + ASSERT_EQ(0, info.height % 2); + + // fill the data + fillYCbCrData(yCbCr.yCbCr, info.width, info.height, yCbCr.horizontalSubSampling, + yCbCr.verticalSubSampling); + // verify the YCbCr data + verifyYCbCrData(yCbCr.yCbCr, info.width, info.height, yCbCr.horizontalSubSampling, + yCbCr.verticalSubSampling); + + ASSERT_NO_FATAL_FAILURE(fence.reset(mGralloc->unlock(bufferHandle))); +} + /** * Test IMapper::unlock with bad access region */ diff --git a/health/2.0/vts/OWNERS b/health/2.0/vts/OWNERS index 4024ec0296..9f96f5122f 100644 --- a/health/2.0/vts/OWNERS +++ b/health/2.0/vts/OWNERS @@ -1,5 +1,3 @@ +# Bug component: 30545 elsk@google.com sspatil@google.com - -# VTS team -yim@google.com diff --git a/health/storage/1.0/vts/functional/OWNERS b/health/storage/1.0/vts/functional/OWNERS new file mode 100644 index 0000000000..8f66979b1a --- /dev/null +++ b/health/storage/1.0/vts/functional/OWNERS @@ -0,0 +1,3 @@ +# Bug component: 30545 +elsk@google.com +jaegeuk@google.com diff --git a/health/storage/aidl/default/Android.bp b/health/storage/aidl/default/Android.bp index 819b885318..7cfabb06f4 100644 --- a/health/storage/aidl/default/Android.bp +++ b/health/storage/aidl/default/Android.bp @@ -29,7 +29,7 @@ cc_defaults { shared_libs: [ "libbase", "libbinder_ndk", - "android.hardware.health.storage-V1-ndk_platform", + "android.hardware.health.storage-V1-ndk", ], static_libs: [ "libfstab", diff --git a/health/storage/aidl/vts/functional/Android.bp b/health/storage/aidl/vts/functional/Android.bp index be3eac7d98..fe15170f0a 100644 --- a/health/storage/aidl/vts/functional/Android.bp +++ b/health/storage/aidl/vts/functional/Android.bp @@ -34,7 +34,7 @@ cc_test { "libbinder_ndk", ], static_libs: [ - "android.hardware.health.storage-V1-ndk_platform", + "android.hardware.health.storage-V1-ndk", ], header_libs: [ "libhealth_storage_test_common_headers", diff --git a/health/utils/libhealth2impl/BinderHealth.cpp b/health/utils/libhealth2impl/BinderHealth.cpp index 625d0e0c40..8ec8962175 100644 --- a/health/utils/libhealth2impl/BinderHealth.cpp +++ b/health/utils/libhealth2impl/BinderHealth.cpp @@ -35,10 +35,9 @@ namespace health { namespace V2_1 { namespace implementation { -bool IsDeadObjectLogged(const Return<void>& ret) { +bool IsDeadObject(const Return<void>& ret) { if (ret.isOk()) return false; if (ret.isDeadObject()) return true; - LOG(ERROR) << "Cannot call healthInfoChanged* on callback: " << ret.description(); return false; } @@ -77,7 +76,7 @@ Return<Result> BinderHealth::registerCallback(const sp<V2_0::IHealthInfoCallback return; } auto ret = wrapped->Notify(health_info); - if (IsDeadObjectLogged(ret)) { + if (IsDeadObject(ret)) { // Remove callback reference. std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_); auto it = std::find_if(callbacks_.begin(), callbacks_.end(), @@ -133,7 +132,7 @@ void BinderHealth::OnHealthInfoChanged(const HealthInfo& health_info) { std::unique_lock<decltype(callbacks_lock_)> lock(callbacks_lock_); for (auto it = callbacks_.begin(); it != callbacks_.end();) { auto ret = (*it)->Notify(health_info); - if (IsDeadObjectLogged(ret)) { + if (IsDeadObject(ret)) { it = callbacks_.erase(it); } else { ++it; diff --git a/identity/aidl/default/Android.bp b/identity/aidl/default/Android.bp index 28c489309f..3de8d30148 100644 --- a/identity/aidl/default/Android.bp +++ b/identity/aidl/default/Android.bp @@ -39,8 +39,8 @@ cc_library_static { "libsoft_attestation_cert", "libpuresoftkeymasterdevice", "android.hardware.identity-support-lib", - "android.hardware.identity-V3-ndk_platform", - "android.hardware.keymaster-V3-ndk_platform", + "android.hardware.identity-V3-ndk", + "android.hardware.keymaster-V3-ndk", ], } @@ -100,8 +100,8 @@ cc_binary { "libsoft_attestation_cert", "libpuresoftkeymasterdevice", "android.hardware.identity-support-lib", - "android.hardware.identity-V3-ndk_platform", - "android.hardware.keymaster-V3-ndk_platform", + "android.hardware.identity-V3-ndk", + "android.hardware.keymaster-V3-ndk", "android.hardware.identity-libeic-hal-common", "android.hardware.identity-libeic-library", ], @@ -127,7 +127,7 @@ cc_test { "-DEIC_DEBUG", ], local_include_dirs: [ - "common", + "common", ], shared_libs: [ "liblog", diff --git a/identity/aidl/vts/Android.bp b/identity/aidl/vts/Android.bp index 61d15d2d54..e5de91e22e 100644 --- a/identity/aidl/vts/Android.bp +++ b/identity/aidl/vts/Android.bp @@ -42,7 +42,7 @@ cc_test { "android.hardware.identity-support-lib", "android.hardware.identity-V3-cpp", "android.hardware.keymaster-V3-cpp", - "android.hardware.keymaster-V3-ndk_platform", + "android.hardware.keymaster-V3-ndk", "libkeymaster4support", "libkeymaster4_1support", ], diff --git a/light/aidl/default/Android.bp b/light/aidl/default/Android.bp index 459b8e2248..2ccf1407fd 100644 --- a/light/aidl/default/Android.bp +++ b/light/aidl/default/Android.bp @@ -16,7 +16,7 @@ cc_binary { shared_libs: [ "libbase", "libbinder_ndk", - "android.hardware.light-V1-ndk_platform", + "android.hardware.light-V1-ndk", ], srcs: [ "Lights.cpp", diff --git a/memtrack/aidl/default/Android.bp b/memtrack/aidl/default/Android.bp index 7a7feea5bf..6c77177fda 100644 --- a/memtrack/aidl/default/Android.bp +++ b/memtrack/aidl/default/Android.bp @@ -30,7 +30,7 @@ cc_binary { shared_libs: [ "libbase", "libbinder_ndk", - "android.hardware.memtrack-V1-ndk_platform", + "android.hardware.memtrack-V1-ndk", ], srcs: [ "main.cpp", diff --git a/memtrack/aidl/vts/Android.bp b/memtrack/aidl/vts/Android.bp index 8614b478a6..f54388a6c9 100644 --- a/memtrack/aidl/vts/Android.bp +++ b/memtrack/aidl/vts/Android.bp @@ -19,7 +19,7 @@ cc_test { "libvintf", ], static_libs: [ - "android.hardware.memtrack-V1-ndk_platform", + "android.hardware.memtrack-V1-ndk", ], test_suites: [ "vts", diff --git a/neuralnetworks/1.3/utils/src/Conversions.cpp b/neuralnetworks/1.3/utils/src/Conversions.cpp index e8a4f55afd..11225cf2cb 100644 --- a/neuralnetworks/1.3/utils/src/Conversions.cpp +++ b/neuralnetworks/1.3/utils/src/Conversions.cpp @@ -239,7 +239,7 @@ GeneralResult<Request::MemoryPool> unvalidatedConvert( using Discriminator = hal::V1_3::Request::MemoryPool::hidl_discriminator; switch (memoryPool.getDiscriminator()) { case Discriminator::hidlMemory: - return hal::utils::createSharedMemoryFromHidlMemory(memoryPool.hidlMemory()); + return unvalidatedConvert(memoryPool.hidlMemory()); case Discriminator::token: return static_cast<Request::MemoryDomainToken>(memoryPool.token()); } diff --git a/neuralnetworks/1.3/vts/functional/Android.bp b/neuralnetworks/1.3/vts/functional/Android.bp index f9752505a3..1382bdb785 100644 --- a/neuralnetworks/1.3/vts/functional/Android.bp +++ b/neuralnetworks/1.3/vts/functional/Android.bp @@ -66,7 +66,7 @@ cc_test { "VtsHalNeuralNetworksV1_0_utils", "VtsHalNeuralNetworksV1_2_utils", "VtsHalNeuralNetworksV1_3_utils", - "android.hardware.neuralnetworks-V1-ndk_platform", + "android.hardware.neuralnetworks-V1-ndk", "android.hardware.neuralnetworks@1.0", "android.hardware.neuralnetworks@1.1", "android.hardware.neuralnetworks@1.2", diff --git a/neuralnetworks/aidl/utils/Android.bp b/neuralnetworks/aidl/utils/Android.bp index 0ccc711ecf..57d047b620 100644 --- a/neuralnetworks/aidl/utils/Android.bp +++ b/neuralnetworks/aidl/utils/Android.bp @@ -31,14 +31,14 @@ cc_library_static { export_include_dirs: ["include"], cflags: ["-Wthread-safety"], static_libs: [ - "android.hardware.graphics.common-V2-ndk_platform", + "android.hardware.graphics.common-V2-ndk", "libaidlcommonsupport", "libarect", "neuralnetworks_types", "neuralnetworks_utils_hal_common", ], shared_libs: [ - "android.hardware.neuralnetworks-V1-ndk_platform", + "android.hardware.neuralnetworks-V1-ndk", "libbinder_ndk", "libhidlbase", "libnativewindow", @@ -52,9 +52,9 @@ cc_test { "test/*.cpp", ], static_libs: [ - "android.hardware.common-V2-ndk_platform", - "android.hardware.graphics.common-V2-ndk_platform", - "android.hardware.neuralnetworks-V1-ndk_platform", + "android.hardware.common-V2-ndk", + "android.hardware.graphics.common-V2-ndk", + "android.hardware.neuralnetworks-V1-ndk", "libaidlcommonsupport", "libgmock", "libneuralnetworks_common", diff --git a/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Conversions.h b/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Conversions.h index 5eab9ffaf6..78433a74e9 100644 --- a/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Conversions.h +++ b/neuralnetworks/aidl/utils/include/nnapi/hal/aidl/Conversions.h @@ -95,9 +95,7 @@ GeneralResult<ExecutionPreference> unvalidatedConvert( GeneralResult<Extension> unvalidatedConvert(const aidl_hal::Extension& extension); GeneralResult<Extension::OperandTypeInformation> unvalidatedConvert( const aidl_hal::ExtensionOperandTypeInformation& operandTypeInformation); -GeneralResult<SharedHandle> unvalidatedConvert( - const ::aidl::android::hardware::common::NativeHandle& handle); -GeneralResult<SyncFence> unvalidatedConvert(const ndk::ScopedFileDescriptor& syncFence); +GeneralResult<SharedHandle> unvalidatedConvert(const ndk::ScopedFileDescriptor& handle); GeneralResult<std::vector<Operation>> unvalidatedConvert( const std::vector<aidl_hal::Operation>& operations); @@ -113,7 +111,7 @@ GeneralResult<OperandType> convert(const aidl_hal::OperandType& operandType); GeneralResult<Priority> convert(const aidl_hal::Priority& priority); GeneralResult<Request> convert(const aidl_hal::Request& request); GeneralResult<Timing> convert(const aidl_hal::Timing& timing); -GeneralResult<SyncFence> convert(const ndk::ScopedFileDescriptor& syncFence); +GeneralResult<SharedHandle> convert(const ndk::ScopedFileDescriptor& handle); GeneralResult<std::vector<Extension>> convert(const std::vector<aidl_hal::Extension>& extension); GeneralResult<std::vector<SharedMemory>> convert(const std::vector<aidl_hal::Memory>& memories); @@ -160,9 +158,7 @@ nn::GeneralResult<int64_t> unvalidatedConvert(const nn::Duration& duration); nn::GeneralResult<int64_t> unvalidatedConvert(const nn::OptionalDuration& optionalDuration); nn::GeneralResult<int64_t> unvalidatedConvert(const nn::OptionalTimePoint& optionalTimePoint); nn::GeneralResult<ndk::ScopedFileDescriptor> unvalidatedConvert(const nn::SyncFence& syncFence); -nn::GeneralResult<common::NativeHandle> unvalidatedConvert(const nn::SharedHandle& sharedHandle); -nn::GeneralResult<ndk::ScopedFileDescriptor> unvalidatedConvertCache( - const nn::SharedHandle& handle); +nn::GeneralResult<ndk::ScopedFileDescriptor> unvalidatedConvert(const nn::SharedHandle& handle); nn::GeneralResult<std::vector<uint8_t>> convert(const nn::CacheToken& cacheToken); nn::GeneralResult<BufferDesc> convert(const nn::BufferDesc& bufferDesc); diff --git a/neuralnetworks/aidl/utils/src/Conversions.cpp b/neuralnetworks/aidl/utils/src/Conversions.cpp index 4b263ee49d..0517730849 100644 --- a/neuralnetworks/aidl/utils/src/Conversions.cpp +++ b/neuralnetworks/aidl/utils/src/Conversions.cpp @@ -108,17 +108,6 @@ GeneralResult<std::vector<UnvalidatedConvertOutput<Type>>> validatedConvert( return canonical; } -GeneralResult<Handle> unvalidatedConvertHelper(const NativeHandle& aidlNativeHandle) { - std::vector<base::unique_fd> fds; - fds.reserve(aidlNativeHandle.fds.size()); - for (const auto& fd : aidlNativeHandle.fds) { - auto duplicatedFd = NN_TRY(dupFd(fd.get())); - fds.emplace_back(duplicatedFd.release()); - } - - return Handle{.fds = std::move(fds), .ints = aidlNativeHandle.ints}; -} - struct NativeHandleDeleter { void operator()(native_handle_t* handle) const { if (handle) { @@ -498,18 +487,14 @@ GeneralResult<ExecutionPreference> unvalidatedConvert( return static_cast<ExecutionPreference>(executionPreference); } -GeneralResult<SharedHandle> unvalidatedConvert(const NativeHandle& aidlNativeHandle) { - return std::make_shared<const Handle>(NN_TRY(unvalidatedConvertHelper(aidlNativeHandle))); -} - GeneralResult<std::vector<Operation>> unvalidatedConvert( const std::vector<aidl_hal::Operation>& operations) { return unvalidatedConvertVec(operations); } -GeneralResult<SyncFence> unvalidatedConvert(const ndk::ScopedFileDescriptor& syncFence) { - auto duplicatedFd = NN_TRY(dupFd(syncFence.get())); - return SyncFence::create(std::move(duplicatedFd)); +GeneralResult<SharedHandle> unvalidatedConvert(const ndk::ScopedFileDescriptor& handle) { + auto duplicatedFd = NN_TRY(dupFd(handle.get())); + return std::make_shared<const Handle>(std::move(duplicatedFd)); } GeneralResult<Capabilities> convert(const aidl_hal::Capabilities& capabilities) { @@ -553,8 +538,8 @@ GeneralResult<Timing> convert(const aidl_hal::Timing& timing) { return validatedConvert(timing); } -GeneralResult<SyncFence> convert(const ndk::ScopedFileDescriptor& syncFence) { - return validatedConvert(syncFence); +GeneralResult<SharedHandle> convert(const ndk::ScopedFileDescriptor& handle) { + return validatedConvert(handle); } GeneralResult<std::vector<Extension>> convert(const std::vector<aidl_hal::Extension>& extension) { @@ -619,17 +604,6 @@ nn::GeneralResult<std::vector<UnvalidatedConvertOutput<Type>>> validatedConvert( return halObject; } -nn::GeneralResult<common::NativeHandle> unvalidatedConvert(const nn::Handle& handle) { - common::NativeHandle aidlNativeHandle; - aidlNativeHandle.fds.reserve(handle.fds.size()); - for (const auto& fd : handle.fds) { - auto duplicatedFd = NN_TRY(nn::dupFd(fd.get())); - aidlNativeHandle.fds.emplace_back(duplicatedFd.release()); - } - aidlNativeHandle.ints = handle.ints; - return aidlNativeHandle; -} - // Helper template for std::visit template <class... Ts> struct overloaded : Ts... { @@ -755,11 +729,6 @@ nn::GeneralResult<bool> unvalidatedConvert(const nn::MeasureTiming& measureTimin return measureTiming == nn::MeasureTiming::YES; } -nn::GeneralResult<common::NativeHandle> unvalidatedConvert(const nn::SharedHandle& sharedHandle) { - CHECK(sharedHandle != nullptr); - return unvalidatedConvert(*sharedHandle); -} - nn::GeneralResult<Memory> unvalidatedConvert(const nn::SharedMemory& memory) { if (memory == nullptr) { return (NN_ERROR() << "Unable to convert nullptr memory") @@ -997,16 +966,8 @@ nn::GeneralResult<ndk::ScopedFileDescriptor> unvalidatedConvert(const nn::SyncFe return ndk::ScopedFileDescriptor(duplicatedFd.release()); } -nn::GeneralResult<ndk::ScopedFileDescriptor> unvalidatedConvertCache( - const nn::SharedHandle& handle) { - if (handle->ints.size() != 0) { - NN_ERROR() << "Cache handle must not contain ints"; - } - if (handle->fds.size() != 1) { - NN_ERROR() << "Cache handle must contain exactly one fd but contains " - << handle->fds.size(); - } - auto duplicatedFd = NN_TRY(nn::dupFd(handle->fds.front().get())); +nn::GeneralResult<ndk::ScopedFileDescriptor> unvalidatedConvert(const nn::SharedHandle& handle) { + auto duplicatedFd = NN_TRY(nn::dupFd(handle->get())); return ndk::ScopedFileDescriptor(duplicatedFd.release()); } @@ -1069,16 +1030,7 @@ nn::GeneralResult<std::vector<OutputShape>> convert( nn::GeneralResult<std::vector<ndk::ScopedFileDescriptor>> convert( const std::vector<nn::SharedHandle>& cacheHandles) { - const auto version = NN_TRY(hal::utils::makeGeneralFailure(nn::validate(cacheHandles))); - if (version > kVersion) { - return NN_ERROR() << "Insufficient version: " << version << " vs required " << kVersion; - } - std::vector<ndk::ScopedFileDescriptor> cacheFds; - cacheFds.reserve(cacheHandles.size()); - for (const auto& cacheHandle : cacheHandles) { - cacheFds.push_back(NN_TRY(unvalidatedConvertCache(cacheHandle))); - } - return cacheFds; + return validatedConvert(cacheHandles); } nn::GeneralResult<std::vector<ndk::ScopedFileDescriptor>> convert( diff --git a/neuralnetworks/aidl/utils/src/PreparedModel.cpp b/neuralnetworks/aidl/utils/src/PreparedModel.cpp index 18e7636346..f861d74f77 100644 --- a/neuralnetworks/aidl/utils/src/PreparedModel.cpp +++ b/neuralnetworks/aidl/utils/src/PreparedModel.cpp @@ -160,7 +160,7 @@ PreparedModel::executeFencedInternal(const Request& request, auto resultSyncFence = nn::SyncFence::createAsSignaled(); if (result.syncFence.get() != -1) { - resultSyncFence = NN_TRY(nn::convert(result.syncFence)); + resultSyncFence = nn::SyncFence::create(NN_TRY(nn::convert(result.syncFence))).value(); } auto callback = result.callback; diff --git a/neuralnetworks/aidl/vts/functional/Android.bp b/neuralnetworks/aidl/vts/functional/Android.bp index d5b150a934..8fa9756edb 100644 --- a/neuralnetworks/aidl/vts/functional/Android.bp +++ b/neuralnetworks/aidl/vts/functional/Android.bp @@ -49,9 +49,9 @@ cc_test { "libvndksupport", ], static_libs: [ - "android.hardware.common-V2-ndk_platform", - "android.hardware.graphics.common-V2-ndk_platform", - "android.hardware.neuralnetworks-V1-ndk_platform", + "android.hardware.common-V2-ndk", + "android.hardware.graphics.common-V2-ndk", + "android.hardware.neuralnetworks-V1-ndk", "android.hidl.allocator@1.0", "android.hidl.memory@1.0", "libaidlcommonsupport", diff --git a/neuralnetworks/utils/README.md b/neuralnetworks/utils/README.md index 87b3f9f676..ffad6ee4da 100644 --- a/neuralnetworks/utils/README.md +++ b/neuralnetworks/utils/README.md @@ -44,7 +44,7 @@ const V1_0::ErrorStatus versionedAfter = V1_0::utils::convert(canonical).value() EXPECT_EQ(versionedBefore, versionedAfter); ``` -The `convert` functions operate only on types that used in a HIDL method call directly. The +The `convert` functions operate only on types that are used in a HIDL method call directly. The `unvalidatedConvert` functions operate on types that are either used in a HIDL method call directly (i.e., not as a nested class) or used in a subsequent version of the NN HAL. Prefer using `convert` over `unvalidatedConvert`. diff --git a/neuralnetworks/utils/common/Android.bp b/neuralnetworks/utils/common/Android.bp index 2ed1e407ef..a08e77010a 100644 --- a/neuralnetworks/utils/common/Android.bp +++ b/neuralnetworks/utils/common/Android.bp @@ -35,7 +35,7 @@ cc_library_static { "neuralnetworks_types", ], shared_libs: [ - "android.hardware.neuralnetworks-V1-ndk_platform", + "android.hardware.neuralnetworks-V1-ndk", "libhidlbase", "libnativewindow", "libbinder_ndk", diff --git a/neuralnetworks/utils/common/src/CommonUtils.cpp b/neuralnetworks/utils/common/src/CommonUtils.cpp index 8e55bf0253..906b0cf32b 100644 --- a/neuralnetworks/utils/common/src/CommonUtils.cpp +++ b/neuralnetworks/utils/common/src/CommonUtils.cpp @@ -89,23 +89,39 @@ void copyPointersToSharedMemory(nn::Model::Subgraph* subgraph, }); } -nn::GeneralResult<hidl_handle> createNativeHandleFrom(base::unique_fd fd, +nn::GeneralResult<hidl_handle> createNativeHandleFrom(std::vector<base::unique_fd> fds, const std::vector<int32_t>& ints) { constexpr size_t kIntMax = std::numeric_limits<int>::max(); + CHECK_LE(fds.size(), kIntMax); CHECK_LE(ints.size(), kIntMax); - native_handle_t* nativeHandle = native_handle_create(1, static_cast<int>(ints.size())); + native_handle_t* nativeHandle = + native_handle_create(static_cast<int>(fds.size()), static_cast<int>(ints.size())); if (nativeHandle == nullptr) { return NN_ERROR() << "Failed to create native_handle"; } - nativeHandle->data[0] = fd.release(); - std::copy(ints.begin(), ints.end(), nativeHandle->data + 1); + for (size_t i = 0; i < fds.size(); ++i) { + nativeHandle->data[i] = fds[i].release(); + } + std::copy(ints.begin(), ints.end(), nativeHandle->data + nativeHandle->numFds); hidl_handle handle; handle.setTo(nativeHandle, /*shouldOwn=*/true); return handle; } +nn::GeneralResult<hidl_handle> createNativeHandleFrom(base::unique_fd fd, + const std::vector<int32_t>& ints) { + std::vector<base::unique_fd> fds; + fds.push_back(std::move(fd)); + return createNativeHandleFrom(std::move(fds), ints); +} + +nn::GeneralResult<hidl_handle> createNativeHandleFrom(const nn::Memory::Unknown::Handle& handle) { + std::vector<base::unique_fd> fds = NN_TRY(nn::dupFds(handle.fds.begin(), handle.fds.end())); + return createNativeHandleFrom(std::move(fds), handle.ints); +} + nn::GeneralResult<hidl_memory> createHidlMemoryFrom(const nn::Memory::Ashmem& memory) { auto fd = NN_TRY(nn::dupFd(memory.fd)); auto handle = NN_TRY(createNativeHandleFrom(std::move(fd), {})); @@ -139,7 +155,22 @@ nn::GeneralResult<hidl_memory> createHidlMemoryFrom(const nn::Memory::HardwareBu } nn::GeneralResult<hidl_memory> createHidlMemoryFrom(const nn::Memory::Unknown& memory) { - return hidl_memory(memory.name, NN_TRY(hidlHandleFromSharedHandle(memory.handle)), memory.size); + return hidl_memory(memory.name, NN_TRY(createNativeHandleFrom(memory.handle)), memory.size); +} + +nn::GeneralResult<nn::Memory::Unknown::Handle> unknownHandleFromNativeHandle( + const native_handle_t* handle) { + if (handle == nullptr) { + return NN_ERROR() << "unknownHandleFromNativeHandle failed because handle is nullptr"; + } + + std::vector<base::unique_fd> fds = + NN_TRY(nn::dupFds(handle->data + 0, handle->data + handle->numFds)); + + std::vector<int> ints(handle->data + handle->numFds, + handle->data + handle->numFds + handle->numInts); + + return nn::Memory::Unknown::Handle{.fds = std::move(fds), .ints = std::move(ints)}; } } // anonymous namespace @@ -349,7 +380,7 @@ nn::GeneralResult<nn::SharedMemory> createSharedMemoryFromHidlMemory(const hidl_ if (memory.name() != "hardware_buffer_blob") { auto handle = nn::Memory::Unknown{ - .handle = NN_TRY(sharedHandleFromNativeHandle(memory.handle())), + .handle = NN_TRY(unknownHandleFromNativeHandle(memory.handle())), .size = static_cast<size_t>(memory.size()), .name = memory.name(), }; @@ -395,53 +426,19 @@ nn::GeneralResult<nn::SharedMemory> createSharedMemoryFromHidlMemory(const hidl_ } nn::GeneralResult<hidl_handle> hidlHandleFromSharedHandle(const nn::Handle& handle) { - std::vector<base::unique_fd> fds; - fds.reserve(handle.fds.size()); - for (const auto& fd : handle.fds) { - const int dupFd = dup(fd); - if (dupFd == -1) { - return NN_ERROR(nn::ErrorStatus::GENERAL_FAILURE) << "Failed to dup the fd"; - } - fds.emplace_back(dupFd); - } - - constexpr size_t kIntMax = std::numeric_limits<int>::max(); - CHECK_LE(handle.fds.size(), kIntMax); - CHECK_LE(handle.ints.size(), kIntMax); - native_handle_t* nativeHandle = native_handle_create(static_cast<int>(handle.fds.size()), - static_cast<int>(handle.ints.size())); - if (nativeHandle == nullptr) { - return NN_ERROR(nn::ErrorStatus::GENERAL_FAILURE) << "Failed to create native_handle"; - } - for (size_t i = 0; i < fds.size(); ++i) { - nativeHandle->data[i] = fds[i].release(); - } - std::copy(handle.ints.begin(), handle.ints.end(), &nativeHandle->data[nativeHandle->numFds]); - - hidl_handle hidlHandle; - hidlHandle.setTo(nativeHandle, /*shouldOwn=*/true); - return hidlHandle; + base::unique_fd fd = NN_TRY(nn::dupFd(handle.get())); + return createNativeHandleFrom(std::move(fd), {}); } nn::GeneralResult<nn::Handle> sharedHandleFromNativeHandle(const native_handle_t* handle) { if (handle == nullptr) { return NN_ERROR() << "sharedHandleFromNativeHandle failed because handle is nullptr"; } - - std::vector<base::unique_fd> fds; - fds.reserve(handle->numFds); - for (int i = 0; i < handle->numFds; ++i) { - const int dupFd = dup(handle->data[i]); - if (dupFd == -1) { - return NN_ERROR(nn::ErrorStatus::GENERAL_FAILURE) << "Failed to dup the fd"; - } - fds.emplace_back(dupFd); + if (handle->numFds != 1 || handle->numInts != 0) { + return NN_ERROR() << "sharedHandleFromNativeHandle failed because handle does not only " + "hold a single fd"; } - - std::vector<int> ints(&handle->data[handle->numFds], - &handle->data[handle->numFds + handle->numInts]); - - return nn::Handle{.fds = std::move(fds), .ints = std::move(ints)}; + return nn::dupFd(handle->data[0]); } nn::GeneralResult<hidl_vec<hidl_handle>> convertSyncFences( diff --git a/neuralnetworks/utils/service/Android.bp b/neuralnetworks/utils/service/Android.bp index 5f36dff2cd..653e51ad08 100644 --- a/neuralnetworks/utils/service/Android.bp +++ b/neuralnetworks/utils/service/Android.bp @@ -39,7 +39,7 @@ cc_library_static { "neuralnetworks_utils_hal_common", ], shared_libs: [ - "android.hardware.neuralnetworks-V1-ndk_platform", + "android.hardware.neuralnetworks-V1-ndk", "android.hardware.neuralnetworks@1.0", "android.hardware.neuralnetworks@1.1", "android.hardware.neuralnetworks@1.2", diff --git a/oemlock/aidl/default/Android.bp b/oemlock/aidl/default/Android.bp index 84136fe701..063199ae9e 100644 --- a/oemlock/aidl/default/Android.bp +++ b/oemlock/aidl/default/Android.bp @@ -34,7 +34,7 @@ cc_binary { "OemLock.cpp", ], shared_libs: [ - "android.hardware.oemlock-V1-ndk_platform", + "android.hardware.oemlock-V1-ndk", "libbase", "libbinder_ndk", ], diff --git a/oemlock/aidl/vts/Android.bp b/oemlock/aidl/vts/Android.bp index 840d20aa50..eb999a9f34 100644 --- a/oemlock/aidl/vts/Android.bp +++ b/oemlock/aidl/vts/Android.bp @@ -34,7 +34,7 @@ cc_test { "libbinder_ndk", "libbase", ], - static_libs: ["android.hardware.oemlock-V1-ndk_platform"], + static_libs: ["android.hardware.oemlock-V1-ndk"], test_suites: [ "general-tests", "vts", diff --git a/power/aidl/default/Android.bp b/power/aidl/default/Android.bp index c0ba9a079c..e10d329cd5 100644 --- a/power/aidl/default/Android.bp +++ b/power/aidl/default/Android.bp @@ -30,7 +30,7 @@ cc_binary { shared_libs: [ "libbase", "libbinder_ndk", - "android.hardware.power-V2-ndk_platform", + "android.hardware.power-V2-ndk", ], srcs: [ "main.cpp", diff --git a/power/aidl/vts/Android.bp b/power/aidl/vts/Android.bp index 3036b8202d..eccd872716 100644 --- a/power/aidl/vts/Android.bp +++ b/power/aidl/vts/Android.bp @@ -32,7 +32,7 @@ cc_test { "libbinder_ndk", ], static_libs: [ - "android.hardware.power-V2-ndk_platform", + "android.hardware.power-V2-ndk", ], test_suites: [ "vts", diff --git a/power/stats/aidl/default/Android.bp b/power/stats/aidl/default/Android.bp index 417dc97f0b..7c0caf3edc 100644 --- a/power/stats/aidl/default/Android.bp +++ b/power/stats/aidl/default/Android.bp @@ -30,7 +30,7 @@ cc_binary { shared_libs: [ "libbase", "libbinder_ndk", - "android.hardware.power.stats-V1-ndk_platform", + "android.hardware.power.stats-V1-ndk", ], srcs: [ "main.cpp", diff --git a/power/stats/aidl/vts/Android.bp b/power/stats/aidl/vts/Android.bp index b556548ece..b9a395b596 100644 --- a/power/stats/aidl/vts/Android.bp +++ b/power/stats/aidl/vts/Android.bp @@ -32,7 +32,7 @@ cc_test { "libbinder_ndk", ], static_libs: [ - "android.hardware.power.stats-V1-ndk_platform", + "android.hardware.power.stats-V1-ndk", ], test_suites: [ "general-tests", diff --git a/radio/1.6/vts/functional/radio_hidl_hal_api.cpp b/radio/1.6/vts/functional/radio_hidl_hal_api.cpp index a6eb2d8e9a..b146bb6895 100644 --- a/radio/1.6/vts/functional/radio_hidl_hal_api.cpp +++ b/radio/1.6/vts/functional/radio_hidl_hal_api.cpp @@ -602,11 +602,11 @@ TEST_P(RadioHidlTest_v1_6, setSimCardPower_1_6) { EXPECT_EQ(std::cv_status::no_timeout, wait()); EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo.type); EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); - ASSERT_TRUE( - CheckAnyOfErrors(radioRsp_v1_6->rspInfo.error, - {::android::hardware::radio::V1_6::RadioError::NONE, - ::android::hardware::radio::V1_6::RadioError::INVALID_ARGUMENTS, - ::android::hardware::radio::V1_6::RadioError::RADIO_NOT_AVAILABLE})); + ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_6->rspInfo.error, + {::android::hardware::radio::V1_6::RadioError::NONE, + ::android::hardware::radio::V1_6::RadioError::INVALID_ARGUMENTS, + ::android::hardware::radio::V1_6::RadioError::RADIO_NOT_AVAILABLE, + ::android::hardware::radio::V1_6::RadioError::SIM_ERR})); // setSimCardPower_1_6 does not return until the request is handled, and should not trigger // CardState::ABSENT when turning off power @@ -624,11 +624,11 @@ TEST_P(RadioHidlTest_v1_6, setSimCardPower_1_6) { EXPECT_EQ(std::cv_status::no_timeout, wait()); EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_6->rspInfo.type); EXPECT_EQ(serial, radioRsp_v1_6->rspInfo.serial); - ASSERT_TRUE( - CheckAnyOfErrors(radioRsp_v1_6->rspInfo.error, - {::android::hardware::radio::V1_6::RadioError::NONE, - ::android::hardware::radio::V1_6::RadioError::INVALID_ARGUMENTS, - ::android::hardware::radio::V1_6::RadioError::RADIO_NOT_AVAILABLE})); + ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_6->rspInfo.error, + {::android::hardware::radio::V1_6::RadioError::NONE, + ::android::hardware::radio::V1_6::RadioError::INVALID_ARGUMENTS, + ::android::hardware::radio::V1_6::RadioError::RADIO_NOT_AVAILABLE, + ::android::hardware::radio::V1_6::RadioError::SIM_ERR})); // setSimCardPower_1_6 does not return until the request is handled. Just verify that we still // have CardState::PRESENT after turning the power back on diff --git a/rebootescrow/aidl/default/Android.bp b/rebootescrow/aidl/default/Android.bp index 1f67a3e47a..4409314475 100644 --- a/rebootescrow/aidl/default/Android.bp +++ b/rebootescrow/aidl/default/Android.bp @@ -29,7 +29,7 @@ cc_library_static { shared_libs: [ "libbase", "libbinder_ndk", - "android.hardware.rebootescrow-V1-ndk_platform", + "android.hardware.rebootescrow-V1-ndk", ], export_include_dirs: ["include"], srcs: [ @@ -56,7 +56,7 @@ cc_binary { shared_libs: [ "libbase", "libbinder_ndk", - "android.hardware.rebootescrow-V1-ndk_platform", + "android.hardware.rebootescrow-V1-ndk", ], static_libs: [ "libhadamardutils", diff --git a/security/keymint/aidl/Android.bp b/security/keymint/aidl/Android.bp index 694ce6a22e..cd45a62bd9 100644 --- a/security/keymint/aidl/Android.bp +++ b/security/keymint/aidl/Android.bp @@ -30,6 +30,10 @@ aidl_interface { }, rust: { enabled: true, + apex_available: [ + "//apex_available:platform", + "com.android.compos", + ], }, }, versions: ["1"], diff --git a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl index 2241735928..18497236eb 100644 --- a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl +++ b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl @@ -233,8 +233,6 @@ interface IKeyMintDevice { * indistinguishable from random. Thus, if the entropy from any source is good, the output * must be good. * - * TODO(seleneh) specify what mixing functions and cprng we allow. - * * @param data Bytes to be mixed into the CRNG seed. The caller must not provide more than 2 * KiB of data per invocation. * diff --git a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintOperation.aidl b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintOperation.aidl index aa7b492188..ce83044d0e 100644 --- a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintOperation.aidl +++ b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintOperation.aidl @@ -155,8 +155,7 @@ interface IKeyMintOperation { * it must process all but the tag length and buffer the possible tag data for processing during * finish(). * - * @param input Data to be processed. Note that update() may or may not consume all of the data - * provided. See return value. + * @param input Data to be processed. update() must consume all input data. * * @param authToken Authentication token. Can be nullable if not provided. * diff --git a/security/keymint/aidl/android/hardware/security/keymint/KeyCharacteristics.aidl b/security/keymint/aidl/android/hardware/security/keymint/KeyCharacteristics.aidl index 25fdee3d75..f0df0487bc 100644 --- a/security/keymint/aidl/android/hardware/security/keymint/KeyCharacteristics.aidl +++ b/security/keymint/aidl/android/hardware/security/keymint/KeyCharacteristics.aidl @@ -32,6 +32,17 @@ import android.hardware.security.keymint.SecurityLevel; */ @VintfStability parcelable KeyCharacteristics { + /** + * The security level enforcing this collection of key properties. + */ SecurityLevel securityLevel = SecurityLevel.SOFTWARE; + + /** + * `authorizations` is a list of key properties that are enforced at this security level. + * A key can have different properties enforced by components of different security levels. + * For example, some properties are provided by the operating system, which has a + * different security level to the IKeyMintDevice. + * See the `keyCharacteristics` field in `KeyCreationResult` for more details. + */ KeyParameter[] authorizations; } diff --git a/security/keymint/aidl/android/hardware/security/keymint/KeyMintHardwareInfo.aidl b/security/keymint/aidl/android/hardware/security/keymint/KeyMintHardwareInfo.aidl index 8da75784de..b82dee626b 100644 --- a/security/keymint/aidl/android/hardware/security/keymint/KeyMintHardwareInfo.aidl +++ b/security/keymint/aidl/android/hardware/security/keymint/KeyMintHardwareInfo.aidl @@ -29,7 +29,6 @@ parcelable KeyMintHardwareInfo { * Implementation version of the keymint hardware. The version number is implementation * defined, and not necessarily globally meaningful. The version is used to distinguish * between different versions of a given implementation. - * TODO(seleneh) add the version related info to the code. */ int versionNumber; diff --git a/security/keymint/aidl/android/hardware/security/keymint/PaddingMode.aidl b/security/keymint/aidl/android/hardware/security/keymint/PaddingMode.aidl index fbb373b873..e71a9c92cb 100644 --- a/security/keymint/aidl/android/hardware/security/keymint/PaddingMode.aidl +++ b/security/keymint/aidl/android/hardware/security/keymint/PaddingMode.aidl @@ -17,8 +17,6 @@ package android.hardware.security.keymint; /** - * TODO(seleneh) update the description. - * * Padding modes that may be applied to plaintext for encryption operations. This list includes * padding modes for both symmetric and asymmetric algorithms. Note that implementations should not * provide all possible combinations of algorithm and padding, only the diff --git a/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl b/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl index 67a0214d84..b28ebcb5de 100644 --- a/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl +++ b/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl @@ -268,10 +268,6 @@ enum Tag { USAGE_EXPIRE_DATETIME = TagType.DATE | 402, /** - * TODO(seleneh) this tag need to be deleted. - * - * TODO(seleneh) this tag need to be deleted. - * * Tag::MIN_SECONDS_BETWEEN_OPS specifies the minimum amount of time that elapses between * allowed operations using a key. This can be used to rate-limit uses of keys in contexts * where unlimited use may enable brute force attacks. @@ -831,7 +827,7 @@ enum Tag { /** * DEVICE_UNIQUE_ATTESTATION is an argument to IKeyMintDevice::attested key generation/import * operations. It indicates that attestation using a device-unique key is requested, rather - * than a batch key. When a device-unique key is used, the returned chain contains two or + * than a batch key. When a device-unique key is used, the returned chain should contain two or * three certificates. * * In case the chain contains two certificates, they should be: @@ -844,7 +840,8 @@ enum Tag { * KeyCreationResult.aidl, signed by the device-unique key. * * An intermediate certificate, containing the public portion of the device-unique key. * * A self-signed root certificate, signed by a dedicated key, certifying the - * intermediate. + * intermediate. Ideally, the dedicated key would be the same for all StrongBox + * instances of the same manufacturer to ease validation. * * No additional chained certificates are provided. Only SecurityLevel::STRONGBOX * IKeyMintDevices may support device-unique attestations. SecurityLevel::TRUSTED_ENVIRONMENT diff --git a/security/keymint/aidl/default/Android.bp b/security/keymint/aidl/default/Android.bp index 230534cd74..c2918ef7c7 100644 --- a/security/keymint/aidl/default/Android.bp +++ b/security/keymint/aidl/default/Android.bp @@ -22,9 +22,9 @@ cc_binary { "-Wextra", ], shared_libs: [ - "android.hardware.security.keymint-V1-ndk_platform", - "android.hardware.security.sharedsecret-V1-ndk_platform", - "android.hardware.security.secureclock-V1-ndk_platform", + "android.hardware.security.keymint-V1-ndk", + "android.hardware.security.sharedsecret-V1-ndk", + "android.hardware.security.secureclock-V1-ndk", "libbase", "libbinder_ndk", "libcppbor_external", diff --git a/security/keymint/aidl/vts/functional/Android.bp b/security/keymint/aidl/vts/functional/Android.bp index 77eea8afd6..ff6a6f8071 100644 --- a/security/keymint/aidl/vts/functional/Android.bp +++ b/security/keymint/aidl/vts/functional/Android.bp @@ -34,8 +34,8 @@ cc_defaults { "libcrypto", ], static_libs: [ - "android.hardware.security.keymint-V1-ndk_platform", - "android.hardware.security.secureclock-V1-ndk_platform", + "android.hardware.security.keymint-V1-ndk", + "android.hardware.security.secureclock-V1-ndk", "libcppbor_external", "libcppcose_rkp", "libjsoncpp", diff --git a/security/keymint/aidl/vts/functional/AttestKeyTest.cpp b/security/keymint/aidl/vts/functional/AttestKeyTest.cpp index a3127237ac..26ed34427c 100644 --- a/security/keymint/aidl/vts/functional/AttestKeyTest.cpp +++ b/security/keymint/aidl/vts/functional/AttestKeyTest.cpp @@ -312,6 +312,7 @@ TEST_P(AttestKeyTest, RsaAttestKeyChaining) { AuthorizationSet hw_enforced = HwEnforcedAuthorizations(attested_key_characteristics); AuthorizationSet sw_enforced = SwEnforcedAuthorizations(attested_key_characteristics); + ASSERT_GT(cert_chain_list[i].size(), 0); EXPECT_TRUE(verify_attestation_record("foo", "bar", sw_enforced, hw_enforced, SecLevel(), cert_chain_list[i][0].encodedCertificate)); @@ -383,6 +384,7 @@ TEST_P(AttestKeyTest, EcAttestKeyChaining) { AuthorizationSet hw_enforced = HwEnforcedAuthorizations(attested_key_characteristics); AuthorizationSet sw_enforced = SwEnforcedAuthorizations(attested_key_characteristics); + ASSERT_GT(cert_chain_list[i].size(), 0); EXPECT_TRUE(verify_attestation_record("foo", "bar", sw_enforced, hw_enforced, SecLevel(), cert_chain_list[i][0].encodedCertificate)); @@ -471,6 +473,7 @@ TEST_P(AttestKeyTest, AlternateAttestKeyChaining) { AuthorizationSet hw_enforced = HwEnforcedAuthorizations(attested_key_characteristics); AuthorizationSet sw_enforced = SwEnforcedAuthorizations(attested_key_characteristics); + ASSERT_GT(cert_chain_list[i].size(), 0); EXPECT_TRUE(verify_attestation_record("foo", "bar", sw_enforced, hw_enforced, SecLevel(), cert_chain_list[i][0].encodedCertificate)); diff --git a/security/keymint/aidl/vts/functional/KeyMintTest.cpp b/security/keymint/aidl/vts/functional/KeyMintTest.cpp index 5a87b83854..b695deec5d 100644 --- a/security/keymint/aidl/vts/functional/KeyMintTest.cpp +++ b/security/keymint/aidl/vts/functional/KeyMintTest.cpp @@ -71,6 +71,12 @@ namespace { bool check_patchLevels = false; +// The maximum number of times we'll attempt to verify that corruption +// of an ecrypted blob results in an error. Retries are necessary as there +// is a small (roughly 1/256) chance that corrupting ciphertext still results +// in valid PKCS7 padding. +constexpr size_t kMaxPaddingCorruptionRetries = 8; + template <TagType tag_type, Tag tag, typename ValueT> bool contains(const vector<KeyParameter>& set, TypedTag<tag_type, tag> ttag, ValueT expected_value) { @@ -4374,11 +4380,22 @@ TEST_P(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) { string ciphertext = EncryptMessage(message, params); EXPECT_EQ(16U, ciphertext.size()); EXPECT_NE(ciphertext, message); - ++ciphertext[ciphertext.size() / 2]; - EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params)); - string plaintext; - EXPECT_EQ(ErrorCode::INVALID_INPUT_LENGTH, Finish(message, &plaintext)); + for (size_t i = 0; i < kMaxPaddingCorruptionRetries; ++i) { + ++ciphertext[ciphertext.size() / 2]; + + EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params)); + string plaintext; + ErrorCode error = Finish(message, &plaintext); + if (error == ErrorCode::INVALID_INPUT_LENGTH) { + // This is the expected error, we can exit the test now. + return; + } else { + // Very small chance we got valid decryption, so try again. + ASSERT_EQ(error, ErrorCode::OK); + } + } + FAIL() << "Corrupt ciphertext should have failed to decrypt by now."; } vector<uint8_t> CopyIv(const AuthorizationSet& set) { @@ -5341,15 +5358,27 @@ TEST_P(EncryptionOperationsTest, TripleDesEcbPkcs7PaddingCorrupted) { string ciphertext = EncryptMessage(message, BlockMode::ECB, PaddingMode::PKCS7); EXPECT_EQ(8U, ciphertext.size()); EXPECT_NE(ciphertext, message); - ++ciphertext[ciphertext.size() / 2]; AuthorizationSetBuilder begin_params; begin_params.push_back(TAG_BLOCK_MODE, BlockMode::ECB); begin_params.push_back(TAG_PADDING, PaddingMode::PKCS7); - EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params)); - string plaintext; - EXPECT_EQ(ErrorCode::OK, Update(ciphertext, &plaintext)); - EXPECT_EQ(ErrorCode::INVALID_ARGUMENT, Finish(&plaintext)); + + for (size_t i = 0; i < kMaxPaddingCorruptionRetries; ++i) { + ++ciphertext[ciphertext.size() / 2]; + + EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params)); + string plaintext; + EXPECT_EQ(ErrorCode::OK, Update(ciphertext, &plaintext)); + ErrorCode error = Finish(&plaintext); + if (error == ErrorCode::INVALID_ARGUMENT) { + // This is the expected error, we can exit the test now. + return; + } else { + // Very small chance we got valid decryption, so try again. + ASSERT_EQ(error, ErrorCode::OK); + } + } + FAIL() << "Corrupt ciphertext should have failed to decrypt by now."; } struct TripleDesTestVector { @@ -5677,16 +5706,27 @@ TEST_P(EncryptionOperationsTest, TripleDesCbcPkcs7PaddingCorrupted) { string ciphertext = EncryptMessage(message, BlockMode::CBC, PaddingMode::PKCS7, &iv); EXPECT_EQ(8U, ciphertext.size()); EXPECT_NE(ciphertext, message); - ++ciphertext[ciphertext.size() / 2]; auto begin_params = AuthorizationSetBuilder() .BlockMode(BlockMode::CBC) .Padding(PaddingMode::PKCS7) .Authorization(TAG_NONCE, iv); - EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params)); - string plaintext; - EXPECT_EQ(ErrorCode::OK, Update(ciphertext, &plaintext)); - EXPECT_EQ(ErrorCode::INVALID_ARGUMENT, Finish(&plaintext)); + + for (size_t i = 0; i < kMaxPaddingCorruptionRetries; ++i) { + ++ciphertext[ciphertext.size() / 2]; + EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params)); + string plaintext; + EXPECT_EQ(ErrorCode::OK, Update(ciphertext, &plaintext)); + ErrorCode error = Finish(&plaintext); + if (error == ErrorCode::INVALID_ARGUMENT) { + // This is the expected error, we can exit the test now. + return; + } else { + // Very small chance we got valid decryption, so try again. + ASSERT_EQ(error, ErrorCode::OK); + } + } + FAIL() << "Corrupt ciphertext should have failed to decrypt by now."; } /* diff --git a/security/keymint/aidl/vts/performance/Android.bp b/security/keymint/aidl/vts/performance/Android.bp index 79ed0d5442..355f87be6b 100644 --- a/security/keymint/aidl/vts/performance/Android.bp +++ b/security/keymint/aidl/vts/performance/Android.bp @@ -39,8 +39,8 @@ cc_benchmark { "libkeymint_support", ], static_libs: [ - "android.hardware.security.keymint-V1-ndk_platform", - "android.hardware.security.secureclock-V1-ndk_platform", + "android.hardware.security.keymint-V1-ndk", + "android.hardware.security.secureclock-V1-ndk", "libcppbor_external", "libchrome", ], diff --git a/security/keymint/support/Android.bp b/security/keymint/support/Android.bp index 9e218b6a3d..bdb4cdfeae 100644 --- a/security/keymint/support/Android.bp +++ b/security/keymint/support/Android.bp @@ -40,7 +40,7 @@ cc_library { "include", ], shared_libs: [ - "android.hardware.security.keymint-V1-ndk_platform", + "android.hardware.security.keymint-V1-ndk", "libbase", "libcrypto", "libutils", diff --git a/security/secureclock/aidl/Android.bp b/security/secureclock/aidl/Android.bp index b70dda9b3a..5235dd5ac4 100644 --- a/security/secureclock/aidl/Android.bp +++ b/security/secureclock/aidl/Android.bp @@ -26,6 +26,10 @@ aidl_interface { }, rust: { enabled: true, + apex_available: [ + "//apex_available:platform", + "com.android.compos", + ], }, }, versions: ["1"], diff --git a/security/secureclock/aidl/android/hardware/security/secureclock/TimeStampToken.aidl b/security/secureclock/aidl/android/hardware/security/secureclock/TimeStampToken.aidl index 2fbd29afa7..fcf2ee8dd7 100644 --- a/security/secureclock/aidl/android/hardware/security/secureclock/TimeStampToken.aidl +++ b/security/secureclock/aidl/android/hardware/security/secureclock/TimeStampToken.aidl @@ -39,7 +39,7 @@ parcelable TimeStampToken { * 32-byte HMAC-SHA256 of the above values, computed as: * * HMAC(H, - * ISecureClock.TIME_STAMP_MAC_LABEL || challenge || timestamp || securityLevel ) + * ISecureClock.TIME_STAMP_MAC_LABEL || challenge || timestamp || 1 ) * * where: * @@ -50,9 +50,7 @@ parcelable TimeStampToken { * ``||'' represents concatenation * * The representation of challenge and timestamp is as 64-bit unsigned integers in big-endian - * order. SecurityLevel is represented as a 32-bit unsigned integer in big-endian order as - * described in android.hardware.security.keymint.SecurityLevel. It represents the security - * level of the secure clock environment. + * order. 1, above, is a 32-bit unsigned integer, also big-endian. */ byte[] mac; } diff --git a/security/secureclock/aidl/vts/functional/Android.bp b/security/secureclock/aidl/vts/functional/Android.bp index 56c8e1d361..806517db1d 100644 --- a/security/secureclock/aidl/vts/functional/Android.bp +++ b/security/secureclock/aidl/vts/functional/Android.bp @@ -41,8 +41,8 @@ cc_test { "libcrypto", ], static_libs: [ - "android.hardware.security.keymint-V1-ndk_platform", - "android.hardware.security.secureclock-V1-ndk_platform", + "android.hardware.security.keymint-V1-ndk", + "android.hardware.security.secureclock-V1-ndk", "libkeymint", ], test_suites: [ diff --git a/security/sharedsecret/aidl/vts/functional/Android.bp b/security/sharedsecret/aidl/vts/functional/Android.bp index d3747fc071..94da675c0e 100644 --- a/security/sharedsecret/aidl/vts/functional/Android.bp +++ b/security/sharedsecret/aidl/vts/functional/Android.bp @@ -41,8 +41,8 @@ cc_test { "libcrypto", ], static_libs: [ - "android.hardware.security.keymint-V1-ndk_platform", - "android.hardware.security.sharedsecret-V1-ndk_platform", + "android.hardware.security.keymint-V1-ndk", + "android.hardware.security.sharedsecret-V1-ndk", "libkeymint", ], test_suites: [ diff --git a/sensors/2.0/multihal/android.hardware.sensors@2.0-service-multihal.rc b/sensors/2.0/multihal/android.hardware.sensors@2.0-service-multihal.rc index 0b3d4c2dce..8867a1ae8e 100644 --- a/sensors/2.0/multihal/android.hardware.sensors@2.0-service-multihal.rc +++ b/sensors/2.0/multihal/android.hardware.sensors@2.0-service-multihal.rc @@ -2,6 +2,6 @@ service vendor.sensors-hal-2-0-multihal /vendor/bin/hw/android.hardware.sensors@ class hal user system group system wakelock context_hub - writepid /dev/cpuset/system-background/tasks + task_profiles ServiceCapacityLow capabilities BLOCK_SUSPEND rlimit rtprio 10 10 diff --git a/sensors/2.1/multihal/android.hardware.sensors@2.1-service-multihal.rc b/sensors/2.1/multihal/android.hardware.sensors@2.1-service-multihal.rc index fc99ee7a06..f47e060f88 100644 --- a/sensors/2.1/multihal/android.hardware.sensors@2.1-service-multihal.rc +++ b/sensors/2.1/multihal/android.hardware.sensors@2.1-service-multihal.rc @@ -2,6 +2,6 @@ service vendor.sensors-hal-2-1-multihal /vendor/bin/hw/android.hardware.sensors@ class hal user system group system wakelock context_hub - writepid /dev/cpuset/system-background/tasks + task_profiles ServiceCapacityLow capabilities BLOCK_SUSPEND rlimit rtprio 10 10 diff --git a/soundtrigger/2.4/Android.bp b/soundtrigger/2.4/Android.bp new file mode 100644 index 0000000000..44befc3892 --- /dev/null +++ b/soundtrigger/2.4/Android.bp @@ -0,0 +1,30 @@ +// This file is autogenerated by hidl-gen -Landroidbp. + +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "hardware_interfaces_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["hardware_interfaces_license"], +} + +hidl_interface { + name: "android.hardware.soundtrigger@2.4", + root: "android.hardware", + srcs: [ + "ISoundTriggerHw.hal", + "ISoundTriggerHwCallback.hal", + "ISoundTriggerHwGlobalCallback.hal", + ], + interfaces: [ + "android.hardware.audio.common@2.0", + "android.hardware.soundtrigger@2.0", + "android.hardware.soundtrigger@2.1", + "android.hardware.soundtrigger@2.2", + "android.hardware.soundtrigger@2.3", + "android.hidl.base@1.0", + "android.hidl.safe_union@1.0", + ], + gen_java: true, +} diff --git a/soundtrigger/2.4/ISoundTriggerHw.hal b/soundtrigger/2.4/ISoundTriggerHw.hal new file mode 100644 index 0000000000..fd393036d8 --- /dev/null +++ b/soundtrigger/2.4/ISoundTriggerHw.hal @@ -0,0 +1,190 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.soundtrigger@2.4; + +import @2.0::SoundModelHandle; +import @2.1::ISoundTriggerHw.SoundModel; +import @2.1::ISoundTriggerHw.PhraseSoundModel; +import @2.3::ISoundTriggerHw; +import @2.3::RecognitionConfig; +import ISoundTriggerHwCallback; +import ISoundTriggerHwGlobalCallback; + +/** + * SoundTrigger HAL interface. Used for hardware recognition of hotwords + * and other sounds. + * + * Important notes about the threading model: + * ========================================== + * Both this interface and the corresponding callback interface use a synchronized calling + * convention. This model comes with some advantages, but also with some risks of deadlocks if the + * implementation does not handle this correctly. Please consider the following: + * - After stopRecognition() returns no more recognition events for that model may be sent. This + * implies that any queues holding such events must be flushed before the call returns and that + * may imply that callback from the HAL to the client are done while stopRecognition() is blocked. + * This is OK, and supported by the framework. + * - Similarly, the same relationship applies between unloadModel() and subsequent callbacks to + * modelUnloaded(). + * - Other than these two cases, calls into the HAL *MAY NOT* block on callbacks from the HAL, or + * else deadlock conditions may result, which may be handled by rebooting of the HAL process and + * cause service outages. + * + * Similarly, it is expected that a single call to startRecognition() generates at most one event + * (the model automatically becomes stopped when the event occurs, until explicitly started again) + * and that after a modelUnloaded() event no more events would be sent regarding the model. + * Note that a getModelState() call may generate a recognition event, but this event DOES NOT modify + * the model state - the model remains started. + * + * The HAL is expected to correctly handle a stopRecognition() call even after it sent an event + * indicating that recognition is stopped and an unloadModel() call even after it sent an event + * indicating that it has been unloaded. This is required in order to prevent race conditions + * between these calls. This also implies that model handles should generally not be reused until + * explicitly unloaded. To avoid the rare possibility of running out of handles, the framework will + * call unloadModel() on models that have been preemptively unloaded by the HAL. + * + * Due to the asynchronous nature of recognition events and preemptive model unloading, the HAL must + * correctly handle requests that would have been valid before an event has been delivered, but + * became moot as result of the event. Namely: + * - stopRecognition() may be called on a model that has already delivered an event and became + * inactive as a result. The HAL must return a successful return code in this case. + * - Furthermore, if a model is preemptively unloaded after it triggers (typically, this would + * happen when it is first aborted and immediately preemptively unloaded), stopRecognition() may + * be called on it. The HAL must return a successful return code in this case. + * - startRecognition() may be called on a model that has been preemptively unloaded. In this case, + * the HAL must return -EBUSY to indicate that the operation is temporarily unsuccessful. + * - unloadSoundModel() may be called on a model that has been preemptively unloaded. The HAL must + * return a successful return code in this case. + * + * Important notes about resource constraints and concurrency + * ========================================================= + * Up until this version, the framework would enforce concurrency constraints expressed by the + * Properties presented by the soundtrigger instance. These include constraints on the maximum + * amount of models that can be loaded at the same time and on running recognition while capturing + * from the microphone. + * This version changes the approach for how these constraints are modeled, both offering the HAL + * implementation more flexibility and simplifying the framework's job in enforcing these + * limitations. Note that there is no change for how the framework behaves with earlier versions, + * everything described below only applies to this version and onward. + * The way this is achieved is as following: + * - The framework will no longer enforce constraints on concurrent loading of models, as expressed + * in the Properties.maxSoundModels field (this property is merely a hint at this point and may be + * deprecated in the future. + * - The framework will no longer enforce constraints on concurrency of audio recording and + * soundtrigger operation, as expressed in the Properties.concurrentCapture field (this property + * is merely a hint at this point and may be deprecated in the future). + * - The framework will no longer enforce constraints on concurrent loading of models, as expressed + * in the Properties (these properties are merely hints at this point and may be deprecated in the + * future. + * - The HAL implementation is free to reject starting of any model at any time by having the + * respective start*() method return -EBUSY. + * - The HAL implementation is free to reject loading of any model at any time by having the + * respective load*() method return -EBUSY. + * - The HAL implementation is free to preemptively stop a previously started model at its own + * discretion (for example, if a higher priority use-case which cannot coexist with detection + * has been requested). The HAL must notify the framework of the preemption by sending a + * recognition event with an `ABORT` status. The implementation must NOT attempt to restart the + * recognition automatically when conditions change. + * - The HAL implementation is free to preemptively unload a previously loaded model at its own + * discretion (for example, if a higher-priority model is being loaded and the two cannot + * coexist). When doing so, it must first abort the detection if active (as per above) and then + * notify the framework of the unload using the newly added modelUnloaded callback. + * - When conditions change, such that a model that couldn't previously load or start or that had + * previously been preemptively stopped or unloaded, the HAL must notify the framework via the + * newly added tryAgain() callback. This callback is not a guarantee that any operation would now + * succeed, but merely a hint that retrying something that had previously failed, now MAY succeed. + * Until this callback arrives, the framework may assume that any operation that had previously + * failed or aborted would still fail if retried, so the implementation should not forget to + * deliver it. There are no guarantees regarding how the framework may respond to this event and + * the order in which it may choose to reload/restart its models. Typically, as result of this + * event the framework will make a single attempt per model to bring this model to its desired + * state (loaded, started). + */ +interface ISoundTriggerHw extends @2.3::ISoundTriggerHw { + /** + * This will get called at most once per every attachment to the service. + * + * All events not tied to a specific model should go through this callback. + */ + registerGlobalCallback(ISoundTriggerHwGlobalCallback callback); + + /** + * Load a sound model. Once loaded, recognition of this model can be + * started and stopped. + * The implementation returns a unique handle used by other functions + * (unloadSoundModel(), startRecognition*(), etc... + * + * Must have the exact same semantics as loadSoundModel from ISoundTriggerHw@2.3 except that the + * return values have changed and that there is no cookie provided (the implementation may pass + * any value to the callback, as it is ignored). + * + * @param soundModel A SoundModel structure describing the sound model + * to load. + * @param callback The callback interface on which the soundModelCallback*() + * method must be called upon completion and modelUnloaded() upon preempted unload. + * @return retval Operation completion status: 0 in case of success, + * -EBUSY in case the operation is temporarily unavailable (but possible in general). + * @return modelHandle A unique handle assigned by the HAL for use by the + * framework when controlling activity for this sound model. + */ + loadSoundModel_2_4(SoundModel soundModel, ISoundTriggerHwCallback callback) + generates (int32_t retval, SoundModelHandle modelHandle); + + /** + * Load a key phrase sound model. Once loaded, recognition of this model can + * be started and stopped. Only one active recognition per model at a time. + * The SoundTrigger service must handle concurrent recognition requests by + * different users/applications on the same model. + * The implementation returns a unique handle used by other functions + * (unloadSoundModel(), startRecognition*(), etc... + * + * Must have the exact same semantics as loadPhraseSoundModel from ISoundTriggerHw@2.3 except + * that the return values have changed and that there is no cookie provided (the implementation + * may pass any value to the callback, as it is ignored). + * + * @param soundModel A PhraseSoundModel structure describing the sound model + * to load. + * @param callback The callback interface on which the soundModelCallback*() + * method must be called upon completion and modelUnloaded() upon preempted unload. + * @return retval Operation completion status: 0 in case of success, + * -EBUSY in case the operation is temporarily unavailable (but possible in general). + * @return modelHandle A unique handle assigned by the HAL for use by the + * framework when controlling activity for this sound model. + */ + loadPhraseSoundModel_2_4(PhraseSoundModel soundModel, ISoundTriggerHwCallback callback) + generates (int32_t retval, SoundModelHandle modelHandle); + + /** + * Start recognition on a given model. Only one recognition active + * at a time per model. Once recognition succeeds or fails, the callback + * associated with the model handle is called. + * + * Must have the exact same semantics as startRecognition from ISoundTriggerHw@2.3 except that + * there are different expectations of the return value and that there is no cookie provided + * (the implementation may pass any value to the callback, as it is ignored). + * + * @param modelHandle the handle of the sound model to use for recognition + * @param config A RecognitionConfig structure containing attributes of the + * recognition to perform + * @param callback The callback interface on which the recognitionCallback() + * method must be called upon recognition. + * @return retval Operation completion status: 0 in case of success, + * -EBUSY in case the operation is temporarily unavailable (but possible in general), or in + * case model has been preemtively unloaded. + */ + startRecognition_2_4(SoundModelHandle modelHandle, RecognitionConfig config) + generates (int32_t retval); +}; diff --git a/soundtrigger/2.4/ISoundTriggerHwCallback.hal b/soundtrigger/2.4/ISoundTriggerHwCallback.hal new file mode 100644 index 0000000000..594deb09d3 --- /dev/null +++ b/soundtrigger/2.4/ISoundTriggerHwCallback.hal @@ -0,0 +1,34 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.soundtrigger@2.4; + +import @2.0::SoundModelHandle; +import @2.1::ISoundTriggerHwCallback; + +/** + * SoundTrigger HAL per-model Callback interface. + */ +interface ISoundTriggerHwCallback extends @2.1::ISoundTriggerHwCallback { + /** + * Callback method called by the HAL when a model has been unloaded at the HAL implementation's + * discretion. Only a stopped model may be unloaded. + * This event is NOT sent as part of an unload sequence initiated by the client. + * + * @param model The model handle. + */ + modelUnloaded(SoundModelHandle model); +}; diff --git a/soundtrigger/2.4/ISoundTriggerHwGlobalCallback.hal b/soundtrigger/2.4/ISoundTriggerHwGlobalCallback.hal new file mode 100644 index 0000000000..2f1a977a12 --- /dev/null +++ b/soundtrigger/2.4/ISoundTriggerHwGlobalCallback.hal @@ -0,0 +1,32 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.soundtrigger@2.4; + +/** + * SoundTrigger HAL callback interface for events not associated with a particular model. + */ +interface ISoundTriggerHwGlobalCallback { + /** + * Callback method called by the HAL whenever internal conditions have been made available, such + * that a call that would previously have failed with an -EBUSY status may now succeed. + * There is no guarantee that any call would succeed following this event. It is merely a hint + * to the client that it may retry. + * Conversely, any call that have failed previously with -EBUSY is guaranteed to fail again if + * retried, until this callback is delivered. + */ + onResourcesAvailable(); +}; diff --git a/soundtrigger/2.4/cli/Android.bp b/soundtrigger/2.4/cli/Android.bp new file mode 100644 index 0000000000..8d0979bed7 --- /dev/null +++ b/soundtrigger/2.4/cli/Android.bp @@ -0,0 +1,17 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "hardware_interfaces_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["hardware_interfaces_license"], +} + +java_binary { + name: "sthal_cli_2.4", + wrapper: "sthal_cli_2.4", + srcs: ["java/**/*.java"], + static_libs: [ + "android.hardware.soundtrigger-V2.4-java", + ], +} diff --git a/soundtrigger/2.4/cli/OWNERS b/soundtrigger/2.4/cli/OWNERS new file mode 100644 index 0000000000..e21b66ecb3 --- /dev/null +++ b/soundtrigger/2.4/cli/OWNERS @@ -0,0 +1 @@ +include /media/java/android/media/soundtrigger_middleware/OWNERS diff --git a/soundtrigger/2.4/cli/java/android/hardware/soundtrigger/V2_4/cli/SthalCli.java b/soundtrigger/2.4/cli/java/android/hardware/soundtrigger/V2_4/cli/SthalCli.java new file mode 100644 index 0000000000..4931105137 --- /dev/null +++ b/soundtrigger/2.4/cli/java/android/hardware/soundtrigger/V2_4/cli/SthalCli.java @@ -0,0 +1,401 @@ +/* + * Copyright 2021 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. + */ +package android.hardware.soundtrigger.V2_4.cli; + +import android.hardware.soundtrigger.V2_0.PhraseRecognitionExtra; +import android.hardware.soundtrigger.V2_0.RecognitionMode; +import android.hardware.soundtrigger.V2_0.SoundModelType; +import android.hardware.soundtrigger.V2_3.OptionalModelParameterRange; +import android.hardware.soundtrigger.V2_4.ISoundTriggerHw; +import android.hardware.soundtrigger.V2_4.ISoundTriggerHwCallback; +import android.hardware.soundtrigger.V2_4.ISoundTriggerHwGlobalCallback; +import android.os.HidlMemoryUtil; +import android.os.HwBinder; +import android.os.RemoteException; +import android.os.SystemProperties; + +import java.util.Scanner; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * This is a quick-and-dirty sound trigger HAL console mock. + * + * It would only work on userdebug builds. + * + * When this app is started, it will initially: + * - Register a ISoundTriggerHw HAL with an instance name "mock". + * - Set a sysprop that tells SoundTriggerMiddlewareService to try to connect to the mock instance + * rather than the default one. + * - Reboot the real (default) HAL. + * + * In response to that, SoundTriggerMiddlewareService is going to connect to the mock HAL and resume + * normal operation. + * + * Our mock HAL will print to stdout every call it receives as well as expose a basic set of + * operations for sending event callbacks to the client. This allows us to simulate the frameworks + * behavior in response to different HAL behaviors. + */ +public class SthalCli { + private static SoundTriggerImpl mService; + private static final Scanner scanner = new Scanner(System.in); + + public static void main(String[] args) { + try { + System.out.println("Registering mock STHAL"); + HwBinder.setTrebleTestingOverride(true); + mService = new SoundTriggerImpl(); + mService.registerAsService("mock"); + + System.out.println("Rebooting STHAL"); + SystemProperties.set("debug.soundtrigger_middleware.use_mock_hal", "2"); + SystemProperties.set("sys.audio.restart.hal", "1"); + + while (processCommand()) ; + } catch (Exception e) { + e.printStackTrace(); + } finally { + cleanup(); + } + } + + private static void cleanup() { + System.out.println("Cleaning up."); + SystemProperties.set("debug.soundtrigger_middleware.use_mock_hal", null); + HwBinder.setTrebleTestingOverride(false); + } + + private static boolean processCommand() { + String line = scanner.nextLine(); + String[] tokens = line.split("\\s+"); + if (tokens.length < 1) { + return false; + } + switch (tokens[0]) { + case "q": + return false; + + case "a": + mService.sendOnResourcesAvailable(); + return true; + + case "u": + mService.sendModelUnloaded(Integer.parseInt(tokens[1])); + return true; + + case "r": + mService.sendRecognitionEvent(Integer.parseInt(tokens[1]), + Integer.parseInt(tokens[2])); + return true; + + case "p": + mService.sendPhraseRecognitionEvent(Integer.parseInt(tokens[1]), + Integer.parseInt(tokens[2])); + return true; + + case "d": + mService.dumpModels(); + return true; + + case "h": + System.out.print("Available commands:\n" + "h - help\n" + "q - quit\n" + + "a - send onResourcesAvailable event\n" + + "u <model> - send modelUnloaded event\n" + + "r <model> <status> - send recognitionEvent\n" + + "p <model> <status> - send phraseRecognitionEvent\n" + + "d - dump models\n"); + + default: + return true; + } + } + + private static class SoundTriggerImpl extends ISoundTriggerHw.Stub { + static class Model { + final ISoundTriggerHwCallback callback; + final SoundModel model; + final PhraseSoundModel phraseModel; + public android.hardware.soundtrigger.V2_3.RecognitionConfig config = null; + + Model(ISoundTriggerHwCallback callback, SoundModel model) { + this.callback = callback; + this.model = model; + this.phraseModel = null; + } + + Model(ISoundTriggerHwCallback callback, PhraseSoundModel model) { + this.callback = callback; + this.model = null; + this.phraseModel = model; + } + } + + private ISoundTriggerHwGlobalCallback mGlobalCallback; + private final ConcurrentMap<Integer, Model> mLoadedModels = new ConcurrentHashMap<>(); + private int mHandleCounter = 1; + + public void dumpModels() { + mLoadedModels.forEach((handle, model) -> { + System.out.println("+++ Model " + handle); + System.out.println(" config = " + model.config); + android.hardware.soundtrigger.V2_3.RecognitionConfig recognitionConfig = + model.config; + if (recognitionConfig != null) { + System.out.println(" ACTIVE recognitionConfig = " + recognitionConfig); + } else { + System.out.println(" INACTIVE"); + } + }); + } + + public void sendOnResourcesAvailable() { + if (mGlobalCallback != null) { + try { + mGlobalCallback.onResourcesAvailable(); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + } + + public void sendRecognitionEvent(int modelHandle, int status) { + Model model = mLoadedModels.get(modelHandle); + if (model != null && model.config != null) { + android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback.RecognitionEvent event = + new android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback.RecognitionEvent(); + event.header.model = modelHandle; + event.header.type = SoundModelType.GENERIC; + event.header.status = status; + event.header.captureSession = model.config.base.header.captureHandle; + event.header.captureAvailable = true; + event.header.audioConfig.channelMask = 16; + event.header.audioConfig.format = 1; + event.header.audioConfig.sampleRateHz = 16000; + event.data = HidlMemoryUtil.byteArrayToHidlMemory(new byte[0]); + try { + model.callback.recognitionCallback_2_1(event, 0); + } catch (RemoteException e) { + e.printStackTrace(); + } + model.config = null; + } + } + + public void sendPhraseRecognitionEvent(int modelHandle, int status) { + Model model = mLoadedModels.get(modelHandle); + if (model != null && model.config != null) { + android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback.PhraseRecognitionEvent + event = + new android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback.PhraseRecognitionEvent(); + event.common.header.model = modelHandle; + event.common.header.type = SoundModelType.KEYPHRASE; + event.common.header.status = status; + event.common.header.captureSession = model.config.base.header.captureHandle; + event.common.header.captureAvailable = true; + event.common.header.audioConfig.channelMask = 16; + event.common.header.audioConfig.format = 1; + event.common.header.audioConfig.sampleRateHz = 16000; + event.common.data = HidlMemoryUtil.byteArrayToHidlMemory(new byte[0]); + if (!model.phraseModel.phrases.isEmpty()) { + PhraseRecognitionExtra extra = new PhraseRecognitionExtra(); + extra.id = model.phraseModel.phrases.get(0).id; + extra.confidenceLevel = 100; + extra.recognitionModes = model.phraseModel.phrases.get(0).recognitionModes; + event.phraseExtras.add(extra); + } + try { + model.callback.phraseRecognitionCallback_2_1(event, 0); + } catch (RemoteException e) { + e.printStackTrace(); + } + model.config = null; + } + } + + public void sendModelUnloaded(int modelHandle) { + Model model = mLoadedModels.remove(modelHandle); + if (model != null) { + try { + model.callback.modelUnloaded(modelHandle); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + } + + @Override + public void registerGlobalCallback(ISoundTriggerHwGlobalCallback callback) { + System.out.println("registerGlobalCallback()"); + mGlobalCallback = callback; + } + + @Override + public void loadSoundModel_2_4(SoundModel soundModel, ISoundTriggerHwCallback callback, + loadSoundModel_2_4Callback _hidl_cb) { + int handle = mHandleCounter++; + System.out.printf("loadSoundModel_2_4(soundModel=%s) -> %d%n", soundModel, handle); + mLoadedModels.put(handle, new Model(callback, soundModel)); + _hidl_cb.onValues(0, handle); + } + + @Override + public void loadPhraseSoundModel_2_4(PhraseSoundModel soundModel, + ISoundTriggerHwCallback callback, loadPhraseSoundModel_2_4Callback _hidl_cb) { + int handle = mHandleCounter++; + System.out.printf("loadPhraseSoundModel_2_4(soundModel=%s) -> %d%n", soundModel, + handle); + mLoadedModels.put(handle, new Model(callback, soundModel)); + _hidl_cb.onValues(0, handle); + } + + @Override + public int startRecognition_2_4(int modelHandle, + android.hardware.soundtrigger.V2_3.RecognitionConfig config) { + System.out.printf("startRecognition_2_4(modelHandle=%d)%n", modelHandle); + Model model = mLoadedModels.get(modelHandle); + if (model != null) { + model.config = config; + } + return 0; + } + + @Override + public void getProperties_2_3(getProperties_2_3Callback _hidl_cb) { + System.out.println("getProperties_2_3()"); + android.hardware.soundtrigger.V2_3.Properties properties = + new android.hardware.soundtrigger.V2_3.Properties(); + properties.base.implementor = "Android"; + properties.base.description = "Mock STHAL"; + properties.base.maxSoundModels = 2; + properties.base.maxKeyPhrases = 1; + properties.base.recognitionModes = + RecognitionMode.VOICE_TRIGGER | RecognitionMode.GENERIC_TRIGGER; + _hidl_cb.onValues(0, properties); + } + + @Override + public void queryParameter(int modelHandle, int modelParam, + queryParameterCallback _hidl_cb) { + _hidl_cb.onValues(0, new OptionalModelParameterRange()); + } + + @Override + public int getModelState(int modelHandle) { + System.out.printf("getModelState(modelHandle=%d)%n", modelHandle); + return 0; + } + + @Override + public int unloadSoundModel(int modelHandle) { + System.out.printf("unloadSoundModel(modelHandle=%d)%n", modelHandle); + return 0; + } + + @Override + public int stopRecognition(int modelHandle) { + System.out.printf("stopRecognition(modelHandle=%d)%n", modelHandle); + Model model = mLoadedModels.get(modelHandle); + if (model != null) { + model.config = null; + } + return 0; + } + + @Override + public void debug(android.os.NativeHandle fd, java.util.ArrayList<String> options) { + if (!options.isEmpty()) { + switch (options.get(0)) { + case "reboot": + System.out.println("Received a reboot request. Exiting."); + cleanup(); + System.exit(1); + } + } + } + + //////////////////////////////////////////////////////////////////////////////////////////// + // Everything below is not implemented and not expected to be called. + + @Override + public int startRecognition_2_3(int modelHandle, + android.hardware.soundtrigger.V2_3.RecognitionConfig config) { + throw new UnsupportedOperationException(); + } + + @Override + public int setParameter(int modelHandle, int modelParam, int value) { + throw new UnsupportedOperationException(); + } + + @Override + public void getParameter(int modelHandle, int modelParam, getParameterCallback _hidl_cb) { + throw new UnsupportedOperationException(); + } + + @Override + public void loadSoundModel_2_1(SoundModel soundModel, + android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback callback, int cookie, + loadSoundModel_2_1Callback _hidl_cb) { + throw new UnsupportedOperationException(); + } + + @Override + public void loadPhraseSoundModel_2_1(PhraseSoundModel soundModel, + android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback callback, int cookie, + loadPhraseSoundModel_2_1Callback _hidl_cb) { + throw new UnsupportedOperationException(); + } + + @Override + public int startRecognition_2_1(int modelHandle, RecognitionConfig config, + android.hardware.soundtrigger.V2_1.ISoundTriggerHwCallback callback, int cookie) { + throw new UnsupportedOperationException(); + } + + @Override + public void getProperties(getPropertiesCallback _hidl_cb) { + throw new UnsupportedOperationException(); + } + + @Override + public void loadSoundModel( + android.hardware.soundtrigger.V2_0.ISoundTriggerHw.SoundModel soundModel, + android.hardware.soundtrigger.V2_0.ISoundTriggerHwCallback callback, int cookie, + loadSoundModelCallback _hidl_cb) { + throw new UnsupportedOperationException(); + } + + @Override + public void loadPhraseSoundModel( + android.hardware.soundtrigger.V2_0.ISoundTriggerHw.PhraseSoundModel soundModel, + android.hardware.soundtrigger.V2_0.ISoundTriggerHwCallback callback, int cookie, + loadPhraseSoundModelCallback _hidl_cb) { + throw new UnsupportedOperationException(); + } + + @Override + public int startRecognition(int modelHandle, + android.hardware.soundtrigger.V2_0.ISoundTriggerHw.RecognitionConfig config, + android.hardware.soundtrigger.V2_0.ISoundTriggerHwCallback callback, int cookie) { + throw new UnsupportedOperationException(); + } + + @Override + public int stopAllRecognitions() { + throw new UnsupportedOperationException(); + } + } +} diff --git a/soundtrigger/2.4/cli/sthal_cli_2.4 b/soundtrigger/2.4/cli/sthal_cli_2.4 new file mode 100644 index 0000000000..08014643ff --- /dev/null +++ b/soundtrigger/2.4/cli/sthal_cli_2.4 @@ -0,0 +1,7 @@ +#!/system/bin/sh +# Script to start "sthal_cli_2.4" on the device +# +base=/system +export CLASSPATH=$base/framework/sthal_cli_2.4.jar +exec app_process $base/bin android.hardware.soundtrigger.V2_4.cli.SthalCli "$@" + diff --git a/soundtrigger/2.4/vts/functional/Android.bp b/soundtrigger/2.4/vts/functional/Android.bp new file mode 100644 index 0000000000..4b7ae91f37 --- /dev/null +++ b/soundtrigger/2.4/vts/functional/Android.bp @@ -0,0 +1,41 @@ +// +// Copyright (C) 2021 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. +// + +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "hardware_interfaces_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["hardware_interfaces_license"], +} + +cc_test { + name: "VtsHalSoundtriggerV2_4TargetTest", + defaults: ["VtsHalTargetTestDefaults"], + srcs: ["VtsHalSoundtriggerV2_4TargetTest.cpp"], + static_libs: [ + "android.hardware.soundtrigger@2.0", + "android.hardware.soundtrigger@2.1", + "android.hardware.soundtrigger@2.2", + "android.hardware.soundtrigger@2.3", + "android.hardware.soundtrigger@2.4", + ], + test_suites: [ + "general-tests", + "vts", + ], +} diff --git a/soundtrigger/2.4/vts/functional/VtsHalSoundtriggerV2_4TargetTest.cpp b/soundtrigger/2.4/vts/functional/VtsHalSoundtriggerV2_4TargetTest.cpp new file mode 100644 index 0000000000..13d70058e1 --- /dev/null +++ b/soundtrigger/2.4/vts/functional/VtsHalSoundtriggerV2_4TargetTest.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2021 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. + */ + +#define LOG_TAG "SoundTriggerHidlHalTest" + +#include <android-base/logging.h> +#include <android/hardware/audio/common/2.0/types.h> +#include <android/hardware/soundtrigger/2.4/ISoundTriggerHwGlobalCallback.h> +#include <android/hardware/soundtrigger/2.4/ISoundTriggerHw.h> +#include <gtest/gtest.h> +#include <hidl/GtestPrinter.h> +#include <hidl/ServiceManagement.h> + +using ::android::sp; +using ::android::hardware::Return; +using ::android::hardware::Status; +using ::android::hardware::soundtrigger::V2_4::ISoundTriggerHw; +using ::android::hardware::soundtrigger::V2_4::ISoundTriggerHwGlobalCallback; + +/** + * Test class holding the instance of the SoundTriggerHW service to test. + * The passed parameter is the registered name of the implementing service + * supplied by INSTANTIATE_TEST_SUITE_P() call. + */ +class SoundTriggerHidlTest : public testing::TestWithParam<std::string> { +public: + void SetUp() override { + mSoundtrigger = ISoundTriggerHw::getService(GetParam()); + + ASSERT_NE(mSoundtrigger, nullptr); + LOG(INFO) << "Test is remote " << mSoundtrigger->isRemote(); + } + +protected: + sp<ISoundTriggerHw> mSoundtrigger; +}; + +/** + * Empty test is in place to ensure service is initialized. + * Due to the nature of SoundTrigger HAL providing an interface for + * proprietary or vendor specific implementations, limited testing on + * individual APIs is possible. + */ +TEST_P(SoundTriggerHidlTest, ServiceIsInstantiated) {} + +class GlobalCallback : public ISoundTriggerHwGlobalCallback { + Return<void> onResourcesAvailable() override { + return Status::ok(); + } +}; + +/** + * Test ISoundTriggerHw::registerGlobalCallback method + * + * Verifies that: + * - the implementation implements the method + * - the method returns no error + */ +TEST_P(SoundTriggerHidlTest, RegisterGlobalCallback) { + Return<void> hidlReturn; + sp<ISoundTriggerHwGlobalCallback> callback = new GlobalCallback(); + hidlReturn = mSoundtrigger->registerGlobalCallback(callback); + EXPECT_TRUE(hidlReturn.isOk()); +} + +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SoundTriggerHidlTest); + +INSTANTIATE_TEST_SUITE_P( + PerInstance, SoundTriggerHidlTest, + testing::ValuesIn(android::hardware::getAllHalInstanceNames(ISoundTriggerHw::descriptor)), + android::hardware::PrintInstanceNameToString); diff --git a/soundtrigger/aidl/Android.bp b/soundtrigger/aidl/Android.bp new file mode 100644 index 0000000000..fcccc27722 --- /dev/null +++ b/soundtrigger/aidl/Android.bp @@ -0,0 +1,37 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "hardware_interfaces_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["hardware_interfaces_license"], +} + +aidl_interface { + name: "android.hardware.soundtrigger3", + vendor_available: true, + flags: ["-Werror", "-Weverything", ], + srcs: [ + "android/hardware/soundtrigger3/ISoundTriggerHw.aidl", + "android/hardware/soundtrigger3/ISoundTriggerHwCallback.aidl", + "android/hardware/soundtrigger3/ISoundTriggerHwGlobalCallback.aidl", + ], + stability: "vintf", + imports: [ + "android.media.soundtrigger.types", + ], + backend: { + cpp: { + // prefer NDK backend which can be used anywhere + enabled: false, + }, + java: { + sdk_version: "module_current", + }, + ndk: { + vndk: { + enabled: true, + }, + }, + }, +} diff --git a/soundtrigger/aidl/aidl_api/android.hardware.soundtrigger3/current/android/hardware/soundtrigger3/ISoundTriggerHw.aidl b/soundtrigger/aidl/aidl_api/android.hardware.soundtrigger3/current/android/hardware/soundtrigger3/ISoundTriggerHw.aidl new file mode 100644 index 0000000000..bbfe7d9161 --- /dev/null +++ b/soundtrigger/aidl/aidl_api/android.hardware.soundtrigger3/current/android/hardware/soundtrigger3/ISoundTriggerHw.aidl @@ -0,0 +1,48 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.soundtrigger3; +@VintfStability +interface ISoundTriggerHw { + android.media.soundtrigger.Properties getProperties(); + void registerGlobalCallback(in android.hardware.soundtrigger3.ISoundTriggerHwGlobalCallback callback); + int loadSoundModel(in android.media.soundtrigger.SoundModel soundModel, in android.hardware.soundtrigger3.ISoundTriggerHwCallback callback); + int loadPhraseSoundModel(in android.media.soundtrigger.PhraseSoundModel soundModel, in android.hardware.soundtrigger3.ISoundTriggerHwCallback callback); + void unloadSoundModel(in int modelHandle); + void startRecognition(in int modelHandle, in int deviceHandle, in int ioHandle, in android.media.soundtrigger.RecognitionConfig config); + void stopRecognition(in int modelHandle); + void forceRecognitionEvent(in int modelHandle); + @nullable android.media.soundtrigger.ModelParameterRange queryParameter(in int modelHandle, in android.media.soundtrigger.ModelParameter modelParam); + int getParameter(in int modelHandle, in android.media.soundtrigger.ModelParameter modelParam); + void setParameter(in int modelHandle, in android.media.soundtrigger.ModelParameter modelParam, in int value); +} diff --git a/soundtrigger/aidl/aidl_api/android.hardware.soundtrigger3/current/android/hardware/soundtrigger3/ISoundTriggerHwCallback.aidl b/soundtrigger/aidl/aidl_api/android.hardware.soundtrigger3/current/android/hardware/soundtrigger3/ISoundTriggerHwCallback.aidl new file mode 100644 index 0000000000..152dfed637 --- /dev/null +++ b/soundtrigger/aidl/aidl_api/android.hardware.soundtrigger3/current/android/hardware/soundtrigger3/ISoundTriggerHwCallback.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.soundtrigger3; +@VintfStability +interface ISoundTriggerHwCallback { + void modelUnloaded(in int model); + void phraseRecognitionCallback(in int model, in android.media.soundtrigger.PhraseRecognitionEvent event); + void recognitionCallback(in int model, in android.media.soundtrigger.RecognitionEvent event); +} diff --git a/soundtrigger/aidl/aidl_api/android.hardware.soundtrigger3/current/android/hardware/soundtrigger3/ISoundTriggerHwGlobalCallback.aidl b/soundtrigger/aidl/aidl_api/android.hardware.soundtrigger3/current/android/hardware/soundtrigger3/ISoundTriggerHwGlobalCallback.aidl new file mode 100644 index 0000000000..6dfee9fa2f --- /dev/null +++ b/soundtrigger/aidl/aidl_api/android.hardware.soundtrigger3/current/android/hardware/soundtrigger3/ISoundTriggerHwGlobalCallback.aidl @@ -0,0 +1,38 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.soundtrigger3; +@VintfStability +interface ISoundTriggerHwGlobalCallback { + void onResourcesAvailable(); +} diff --git a/soundtrigger/aidl/android/hardware/soundtrigger3/ISoundTriggerHw.aidl b/soundtrigger/aidl/android/hardware/soundtrigger3/ISoundTriggerHw.aidl new file mode 100644 index 0000000000..2a3fc644ee --- /dev/null +++ b/soundtrigger/aidl/android/hardware/soundtrigger3/ISoundTriggerHw.aidl @@ -0,0 +1,269 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.soundtrigger3; + +import android.hardware.soundtrigger3.ISoundTriggerHwCallback; +import android.hardware.soundtrigger3.ISoundTriggerHwGlobalCallback; + +import android.media.soundtrigger.PhraseSoundModel; +import android.media.soundtrigger.Properties; +import android.media.soundtrigger.RecognitionConfig; +import android.media.soundtrigger.SoundModel; +import android.media.soundtrigger.ModelParameter; +import android.media.soundtrigger.ModelParameterRange; +import android.media.soundtrigger.Properties; +import android.media.soundtrigger.RecognitionConfig; + +/** + * SoundTrigger HAL interface. Used for hardware recognition of hotwords + * and other sounds. + * + * Basic usage: + * ============ + * ISoundTriggerHw supports the ability to have one of more detection sessions running at a given + * time, and listening to acoustic events. The basic flow of setting up such a session is: + * - Load a model using loadSoundModel() or loadPhraseSoundModel(). The provided model object would + * indicate the (implementation-specific) detection algorithm (engine) to use, as well as any + * parameters applicable for this agorithm. Upon success, those methods would return a handle + * which will be used to reference this model in subsequent calls. + * - Once the model had been successfully loaded, detection can begin by calling startRecognition(). + * - Recognition will continue running in the background until one of the following events occurs: + * - stopRecognition() has been called on this model. + * - A detection has occurred. + * - Detection was aborted, typically for resource constraints, for example, when a higher- + * priority use-case has been initiated. + * - In the latter two cases, a recognition event will be sent via a the callback interface that was + * registered by the client upon loading. In either case, after any of these events occur, the + * detection becomes inactive and no more recognition callbacks are allowed. + * - The same model maybe started again at a later time, and this process may repeat as many times + * as needed. + * - Finally, an inactive model that is no longer needed may be unloaded via unloadModel(). + * + * Important notes about the threading model: + * ========================================== + * Both this interface and the corresponding callback interface use a synchronous calling + * convention. This model comes with some advantages, but also with some risks of deadlocks if the + * implementation does not handle this correctly. Please consider the following: + * - After stopRecognition() returns, no more recognition events for that model may be sent. This + * implies that any queues holding such events must be flushed before the call returns and that + * may imply that callback from the HAL to the client are done while stopRecognition() is blocked. + * This is OK, and supported by the framework. + * - Similarly, the same relationship applies between unloadModel() and subsequent callbacks to + * modelUnloaded(). + * - Other than these two cases, calls into the HAL *MAY NOT* block on callbacks from the HAL, or + * else deadlock conditions may result, which may be handled by rebooting of the HAL process and + * cause service outages. + * + * Due to the asynchronous nature of recognition events and preemptive model unloading, the HAL must + * correctly handle requests that would have been valid before an event has been delivered, but + * became moot as result of the event. Namely: + * - stopRecognition() may be called on a model that has already delivered an event and became + * inactive as a result. The HAL must return a successful return code in this case. + * - Furthermore, if a model is preemptively unloaded after it triggers (typically, this would + * happen when it is first aborted and immediately preemptively unloaded), stopRecognition() may + * be called on it. The HAL must return successfully in this case. + * - startRecognition() may be called on a model that has been preemptively unloaded. In this case, + * the HAL must signal a ServiceSpecificException(RESOURCE_CONTENTION) to indicate that the + * operation is temporarily unsuccessful. + * - unloadSoundModel() may be called on a model that has been preemptively unloaded. The HAL must + * return a successful return code in this case. This also implies that model handles should + * generally not be reused until explicitly unloaded. To avoid the rare possibility of running out + * of handles, the framework may call unloadModel() on models that have been preemptively unloaded + * by the HAL. + * + * Important notes about resource constraints and concurrency + * ========================================================= + * Up until this version, the framework would enforce concurrency constraints expressed by the + * Properties presented by the soundtrigger instance. These include constraints on the maximum + * amount of models that can be loaded at the same time and on running recognition while capturing + * from the microphone. + * This version changes the approach for how these constraints are modeled, both offering the HAL + * implementation more flexibility and simplifying the framework's job in enforcing these + * limitations. Note that there is no change for how the framework behaves with earlier versions, + * everything described below only applies to this version and onward. + * The way this is achieved is as following: + * - The framework will no longer enforce constraints on concurrent loading of models, as expressed + * in the Properties.maxSoundModels field (this property is merely a hint at this point and may be + * deprecated in the future), or any other implicit constraints. + * - The framework will no longer enforce constraints on concurrency of audio recording and + * soundtrigger operation, as expressed in the Properties.concurrentCapture field (this property + * is merely a hint at this point and may be deprecated in the future). + * - The HAL implementation is free to reject loading of any model at any time by having the + * respective load*() method signal a ServiceSpecificException(RESOURCE_CONTENTION). + * - The HAL implementation is free to reject starting of any model at any time by having the + * respective start*() method signal a ServiceSpecificException(RESOURCE_CONTENTION). + * - The HAL implementation is free to preemptively stop a previously started model at its own + * discretion (for example, if a higher priority use-case which cannot coexist with detection + * has been requested). The HAL must notify the framework of the preemption by sending a + * recognition event with an `ABORTED` status. The implementation must NOT attempt to restart the + * recognition automatically when conditions change. + * - The HAL implementation is free to preemptively unload a previously loaded model at its own + * discretion (for example, if a higher-priority model is being loaded and the two cannot + * coexist). When doing so, it must first abort the detection if active (as per above) and then + * notify the framework of the unload using the modelUnloaded() callback. + * - When conditions change, such that a model that couldn't previously load or start or that had + * previously been preemptively stopped or unloaded, the HAL must notify the framework via the + * newly added onResourcesAvailable() callback. This callback is not a guarantee that any + * operation would now succeed, but merely a hint that retrying something that had previously + * failed, now MAY succeed. Until this callback is invoked, the client may assume that any + * operation that had previously failed or aborted would still fail if retried, so the + * implementation should not forget to deliver it. + * There are no guarantees regarding how the framework may respond to this event and the order in + * which it may choose to reload/restart its models. Typically, as result of this event the + * framework will make a single attempt per model to bring this model to its desired state + * (loaded, started). + */ +@VintfStability +interface ISoundTriggerHw { + /** + * Retrieve implementation properties. + * + * @return A Properties structure containing implementation description and capabilities. + */ + Properties getProperties(); + + /** + * This will get called at most once per every attachment to the service. + * + * All events not tied to a specific model should go through this callback. + * + * @param callback An interface to receive global event callbacks. + */ + void registerGlobalCallback(in ISoundTriggerHwGlobalCallback callback); + + /** + * Load a sound model. Once loaded, recognition of this model can be started and stopped. + * + * @param soundModel A SoundModel structure describing the sound model to load. + * @param callback The callback interface on which the recognitionCallback() + * method will be called upon completion and modelUnloaded() upon preemptive unload. + * @return A unique handle assigned by the HAL for use by the client when controlling + * activity for this sound model. + * @throws ServiceSpecificException(RESOURCE_CONTENTION) if the model cannot be loaded due + * to resource constraints. This is typically a temporary condition and the client may + * retry after the onResourcesAvailable() global callback is invoked. + */ + int loadSoundModel(in SoundModel soundModel, in ISoundTriggerHwCallback callback); + + /** + * Load a key phrase sound model. Once loaded, recognition of this model can be started and + * stopped. + * + * @param soundModel A PhraseSoundModel structure describing the sound model to load. + * @param callback The callback interface on which the phraseRecognitionCallback() method will + * be called upon completion and modelUnloaded() upon preempted unload. + * @return A unique handle assigned by the HAL for use by the framework when controlling + * activity for this sound model. + * @throws ServiceSpecificException(RESOURCE_CONTENTION) if the model cannot be loaded due + * to resource constraints. This is typically a temporary condition and the client may + * retry after the onResourcesAvailable() global callback is invoked. + */ + int loadPhraseSoundModel(in PhraseSoundModel soundModel, in ISoundTriggerHwCallback callback); + + /** + * Unload a sound model. A sound model may be unloaded to free up resources and make room for a + * new one to overcome implementation limitations. + * This call is idempotent, to avoid any race conditions. + * + * @param modelHandle the handle of the sound model to unload. + */ + void unloadSoundModel(in int modelHandle); + + /** + * Start recognition on a given model. + * This must be called on a model that is in the stopped state. + * The state of this model becomes active and will remain so until explicitly stopped, or a + * recognition event had been delivered to the client. + * + * @param modelHandle the handle of the sound model to use for recognition + * @param deviceHandle The handle of the audio device to be used for recognition, as declared by + * the audio subsystem. + * @param ioHandle A handle assigned by the framework, which will later be used to retrieve + * an audio stream associated with this recognition session. + * @param config A RecognitionConfig structure containing attributes of the recognition to + * perform. + * @throws ServiceSpecificException(RESOURCE_CONTENTION) if the model cannot be started due + * to resource constraints. This is typically a temporary condition and the client may + * retry after the onResourcesAvailable() global callback is invoked. + */ + void startRecognition(in int modelHandle, in int deviceHandle, + in int ioHandle, in RecognitionConfig config); + + /** + * Stop recognition on a given model. + * This call is idempotent, to avoid any race conditions. + * + * @param modelHandle The handle of the sound model to use for recognition + */ + void stopRecognition(in int modelHandle); + + /** + * Request a recognition event to be generated. + * The model must be in the started state and will remain started after the event is sent. + * The model state is returned asynchronously as a RecognitionEvent via the callback that was + * registered upon loading. That event must have a RecognitionStatus.FORCED status. + * + * @param modelHandle The handle of the sound model whose state is being + * queried. + */ + void forceRecognitionEvent(in int modelHandle); + + /** + * Get supported parameter attributes with respect to the provided model handle. + * Model parameters are used to query/control model-specific detection behavior during a + * detection session. + * Along with determining the valid range, this API is also used to determine if a given + * parameter ID is supported at all by the modelHandle for use with getParameter() and + * setParameter() APIs. + * + * @param modelHandle The sound model handle indicating which model to query. + * @param modelParam Parameter to set which will be validated against the ModelParameter type. + * @return This structure indicates supported attributes of the parameter for the given model + * handle. If the parameter is not supported, null is returned. + */ + @nullable ModelParameterRange queryParameter(in int modelHandle, in ModelParameter modelParam); + + /** + * Get a model specific parameter. + * If the value has not been set, a default value is returned. See ModelParameter for parameter + * default values. + * The caller must check if the handle supports the parameter via the queryParameter API prior + * to calling this method. + * + * @param modelHandle The sound model associated with given modelParam + * @param modelParam Parameter to set which will be validated against the ModelParameter type. + * Not putting ModelParameter type directly in the definition and validating internally + * allows for forward compatibility. + * @return Value set to the requested parameter. + */ + int getParameter(in int modelHandle, in ModelParameter modelParam); + + /** + * Set a model specific parameter with the given value. + * This parameter will keep its value for the duration the model is loaded regardless of + * starting and stopping recognition. Once the model is unloaded, the value will be lost. + * The caller must check if the handle supports the parameter via the queryParameter API prior + * to calling this method. + * + * @param modelHandle The sound model handle indicating which model to modify parameters + * @param modelParam Parameter to set which will be validated against the ModelParameter type. + * Not putting ModelParameter type directly in the definition and validating internally + * allows for forward compatibility. + * @param value The value to set for the given model parameter. + */ + void setParameter(in int modelHandle, in ModelParameter modelParam, in int value); +} diff --git a/soundtrigger/aidl/android/hardware/soundtrigger3/ISoundTriggerHwCallback.aidl b/soundtrigger/aidl/android/hardware/soundtrigger3/ISoundTriggerHwCallback.aidl new file mode 100644 index 0000000000..049ca6574a --- /dev/null +++ b/soundtrigger/aidl/android/hardware/soundtrigger3/ISoundTriggerHwCallback.aidl @@ -0,0 +1,59 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.soundtrigger3; + +import android.media.soundtrigger.PhraseRecognitionEvent; +import android.media.soundtrigger.RecognitionEvent; + +/** + * SoundTrigger HAL per-model Callback interface. + */ +@VintfStability +interface ISoundTriggerHwCallback { + /** + * Callback method called by the HAL when a model has been unloaded at the HAL implementation's + * discretion. + * This event may only be delivered when the model state is 'stopped'. + * This event is NOT sent as part of an unload sequence initiated by the client. + * + * @param model The model handle. + */ + void modelUnloaded(in int model); + + /** + * Callback method called by the HAL when the sound recognition triggers for a key phrase sound + * model. + * This event may only be delivered when the model state is 'started'. + * Unless the status of the event is RecognitionStatus.FORCED, this event indicates that the + * state of this model has become 'stopped'. + * + * @param event A RecognitionEvent structure containing detailed results of the recognition + * triggered + */ + void phraseRecognitionCallback(in int model, in PhraseRecognitionEvent event); + + /** + * Callback method called by the HAL when the sound recognition triggers. + * This event may only be delivered when the model state is 'started'. + * Unless the status of the event is RecognitionStatus.FORCED, this event indicates that the + * state of this model has become 'stopped'. + * + * @param event A RecognitionEvent structure containing detailed results of the recognition + * triggered + */ + void recognitionCallback(in int model, in RecognitionEvent event); +} diff --git a/soundtrigger/aidl/android/hardware/soundtrigger3/ISoundTriggerHwGlobalCallback.aidl b/soundtrigger/aidl/android/hardware/soundtrigger3/ISoundTriggerHwGlobalCallback.aidl new file mode 100644 index 0000000000..d6d86308ba --- /dev/null +++ b/soundtrigger/aidl/android/hardware/soundtrigger3/ISoundTriggerHwGlobalCallback.aidl @@ -0,0 +1,34 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.soundtrigger3; + +/** + * SoundTrigger HAL callback interface for events not associated with a particular model. + */ +@VintfStability +interface ISoundTriggerHwGlobalCallback { + /** + * Callback method called by the HAL whenever internal conditions have been made available, such + * that a call that would previously have failed with an -EBUSY status may now succeed. + * There is no guarantee that any call would succeed following this event. It is merely a hint + * to the client that it may retry. + * Conversely, any call that have failed previously with a + * ServiceSpecificException(RESOURCE_CONTENTION) is guaranteed to fail again if retried, until + * this callback is delivered. + */ + void onResourcesAvailable(); +} diff --git a/soundtrigger/aidl/cli/Android.bp b/soundtrigger/aidl/cli/Android.bp new file mode 100644 index 0000000000..e8999ff6b1 --- /dev/null +++ b/soundtrigger/aidl/cli/Android.bp @@ -0,0 +1,17 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "hardware_interfaces_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["hardware_interfaces_license"], +} + +java_binary { + name: "sthal_cli_3", + wrapper: "sthal_cli_3", + srcs: ["java/**/*.java"], + static_libs: [ + "android.hardware.soundtrigger3-V1-java", + ], +} diff --git a/soundtrigger/aidl/cli/OWNERS b/soundtrigger/aidl/cli/OWNERS new file mode 100644 index 0000000000..e21b66ecb3 --- /dev/null +++ b/soundtrigger/aidl/cli/OWNERS @@ -0,0 +1 @@ +include /media/java/android/media/soundtrigger_middleware/OWNERS diff --git a/soundtrigger/aidl/cli/java/android/hardware/soundtrigger3/cli/SthalCli.java b/soundtrigger/aidl/cli/java/android/hardware/soundtrigger3/cli/SthalCli.java new file mode 100644 index 0000000000..d3e1aa7eaa --- /dev/null +++ b/soundtrigger/aidl/cli/java/android/hardware/soundtrigger3/cli/SthalCli.java @@ -0,0 +1,351 @@ +/* + * Copyright 2021 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. + */ +package android.hardware.soundtrigger3.cli; + +import android.annotation.NonNull; +import android.hardware.soundtrigger3.ISoundTriggerHw; +import android.hardware.soundtrigger3.ISoundTriggerHwCallback; +import android.hardware.soundtrigger3.ISoundTriggerHwGlobalCallback; +import android.media.audio.common.AudioConfig; +import android.media.soundtrigger.ConfidenceLevel; +import android.media.soundtrigger.ModelParameterRange; +import android.media.soundtrigger.PhraseRecognitionEvent; +import android.media.soundtrigger.PhraseRecognitionExtra; +import android.media.soundtrigger.PhraseSoundModel; +import android.media.soundtrigger.Properties; +import android.media.soundtrigger.RecognitionConfig; +import android.media.soundtrigger.RecognitionEvent; +import android.media.soundtrigger.RecognitionMode; +import android.media.soundtrigger.SoundModel; +import android.media.soundtrigger.SoundModelType; +import android.os.HwBinder; +import android.os.ParcelFileDescriptor; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.SystemProperties; + +import java.util.Scanner; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * This is a quick-and-dirty sound trigger HAL console mock. + * + * It would only work on userdebug builds. + * + * When this app is started, it will initially: + * - Register a ISoundTriggerHw HAL with an instance name "mock". + * - Set a sysprop that tells SoundTriggerMiddlewareService to try to connect to the mock instance + * rather than the default one. + * - Reboot the real (default) HAL. + * + * In response to that, SoundTriggerMiddlewareService is going to connect to the mock HAL and resume + * normal operation. + * + * Our mock HAL will print to stdout every call it receives as well as expose a basic set of + * operations for sending event callbacks to the client. This allows us to simulate the frameworks + * behavior in response to different HAL behaviors. + */ +public class SthalCli { + private static SoundTriggerImpl mService; + private static final Scanner scanner = new Scanner(System.in); + + public static void main(String[] args) { + try { + printUsage(); + + System.out.println("Registering mock STHAL"); + mService = new SoundTriggerImpl(); + // This allows us to register the service, even if it is not declared in the manifest. + mService.forceDowngradeToSystemStability(); + ServiceManager.addService(ISoundTriggerHw.class.getCanonicalName() + "/mock", mService); + + System.out.println("Rebooting STHAL"); + SystemProperties.set("debug.soundtrigger_middleware.use_mock_hal", "3"); + SystemProperties.set("sys.audio.restart.hal", "1"); + + while (processCommand()) ; + } catch (Exception e) { + e.printStackTrace(); + } finally { + cleanup(); + } + } + + private static void cleanup() { + System.out.println("Cleaning up."); + SystemProperties.set("debug.soundtrigger_middleware.use_mock_hal", null); + HwBinder.setTrebleTestingOverride(false); + } + + private static boolean processCommand() { + String line = scanner.nextLine(); + String[] tokens = line.split("\\s+"); + if (tokens.length < 1) { + return false; + } + switch (tokens[0]) { + case "q": + return false; + + case "a": + mService.sendOnResourcesAvailable(); + return true; + + case "u": + mService.sendModelUnloaded(Integer.parseInt(tokens[1])); + return true; + + case "r": + mService.sendRecognitionEvent(Integer.parseInt(tokens[1]), + Integer.parseInt(tokens[2])); + return true; + + case "p": + mService.sendPhraseRecognitionEvent(Integer.parseInt(tokens[1]), + Integer.parseInt(tokens[2])); + return true; + + case "d": + mService.dumpModels(); + return true; + + default: + printUsage(); + return true; + } + } + + private static void printUsage() { + System.out.print( + "Sound Trigger HAL v3 mock\n" + + "Available commands:\n" + + "h - help\n" + + "q - quit\n" + + "a - send onResourcesAvailable event\n" + + "u <model> - send modelUnloaded event\n" + + "r <model> <status> - send recognitionEvent\n" + + "p <model> <status> - send phraseRecognitionEvent\n" + + "d - dump models\n"); + } + + private static class SoundTriggerImpl extends ISoundTriggerHw.Stub { + static class Model { + final ISoundTriggerHwCallback callback; + final SoundModel model; + final PhraseSoundModel phraseModel; + public RecognitionConfig config = null; + + Model(ISoundTriggerHwCallback callback, SoundModel model) { + this.callback = callback; + this.model = model; + this.phraseModel = null; + } + + Model(ISoundTriggerHwCallback callback, PhraseSoundModel model) { + this.callback = callback; + this.model = null; + this.phraseModel = model; + } + } + + private ISoundTriggerHwGlobalCallback mGlobalCallback; + private final ConcurrentMap<Integer, Model> mLoadedModels = new ConcurrentHashMap<>(); + private int mHandleCounter = 1; + + public void dumpModels() { + mLoadedModels.forEach((handle, model) -> { + System.out.println("+++ Model " + handle); + System.out.println(" config = " + model.config); + RecognitionConfig recognitionConfig = model.config; + if (recognitionConfig != null) { + System.out.println(" ACTIVE recognitionConfig = " + recognitionConfig); + } else { + System.out.println(" INACTIVE"); + } + }); + } + + public void sendOnResourcesAvailable() { + if (mGlobalCallback != null) { + try { + mGlobalCallback.onResourcesAvailable(); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + } + + public void sendRecognitionEvent(int modelHandle, int status) { + Model model = mLoadedModels.get(modelHandle); + if (model != null && model.config != null) { + RecognitionEvent event = new RecognitionEvent(); + event.type = SoundModelType.GENERIC; + event.status = status; + event.captureAvailable = true; + event.audioConfig.channelMask = 16; + event.audioConfig.format = 1; + event.audioConfig.sampleRateHz = 16000; + try { + model.callback.recognitionCallback(modelHandle, event); + } catch (RemoteException e) { + e.printStackTrace(); + } + model.config = null; + } + } + + public void sendPhraseRecognitionEvent(int modelHandle, int status) { + Model model = mLoadedModels.get(modelHandle); + if (model != null && model.config != null) { + PhraseRecognitionEvent event = new PhraseRecognitionEvent(); + event.common = new RecognitionEvent(); + event.common.type = SoundModelType.KEYPHRASE; + event.common.status = status; + event.common.captureAvailable = true; + event.common.audioConfig = new AudioConfig(); + event.common.audioConfig.channelMask = 16; + event.common.audioConfig.format = 1; + event.common.audioConfig.sampleRateHz = 16000; + if (model.phraseModel.phrases.length > 0) { + PhraseRecognitionExtra extra = new PhraseRecognitionExtra(); + extra.id = model.phraseModel.phrases[0].id; + extra.confidenceLevel = 100; + extra.recognitionModes = model.phraseModel.phrases[0].recognitionModes; + extra.levels = new ConfidenceLevel[0]; + event.phraseExtras = new PhraseRecognitionExtra[]{extra}; + } else { + event.phraseExtras = new PhraseRecognitionExtra[0]; + } + try { + model.callback.phraseRecognitionCallback(modelHandle, event); + } catch (RemoteException e) { + e.printStackTrace(); + } + model.config = null; + } + } + + public void sendModelUnloaded(int modelHandle) { + Model model = mLoadedModels.remove(modelHandle); + if (model != null) { + try { + model.callback.modelUnloaded(modelHandle); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + } + + @Override + public void registerGlobalCallback(ISoundTriggerHwGlobalCallback callback) { + System.out.println("registerGlobalCallback()"); + mGlobalCallback = callback; + } + + @Override + public int loadSoundModel(SoundModel soundModel, ISoundTriggerHwCallback callback) { + int handle = mHandleCounter++; + System.out.printf("loadSoundModel(soundModel=%s) -> %d%n", soundModel, handle); + mLoadedModels.put(handle, new Model(callback, soundModel)); + return handle; + } + + @Override + public int loadPhraseSoundModel(PhraseSoundModel soundModel, + ISoundTriggerHwCallback callback) { + int handle = mHandleCounter++; + System.out.printf("loadPhraseSoundModel(soundModel=%s) -> %d%n", soundModel, handle); + mLoadedModels.put(handle, new Model(callback, soundModel)); + return handle; + } + + @Override + public void startRecognition(int modelHandle, int deviceHandle, int ioHandle, + RecognitionConfig config) { + System.out.printf("startRecognition(modelHandle=%d, deviceHandle=%d, ioHandle=%d)%n", + modelHandle, deviceHandle, ioHandle); + Model model = mLoadedModels.get(modelHandle); + if (model != null) { + model.config = config; + } + } + + @Override + public Properties getProperties() { + System.out.println("getProperties()"); + Properties properties = new Properties(); + properties.implementor = "Android"; + properties.description = "Mock STHAL"; + properties.maxSoundModels = 2; + properties.maxKeyPhrases = 1; + properties.recognitionModes = + RecognitionMode.VOICE_TRIGGER | RecognitionMode.GENERIC_TRIGGER; + return properties; + } + + @Override + public ModelParameterRange queryParameter(int modelHandle, int modelParam) { + System.out.printf("queryParameter(modelHandle=%d, modelParam=%d)%n", modelHandle, + modelParam); + return null; + } + + @Override + public void forceRecognitionEvent(int modelHandle) { + System.out.printf("getModelState(modelHandle=%d)%n", modelHandle); + } + + @Override + public void unloadSoundModel(int modelHandle) { + System.out.printf("unloadSoundModel(modelHandle=%d)%n", modelHandle); + } + + @Override + public void stopRecognition(int modelHandle) { + System.out.printf("stopRecognition(modelHandle=%d)%n", modelHandle); + Model model = mLoadedModels.get(modelHandle); + if (model != null) { + model.config = null; + } + } + + @Override + public int handleShellCommand(@NonNull ParcelFileDescriptor in, + @NonNull ParcelFileDescriptor out, @NonNull ParcelFileDescriptor err, + @NonNull String[] args) { + if (args.length > 0) { + switch (args[0]) { + case "reboot": + System.out.println("Received a reboot request. Exiting."); + cleanup(); + System.exit(1); + } + } + return 0; + } + + @Override + public void setParameter(int modelHandle, int modelParam, int value) { + throw new IllegalArgumentException(); + } + + @Override + public int getParameter(int modelHandle, int modelParam) { + throw new IllegalArgumentException(); + } + } +} diff --git a/soundtrigger/aidl/cli/sthal_cli_3 b/soundtrigger/aidl/cli/sthal_cli_3 new file mode 100644 index 0000000000..f157c50276 --- /dev/null +++ b/soundtrigger/aidl/cli/sthal_cli_3 @@ -0,0 +1,6 @@ +#!/system/bin/sh +# Script to start "sthal_cli_3" on the device +# +base=/system +export CLASSPATH=$base/framework/sthal_cli_3.jar +exec app_process $base/bin android.hardware.soundtrigger3.cli.SthalCli "$@" diff --git a/tests/extension/vibrator/aidl/client/Android.bp b/tests/extension/vibrator/aidl/client/Android.bp index afab263b82..284ac7459b 100644 --- a/tests/extension/vibrator/aidl/client/Android.bp +++ b/tests/extension/vibrator/aidl/client/Android.bp @@ -27,7 +27,7 @@ cc_test { "android.hardware.tests.extension.vibrator-V1-cpp", "libbinder_ndk", - "android.hardware.vibrator-V2-ndk_platform", - "android.hardware.tests.extension.vibrator-V1-ndk_platform", + "android.hardware.vibrator-V2-ndk", + "android.hardware.tests.extension.vibrator-V1-ndk", ], } diff --git a/tests/extension/vibrator/aidl/default/Android.bp b/tests/extension/vibrator/aidl/default/Android.bp index a200292330..0f3895f8de 100644 --- a/tests/extension/vibrator/aidl/default/Android.bp +++ b/tests/extension/vibrator/aidl/default/Android.bp @@ -28,7 +28,7 @@ cc_binary { shared_libs: [ "libbase", "libbinder_ndk", - "android.hardware.vibrator-V2-ndk_platform", - "android.hardware.tests.extension.vibrator-V2-ndk_platform", + "android.hardware.vibrator-V2-ndk", + "android.hardware.tests.extension.vibrator-V2-ndk", ], } diff --git a/tests/lazy_cb/1.0/.hidl_for_system_ext b/tests/lazy_cb/1.0/.hidl_for_system_ext new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/lazy_cb/1.0/.hidl_for_system_ext diff --git a/tests/lazy_cb/1.0/Android.bp b/tests/lazy_cb/1.0/Android.bp new file mode 100644 index 0000000000..4d82b63155 --- /dev/null +++ b/tests/lazy_cb/1.0/Android.bp @@ -0,0 +1,23 @@ +// This file is autogenerated by hidl-gen -Landroidbp. + +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "hardware_interfaces_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["hardware_interfaces_license"], +} + +hidl_interface { + name: "android.hardware.tests.lazy_cb@1.0", + root: "android.hardware", + system_ext_specific: true, + srcs: [ + "ILazyCb.hal", + ], + interfaces: [ + "android.hidl.base@1.0", + ], + gen_java: true, +} diff --git a/tests/lazy_cb/1.0/ILazyCb.hal b/tests/lazy_cb/1.0/ILazyCb.hal new file mode 100644 index 0000000000..a9046b3353 --- /dev/null +++ b/tests/lazy_cb/1.0/ILazyCb.hal @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2021 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. + */ + +package android.hardware.tests.lazy_cb@1.0; + +interface ILazyCb { + /** + * Set the eventfd used to notify that the active services + * callback is being executed and is about to terminate the process. + */ + setEventFd(handle fds) generates (bool success); +}; diff --git a/tests/msgq/1.0/default/Android.bp b/tests/msgq/1.0/default/Android.bp index 5f116e7371..75973fcdea 100644 --- a/tests/msgq/1.0/default/Android.bp +++ b/tests/msgq/1.0/default/Android.bp @@ -100,10 +100,10 @@ cc_test { // These are static libs only for testing purposes and portability. Shared // libs should be used on device. static_libs: [ - "android.hardware.common-V2-ndk_platform", - "android.hardware.common.fmq-V1-ndk_platform", + "android.hardware.common-V2-ndk", + "android.hardware.common.fmq-V1-ndk", "android.hardware.tests.msgq@1.0", - "android.fmq.test-ndk_platform", + "android.fmq.test-ndk", ], whole_static_libs: [ "android.hardware.tests.msgq@1.0-impl", diff --git a/tv/cec/1.0/default/Android.bp b/tv/cec/1.0/default/Android.bp index fc4298d86c..b4053dfe1d 100644 --- a/tv/cec/1.0/default/Android.bp +++ b/tv/cec/1.0/default/Android.bp @@ -12,12 +12,16 @@ cc_library_shared { defaults: ["hidl_defaults"], vendor: true, relative_install_path: "hw", - srcs: ["HdmiCec.cpp"], + srcs: [ + "HdmiCec.cpp", + "HdmiCecDefault.cpp", + ], shared_libs: [ "libhidlbase", "liblog", "libbase", + "libcutils", "libutils", "libhardware", "android.hardware.tv.cec@1.0", diff --git a/tv/cec/1.0/default/HdmiCec.cpp b/tv/cec/1.0/default/HdmiCec.cpp index 171bdfe04f..74de785e81 100644 --- a/tv/cec/1.0/default/HdmiCec.cpp +++ b/tv/cec/1.0/default/HdmiCec.cpp @@ -20,6 +20,7 @@ #include <hardware/hardware.h> #include <hardware/hdmi_cec.h> #include "HdmiCec.h" +#include "HdmiCecDefault.h" namespace android { namespace hardware { @@ -390,6 +391,15 @@ Return<bool> HdmiCec::isConnected(int32_t portId) { return mDevice->is_connected(mDevice, portId) > 0; } +IHdmiCec* getHdmiCecDefault() { + HdmiCecDefault* hdmiCecDefault = new HdmiCecDefault(); + Result result = hdmiCecDefault->init(); + if (result == Result::SUCCESS) { + return hdmiCecDefault; + } + LOG(ERROR) << "Failed to load default HAL."; + return nullptr; +} IHdmiCec* HIDL_FETCH_IHdmiCec(const char* hal) { hdmi_cec_device_t* hdmi_cec_device; @@ -410,7 +420,7 @@ IHdmiCec* HIDL_FETCH_IHdmiCec(const char* hal) { return new HdmiCec(hdmi_cec_device); } else { LOG(ERROR) << "Passthrough failed to load legacy HAL."; - return nullptr; + return getHdmiCecDefault(); } } diff --git a/tv/cec/1.0/default/HdmiCecDefault.cpp b/tv/cec/1.0/default/HdmiCecDefault.cpp new file mode 100644 index 0000000000..299bcf0c06 --- /dev/null +++ b/tv/cec/1.0/default/HdmiCecDefault.cpp @@ -0,0 +1,461 @@ +/* + * Copyright (C) 2021 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. + */ + +#define LOG_TAG "android.hardware.tv.cec@1.0-impl" +#include <android-base/logging.h> + +#include <cutils/properties.h> +#include <errno.h> +#include <fcntl.h> +#include <linux/cec.h> +#include <linux/ioctl.h> +#include <poll.h> +#include <pthread.h> +#include <sys/eventfd.h> +#include <algorithm> + +#include "HdmiCecDefault.h" + +namespace android { +namespace hardware { +namespace tv { +namespace cec { +namespace V1_0 { +namespace implementation { + +// When set to false, all the CEC commands are discarded. True by default after initialization. +bool mCecEnabled; +/* + * When set to false, HAL does not wake up the system upon receiving <Image View On> or + * <Text View On>. True by default after initialization. + */ +bool mWakeupEnabled; + +int mCecFd; +int mExitFd; +pthread_t mEventThread; +sp<IHdmiCecCallback> mCallback; + +HdmiCecDefault::HdmiCecDefault() { + mCecFd = -1; + mExitFd = -1; + mCecEnabled = false; + mWakeupEnabled = false; + mCallback = nullptr; +} + +HdmiCecDefault::~HdmiCecDefault() { + release(); +} + +// Methods from ::android::hardware::tv::cec::V1_0::IHdmiCec follow. +Return<Result> HdmiCecDefault::addLogicalAddress(CecLogicalAddress addr) { + if (addr < CecLogicalAddress::TV || addr >= CecLogicalAddress::BROADCAST) { + LOG(ERROR) << "Add logical address failed, Invalid address"; + return Result::FAILURE_INVALID_ARGS; + } + + struct cec_log_addrs cecLogAddrs; + int ret = ioctl(mCecFd, CEC_ADAP_G_LOG_ADDRS, &cecLogAddrs); + if (ret) { + LOG(ERROR) << "Add logical address failed, Error = " << strerror(errno); + return Result::FAILURE_BUSY; + } + + cecLogAddrs.cec_version = getCecVersion(); + cecLogAddrs.vendor_id = getVendorId(); + + unsigned int logAddrType = CEC_LOG_ADDR_TYPE_UNREGISTERED; + unsigned int allDevTypes = 0; + unsigned int primDevType = 0xff; + switch (addr) { + case CecLogicalAddress::TV: + primDevType = CEC_OP_PRIM_DEVTYPE_TV; + logAddrType = CEC_LOG_ADDR_TYPE_TV; + allDevTypes = CEC_OP_ALL_DEVTYPE_TV; + break; + case CecLogicalAddress::RECORDER_1: + case CecLogicalAddress::RECORDER_2: + case CecLogicalAddress::RECORDER_3: + primDevType = CEC_OP_PRIM_DEVTYPE_RECORD; + logAddrType = CEC_LOG_ADDR_TYPE_RECORD; + allDevTypes = CEC_OP_ALL_DEVTYPE_RECORD; + break; + case CecLogicalAddress::TUNER_1: + case CecLogicalAddress::TUNER_2: + case CecLogicalAddress::TUNER_3: + case CecLogicalAddress::TUNER_4: + primDevType = CEC_OP_PRIM_DEVTYPE_TUNER; + logAddrType = CEC_LOG_ADDR_TYPE_TUNER; + allDevTypes = CEC_OP_ALL_DEVTYPE_TUNER; + break; + case CecLogicalAddress::PLAYBACK_1: + case CecLogicalAddress::PLAYBACK_2: + case CecLogicalAddress::PLAYBACK_3: + primDevType = CEC_OP_PRIM_DEVTYPE_PLAYBACK; + logAddrType = CEC_LOG_ADDR_TYPE_PLAYBACK; + allDevTypes = CEC_OP_ALL_DEVTYPE_PLAYBACK; + cecLogAddrs.flags |= CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU; + break; + case CecLogicalAddress::AUDIO_SYSTEM: + primDevType = CEC_OP_PRIM_DEVTYPE_AUDIOSYSTEM; + logAddrType = CEC_LOG_ADDR_TYPE_AUDIOSYSTEM; + allDevTypes = CEC_OP_ALL_DEVTYPE_AUDIOSYSTEM; + break; + case CecLogicalAddress::FREE_USE: + primDevType = CEC_OP_PRIM_DEVTYPE_PROCESSOR; + logAddrType = CEC_LOG_ADDR_TYPE_SPECIFIC; + allDevTypes = CEC_OP_ALL_DEVTYPE_SWITCH; + break; + case CecLogicalAddress::UNREGISTERED: + cecLogAddrs.flags |= CEC_LOG_ADDRS_FL_ALLOW_UNREG_FALLBACK; + break; + } + + int logAddrIndex = cecLogAddrs.num_log_addrs; + + cecLogAddrs.num_log_addrs += 1; + cecLogAddrs.log_addr[logAddrIndex] = static_cast<cec_logical_address_t>(addr); + cecLogAddrs.log_addr_type[logAddrIndex] = logAddrType; + cecLogAddrs.primary_device_type[logAddrIndex] = primDevType; + cecLogAddrs.all_device_types[logAddrIndex] = allDevTypes; + cecLogAddrs.features[logAddrIndex][0] = 0; + cecLogAddrs.features[logAddrIndex][1] = 0; + + ret = ioctl(mCecFd, CEC_ADAP_S_LOG_ADDRS, &cecLogAddrs); + if (ret) { + LOG(ERROR) << "Add logical address failed, Error = " << strerror(errno); + return Result::FAILURE_BUSY; + } + return Result::SUCCESS; +} + +Return<void> HdmiCecDefault::clearLogicalAddress() { + struct cec_log_addrs cecLogAddrs; + memset(&cecLogAddrs, 0, sizeof(cecLogAddrs)); + int ret = ioctl(mCecFd, CEC_ADAP_S_LOG_ADDRS, &cecLogAddrs); + if (ret) { + LOG(ERROR) << "Clear logical Address failed, Error = " << strerror(errno); + } + return Void(); +} + +Return<void> HdmiCecDefault::getPhysicalAddress(getPhysicalAddress_cb callback) { + uint16_t addr; + int ret = ioctl(mCecFd, CEC_ADAP_G_PHYS_ADDR, &addr); + if (ret) { + LOG(ERROR) << "Get physical address failed, Error = " << strerror(errno); + callback(Result::FAILURE_INVALID_STATE, addr); + return Void(); + } + callback(Result::SUCCESS, addr); + return Void(); +} + +Return<SendMessageResult> HdmiCecDefault::sendMessage(const CecMessage& message) { + if (!mCecEnabled) { + return SendMessageResult::FAIL; + } + + struct cec_msg cecMsg; + memset(&cecMsg, 0, sizeof(cec_msg)); + + int initiator = static_cast<cec_logical_address_t>(message.initiator); + int destination = static_cast<cec_logical_address_t>(message.destination); + + cecMsg.msg[0] = (initiator << 4) | destination; + for (size_t i = 0; i < message.body.size(); ++i) { + cecMsg.msg[i + 1] = message.body[i]; + } + cecMsg.len = message.body.size() + 1; + + int ret = ioctl(mCecFd, CEC_TRANSMIT, &cecMsg); + + if (ret) { + LOG(ERROR) << "Send message failed, Error = " << strerror(errno); + return SendMessageResult::FAIL; + } + + if (cecMsg.tx_status != CEC_TX_STATUS_OK) { + LOG(ERROR) << "Send message tx_status = " << cecMsg.tx_status; + } + + switch (cecMsg.tx_status) { + case CEC_TX_STATUS_OK: + return SendMessageResult::SUCCESS; + case CEC_TX_STATUS_ARB_LOST: + return SendMessageResult::BUSY; + case CEC_TX_STATUS_NACK: + return SendMessageResult::NACK; + default: + return SendMessageResult::FAIL; + } +} + +Return<void> HdmiCecDefault::setCallback(const sp<IHdmiCecCallback>& callback) { + if (mCallback != nullptr) { + mCallback->unlinkToDeath(this); + mCallback = nullptr; + } + + if (callback != nullptr) { + mCallback = callback; + mCallback->linkToDeath(this, 0 /*cookie*/); + } + return Void(); +} + +Return<int32_t> HdmiCecDefault::getCecVersion() { + return property_get_int32("ro.hdmi.cec_version", CEC_OP_CEC_VERSION_1_4); +} + +Return<uint32_t> HdmiCecDefault::getVendorId() { + return property_get_int32("ro.hdmi.vendor_id", 0x000c03 /* HDMI LLC vendor ID */); +} + +Return<void> HdmiCecDefault::getPortInfo(getPortInfo_cb callback) { + uint16_t addr; + int ret = ioctl(mCecFd, CEC_ADAP_G_PHYS_ADDR, &addr); + if (ret) { + LOG(ERROR) << "Get port info failed, Error = " << strerror(errno); + } + + unsigned int type = property_get_int32("ro.hdmi.device_type", CEC_DEVICE_PLAYBACK); + hidl_vec<HdmiPortInfo> portInfos(1); + portInfos[0] = {.type = (type == CEC_DEVICE_TV ? HdmiPortType::INPUT : HdmiPortType::OUTPUT), + .portId = 1, + .cecSupported = true, + .arcSupported = false, + .physicalAddress = addr}; + callback(portInfos); + return Void(); +} + +Return<void> HdmiCecDefault::setOption(OptionKey key, bool value) { + switch (key) { + case OptionKey::ENABLE_CEC: + LOG(DEBUG) << "setOption: Enable CEC: " << value; + mCecEnabled = value; + break; + case OptionKey::WAKEUP: + LOG(DEBUG) << "setOption: WAKEUP: " << value; + mWakeupEnabled = value; + break; + default: + break; + } + return Void(); +} + +Return<void> HdmiCecDefault::setLanguage(const hidl_string& /*language*/) { + return Void(); +} + +Return<void> HdmiCecDefault::enableAudioReturnChannel(int32_t /*portId*/, bool /*enable*/) { + return Void(); +} + +Return<bool> HdmiCecDefault::isConnected(int32_t /*portId*/) { + uint16_t addr; + int ret = ioctl(mCecFd, CEC_ADAP_G_PHYS_ADDR, &addr); + if (ret) { + LOG(ERROR) << "Is connected failed, Error = " << strerror(errno); + return false; + } + if (addr == CEC_PHYS_ADDR_INVALID) { + return false; + } + return true; +} + +// Initialise the cec file descriptor +Return<Result> HdmiCecDefault::init() { + const char* path = "/dev/cec0"; + mCecFd = open(path, O_RDWR); + if (mCecFd < 0) { + LOG(ERROR) << "Failed to open " << path << ", Error = " << strerror(errno); + return Result::FAILURE_NOT_SUPPORTED; + } + mExitFd = eventfd(0, EFD_NONBLOCK); + if (mExitFd < 0) { + LOG(ERROR) << "Failed to open eventfd, Error = " << strerror(errno); + release(); + return Result::FAILURE_NOT_SUPPORTED; + } + + // Ensure the CEC device supports required capabilities + struct cec_caps caps = {}; + int ret = ioctl(mCecFd, CEC_ADAP_G_CAPS, &caps); + if (ret) { + LOG(ERROR) << "Unable to query cec adapter capabilities, Error = " << strerror(errno); + release(); + return Result::FAILURE_NOT_SUPPORTED; + } + + if (!(caps.capabilities & (CEC_CAP_LOG_ADDRS | CEC_CAP_TRANSMIT | CEC_CAP_PASSTHROUGH))) { + LOG(ERROR) << "Wrong cec adapter capabilities " << caps.capabilities; + release(); + return Result::FAILURE_NOT_SUPPORTED; + } + + uint32_t mode = CEC_MODE_INITIATOR | CEC_MODE_EXCL_FOLLOWER_PASSTHRU; + ret = ioctl(mCecFd, CEC_S_MODE, &mode); + if (ret) { + LOG(ERROR) << "Unable to set initiator mode, Error = " << strerror(errno); + release(); + return Result::FAILURE_NOT_SUPPORTED; + } + + /* thread loop for receiving cec messages and hotplug events*/ + if (pthread_create(&mEventThread, NULL, event_thread, NULL)) { + LOG(ERROR) << "Can't create event thread: " << strerror(errno); + release(); + return Result::FAILURE_NOT_SUPPORTED; + } + + mCecEnabled = true; + mWakeupEnabled = true; + return Result::SUCCESS; +} + +Return<void> HdmiCecDefault::release() { + if (mExitFd > 0) { + uint64_t tmp = 1; + write(mExitFd, &tmp, sizeof(tmp)); + pthread_join(mEventThread, NULL); + } + if (mExitFd > 0) { + close(mExitFd); + } + if (mCecFd > 0) { + close(mCecFd); + } + mCecEnabled = false; + mWakeupEnabled = false; + setCallback(nullptr); + return Void(); +} + +void* HdmiCecDefault::event_thread(void*) { + struct pollfd ufds[3] = { + {mCecFd, POLLIN, 0}, + {mCecFd, POLLERR, 0}, + {mExitFd, POLLIN, 0}, + }; + + while (1) { + ufds[0].revents = 0; + ufds[1].revents = 0; + ufds[2].revents = 0; + + int ret = poll(ufds, /* size(ufds) = */ 3, /* timeout = */ -1); + + if (ret <= 0) { + continue; + } + + if (ufds[2].revents == POLLIN) { /* Exit */ + break; + } + + if (ufds[1].revents == POLLERR) { /* CEC Event */ + struct cec_event ev; + ret = ioctl(mCecFd, CEC_DQEVENT, &ev); + + if (!mCecEnabled) { + continue; + } + + if (ret) { + LOG(ERROR) << "CEC_DQEVENT failed, Error = " << strerror(errno); + continue; + } + + if (ev.event == CEC_EVENT_STATE_CHANGE) { + if (mCallback != nullptr) { + HotplugEvent hotplugEvent{ + .connected = (ev.state_change.phys_addr != CEC_PHYS_ADDR_INVALID), + .portId = 1}; + mCallback->onHotplugEvent(hotplugEvent); + } else { + LOG(ERROR) << "No event callback for hotplug"; + } + } + } + + if (ufds[0].revents == POLLIN) { /* CEC Driver */ + struct cec_msg msg = {}; + ret = ioctl(mCecFd, CEC_RECEIVE, &msg); + + if (!mCecEnabled) { + continue; + } + + if (ret) { + LOG(ERROR) << "CEC_RECEIVE failed, Error = " << strerror(errno); + continue; + } + + if (msg.rx_status != CEC_RX_STATUS_OK) { + LOG(ERROR) << "msg rx_status = " << msg.rx_status; + continue; + } + + if (!mWakeupEnabled && isWakeupMessage(msg)) { + LOG(DEBUG) << "Filter wakeup message"; + continue; + } + + if (mCallback != nullptr) { + size_t length = std::min(msg.len - 1, (uint32_t)MaxLength::MESSAGE_BODY); + CecMessage cecMessage{ + .initiator = static_cast<CecLogicalAddress>(msg.msg[0] >> 4), + .destination = static_cast<CecLogicalAddress>(msg.msg[0] & 0xf), + }; + cecMessage.body.resize(length); + for (size_t i = 0; i < length; ++i) { + cecMessage.body[i] = static_cast<uint8_t>(msg.msg[i + 1]); + } + mCallback->onCecMessage(cecMessage); + } else { + LOG(ERROR) << "no event callback for message"; + } + } + } + return NULL; +} + +int HdmiCecDefault::getOpcode(struct cec_msg message) { + return (static_cast<uint8_t>(message.msg[1]) & 0xff); +} + +bool HdmiCecDefault::isWakeupMessage(struct cec_msg message) { + int opcode = getOpcode(message); + switch (opcode) { + case CEC_MESSAGE_TEXT_VIEW_ON: + case CEC_MESSAGE_IMAGE_VIEW_ON: + return true; + default: + return false; + } +} + +} // namespace implementation +} // namespace V1_0 +} // namespace cec +} // namespace tv +} // namespace hardware +} // namespace android diff --git a/tv/cec/1.0/default/HdmiCecDefault.h b/tv/cec/1.0/default/HdmiCecDefault.h new file mode 100644 index 0000000000..c1bb2c74d0 --- /dev/null +++ b/tv/cec/1.0/default/HdmiCecDefault.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2021 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 <android/hardware/tv/cec/1.0/IHdmiCec.h> +#include <hardware/hdmi_cec.h> + +namespace android { +namespace hardware { +namespace tv { +namespace cec { +namespace V1_0 { +namespace implementation { + +struct HdmiCecDefault : public IHdmiCec, public hidl_death_recipient { + HdmiCecDefault(); + ~HdmiCecDefault(); + // Methods from ::android::hardware::tv::cec::V1_0::IHdmiCec follow. + Return<Result> addLogicalAddress(CecLogicalAddress addr) override; + Return<void> clearLogicalAddress() override; + Return<void> getPhysicalAddress(getPhysicalAddress_cb _hidl_cb) override; + Return<SendMessageResult> sendMessage(const CecMessage& message) override; + Return<void> setCallback(const sp<IHdmiCecCallback>& callback) override; + Return<int32_t> getCecVersion() override; + Return<uint32_t> getVendorId() override; + Return<void> getPortInfo(getPortInfo_cb _hidl_cb) override; + Return<void> setOption(OptionKey key, bool value) override; + Return<void> setLanguage(const hidl_string& language) override; + Return<void> enableAudioReturnChannel(int32_t portId, bool enable) override; + Return<bool> isConnected(int32_t portId) override; + + virtual void serviceDied(uint64_t, const wp<::android::hidl::base::V1_0::IBase>&) { + setCallback(nullptr); + } + + Return<Result> init(); + Return<void> release(); + static void* event_thread(void*); + static int getOpcode(struct cec_msg message); + static bool isWakeupMessage(struct cec_msg message); +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace cec +} // namespace tv +} // namespace hardware +} // namespace android diff --git a/tv/cec/1.0/default/OWNERS b/tv/cec/1.0/default/OWNERS new file mode 100644 index 0000000000..c1d3f1d4b9 --- /dev/null +++ b/tv/cec/1.0/default/OWNERS @@ -0,0 +1 @@ +include platform/frameworks/base:/core/java/android/hardware/hdmi/OWNERS diff --git a/tv/tuner/1.0/default/Dvr.cpp b/tv/tuner/1.0/default/Dvr.cpp index c3edac973e..40879f2041 100644 --- a/tv/tuner/1.0/default/Dvr.cpp +++ b/tv/tuner/1.0/default/Dvr.cpp @@ -37,7 +37,10 @@ Dvr::Dvr(DvrType type, uint32_t bufferSize, const sp<IDvrCallback>& cb, sp<Demux mDemux = demux; } -Dvr::~Dvr() {} +Dvr::~Dvr() { + // make sure thread has joined + close(); +} Return<void> Dvr::getQueueDesc(getQueueDesc_cb _hidl_cb) { ALOGV("%s", __FUNCTION__); @@ -112,8 +115,7 @@ Return<Result> Dvr::start() { } if (mType == DvrType::PLAYBACK) { - pthread_create(&mDvrThread, NULL, __threadLoopPlayback, this); - pthread_setname_np(mDvrThread, "playback_waiting_loop"); + mDvrThread = std::thread(&Dvr::playbackThreadLoop, this); } else if (mType == DvrType::RECORD) { mRecordStatus = RecordStatus::DATA_READY; mDemux->setIsRecording(mType == DvrType::RECORD); @@ -128,10 +130,11 @@ Return<Result> Dvr::stop() { ALOGV("%s", __FUNCTION__); mDvrThreadRunning = false; - - lock_guard<mutex> lock(mDvrThreadLock); - - mIsRecordStarted = false; + if (mDvrThread.joinable()) { + mDvrThread.join(); + } + // thread should always be joinable if it is running, + // so it should be safe to assume recording stopped. mDemux->setIsRecording(false); return Result::SUCCESS; @@ -147,7 +150,7 @@ Return<Result> Dvr::flush() { Return<Result> Dvr::close() { ALOGV("%s", __FUNCTION__); - + stop(); return Result::SUCCESS; } @@ -174,15 +177,8 @@ EventFlag* Dvr::getDvrEventFlag() { return mDvrEventFlag; } -void* Dvr::__threadLoopPlayback(void* user) { - Dvr* const self = static_cast<Dvr*>(user); - self->playbackThreadLoop(); - return 0; -} - void Dvr::playbackThreadLoop() { ALOGD("[Dvr] playback threadLoop start."); - lock_guard<mutex> lock(mDvrThreadLock); mDvrThreadRunning = true; while (mDvrThreadRunning) { diff --git a/tv/tuner/1.0/default/Dvr.h b/tv/tuner/1.0/default/Dvr.h index 30695866ca..fd7fba2c0a 100644 --- a/tv/tuner/1.0/default/Dvr.h +++ b/tv/tuner/1.0/default/Dvr.h @@ -20,7 +20,9 @@ #include <android/hardware/tv/tuner/1.0/IDvr.h> #include <fmq/MessageQueue.h> #include <math.h> +#include <atomic> #include <set> +#include <thread> #include "Demux.h" #include "Frontend.h" #include "Tuner.h" @@ -119,10 +121,7 @@ class Dvr : public IDvr { * Each filter handler handles the data filtering/output writing/filterEvent updating. */ void startTpidFilter(vector<uint8_t> data); - static void* __threadLoopPlayback(void* user); - static void* __threadLoopRecord(void* user); void playbackThreadLoop(); - void recordThreadLoop(); unique_ptr<DvrMQ> mDvrMQ; EventFlag* mDvrEventFlag; @@ -133,7 +132,7 @@ class Dvr : public IDvr { DvrSettings mDvrSettings; // Thread handlers - pthread_t mDvrThread; + std::thread mDvrThread; // FMQ status local records PlaybackStatus mPlaybackStatus; @@ -141,7 +140,7 @@ class Dvr : public IDvr { /** * If a specific filter's writing loop is still running */ - bool mDvrThreadRunning; + std::atomic<bool> mDvrThreadRunning; bool mKeepFetchingDataFromFrontend; /** * Lock to protect writes to the FMQs @@ -152,13 +151,8 @@ class Dvr : public IDvr { */ std::mutex mPlaybackStatusLock; std::mutex mRecordStatusLock; - std::mutex mDvrThreadLock; const bool DEBUG_DVR = false; - - // Booleans to check if recording is running. - // Recording is ready when both of the following are set to true. - bool mIsRecordStarted = false; }; } // namespace implementation @@ -168,4 +162,4 @@ class Dvr : public IDvr { } // namespace hardware } // namespace android -#endif // ANDROID_HARDWARE_TV_TUNER_V1_0_DVR_H_
\ No newline at end of file +#endif // ANDROID_HARDWARE_TV_TUNER_V1_0_DVR_H_ diff --git a/tv/tuner/1.0/default/android.hardware.tv.tuner@1.0-service-lazy.rc b/tv/tuner/1.0/default/android.hardware.tv.tuner@1.0-service-lazy.rc index ad72fae706..ed62ceeb8e 100644 --- a/tv/tuner/1.0/default/android.hardware.tv.tuner@1.0-service-lazy.rc +++ b/tv/tuner/1.0/default/android.hardware.tv.tuner@1.0-service-lazy.rc @@ -6,4 +6,4 @@ service vendor.tuner-hal-1-0 /vendor/bin/hw/android.hardware.tv.tuner@1.0-servic user media group mediadrm drmrpc ioprio rt 4 - writepid /dev/cpuset/foreground/tasks
\ No newline at end of file + task_profiles ProcessCapacityHigh diff --git a/tv/tuner/1.0/default/android.hardware.tv.tuner@1.0-service.rc b/tv/tuner/1.0/default/android.hardware.tv.tuner@1.0-service.rc index 6d59ed75bb..5d5b943c47 100644 --- a/tv/tuner/1.0/default/android.hardware.tv.tuner@1.0-service.rc +++ b/tv/tuner/1.0/default/android.hardware.tv.tuner@1.0-service.rc @@ -3,4 +3,4 @@ service vendor.tuner-hal-1-0 /vendor/bin/hw/android.hardware.tv.tuner@1.0-servic user media group mediadrm drmrpc ioprio rt 4 - writepid /dev/cpuset/foreground/tasks
\ No newline at end of file + task_profiles ProcessCapacityHigh diff --git a/tv/tuner/1.0/vts/functional/FilterTests.cpp b/tv/tuner/1.0/vts/functional/FilterTests.cpp index f47024526d..a7792f5a85 100644 --- a/tv/tuner/1.0/vts/functional/FilterTests.cpp +++ b/tv/tuner/1.0/vts/functional/FilterTests.cpp @@ -16,7 +16,7 @@ #include "FilterTests.h" -void FilterCallback::startFilterEventThread(DemuxFilterEvent event) { +void FilterCallback::startFilterEventThread(DemuxFilterEvent& event) { struct FilterThreadArgs* threadArgs = (struct FilterThreadArgs*)malloc(sizeof(struct FilterThreadArgs)); threadArgs->user = this; @@ -69,9 +69,8 @@ void FilterCallback::filterThreadLoop(DemuxFilterEvent& /* event */) { // end thread } -bool FilterCallback::readFilterEventData() { +bool FilterCallback::readFilterEventData(const DemuxFilterEvent& filterEvent) { bool result = false; - DemuxFilterEvent filterEvent = mFilterEvent; ALOGW("[vts] reading from filter FMQ or buffer %d", mFilterId); // todo separate filter handlers for (auto event : filterEvent.events) { @@ -107,7 +106,7 @@ bool FilterCallback::readFilterEventData() { return result; } -bool FilterCallback::dumpAvData(DemuxFilterMediaEvent event) { +bool FilterCallback::dumpAvData(DemuxFilterMediaEvent& event) { uint32_t length = event.dataLength; uint64_t dataId = event.avDataId; // read data from buffer pointed by a handle @@ -127,7 +126,7 @@ bool FilterCallback::dumpAvData(DemuxFilterMediaEvent event) { return true; } -bool FilterCallback::readRecordData(DemuxFilterTsRecordEvent event) { +bool FilterCallback::readRecordData(DemuxFilterTsRecordEvent& event) { ALOGD("[vts] got DemuxFilterTsRecordEvent with pid=%d.", event.pid.tPid()); return true; } diff --git a/tv/tuner/1.0/vts/functional/FilterTests.h b/tv/tuner/1.0/vts/functional/FilterTests.h index 7bc4832171..d37b9e1d84 100644 --- a/tv/tuner/1.0/vts/functional/FilterTests.h +++ b/tv/tuner/1.0/vts/functional/FilterTests.h @@ -77,8 +77,7 @@ class FilterCallback : public IFilterCallback { android::Mutex::Autolock autoLock(mMsgLock); // Temprarily we treat the first coming back filter data on the matching pid a success // once all of the MQ are cleared, means we got all the expected output - mFilterEvent = filterEvent; - readFilterEventData(); + readFilterEventData(filterEvent); mPidFilterOutputCount++; // mFilterIdToMQ.erase(filterEvent.filterId); @@ -96,15 +95,15 @@ class FilterCallback : public IFilterCallback { void testFilterDataOutput(); - void startFilterEventThread(DemuxFilterEvent event); + void startFilterEventThread(DemuxFilterEvent& event); static void* __threadLoopFilter(void* threadArgs); void filterThreadLoop(DemuxFilterEvent& event); void updateFilterMQ(MQDesc& filterMQDescriptor); void updateGoldenOutputMap(string goldenOutputFile); - bool readFilterEventData(); - bool dumpAvData(DemuxFilterMediaEvent event); - bool readRecordData(DemuxFilterTsRecordEvent event); + bool readFilterEventData(const DemuxFilterEvent& filterEvent); + bool dumpAvData(DemuxFilterMediaEvent& event); + bool readRecordData(DemuxFilterTsRecordEvent& event); private: struct FilterThreadArgs { @@ -120,7 +119,6 @@ class FilterCallback : public IFilterCallback { sp<IFilter> mFilter; std::unique_ptr<FilterMQ> mFilterMQ; EventFlag* mFilterMQEventFlag; - DemuxFilterEvent mFilterEvent; android::Mutex mMsgLock; android::Mutex mFilterOutputLock; diff --git a/tv/tuner/1.0/vts/functional/FrontendTests.cpp b/tv/tuner/1.0/vts/functional/FrontendTests.cpp index b35d11220d..62ac6f7716 100644 --- a/tv/tuner/1.0/vts/functional/FrontendTests.cpp +++ b/tv/tuner/1.0/vts/functional/FrontendTests.cpp @@ -370,11 +370,12 @@ AssertionResult FrontendTests::tuneFrontend(FrontendConfig config, bool testWith mIsSoftwareFe = config.isSoftwareFe; bool result = true; if (mIsSoftwareFe && testWithDemux) { - result &= mDvrTests.openDvrInDemux(mDvrConfig.type, mDvrConfig.bufferSize) == success(); - result &= mDvrTests.configDvrPlayback(mDvrConfig.settings) == success(); - result &= mDvrTests.getDvrPlaybackMQDescriptor() == success(); - mDvrTests.startPlaybackInputThread(mDvrConfig.playbackInputFile, - mDvrConfig.settings.playback()); + result &= + getDvrTests()->openDvrInDemux(mDvrConfig.type, mDvrConfig.bufferSize) == success(); + result &= getDvrTests()->configDvrPlayback(mDvrConfig.settings) == success(); + result &= getDvrTests()->getDvrPlaybackMQDescriptor() == success(); + getDvrTests()->startPlaybackInputThread(mDvrConfig.playbackInputFile, + mDvrConfig.settings.playback()); if (!result) { ALOGW("[vts] Software frontend dvr configure failed."); return failure(); @@ -397,8 +398,8 @@ AssertionResult FrontendTests::stopTuneFrontend(bool testWithDemux) { Result status; status = mFrontend->stopTune(); if (mIsSoftwareFe && testWithDemux) { - mDvrTests.stopPlaybackThread(); - mDvrTests.closeDvrPlayback(); + getDvrTests()->stopPlaybackThread(); + getDvrTests()->closeDvrPlayback(); } return AssertionResult(status == Result::SUCCESS); } diff --git a/tv/tuner/1.0/vts/functional/FrontendTests.h b/tv/tuner/1.0/vts/functional/FrontendTests.h index 33ff603b85..c789d94c2b 100644 --- a/tv/tuner/1.0/vts/functional/FrontendTests.h +++ b/tv/tuner/1.0/vts/functional/FrontendTests.h @@ -103,7 +103,7 @@ class FrontendTests { void setService(sp<ITuner> tuner) { mService = tuner; - mDvrTests.setService(tuner); + getDvrTests()->setService(tuner); getDefaultSoftwareFrontendPlaybackConfig(mDvrConfig); } @@ -124,8 +124,8 @@ class FrontendTests { void tuneTest(FrontendConfig frontendConf); void scanTest(FrontendConfig frontend, FrontendScanType type); - void setDvrTests(DvrTests dvrTests) { mDvrTests = dvrTests; } - void setDemux(sp<IDemux> demux) { mDvrTests.setDemux(demux); } + void setDvrTests(DvrTests* dvrTests) { mExternalDvrTests = dvrTests; } + void setDemux(sp<IDemux> demux) { getDvrTests()->setDemux(demux); } void setSoftwareFrontendDvrConfig(DvrConfig conf) { mDvrConfig = conf; } protected: @@ -147,11 +147,16 @@ class FrontendTests { dvrConfig.settings.playback(playbackSettings); } + DvrTests* getDvrTests() { + return (mExternalDvrTests != nullptr ? mExternalDvrTests : &mDvrTests); + } + sp<IFrontend> mFrontend; FrontendInfo mFrontendInfo; sp<FrontendCallback> mFrontendCallback; hidl_vec<FrontendId> mFeIds; + DvrTests* mExternalDvrTests = nullptr; DvrTests mDvrTests; bool mIsSoftwareFe = false; DvrConfig mDvrConfig; diff --git a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp index b39abe3547..3e3a4d4732 100644 --- a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp +++ b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp @@ -177,7 +177,7 @@ void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig filterConf, mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[record.dvrSoftwareFeId]); } ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); - mFrontendTests.setDvrTests(mDvrTests); + mFrontendTests.setDvrTests(&mDvrTests); } else { dvrSourceConfig = dvrMap[record.dvrSourceId]; ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize)); diff --git a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.h b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.h index 7243a42c60..0b84b58bf7 100644 --- a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.h +++ b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.h @@ -50,7 +50,7 @@ bool initConfiguration() { return true; } -AssertionResult filterDataOutputTestBase(FilterTests tests) { +AssertionResult filterDataOutputTestBase(FilterTests& tests) { // Data Verify Module std::map<uint32_t, sp<FilterCallback>>::iterator it; std::map<uint32_t, sp<FilterCallback>> filterCallbacks = tests.getFilterCallbacks(); diff --git a/tv/tuner/1.1/default/Dvr.cpp b/tv/tuner/1.1/default/Dvr.cpp index 93f4519f10..fdb66c1fd4 100644 --- a/tv/tuner/1.1/default/Dvr.cpp +++ b/tv/tuner/1.1/default/Dvr.cpp @@ -38,8 +38,8 @@ Dvr::Dvr(DvrType type, uint32_t bufferSize, const sp<IDvrCallback>& cb, sp<Demux } Dvr::~Dvr() { - mDvrThreadRunning = false; - lock_guard<mutex> lock(mDvrThreadLock); + // make sure thread has joined + close(); } Return<void> Dvr::getQueueDesc(getQueueDesc_cb _hidl_cb) { @@ -134,8 +134,7 @@ Return<Result> Dvr::start() { if (mType == DvrType::PLAYBACK) { mDvrThreadRunning = true; - pthread_create(&mDvrThread, NULL, __threadLoopPlayback, this); - pthread_setname_np(mDvrThread, "playback_waiting_loop"); + mDvrThread = std::thread(&Dvr::playbackThreadLoop, this); } else if (mType == DvrType::RECORD) { mRecordStatus = RecordStatus::DATA_READY; mDemux->setIsRecording(mType == DvrType::RECORD); @@ -150,9 +149,11 @@ Return<Result> Dvr::stop() { ALOGV("%s", __FUNCTION__); mDvrThreadRunning = false; - lock_guard<mutex> lock(mDvrThreadLock); - - mIsRecordStarted = false; + if (mDvrThread.joinable()) { + mDvrThread.join(); + } + // thread should always be joinable if it is running, + // so it should be safe to assume recording stopped. mDemux->setIsRecording(false); return Result::SUCCESS; @@ -168,9 +169,7 @@ Return<Result> Dvr::flush() { Return<Result> Dvr::close() { ALOGV("%s", __FUNCTION__); - - mDvrThreadRunning = false; - lock_guard<mutex> lock(mDvrThreadLock); + stop(); return Result::SUCCESS; } @@ -197,15 +196,8 @@ EventFlag* Dvr::getDvrEventFlag() { return mDvrEventFlag; } -void* Dvr::__threadLoopPlayback(void* user) { - Dvr* const self = static_cast<Dvr*>(user); - self->playbackThreadLoop(); - return 0; -} - void Dvr::playbackThreadLoop() { ALOGD("[Dvr] playback threadLoop start."); - lock_guard<mutex> lock(mDvrThreadLock); while (mDvrThreadRunning) { uint32_t efState = 0; diff --git a/tv/tuner/1.1/default/Dvr.h b/tv/tuner/1.1/default/Dvr.h index 7b7efefada..1bbb55c45e 100644 --- a/tv/tuner/1.1/default/Dvr.h +++ b/tv/tuner/1.1/default/Dvr.h @@ -19,7 +19,9 @@ #include <fmq/MessageQueue.h> #include <math.h> +#include <atomic> #include <set> +#include <thread> #include "Demux.h" #include "Frontend.h" #include "Tuner.h" @@ -115,10 +117,7 @@ class Dvr : public IDvr { * Each filter handler handles the data filtering/output writing/filterEvent updating. */ void startTpidFilter(vector<uint8_t> data); - static void* __threadLoopPlayback(void* user); - static void* __threadLoopRecord(void* user); void playbackThreadLoop(); - void recordThreadLoop(); unique_ptr<DvrMQ> mDvrMQ; EventFlag* mDvrEventFlag; @@ -129,7 +128,7 @@ class Dvr : public IDvr { DvrSettings mDvrSettings; // Thread handlers - pthread_t mDvrThread; + std::thread mDvrThread; // FMQ status local records PlaybackStatus mPlaybackStatus; @@ -137,7 +136,7 @@ class Dvr : public IDvr { /** * If a specific filter's writing loop is still running */ - bool mDvrThreadRunning; + std::atomic<bool> mDvrThreadRunning; bool mKeepFetchingDataFromFrontend; /** * Lock to protect writes to the FMQs @@ -148,13 +147,8 @@ class Dvr : public IDvr { */ std::mutex mPlaybackStatusLock; std::mutex mRecordStatusLock; - std::mutex mDvrThreadLock; const bool DEBUG_DVR = false; - - // Booleans to check if recording is running. - // Recording is ready when both of the following are set to true. - bool mIsRecordStarted = false; }; } // namespace implementation @@ -164,4 +158,4 @@ class Dvr : public IDvr { } // namespace hardware } // namespace android -#endif // ANDROID_HARDWARE_TV_TUNER_V1_1_DVR_H_
\ No newline at end of file +#endif // ANDROID_HARDWARE_TV_TUNER_V1_1_DVR_H_ diff --git a/tv/tuner/1.1/default/Filter.cpp b/tv/tuner/1.1/default/Filter.cpp index 7d609ea3dc..e0c785eae4 100644 --- a/tv/tuner/1.1/default/Filter.cpp +++ b/tv/tuner/1.1/default/Filter.cpp @@ -532,7 +532,7 @@ uint16_t Filter::getTpid() { return mTpid; } -void Filter::updateFilterOutput(vector<uint8_t> data) { +void Filter::updateFilterOutput(const vector<uint8_t>& data) { std::lock_guard<std::mutex> lock(mFilterOutputLock); mFilterOutput.insert(mFilterOutput.end(), data.begin(), data.end()); } @@ -542,7 +542,7 @@ void Filter::updatePts(uint64_t pts) { mPts = pts; } -void Filter::updateRecordOutput(vector<uint8_t> data) { +void Filter::updateRecordOutput(const vector<uint8_t>& data) { std::lock_guard<std::mutex> lock(mRecordFilterOutputLock); mRecordFilterOutput.insert(mRecordFilterOutput.end(), data.begin(), data.end()); } @@ -689,9 +689,7 @@ Result Filter::startMediaFilterHandler() { Result result; if (mPts) { result = createMediaFilterEventWithIon(mFilterOutput); - if (result == Result::SUCCESS) { - mFilterOutput.clear(); - } + mFilterOutput.clear(); return result; } @@ -729,6 +727,7 @@ Result Filter::startMediaFilterHandler() { } result = createMediaFilterEventWithIon(mPesOutput); + mPesOutput.clear(); if (result != Result::SUCCESS) { return result; } @@ -739,7 +738,7 @@ Result Filter::startMediaFilterHandler() { return Result::SUCCESS; } -Result Filter::createMediaFilterEventWithIon(vector<uint8_t> output) { +Result Filter::createMediaFilterEventWithIon(const vector<uint8_t>& output) { if (mUsingSharedAvMem) { if (mSharedAvMemHandle.getNativeHandle() == nullptr) { return Result::UNKNOWN_ERROR; @@ -793,7 +792,7 @@ Result Filter::startTemiFilterHandler() { return Result::SUCCESS; } -bool Filter::writeSectionsAndCreateEvent(vector<uint8_t> data) { +bool Filter::writeSectionsAndCreateEvent(const vector<uint8_t>& data) { // TODO check how many sections has been read ALOGD("[Filter] section handler"); std::lock_guard<std::mutex> lock(mFilterEventLock); @@ -874,7 +873,7 @@ native_handle_t* Filter::createNativeHandle(int fd) { return nativeHandle; } -Result Filter::createIndependentMediaEvents(vector<uint8_t> output) { +Result Filter::createIndependentMediaEvents(const vector<uint8_t>& output) { int av_fd = createAvIonFd(output.size()); if (av_fd == -1) { return Result::UNKNOWN_ERROR; @@ -912,8 +911,6 @@ Result Filter::createIndependentMediaEvents(vector<uint8_t> output) { mFilterEvent.events.resize(size + 1); mFilterEvent.events[size].media(mediaEvent); - // Clear and log - output.clear(); mAvBufferCopyCount = 0; ::close(av_fd); if (DEBUG_FILTER) { @@ -922,7 +919,7 @@ Result Filter::createIndependentMediaEvents(vector<uint8_t> output) { return Result::SUCCESS; } -Result Filter::createShareMemMediaEvents(vector<uint8_t> output) { +Result Filter::createShareMemMediaEvents(const vector<uint8_t>& output) { // copy the filtered data to the shared buffer uint8_t* sharedAvBuffer = getIonBuffer(mSharedAvMemHandle.getNativeHandle()->data[0], output.size() + mSharedAvMemOffset); @@ -955,8 +952,6 @@ Result Filter::createShareMemMediaEvents(vector<uint8_t> output) { mFilterEvent.events.resize(size + 1); mFilterEvent.events[size].media(mediaEvent); - // Clear and log - output.clear(); if (DEBUG_FILTER) { ALOGD("[Filter] shared av data length %d", mediaEvent.dataLength); } diff --git a/tv/tuner/1.1/default/Filter.h b/tv/tuner/1.1/default/Filter.h index 659bebf178..1ea2f513a4 100644 --- a/tv/tuner/1.1/default/Filter.h +++ b/tv/tuner/1.1/default/Filter.h @@ -93,8 +93,8 @@ class Filter : public V1_1::IFilter { */ bool createFilterMQ(); uint16_t getTpid(); - void updateFilterOutput(vector<uint8_t> data); - void updateRecordOutput(vector<uint8_t> data); + void updateFilterOutput(const vector<uint8_t>& data); + void updateRecordOutput(const vector<uint8_t>& data); void updatePts(uint64_t pts); Result startFilterHandler(); Result startRecordFilterHandler(); @@ -177,7 +177,7 @@ class Filter : public V1_1::IFilter { void deleteEventFlag(); bool writeDataToFilterMQ(const std::vector<uint8_t>& data); bool readDataFromMQ(); - bool writeSectionsAndCreateEvent(vector<uint8_t> data); + bool writeSectionsAndCreateEvent(const vector<uint8_t>& data); void maySendFilterStatusCallback(); DemuxFilterStatus checkFilterStatusChange(uint32_t availableToWrite, uint32_t availableToRead, uint32_t highThreshold, uint32_t lowThreshold); @@ -193,9 +193,9 @@ class Filter : public V1_1::IFilter { int createAvIonFd(int size); uint8_t* getIonBuffer(int fd, int size); native_handle_t* createNativeHandle(int fd); - Result createMediaFilterEventWithIon(vector<uint8_t> output); - Result createIndependentMediaEvents(vector<uint8_t> output); - Result createShareMemMediaEvents(vector<uint8_t> output); + Result createMediaFilterEventWithIon(const vector<uint8_t>& output); + Result createIndependentMediaEvents(const vector<uint8_t>& output); + Result createShareMemMediaEvents(const vector<uint8_t>& output); bool sameFile(int fd1, int fd2); DemuxFilterEvent createMediaEvent(); diff --git a/tv/tuner/1.1/vts/functional/FilterTests.cpp b/tv/tuner/1.1/vts/functional/FilterTests.cpp index 4dff8533f3..8bdf8f68b8 100644 --- a/tv/tuner/1.1/vts/functional/FilterTests.cpp +++ b/tv/tuner/1.1/vts/functional/FilterTests.cpp @@ -64,11 +64,11 @@ void FilterCallback::testStartIdAfterReconfigure() { ALOGW("[vts] pass and stop"); } -void FilterCallback::readFilterEventData() { +void FilterCallback::readFilterEventData(const DemuxFilterEvent& filterEvent) { ALOGW("[vts] reading filter event"); // todo separate filter handlers - for (int i = 0; i < mFilterEvent.events.size(); i++) { - auto event = mFilterEvent.events[i]; + for (int i = 0; i < filterEvent.events.size(); i++) { + auto event = filterEvent.events[i]; switch (event.getDiscriminator()) { case DemuxFilterEvent::Event::hidl_discriminator::media: ALOGD("[vts] Media filter event, avMemHandle numFds=%d.", @@ -79,8 +79,13 @@ void FilterCallback::readFilterEventData() { break; } } - for (int i = 0; i < mFilterEventExt.events.size(); i++) { - auto eventExt = mFilterEventExt.events[i]; +} + +void FilterCallback::readFilterEventExtData(const DemuxFilterEventExt& filterEventExt) { + ALOGW("[vts] reading filter event ext"); + // todo separate filter handlers + for (int i = 0; i < filterEventExt.events.size(); i++) { + auto eventExt = filterEventExt.events[i]; switch (eventExt.getDiscriminator()) { case DemuxFilterEventExt::Event::hidl_discriminator::tsRecord: ALOGD("[vts] Extended TS record filter event, pts=%" PRIu64 ", firstMbInSlice=%d", @@ -114,7 +119,7 @@ void FilterCallback::readFilterEventData() { } } -bool FilterCallback::dumpAvData(DemuxFilterMediaEvent event) { +bool FilterCallback::dumpAvData(DemuxFilterMediaEvent& event) { uint32_t length = event.dataLength; uint32_t offset = event.offset; // read data from buffer pointed by a handle diff --git a/tv/tuner/1.1/vts/functional/FilterTests.h b/tv/tuner/1.1/vts/functional/FilterTests.h index 72c8129f4a..1a1273ecb4 100644 --- a/tv/tuner/1.1/vts/functional/FilterTests.h +++ b/tv/tuner/1.1/vts/functional/FilterTests.h @@ -88,9 +88,8 @@ class FilterCallback : public IFilterCallback { android::Mutex::Autolock autoLock(mMsgLock); // Temprarily we treat the first coming back filter data on the matching pid a success // once all of the MQ are cleared, means we got all the expected output - mFilterEvent = filterEvent; - mFilterEventExt = filterEventExt; - readFilterEventData(); + readFilterEventData(filterEvent); + readFilterEventExtData(filterEventExt); mPidFilterOutputCount++; mMsgCondition.signal(); return Void(); @@ -101,8 +100,7 @@ class FilterCallback : public IFilterCallback { android::Mutex::Autolock autoLock(mMsgLock); // Temprarily we treat the first coming back filter data on the matching pid a success // once all of the MQ are cleared, means we got all the expected output - mFilterEvent = filterEvent; - readFilterEventData(); + readFilterEventData(filterEvent); mPidFilterOutputCount++; mMsgCondition.signal(); return Void(); @@ -115,7 +113,7 @@ class FilterCallback : public IFilterCallback { void setFilterId(uint32_t filterId) { mFilterId = filterId; } void setFilterInterface(sp<IFilter> filter) { mFilter = filter; } void setFilterEventType(FilterEventType type) { mFilterEventType = type; } - void setSharedHandle(hidl_handle sharedHandle) { mAvSharedHandle = sharedHandle; } + void setSharedHandle(hidl_handle& sharedHandle) { mAvSharedHandle = sharedHandle; } void setMemSize(uint64_t size) { mAvSharedMemSize = size; } void testFilterDataOutput(); @@ -123,15 +121,14 @@ class FilterCallback : public IFilterCallback { void testFilterIpCidEvent(); void testStartIdAfterReconfigure(); - void readFilterEventData(); - bool dumpAvData(DemuxFilterMediaEvent event); + void readFilterEventData(const DemuxFilterEvent& filterEvent); + void readFilterEventExtData(const DemuxFilterEventExt& filterEventExt); + bool dumpAvData(DemuxFilterMediaEvent& event); private: uint32_t mFilterId; sp<IFilter> mFilter; FilterEventType mFilterEventType; - DemuxFilterEvent mFilterEvent; - DemuxFilterEventExt mFilterEventExt; hidl_handle mAvSharedHandle = NULL; uint64_t mAvSharedMemSize = -1; diff --git a/tv/tuner/1.1/vts/functional/FrontendTests.cpp b/tv/tuner/1.1/vts/functional/FrontendTests.cpp index 9c575ff782..9c0933eb26 100644 --- a/tv/tuner/1.1/vts/functional/FrontendTests.cpp +++ b/tv/tuner/1.1/vts/functional/FrontendTests.cpp @@ -437,11 +437,12 @@ AssertionResult FrontendTests::tuneFrontend(FrontendConfig1_1 config, bool testW mIsSoftwareFe = config.config1_0.isSoftwareFe; bool result = true; if (mIsSoftwareFe && testWithDemux) { - result &= mDvrTests.openDvrInDemux(mDvrConfig.type, mDvrConfig.bufferSize) == success(); - result &= mDvrTests.configDvrPlayback(mDvrConfig.settings) == success(); - result &= mDvrTests.getDvrPlaybackMQDescriptor() == success(); - mDvrTests.startPlaybackInputThread(mDvrConfig.playbackInputFile, - mDvrConfig.settings.playback()); + result &= + getDvrTests()->openDvrInDemux(mDvrConfig.type, mDvrConfig.bufferSize) == success(); + result &= getDvrTests()->configDvrPlayback(mDvrConfig.settings) == success(); + result &= getDvrTests()->getDvrPlaybackMQDescriptor() == success(); + getDvrTests()->startPlaybackInputThread(mDvrConfig.playbackInputFile, + mDvrConfig.settings.playback()); if (!result) { ALOGW("[vts] Software frontend dvr configure failed."); return failure(); @@ -456,8 +457,8 @@ AssertionResult FrontendTests::stopTuneFrontend(bool testWithDemux) { Result status; status = mFrontend->stopTune(); if (mIsSoftwareFe && testWithDemux) { - mDvrTests.stopPlaybackThread(); - mDvrTests.closeDvrPlayback(); + getDvrTests()->stopPlaybackThread(); + getDvrTests()->closeDvrPlayback(); } return AssertionResult(status == Result::SUCCESS); } diff --git a/tv/tuner/1.1/vts/functional/FrontendTests.h b/tv/tuner/1.1/vts/functional/FrontendTests.h index 3687389571..03e5417744 100644 --- a/tv/tuner/1.1/vts/functional/FrontendTests.h +++ b/tv/tuner/1.1/vts/functional/FrontendTests.h @@ -106,7 +106,7 @@ class FrontendTests { void setService(sp<ITuner> tuner) { mService = tuner; - mDvrTests.setService(tuner); + getDvrTests()->setService(tuner); getDefaultSoftwareFrontendPlaybackConfig(mDvrConfig); } @@ -131,8 +131,8 @@ class FrontendTests { void scanTest(FrontendConfig1_1 frontend, FrontendScanType type); void getFrontendDtmbCapsTest(); - void setDvrTests(DvrTests dvrTests) { mDvrTests = dvrTests; } - void setDemux(sp<IDemux> demux) { mDvrTests.setDemux(demux); } + void setDvrTests(DvrTests* dvrTests) { mExternalDvrTests = dvrTests; } + void setDemux(sp<IDemux> demux) { getDvrTests()->setDemux(demux); } void setSoftwareFrontendDvrConfig(DvrConfig conf) { mDvrConfig = conf; } protected: @@ -153,11 +153,16 @@ class FrontendTests { dvrConfig.settings.playback(playbackSettings); } + DvrTests* getDvrTests() { + return (mExternalDvrTests != nullptr ? mExternalDvrTests : &mDvrTests); + } + sp<IFrontend> mFrontend; FrontendInfo mFrontendInfo; sp<FrontendCallback> mFrontendCallback; hidl_vec<FrontendId> mFeIds; + DvrTests* mExternalDvrTests = nullptr; DvrTests mDvrTests; bool mIsSoftwareFe = false; DvrConfig mDvrConfig; diff --git a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp index 1a9def83b1..41acaa1704 100644 --- a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp +++ b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp @@ -147,7 +147,7 @@ void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig1_1 filterConf, mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[record.dvrSoftwareFeId]); } ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); - mFrontendTests.setDvrTests(mDvrTests); + mFrontendTests.setDvrTests(&mDvrTests); } else { dvrSourceConfig = dvrMap[record.dvrSourceId]; ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize)); diff --git a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.h b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.h index 13b9640749..d1a9beab09 100644 --- a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.h +++ b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.h @@ -39,7 +39,7 @@ static AssertionResult success() { return ::testing::AssertionSuccess(); } -AssertionResult filterDataOutputTestBase(FilterTests tests) { +AssertionResult filterDataOutputTestBase(FilterTests& tests) { // Data Verify Module std::map<uint64_t, sp<FilterCallback>>::iterator it; std::map<uint64_t, sp<FilterCallback>> filterCallbacks = tests.getFilterCallbacks(); diff --git a/tv/tuner/aidl/Android.bp b/tv/tuner/aidl/Android.bp new file mode 100644 index 0000000000..c33572deb0 --- /dev/null +++ b/tv/tuner/aidl/Android.bp @@ -0,0 +1,28 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "hardware_interfaces_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["hardware_interfaces_license"], +} + +aidl_interface { + name: "android.hardware.tv.tuner", + vendor_available: true, + srcs: ["android/hardware/tv/tuner/*.aidl"], + imports: [ + "android.hardware.common-V2", + "android.hardware.common.fmq-V1", + ], + stability: "vintf", + backend: { + java: { + sdk_version: "module_current", + srcs_available: true, + }, + cpp: { + enabled: false, + }, + }, +} diff --git a/tv/tuner/aidl/TEST_MAPPING b/tv/tuner/aidl/TEST_MAPPING new file mode 100644 index 0000000000..222c6edd11 --- /dev/null +++ b/tv/tuner/aidl/TEST_MAPPING @@ -0,0 +1,7 @@ +{ + "presubmit": [ + { + "name": "VtsHalTvTunerTargetTest" + } + ] +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioExtraMetaData.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioExtraMetaData.aidl new file mode 100644 index 0000000000..20c6e5f35e --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioExtraMetaData.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable AudioExtraMetaData { + byte adFade; + byte adPan; + byte versionTextTag; + byte adGainCenter; + byte adGainFront; + byte adGainSurround; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioStreamType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioStreamType.aidl new file mode 100644 index 0000000000..bfd2aa8b1f --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AudioStreamType.aidl @@ -0,0 +1,54 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum AudioStreamType { + UNDEFINED = 0, + PCM = 1, + MP3 = 2, + MPEG1 = 3, + MPEG2 = 4, + MPEGH = 5, + AAC = 6, + AC3 = 7, + EAC3 = 8, + AC4 = 9, + DTS = 10, + DTS_HD = 11, + WMA = 12, + OPUS = 13, + VORBIS = 14, + DRA = 15, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AvStreamType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AvStreamType.aidl new file mode 100644 index 0000000000..4d6acfffa1 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/AvStreamType.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union AvStreamType { + android.hardware.tv.tuner.VideoStreamType video = android.hardware.tv.tuner.VideoStreamType.UNDEFINED; + android.hardware.tv.tuner.AudioStreamType audio; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant.aidl new file mode 100644 index 0000000000..8e31bd9f77 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant.aidl @@ -0,0 +1,50 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum Constant { + INVALID_TS_PID = 65535, + INVALID_STREAM_ID = 65535, + INVALID_FILTER_ID = -1, + INVALID_AV_SYNC_ID = -1, + INVALID_MMTP_RECORD_EVENT_MPT_SEQUENCE_NUM = -1, + INVALID_FIRST_MACROBLOCK_IN_SLICE = -1, + INVALID_FRONTEND_SETTING_FREQUENCY = -1, + INVALID_IP_FILTER_CONTEXT_ID = -1, + INVALID_LTS_ID = -1, + INVALID_FRONTEND_ID = -1, + INVALID_LNB_ID = -1, + INVALID_KEYTOKEN = 0, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant64Bit.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant64Bit.aidl new file mode 100644 index 0000000000..a56a0cf2f9 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Constant64Bit.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="long") @VintfStability +enum Constant64Bit { + INVALID_FILTER_ID_64BIT = -1, + INVALID_AV_SYNC_ID_64BIT = -1, + INVALID_PRESENTATION_TIME_STAMP = -1, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DataFormat.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DataFormat.aidl new file mode 100644 index 0000000000..3b8fee403d --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DataFormat.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum DataFormat { + TS = 0, + PES = 1, + ES = 2, + SHV_TLV = 3, + UNDEFINED = 4, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpFilterSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpFilterSettings.aidl new file mode 100644 index 0000000000..ee8db8fa28 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpFilterSettings.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxAlpFilterSettings { + byte packetType; + android.hardware.tv.tuner.DemuxAlpLengthType lengthType = android.hardware.tv.tuner.DemuxAlpLengthType.UNDEFINED; + android.hardware.tv.tuner.DemuxAlpFilterSettingsFilterSettings filterSettings; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpFilterSettingsFilterSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpFilterSettingsFilterSettings.aidl new file mode 100644 index 0000000000..6b15492768 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpFilterSettingsFilterSettings.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxAlpFilterSettingsFilterSettings { + boolean noinit; + android.hardware.tv.tuner.DemuxFilterSectionSettings section; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpFilterType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpFilterType.aidl new file mode 100644 index 0000000000..f0df497ed2 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpFilterType.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum DemuxAlpFilterType { + UNDEFINED = 0, + SECTION = 1, + PTP = 2, + PAYLOAD_THROUGH = 3, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpLengthType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpLengthType.aidl new file mode 100644 index 0000000000..ccca6de8c6 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxAlpLengthType.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="byte") @VintfStability +enum DemuxAlpLengthType { + UNDEFINED = 0, + WITHOUT_ADDITIONAL_HEADER = 1, + WITH_ADDITIONAL_HEADER = 2, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxCapabilities.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxCapabilities.aidl new file mode 100644 index 0000000000..729b797376 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxCapabilities.aidl @@ -0,0 +1,51 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxCapabilities { + int numDemux; + int numRecord; + int numPlayback; + int numTsFilter; + int numSectionFilter; + int numAudioFilter; + int numVideoFilter; + int numPesFilter; + int numPcrFilter; + int numBytesInSectionFilter; + int filterCaps; + int[] linkCaps; + boolean bTimeFilter; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterAvSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterAvSettings.aidl new file mode 100644 index 0000000000..95911f93d7 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterAvSettings.aidl @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterAvSettings { + boolean isPassthrough; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl new file mode 100644 index 0000000000..a9e7b7c676 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterDownloadEvent { + int itemId; + int mpuSequenceNumber; + int itemFragmentIndex; + int lastItemFragmentIndex; + char dataLength; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl new file mode 100644 index 0000000000..ff06888b47 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterDownloadSettings { + int downloadId; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterEvent.aidl new file mode 100644 index 0000000000..617f71cc34 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterEvent.aidl @@ -0,0 +1,48 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxFilterEvent { + android.hardware.tv.tuner.DemuxFilterSectionEvent section; + android.hardware.tv.tuner.DemuxFilterMediaEvent media; + android.hardware.tv.tuner.DemuxFilterPesEvent pes; + android.hardware.tv.tuner.DemuxFilterTsRecordEvent tsRecord; + android.hardware.tv.tuner.DemuxFilterMmtpRecordEvent mmtpRecord; + android.hardware.tv.tuner.DemuxFilterDownloadEvent download; + android.hardware.tv.tuner.DemuxFilterIpPayloadEvent ipPayload; + android.hardware.tv.tuner.DemuxFilterTemiEvent temi; + android.hardware.tv.tuner.DemuxFilterMonitorEvent monitorEvent; + int startId; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterIpPayloadEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterIpPayloadEvent.aidl new file mode 100644 index 0000000000..0d20f8e50f --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterIpPayloadEvent.aidl @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterIpPayloadEvent { + char dataLength; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMainType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMainType.aidl new file mode 100644 index 0000000000..6abd87b0f3 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMainType.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum DemuxFilterMainType { + UNDEFINED = 0, + TS = 1, + MMTP = 2, + IP = 4, + TLV = 8, + ALP = 16, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl new file mode 100644 index 0000000000..351a3406db --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl @@ -0,0 +1,49 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterMediaEvent { + char streamId; + boolean isPtsPresent; + long pts; + int dataLength; + int offset; + android.hardware.common.NativeHandle avMemory; + boolean isSecureMemory; + long avDataId; + int mpuSequenceNumber; + boolean isPesPrivateData; + android.hardware.tv.tuner.DemuxFilterMediaEventExtraMetaData extraMetaData; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEventExtraMetaData.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEventExtraMetaData.aidl new file mode 100644 index 0000000000..ab36188069 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMediaEventExtraMetaData.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxFilterMediaEventExtraMetaData { + boolean noinit; + android.hardware.tv.tuner.AudioExtraMetaData audio; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMmtpRecordEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMmtpRecordEvent.aidl new file mode 100644 index 0000000000..4e31ba8c73 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMmtpRecordEvent.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterMmtpRecordEvent { + int scHevcIndexMask; + long byteNumber; + long pts; + int mpuSequenceNumber; + int firstMbInSlice; + int tsIndexMask; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMonitorEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMonitorEvent.aidl new file mode 100644 index 0000000000..177de7a0c1 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMonitorEvent.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxFilterMonitorEvent { + android.hardware.tv.tuner.ScramblingStatus scramblingStatus = android.hardware.tv.tuner.ScramblingStatus.UNKNOWN; + int cid; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMonitorEventType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMonitorEventType.aidl new file mode 100644 index 0000000000..5d27f76025 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterMonitorEventType.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum DemuxFilterMonitorEventType { + SCRAMBLING_STATUS = 1, + IP_CID_CHANGE = 2, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterPesDataSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterPesDataSettings.aidl new file mode 100644 index 0000000000..ac7f8a59cb --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterPesDataSettings.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterPesDataSettings { + char streamId; + boolean isRaw; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterPesEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterPesEvent.aidl new file mode 100644 index 0000000000..a4593b4255 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterPesEvent.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterPesEvent { + char streamId; + char dataLength; + int mpuSequenceNumber; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterRecordSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterRecordSettings.aidl new file mode 100644 index 0000000000..17bdd1fe3f --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterRecordSettings.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterRecordSettings { + int tsIndexMask; + android.hardware.tv.tuner.DemuxRecordScIndexType scIndexType = android.hardware.tv.tuner.DemuxRecordScIndexType.UNDEFINED; + android.hardware.tv.tuner.DemuxFilterScIndexMask scIndexMask; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterScIndexMask.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterScIndexMask.aidl new file mode 100644 index 0000000000..3fd19100b5 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterScIndexMask.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxFilterScIndexMask { + int scIndex; + int scHevc; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionBits.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionBits.aidl new file mode 100644 index 0000000000..b666c7b6ba --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionBits.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterSectionBits { + byte[] filter; + byte[] mask; + byte[] mode; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl new file mode 100644 index 0000000000..114d1ebc0a --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterSectionEvent { + char tableId; + char version; + char sectionNum; + char dataLength; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionSettings.aidl new file mode 100644 index 0000000000..2858565099 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionSettings.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterSectionSettings { + android.hardware.tv.tuner.DemuxFilterSectionSettingsCondition condition; + boolean isCheckCrc; + boolean isRepeat; + boolean isRaw; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionSettingsCondition.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionSettingsCondition.aidl new file mode 100644 index 0000000000..0b101dece4 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionSettingsCondition.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxFilterSectionSettingsCondition { + android.hardware.tv.tuner.DemuxFilterSectionBits sectionBits; + android.hardware.tv.tuner.DemuxFilterSectionSettingsConditionTableInfo tableInfo; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionSettingsConditionTableInfo.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionSettingsConditionTableInfo.aidl new file mode 100644 index 0000000000..be25137bbb --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSectionSettingsConditionTableInfo.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterSectionSettingsConditionTableInfo { + char tableId; + char version; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSettings.aidl new file mode 100644 index 0000000000..c12fde25ab --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSettings.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxFilterSettings { + android.hardware.tv.tuner.DemuxTsFilterSettings ts; + android.hardware.tv.tuner.DemuxMmtpFilterSettings mmtp; + android.hardware.tv.tuner.DemuxIpFilterSettings ip; + android.hardware.tv.tuner.DemuxTlvFilterSettings tlv; + android.hardware.tv.tuner.DemuxAlpFilterSettings alp; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterStatus.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterStatus.aidl new file mode 100644 index 0000000000..36b40ea5b9 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterStatus.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="byte") @VintfStability +enum DemuxFilterStatus { + DATA_READY = 1, + LOW_WATER = 2, + HIGH_WATER = 4, + OVERFLOW = 8, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSubType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSubType.aidl new file mode 100644 index 0000000000..2e2a774535 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterSubType.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxFilterSubType { + android.hardware.tv.tuner.DemuxTsFilterType tsFilterType = android.hardware.tv.tuner.DemuxTsFilterType.UNDEFINED; + android.hardware.tv.tuner.DemuxMmtpFilterType mmtpFilterType; + android.hardware.tv.tuner.DemuxIpFilterType ipFilterType; + android.hardware.tv.tuner.DemuxTlvFilterType tlvFilterType; + android.hardware.tv.tuner.DemuxAlpFilterType alpFilterType; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterTemiEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterTemiEvent.aidl new file mode 100644 index 0000000000..ce158618e3 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterTemiEvent.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterTemiEvent { + long pts; + byte descrTag; + byte[] descrData; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterTsRecordEvent.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterTsRecordEvent.aidl new file mode 100644 index 0000000000..5c27faf95d --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterTsRecordEvent.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterTsRecordEvent { + android.hardware.tv.tuner.DemuxPid pid; + int tsIndexMask; + android.hardware.tv.tuner.DemuxFilterScIndexMask scIndexMask; + long byteNumber; + long pts; + int firstMbInSlice; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterType.aidl new file mode 100644 index 0000000000..b2f499d65d --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxFilterType.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxFilterType { + android.hardware.tv.tuner.DemuxFilterMainType mainType = android.hardware.tv.tuner.DemuxFilterMainType.UNDEFINED; + android.hardware.tv.tuner.DemuxFilterSubType subType; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpAddress.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpAddress.aidl new file mode 100644 index 0000000000..935476a80d --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpAddress.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxIpAddress { + android.hardware.tv.tuner.DemuxIpAddressIpAddress srcIpAddress; + android.hardware.tv.tuner.DemuxIpAddressIpAddress dstIpAddress; + char srcPort; + char dstPort; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpAddressIpAddress.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpAddressIpAddress.aidl new file mode 100644 index 0000000000..62de08847e --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpAddressIpAddress.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxIpAddressIpAddress { + byte[] v4 = {}; + byte[] v6; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpFilterSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpFilterSettings.aidl new file mode 100644 index 0000000000..2b0610b4ef --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpFilterSettings.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxIpFilterSettings { + android.hardware.tv.tuner.DemuxIpAddress ipAddr; + android.hardware.tv.tuner.DemuxIpFilterSettingsFilterSettings filterSettings; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpFilterSettingsFilterSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpFilterSettingsFilterSettings.aidl new file mode 100644 index 0000000000..daac2847a6 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpFilterSettingsFilterSettings.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxIpFilterSettingsFilterSettings { + boolean noinit; + android.hardware.tv.tuner.DemuxFilterSectionSettings section; + boolean bPassthrough; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpFilterType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpFilterType.aidl new file mode 100644 index 0000000000..b78ac9a69e --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxIpFilterType.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum DemuxIpFilterType { + UNDEFINED = 0, + SECTION = 1, + NTP = 2, + IP_PAYLOAD = 3, + IP = 4, + PAYLOAD_THROUGH = 5, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxMmtpFilterSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxMmtpFilterSettings.aidl new file mode 100644 index 0000000000..b0fad65eb7 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxMmtpFilterSettings.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxMmtpFilterSettings { + char mmtpPid; + android.hardware.tv.tuner.DemuxMmtpFilterSettingsFilterSettings filterSettings; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxMmtpFilterSettingsFilterSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxMmtpFilterSettingsFilterSettings.aidl new file mode 100644 index 0000000000..4b23306818 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxMmtpFilterSettingsFilterSettings.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxMmtpFilterSettingsFilterSettings { + boolean noinit; + android.hardware.tv.tuner.DemuxFilterSectionSettings section; + android.hardware.tv.tuner.DemuxFilterAvSettings av; + android.hardware.tv.tuner.DemuxFilterPesDataSettings pesData; + android.hardware.tv.tuner.DemuxFilterRecordSettings record; + android.hardware.tv.tuner.DemuxFilterDownloadSettings download; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxMmtpFilterType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxMmtpFilterType.aidl new file mode 100644 index 0000000000..7e9e3a64a7 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxMmtpFilterType.aidl @@ -0,0 +1,46 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum DemuxMmtpFilterType { + UNDEFINED = 0, + SECTION = 1, + PES = 2, + MMTP = 3, + AUDIO = 4, + VIDEO = 5, + RECORD = 6, + DOWNLOAD = 7, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxPid.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxPid.aidl new file mode 100644 index 0000000000..0a29f93887 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxPid.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxPid { + char tPid; + char mmtpPid; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxQueueNotifyBits.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxQueueNotifyBits.aidl new file mode 100644 index 0000000000..bcd0aebbde --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxQueueNotifyBits.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum DemuxQueueNotifyBits { + DATA_READY = 1, + DATA_CONSUMED = 2, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxRecordScIndexType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxRecordScIndexType.aidl new file mode 100644 index 0000000000..91a5e52996 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxRecordScIndexType.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum DemuxRecordScIndexType { + NONE = 0, + SC = 1, + SC_HEVC = 2, + UNDEFINED = 3, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScHevcIndex.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScHevcIndex.aidl new file mode 100644 index 0000000000..3035dad332 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScHevcIndex.aidl @@ -0,0 +1,46 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum DemuxScHevcIndex { + SPS = 1, + AUD = 2, + SLICE_CE_BLA_W_LP = 4, + SLICE_BLA_W_RADL = 8, + SLICE_BLA_N_LP = 16, + SLICE_IDR_W_RADL = 32, + SLICE_IDR_N_LP = 64, + SLICE_TRAIL_CRA = 128, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScIndex.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScIndex.aidl new file mode 100644 index 0000000000..808b212311 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxScIndex.aidl @@ -0,0 +1,48 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum DemuxScIndex { + UNDEFINED = 0, + I_FRAME = 1, + P_FRAME = 2, + B_FRAME = 4, + SEQUENCE = 8, + I_SLICE = 16, + P_SLICE = 32, + B_SLICE = 64, + SI_SLICE = 128, + SP_SLICE = 256, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTlvFilterSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTlvFilterSettings.aidl new file mode 100644 index 0000000000..dd949800d8 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTlvFilterSettings.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxTlvFilterSettings { + byte packetType; + boolean isCompressedIpPacket; + android.hardware.tv.tuner.DemuxTlvFilterSettingsFilterSettings filterSettings; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTlvFilterSettingsFilterSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTlvFilterSettingsFilterSettings.aidl new file mode 100644 index 0000000000..a9d319803c --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTlvFilterSettingsFilterSettings.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxTlvFilterSettingsFilterSettings { + boolean noinit; + android.hardware.tv.tuner.DemuxFilterSectionSettings section; + boolean bPassthrough; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTlvFilterType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTlvFilterType.aidl new file mode 100644 index 0000000000..a4e1ff176e --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTlvFilterType.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum DemuxTlvFilterType { + UNDEFINED = 0, + SECTION = 1, + TLV = 2, + PAYLOAD_THROUGH = 3, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsFilterSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsFilterSettings.aidl new file mode 100644 index 0000000000..131cab02bc --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsFilterSettings.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable DemuxTsFilterSettings { + char tpid; + android.hardware.tv.tuner.DemuxTsFilterSettingsFilterSettings filterSettings; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsFilterSettingsFilterSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsFilterSettingsFilterSettings.aidl new file mode 100644 index 0000000000..5d81bb6237 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsFilterSettingsFilterSettings.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DemuxTsFilterSettingsFilterSettings { + boolean noinit; + android.hardware.tv.tuner.DemuxFilterSectionSettings section; + android.hardware.tv.tuner.DemuxFilterAvSettings av; + android.hardware.tv.tuner.DemuxFilterPesDataSettings pesData; + android.hardware.tv.tuner.DemuxFilterRecordSettings record; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsFilterType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsFilterType.aidl new file mode 100644 index 0000000000..8b806bf6ec --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsFilterType.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum DemuxTsFilterType { + UNDEFINED = 0, + SECTION = 1, + PES = 2, + TS = 3, + AUDIO = 4, + VIDEO = 5, + PCR = 6, + RECORD = 7, + TEMI = 8, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsIndex.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsIndex.aidl new file mode 100644 index 0000000000..ed034779f9 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DemuxTsIndex.aidl @@ -0,0 +1,56 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum DemuxTsIndex { + FIRST_PACKET = 1, + PAYLOAD_UNIT_START_INDICATOR = 2, + CHANGE_TO_NOT_SCRAMBLED = 4, + CHANGE_TO_EVEN_SCRAMBLED = 8, + CHANGE_TO_ODD_SCRAMBLED = 16, + DISCONTINUITY_INDICATOR = 32, + RANDOM_ACCESS_INDICATOR = 64, + PRIORITY_INDICATOR = 128, + PCR_FLAG = 256, + OPCR_FLAG = 512, + SPLICING_POINT_FLAG = 1024, + PRIVATE_DATA = 2048, + ADAPTATION_EXTENSION_FLAG = 4096, + MPT_INDEX_MPT = 65536, + MPT_INDEX_VIDEO = 131072, + MPT_INDEX_AUDIO = 262144, + MPT_INDEX_TIMESTAMP_TARGET_VIDEO = 524288, + MPT_INDEX_TIMESTAMP_TARGET_AUDIO = 1048576, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DvrSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DvrSettings.aidl new file mode 100644 index 0000000000..26f864a08e --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DvrSettings.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union DvrSettings { + android.hardware.tv.tuner.RecordSettings record; + android.hardware.tv.tuner.PlaybackSettings playback; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DvrType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DvrType.aidl new file mode 100644 index 0000000000..3a0c1e421e --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/DvrType.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="byte") @VintfStability +enum DvrType { + RECORD = 0, + PLAYBACK = 1, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogAftFlag.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogAftFlag.aidl new file mode 100644 index 0000000000..6b32110389 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogAftFlag.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendAnalogAftFlag { + UNDEFINED = 0, + AFT_TRUE = 1, + AFT_FALSE = 2, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogCapabilities.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogCapabilities.aidl new file mode 100644 index 0000000000..46131be795 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogCapabilities.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendAnalogCapabilities { + int typeCap; + int sifStandardCap; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogSettings.aidl new file mode 100644 index 0000000000..efb91ca5a4 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogSettings.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendAnalogSettings { + int frequency; + int endFrequency; + android.hardware.tv.tuner.FrontendSpectralInversion inversion = android.hardware.tv.tuner.FrontendSpectralInversion.UNDEFINED; + android.hardware.tv.tuner.FrontendAnalogType type = android.hardware.tv.tuner.FrontendAnalogType.UNDEFINED; + android.hardware.tv.tuner.FrontendAnalogAftFlag aftFlag = android.hardware.tv.tuner.FrontendAnalogAftFlag.UNDEFINED; + android.hardware.tv.tuner.FrontendAnalogSifStandard sifStandard = android.hardware.tv.tuner.FrontendAnalogSifStandard.UNDEFINED; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogSifStandard.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogSifStandard.aidl new file mode 100644 index 0000000000..35025220ac --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogSifStandard.aidl @@ -0,0 +1,57 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendAnalogSifStandard { + UNDEFINED = 0, + AUTO = 1, + BG = 2, + BG_A2 = 4, + BG_NICAM = 8, + I = 16, + DK = 32, + DK1_A2 = 64, + DK2_A2 = 128, + DK3_A2 = 256, + DK_NICAM = 512, + L = 1024, + M = 2048, + M_BTSC = 4096, + M_A2 = 8192, + M_EIAJ = 16384, + I_NICAM = 32768, + L_NICAM = 65536, + L_PRIME = 131072, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogType.aidl new file mode 100644 index 0000000000..33fd93dc63 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAnalogType.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendAnalogType { + UNDEFINED = 0, + AUTO = 1, + PAL = 2, + PAL_M = 4, + PAL_N = 8, + PAL_60 = 16, + NTSC = 32, + NTSC_443 = 64, + SECAM = 128, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Bandwidth.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Bandwidth.aidl new file mode 100644 index 0000000000..51a3fc5c50 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Bandwidth.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendAtsc3Bandwidth { + UNDEFINED = 0, + AUTO = 1, + BANDWIDTH_6MHZ = 2, + BANDWIDTH_7MHZ = 4, + BANDWIDTH_8MHZ = 8, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Capabilities.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Capabilities.aidl new file mode 100644 index 0000000000..b2a25c7d49 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Capabilities.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendAtsc3Capabilities { + int bandwidthCap; + int modulationCap; + int timeInterleaveModeCap; + int codeRateCap; + int fecCap; + byte demodOutputFormatCap; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3CodeRate.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3CodeRate.aidl new file mode 100644 index 0000000000..aec07186a3 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3CodeRate.aidl @@ -0,0 +1,52 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendAtsc3CodeRate { + UNDEFINED = 0, + AUTO = 1, + CODERATE_2_15 = 2, + CODERATE_3_15 = 4, + CODERATE_4_15 = 8, + CODERATE_5_15 = 16, + CODERATE_6_15 = 32, + CODERATE_7_15 = 64, + CODERATE_8_15 = 128, + CODERATE_9_15 = 256, + CODERATE_10_15 = 512, + CODERATE_11_15 = 1024, + CODERATE_12_15 = 2048, + CODERATE_13_15 = 4096, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3DemodOutputFormat.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3DemodOutputFormat.aidl new file mode 100644 index 0000000000..8702a496c5 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3DemodOutputFormat.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="byte") @VintfStability +enum FrontendAtsc3DemodOutputFormat { + UNDEFINED = 0, + ATSC3_LINKLAYER_PACKET = 1, + BASEBAND_PACKET = 2, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Fec.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Fec.aidl new file mode 100644 index 0000000000..a2c140aa9f --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Fec.aidl @@ -0,0 +1,46 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendAtsc3Fec { + UNDEFINED = 0, + AUTO = 1, + BCH_LDPC_16K = 2, + BCH_LDPC_64K = 4, + CRC_LDPC_16K = 8, + CRC_LDPC_64K = 16, + LDPC_16K = 32, + LDPC_64K = 64, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Modulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Modulation.aidl new file mode 100644 index 0000000000..09e513d8aa --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Modulation.aidl @@ -0,0 +1,46 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendAtsc3Modulation { + UNDEFINED = 0, + AUTO = 1, + MOD_QPSK = 2, + MOD_16QAM = 4, + MOD_64QAM = 8, + MOD_256QAM = 16, + MOD_1024QAM = 32, + MOD_4096QAM = 64, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3PlpSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3PlpSettings.aidl new file mode 100644 index 0000000000..b569c21da1 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3PlpSettings.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendAtsc3PlpSettings { + byte plpId; + android.hardware.tv.tuner.FrontendAtsc3Modulation modulation = android.hardware.tv.tuner.FrontendAtsc3Modulation.UNDEFINED; + android.hardware.tv.tuner.FrontendAtsc3TimeInterleaveMode interleaveMode = android.hardware.tv.tuner.FrontendAtsc3TimeInterleaveMode.UNDEFINED; + android.hardware.tv.tuner.FrontendAtsc3CodeRate codeRate = android.hardware.tv.tuner.FrontendAtsc3CodeRate.UNDEFINED; + android.hardware.tv.tuner.FrontendAtsc3Fec fec = android.hardware.tv.tuner.FrontendAtsc3Fec.UNDEFINED; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Settings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Settings.aidl new file mode 100644 index 0000000000..bd96d14502 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3Settings.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendAtsc3Settings { + int frequency; + int endFrequency; + android.hardware.tv.tuner.FrontendAtsc3Bandwidth bandwidth = android.hardware.tv.tuner.FrontendAtsc3Bandwidth.UNDEFINED; + android.hardware.tv.tuner.FrontendSpectralInversion inversion = android.hardware.tv.tuner.FrontendSpectralInversion.UNDEFINED; + android.hardware.tv.tuner.FrontendAtsc3DemodOutputFormat demodOutputFormat = android.hardware.tv.tuner.FrontendAtsc3DemodOutputFormat.UNDEFINED; + android.hardware.tv.tuner.FrontendAtsc3PlpSettings[] plpSettings; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3TimeInterleaveMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3TimeInterleaveMode.aidl new file mode 100644 index 0000000000..a9747f0eb7 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtsc3TimeInterleaveMode.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendAtsc3TimeInterleaveMode { + UNDEFINED = 0, + AUTO = 1, + CTI = 2, + HTI = 4, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtscCapabilities.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtscCapabilities.aidl new file mode 100644 index 0000000000..c24afae7b0 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtscCapabilities.aidl @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendAtscCapabilities { + int modulationCap; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtscModulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtscModulation.aidl new file mode 100644 index 0000000000..426fe20739 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtscModulation.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendAtscModulation { + UNDEFINED = 0, + AUTO = 1, + MOD_8VSB = 4, + MOD_16VSB = 8, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtscSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtscSettings.aidl new file mode 100644 index 0000000000..5ccdb85195 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendAtscSettings.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendAtscSettings { + int frequency; + int endFrequency; + android.hardware.tv.tuner.FrontendSpectralInversion inversion = android.hardware.tv.tuner.FrontendSpectralInversion.UNDEFINED; + android.hardware.tv.tuner.FrontendAtscModulation modulation = android.hardware.tv.tuner.FrontendAtscModulation.UNDEFINED; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendBandwidth.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendBandwidth.aidl new file mode 100644 index 0000000000..5355637422 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendBandwidth.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union FrontendBandwidth { + android.hardware.tv.tuner.FrontendAtsc3Bandwidth atsc3 = android.hardware.tv.tuner.FrontendAtsc3Bandwidth.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbcBandwidth dvbc; + android.hardware.tv.tuner.FrontendDvbtBandwidth dvbt; + android.hardware.tv.tuner.FrontendIsdbtBandwidth isdbt; + android.hardware.tv.tuner.FrontendDtmbBandwidth dtmb; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendCableTimeInterleaveMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendCableTimeInterleaveMode.aidl new file mode 100644 index 0000000000..ff71df39cf --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendCableTimeInterleaveMode.aidl @@ -0,0 +1,49 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendCableTimeInterleaveMode { + UNDEFINED = 0, + AUTO = 1, + INTERLEAVING_128_1_0 = 2, + INTERLEAVING_128_1_1 = 4, + INTERLEAVING_64_2 = 8, + INTERLEAVING_32_4 = 16, + INTERLEAVING_16_8 = 32, + INTERLEAVING_8_16 = 64, + INTERLEAVING_128_2 = 128, + INTERLEAVING_128_3 = 256, + INTERLEAVING_128_4 = 512, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendCapabilities.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendCapabilities.aidl new file mode 100644 index 0000000000..c013cd111a --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendCapabilities.aidl @@ -0,0 +1,48 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union FrontendCapabilities { + android.hardware.tv.tuner.FrontendAnalogCapabilities analogCaps; + android.hardware.tv.tuner.FrontendAtscCapabilities atscCaps; + android.hardware.tv.tuner.FrontendAtsc3Capabilities atsc3Caps; + android.hardware.tv.tuner.FrontendDtmbCapabilities dtmbCaps; + android.hardware.tv.tuner.FrontendDvbsCapabilities dvbsCaps; + android.hardware.tv.tuner.FrontendDvbcCapabilities dvbcCaps; + android.hardware.tv.tuner.FrontendDvbtCapabilities dvbtCaps; + android.hardware.tv.tuner.FrontendIsdbsCapabilities isdbsCaps; + android.hardware.tv.tuner.FrontendIsdbs3Capabilities isdbs3Caps; + android.hardware.tv.tuner.FrontendIsdbtCapabilities isdbtCaps; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbBandwidth.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbBandwidth.aidl new file mode 100644 index 0000000000..18d71d2a7f --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbBandwidth.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDtmbBandwidth { + UNDEFINED = 0, + AUTO = 1, + BANDWIDTH_8MHZ = 2, + BANDWIDTH_6MHZ = 4, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbCapabilities.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbCapabilities.aidl new file mode 100644 index 0000000000..8d35104e09 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbCapabilities.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendDtmbCapabilities { + int transmissionModeCap; + int bandwidthCap; + int modulationCap; + int codeRateCap; + int guardIntervalCap; + int interleaveModeCap; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbCodeRate.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbCodeRate.aidl new file mode 100644 index 0000000000..c9454e7506 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbCodeRate.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDtmbCodeRate { + UNDEFINED = 0, + AUTO = 1, + CODERATE_2_5 = 2, + CODERATE_3_5 = 4, + CODERATE_4_5 = 8, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbGuardInterval.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbGuardInterval.aidl new file mode 100644 index 0000000000..872eb6ae1c --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbGuardInterval.aidl @@ -0,0 +1,46 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDtmbGuardInterval { + UNDEFINED = 0, + AUTO = 1, + PN_420_VARIOUS = 2, + PN_595_CONST = 4, + PN_945_VARIOUS = 8, + PN_420_CONST = 16, + PN_945_CONST = 32, + PN_RESERVED = 64, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbModulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbModulation.aidl new file mode 100644 index 0000000000..088aac5e50 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbModulation.aidl @@ -0,0 +1,45 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDtmbModulation { + UNDEFINED = 0, + AUTO = 1, + CONSTELLATION_4QAM = 2, + CONSTELLATION_4QAM_NR = 4, + CONSTELLATION_16QAM = 8, + CONSTELLATION_32QAM = 16, + CONSTELLATION_64QAM = 32, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbSettings.aidl new file mode 100644 index 0000000000..9a2e341b2a --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbSettings.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendDtmbSettings { + int frequency; + int endFrequency; + android.hardware.tv.tuner.FrontendSpectralInversion inversion = android.hardware.tv.tuner.FrontendSpectralInversion.UNDEFINED; + android.hardware.tv.tuner.FrontendDtmbTransmissionMode transmissionMode = android.hardware.tv.tuner.FrontendDtmbTransmissionMode.UNDEFINED; + android.hardware.tv.tuner.FrontendDtmbBandwidth bandwidth = android.hardware.tv.tuner.FrontendDtmbBandwidth.UNDEFINED; + android.hardware.tv.tuner.FrontendDtmbModulation modulation = android.hardware.tv.tuner.FrontendDtmbModulation.UNDEFINED; + android.hardware.tv.tuner.FrontendDtmbCodeRate codeRate = android.hardware.tv.tuner.FrontendDtmbCodeRate.UNDEFINED; + android.hardware.tv.tuner.FrontendDtmbGuardInterval guardInterval = android.hardware.tv.tuner.FrontendDtmbGuardInterval.UNDEFINED; + android.hardware.tv.tuner.FrontendDtmbTimeInterleaveMode interleaveMode = android.hardware.tv.tuner.FrontendDtmbTimeInterleaveMode.UNDEFINED; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTimeInterleaveMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTimeInterleaveMode.aidl new file mode 100644 index 0000000000..8321ad0ebc --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTimeInterleaveMode.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDtmbTimeInterleaveMode { + UNDEFINED = 0, + AUTO = 1, + TIMER_INT_240 = 2, + TIMER_INT_720 = 4, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTransmissionMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTransmissionMode.aidl new file mode 100644 index 0000000000..5298291cd2 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDtmbTransmissionMode.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDtmbTransmissionMode { + UNDEFINED = 0, + AUTO = 1, + C1 = 2, + C3780 = 4, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcAnnex.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcAnnex.aidl new file mode 100644 index 0000000000..cdfedb6702 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcAnnex.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="byte") @VintfStability +enum FrontendDvbcAnnex { + UNDEFINED = 0, + A = 1, + B = 2, + C = 4, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcBandwidth.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcBandwidth.aidl new file mode 100644 index 0000000000..f0fe460d68 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcBandwidth.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbcBandwidth { + UNDEFINED = 0, + BANDWIDTH_5MHZ = 1, + BANDWIDTH_6MHZ = 2, + BANDWIDTH_7MHZ = 4, + BANDWIDTH_8MHZ = 8, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcCapabilities.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcCapabilities.aidl new file mode 100644 index 0000000000..0c0e3ee5d0 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcCapabilities.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendDvbcCapabilities { + int modulationCap; + long fecCap; + byte annexCap; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcModulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcModulation.aidl new file mode 100644 index 0000000000..0871777509 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcModulation.aidl @@ -0,0 +1,45 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbcModulation { + UNDEFINED = 0, + AUTO = 1, + MOD_16QAM = 2, + MOD_32QAM = 4, + MOD_64QAM = 8, + MOD_128QAM = 16, + MOD_256QAM = 32, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcOuterFec.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcOuterFec.aidl new file mode 100644 index 0000000000..f1e92c9d5a --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcOuterFec.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbcOuterFec { + UNDEFINED = 0, + OUTER_FEC_NONE = 1, + OUTER_FEC_RS = 2, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcSettings.aidl new file mode 100644 index 0000000000..55f04029f2 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbcSettings.aidl @@ -0,0 +1,48 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendDvbcSettings { + int frequency; + int endFrequency; + android.hardware.tv.tuner.FrontendDvbcModulation modulation = android.hardware.tv.tuner.FrontendDvbcModulation.UNDEFINED; + android.hardware.tv.tuner.FrontendInnerFec fec = android.hardware.tv.tuner.FrontendInnerFec.FEC_UNDEFINED; + int symbolRate; + android.hardware.tv.tuner.FrontendDvbcOuterFec outerFec = android.hardware.tv.tuner.FrontendDvbcOuterFec.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbcAnnex annex = android.hardware.tv.tuner.FrontendDvbcAnnex.UNDEFINED; + android.hardware.tv.tuner.FrontendSpectralInversion inversion = android.hardware.tv.tuner.FrontendSpectralInversion.UNDEFINED; + android.hardware.tv.tuner.FrontendCableTimeInterleaveMode interleaveMode = android.hardware.tv.tuner.FrontendCableTimeInterleaveMode.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbcBandwidth bandwidth = android.hardware.tv.tuner.FrontendDvbcBandwidth.UNDEFINED; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsCapabilities.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsCapabilities.aidl new file mode 100644 index 0000000000..43e8aee23b --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsCapabilities.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendDvbsCapabilities { + int modulationCap; + long innerfecCap; + byte standard; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsCodeRate.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsCodeRate.aidl new file mode 100644 index 0000000000..4c3d4e466a --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsCodeRate.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendDvbsCodeRate { + android.hardware.tv.tuner.FrontendInnerFec fec = android.hardware.tv.tuner.FrontendInnerFec.FEC_UNDEFINED; + boolean isLinear; + boolean isShortFrames; + int bitsPer1000Symbol; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsModulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsModulation.aidl new file mode 100644 index 0000000000..25951ccecb --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsModulation.aidl @@ -0,0 +1,53 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbsModulation { + UNDEFINED = 0, + AUTO = 1, + MOD_QPSK = 2, + MOD_8PSK = 4, + MOD_16QAM = 8, + MOD_16PSK = 16, + MOD_32PSK = 32, + MOD_ACM = 64, + MOD_8APSK = 128, + MOD_16APSK = 256, + MOD_32APSK = 512, + MOD_64APSK = 1024, + MOD_128APSK = 2048, + MOD_256APSK = 4096, + MOD_RESERVED = 8192, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsPilot.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsPilot.aidl new file mode 100644 index 0000000000..4f2c6eb8d7 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsPilot.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbsPilot { + UNDEFINED = 0, + ON = 1, + OFF = 2, + AUTO = 3, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsRolloff.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsRolloff.aidl new file mode 100644 index 0000000000..56ee37b613 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsRolloff.aidl @@ -0,0 +1,45 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbsRolloff { + UNDEFINED = 0, + ROLLOFF_0_35 = 1, + ROLLOFF_0_25 = 2, + ROLLOFF_0_20 = 3, + ROLLOFF_0_15 = 4, + ROLLOFF_0_10 = 5, + ROLLOFF_0_5 = 6, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsScanType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsScanType.aidl new file mode 100644 index 0000000000..110b1d8b1f --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsScanType.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbsScanType { + UNDEFINED = 0, + DIRECT = 1, + DISEQC = 2, + UNICABLE = 3, + JESS = 4, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsSettings.aidl new file mode 100644 index 0000000000..8a8c76f7f6 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsSettings.aidl @@ -0,0 +1,51 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendDvbsSettings { + int frequency; + int endFrequency; + android.hardware.tv.tuner.FrontendSpectralInversion inversion = android.hardware.tv.tuner.FrontendSpectralInversion.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbsModulation modulation = android.hardware.tv.tuner.FrontendDvbsModulation.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbsCodeRate coderate; + int symbolRate; + android.hardware.tv.tuner.FrontendDvbsRolloff rolloff = android.hardware.tv.tuner.FrontendDvbsRolloff.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbsPilot pilot = android.hardware.tv.tuner.FrontendDvbsPilot.UNDEFINED; + int inputStreamId; + android.hardware.tv.tuner.FrontendDvbsStandard standard = android.hardware.tv.tuner.FrontendDvbsStandard.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbsVcmMode vcmMode = android.hardware.tv.tuner.FrontendDvbsVcmMode.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbsScanType scanType = android.hardware.tv.tuner.FrontendDvbsScanType.UNDEFINED; + boolean isDiseqcRxMessage; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsStandard.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsStandard.aidl new file mode 100644 index 0000000000..b9cb657fb5 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsStandard.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="byte") @VintfStability +enum FrontendDvbsStandard { + UNDEFINED = 0, + AUTO = 1, + S = 2, + S2 = 4, + S2X = 8, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsVcmMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsVcmMode.aidl new file mode 100644 index 0000000000..2cbff7cc1b --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbsVcmMode.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbsVcmMode { + UNDEFINED = 0, + AUTO = 1, + MANUAL = 2, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtBandwidth.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtBandwidth.aidl new file mode 100644 index 0000000000..f5d14e898b --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtBandwidth.aidl @@ -0,0 +1,46 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbtBandwidth { + UNDEFINED = 0, + AUTO = 1, + BANDWIDTH_8MHZ = 2, + BANDWIDTH_7MHZ = 4, + BANDWIDTH_6MHZ = 8, + BANDWIDTH_5MHZ = 16, + BANDWIDTH_1_7MHZ = 32, + BANDWIDTH_10MHZ = 64, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtCapabilities.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtCapabilities.aidl new file mode 100644 index 0000000000..a0e6ce2710 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtCapabilities.aidl @@ -0,0 +1,46 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendDvbtCapabilities { + int transmissionModeCap; + int bandwidthCap; + int constellationCap; + int coderateCap; + int hierarchyCap; + int guardIntervalCap; + boolean isT2Supported; + boolean isMisoSupported; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtCoderate.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtCoderate.aidl new file mode 100644 index 0000000000..8bd0489a6e --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtCoderate.aidl @@ -0,0 +1,49 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbtCoderate { + UNDEFINED = 0, + AUTO = 1, + CODERATE_1_2 = 2, + CODERATE_2_3 = 4, + CODERATE_3_4 = 8, + CODERATE_5_6 = 16, + CODERATE_7_8 = 32, + CODERATE_3_5 = 64, + CODERATE_4_5 = 128, + CODERATE_6_7 = 256, + CODERATE_8_9 = 512, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtConstellation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtConstellation.aidl new file mode 100644 index 0000000000..bc40901de4 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtConstellation.aidl @@ -0,0 +1,48 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbtConstellation { + UNDEFINED = 0, + AUTO = 1, + CONSTELLATION_QPSK = 2, + CONSTELLATION_16QAM = 4, + CONSTELLATION_64QAM = 8, + CONSTELLATION_256QAM = 16, + CONSTELLATION_QPSK_R = 32, + CONSTELLATION_16QAM_R = 64, + CONSTELLATION_64QAM_R = 128, + CONSTELLATION_256QAM_R = 256, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtGuardInterval.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtGuardInterval.aidl new file mode 100644 index 0000000000..073a77e2b8 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtGuardInterval.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbtGuardInterval { + UNDEFINED = 0, + AUTO = 1, + INTERVAL_1_32 = 2, + INTERVAL_1_16 = 4, + INTERVAL_1_8 = 8, + INTERVAL_1_4 = 16, + INTERVAL_1_128 = 32, + INTERVAL_19_128 = 64, + INTERVAL_19_256 = 128, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtHierarchy.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtHierarchy.aidl new file mode 100644 index 0000000000..9ed5c8ceae --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtHierarchy.aidl @@ -0,0 +1,48 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbtHierarchy { + UNDEFINED = 0, + AUTO = 1, + HIERARCHY_NON_NATIVE = 2, + HIERARCHY_1_NATIVE = 4, + HIERARCHY_2_NATIVE = 8, + HIERARCHY_4_NATIVE = 16, + HIERARCHY_NON_INDEPTH = 32, + HIERARCHY_1_INDEPTH = 64, + HIERARCHY_2_INDEPTH = 128, + HIERARCHY_4_INDEPTH = 256, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtPlpMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtPlpMode.aidl new file mode 100644 index 0000000000..c80bc2aa5a --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtPlpMode.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbtPlpMode { + UNDEFINED = 0, + AUTO = 1, + MANUAL = 2, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtSettings.aidl new file mode 100644 index 0000000000..cc64549a47 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtSettings.aidl @@ -0,0 +1,54 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendDvbtSettings { + int frequency; + int endFrequency; + android.hardware.tv.tuner.FrontendSpectralInversion inversion = android.hardware.tv.tuner.FrontendSpectralInversion.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbtTransmissionMode transmissionMode = android.hardware.tv.tuner.FrontendDvbtTransmissionMode.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbtBandwidth bandwidth = android.hardware.tv.tuner.FrontendDvbtBandwidth.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbtConstellation constellation = android.hardware.tv.tuner.FrontendDvbtConstellation.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbtHierarchy hierarchy = android.hardware.tv.tuner.FrontendDvbtHierarchy.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbtCoderate hpCoderate = android.hardware.tv.tuner.FrontendDvbtCoderate.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbtCoderate lpCoderate = android.hardware.tv.tuner.FrontendDvbtCoderate.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbtGuardInterval guardInterval = android.hardware.tv.tuner.FrontendDvbtGuardInterval.UNDEFINED; + boolean isHighPriority; + android.hardware.tv.tuner.FrontendDvbtStandard standard = android.hardware.tv.tuner.FrontendDvbtStandard.UNDEFINED; + boolean isMiso; + android.hardware.tv.tuner.FrontendDvbtPlpMode plpMode = android.hardware.tv.tuner.FrontendDvbtPlpMode.UNDEFINED; + byte plpId; + byte plpGroupId; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtStandard.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtStandard.aidl new file mode 100644 index 0000000000..c7ba68abc6 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtStandard.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="byte") @VintfStability +enum FrontendDvbtStandard { + UNDEFINED = 0, + AUTO = 1, + T = 2, + T2 = 4, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.aidl new file mode 100644 index 0000000000..e3ca2e3901 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.aidl @@ -0,0 +1,49 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendDvbtTransmissionMode { + UNDEFINED = 0, + AUTO = 1, + MODE_2K = 2, + MODE_8K = 4, + MODE_4K = 8, + MODE_1K = 16, + MODE_16K = 32, + MODE_32K = 64, + MODE_8K_E = 128, + MODE_16K_E = 256, + MODE_32K_E = 512, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendEventType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendEventType.aidl new file mode 100644 index 0000000000..443313fead --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendEventType.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendEventType { + LOCKED = 0, + NO_SIGNAL = 1, + LOST_LOCK = 2, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendGuardInterval.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendGuardInterval.aidl new file mode 100644 index 0000000000..15c738a47c --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendGuardInterval.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union FrontendGuardInterval { + android.hardware.tv.tuner.FrontendDvbtGuardInterval dvbt = android.hardware.tv.tuner.FrontendDvbtGuardInterval.UNDEFINED; + android.hardware.tv.tuner.FrontendIsdbtGuardInterval isdbt; + android.hardware.tv.tuner.FrontendDtmbGuardInterval dtmb; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendInfo.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendInfo.aidl new file mode 100644 index 0000000000..2f8e6e5bd0 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendInfo.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendInfo { + android.hardware.tv.tuner.FrontendType type = android.hardware.tv.tuner.FrontendType.UNDEFINED; + int minFrequency; + int maxFrequency; + int minSymbolRate; + int maxSymbolRate; + int acquireRange; + int exclusiveGroupId; + android.hardware.tv.tuner.FrontendStatusType[] statusCaps; + android.hardware.tv.tuner.FrontendCapabilities frontendCaps; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendInnerFec.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendInnerFec.aidl new file mode 100644 index 0000000000..19599a3f82 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendInnerFec.aidl @@ -0,0 +1,92 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="long") @VintfStability +enum FrontendInnerFec { + FEC_UNDEFINED = 0, + AUTO = 1, + FEC_1_2 = 2, + FEC_1_3 = 4, + FEC_1_4 = 8, + FEC_1_5 = 16, + FEC_2_3 = 32, + FEC_2_5 = 64, + FEC_2_9 = 128, + FEC_3_4 = 256, + FEC_3_5 = 512, + FEC_4_5 = 1024, + FEC_4_15 = 2048, + FEC_5_6 = 4096, + FEC_5_9 = 8192, + FEC_6_7 = 16384, + FEC_7_8 = 32768, + FEC_7_9 = 65536, + FEC_7_15 = 131072, + FEC_8_9 = 262144, + FEC_8_15 = 524288, + FEC_9_10 = 1048576, + FEC_9_20 = 2097152, + FEC_11_15 = 4194304, + FEC_11_20 = 8388608, + FEC_11_45 = 16777216, + FEC_13_18 = 33554432, + FEC_13_45 = 67108864, + FEC_14_45 = 134217728, + FEC_23_36 = 268435456, + FEC_25_36 = 536870912, + FEC_26_45 = 1073741824, + FEC_28_45 = 2147483648, + FEC_29_45 = 4294967296, + FEC_31_45 = 8589934592, + FEC_32_45 = 17179869184, + FEC_77_90 = 34359738368, + FEC_2_15 = 68719476736, + FEC_3_15 = 137438953472, + FEC_5_15 = 274877906944, + FEC_6_15 = 549755813888, + FEC_9_15 = 1099511627776, + FEC_10_15 = 2199023255552, + FEC_12_15 = 4398046511104, + FEC_13_15 = 8796093022208, + FEC_18_30 = 17592186044416, + FEC_20_30 = 35184372088832, + FEC_90_180 = 70368744177664, + FEC_96_180 = 140737488355328, + FEC_104_180 = 281474976710656, + FEC_128_180 = 562949953421312, + FEC_132_180 = 1125899906842624, + FEC_135_180 = 2251799813685248, + FEC_140_180 = 4503599627370496, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendInterleaveMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendInterleaveMode.aidl new file mode 100644 index 0000000000..5e037318df --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendInterleaveMode.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union FrontendInterleaveMode { + android.hardware.tv.tuner.FrontendAtsc3TimeInterleaveMode atsc3 = android.hardware.tv.tuner.FrontendAtsc3TimeInterleaveMode.UNDEFINED; + android.hardware.tv.tuner.FrontendCableTimeInterleaveMode dvbc; + android.hardware.tv.tuner.FrontendDtmbTimeInterleaveMode dtmb; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Capabilities.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Capabilities.aidl new file mode 100644 index 0000000000..4be37c2006 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Capabilities.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendIsdbs3Capabilities { + int modulationCap; + int coderateCap; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Coderate.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Coderate.aidl new file mode 100644 index 0000000000..1ee7f07e71 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Coderate.aidl @@ -0,0 +1,51 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendIsdbs3Coderate { + UNDEFINED = 0, + AUTO = 1, + CODERATE_1_3 = 2, + CODERATE_2_5 = 4, + CODERATE_1_2 = 8, + CODERATE_3_5 = 16, + CODERATE_2_3 = 32, + CODERATE_3_4 = 64, + CODERATE_7_9 = 128, + CODERATE_4_5 = 256, + CODERATE_5_6 = 512, + CODERATE_7_8 = 1024, + CODERATE_9_10 = 2048, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Modulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Modulation.aidl new file mode 100644 index 0000000000..3603292eca --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Modulation.aidl @@ -0,0 +1,45 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendIsdbs3Modulation { + UNDEFINED = 0, + AUTO = 1, + MOD_BPSK = 2, + MOD_QPSK = 4, + MOD_8PSK = 8, + MOD_16APSK = 16, + MOD_32APSK = 32, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Rolloff.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Rolloff.aidl new file mode 100644 index 0000000000..733760c471 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Rolloff.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendIsdbs3Rolloff { + UNDEFINED = 0, + ROLLOFF_0_03 = 1, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Settings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Settings.aidl new file mode 100644 index 0000000000..b96bf32f2a --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbs3Settings.aidl @@ -0,0 +1,46 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendIsdbs3Settings { + int frequency; + int endFrequency; + char streamId; + android.hardware.tv.tuner.FrontendIsdbsStreamIdType streamIdType = android.hardware.tv.tuner.FrontendIsdbsStreamIdType.UNDEFINED; + android.hardware.tv.tuner.FrontendIsdbs3Modulation modulation = android.hardware.tv.tuner.FrontendIsdbs3Modulation.UNDEFINED; + android.hardware.tv.tuner.FrontendIsdbs3Coderate coderate = android.hardware.tv.tuner.FrontendIsdbs3Coderate.UNDEFINED; + int symbolRate; + android.hardware.tv.tuner.FrontendIsdbs3Rolloff rolloff = android.hardware.tv.tuner.FrontendIsdbs3Rolloff.UNDEFINED; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsCapabilities.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsCapabilities.aidl new file mode 100644 index 0000000000..2cb892cd3d --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsCapabilities.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendIsdbsCapabilities { + int modulationCap; + int coderateCap; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsCoderate.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsCoderate.aidl new file mode 100644 index 0000000000..09e9c5902d --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsCoderate.aidl @@ -0,0 +1,45 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendIsdbsCoderate { + UNDEFINED = 0, + AUTO = 1, + CODERATE_1_2 = 2, + CODERATE_2_3 = 4, + CODERATE_3_4 = 8, + CODERATE_5_6 = 16, + CODERATE_7_8 = 32, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsModulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsModulation.aidl new file mode 100644 index 0000000000..7b9bde66dd --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsModulation.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendIsdbsModulation { + UNDEFINED = 0, + AUTO = 1, + MOD_BPSK = 2, + MOD_QPSK = 4, + MOD_TC8PSK = 8, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsRolloff.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsRolloff.aidl new file mode 100644 index 0000000000..a2ab154661 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsRolloff.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendIsdbsRolloff { + UNDEFINED = 0, + ROLLOFF_0_35 = 1, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsSettings.aidl new file mode 100644 index 0000000000..0b48ac5a3d --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsSettings.aidl @@ -0,0 +1,46 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendIsdbsSettings { + int frequency; + int endFrequency; + char streamId; + android.hardware.tv.tuner.FrontendIsdbsStreamIdType streamIdType = android.hardware.tv.tuner.FrontendIsdbsStreamIdType.UNDEFINED; + android.hardware.tv.tuner.FrontendIsdbsModulation modulation = android.hardware.tv.tuner.FrontendIsdbsModulation.UNDEFINED; + android.hardware.tv.tuner.FrontendIsdbsCoderate coderate = android.hardware.tv.tuner.FrontendIsdbsCoderate.UNDEFINED; + int symbolRate; + android.hardware.tv.tuner.FrontendIsdbsRolloff rolloff = android.hardware.tv.tuner.FrontendIsdbsRolloff.UNDEFINED; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsStreamIdType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsStreamIdType.aidl new file mode 100644 index 0000000000..089f611e9c --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbsStreamIdType.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendIsdbsStreamIdType { + STREAM_ID = 0, + RELATIVE_STREAM_NUMBER = 1, + UNDEFINED = 2, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtBandwidth.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtBandwidth.aidl new file mode 100644 index 0000000000..cd492142a9 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtBandwidth.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendIsdbtBandwidth { + UNDEFINED = 0, + AUTO = 1, + BANDWIDTH_8MHZ = 2, + BANDWIDTH_7MHZ = 4, + BANDWIDTH_6MHZ = 8, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtCapabilities.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtCapabilities.aidl new file mode 100644 index 0000000000..097fcb89b3 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtCapabilities.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendIsdbtCapabilities { + int modeCap; + int bandwidthCap; + int modulationCap; + int coderateCap; + int guardIntervalCap; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtCoderate.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtCoderate.aidl new file mode 100644 index 0000000000..2b747edbbd --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtCoderate.aidl @@ -0,0 +1,49 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendIsdbtCoderate { + UNDEFINED = 0, + AUTO = 1, + CODERATE_1_2 = 2, + CODERATE_2_3 = 4, + CODERATE_3_4 = 8, + CODERATE_5_6 = 16, + CODERATE_7_8 = 32, + CODERATE_3_5 = 64, + CODERATE_4_5 = 128, + CODERATE_6_7 = 256, + CODERATE_8_9 = 512, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtGuardInterval.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtGuardInterval.aidl new file mode 100644 index 0000000000..42a023adc9 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtGuardInterval.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendIsdbtGuardInterval { + UNDEFINED = 0, + AUTO = 1, + INTERVAL_1_32 = 2, + INTERVAL_1_16 = 4, + INTERVAL_1_8 = 8, + INTERVAL_1_4 = 16, + INTERVAL_1_128 = 32, + INTERVAL_19_128 = 64, + INTERVAL_19_256 = 128, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtMode.aidl new file mode 100644 index 0000000000..54698abb53 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtMode.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendIsdbtMode { + UNDEFINED = 0, + AUTO = 1, + MODE_1 = 2, + MODE_2 = 4, + MODE_3 = 8, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtModulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtModulation.aidl new file mode 100644 index 0000000000..a31e0cf7b0 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtModulation.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendIsdbtModulation { + UNDEFINED = 0, + AUTO = 1, + MOD_DQPSK = 2, + MOD_QPSK = 4, + MOD_16QAM = 8, + MOD_64QAM = 16, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtSettings.aidl new file mode 100644 index 0000000000..ffd30ef61c --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendIsdbtSettings.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendIsdbtSettings { + int frequency; + int endFrequency; + android.hardware.tv.tuner.FrontendSpectralInversion inversion = android.hardware.tv.tuner.FrontendSpectralInversion.UNDEFINED; + android.hardware.tv.tuner.FrontendIsdbtModulation modulation = android.hardware.tv.tuner.FrontendIsdbtModulation.UNDEFINED; + android.hardware.tv.tuner.FrontendIsdbtBandwidth bandwidth = android.hardware.tv.tuner.FrontendIsdbtBandwidth.UNDEFINED; + android.hardware.tv.tuner.FrontendIsdbtMode mode = android.hardware.tv.tuner.FrontendIsdbtMode.UNDEFINED; + android.hardware.tv.tuner.FrontendIsdbtCoderate coderate = android.hardware.tv.tuner.FrontendIsdbtCoderate.UNDEFINED; + android.hardware.tv.tuner.FrontendIsdbtGuardInterval guardInterval = android.hardware.tv.tuner.FrontendIsdbtGuardInterval.UNDEFINED; + int serviceAreaId; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendModulation.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendModulation.aidl new file mode 100644 index 0000000000..6e396b0422 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendModulation.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union FrontendModulation { + android.hardware.tv.tuner.FrontendDvbcModulation dvbc = android.hardware.tv.tuner.FrontendDvbcModulation.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbsModulation dvbs; + android.hardware.tv.tuner.FrontendDvbtConstellation dvbt; + android.hardware.tv.tuner.FrontendIsdbsModulation isdbs; + android.hardware.tv.tuner.FrontendIsdbs3Modulation isdbs3; + android.hardware.tv.tuner.FrontendIsdbtModulation isdbt; + android.hardware.tv.tuner.FrontendAtscModulation atsc; + android.hardware.tv.tuner.FrontendAtsc3Modulation atsc3; + android.hardware.tv.tuner.FrontendDtmbModulation dtmb; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendModulationStatus.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendModulationStatus.aidl new file mode 100644 index 0000000000..723fdd044b --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendModulationStatus.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union FrontendModulationStatus { + android.hardware.tv.tuner.FrontendDvbcModulation dvbc = android.hardware.tv.tuner.FrontendDvbcModulation.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbsModulation dvbs; + android.hardware.tv.tuner.FrontendIsdbsModulation isdbs; + android.hardware.tv.tuner.FrontendIsdbs3Modulation isdbs3; + android.hardware.tv.tuner.FrontendIsdbtModulation isdbt; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendRollOff.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendRollOff.aidl new file mode 100644 index 0000000000..c5f8b8e8b7 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendRollOff.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union FrontendRollOff { + android.hardware.tv.tuner.FrontendDvbsRolloff dvbs = android.hardware.tv.tuner.FrontendDvbsRolloff.UNDEFINED; + android.hardware.tv.tuner.FrontendIsdbsRolloff isdbs; + android.hardware.tv.tuner.FrontendIsdbs3Rolloff isdbs3; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanAtsc3PlpInfo.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanAtsc3PlpInfo.aidl new file mode 100644 index 0000000000..4e217ef8f3 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanAtsc3PlpInfo.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendScanAtsc3PlpInfo { + byte plpId; + boolean bLlsFlag; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanMessage.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanMessage.aidl new file mode 100644 index 0000000000..882bdadf83 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanMessage.aidl @@ -0,0 +1,53 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union FrontendScanMessage { + boolean isLocked; + boolean isEnd; + byte progressPercent; + int[] frequencies; + int[] symbolRates; + android.hardware.tv.tuner.FrontendDvbtHierarchy hierarchy; + android.hardware.tv.tuner.FrontendAnalogType analogType; + byte[] plpIds; + byte[] groupIds; + char[] inputStreamIds; + android.hardware.tv.tuner.FrontendScanMessageStandard std; + android.hardware.tv.tuner.FrontendScanAtsc3PlpInfo[] atsc3PlpInfos; + android.hardware.tv.tuner.FrontendModulation modulation; + android.hardware.tv.tuner.FrontendDvbcAnnex annex; + boolean isHighPriority; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanMessageStandard.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanMessageStandard.aidl new file mode 100644 index 0000000000..e163fc6670 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanMessageStandard.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union FrontendScanMessageStandard { + android.hardware.tv.tuner.FrontendDvbsStandard sStd = android.hardware.tv.tuner.FrontendDvbsStandard.UNDEFINED; + android.hardware.tv.tuner.FrontendDvbtStandard tStd; + android.hardware.tv.tuner.FrontendAnalogSifStandard sifStd; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanMessageType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanMessageType.aidl new file mode 100644 index 0000000000..b121c8513a --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanMessageType.aidl @@ -0,0 +1,53 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendScanMessageType { + LOCKED = 0, + END = 1, + PROGRESS_PERCENT = 2, + FREQUENCY = 3, + SYMBOL_RATE = 4, + HIERARCHY = 5, + ANALOG_TYPE = 6, + PLP_IDS = 7, + GROUP_IDS = 8, + INPUT_STREAM_IDS = 9, + STANDARD = 10, + ATSC3_PLP_INFO = 11, + MODULATION = 12, + DVBC_ANNEX = 13, + HIGH_PRIORITY = 14, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanType.aidl new file mode 100644 index 0000000000..ed42d0aac9 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendScanType.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendScanType { + SCAN_UNDEFINED = 0, + SCAN_AUTO = 1, + SCAN_BLIND = 2, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendSettings.aidl new file mode 100644 index 0000000000..7eae9df379 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendSettings.aidl @@ -0,0 +1,48 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union FrontendSettings { + android.hardware.tv.tuner.FrontendAnalogSettings analog; + android.hardware.tv.tuner.FrontendAtscSettings atsc; + android.hardware.tv.tuner.FrontendAtsc3Settings atsc3; + android.hardware.tv.tuner.FrontendDvbsSettings dvbs; + android.hardware.tv.tuner.FrontendDvbcSettings dvbc; + android.hardware.tv.tuner.FrontendDvbtSettings dvbt; + android.hardware.tv.tuner.FrontendIsdbsSettings isdbs; + android.hardware.tv.tuner.FrontendIsdbs3Settings isdbs3; + android.hardware.tv.tuner.FrontendIsdbtSettings isdbt; + android.hardware.tv.tuner.FrontendDtmbSettings dtmb; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendSpectralInversion.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendSpectralInversion.aidl new file mode 100644 index 0000000000..ff11bb8dab --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendSpectralInversion.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendSpectralInversion { + UNDEFINED = 0, + NORMAL = 1, + INVERTED = 2, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatus.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatus.aidl new file mode 100644 index 0000000000..114b72f940 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatus.aidl @@ -0,0 +1,75 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union FrontendStatus { + boolean isDemodLocked; + int snr; + int ber; + int per; + int preBer; + int signalQuality; + int signalStrength; + int symbolRate; + android.hardware.tv.tuner.FrontendInnerFec innerFec; + android.hardware.tv.tuner.FrontendModulationStatus modulationStatus; + android.hardware.tv.tuner.FrontendSpectralInversion inversion; + android.hardware.tv.tuner.LnbVoltage lnbVoltage; + byte plpId; + boolean isEWBS; + byte agc; + boolean isLnaOn; + boolean[] isLayerError; + int mer; + int freqOffset; + android.hardware.tv.tuner.FrontendDvbtHierarchy hierarchy; + boolean isRfLocked; + android.hardware.tv.tuner.FrontendStatusAtsc3PlpInfo[] plpInfo; + android.hardware.tv.tuner.FrontendModulation[] modulations; + int[] bers; + android.hardware.tv.tuner.FrontendInnerFec[] codeRates; + android.hardware.tv.tuner.FrontendBandwidth bandwidth; + android.hardware.tv.tuner.FrontendGuardInterval interval; + android.hardware.tv.tuner.FrontendTransmissionMode transmissionMode; + int uec; + char systemId; + android.hardware.tv.tuner.FrontendInterleaveMode[] interleaving; + byte[] isdbtSegment; + int[] tsDataRate; + android.hardware.tv.tuner.FrontendRollOff rollOff; + boolean isMiso; + boolean isLinear; + boolean isShortFrames; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusAtsc3PlpInfo.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusAtsc3PlpInfo.aidl new file mode 100644 index 0000000000..9cd1b8a8f9 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusAtsc3PlpInfo.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable FrontendStatusAtsc3PlpInfo { + byte plpId; + boolean isLocked; + int uec; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusType.aidl new file mode 100644 index 0000000000..7b8bc47c3d --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendStatusType.aidl @@ -0,0 +1,75 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendStatusType { + DEMOD_LOCK = 0, + SNR = 1, + BER = 2, + PER = 3, + PRE_BER = 4, + SIGNAL_QUALITY = 5, + SIGNAL_STRENGTH = 6, + SYMBOL_RATE = 7, + FEC = 8, + MODULATION = 9, + SPECTRAL = 10, + LNB_VOLTAGE = 11, + PLP_ID = 12, + EWBS = 13, + AGC = 14, + LNA = 15, + LAYER_ERROR = 16, + MER = 17, + FREQ_OFFSET = 18, + HIERARCHY = 19, + RF_LOCK = 20, + ATSC3_PLP_INFO = 21, + MODULATIONS = 22, + BERS = 23, + CODERATES = 24, + BANDWIDTH = 25, + GUARD_INTERVAL = 26, + TRANSMISSION_MODE = 27, + UEC = 28, + T2_SYSTEM_ID = 29, + INTERLEAVINGS = 30, + ISDBT_SEGMENTS = 31, + TS_DATA_RATES = 32, + ROLL_OFF = 33, + IS_MISO = 34, + IS_LINEAR = 35, + IS_SHORT_FRAMES = 36, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendTransmissionMode.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendTransmissionMode.aidl new file mode 100644 index 0000000000..72c36419ec --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendTransmissionMode.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +union FrontendTransmissionMode { + android.hardware.tv.tuner.FrontendDvbtTransmissionMode dvbt = android.hardware.tv.tuner.FrontendDvbtTransmissionMode.UNDEFINED; + android.hardware.tv.tuner.FrontendIsdbtMode isdbt; + android.hardware.tv.tuner.FrontendDtmbTransmissionMode dtmb; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendType.aidl new file mode 100644 index 0000000000..99a120bcb3 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/FrontendType.aidl @@ -0,0 +1,49 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum FrontendType { + UNDEFINED = 0, + ANALOG = 1, + ATSC = 2, + ATSC3 = 3, + DVBC = 4, + DVBS = 5, + DVBT = 6, + ISDBS = 7, + ISDBS3 = 8, + ISDBT = 9, + DTMB = 10, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IDemux.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IDemux.aidl new file mode 100644 index 0000000000..59ec92ba3b --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IDemux.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +interface IDemux { + void setFrontendDataSource(in int frontendId); + android.hardware.tv.tuner.IFilter openFilter(in android.hardware.tv.tuner.DemuxFilterType type, in int bufferSize, in android.hardware.tv.tuner.IFilterCallback cb); + android.hardware.tv.tuner.ITimeFilter openTimeFilter(); + int getAvSyncHwId(in android.hardware.tv.tuner.IFilter filter); + long getAvSyncTime(in int avSyncHwId); + void close(); + android.hardware.tv.tuner.IDvr openDvr(in android.hardware.tv.tuner.DvrType type, in int bufferSize, in android.hardware.tv.tuner.IDvrCallback cb); + void connectCiCam(in int ciCamId); + void disconnectCiCam(); +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IDescrambler.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IDescrambler.aidl new file mode 100644 index 0000000000..3cf3c044ba --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IDescrambler.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +interface IDescrambler { + void setDemuxSource(in int demuxId); + void setKeyToken(in byte[] keyToken); + void addPid(in android.hardware.tv.tuner.DemuxPid pid, in android.hardware.tv.tuner.IFilter optionalSourceFilter); + void removePid(in android.hardware.tv.tuner.DemuxPid pid, in android.hardware.tv.tuner.IFilter optionalSourceFilter); + void close(); +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IDvr.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IDvr.aidl new file mode 100644 index 0000000000..450cd79129 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IDvr.aidl @@ -0,0 +1,46 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +interface IDvr { + void getQueueDesc(out android.hardware.common.fmq.MQDescriptor<byte,android.hardware.common.fmq.SynchronizedReadWrite> queue); + void configure(in android.hardware.tv.tuner.DvrSettings settings); + void attachFilter(in android.hardware.tv.tuner.IFilter filter); + void detachFilter(in android.hardware.tv.tuner.IFilter filter); + void start(); + void stop(); + void flush(); + void close(); +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IDvrCallback.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IDvrCallback.aidl new file mode 100644 index 0000000000..13c8644b7b --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IDvrCallback.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +interface IDvrCallback { + oneway void onPlaybackStatus(in android.hardware.tv.tuner.PlaybackStatus status); + oneway void onRecordStatus(in android.hardware.tv.tuner.RecordStatus status); +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IFilter.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IFilter.aidl new file mode 100644 index 0000000000..a0454f436a --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IFilter.aidl @@ -0,0 +1,52 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +interface IFilter { + void getQueueDesc(out android.hardware.common.fmq.MQDescriptor<byte,android.hardware.common.fmq.SynchronizedReadWrite> queue); + void close(); + void configure(in android.hardware.tv.tuner.DemuxFilterSettings settings); + void configureAvStreamType(in android.hardware.tv.tuner.AvStreamType avStreamType); + void configureIpCid(in int ipCid); + void configureMonitorEvent(in int monitorEventTypes); + void start(); + void stop(); + void flush(); + long getAvSharedHandle(out android.hardware.common.NativeHandle avMemory); + int getId(); + long getId64Bit(); + void releaseAvHandle(in android.hardware.common.NativeHandle avMemory, in long avDataId); + void setDataSource(in android.hardware.tv.tuner.IFilter filter); +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IFilterCallback.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IFilterCallback.aidl new file mode 100644 index 0000000000..d8bedba451 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IFilterCallback.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +interface IFilterCallback { + oneway void onFilterEvent(in android.hardware.tv.tuner.DemuxFilterEvent[] events); + oneway void onFilterStatus(in android.hardware.tv.tuner.DemuxFilterStatus status); +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IFrontend.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IFrontend.aidl new file mode 100644 index 0000000000..ed5b0c02c7 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IFrontend.aidl @@ -0,0 +1,49 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +interface IFrontend { + void setCallback(in android.hardware.tv.tuner.IFrontendCallback callback); + void tune(in android.hardware.tv.tuner.FrontendSettings settings); + void stopTune(); + void close(); + void scan(in android.hardware.tv.tuner.FrontendSettings settings, in android.hardware.tv.tuner.FrontendScanType type); + void stopScan(); + android.hardware.tv.tuner.FrontendStatus[] getStatus(in android.hardware.tv.tuner.FrontendStatusType[] statusTypes); + void setLnb(in int lnbId); + void setLna(in boolean bEnable); + int linkCiCam(in int ciCamId); + void unlinkCiCam(in int ciCamId); +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IFrontendCallback.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IFrontendCallback.aidl new file mode 100644 index 0000000000..c22d280834 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/IFrontendCallback.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +interface IFrontendCallback { + oneway void onEvent(in android.hardware.tv.tuner.FrontendEventType frontendEventType); + oneway void onScanMessage(in android.hardware.tv.tuner.FrontendScanMessageType type, in android.hardware.tv.tuner.FrontendScanMessage message); +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ILnb.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ILnb.aidl new file mode 100644 index 0000000000..c3fdd87e62 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ILnb.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +interface ILnb { + void setCallback(in android.hardware.tv.tuner.ILnbCallback callback); + void setVoltage(in android.hardware.tv.tuner.LnbVoltage voltage); + void setTone(in android.hardware.tv.tuner.LnbTone tone); + void setSatellitePosition(in android.hardware.tv.tuner.LnbPosition position); + void sendDiseqcMessage(in byte[] diseqcMessage); + void close(); +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ILnbCallback.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ILnbCallback.aidl new file mode 100644 index 0000000000..42e84da4d1 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ILnbCallback.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +interface ILnbCallback { + oneway void onDiseqcMessage(in byte[] diseqcMessage); + oneway void onEvent(in android.hardware.tv.tuner.LnbEventType lnbEventType); +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ITimeFilter.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ITimeFilter.aidl new file mode 100644 index 0000000000..838eeba1d2 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ITimeFilter.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +interface ITimeFilter { + void setTimeStamp(in long timeStamp); + void clearTimeStamp(); + long getTimeStamp(); + long getSourceTime(); + void close(); +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ITuner.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ITuner.aidl new file mode 100644 index 0000000000..0e903d8a36 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ITuner.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@SuppressWarnings(value={"out-array"}) @VintfStability +interface ITuner { + int[] getFrontendIds(); + android.hardware.tv.tuner.IFrontend openFrontendById(in int frontendId); + android.hardware.tv.tuner.IDemux openDemux(out int[] demuxId); + android.hardware.tv.tuner.DemuxCapabilities getDemuxCaps(); + android.hardware.tv.tuner.IDescrambler openDescrambler(); + android.hardware.tv.tuner.FrontendInfo getFrontendInfo(in int frontendId); + int[] getLnbIds(); + android.hardware.tv.tuner.ILnb openLnbById(in int lnbId); + android.hardware.tv.tuner.ILnb openLnbByName(in String lnbName, out int[] lnbId); +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbEventType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbEventType.aidl new file mode 100644 index 0000000000..e6e2b0548b --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbEventType.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum LnbEventType { + DISEQC_RX_OVERFLOW = 0, + DISEQC_RX_TIMEOUT = 1, + DISEQC_RX_PARITY_ERROR = 2, + LNB_OVERLOAD = 3, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbPosition.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbPosition.aidl new file mode 100644 index 0000000000..5fc4d152d2 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbPosition.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum LnbPosition { + UNDEFINED = 0, + POSITION_A = 1, + POSITION_B = 2, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbTone.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbTone.aidl new file mode 100644 index 0000000000..3217de99ff --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbTone.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum LnbTone { + NONE = 0, + CONTINUOUS = 1, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbVoltage.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbVoltage.aidl new file mode 100644 index 0000000000..034c7e6a6e --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/LnbVoltage.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum LnbVoltage { + NONE = 0, + VOLTAGE_5V = 1, + VOLTAGE_11V = 2, + VOLTAGE_12V = 3, + VOLTAGE_13V = 4, + VOLTAGE_14V = 5, + VOLTAGE_15V = 6, + VOLTAGE_18V = 7, + VOLTAGE_19V = 8, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/PlaybackSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/PlaybackSettings.aidl new file mode 100644 index 0000000000..ff459e227f --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/PlaybackSettings.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable PlaybackSettings { + int statusMask; + int lowThreshold; + int highThreshold; + android.hardware.tv.tuner.DataFormat dataFormat = android.hardware.tv.tuner.DataFormat.UNDEFINED; + byte packetSize; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/PlaybackStatus.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/PlaybackStatus.aidl new file mode 100644 index 0000000000..850b737559 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/PlaybackStatus.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum PlaybackStatus { + SPACE_EMPTY = 1, + SPACE_ALMOST_EMPTY = 2, + SPACE_ALMOST_FULL = 4, + SPACE_FULL = 8, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/RecordSettings.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/RecordSettings.aidl new file mode 100644 index 0000000000..447de9871d --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/RecordSettings.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@VintfStability +parcelable RecordSettings { + int statusMask; + int lowThreshold; + int highThreshold; + android.hardware.tv.tuner.DataFormat dataFormat = android.hardware.tv.tuner.DataFormat.UNDEFINED; + byte packetSize; +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/RecordStatus.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/RecordStatus.aidl new file mode 100644 index 0000000000..48bf9ecacf --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/RecordStatus.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="byte") @VintfStability +enum RecordStatus { + DATA_READY = 1, + LOW_WATER = 2, + HIGH_WATER = 4, + OVERFLOW = 8, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Result.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Result.aidl new file mode 100644 index 0000000000..4e22f678c8 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/Result.aidl @@ -0,0 +1,45 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum Result { + SUCCESS = 0, + UNAVAILABLE = 1, + NOT_INITIALIZED = 2, + INVALID_STATE = 3, + INVALID_ARGUMENT = 4, + OUT_OF_MEMORY = 5, + UNKNOWN_ERROR = 6, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ScramblingStatus.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ScramblingStatus.aidl new file mode 100644 index 0000000000..656fe20f21 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/ScramblingStatus.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum ScramblingStatus { + UNKNOWN = 1, + NOT_SCRAMBLED = 2, + SCRAMBLED = 4, +} diff --git a/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/VideoStreamType.aidl b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/VideoStreamType.aidl new file mode 100644 index 0000000000..9dfd686a69 --- /dev/null +++ b/tv/tuner/aidl/aidl_api/android.hardware.tv.tuner/current/android/hardware/tv/tuner/VideoStreamType.aidl @@ -0,0 +1,51 @@ +/* + * Copyright 2021 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m <name>-update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.tv.tuner; +/* @hide */ +@Backing(type="int") @VintfStability +enum VideoStreamType { + UNDEFINED = 0, + RESERVED = 1, + MPEG1 = 2, + MPEG2 = 3, + MPEG4P2 = 4, + AVC = 5, + HEVC = 6, + VC1 = 7, + VP8 = 8, + VP9 = 9, + AV1 = 10, + AVS = 11, + AVS2 = 12, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/AudioExtraMetaData.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/AudioExtraMetaData.aidl new file mode 100644 index 0000000000..b5adb7ddd0 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/AudioExtraMetaData.aidl @@ -0,0 +1,37 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Extra Meta Data from AD (Audio Descriptor) according to + * ETSI TS 101 154 V2.1.1. + * @hide + */ +@VintfStability +parcelable AudioExtraMetaData { + byte adFade; + + byte adPan; + + byte versionTextTag; + + byte adGainCenter; + + byte adGainFront; + + byte adGainSurround; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/AudioStreamType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/AudioStreamType.aidl new file mode 100644 index 0000000000..1bb5c68fb3 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/AudioStreamType.aidl @@ -0,0 +1,102 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Audio stream coding format. + * @hide + */ +@VintfStability +@Backing(type="int") +enum AudioStreamType { + UNDEFINED, + + /* + * Uncompressed Audio + */ + PCM, + + /* + * MPEG Audio Layer III versions + */ + MP3, + + /* + * ISO/IEC 11172 Audio + */ + MPEG1, + + /* + * ISO/IEC 13818-3 + */ + MPEG2, + + /* + * ISO/IEC 23008-3 (MPEG-H Part 3) + */ + MPEGH, + + /* + * ISO/IEC 14496-3 + */ + AAC, + + /* + * Dolby Digital + */ + AC3, + + /* + * Dolby Digital Plus + */ + EAC3, + + /* + * Dolby AC-4 + */ + AC4, + + /* + * Basic DTS + */ + DTS, + + /* + * High Resolution DTS + */ + DTS_HD, + + /* + * Windows Media Audio + */ + WMA, + + /* + * Opus Interactive Audio Codec + */ + OPUS, + + /* + * VORBIS Interactive Audio Codec + */ + VORBIS, + + /* + * SJ/T 11368-2006 + */ + DRA, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/AvStreamType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/AvStreamType.aidl new file mode 100644 index 0000000000..684dfb9eb1 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/AvStreamType.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.AudioStreamType; +import android.hardware.tv.tuner.VideoStreamType; + +/** + * Stream type for A/V filter. + * @hide + */ +@VintfStability +union AvStreamType { + VideoStreamType video = VideoStreamType.UNDEFINED; + + AudioStreamType audio; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/Constant.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/Constant.aidl new file mode 100644 index 0000000000..891794a50f --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/Constant.aidl @@ -0,0 +1,86 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * @hide + */ +@VintfStability +@Backing(type="int") +enum Constant { + /** + * An invalid packet ID in transport stream according to ISO/IEC 13818-1. + */ + INVALID_TS_PID = 0xFFFF, + + /** + * An invalid Stream ID. + */ + INVALID_STREAM_ID = 0xFFFF, + + /** + * An invalid Filter ID. + */ + INVALID_FILTER_ID = 0xFFFFFFFF, + + /** + * An invalid AV sync hardware ID. + */ + INVALID_AV_SYNC_ID = 0xFFFFFFFF, + + /** + * An invalid mpuSequenceNumber. + */ + INVALID_MMTP_RECORD_EVENT_MPT_SEQUENCE_NUM = 0xFFFFFFFF, + + /** + * An invalid first macroblock address. + */ + INVALID_FIRST_MACROBLOCK_IN_SLICE = 0xFFFFFFFF, + + /** + * An invalid frenquency that can be used as the default value of the frontend setting. + */ + INVALID_FRONTEND_SETTING_FREQUENCY = 0xFFFFFFFF, + + /** + * An invalid context id that can be used as the default value of the unconfigured id. It can + * be used to reset the configured ip context id. + */ + INVALID_IP_FILTER_CONTEXT_ID = 0xFFFFFFFF, + + /** + * An invalid local transport stream id used as the return value on a failed operation of + * IFrontend.linkCiCam. + */ + INVALID_LTS_ID = 0xFFFFFFFF, + + /** + * An invalid frontend ID. + */ + INVALID_FRONTEND_ID = 0xFFFFFFFF, + + /** + * An invalid LNB ID. + */ + INVALID_LNB_ID = 0xFFFFFFFF, + + /** + * An invalid key token. It is used to remove the current key from the descrambler. + */ + INVALID_KEYTOKEN = 0x00, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/Constant64Bit.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/Constant64Bit.aidl new file mode 100644 index 0000000000..31a7f5b712 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/Constant64Bit.aidl @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * @hide + */ +@VintfStability +@Backing(type="long") +enum Constant64Bit { + /** + * An invalid 64-bit Filter ID. + */ + INVALID_FILTER_ID_64BIT = 0xFFFFFFFFFFFFFFFF, + + /** + * An invalid 64-bit AV sync hardware ID. + */ + INVALID_AV_SYNC_ID_64BIT = 0xFFFFFFFFFFFFFFFF, + + /** + * An invalid pts. + */ + INVALID_PRESENTATION_TIME_STAMP = 0xFFFFFFFFFFFFFFFF, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DataFormat.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DataFormat.aidl new file mode 100644 index 0000000000..bbc811df36 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DataFormat.aidl @@ -0,0 +1,50 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * A data format in demux's output or input according to ISO/IEC 13818-1. + * @hide + */ +@VintfStability +@Backing(type="int") +enum DataFormat { + /** + * Data is Transport Stream. + */ + TS, + + /** + * Data is Packetized Elementary Stream. + */ + PES, + + /** + * Data is Elementary Stream. + */ + ES, + + /** + * Data is TLV (type-length-value) Stream for JP SHV + */ + SHV_TLV, + + /** + * Data format is undefined. + */ + UNDEFINED, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxAlpFilterSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxAlpFilterSettings.aidl new file mode 100644 index 0000000000..397002d932 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxAlpFilterSettings.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxAlpFilterSettingsFilterSettings; +import android.hardware.tv.tuner.DemuxAlpLengthType; + +/** + * Filter Settings for a ALP filter. + * @hide + */ +@VintfStability +parcelable DemuxAlpFilterSettings { + /** + * Packet type according to A/330 ATSC3.0. + * 0: IPv4 packet + * 2: Compressed IP packet + * 4: Link layer signaling packet + * 6: Packet Type Extension + * 8: MPEG-2 Transport Stream + */ + byte packetType; + + DemuxAlpLengthType lengthType = DemuxAlpLengthType.UNDEFINED; + + DemuxAlpFilterSettingsFilterSettings filterSettings; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxAlpFilterSettingsFilterSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxAlpFilterSettingsFilterSettings.aidl new file mode 100644 index 0000000000..9ab967e752 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxAlpFilterSettingsFilterSettings.aidl @@ -0,0 +1,33 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxFilterSectionSettings; + +/** + * @hide + */ +@VintfStability +union DemuxAlpFilterSettingsFilterSettings { + /** + * Not additional parameters. it's used by PTP, PAYLOAD_THROUGH subtype + * filters. + */ + boolean noinit; + + DemuxFilterSectionSettings section; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxAlpFilterType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxAlpFilterType.aidl new file mode 100644 index 0000000000..fc36b9323e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxAlpFilterType.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * ALP Filter Type according to A/330 ATSC3.0. + * @hide + */ +@VintfStability +@Backing(type="int") +enum DemuxAlpFilterType { + UNDEFINED, + /** + * A filter to filter signaling data out from input stream, and queue the + * data to the filter's FMQ (Fast Message Queue). + */ + SECTION, + + /** + * A filter to set PTP (Precision Time Protocol) channel from input stream. + */ + PTP, + + /** + * A filter to strip out ALP message header and be a data source of another + * filter. + */ + PAYLOAD_THROUGH, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxAlpLengthType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxAlpLengthType.aidl new file mode 100644 index 0000000000..7d697ad70f --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxAlpLengthType.aidl @@ -0,0 +1,37 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * ALP Length Type + * @hide + */ +@VintfStability +@Backing(type="byte") +enum DemuxAlpLengthType { + UNDEFINED = 0, + + /** + * Length does NOT include additional header. Used in US region. + */ + WITHOUT_ADDITIONAL_HEADER, + + /** + * Length includes additional header. Used in Korea region. + */ + WITH_ADDITIONAL_HEADER, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxCapabilities.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxCapabilities.aidl new file mode 100644 index 0000000000..49fa08d17d --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxCapabilities.aidl @@ -0,0 +1,93 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Capabilities for Demux. + * @hide + */ +@VintfStability +parcelable DemuxCapabilities { + /** + * The number of Demux to be supported. + */ + int numDemux; + + /** + * The number of record to be supported. + */ + int numRecord; + + /** + * The number of playback to be supported. + */ + int numPlayback; + + /** + * The number of TS Filter to be supported. + */ + int numTsFilter; + + /** + * The number of Section Filter to be supported. + */ + int numSectionFilter; + + /** + * The number of Audio Filter to be supported. + */ + int numAudioFilter; + + /** + * The number of Video Filter to be supported. + */ + int numVideoFilter; + + /** + * The number of PES Filter to be supported. + */ + int numPesFilter; + + /** + * The number of PCR Filter to be supported. + */ + int numPcrFilter; + + /** + * The maximum number of bytes is supported in the mask of Section Filter. + */ + int numBytesInSectionFilter; + + /** + * Filter Main Types defined by DemuxFilterMainType. The DemuxFilterMainTypes + * is set by bitwise OR. + */ + int filterCaps; + + /** + * The array has same elements as DemuxFilterMainType. linkCaps[i] presents + * filter's capability as source for the ith type in DemuxFilterMainType. + * The jth bit of linkCaps[i] is 1 if the output of ith type filter can be + * data source for the filter type j. + */ + int[] linkCaps; + + /** + * True if Time Filter to be supported. + */ + boolean bTimeFilter; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterAvSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterAvSettings.aidl new file mode 100644 index 0000000000..30a1054575 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterAvSettings.aidl @@ -0,0 +1,29 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Filter Settings for a Video and Audio. + * @hide + */ +@VintfStability +parcelable DemuxFilterAvSettings { + /** + * true if the filter output goes to decoder directly in pass through mode. + */ + boolean isPassthrough; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl new file mode 100644 index 0000000000..d59dd2eed4 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadEvent.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Filter Event for Download data. + * @hide + */ +@VintfStability +parcelable DemuxFilterDownloadEvent { + /** + * ID of object/module in the carousel + */ + int itemId; + + /** + * MPU sequence number of filtered data (only for MMTP) + */ + int mpuSequenceNumber; + + int itemFragmentIndex; + + int lastItemFragmentIndex; + + /** + * Data size in bytes of filtered data + */ + char dataLength; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl new file mode 100644 index 0000000000..bd79bd529e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterDownloadSettings.aidl @@ -0,0 +1,30 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Filter Settings for a Download. + * @hide + */ +@VintfStability +parcelable DemuxFilterDownloadSettings { + /** + * Download ID (also known as the carousel ID) is carried in the PMT in + * ISO/IEC 13818-1 for the service containing the object carousel. + */ + int downloadId; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterEvent.aidl new file mode 100644 index 0000000000..8de80e0f94 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterEvent.aidl @@ -0,0 +1,62 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxFilterDownloadEvent; +import android.hardware.tv.tuner.DemuxFilterIpPayloadEvent; +import android.hardware.tv.tuner.DemuxFilterMediaEvent; +import android.hardware.tv.tuner.DemuxFilterMmtpRecordEvent; +import android.hardware.tv.tuner.DemuxFilterMonitorEvent; +import android.hardware.tv.tuner.DemuxFilterPesEvent; +import android.hardware.tv.tuner.DemuxFilterSectionEvent; +import android.hardware.tv.tuner.DemuxFilterTemiEvent; +import android.hardware.tv.tuner.DemuxFilterTsRecordEvent; + +/** + * Filter Event. + * @hide + */ +@VintfStability +union DemuxFilterEvent { + DemuxFilterSectionEvent section; + + DemuxFilterMediaEvent media; + + DemuxFilterPesEvent pes; + + DemuxFilterTsRecordEvent tsRecord; + + DemuxFilterMmtpRecordEvent mmtpRecord; + + DemuxFilterDownloadEvent download; + + DemuxFilterIpPayloadEvent ipPayload; + + DemuxFilterTemiEvent temi; + + DemuxFilterMonitorEvent monitorEvent; + + /** + * An unique ID to mark the start point of receiving the valid filter events after + * reconfiguring the filter. It must be sent at least once in the first event after the + * filter is restarted. 0 is reserved for the newly opened filter's first start, which is + * optional for HAL to send. + * + * When sending starId, DemuxFilterEvent.events should only contain one startId event. + */ + int startId; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterIpPayloadEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterIpPayloadEvent.aidl new file mode 100644 index 0000000000..0619b4543f --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterIpPayloadEvent.aidl @@ -0,0 +1,29 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Filter Event for IP payload data. + * @hide + */ +@VintfStability +parcelable DemuxFilterIpPayloadEvent { + /** + * Data size in bytes of IP data + */ + char dataLength; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMainType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMainType.aidl new file mode 100644 index 0000000000..663bdfbd2a --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMainType.aidl @@ -0,0 +1,53 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Filter Main Type specifies the protocol that the filter use to extract data + * from input stream. + * @hide + */ +@VintfStability +@Backing(type="int") +enum DemuxFilterMainType { + UNDEFINED = 0, + + /** + * Transport Stream according to ISO/IEC 13818-1. + */ + TS = 1 << 0, + + /** + * MPEG Media Transport Protocol according to ISO/IEC 23008-1. + */ + MMTP = 1 << 1, + + /** + * Internet Protocol. + */ + IP = 1 << 2, + + /** + * Type Length Value according to ITU-R BT.1869. + */ + TLV = 1 << 3, + + /** + * ATSC Link-Layer Protocol according to A/330 ATSC3.0. + */ + ALP = 1 << 4, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl new file mode 100644 index 0000000000..754708c635 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEvent.aidl @@ -0,0 +1,77 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.common.NativeHandle; + +import android.hardware.tv.tuner.DemuxFilterMediaEventExtraMetaData; + +/** + * Filter Event for Audio or Video Filter. + * @hide + */ +@VintfStability +parcelable DemuxFilterMediaEvent { + char streamId; + + /** + * true if PTS is present in PES header. + */ + boolean isPtsPresent; + + /** + * Presentation Time Stamp for audio or video frame. It based on 90KHz has + * the same format as PTS (Presentation Time Stamp). + */ + long pts; + + /** + * Data size in bytes of audio or video frame + */ + int dataLength; + + /** + * The offset in the memory block which is shared among multiple + * MediaEvents. + */ + int offset; + + /** + * A handle associated to the memory where audio or video data stays. + */ + NativeHandle avMemory; + + /** + * True if the avMemory is in secure area, and isn't mappable. + */ + boolean isSecureMemory; + + /** + * An Id is used by HAL to provide additional information for AV data. + * For secure audio, it's the audio handle used by Audio Track. + */ + long avDataId; + + /** + * MPU sequence number of filtered data (only for MMTP) + */ + int mpuSequenceNumber; + + boolean isPesPrivateData; + + DemuxFilterMediaEventExtraMetaData extraMetaData; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEventExtraMetaData.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEventExtraMetaData.aidl new file mode 100644 index 0000000000..f01952bc43 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMediaEventExtraMetaData.aidl @@ -0,0 +1,33 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.AudioExtraMetaData; + +/** + * Extra Meta Data for DemuxFilterMediaEvent. + * @hide + */ +@VintfStability +union DemuxFilterMediaEventExtraMetaData { + /** + * Not additional parameters. it's used for video. + */ + boolean noinit; + + AudioExtraMetaData audio; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMmtpRecordEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMmtpRecordEvent.aidl new file mode 100644 index 0000000000..39083a9d23 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMmtpRecordEvent.aidl @@ -0,0 +1,55 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Filter Event for MMTP Record data. + * @hide + */ +@VintfStability +parcelable DemuxFilterMmtpRecordEvent { + /** + * Indexes defined by DemuxScHevcIndex. + */ + int scHevcIndexMask; + + /** + * Byte number from beginning of the filter's output + */ + long byteNumber; + + /** + * The Presentation Time Stamp(PTS) for the audio or video frame. It is based on 90KHz + * and has the same format as the PTS in ISO/IEC 13818-1. + */ + long pts; + + /** + * MPU sequence number of the filtered data. This is only used for MMTP. + */ + int mpuSequenceNumber; + + /** + * Specifies the address of the first macroblock in the slice defined in ITU-T Rec. H.264. + */ + int firstMbInSlice; + + /** + * TS index mask defined by DemuxTsIndex. + */ + int tsIndexMask; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMonitorEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMonitorEvent.aidl new file mode 100644 index 0000000000..2dd11e2b1c --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMonitorEvent.aidl @@ -0,0 +1,36 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.ScramblingStatus; + +/** + * Monitor event to notify monitored status change. + * @hide + */ +@VintfStability +union DemuxFilterMonitorEvent { + /** + * New scrambling status. + */ + ScramblingStatus scramblingStatus = ScramblingStatus.UNKNOWN; + + /** + * New cid for the IP filter. + */ + int cid; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMonitorEventType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMonitorEventType.aidl new file mode 100644 index 0000000000..87a4d9d6f4 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterMonitorEventType.aidl @@ -0,0 +1,29 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Monitor event type. + * @hide + */ +@VintfStability +@Backing(type="int") +enum DemuxFilterMonitorEventType { + SCRAMBLING_STATUS = 1 << 0, + + IP_CID_CHANGE = 1 << 1, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterPesDataSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterPesDataSettings.aidl new file mode 100644 index 0000000000..9780f40ad2 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterPesDataSettings.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Filter Settings for a PES Data. + * @hide + */ +@VintfStability +parcelable DemuxFilterPesDataSettings { + char streamId; + + /** + * true if the filter send onFilterStatus instead of onFilterEvent. + */ + boolean isRaw; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterPesEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterPesEvent.aidl new file mode 100644 index 0000000000..2b24cd9046 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterPesEvent.aidl @@ -0,0 +1,36 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Filter Event for PES data. + * @hide + */ +@VintfStability +parcelable DemuxFilterPesEvent { + char streamId; + + /** + * Data size in bytes of PES data + */ + char dataLength; + + /** + * MPU sequence number of filtered data (only for MMTP) + */ + int mpuSequenceNumber; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterRecordSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterRecordSettings.aidl new file mode 100644 index 0000000000..2f8886469e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterRecordSettings.aidl @@ -0,0 +1,36 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxFilterScIndexMask; +import android.hardware.tv.tuner.DemuxRecordScIndexType; + +/** + * Filter Settings for Record data. + * @hide + */ +@VintfStability +parcelable DemuxFilterRecordSettings { + /** + * Indexes defined by DemuxTsIndex. + */ + int tsIndexMask; + + DemuxRecordScIndexType scIndexType = DemuxRecordScIndexType.UNDEFINED; + + DemuxFilterScIndexMask scIndexMask; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterScIndexMask.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterScIndexMask.aidl new file mode 100644 index 0000000000..a9f4b6fede --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterScIndexMask.aidl @@ -0,0 +1,36 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxScHevcIndex; +import android.hardware.tv.tuner.DemuxScIndex; + +/** + * @hide + */ +@VintfStability +union DemuxFilterScIndexMask { + /** + * Indexes defined by DemuxScIndex. + */ + int scIndex; + + /** + * Indexes defined by DemuxScHevcIndex. + */ + int scHevc; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionBits.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionBits.aidl new file mode 100644 index 0000000000..eea544f36e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionBits.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Bits Settings for Section Filter. + * @hide + */ +@VintfStability +parcelable DemuxFilterSectionBits { + /** + * The bytes are configured for Section Filter + */ + byte[] filter; + + /** + * Active bits in the configured bytes to be used for filtering + */ + byte[] mask; + + /** + * Do positive match at the bit position of the configured bytes when the + * bit at same position of the mode is 0. + * Do negative match at the bit position of the configured bytes when the + * bit at same position of the mode is 1. + */ + byte[] mode; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl new file mode 100644 index 0000000000..1a327f30a7 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionEvent.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Filter Event for Section Filter. + * @hide + */ +@VintfStability +parcelable DemuxFilterSectionEvent { + /** + * Table ID of filtered data + */ + char tableId; + + /** + * Version number of filtered data + */ + char version; + + /** + * Section number of filtered data + */ + char sectionNum; + + /** + * Data size in bytes of filtered data + */ + char dataLength; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionSettings.aidl new file mode 100644 index 0000000000..2102aa0a90 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionSettings.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxFilterSectionSettingsCondition; + +/** + * Filter Settings for Section data according to ISO/IEC 13818-1. + * @hide + */ +@VintfStability +parcelable DemuxFilterSectionSettings { + DemuxFilterSectionSettingsCondition condition; + + /** + * true if the filter checks CRC and discards data with wrong CRC + */ + boolean isCheckCrc; + + /** + * true if the filter repeats the data with the same version + */ + boolean isRepeat; + + /** + * true if the filter send onFilterStatus instead of onFilterEvent. + */ + boolean isRaw; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionSettingsCondition.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionSettingsCondition.aidl new file mode 100644 index 0000000000..374511a4c5 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionSettingsCondition.aidl @@ -0,0 +1,32 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxFilterSectionBits; +import android.hardware.tv.tuner.DemuxFilterSectionSettingsConditionTableInfo; + +/** + * The union of Section Filter Bits Settings and Table information that can be + * set by client. + * @hide + */ +@VintfStability +union DemuxFilterSectionSettingsCondition { + DemuxFilterSectionBits sectionBits; + + DemuxFilterSectionSettingsConditionTableInfo tableInfo; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionSettingsConditionTableInfo.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionSettingsConditionTableInfo.aidl new file mode 100644 index 0000000000..c76d84caf2 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSectionSettingsConditionTableInfo.aidl @@ -0,0 +1,34 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Table information for Section Filter. + * @hide + */ +@VintfStability +parcelable DemuxFilterSectionSettingsConditionTableInfo { + /** + * Table ID for Section Filter + */ + char tableId; + + /** + * Version number for Section Filter + */ + char version; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSettings.aidl new file mode 100644 index 0000000000..7e9d2a105a --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSettings.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxAlpFilterSettings; +import android.hardware.tv.tuner.DemuxIpFilterSettings; +import android.hardware.tv.tuner.DemuxMmtpFilterSettings; +import android.hardware.tv.tuner.DemuxTlvFilterSettings; +import android.hardware.tv.tuner.DemuxTsFilterSettings; + +/** + * Filter Settings. + * @hide + */ +@VintfStability +union DemuxFilterSettings { + DemuxTsFilterSettings ts; + + DemuxMmtpFilterSettings mmtp; + + DemuxIpFilterSettings ip; + + DemuxTlvFilterSettings tlv; + + DemuxAlpFilterSettings alp; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterStatus.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterStatus.aidl new file mode 100644 index 0000000000..f07c26f4de --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterStatus.aidl @@ -0,0 +1,48 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * A status of data in the filter's buffer. + * @hide + */ +@VintfStability +@Backing(type="byte") +enum DemuxFilterStatus { + /** + * The data in the filter buffer is ready to be read. + */ + DATA_READY = 1 << 0, + + /** + * The available data amount in the filter buffer is at low level which is + * set to 25 percent by default. + */ + LOW_WATER = 1 << 1, + + /** + * The available data amount in the filter buffer is at high level which is + * set to 75 percent by default. + */ + HIGH_WATER = 1 << 2, + + /** + * The data in the filter buffer is full and newly filtered data is being + * discarded. + */ + OVERFLOW = 1 << 3, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSubType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSubType.aidl new file mode 100644 index 0000000000..3dfc0ae158 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterSubType.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxAlpFilterType; +import android.hardware.tv.tuner.DemuxIpFilterType; +import android.hardware.tv.tuner.DemuxMmtpFilterType; +import android.hardware.tv.tuner.DemuxTlvFilterType; +import android.hardware.tv.tuner.DemuxTsFilterType; + +/** + * The different Demux Filter Sub Types. + * @hide + */ +@VintfStability +union DemuxFilterSubType { + DemuxTsFilterType tsFilterType = DemuxTsFilterType.UNDEFINED; + + DemuxMmtpFilterType mmtpFilterType; + + DemuxIpFilterType ipFilterType; + + DemuxTlvFilterType tlvFilterType; + + DemuxAlpFilterType alpFilterType; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterTemiEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterTemiEvent.aidl new file mode 100644 index 0000000000..a752e7c74c --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterTemiEvent.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Filter Event for Timed External Media Information (TEMI) data. + * @hide + */ +@VintfStability +parcelable DemuxFilterTemiEvent { + /** + * Presentation Time Stamp for audio or video frame. It based on 90KHz has + * the same format as PTS (Presentation Time Stamp) in ISO/IEC 13818-1. + */ + long pts; + + /** + * TEMI Descriptor Tag + */ + byte descrTag; + + /** + * TEMI Descriptor + */ + byte[] descrData; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterTsRecordEvent.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterTsRecordEvent.aidl new file mode 100644 index 0000000000..4992a3342e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterTsRecordEvent.aidl @@ -0,0 +1,55 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxFilterScIndexMask; +import android.hardware.tv.tuner.DemuxPid; + +/** + * Filter Event for TS Record data. + * @hide + */ +@VintfStability +parcelable DemuxFilterTsRecordEvent { + DemuxPid pid; + + /** + * Indexes defined by DemuxTsIndex. + */ + int tsIndexMask; + + /** + * Indexes of record output + */ + DemuxFilterScIndexMask scIndexMask; + + /** + * Byte number from beginning of the filter's output + */ + long byteNumber; + + /** + * The Presentation Time Stamp(PTS) for the audio or video frame. It is based on 90KHz + * and has the same format as the PTS in ISO/IEC 13818-1. + */ + long pts; + + /** + * Specifies the address of the first macroblock in the slice defined in ITU-T Rec. H.264. + */ + int firstMbInSlice; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterType.aidl new file mode 100644 index 0000000000..f5eda6053e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxFilterType.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxFilterMainType; +import android.hardware.tv.tuner.DemuxFilterSubType; + +/** + * Demux Filter Type. + * @hide + */ +@VintfStability +parcelable DemuxFilterType { + DemuxFilterMainType mainType = DemuxFilterMainType.UNDEFINED; + + DemuxFilterSubType subType; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpAddress.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpAddress.aidl new file mode 100644 index 0000000000..9c704a3e6e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpAddress.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxIpAddressIpAddress; + +/** + * IP Settings for a IP filter. + * @hide + */ +@VintfStability +parcelable DemuxIpAddress { + DemuxIpAddressIpAddress srcIpAddress; + + DemuxIpAddressIpAddress dstIpAddress; + + /** + * 0 is invalid. should be ignored. + */ + char srcPort; + + /** + * 0 is invalid. should be ignored. + */ + char dstPort; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpAddressIpAddress.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpAddressIpAddress.aidl new file mode 100644 index 0000000000..1a57215aa7 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpAddressIpAddress.aidl @@ -0,0 +1,33 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * @hide + */ +@VintfStability +union DemuxIpAddressIpAddress { + /** + * 0.0.0.0 is invalid. should be ignored. + */ + byte[] v4 = {}; + + /** + * 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 is invalid. should be ignored. + */ + byte[] v6; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpFilterSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpFilterSettings.aidl new file mode 100644 index 0000000000..6265aa6959 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpFilterSettings.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxIpAddress; +import android.hardware.tv.tuner.DemuxIpFilterSettingsFilterSettings; + +/** + * Filter Settings for a IP filter. + * @hide + */ +@VintfStability +parcelable DemuxIpFilterSettings { + DemuxIpAddress ipAddr; + + DemuxIpFilterSettingsFilterSettings filterSettings; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpFilterSettingsFilterSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpFilterSettingsFilterSettings.aidl new file mode 100644 index 0000000000..b8aa9f282e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpFilterSettingsFilterSettings.aidl @@ -0,0 +1,38 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxFilterSectionSettings; + +/** + * @hide + */ +@VintfStability +union DemuxIpFilterSettingsFilterSettings { + /** + * Not additional parameters. it's used by NTP, IP_PAYLOAD, + * PAYLOAD_THROUGH subtype filters. + */ + boolean noinit; + + DemuxFilterSectionSettings section; + + /** + * true if the data from IP subtype go to next filter directly + */ + boolean bPassthrough; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpFilterType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpFilterType.aidl new file mode 100644 index 0000000000..f975195277 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxIpFilterType.aidl @@ -0,0 +1,56 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * IP Filter Type. + * @hide + */ +@VintfStability +@Backing(type="int") +enum DemuxIpFilterType { + UNDEFINED, + + /** + * A filter to filter section data out from input stream, and queue the + * data to the filter's FMQ (Fast Message Queue). + */ + SECTION, + + /** + * A filter to set NTP (Network Time Procotol) channel from input stream. + */ + NTP, + + /** + * A filter to strip out IP message header and queue the data to the + * filter's FMQ. + */ + IP_PAYLOAD, + + /** + * A filter to filter a IP stream out from input stream. The output can be + * either upper stream of another filter or queued to the filter's FMQ. + */ + IP, + + /** + * A filter to strip out IP message header and be a data source of another + * filter. + */ + PAYLOAD_THROUGH, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxMmtpFilterSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxMmtpFilterSettings.aidl new file mode 100644 index 0000000000..3759ce0810 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxMmtpFilterSettings.aidl @@ -0,0 +1,30 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxMmtpFilterSettingsFilterSettings; + +/** + * Filter Settings for a MMTP filter. + * @hide + */ +@VintfStability +parcelable DemuxMmtpFilterSettings { + char mmtpPid; + + DemuxMmtpFilterSettingsFilterSettings filterSettings; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxMmtpFilterSettingsFilterSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxMmtpFilterSettingsFilterSettings.aidl new file mode 100644 index 0000000000..0f960b692a --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxMmtpFilterSettingsFilterSettings.aidl @@ -0,0 +1,45 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxFilterAvSettings; +import android.hardware.tv.tuner.DemuxFilterDownloadSettings; +import android.hardware.tv.tuner.DemuxFilterPesDataSettings; +import android.hardware.tv.tuner.DemuxFilterRecordSettings; +import android.hardware.tv.tuner.DemuxFilterSectionSettings; + +/** + * The different types of MMTP Filter Settings that can be set by client. + * @hide + */ +@VintfStability +union DemuxMmtpFilterSettingsFilterSettings { + /** + * Not additional parameters. it's used by MMTP subtype filters. + */ + boolean noinit; + + DemuxFilterSectionSettings section; + + DemuxFilterAvSettings av; + + DemuxFilterPesDataSettings pesData; + + DemuxFilterRecordSettings record; + + DemuxFilterDownloadSettings download; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxMmtpFilterType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxMmtpFilterType.aidl new file mode 100644 index 0000000000..eb0016c6ef --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxMmtpFilterType.aidl @@ -0,0 +1,69 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * MMTP Filter Type according to ISO/IEC 23008-1 + * @hide + */ +@VintfStability +@Backing(type="int") +enum DemuxMmtpFilterType { + UNDEFINED, + + /** + * A filter to filter signaling data out from input stream, and queue the + * data to the filter's FMQ (Fast Message Queue). + */ + SECTION, + + /** + * A filter to filter MFU (Media fragment unit) out from input stream, and + * queue the data to the filter's FMQ. + */ + PES, + + /** + * A filter to filter a MMTP stream out from input stream, and queue the + * data to the filter's FMQ. + */ + MMTP, + + /** + * A filter to filter Audio data out from input stream, and send Audio's + * Metadata to client through onFilterEvent. + */ + AUDIO, + + /** + * A filter to filter Video data out from input stream, and send Video's + * Metadata to client through onFilterEvent. + */ + VIDEO, + + /** + * A filter to filter data out from input stream, and queue the data to the + * buffer of the record. + */ + RECORD, + + /** + * A filter to filter application data out from input stream, and queue the + * data to the filter's FMQ. + */ + DOWNLOAD, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxPid.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxPid.aidl new file mode 100644 index 0000000000..a76d208017 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxPid.aidl @@ -0,0 +1,34 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Demux Packet ID. + * @hide + */ +@VintfStability +union DemuxPid { + /** + * Packet ID is used to specify packets in transport stream. + */ + char tPid; + + /** + * Packet ID is used to specify packets in MMTP. + */ + char mmtpPid; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxQueueNotifyBits.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxQueueNotifyBits.aidl new file mode 100644 index 0000000000..b8858efb63 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxQueueNotifyBits.aidl @@ -0,0 +1,36 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * The bits of EventFlag in FMQ (Fast message queue) are used by client to + * notify HAL the status change. + * @hide + */ +@VintfStability +@Backing(type="int") +enum DemuxQueueNotifyBits { + /** + * client writes data and notify HAL the data is ready. + */ + DATA_READY = 1 << 0, + + /** + * client reads data and notify HAL the data is consumed. + */ + DATA_CONSUMED = 1 << 1, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxRecordScIndexType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxRecordScIndexType.aidl new file mode 100644 index 0000000000..44b985cc67 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxRecordScIndexType.aidl @@ -0,0 +1,45 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Start Code Index type to be used in the filter for record + * @hide + */ +@VintfStability +@Backing(type="int") +enum DemuxRecordScIndexType { + /** + * Don't use SC index + */ + NONE, + + /** + * Use Start Code index + */ + SC, + + /** + * Use Start Code index for HEVC + */ + SC_HEVC, + + /** + * SC index is undefined + */ + UNDEFINED, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxScHevcIndex.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxScHevcIndex.aidl new file mode 100644 index 0000000000..f2ddd004b9 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxScHevcIndex.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Indexes can be tagged by NAL unit group in HEVC according to ISO/IEC 23008-2. + * @hide + */ +@VintfStability +@Backing(type="int") +enum DemuxScHevcIndex { + SPS = 1 << 0, + + AUD = 1 << 1, + + SLICE_CE_BLA_W_LP = 1 << 2, + + SLICE_BLA_W_RADL = 1 << 3, + + SLICE_BLA_N_LP = 1 << 4, + + SLICE_IDR_W_RADL = 1 << 5, + + SLICE_IDR_N_LP = 1 << 6, + + SLICE_TRAIL_CRA = 1 << 7, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxScIndex.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxScIndex.aidl new file mode 100644 index 0000000000..0aef739742 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxScIndex.aidl @@ -0,0 +1,73 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Indexes can be tagged by Start Code in PES (Packetized Elementary Stream) + * according to ISO/IEC 13818-1 and Slice Groups according to ISO/IEC 14496-10. + * @hide + */ +@VintfStability +@Backing(type="int") +enum DemuxScIndex { + UNDEFINED = 0, + + /** + * Start Code is for a new I Frame + */ + I_FRAME = 1 << 0, + + /** + * Start Code is for a new P Frame + */ + P_FRAME = 1 << 1, + + /** + * Start Code is for a new B Frame + */ + B_FRAME = 1 << 2, + + /** + * Start Code is for a new Sequence + */ + SEQUENCE = 1 << 3, + + /** + * All blocks are coded as I blocks. + */ + I_SLICE = 1 << 4, + + /** + * Blocks are coded as I or P blocks. + */ + P_SLICE = 1 << 5, + + /** + * Blocks are coded as I, P or B blocks. + */ + B_SLICE = 1 << 6, + + /** + * A so-called switching I slice that is coded. + */ + SI_SLICE = 1 << 7, + + /** + * A so-called switching P slice that is coded. + */ + SP_SLICE = 1 << 8, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTlvFilterSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTlvFilterSettings.aidl new file mode 100644 index 0000000000..fd1289df00 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTlvFilterSettings.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxTlvFilterSettingsFilterSettings; + +/** + * Filter Settings for a TLV filter. + * @hide + */ +@VintfStability +parcelable DemuxTlvFilterSettings { + /** + * Packet type according to ITU-R BT.1869. + * 0x01: IPv4 packet + * 0x02: IPv6 packet + * 0x03: IP packet with header compression + * 0xFE: Signaling packet + * 0xFF: NULL packet + */ + byte packetType; + + /** + * true if the filtered data is commpressed ip packet + */ + boolean isCompressedIpPacket; + + DemuxTlvFilterSettingsFilterSettings filterSettings; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTlvFilterSettingsFilterSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTlvFilterSettingsFilterSettings.aidl new file mode 100644 index 0000000000..7837c1d415 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTlvFilterSettingsFilterSettings.aidl @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxFilterSectionSettings; + +/** + * The different types of TLV Filter Settings that can be set by client. + * @hide + */ +@VintfStability +union DemuxTlvFilterSettingsFilterSettings { + /** + * Not additional parameters. it's used by PAYLOAD_THROUGH subtype + * filters. + */ + boolean noinit; + + DemuxFilterSectionSettings section; + + /** + * true if the data from TLV subtype go to next filter directly + */ + boolean bPassthrough; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTlvFilterType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTlvFilterType.aidl new file mode 100644 index 0000000000..1566f74155 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTlvFilterType.aidl @@ -0,0 +1,45 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * TLV Filter Type according to ITU-R BT.1869. + * @hide + */ +@VintfStability +@Backing(type="int") +enum DemuxTlvFilterType { + UNDEFINED, + + /** + * A filter to filter signaling data out from input stream, and queue the + * data to the filter's FMQ (Fast Message Queue). + */ + SECTION, + + /** + * A filter to filter a TLV stream out from input stream. The output can be + * either upper stream of another filter or queued to the filter's FMQ. + */ + TLV, + + /** + * A filter to strip out TLV message header and be a data source of another + * filter. + */ + PAYLOAD_THROUGH, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTsFilterSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTsFilterSettings.aidl new file mode 100644 index 0000000000..1345831dc6 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTsFilterSettings.aidl @@ -0,0 +1,33 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxTsFilterSettingsFilterSettings; + +/** + * Filter Settings for a TS filter. + * @hide + */ +@VintfStability +parcelable DemuxTsFilterSettings { + /** + * Packet ID is used to specify packets in transport stream. + */ + char tpid; + + DemuxTsFilterSettingsFilterSettings filterSettings; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTsFilterSettingsFilterSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTsFilterSettingsFilterSettings.aidl new file mode 100644 index 0000000000..81e36f36a2 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTsFilterSettingsFilterSettings.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxFilterAvSettings; +import android.hardware.tv.tuner.DemuxFilterPesDataSettings; +import android.hardware.tv.tuner.DemuxFilterRecordSettings; +import android.hardware.tv.tuner.DemuxFilterSectionSettings; + +/** + * The different types of TS Filter Settings that can be set by client. + * @hide + */ +@VintfStability +union DemuxTsFilterSettingsFilterSettings { + /** + * Not additional parameters. it's used by PCR, TS, TEMI subtype + * filters. + */ + boolean noinit; + + DemuxFilterSectionSettings section; + + DemuxFilterAvSettings av; + + DemuxFilterPesDataSettings pesData; + + DemuxFilterRecordSettings record; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTsFilterType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTsFilterType.aidl new file mode 100644 index 0000000000..cdf5c58e2e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTsFilterType.aidl @@ -0,0 +1,75 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * TS Filter Type according to ISO/IEC 13818-1 + * @hide + */ +@VintfStability +@Backing(type="int") +enum DemuxTsFilterType { + UNDEFINED, + + /** + * A filter to filter Section data out from input stream, and queue the + * data to the filter's FMQ (Fast Message Queue). + */ + SECTION, + + /** + * A filter to filter Packetized Elementary Stream data out from input + * stream, and queue the data to the filter's FMQ. + */ + PES, + + /** + * A filter to filter a Transport Stream out from input stream, and queue + * the data to the filter's FMQ. + */ + TS, + + /** + * A filter to filter Audio data out from input stream, and send Audio's + * Metadata to client through onFilterEvent. + */ + AUDIO, + + /** + * A filter to filter Video data out from input stream, and send Video's + * Metadata to client through onFilterEvent. + */ + VIDEO, + + /** + * A filter to set PCR (Program Clock Reference) channel from input stream. + */ + PCR, + + /** + * A filter to filter data out from input stream, and queue the data to the + * buffer of the record. + */ + RECORD, + + /** + * A filter to filter out Timed External Media Information (TEMI) according + * to ISO/IEC 13818-1:2013/ DAM 6 from input stream, and send TEMI event to + * client through onFilterEvent. + */ + TEMI, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTsIndex.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTsIndex.aidl new file mode 100644 index 0000000000..9d0e7c504a --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DemuxTsIndex.aidl @@ -0,0 +1,76 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Indexes can be tagged through TS (Transport Stream) header. + * @hide + */ +@VintfStability +@Backing(type="int") +enum DemuxTsIndex { + FIRST_PACKET = 1 << 0, + + PAYLOAD_UNIT_START_INDICATOR = 1 << 1, + + CHANGE_TO_NOT_SCRAMBLED = 1 << 2, + + CHANGE_TO_EVEN_SCRAMBLED = 1 << 3, + + CHANGE_TO_ODD_SCRAMBLED = 1 << 4, + + DISCONTINUITY_INDICATOR = 1 << 5, + + RANDOM_ACCESS_INDICATOR = 1 << 6, + + PRIORITY_INDICATOR = 1 << 7, + + PCR_FLAG = 1 << 8, + + OPCR_FLAG = 1 << 9, + + SPLICING_POINT_FLAG = 1 << 10, + + PRIVATE_DATA = 1 << 11, + + ADAPTATION_EXTENSION_FLAG = 1 << 12, + + /** + * Index the address of MMT Packet Table(MPT). + */ + MPT_INDEX_MPT = 1 << 16, + + /** + * Index the address of Video. + */ + MPT_INDEX_VIDEO = 1 << 17, + + /** + * Index the address of Audio. + */ + MPT_INDEX_AUDIO = 1 << 18, + + /** + * Index to indicate this is a target of timestamp extraction for video. + */ + MPT_INDEX_TIMESTAMP_TARGET_VIDEO = 1 << 19, + + /** + * Index to indicate this is a target of timestamp extraction for audio. + */ + MPT_INDEX_TIMESTAMP_TARGET_AUDIO = 1 << 20, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DvrSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DvrSettings.aidl new file mode 100644 index 0000000000..aa21cf69ab --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DvrSettings.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.PlaybackSettings; +import android.hardware.tv.tuner.RecordSettings; + +/** + * The Setting for DVR. + * @hide + */ +@VintfStability +union DvrSettings { + RecordSettings record; + + PlaybackSettings playback; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/DvrType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/DvrType.aidl new file mode 100644 index 0000000000..21dcc4aa2e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/DvrType.aidl @@ -0,0 +1,29 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * The type of DVR. + * @hide + */ +@VintfStability +@Backing(type="byte") +enum DvrType { + RECORD, + + PLAYBACK, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogAftFlag.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogAftFlag.aidl new file mode 100644 index 0000000000..72291a5101 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogAftFlag.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * AFT flag for an Analog Frontend. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendAnalogAftFlag { + UNDEFINED, + + AFT_TRUE, + + AFT_FALSE, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogCapabilities.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogCapabilities.aidl new file mode 100644 index 0000000000..7f0cd04e4b --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogCapabilities.aidl @@ -0,0 +1,34 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Capabilities for Analog Frontend. + * @hide + */ +@VintfStability +parcelable FrontendAnalogCapabilities { + /** + * Signal Types defined by FrontendAnalogType. + */ + int typeCap; + + /** + * Standard Interchange Formats defined by FrontendAnalogSifStandard. + */ + int sifStandardCap; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogSettings.aidl new file mode 100644 index 0000000000..926929f82f --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogSettings.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendAnalogAftFlag; +import android.hardware.tv.tuner.FrontendAnalogSifStandard; +import android.hardware.tv.tuner.FrontendAnalogType; +import android.hardware.tv.tuner.FrontendSpectralInversion; + +/** + * Signal Settings for Analog Frontend. + * @hide + */ +@VintfStability +parcelable FrontendAnalogSettings { + /** + * Signal frequency in Hertz + */ + int frequency; + + /** + * Signal end frequency in Hertz used by scan + */ + int endFrequency; + + FrontendSpectralInversion inversion = FrontendSpectralInversion.UNDEFINED; + + FrontendAnalogType type = FrontendAnalogType.UNDEFINED; + + FrontendAnalogAftFlag aftFlag = FrontendAnalogAftFlag.UNDEFINED; + + FrontendAnalogSifStandard sifStandard = FrontendAnalogSifStandard.UNDEFINED; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogSifStandard.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogSifStandard.aidl new file mode 100644 index 0000000000..3c0f9b4cc7 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogSifStandard.aidl @@ -0,0 +1,63 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Standard Interchange Format (SIF) for Analog Frontend. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendAnalogSifStandard { + UNDEFINED = 0, + + AUTO = 1 << 0, + + BG = 1 << 1, + + BG_A2 = 1 << 2, + + BG_NICAM = 1 << 3, + + I = 1 << 4, + + DK = 1 << 5, + + DK1_A2 = 1 << 6, + + DK2_A2 = 1 << 7, + + DK3_A2 = 1 << 8, + + DK_NICAM = 1 << 9, + + L = 1 << 10, + + M = 1 << 11, + + M_BTSC = 1 << 12, + + M_A2 = 1 << 13, + + M_EIAJ = 1 << 14, + + I_NICAM = 1 << 15, + + L_NICAM = 1 << 16, + + L_PRIME = 1 << 17, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogType.aidl new file mode 100644 index 0000000000..e4b05a67cf --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAnalogType.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Signal Type for Analog Frontend. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendAnalogType { + UNDEFINED = 0, + + AUTO = 1 << 0, + + PAL = 1 << 1, + + PAL_M = 1 << 2, + + PAL_N = 1 << 3, + + PAL_60 = 1 << 4, + + NTSC = 1 << 5, + + NTSC_443 = 1 << 6, + + SECAM = 1 << 7, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Bandwidth.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Bandwidth.aidl new file mode 100644 index 0000000000..af78a96628 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Bandwidth.aidl @@ -0,0 +1,38 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Bandwidth for ATSC3. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendAtsc3Bandwidth { + UNDEFINED = 0, + + /** + * hardware is able to detect and set bandwidth automatically + */ + AUTO = 1 << 0, + + BANDWIDTH_6MHZ = 1 << 1, + + BANDWIDTH_7MHZ = 1 << 2, + + BANDWIDTH_8MHZ = 1 << 3, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Capabilities.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Capabilities.aidl new file mode 100644 index 0000000000..98c7b8db20 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Capabilities.aidl @@ -0,0 +1,54 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Capabilities for ATSC3 Frontend. + * @hide + */ +@VintfStability +parcelable FrontendAtsc3Capabilities { + /** + * Bandwidth capabilities defined by FrontendAtsc3Bandwidth. + */ + int bandwidthCap; + + /** + * Modulation capabilities defined by FrontendAtsc3Modulation. + */ + int modulationCap; + + /** + * TimeInterleaveMode capabilities defined by FrontendAtsc3TimeInterleaveMode. + */ + int timeInterleaveModeCap; + + /** + * CodeRate capabilities defined by FrontendAtsc3CodeRate. + */ + int codeRateCap; + + /** + * FEC capabilities defined by FrontendAtsc3Fec. + */ + int fecCap; + + /** + * Demodulator Output Format capabilities FrontendAtsc3DemodOutputFormat. + */ + byte demodOutputFormatCap; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3CodeRate.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3CodeRate.aidl new file mode 100644 index 0000000000..8a2ee03632 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3CodeRate.aidl @@ -0,0 +1,56 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Code Rate for ATSC3. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendAtsc3CodeRate { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Coderate automatically + */ + AUTO = 1 << 0, + + CODERATE_2_15 = 1 << 1, + + CODERATE_3_15 = 1 << 2, + + CODERATE_4_15 = 1 << 3, + + CODERATE_5_15 = 1 << 4, + + CODERATE_6_15 = 1 << 5, + + CODERATE_7_15 = 1 << 6, + + CODERATE_8_15 = 1 << 7, + + CODERATE_9_15 = 1 << 8, + + CODERATE_10_15 = 1 << 9, + + CODERATE_11_15 = 1 << 10, + + CODERATE_12_15 = 1 << 11, + + CODERATE_13_15 = 1 << 12, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3DemodOutputFormat.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3DemodOutputFormat.aidl new file mode 100644 index 0000000000..b17616c66a --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3DemodOutputFormat.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Demodulator Output Format for an ATSC3 Frontend. + * @hide + */ +@VintfStability +@Backing(type="byte") +enum FrontendAtsc3DemodOutputFormat { + /** + * Undefined. Scan uses this. + */ + UNDEFINED = 0, + + /** + * ALP format. Typically used in US region. + */ + ATSC3_LINKLAYER_PACKET = 1 << 0, + + /** + * BaseBand packet format. Typically used in Korea region. + */ + BASEBAND_PACKET = 1 << 1, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Fec.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Fec.aidl new file mode 100644 index 0000000000..af0bf042ea --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Fec.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Forward Error Correction (FEC) for ATSC3. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendAtsc3Fec { + UNDEFINED = 0, + + /** + * hardware is able to detect and set FEC automatically + */ + AUTO = 1 << 0, + + BCH_LDPC_16K = 1 << 1, + + BCH_LDPC_64K = 1 << 2, + + CRC_LDPC_16K = 1 << 3, + + CRC_LDPC_64K = 1 << 4, + + LDPC_16K = 1 << 5, + + LDPC_64K = 1 << 6, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Modulation.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Modulation.aidl new file mode 100644 index 0000000000..3108234e74 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Modulation.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Modulation Type for ATSC3. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendAtsc3Modulation { + UNDEFINED = 0, + + /** + * hardware is able to detect and set modulation automatically + */ + AUTO = 1 << 0, + + MOD_QPSK = 1 << 1, + + MOD_16QAM = 1 << 2, + + MOD_64QAM = 1 << 3, + + MOD_256QAM = 1 << 4, + + MOD_1024QAM = 1 << 5, + + MOD_4096QAM = 1 << 6, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3PlpSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3PlpSettings.aidl new file mode 100644 index 0000000000..5678dd39fc --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3PlpSettings.aidl @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendAtsc3CodeRate; +import android.hardware.tv.tuner.FrontendAtsc3Fec; +import android.hardware.tv.tuner.FrontendAtsc3Modulation; +import android.hardware.tv.tuner.FrontendAtsc3TimeInterleaveMode; + +/** + * PLP basis Signal Settings for an ATSC3 Frontend. + * @hide + */ +@VintfStability +parcelable FrontendAtsc3PlpSettings { + byte plpId; + + FrontendAtsc3Modulation modulation = FrontendAtsc3Modulation.UNDEFINED; + + FrontendAtsc3TimeInterleaveMode interleaveMode = FrontendAtsc3TimeInterleaveMode.UNDEFINED; + + FrontendAtsc3CodeRate codeRate = FrontendAtsc3CodeRate.UNDEFINED; + + FrontendAtsc3Fec fec = FrontendAtsc3Fec.UNDEFINED; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Settings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Settings.aidl new file mode 100644 index 0000000000..dc1e52038b --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3Settings.aidl @@ -0,0 +1,50 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendAtsc3Bandwidth; +import android.hardware.tv.tuner.FrontendAtsc3DemodOutputFormat; +import android.hardware.tv.tuner.FrontendAtsc3PlpSettings; +import android.hardware.tv.tuner.FrontendSpectralInversion; + +/** + * Signal Settings for an ATSC3 Frontend. + * @hide + */ +@VintfStability +parcelable FrontendAtsc3Settings { + /** + * Signal frequency in Hertz + */ + int frequency; + + /** + * Signal end frequency in Hertz used by scan + */ + int endFrequency; + + /** + * Bandwidth of tuning band. + */ + FrontendAtsc3Bandwidth bandwidth = FrontendAtsc3Bandwidth.UNDEFINED; + + FrontendSpectralInversion inversion = FrontendSpectralInversion.UNDEFINED; + + FrontendAtsc3DemodOutputFormat demodOutputFormat = FrontendAtsc3DemodOutputFormat.UNDEFINED; + + FrontendAtsc3PlpSettings[] plpSettings; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3TimeInterleaveMode.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3TimeInterleaveMode.aidl new file mode 100644 index 0000000000..451a9229f8 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtsc3TimeInterleaveMode.aidl @@ -0,0 +1,36 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Time Interleave Mode for ATSC3. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendAtsc3TimeInterleaveMode { + UNDEFINED = 0, + + /** + * hardware is able to detect and set TimeInterleaveMode automatically + */ + AUTO = 1 << 0, + + CTI = 1 << 1, + + HTI = 1 << 2, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtscCapabilities.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtscCapabilities.aidl new file mode 100644 index 0000000000..c8a3d2bc6a --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtscCapabilities.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendAtscModulation; + +/** + * Capabilities for ATSC Frontend. + * @hide + */ +@VintfStability +parcelable FrontendAtscCapabilities { + /** + * Modulation capabilities defined by FrontendAtscModulation. + */ + int modulationCap; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtscModulation.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtscModulation.aidl new file mode 100644 index 0000000000..960a2991ee --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtscModulation.aidl @@ -0,0 +1,36 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Modulation Type for ATSC. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendAtscModulation { + UNDEFINED = 0, + + /** + * hardware is able to detect and set modulation automatically + */ + AUTO = 1 << 0, + + MOD_8VSB = 1 << 2, + + MOD_16VSB = 1 << 3, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtscSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtscSettings.aidl new file mode 100644 index 0000000000..1279b1494f --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendAtscSettings.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendAtscModulation; +import android.hardware.tv.tuner.FrontendSpectralInversion; + +/** + * Signal Settings for an ATSC Frontend. + * @hide + */ +@VintfStability +parcelable FrontendAtscSettings { + /** + * Signal frequency in Hertz + */ + int frequency; + + /** + * Signal end frequency in Hertz used by scan + */ + int endFrequency; + + FrontendSpectralInversion inversion = FrontendSpectralInversion.UNDEFINED; + + FrontendAtscModulation modulation = FrontendAtscModulation.UNDEFINED; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendBandwidth.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendBandwidth.aidl new file mode 100644 index 0000000000..c1c2355b47 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendBandwidth.aidl @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendAtsc3Bandwidth; +import android.hardware.tv.tuner.FrontendDvbtBandwidth; +import android.hardware.tv.tuner.FrontendIsdbtBandwidth; +import android.hardware.tv.tuner.FrontendDtmbBandwidth; +import android.hardware.tv.tuner.FrontendDvbcBandwidth; + +/** + * @hide + */ +@VintfStability +union FrontendBandwidth { + FrontendAtsc3Bandwidth atsc3 = FrontendAtsc3Bandwidth.UNDEFINED; + + FrontendDvbcBandwidth dvbc; + + FrontendDvbtBandwidth dvbt; + + FrontendIsdbtBandwidth isdbt; + + FrontendDtmbBandwidth dtmb; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendCableTimeInterleaveMode.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendCableTimeInterleaveMode.aidl new file mode 100644 index 0000000000..a2b4356af8 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendCableTimeInterleaveMode.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Time Interleave Mode for DVBC Frontend. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendCableTimeInterleaveMode { + UNDEFINED = 0, + + AUTO = 1 << 0, + + INTERLEAVING_128_1_0 = 1 << 1, + + INTERLEAVING_128_1_1 = 1 << 2, + + INTERLEAVING_64_2 = 1 << 3, + + INTERLEAVING_32_4 = 1 << 4, + + INTERLEAVING_16_8 = 1 << 5, + + INTERLEAVING_8_16 = 1 << 6, + + INTERLEAVING_128_2 = 1 << 7, + + INTERLEAVING_128_3 = 1 << 8, + + INTERLEAVING_128_4 = 1 << 9, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendCapabilities.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendCapabilities.aidl new file mode 100644 index 0000000000..a6f14900d1 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendCapabilities.aidl @@ -0,0 +1,54 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendAnalogCapabilities; +import android.hardware.tv.tuner.FrontendAtsc3Capabilities; +import android.hardware.tv.tuner.FrontendAtscCapabilities; +import android.hardware.tv.tuner.FrontendDtmbCapabilities; +import android.hardware.tv.tuner.FrontendDvbcCapabilities; +import android.hardware.tv.tuner.FrontendDvbsCapabilities; +import android.hardware.tv.tuner.FrontendDvbtCapabilities; +import android.hardware.tv.tuner.FrontendIsdbs3Capabilities; +import android.hardware.tv.tuner.FrontendIsdbsCapabilities; +import android.hardware.tv.tuner.FrontendIsdbtCapabilities; + +/** + * @hide + */ +@VintfStability +union FrontendCapabilities { + FrontendAnalogCapabilities analogCaps; + + FrontendAtscCapabilities atscCaps; + + FrontendAtsc3Capabilities atsc3Caps; + + FrontendDtmbCapabilities dtmbCaps; + + FrontendDvbsCapabilities dvbsCaps; + + FrontendDvbcCapabilities dvbcCaps; + + FrontendDvbtCapabilities dvbtCaps; + + FrontendIsdbsCapabilities isdbsCaps; + + FrontendIsdbs3Capabilities isdbs3Caps; + + FrontendIsdbtCapabilities isdbtCaps; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbBandwidth.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbBandwidth.aidl new file mode 100644 index 0000000000..4dc3f0fc9d --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbBandwidth.aidl @@ -0,0 +1,36 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Bandwidth Type for DTMB. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDtmbBandwidth { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Bandwidth automatically + */ + AUTO = 1 << 0, + + BANDWIDTH_8MHZ = 1 << 1, + + BANDWIDTH_6MHZ = 1 << 2, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbCapabilities.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbCapabilities.aidl new file mode 100644 index 0000000000..eda0d463f8 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbCapabilities.aidl @@ -0,0 +1,54 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Capabilities for DTMB Frontend. + * @hide + */ +@VintfStability +parcelable FrontendDtmbCapabilities { + /** + * Transmission Modes defined by FrontendDtmbTransmissionMode. + */ + int transmissionModeCap; + + /** + * Bandwidth Types defined by FrontendDtmbBandwidth. + */ + int bandwidthCap; + + /** + * Modulations defined by FrontendDtmbModulation. + */ + int modulationCap; + + /** + * CODERATE Types defined by FrontendDtmbCodeRate. + */ + int codeRateCap; + + /** + * Guard Interval Types defined by FrontendDtmbGuardInterval. + */ + int guardIntervalCap; + + /** + * Time Interleave Mode Type defined by FrontendDtmbTimeInterleaveMode. + */ + int interleaveModeCap; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbCodeRate.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbCodeRate.aidl new file mode 100644 index 0000000000..7b4a438793 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbCodeRate.aidl @@ -0,0 +1,38 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * CODERATE Type for DTMB. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDtmbCodeRate { + UNDEFINED = 0, + + /** + * hardware is able to detect and set code rate automatically + */ + AUTO = 1 << 0, + + CODERATE_2_5 = 1 << 1, + + CODERATE_3_5 = 1 << 2, + + CODERATE_4_5 = 1 << 3, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbGuardInterval.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbGuardInterval.aidl new file mode 100644 index 0000000000..3c2e06a9fe --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbGuardInterval.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Guard Interval Type for DTMB. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDtmbGuardInterval { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Guard Interval automatically + */ + AUTO = 1 << 0, + + PN_420_VARIOUS = 1 << 1, + + PN_595_CONST = 1 << 2, + + PN_945_VARIOUS = 1 << 3, + + PN_420_CONST = 1 << 4, + + PN_945_CONST = 1 << 5, + + PN_RESERVED = 1 << 6, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbModulation.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbModulation.aidl new file mode 100644 index 0000000000..87bd8da287 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbModulation.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Frontend Modulation Type for DTMB. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDtmbModulation { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Constellation automatically + */ + AUTO = 1 << 0, + + CONSTELLATION_4QAM = 1 << 1, + + CONSTELLATION_4QAM_NR = 1 << 2, + + CONSTELLATION_16QAM = 1 << 3, + + CONSTELLATION_32QAM = 1 << 4, + + CONSTELLATION_64QAM = 1 << 5, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbSettings.aidl new file mode 100644 index 0000000000..ccac650d84 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbSettings.aidl @@ -0,0 +1,56 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendDtmbBandwidth; +import android.hardware.tv.tuner.FrontendDtmbCodeRate; +import android.hardware.tv.tuner.FrontendDtmbGuardInterval; +import android.hardware.tv.tuner.FrontendDtmbModulation; +import android.hardware.tv.tuner.FrontendDtmbTimeInterleaveMode; +import android.hardware.tv.tuner.FrontendDtmbTransmissionMode; +import android.hardware.tv.tuner.FrontendSpectralInversion; + +/** + * Signal Setting for DTMB Frontend. + * @hide + */ +@VintfStability +parcelable FrontendDtmbSettings { + /** + * Signal frequency in Hertz + */ + int frequency; + + /** + * Signal end frequency in Hertz used by scan + */ + int endFrequency; + + FrontendSpectralInversion inversion = FrontendSpectralInversion.UNDEFINED; + + FrontendDtmbTransmissionMode transmissionMode = FrontendDtmbTransmissionMode.UNDEFINED; + + FrontendDtmbBandwidth bandwidth = FrontendDtmbBandwidth.UNDEFINED; + + FrontendDtmbModulation modulation = FrontendDtmbModulation.UNDEFINED; + + FrontendDtmbCodeRate codeRate = FrontendDtmbCodeRate.UNDEFINED; + + FrontendDtmbGuardInterval guardInterval = FrontendDtmbGuardInterval.UNDEFINED; + + FrontendDtmbTimeInterleaveMode interleaveMode = FrontendDtmbTimeInterleaveMode.UNDEFINED; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbTimeInterleaveMode.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbTimeInterleaveMode.aidl new file mode 100644 index 0000000000..a992524b06 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbTimeInterleaveMode.aidl @@ -0,0 +1,36 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Time Interleave Mode Type for DTMB. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDtmbTimeInterleaveMode { + UNDEFINED = 0, + + /** + * hardware is able to detect and set time interleave mode automatically + */ + AUTO = 1 << 0, + + TIMER_INT_240 = 1 << 1, + + TIMER_INT_720 = 1 << 2, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbTransmissionMode.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbTransmissionMode.aidl new file mode 100644 index 0000000000..7ebed8490a --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDtmbTransmissionMode.aidl @@ -0,0 +1,36 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Transmission Mode for DTMB. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDtmbTransmissionMode { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Transmission Mode automatically + */ + AUTO = 1 << 0, + + C1 = 1 << 1, + + C3780 = 1 << 2, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcAnnex.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcAnnex.aidl new file mode 100644 index 0000000000..3d99ceea41 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcAnnex.aidl @@ -0,0 +1,33 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Annex Type for DVBC. + * @hide + */ +@VintfStability +@Backing(type="byte") +enum FrontendDvbcAnnex { + UNDEFINED = 0, + + A = 1 << 0, + + B = 1 << 1, + + C = 1 << 2, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcBandwidth.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcBandwidth.aidl new file mode 100644 index 0000000000..ff921a7de8 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcBandwidth.aidl @@ -0,0 +1,35 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Bandwidth Type for Cable Frontend. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbcBandwidth { + UNDEFINED = 0, + + BANDWIDTH_5MHZ = 1 << 0, + + BANDWIDTH_6MHZ = 1 << 1, + + BANDWIDTH_7MHZ = 1 << 2, + + BANDWIDTH_8MHZ = 1 << 3, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcCapabilities.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcCapabilities.aidl new file mode 100644 index 0000000000..bd7f18067e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcCapabilities.aidl @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Capabilities for DVBC Frontend. + * @hide + */ +@VintfStability +parcelable FrontendDvbcCapabilities { + /** + * Modulation Types defined by FrontendDvbcModulation. + */ + int modulationCap; + + /** + * Inner Forward Error Correction types defined by FrontendInnerFec. + */ + long fecCap; + + /** + * Annex Types defined by FrontendDvbcAnnex. + */ + byte annexCap; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcModulation.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcModulation.aidl new file mode 100644 index 0000000000..3435e764db --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcModulation.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Modulation Type for DVBC. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbcModulation { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Modulation automatically + */ + AUTO = 1 << 0, + + MOD_16QAM = 1 << 1, + + MOD_32QAM = 1 << 2, + + MOD_64QAM = 1 << 3, + + MOD_128QAM = 1 << 4, + + MOD_256QAM = 1 << 5, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcOuterFec.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcOuterFec.aidl new file mode 100644 index 0000000000..7dc3f0f858 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcOuterFec.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Outer Forward Error Correction (FEC) Type for DVBC. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbcOuterFec { + UNDEFINED = 0, + + OUTER_FEC_NONE, + + OUTER_FEC_RS, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcSettings.aidl new file mode 100644 index 0000000000..d18d373d6d --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbcSettings.aidl @@ -0,0 +1,61 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendCableTimeInterleaveMode; +import android.hardware.tv.tuner.FrontendDvbcAnnex; +import android.hardware.tv.tuner.FrontendDvbcBandwidth; +import android.hardware.tv.tuner.FrontendDvbcModulation; +import android.hardware.tv.tuner.FrontendDvbcOuterFec; +import android.hardware.tv.tuner.FrontendInnerFec; +import android.hardware.tv.tuner.FrontendSpectralInversion; + +/** + * Signal Settings for an DVBC Frontend. + * @hide + */ +@VintfStability +parcelable FrontendDvbcSettings { + /** + * Signal frequency in Hertz + */ + int frequency; + + /** + * Signal end frequency in Hertz used by scan + */ + int endFrequency; + + FrontendDvbcModulation modulation = FrontendDvbcModulation.UNDEFINED; + + FrontendInnerFec fec = FrontendInnerFec.FEC_UNDEFINED; + + /** + * Symbols per second + */ + int symbolRate; + + FrontendDvbcOuterFec outerFec = FrontendDvbcOuterFec.UNDEFINED; + + FrontendDvbcAnnex annex = FrontendDvbcAnnex.UNDEFINED; + + FrontendSpectralInversion inversion = FrontendSpectralInversion.UNDEFINED; + + FrontendCableTimeInterleaveMode interleaveMode = FrontendCableTimeInterleaveMode.UNDEFINED; + + FrontendDvbcBandwidth bandwidth = FrontendDvbcBandwidth.UNDEFINED; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsCapabilities.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsCapabilities.aidl new file mode 100644 index 0000000000..acff0125f6 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsCapabilities.aidl @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Capabilities for DVBS Frontend. + * @hide + */ +@VintfStability +parcelable FrontendDvbsCapabilities { + /** + * Modulation Types defined by FrontendDvbsModulation.. + */ + int modulationCap; + + /** + * Inner Forward Error Correction types defined by FrontendInnerFec. + */ + long innerfecCap; + + /** + * Sub standards defined by FrontendDvbsStandard. + */ + byte standard; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsCodeRate.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsCodeRate.aidl new file mode 100644 index 0000000000..70ea3aba0c --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsCodeRate.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendInnerFec; + +/** + * Code Rate for DVBS. + * @hide + */ +@VintfStability +parcelable FrontendDvbsCodeRate { + FrontendInnerFec fec = FrontendInnerFec.FEC_UNDEFINED; + + boolean isLinear; + + /** + * true if enable short frame + */ + boolean isShortFrames; + + /** + * bits number in 1000 symbol. 0 if use the default. + */ + int bitsPer1000Symbol; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsModulation.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsModulation.aidl new file mode 100644 index 0000000000..3ba4c5ba9e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsModulation.aidl @@ -0,0 +1,61 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Modulation Type for DVBS. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbsModulation { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Modulation automatically + */ + AUTO = 1 << 0, + + MOD_QPSK = 1 << 1, + + MOD_8PSK = 1 << 2, + + MOD_16QAM = 1 << 3, + + MOD_16PSK = 1 << 4, + + MOD_32PSK = 1 << 5, + + MOD_ACM = 1 << 6, + + MOD_8APSK = 1 << 7, + + MOD_16APSK = 1 << 8, + + MOD_32APSK = 1 << 9, + + MOD_64APSK = 1 << 10, + + MOD_128APSK = 1 << 11, + + MOD_256APSK = 1 << 12, + + /** + * Reserved for Proprietary modulation + */ + MOD_RESERVED = 1 << 13, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsPilot.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsPilot.aidl new file mode 100644 index 0000000000..625ac2d457 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsPilot.aidl @@ -0,0 +1,33 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Pilot mode for DVBS. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbsPilot { + UNDEFINED, + + ON, + + OFF, + + AUTO, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsRolloff.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsRolloff.aidl new file mode 100644 index 0000000000..76d0e16744 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsRolloff.aidl @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Roll Off value for DVBS. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbsRolloff { + UNDEFINED, + + ROLLOFF_0_35, + + ROLLOFF_0_25, + + ROLLOFF_0_20, + + ROLLOFF_0_15, + + ROLLOFF_0_10, + + ROLLOFF_0_5, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsScanType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsScanType.aidl new file mode 100644 index 0000000000..1afbd938d5 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsScanType.aidl @@ -0,0 +1,35 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Scan type for a DVBS Frontend. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbsScanType { + UNDEFINED = 0, + + DIRECT, + + DISEQC, + + UNICABLE, + + JESS, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsSettings.aidl new file mode 100644 index 0000000000..d285ac1791 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsSettings.aidl @@ -0,0 +1,68 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendDvbsCodeRate; +import android.hardware.tv.tuner.FrontendDvbsModulation; +import android.hardware.tv.tuner.FrontendDvbsPilot; +import android.hardware.tv.tuner.FrontendDvbsRolloff; +import android.hardware.tv.tuner.FrontendDvbsStandard; +import android.hardware.tv.tuner.FrontendDvbsVcmMode; +import android.hardware.tv.tuner.FrontendDvbsScanType; +import android.hardware.tv.tuner.FrontendSpectralInversion; + +/** + * Signal Settings for an DVBS Frontend. + * @hide + */ +@VintfStability +parcelable FrontendDvbsSettings { + /** + * Signal frequency in Hertz + */ + int frequency; + + /** + * Signal end frequency in Hertz used by scan + */ + int endFrequency; + + FrontendSpectralInversion inversion = FrontendSpectralInversion.UNDEFINED; + + FrontendDvbsModulation modulation = FrontendDvbsModulation.UNDEFINED; + + FrontendDvbsCodeRate coderate; + + /** + * Symbols per second + */ + int symbolRate; + + FrontendDvbsRolloff rolloff = FrontendDvbsRolloff.UNDEFINED; + + FrontendDvbsPilot pilot = FrontendDvbsPilot.UNDEFINED; + + int inputStreamId; + + FrontendDvbsStandard standard = FrontendDvbsStandard.UNDEFINED; + + FrontendDvbsVcmMode vcmMode = FrontendDvbsVcmMode.UNDEFINED; + + FrontendDvbsScanType scanType = FrontendDvbsScanType.UNDEFINED; + + boolean isDiseqcRxMessage; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsStandard.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsStandard.aidl new file mode 100644 index 0000000000..bc8e0ea404 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsStandard.aidl @@ -0,0 +1,35 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Sub standards in DVBS. + * @hide + */ +@VintfStability +@Backing(type="byte") +enum FrontendDvbsStandard { + UNDEFINED = 0, + + AUTO = 1 << 0, + + S = 1 << 1, + + S2 = 1 << 2, + + S2X = 1 << 3, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsVcmMode.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsVcmMode.aidl new file mode 100644 index 0000000000..2b41dcd201 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbsVcmMode.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * VCM mode in DVBS. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbsVcmMode { + UNDEFINED, + + AUTO, + + MANUAL, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtBandwidth.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtBandwidth.aidl new file mode 100644 index 0000000000..1d3135869c --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtBandwidth.aidl @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Bandwidth Type for DVBT. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbtBandwidth { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Bandwidth automatically + */ + AUTO = 1 << 0, + + BANDWIDTH_8MHZ = 1 << 1, + + BANDWIDTH_7MHZ = 1 << 2, + + BANDWIDTH_6MHZ = 1 << 3, + + BANDWIDTH_5MHZ = 1 << 4, + + BANDWIDTH_1_7MHZ = 1 << 5, + + BANDWIDTH_10MHZ = 1 << 6, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtCapabilities.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtCapabilities.aidl new file mode 100644 index 0000000000..6bb473de00 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtCapabilities.aidl @@ -0,0 +1,58 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Capabilities for DVBT Frontend. + * @hide + */ +@VintfStability +parcelable FrontendDvbtCapabilities { + /** + * Transmission Modes defined by FrontendDvbtTransmissionMode. + */ + int transmissionModeCap; + + /** + * Bandwidth Types defined by FrontendDvbtBandwidth. + */ + int bandwidthCap; + + /** + * Extended Constellations defined by FrontendDvbtConstellation. + */ + int constellationCap; + + /** + * Code Rates defined by FrontendDvbtCoderate. + */ + int coderateCap; + + /** + * Hierarchy Types defined by FrontendDvbtHierarchy. + */ + int hierarchyCap; + + /** + * Guard Interval Types defined by FrontendDvbtGuardInterval. + */ + int guardIntervalCap; + + boolean isT2Supported; + + boolean isMisoSupported; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtCoderate.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtCoderate.aidl new file mode 100644 index 0000000000..511100386c --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtCoderate.aidl @@ -0,0 +1,50 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Code Rate for DVBT. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbtCoderate { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Hierarchy automatically + */ + AUTO = 1 << 0, + + CODERATE_1_2 = 1 << 1, + + CODERATE_2_3 = 1 << 2, + + CODERATE_3_4 = 1 << 3, + + CODERATE_5_6 = 1 << 4, + + CODERATE_7_8 = 1 << 5, + + CODERATE_3_5 = 1 << 6, + + CODERATE_4_5 = 1 << 7, + + CODERATE_6_7 = 1 << 8, + + CODERATE_8_9 = 1 << 9, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtConstellation.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtConstellation.aidl new file mode 100644 index 0000000000..268077838d --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtConstellation.aidl @@ -0,0 +1,48 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Extended Constellation for DVBT. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbtConstellation { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Constellation automatically + */ + AUTO = 1 << 0, + + CONSTELLATION_QPSK = 1 << 1, + + CONSTELLATION_16QAM = 1 << 2, + + CONSTELLATION_64QAM = 1 << 3, + + CONSTELLATION_256QAM = 1 << 4, + + CONSTELLATION_QPSK_R = 1 << 5, + + CONSTELLATION_16QAM_R = 1 << 6, + + CONSTELLATION_64QAM_R = 1 << 7, + + CONSTELLATION_256QAM_R = 1 << 8, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtGuardInterval.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtGuardInterval.aidl new file mode 100644 index 0000000000..8d60b2ffd5 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtGuardInterval.aidl @@ -0,0 +1,46 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Guard Interval Type for DVBT. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbtGuardInterval { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Guard Interval automatically + */ + AUTO = 1 << 0, + + INTERVAL_1_32 = 1 << 1, + + INTERVAL_1_16 = 1 << 2, + + INTERVAL_1_8 = 1 << 3, + + INTERVAL_1_4 = 1 << 4, + + INTERVAL_1_128 = 1 << 5, + + INTERVAL_19_128 = 1 << 6, + + INTERVAL_19_256 = 1 << 7, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtHierarchy.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtHierarchy.aidl new file mode 100644 index 0000000000..859c7603f6 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtHierarchy.aidl @@ -0,0 +1,48 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Hierarchy Type for DVBT. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbtHierarchy { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Hierarchy automatically + */ + AUTO = 1 << 0, + + HIERARCHY_NON_NATIVE = 1 << 1, + + HIERARCHY_1_NATIVE = 1 << 2, + + HIERARCHY_2_NATIVE = 1 << 3, + + HIERARCHY_4_NATIVE = 1 << 4, + + HIERARCHY_NON_INDEPTH = 1 << 5, + + HIERARCHY_1_INDEPTH = 1 << 6, + + HIERARCHY_2_INDEPTH = 1 << 7, + + HIERARCHY_4_INDEPTH = 1 << 8, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtPlpMode.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtPlpMode.aidl new file mode 100644 index 0000000000..fa70cc76e9 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtPlpMode.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Physical Layer Pipe (PLP) Mode for DVBT. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbtPlpMode { + UNDEFINED, + + AUTO, + + MANUAL, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtSettings.aidl new file mode 100644 index 0000000000..4af0d10294 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtSettings.aidl @@ -0,0 +1,84 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendDvbtBandwidth; +import android.hardware.tv.tuner.FrontendDvbtCoderate; +import android.hardware.tv.tuner.FrontendDvbtConstellation; +import android.hardware.tv.tuner.FrontendDvbtGuardInterval; +import android.hardware.tv.tuner.FrontendDvbtHierarchy; +import android.hardware.tv.tuner.FrontendDvbtPlpMode; +import android.hardware.tv.tuner.FrontendDvbtStandard; +import android.hardware.tv.tuner.FrontendDvbtTransmissionMode; +import android.hardware.tv.tuner.FrontendSpectralInversion; + +/** + * Signal Settings for DVBT Frontend. + * @hide + */ +@VintfStability +parcelable FrontendDvbtSettings { + /** + * Signal frequency in Hertz + */ + int frequency; + + /** + * Signal end frequency in Hertz used by scan + */ + int endFrequency; + + FrontendSpectralInversion inversion = FrontendSpectralInversion.UNDEFINED; + + FrontendDvbtTransmissionMode transmissionMode = FrontendDvbtTransmissionMode.UNDEFINED; + + FrontendDvbtBandwidth bandwidth = FrontendDvbtBandwidth.UNDEFINED; + + FrontendDvbtConstellation constellation = FrontendDvbtConstellation.UNDEFINED; + + FrontendDvbtHierarchy hierarchy = FrontendDvbtHierarchy.UNDEFINED; + + /** + * Code Rate for High Priority level + */ + FrontendDvbtCoderate hpCoderate = FrontendDvbtCoderate.UNDEFINED; + + /** + * Code Rate for Low Priority level + */ + FrontendDvbtCoderate lpCoderate = FrontendDvbtCoderate.UNDEFINED; + + FrontendDvbtGuardInterval guardInterval = FrontendDvbtGuardInterval.UNDEFINED; + + boolean isHighPriority; + + FrontendDvbtStandard standard = FrontendDvbtStandard.UNDEFINED; + + boolean isMiso; + + FrontendDvbtPlpMode plpMode = FrontendDvbtPlpMode.UNDEFINED; + + /** + * Physical Layer Pipe (PLP) Id + */ + byte plpId; + + /** + * Group Id for Physical Layer Pipe (PLP) + */ + byte plpGroupId; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtStandard.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtStandard.aidl new file mode 100644 index 0000000000..bf18618cdf --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtStandard.aidl @@ -0,0 +1,33 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Sub standards in DVBT. + * @hide + */ +@VintfStability +@Backing(type="byte") +enum FrontendDvbtStandard { + UNDEFINED = 0, + + AUTO = 1 << 0, + + T = 1 << 1, + + T2 = 1 << 2, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.aidl new file mode 100644 index 0000000000..ef2ceef1b0 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.aidl @@ -0,0 +1,50 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Extended Transmission Mode for DVBT. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendDvbtTransmissionMode { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Transmission Mode automatically + */ + AUTO = 1 << 0, + + MODE_2K = 1 << 1, + + MODE_8K = 1 << 2, + + MODE_4K = 1 << 3, + + MODE_1K = 1 << 4, + + MODE_16K = 1 << 5, + + MODE_32K = 1 << 6, + + MODE_8K_E = 1 << 7, + + MODE_16K_E = 1 << 8, + + MODE_32K_E = 1 << 9, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendEventType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendEventType.aidl new file mode 100644 index 0000000000..40b5161b3b --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendEventType.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Frontend Event Type. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendEventType { + /** + * The frontend has locked to the signal specified by the tune method. + */ + LOCKED, + + /** + * The frontend is unable to lock to the signal specified by the tune method. + */ + NO_SIGNAL, + + /** + * The frontend has lost the lock to the signal specified by the tune method. + */ + LOST_LOCK, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendGuardInterval.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendGuardInterval.aidl new file mode 100644 index 0000000000..cf82921479 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendGuardInterval.aidl @@ -0,0 +1,34 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendDvbtGuardInterval; +import android.hardware.tv.tuner.FrontendDtmbGuardInterval; +import android.hardware.tv.tuner.FrontendIsdbtGuardInterval; + +/** + * The different Guard Interval Types. + * @hide + */ +@VintfStability +union FrontendGuardInterval { + FrontendDvbtGuardInterval dvbt = FrontendDvbtGuardInterval.UNDEFINED; + + FrontendIsdbtGuardInterval isdbt; + + FrontendDtmbGuardInterval dtmb; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendInfo.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendInfo.aidl new file mode 100644 index 0000000000..9f178db5a4 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendInfo.aidl @@ -0,0 +1,68 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendCapabilities; +import android.hardware.tv.tuner.FrontendStatusType; +import android.hardware.tv.tuner.FrontendType; + +/** + * Information for the Frontend. + * @hide + */ +@VintfStability +parcelable FrontendInfo { + FrontendType type = FrontendType.UNDEFINED; + + /** + * Frequency in Hertz + */ + int minFrequency; + + /** + * Frequency in Hertz + */ + int maxFrequency; + + /** + * Minimum symbols per second + */ + int minSymbolRate; + + /** + * Maximum symbols per second + */ + int maxSymbolRate; + + /** + * Range in Hertz + */ + int acquireRange; + + /** + * Frontends are assigned with the same exclusiveGroupId if they can't + * function at same time. For instance, they share same hardware module. + */ + int exclusiveGroupId; + + /** + * A list of supported status types which client can inquiry + */ + FrontendStatusType[] statusCaps; + + FrontendCapabilities frontendCaps; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendInnerFec.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendInnerFec.aidl new file mode 100644 index 0000000000..b94af4b825 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendInnerFec.aidl @@ -0,0 +1,296 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Inner Forward Error Correction type as specified in ETSI EN 300 468 V1.15.1 + * and ETSI EN 302 307-2 V1.1.1. + * @hide + */ +@VintfStability +@Backing(type="long") +enum FrontendInnerFec { + /** + * Not defined + */ + FEC_UNDEFINED = 0, + + /** + * hardware is able to detect and set FEC automatically + */ + AUTO = 1L << 0, + + /** + * 1/2 conv. code rate + */ + FEC_1_2 = 1L << 1, + + /** + * 1/3 conv. code rate + */ + FEC_1_3 = 1L << 2, + + /** + * 1/4 conv. code rate + */ + FEC_1_4 = 1L << 3, + + /** + * 1/5 conv. code rate + */ + FEC_1_5 = 1L << 4, + + /** + * 2/3 conv. code rate + */ + FEC_2_3 = 1L << 5, + + /** + * 2/5 conv. code rate + */ + FEC_2_5 = 1L << 6, + + /** + * 2/9 conv. code rate + */ + FEC_2_9 = 1L << 7, + + /** + * 3/4 conv. code rate + */ + FEC_3_4 = 1L << 8, + + /** + * 3/5 conv. code rate + */ + FEC_3_5 = 1L << 9, + + /** + * 4/5 conv. code rate + */ + FEC_4_5 = 1L << 10, + + /** + * 4/15 conv. code rate + */ + FEC_4_15 = 1L << 11, + + /** + * 5/6 conv. code rate + */ + FEC_5_6 = 1L << 12, + + /** + * 5/9 conv. code rate + */ + FEC_5_9 = 1L << 13, + + /** + * 6/7 conv. code rate + */ + FEC_6_7 = 1L << 14, + + /** + * 7/8 conv. code rate + */ + FEC_7_8 = 1L << 15, + + /** + * 7/9 conv. code rate + */ + FEC_7_9 = 1L << 16, + + /** + * 7/15 conv. code rate + */ + FEC_7_15 = 1L << 17, + + /** + * 8/9 conv. code rate + */ + FEC_8_9 = 1L << 18, + + /** + * 8/15 conv. code rate + */ + FEC_8_15 = 1L << 19, + + /** + * 9/10 conv. code rate + */ + FEC_9_10 = 1L << 20, + + /** + * 9/20 conv. code rate + */ + FEC_9_20 = 1L << 21, + + /** + * 11/15 conv. code rate + */ + FEC_11_15 = 1L << 22, + + /** + * 11/20 conv. code rate + */ + FEC_11_20 = 1L << 23, + + /** + * 11/45 conv. code rate + */ + FEC_11_45 = 1L << 24, + + /** + * 13/18 conv. code rate + */ + FEC_13_18 = 1L << 25, + + /** + * 13/45 conv. code rate + */ + FEC_13_45 = 1L << 26, + + /** + * 14/45 conv. code rate + */ + FEC_14_45 = 1L << 27, + + /** + * 23/36 conv. code rate + */ + FEC_23_36 = 1L << 28, + + /** + * 25/36 conv. code rate + */ + FEC_25_36 = 1L << 29, + + /** + * 26/45 conv. code rate + */ + FEC_26_45 = 1L << 30, + + /** + * 28/45 conv. code rate + */ + FEC_28_45 = 1L << 31, + + /** + * 29/45 conv. code rate + */ + FEC_29_45 = 1L << 32, + + /** + * 31/45 conv. code rate + */ + FEC_31_45 = 1L << 33, + + /** + * 32/45 conv. code rate + */ + FEC_32_45 = 1L << 34, + + /** + * 77/90 conv. code rate + */ + FEC_77_90 = 1L << 35, + + /** + * 2/15 conv. code rate + */ + FEC_2_15 = 1L << 36, + + /** + * 3/15 conv. code rate + */ + FEC_3_15 = 1L << 37, + + /** + * 5/15 conv. code rate + */ + FEC_5_15 = 1L << 38, + + /** + * 6/15 conv. code rate + */ + FEC_6_15 = 1L << 39, + + /** + * 9/15 conv. code rate + */ + FEC_9_15 = 1L << 40, + + /** + * 10/15 conv. code rate + */ + FEC_10_15 = 1L << 41, + + /** + * 12/15 conv. code rate + */ + FEC_12_15 = 1L << 42, + + /** + * 13/15 conv. code rate + */ + FEC_13_15 = 1L << 43, + + /** + * 18/30 conv. code rate + */ + FEC_18_30 = 1L << 44, + + /** + * 20/30 conv. code rate + */ + FEC_20_30 = 1L << 45, + + /** + * 90/180 conv. code rate + */ + FEC_90_180 = 1L << 46, + + /** + * 96/180 conv. code rate + */ + FEC_96_180 = 1L << 47, + + /** + * 104/180 conv. code rate + */ + FEC_104_180 = 1L << 48, + + /** + * 128/180 conv. code rate + */ + FEC_128_180 = 1L << 49, + + /** + * 132/180 conv. code rate + */ + FEC_132_180 = 1L << 50, + + /** + * 135/180 conv. code rate + */ + FEC_135_180 = 1L << 51, + + /** + * 140/180 conv. code rate + */ + FEC_140_180 = 1L << 52, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendInterleaveMode.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendInterleaveMode.aidl new file mode 100644 index 0000000000..3aa17ddd33 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendInterleaveMode.aidl @@ -0,0 +1,34 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendAtsc3TimeInterleaveMode; +import android.hardware.tv.tuner.FrontendCableTimeInterleaveMode; +import android.hardware.tv.tuner.FrontendDtmbTimeInterleaveMode; + +/** + * @hide + */ +@VintfStability +union FrontendInterleaveMode { + FrontendAtsc3TimeInterleaveMode atsc3 + = FrontendAtsc3TimeInterleaveMode.UNDEFINED; + + FrontendCableTimeInterleaveMode dvbc; + + FrontendDtmbTimeInterleaveMode dtmb; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Capabilities.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Capabilities.aidl new file mode 100644 index 0000000000..a98e1b35b9 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Capabilities.aidl @@ -0,0 +1,34 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Capabilities for ISDBS3 Frontend. + * @hide + */ +@VintfStability +parcelable FrontendIsdbs3Capabilities { + /** + * Modulaltion Types defined by FrontendIsdbs3Modulation. + */ + int modulationCap; + + /** + * Code Rate Types defined by FrontendIsdbs3Coderate. + */ + int coderateCap; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Coderate.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Coderate.aidl new file mode 100644 index 0000000000..9e36c1e576 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Coderate.aidl @@ -0,0 +1,54 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Code Rate Type for ISDBS3. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendIsdbs3Coderate { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Code Rate automatically + */ + AUTO = 1 << 0, + + CODERATE_1_3 = 1 << 1, + + CODERATE_2_5 = 1 << 2, + + CODERATE_1_2 = 1 << 3, + + CODERATE_3_5 = 1 << 4, + + CODERATE_2_3 = 1 << 5, + + CODERATE_3_4 = 1 << 6, + + CODERATE_7_9 = 1 << 7, + + CODERATE_4_5 = 1 << 8, + + CODERATE_5_6 = 1 << 9, + + CODERATE_7_8 = 1 << 10, + + CODERATE_9_10 = 1 << 11, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Modulation.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Modulation.aidl new file mode 100644 index 0000000000..5041f631df --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Modulation.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Modulaltion Type for ISDBS3. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendIsdbs3Modulation { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Modulation automatically + */ + AUTO = 1 << 0, + + MOD_BPSK = 1 << 1, + + MOD_QPSK = 1 << 2, + + MOD_8PSK = 1 << 3, + + MOD_16APSK = 1 << 4, + + MOD_32APSK = 1 << 5, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Rolloff.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Rolloff.aidl new file mode 100644 index 0000000000..bdef4d772b --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Rolloff.aidl @@ -0,0 +1,29 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Roll of Type for ISDBS3. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendIsdbs3Rolloff { + UNDEFINED, + + ROLLOFF_0_03, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Settings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Settings.aidl new file mode 100644 index 0000000000..a7c85ac153 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbs3Settings.aidl @@ -0,0 +1,54 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendIsdbs3Coderate; +import android.hardware.tv.tuner.FrontendIsdbs3Modulation; +import android.hardware.tv.tuner.FrontendIsdbs3Rolloff; +import android.hardware.tv.tuner.FrontendIsdbsStreamIdType; + +/** + * Signal Settings for ISDBS3 Frontend. + * @hide + */ +@VintfStability +parcelable FrontendIsdbs3Settings { + /** + * Signal frequency in Hertz + */ + int frequency; + + /** + * Signal end frequency in Hertz used by scan + */ + int endFrequency; + + char streamId; + + FrontendIsdbsStreamIdType streamIdType = FrontendIsdbsStreamIdType.UNDEFINED; + + FrontendIsdbs3Modulation modulation = FrontendIsdbs3Modulation.UNDEFINED; + + FrontendIsdbs3Coderate coderate = FrontendIsdbs3Coderate.UNDEFINED; + + /** + * Symbols per second + */ + int symbolRate; + + FrontendIsdbs3Rolloff rolloff = FrontendIsdbs3Rolloff.UNDEFINED; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsCapabilities.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsCapabilities.aidl new file mode 100644 index 0000000000..842609ec31 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsCapabilities.aidl @@ -0,0 +1,34 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Capabilities for ISDBS Frontend. + * @hide + */ +@VintfStability +parcelable FrontendIsdbsCapabilities { + /** + * Modulation Types defined by FrontendIsdbsModulation. + */ + int modulationCap; + + /** + * Code Rates defined by FrontendIsdbsCoderate. + */ + int coderateCap; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsCoderate.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsCoderate.aidl new file mode 100644 index 0000000000..afcb05e437 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsCoderate.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Code Rate Type for ISDBS. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendIsdbsCoderate { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Code Rate automatically + */ + AUTO = 1 << 0, + + CODERATE_1_2 = 1 << 1, + + CODERATE_2_3 = 1 << 2, + + CODERATE_3_4 = 1 << 3, + + CODERATE_5_6 = 1 << 4, + + CODERATE_7_8 = 1 << 5, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsModulation.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsModulation.aidl new file mode 100644 index 0000000000..051580cbba --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsModulation.aidl @@ -0,0 +1,38 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Modulation Type for ISDBS. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendIsdbsModulation { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Modulation automatically + */ + AUTO = 1 << 0, + + MOD_BPSK = 1 << 1, + + MOD_QPSK = 1 << 2, + + MOD_TC8PSK = 1 << 3, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsRolloff.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsRolloff.aidl new file mode 100644 index 0000000000..961f16b333 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsRolloff.aidl @@ -0,0 +1,29 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Roll Off Type for ISDBS. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendIsdbsRolloff { + UNDEFINED, + + ROLLOFF_0_35, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsSettings.aidl new file mode 100644 index 0000000000..dde3002434 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsSettings.aidl @@ -0,0 +1,54 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendIsdbsCoderate; +import android.hardware.tv.tuner.FrontendIsdbsModulation; +import android.hardware.tv.tuner.FrontendIsdbsRolloff; +import android.hardware.tv.tuner.FrontendIsdbsStreamIdType; + +/** + * Signal Settings for ISDBS Frontend. + * @hide + */ +@VintfStability +parcelable FrontendIsdbsSettings { + /** + * Signal frequency in Hertz + */ + int frequency; + + /** + * Signal end frequency in Hertz used by scan + */ + int endFrequency; + + char streamId; + + FrontendIsdbsStreamIdType streamIdType = FrontendIsdbsStreamIdType.UNDEFINED; + + FrontendIsdbsModulation modulation = FrontendIsdbsModulation.UNDEFINED; + + FrontendIsdbsCoderate coderate = FrontendIsdbsCoderate.UNDEFINED; + + /** + * Symbols per second + */ + int symbolRate; + + FrontendIsdbsRolloff rolloff = FrontendIsdbsRolloff.UNDEFINED; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsStreamIdType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsStreamIdType.aidl new file mode 100644 index 0000000000..66b56947c8 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbsStreamIdType.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Stream Id Type for ISDBS. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendIsdbsStreamIdType { + STREAM_ID, + + RELATIVE_STREAM_NUMBER, + + UNDEFINED, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtBandwidth.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtBandwidth.aidl new file mode 100644 index 0000000000..f4a1450479 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtBandwidth.aidl @@ -0,0 +1,38 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Bandwidth for ISDBT. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendIsdbtBandwidth { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Bandwidth automatically + */ + AUTO = 1 << 0, + + BANDWIDTH_8MHZ = 1 << 1, + + BANDWIDTH_7MHZ = 1 << 2, + + BANDWIDTH_6MHZ = 1 << 3, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtCapabilities.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtCapabilities.aidl new file mode 100644 index 0000000000..4b764ad210 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtCapabilities.aidl @@ -0,0 +1,49 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Capabilities for ISDBT Frontend. + * @hide + */ +@VintfStability +parcelable FrontendIsdbtCapabilities { + /** + * Modes defined by FrontendIsdbtMode. + */ + int modeCap; + + /** + * Bandwidths defined by FrontendIsdbtBandwidth. + */ + int bandwidthCap; + + /** + * Modulations defined by FrontendIsdbtModulation. + */ + int modulationCap; + + /** + * Code Rates defined by FrontendIsdbtCoderate. + */ + int coderateCap; + + /** + * Guard Interval Types defined by FrontendIsdbtGuardInterval. + */ + int guardIntervalCap; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtCoderate.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtCoderate.aidl new file mode 100644 index 0000000000..ee229c5907 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtCoderate.aidl @@ -0,0 +1,50 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Code Rate for ISDBT. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendIsdbtCoderate { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Hierarchy automatically + */ + AUTO = 1 << 0, + + CODERATE_1_2 = 1 << 1, + + CODERATE_2_3 = 1 << 2, + + CODERATE_3_4 = 1 << 3, + + CODERATE_5_6 = 1 << 4, + + CODERATE_7_8 = 1 << 5, + + CODERATE_3_5 = 1 << 6, + + CODERATE_4_5 = 1 << 7, + + CODERATE_6_7 = 1 << 8, + + CODERATE_8_9 = 1 << 9, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtGuardInterval.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtGuardInterval.aidl new file mode 100644 index 0000000000..a3540dcb6e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtGuardInterval.aidl @@ -0,0 +1,46 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Guard Interval Type for ISDBT. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendIsdbtGuardInterval { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Guard Interval automatically + */ + AUTO = 1 << 0, + + INTERVAL_1_32 = 1 << 1, + + INTERVAL_1_16 = 1 << 2, + + INTERVAL_1_8 = 1 << 3, + + INTERVAL_1_4 = 1 << 4, + + INTERVAL_1_128 = 1 << 5, + + INTERVAL_19_128 = 1 << 6, + + INTERVAL_19_256 = 1 << 7, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtMode.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtMode.aidl new file mode 100644 index 0000000000..1a130fb220 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtMode.aidl @@ -0,0 +1,38 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Mode for ISDBT. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendIsdbtMode { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Mode automatically + */ + AUTO = 1 << 0, + + MODE_1 = 1 << 1, + + MODE_2 = 1 << 2, + + MODE_3 = 1 << 3, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtModulation.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtModulation.aidl new file mode 100644 index 0000000000..b94f57882a --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtModulation.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Modulation for ISDBT. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendIsdbtModulation { + UNDEFINED = 0, + + /** + * hardware is able to detect and set Modulation automatically + */ + AUTO = 1 << 0, + + MOD_DQPSK = 1 << 1, + + MOD_QPSK = 1 << 2, + + MOD_16QAM = 1 << 3, + + MOD_64QAM = 1 << 4, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtSettings.aidl new file mode 100644 index 0000000000..ffa884558c --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendIsdbtSettings.aidl @@ -0,0 +1,55 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendIsdbtBandwidth; +import android.hardware.tv.tuner.FrontendIsdbtCoderate; +import android.hardware.tv.tuner.FrontendIsdbtGuardInterval; +import android.hardware.tv.tuner.FrontendIsdbtMode; +import android.hardware.tv.tuner.FrontendIsdbtModulation; +import android.hardware.tv.tuner.FrontendSpectralInversion; + +/** + * Signal Settings for ISDBT Frontend. + * @hide + */ +@VintfStability +parcelable FrontendIsdbtSettings { + /** + * Signal frequency in Hertz + */ + int frequency; + + /** + * Signal end frequency in Hertz used by scan + */ + int endFrequency; + + FrontendSpectralInversion inversion = FrontendSpectralInversion.UNDEFINED; + + FrontendIsdbtModulation modulation = FrontendIsdbtModulation.UNDEFINED; + + FrontendIsdbtBandwidth bandwidth = FrontendIsdbtBandwidth.UNDEFINED; + + FrontendIsdbtMode mode = FrontendIsdbtMode.UNDEFINED; + + FrontendIsdbtCoderate coderate = FrontendIsdbtCoderate.UNDEFINED; + + FrontendIsdbtGuardInterval guardInterval = FrontendIsdbtGuardInterval.UNDEFINED; + + int serviceAreaId; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendModulation.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendModulation.aidl new file mode 100644 index 0000000000..dd09ff6f09 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendModulation.aidl @@ -0,0 +1,51 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendAtsc3Modulation; +import android.hardware.tv.tuner.FrontendAtscModulation; +import android.hardware.tv.tuner.FrontendDvbcModulation; +import android.hardware.tv.tuner.FrontendDvbsModulation; +import android.hardware.tv.tuner.FrontendIsdbs3Modulation; +import android.hardware.tv.tuner.FrontendIsdbsModulation; +import android.hardware.tv.tuner.FrontendIsdbtModulation; +import android.hardware.tv.tuner.FrontendDtmbModulation; +import android.hardware.tv.tuner.FrontendDvbtConstellation; + +/** + * @hide + */ +@VintfStability +union FrontendModulation { + FrontendDvbcModulation dvbc = FrontendDvbcModulation.UNDEFINED; + + FrontendDvbsModulation dvbs; + + FrontendDvbtConstellation dvbt; + + FrontendIsdbsModulation isdbs; + + FrontendIsdbs3Modulation isdbs3; + + FrontendIsdbtModulation isdbt; + + FrontendAtscModulation atsc; + + FrontendAtsc3Modulation atsc3; + + FrontendDtmbModulation dtmb; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendModulationStatus.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendModulationStatus.aidl new file mode 100644 index 0000000000..8630c7dde7 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendModulationStatus.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendDvbcModulation; +import android.hardware.tv.tuner.FrontendDvbsModulation; +import android.hardware.tv.tuner.FrontendIsdbs3Modulation; +import android.hardware.tv.tuner.FrontendIsdbsModulation; +import android.hardware.tv.tuner.FrontendIsdbtModulation; + +/** + * Modulation Type for Frontend's status. + * @hide + */ +@VintfStability +union FrontendModulationStatus { + FrontendDvbcModulation dvbc = FrontendDvbcModulation.UNDEFINED; + + FrontendDvbsModulation dvbs; + + FrontendIsdbsModulation isdbs; + + FrontendIsdbs3Modulation isdbs3; + + FrontendIsdbtModulation isdbt; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendRollOff.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendRollOff.aidl new file mode 100644 index 0000000000..2b8e887749 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendRollOff.aidl @@ -0,0 +1,33 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendDvbsRolloff; +import android.hardware.tv.tuner.FrontendIsdbs3Rolloff; +import android.hardware.tv.tuner.FrontendIsdbsRolloff; + +/** + * @hide + */ +@VintfStability +union FrontendRollOff { + FrontendDvbsRolloff dvbs = FrontendDvbsRolloff.UNDEFINED; + + FrontendIsdbsRolloff isdbs; + + FrontendIsdbs3Rolloff isdbs3; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanAtsc3PlpInfo.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanAtsc3PlpInfo.aidl new file mode 100644 index 0000000000..1fe2b1ff2c --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanAtsc3PlpInfo.aidl @@ -0,0 +1,28 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * ATSC3.0 PLP information for scan + * @hide + */ +@VintfStability +parcelable FrontendScanAtsc3PlpInfo { + byte plpId; + + boolean bLlsFlag; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanMessage.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanMessage.aidl new file mode 100644 index 0000000000..d89e9b1c36 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanMessage.aidl @@ -0,0 +1,73 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendAnalogType; +import android.hardware.tv.tuner.FrontendDvbcAnnex; +import android.hardware.tv.tuner.FrontendDvbtHierarchy; +import android.hardware.tv.tuner.FrontendModulation; +import android.hardware.tv.tuner.FrontendScanAtsc3PlpInfo; +import android.hardware.tv.tuner.FrontendScanMessageStandard; + +/** + * Scan Message for Frontend. + * @hide + */ +@VintfStability +union FrontendScanMessage { + boolean isLocked; + + boolean isEnd; + + /** + * scan progress percent (0..100) + */ + byte progressPercent; + + /** + * Signal frequencies in Hertz + */ + int[] frequencies; + + /** + * Symbols per second + */ + int[] symbolRates; + + FrontendDvbtHierarchy hierarchy; + + FrontendAnalogType analogType; + + byte[] plpIds; + + byte[] groupIds; + + char[] inputStreamIds; + + FrontendScanMessageStandard std; + + /** + * A list of PLP status in a tuned frequency band for ATSC3 frontend. + */ + FrontendScanAtsc3PlpInfo[] atsc3PlpInfos; + + FrontendModulation modulation; + + FrontendDvbcAnnex annex; + + boolean isHighPriority; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanMessageStandard.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanMessageStandard.aidl new file mode 100644 index 0000000000..9df725ed99 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanMessageStandard.aidl @@ -0,0 +1,33 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendAnalogSifStandard; +import android.hardware.tv.tuner.FrontendDvbsStandard; +import android.hardware.tv.tuner.FrontendDvbtStandard; + +/** + * @hide + */ +@VintfStability +union FrontendScanMessageStandard { + FrontendDvbsStandard sStd = FrontendDvbsStandard.UNDEFINED; + + FrontendDvbtStandard tStd; + + FrontendAnalogSifStandard sifStd; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanMessageType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanMessageType.aidl new file mode 100644 index 0000000000..2b91216f6e --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanMessageType.aidl @@ -0,0 +1,89 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Scan Message Type for Frontend. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendScanMessageType { + /** + * Scan locked the signal. + */ + LOCKED, + + /** + * Scan stopped. + */ + END, + + /** + * Scan progress report. + */ + PROGRESS_PERCENT, + + /** + * Locked frequency report. + */ + FREQUENCY, + + /** + * Locked symbol rate. + */ + SYMBOL_RATE, + + /** + * Locked HIERARCHY for DVBT2 frontend. + */ + HIERARCHY, + + ANALOG_TYPE, + + /** + * Locked Plp Ids for DVBT2 frontend. + */ + + PLP_IDS, + + /** + * Locked group Ids for DVBT2 frontend. + */ + GROUP_IDS, + + /** + * Stream Ids. + */ + INPUT_STREAM_IDS, + + /** + * Locked signal standard. + */ + STANDARD, + + /** + * PLP status in a tuned frequency band for ATSC3 frontend. + */ + ATSC3_PLP_INFO, + + MODULATION, + + DVBC_ANNEX, + + HIGH_PRIORITY, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanType.aidl new file mode 100644 index 0000000000..a548a3d0ba --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendScanType.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Scan type for Frontend. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendScanType { + SCAN_UNDEFINED = 0, + + SCAN_AUTO = 1 << 0, + + SCAN_BLIND = 1 << 1, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendSettings.aidl new file mode 100644 index 0000000000..f78b2ae82b --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendSettings.aidl @@ -0,0 +1,55 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendAnalogSettings; +import android.hardware.tv.tuner.FrontendAtsc3Settings; +import android.hardware.tv.tuner.FrontendAtscSettings; +import android.hardware.tv.tuner.FrontendDvbcSettings; +import android.hardware.tv.tuner.FrontendDvbsSettings; +import android.hardware.tv.tuner.FrontendDvbtSettings; +import android.hardware.tv.tuner.FrontendIsdbs3Settings; +import android.hardware.tv.tuner.FrontendIsdbsSettings; +import android.hardware.tv.tuner.FrontendIsdbtSettings; +import android.hardware.tv.tuner.FrontendDtmbSettings; + +/** + * Signal Settings for Frontend. + * @hide + */ +@VintfStability +union FrontendSettings { + FrontendAnalogSettings analog; + + FrontendAtscSettings atsc; + + FrontendAtsc3Settings atsc3; + + FrontendDvbsSettings dvbs; + + FrontendDvbcSettings dvbc; + + FrontendDvbtSettings dvbt; + + FrontendIsdbsSettings isdbs; + + FrontendIsdbs3Settings isdbs3; + + FrontendIsdbtSettings isdbt; + + FrontendDtmbSettings dtmb; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendSpectralInversion.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendSpectralInversion.aidl new file mode 100644 index 0000000000..232385b1b0 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendSpectralInversion.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Spectral Inversion Type. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendSpectralInversion { + UNDEFINED, + + NORMAL, + + INVERTED, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatus.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatus.aidl new file mode 100644 index 0000000000..b9f73add65 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatus.aidl @@ -0,0 +1,193 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendBandwidth; +import android.hardware.tv.tuner.FrontendDvbtHierarchy; +import android.hardware.tv.tuner.FrontendGuardInterval; +import android.hardware.tv.tuner.FrontendInnerFec; +import android.hardware.tv.tuner.FrontendInterleaveMode; +import android.hardware.tv.tuner.FrontendModulation; +import android.hardware.tv.tuner.FrontendModulationStatus; +import android.hardware.tv.tuner.FrontendRollOff; +import android.hardware.tv.tuner.FrontendSpectralInversion; +import android.hardware.tv.tuner.FrontendStatusAtsc3PlpInfo; +import android.hardware.tv.tuner.FrontendTransmissionMode; +import android.hardware.tv.tuner.LnbVoltage; + +/** + * The status for Frontend. + * @hide + */ +@VintfStability +union FrontendStatus { + /** + * Lock status for Demod in True/False. + */ + boolean isDemodLocked; + + /** + * SNR value measured by 0.001 dB. + */ + int snr; + + /** + * The number of error bit per 1 billion bits. + */ + int ber; + + /** + * The number of error package per 1 billion packages. + */ + int per; + + /** + * The number of error bit per 1 billion bits before FEC. + */ + int preBer; + + /** + * Signal Quality in percent. + */ + int signalQuality; + + /** + * Signal Strength measured by 0.001 dBm. + */ + int signalStrength; + + /** + * Symbols per second + */ + int symbolRate; + + FrontendInnerFec innerFec; + + FrontendModulationStatus modulationStatus; + + FrontendSpectralInversion inversion; + + LnbVoltage lnbVoltage; + + byte plpId; + + boolean isEWBS; + + /** + * AGC value is normalized from 0 to 255. + */ + byte agc; + + boolean isLnaOn; + + boolean[] isLayerError; + + /** + * MER value measured by 0.001 dB + */ + int mer; + + /** + * Frequency difference in Hertz. + */ + int freqOffset; + + FrontendDvbtHierarchy hierarchy; + + boolean isRfLocked; + + /** + * A list of PLP status for tuned PLPs for ATSC3 frontend. + */ + FrontendStatusAtsc3PlpInfo[] plpInfo; + + /** + * Modulation status. + */ + FrontendModulation[] modulations; + + /** + * Bit error ratio status. + */ + int[] bers; + + /** + * Code rate status. + */ + FrontendInnerFec[] codeRates; + + /** + * Bandwidth status. + */ + FrontendBandwidth bandwidth; + + /** + * Guard interval status. + */ + FrontendGuardInterval interval; + + /** + * Transmission mode status. + */ + FrontendTransmissionMode transmissionMode; + + /** + * Uncorrectable Error Counts of the frontend's Physical Layer Pipe (PLP) + * since the last tune operation. + */ + int uec; + + /** + * The current DVB-T2 system id status. + */ + char systemId; + + /** + * Frontend Interleaving Modes. + */ + FrontendInterleaveMode[] interleaving; + + /** + * Segments in ISDB-T Specification of all the channels. + */ + byte[] isdbtSegment; + + /** + * Transport Stream Data Rate in BPS of the current channel. + */ + int[] tsDataRate; + + /** + * Roll Off Type status of the frontend. + */ + FrontendRollOff rollOff; + + /** + * If the frontend currently supports MISO or not. + */ + boolean isMiso; + + /** + * If the frontend code rate is linear or not. + */ + boolean isLinear; + + /** + * If short frames is enabled or not. + */ + boolean isShortFrames; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusAtsc3PlpInfo.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusAtsc3PlpInfo.aidl new file mode 100644 index 0000000000..c10a08c00f --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusAtsc3PlpInfo.aidl @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Status for each tuning PLPs + * @hide + */ +@VintfStability +parcelable FrontendStatusAtsc3PlpInfo { + /** + * PLP Id value. + */ + byte plpId; + + /** + * Demod Lock/Unlock status of this particular PLP. + */ + boolean isLocked; + + /** + * Uncorrectable Error Counts (UEC) of this particular PLP since last tune operation. + */ + int uec; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusType.aidl new file mode 100644 index 0000000000..93b75b00d2 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendStatusType.aidl @@ -0,0 +1,211 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Frontend Status Type. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendStatusType { + /** + * Lock status for Demod. + */ + DEMOD_LOCK, + + /** + * Signal to Noise Ratio. + */ + SNR, + + /** + * Bit Error Ratio. + */ + BER, + + /** + * Packages Error Ratio. + */ + PER, + + /** + * Bit Error Ratio before FEC. + */ + PRE_BER, + + /** + * Signal Quality (0..100). Good data over total data in percent can be + * used as a way to present Signal Quality. + */ + SIGNAL_QUALITY, + + /** + * Signal Strength. + */ + SIGNAL_STRENGTH, + + /** + * Symbol Rate. + */ + SYMBOL_RATE, + + /** + * Forward Error Correction Type. + */ + FEC, + + /** + * Modulation Type. + */ + MODULATION, + + /** + * Spectral Inversion Type. + */ + SPECTRAL, + + /** + * LNB Voltage. + */ + LNB_VOLTAGE, + + /** + * Physical Layer Pipe ID. + */ + PLP_ID, + + /** + * Status for Emergency Warning Broadcasting System. + */ + EWBS, + + /** + * Automatic Gain Control. + */ + AGC, + + /** + * Low Noise Amplifier. + */ + LNA, + + /** + * Error status by layer. + */ + LAYER_ERROR, + + /** + * Moduration Error Ratio. + */ + MER, + + /** + * Difference between tuning frequency and actual locked frequency. + */ + FREQ_OFFSET, + + /** + * Hierarchy for DVBT. + */ + HIERARCHY, + + /** + * Lock status for RF. + */ + RF_LOCK, + + /** + * PLP information in a frequency band for ATSC3.0 frontend. + */ + ATSC3_PLP_INFO, + + /** + * Modulation Types. + */ + MODULATIONS, + + /** + * Bit Error Ratios. + */ + BERS, + /** + * Code Rates. + */ + CODERATES, + + /** + * Extended Bandwidth. + */ + BANDWIDTH, + + /** + * Extended Guard Intervals. + */ + GUARD_INTERVAL, + + /** + * Extended Transmission Mode. + */ + TRANSMISSION_MODE, + + /** + * Uncorrectable Error Counts of the frontend's Physical Layer Pipe (PLP) + * since the last tune operation. + */ + UEC, + + /** + * DVB-T2 System Id. + */ + T2_SYSTEM_ID, + + /** + * Frontend Interleaving Modes. + */ + INTERLEAVINGS, + + /** + * Segments in ISDB-T Specification of all the channels. + */ + ISDBT_SEGMENTS, + + /** + * Transport Stream Data Rate in BPS of the current channel. + */ + TS_DATA_RATES, + + /** + * Roll Off Type status of the frontend. + */ + ROLL_OFF, + + /** + * If the frontend currently supports MISO or not. + */ + IS_MISO, + + /** + * If the frontend code rate is linear or not. + */ + IS_LINEAR, + + /** + * If short frames is enabled or not. + */ + IS_SHORT_FRAMES, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendTransmissionMode.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendTransmissionMode.aidl new file mode 100644 index 0000000000..42b8718ac6 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendTransmissionMode.aidl @@ -0,0 +1,33 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendIsdbtMode; +import android.hardware.tv.tuner.FrontendDtmbTransmissionMode; +import android.hardware.tv.tuner.FrontendDvbtTransmissionMode; + +/** + * @hide + */ +@VintfStability +union FrontendTransmissionMode { + FrontendDvbtTransmissionMode dvbt = FrontendDvbtTransmissionMode.UNDEFINED; + + FrontendIsdbtMode isdbt; + + FrontendDtmbTransmissionMode dtmb; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/FrontendType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendType.aidl new file mode 100644 index 0000000000..8ade389393 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/FrontendType.aidl @@ -0,0 +1,82 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Extended Frontend Type. + * @hide + */ +@VintfStability +@Backing(type="int") +enum FrontendType { + UNDEFINED = 0, + + ANALOG, + + /** + * Advanced Television Systems Committee (ATSC) Standard A/72. + */ + ATSC, + + /** + * Advanced Television Systems Committee (ATSC 3.0) Standard A/300. + */ + ATSC3, + + /** + * Digital Video Broadcasting - Cable + * DVB Cable Frontend Standard ETSI EN 300 468 V1.15.1. + */ + DVBC, + + /** + * Digital Video Broadcasting - Satellite + * DVB Satellite Frontend Standard ETSI EN 300 468 V1.15.1 and + * ETSI EN 302 307-2 V1.1.1. + */ + DVBS, + + /** + * Digital Video Broadcasting - Terrestrial + * DVB Terrestrial Frontend Standard ETSI EN 300 468 V1.15.1 and + * ETSI EN 302 755 V1.4.1. + */ + DVBT, + + /** + * Integrated Services Digital Broadcasting-Satellite (ISDB-S) + * ARIB STD-B20 is technical document of ISDB-S. + */ + ISDBS, + + /** + * Integrated Services Digital Broadcasting-Satellite (ISDB-S) + * ARIB STD-B44 is technical document of ISDB-S3. + */ + ISDBS3, + + /** + * Integrated Services Digital Broadcasting-Terrestrial (ISDB-T or SBTVD) + * ABNT NBR 15603 is technical document of ISDB-T. + */ + ISDBT, + + /** + * DTMB (Digital Terrestrial Multimedia Broadcast) standard. + */ + DTMB, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/IDemux.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/IDemux.aidl new file mode 100644 index 0000000000..7d69240116 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/IDemux.aidl @@ -0,0 +1,133 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxFilterType; +import android.hardware.tv.tuner.DvrType; +import android.hardware.tv.tuner.IDvr; +import android.hardware.tv.tuner.IDvrCallback; +import android.hardware.tv.tuner.IFilter; +import android.hardware.tv.tuner.IFilterCallback; +import android.hardware.tv.tuner.ITimeFilter; + +/** + * Demultiplexer(Demux) takes a single multiplexed input and splits it into + * one or more output. + * @hide + */ +@VintfStability +interface IDemux { + /** + * Set a frontend resource as data input of the demux + * + * It is used by the client to specify a hardware frontend as data source of + * this demux instance. A demux instance can have only one data source. + */ + void setFrontendDataSource(in int frontendId); + + /** + * Open a new filter in the demux + * + * It is used by the client to open a filter in the demux. + * + * @param type the type of the filter to be added. + * @param bufferSize the buffer size of the filter to be opened. It's used + * to create a FMQ(Fast Message Queue) to hold data output from the filter. + * @param cb the callback for the filter to be used to send notifications + * back to the client. + * + * @return the filter instance of the newly added. + */ + IFilter openFilter(in DemuxFilterType type, in int bufferSize, + in IFilterCallback cb); + + /** + * Open time filter of the demux + * + * It is used by the client to open time filter of the demux. + * + * @return the time filter instance of the newly added. + */ + ITimeFilter openTimeFilter(); + + /** + * Get hardware sync ID for audio and video. + * + * It is used by the client to get the hardware sync ID for audio and video. + * + * @param filter the filter instance. + * + * @return the ID of hardware A/V sync. + */ + int getAvSyncHwId(in IFilter filter); + + /** + * Get current time stamp to use for A/V sync + * + * It is used by the client to get current time stamp for A/V sync. HW is + * supported to increment and maintain current time stamp. + * + * @param avSyncHwId the hardware id of A/V sync. + * + * @return the current time stamp of hardware A/V sync. The time stamp + * based on 90KHz has the same format as PTS (Presentation Time Stamp). + */ + long getAvSyncTime(in int avSyncHwId); + + /** + * Close the Demux instance + * + * It is used by the client to release the demux instance. HAL clear + * underneath resource. client mustn't access the instance any more. + */ + void close(); + + /** + * Open a DVR (Digital Video Record) instance in the demux + * + * It is used by the client to record and playback. + * + * @param type specify which kind of DVR to open. + * @param bufferSize the buffer size of the output to be added. It's used to + * create a FMQ(Fast Message Queue) to hold data from selected filters. + * @param cb the callback for the DVR to be used to send notifications + * back to the client. + * + * @return the newly opened DVR instance. + */ + IDvr openDvr(in DvrType type, in int bufferSize, in IDvrCallback cb); + + /** + * Connect Conditional Access Modules (CAM) through Common Interface (CI) + * + * It is used by the client to connect CI-CAM. The demux uses the output + * from the frontend as the input by default, and must change to use the + * output from CI-CAM as the input after this call take place. + * + * @param ciCamId specify CI-CAM Id to connect. + */ + void connectCiCam(in int ciCamId); + + /** + * Disconnect Conditional Access Modules (CAM) + * + * It is used by the client to disconnect CI-CAM. The demux will use the + * output from the frontend as the input after this call take place. + * + */ + void disconnectCiCam(); +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/IDescrambler.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/IDescrambler.aidl new file mode 100644 index 0000000000..86438284d7 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/IDescrambler.aidl @@ -0,0 +1,81 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxPid; +import android.hardware.tv.tuner.IFilter; + +/** + * Descrambler is used to descramble input data. + * @hide + */ +@VintfStability +interface IDescrambler { + /** + * Set a demux as source of the descrambler + * + * It is used by the client to specify a demux as source of this + * descrambler. A descrambler instance can have only one source, and + * this method can be only called once. + * + * @param demuxId the id of the demux to be used as descrambler's source. + */ + void setDemuxSource(in int demuxId); + + /** + * Set a key token to link descrambler to a key slot + * + * It is used by the client to link a hardware key slot to a descrambler. + * A descrambler instance can have only one key slot to link, but a key + * slot can hold a few keys for different purposes. + * + * @param keyToken the token to be used to link the key slot. + */ + void setKeyToken(in byte[] keyToken); + + /** + * Add packets' PID to the descrambler for descrambling + * + * It is used by the client to specify Package ID (PID) of packets which the + * descrambler start to descramble. Multiple PIDs can be added into one + * descrambler instance because descambling can happen simultaneously on + * packets from different PIDs. + * + * @param pid the PID of packets to start to be descrambled. + * @param filter an optional filter instance to identify upper stream. + */ + void addPid(in DemuxPid pid, in IFilter optionalSourceFilter); + + /** + * Remove packets' PID from the descrambler + * + * It is used by the client to specify Package ID (PID) of packets which the + * descrambler stop to descramble. + * + * @param pid the PID of packets to stop to be descrambled. + * @param filter an optional filter instance to identify upper stream. + */ + void removePid(in DemuxPid pid, in IFilter optionalSourceFilter); + + /** + * Release the descrambler instance + * + * It is used by the client to release the descrambler instance. HAL clear + * underneath resource. client mustn't access the instance any more. + */ + void close(); +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/IDvr.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/IDvr.aidl new file mode 100644 index 0000000000..0534f9d884 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/IDvr.aidl @@ -0,0 +1,104 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.common.fmq.MQDescriptor; +import android.hardware.common.fmq.SynchronizedReadWrite; + +import android.hardware.tv.tuner.DvrSettings; +import android.hardware.tv.tuner.IFilter; + +/** + * Digtal Video Record (DVR) interface provides record control on Demux's + * output buffer and playback control on Demux's input buffer. + * @hide + */ +@VintfStability +interface IDvr { + /** + * Get the descriptor of the DVR's FMQ + * + * It is used by the client to get the descriptor of the DVR's Fast + * Message Queue. The FMQ is used to transfer record or playback data + * between the client and the HAL. + * + * @return the descriptor of the DVR's FMQ + */ + void getQueueDesc(out MQDescriptor<byte, SynchronizedReadWrite> queue); + + /** + * Configure the DVR. + * + * It is used by the client to configure the DVR interface. + * + * @param settings the settings of the DVR interface. + */ + void configure(in DvrSettings settings); + + /** + * Attach one filter to DVR interface for recording. + * + * It is used by the client to add the data filtered out from the filter + * to record. + * + * @param filter the instance of the attached filter. + */ + void attachFilter(in IFilter filter); + + /** + * Detach one filter from the DVR's recording. + * + * It is used by the client to remove the data of the filter from DVR's + * recording. + * + * @param filter the instance of the detached filter. + */ + void detachFilter(in IFilter filter); + + /** + * Start DVR. + * + * It is used by the client to ask the DVR to start consuming playback data + * or producing data for record. + */ + void start(); + + /** + * Stop DVR. + * + * It is used by the client to ask the DVR to stop consuming playback data + * or producing data for record. + */ + void stop(); + + /** + * Flush DVR data. + * + * It is used by the client to ask the DVR to flush the data which is + * not consumed by HAL for playback or the client for record yet. + */ + void flush(); + + /** + * close the DVR instance to release resource for DVR. + * + * It is used by the client to close the DVR instance, and HAL clears + * underneath resource for this DVR instance. Client mustn't access the + * instance any more and all methods should return a failure. + */ + void close(); +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/IDvrCallback.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/IDvrCallback.aidl new file mode 100644 index 0000000000..46d48567b0 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/IDvrCallback.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.PlaybackStatus; +import android.hardware.tv.tuner.RecordStatus; + +/** + * This interface is used by the HAL to notify the DVR playback and record status + * back to the client, the cient implements the interfaces and passes a handle to + * the HAL. + * @hide + */ +@VintfStability +oneway interface IDvrCallback { + /** + * Notify the client a new status of the demux's playback. + * + * @param status a new status of the demux's playback. + */ + void onPlaybackStatus(in PlaybackStatus status); + + /** + * Notify the client a new status of the demux's record. + * + * @param status a new status of the demux's record. + */ + void onRecordStatus(in RecordStatus status); +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/IFilter.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/IFilter.aidl new file mode 100644 index 0000000000..63fe1dd364 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/IFilter.aidl @@ -0,0 +1,190 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.common.fmq.MQDescriptor; +import android.hardware.common.fmq.SynchronizedReadWrite; +import android.hardware.common.NativeHandle; + +import android.hardware.tv.tuner.DemuxFilterSettings; +import android.hardware.tv.tuner.IFilter; +import android.hardware.tv.tuner.AvStreamType; +import android.hardware.tv.tuner.DemuxFilterMonitorEventType; + +/** + * The Filter is used to filter wanted data according to the filter's + * configuration. + * + * Note that reconfiguring Filter must happen after the Filter is stopped. + * @hide + */ +@VintfStability +interface IFilter { + /** + * Get the descriptor of the filter's FMQ + * + * It is used by the client to get the descriptor of the filter's Fast + * Message Queue. The data in FMQ is filtered out from demux input or upper + * stream's filter. The data is origanized to data blocks which may have + * different length. The length's information of one or multiple data blocks + * is sent to client through DemuxFilterEvent. The data in each block + * follows the stardard specified by filter's type. + * E.X. one data block from the filter with Main_Type==TS and Sub_Type==PES + * is Packetized Elementary Stream from Transport Stream according to + * ISO/IEC 13818-1. + * + * @return the descriptor of the filter's FMQ + */ + void getQueueDesc(out MQDescriptor<byte, SynchronizedReadWrite> queue); + + /** + * Release the Filter instance + * + * It is used by the client to release the Filter instance. HAL clear + * underneath resource. client mustn't access the instance any more. + */ + void close(); + + /** + * Configure the filter. + * + * It is used by the client to configure the filter so that it can filter out + * intended data. + * + * @param settings the settings of the filter. + */ + void configure(in DemuxFilterSettings settings); + + /** + * Configure A/V filter’s stream type. This API only applies to A/V filters. + * + * @param avStreamType the stream type for A/V. + */ + void configureAvStreamType(in AvStreamType avStreamType); + + /** + * Configure additional Context ID on the IP filter. + * + * @param ipCid Context Id of the IP filter. + */ + void configureIpCid(in int ipCid); + + /** + * Configure the monitor event. + * + * The event for Scrambling Status should be sent at the following two scenarios: + * 1. When this method is called, the first detected scrambling status should be sent. + * 2. When the Scrambling status transits into different status, event should be sent. + * + * The event for IP CID change should be sent at the following two scenarios: + * 1. When this method is called, the first detected CID for the IP should be sent. + * 2. When the CID is changed to different value for the IP filter, event should be sent. + * + * @param monitorEventypes the DemuxFilterMonitorEventType events to monitor. Set + * corresponding bit of the event to monitor. Reset to stop monitoring. + */ + void configureMonitorEvent(in int monitorEventTypes); + + /** + * Start the filter. + * + * It is used by the client to ask the filter to start filterring data. + */ + void start(); + + /** + * Stop the filter. + * + * It is used by the client to ask the filter to stop filterring data. + * It won't discard the data already filtered out by the filter. The filter + * will be stopped and removed automatically if the demux is closed. + */ + void stop(); + + /** + * Flush the filter. + * + * It is used by the client to ask the filter to flush the data which is + * already produced but not consumed yet. + */ + void flush(); + + /** + * Get the shared AV memory handle. Use IFilter.releaseAvHandle to release + * the handle. + * + * When media filters are opened, call this API to initialize the share + * memory handle if it's needed. + * + * If DemuxFilterMediaEvent.avMemory contains file descriptor, share memory + * should be ignored. + * + * @param out avMemory A handle associated to the shared memory for audio or + * video. avMemory.data[0] is normally an fd for ION memory. When + * the avMemory->numFd is 0, the share memory is not initialized and + * does not contain valid fd. avMemory.data[avMemory.numFds] is an + * index used as a parameter of C2DataIdInfo to build C2 buffer in + * Codec. No C2 buffer would be created if the index does not exist. + * + * @return the size of the shared av memory. It should be ignored when the share + * memory is not initialized. + */ + long getAvSharedHandle(out NativeHandle avMemory); + + /** + * Get the 32-bit filter Id. + * + * It is used by the client to ask the hardware resource id for the filter. + * + * @return the hardware 32-bit resource Id for the filter. + */ + int getId(); + + /** + * Get the 64-bit filter Id. + * + * It is used by the client to ask the hardware resource id for the filter. + * + * @return the hardware 64-bit resource Id for the filter. + */ + long getId64Bit(); + + /** + * Release the handle reported by the HAL for AV memory. + * + * It is used by the client to notify the HAL that the AV handle won't be + * used any more in client side, so that the HAL can mark the memory + * presented by file descripor in the handle as released. + * + * @param avMemory A handle associated to the memory for audio or video. + * @param avDataId An Id provides additional information for AV data. + */ + void releaseAvHandle(in NativeHandle avMemory, in long avDataId); + + /** + * Set the filter's data source. + * + * A filter uses demux as data source by default. If the data was packetized + * by multiple protocols, multiple filters may need to work together to + * extract all protocols' header. Then a filter's data source can be output + * from another filter. + * + * @param filter the filter instance which provides data input. Switch to + * use demux as data source if the filter instance is NULL. + */ + void setDataSource(in IFilter filter); +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/IFilterCallback.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/IFilterCallback.aidl new file mode 100644 index 0000000000..f4e01ee980 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/IFilterCallback.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxFilterEvent; +import android.hardware.tv.tuner.DemuxFilterStatus; + +/** + * This interface is used by the HAL to notify the filter event and scan status + * back to the client, the cient implements the interfaces and passes a handle + * to the HAL. + * @hide + */ +@VintfStability +oneway interface IFilterCallback { + /** + * Notify the client that a new filter event happened. + * + * @param events an array of DemuxFilterEvent. + */ + void onFilterEvent(in DemuxFilterEvent[] events); + + /** + * Notify the client a new status of a filter. + * + * @param status a new status of the filter. + */ + void onFilterStatus(in DemuxFilterStatus status); +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/IFrontend.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/IFrontend.aidl new file mode 100644 index 0000000000..b2717db3c1 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/IFrontend.aidl @@ -0,0 +1,146 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendScanType; +import android.hardware.tv.tuner.FrontendSettings; +import android.hardware.tv.tuner.FrontendStatus; +import android.hardware.tv.tuner.FrontendStatusType; +import android.hardware.tv.tuner.IFrontendCallback; + +/** + * A Tuner Frontend is used to tune to a frequency and lock signal. + * + * IFrontend provides a bit stream to the Tuner Demux interface. + * @hide + */ +@VintfStability +interface IFrontend { + /** + * Set the frontend callback. + * + * IFrontendCallback is used by the client to receive events from the Frontend. + * Only one callback per IFrontend instance is supported. The callback + * will be replaced if it's set again. + * + * @param callback Callback object to pass Frontend events to the system. + * The previously registered callback must be replaced with this one. + * It can be null. + */ + void setCallback(in IFrontendCallback callback); + + /** + * Tunes the frontend to using the settings given. + * + * This locks the frontend to a frequency by providing signal + * delivery information. If previous tuning isn't completed, this call MUST + * stop previous tuning, and start a new tuning. + * Tune is an async call, with LOCKED or NO_SIGNAL events sent via callback. + * + * @param settings Signal delivery information the frontend uses to + * search and lock the signal. + */ + void tune(in FrontendSettings settings); + + /** + * Stops a previous tuning. + * + * If the method completes successfully the frontend is no longer tuned and no data + * will be sent to attached demuxes. + */ + void stopTune(); + + /** + * Releases the Frontend instance + * + * Associated resources are released. close may be called more than once. + * Calls to any other method after this will return an error + */ + void close(); + + /** + * Scan the frontend to use the settings given. + * + * This uses the frontend to start a scan from signal delivery information. + * If previous scan isn't completed, this call MUST stop previous scan, + * and start a new scan. + * Scan is an async call, with FrontendScanMessage sent via callback. + * + * @param settings Signal delivery information which the frontend uses to + * scan the signal. + * @param type the type which the frontend uses to scan the signal. + */ + void scan(in FrontendSettings settings, in FrontendScanType type); + + /** + * Stops a previous scanning. + * + * If the method completes successfully, the frontend stop previous + * scanning. + */ + void stopScan(); + + /** + * Gets the statuses of the frontend. + * + * This retrieve the statuses of the frontend for given status types. + * + * @param statusTypes an array of status type which the caller request. + * + * @return an array of statuses which response the caller's request. + */ + FrontendStatus[] getStatus(in FrontendStatusType[] statusTypes); + + /** + * Sets Low-Noise Block downconverter (LNB) for satellite frontend. + * + * This assigns a hardware LNB resource to the satellite frontend. It can be + * called multiple times to update LNB assignment. The LNB resource must be + * released when the frontend is closed. + * + * @param lnbId the Id of assigned LNB resource. + */ + void setLnb(in int lnbId); + + /** + * Enable or Disable Low Noise Amplifier (LNA). + * + * @param bEnable true if activate LNA module; false if deactivate LNA + */ + void setLna(in boolean bEnable); + + /** + * Link Conditional Access Modules (CAM) to Frontend support Common + * Interface (CI) bypass mode. + * + * The client may use this to link CI-CAM to a frontend. CI bypass mode + * requires that the CICAM also receives the TS concurrently from the + * frontend when the Demux is receiving the TS directly from the frontend. + * + * @param ciCamId specify CI-CAM Id to link. + * + * @return the Local Transport Stream Id. + */ + int linkCiCam(in int ciCamId); + + /** + * Unlink Conditional Access Modules (CAM) to Frontend. + * + * @param ciCamId specify CI-CAM Id to unlink. + */ + void unlinkCiCam(in int ciCamId); +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/IFrontendCallback.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/IFrontendCallback.aidl new file mode 100644 index 0000000000..6822869d3d --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/IFrontendCallback.aidl @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.FrontendEventType; +import android.hardware.tv.tuner.FrontendScanMessage; +import android.hardware.tv.tuner.FrontendScanMessageType; + +/** + * This interface is used by the HAL to notify the fronted event and scan messages + * back to the client, the cient implements the interfaces and passes a handle to + * the HAL. + * @hide + */ +@VintfStability +oneway interface IFrontendCallback { + /** + * Notify the client that a new event happened on the frontend. + * + * @param frontendEventType the event type. + */ + void onEvent(in FrontendEventType frontendEventType); + + /** + * The callback function that must be called by HAL implementation to notify + * the client of scan messages. + * + * @param type the type of scan message. + * @param message the scan message sent by HAL to the client. + */ + void onScanMessage(in FrontendScanMessageType type, + in FrontendScanMessage message); +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/ILnb.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/ILnb.aidl new file mode 100644 index 0000000000..28eae45412 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/ILnb.aidl @@ -0,0 +1,85 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.ILnbCallback; +import android.hardware.tv.tuner.LnbPosition; +import android.hardware.tv.tuner.LnbTone; +import android.hardware.tv.tuner.LnbVoltage; + +/** + * A Tuner LNB (low-noise block downconverter) is used by satellite frontend + * to receive the microwave signal from the satellite, amplify it, and + * downconvert the frequency to a lower frequency. + * @hide + */ +@VintfStability +interface ILnb { + /** + * Set the lnb callback. + * + * ILnbCallback is used by the client to receive events from the Lnb. + * Only one callback per ILnb instance is supported. The callback + * will be replaced if it's set again. + * + * @param callback Callback object to pass Lnb events to the system. + * The previously registered callback must be replaced with this one. + * It can be null. + */ + void setCallback(in ILnbCallback callback); + + /** + * Set the lnb's power voltage. + * + * @param voltage the power's voltage the Lnb to use. + */ + void setVoltage(in LnbVoltage voltage); + + /** + * Set the lnb's tone mode. + * + * @param tone the tone mode the Lnb to use. + */ + void setTone(in LnbTone tone); + + /** + * Select the lnb's position. + * + * @param position the position the Lnb to use. + */ + void setSatellitePosition(in LnbPosition position); + + /** + * Sends DiSEqC (Digital Satellite Equipment Control) message. + * + * Client sends DiSeqc message to DiSEqc to LNB. The response message from + * the device comes back to the client through frontend's callback + * onDiseqcMessage. + * + * @param diseqcMessage a byte array of data for DiSEqC message which is + * specified by EUTELSAT Bus Functional Specification Version 4.2. + */ + void sendDiseqcMessage(in byte[] diseqcMessage); + + /** + * Releases the LNB instance + * + * Associated resources are released. close may be called more than once. + * Calls to any other method after this will return an error + */ + void close(); +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/ILnbCallback.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/ILnbCallback.aidl new file mode 100644 index 0000000000..98ef1417bb --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/ILnbCallback.aidl @@ -0,0 +1,45 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.LnbEventType; + +/** + * This interface is used by the HAL to notify the Lnb event and DiSEqC (Digital + * Satellite Equipment Control) message back to the client, the cient implements + * the interfaces and passes a handle to the HAL. + * @hide + */ +@VintfStability +oneway interface ILnbCallback { + /** + * The callback function that must be called by HAL implementation to notify + * the client of new DiSEqC message. + * + * @param diseqcMessage a byte array of data for DiSEqC (Digital Satellite + * Equipment Control) message which is specified by EUTELSAT Bus Functional + * Specification Version 4.2. + */ + void onDiseqcMessage(in byte[] diseqcMessage); + + /** + * Notify the client that a new event happened on the Lnb. + * + * @param LnbEventType the event type. + */ + void onEvent(in LnbEventType lnbEventType); +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/ITimeFilter.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/ITimeFilter.aidl new file mode 100644 index 0000000000..dee6cd8415 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/ITimeFilter.aidl @@ -0,0 +1,71 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Timer Filter is used by Demux to filter data based on time stamp. + * @hide + */ +@VintfStability +interface ITimeFilter { + /** + * Set time stamp for time based filter. + * + * It is used by the client to set initial time stamp and enable time + * filtering. The time will be incremented locally. The demux discards + * the content which time stamp is older than the time in the time filter. + * + * @param timeStamp initial time stamp for the time filter. It based on + * 90KHz has the same format as PTS (Presentation Time Stamp). + */ + void setTimeStamp(in long timeStamp); + + /** + * Clear the time stamp in the time filter. + * + * It is used by the client to clear the time value of the time filter, + * then disable time filter. + */ + void clearTimeStamp(); + + /** + * Get the current time in the time filter. + * + * It is used by the client to inquiry current time in the time filter. + * + * @return the current time stamp in the time filter. + */ + long getTimeStamp(); + + /** + * Get the time from the beginning of current data source. + * + * It is used by the client to inquiry the time stamp from the beginning + * of current data source. + * + * @return the time stamp from the beginning of current data source. + */ + long getSourceTime(); + + /** + * Close the Time Filter instance + * + * It is used by the client to release the demux instance. HAL clear + * underneath resource. client mustn't access the instance any more. + */ + void close(); +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/ITuner.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/ITuner.aidl new file mode 100644 index 0000000000..ab8b0b81a9 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/ITuner.aidl @@ -0,0 +1,123 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DemuxCapabilities; +import android.hardware.tv.tuner.FrontendInfo; +import android.hardware.tv.tuner.IDemux; +import android.hardware.tv.tuner.IDescrambler; +import android.hardware.tv.tuner.IFrontend; +import android.hardware.tv.tuner.ILnb; + +/** + * Top level interface to manage Frontend, Demux and Decrambler hardware + * resources which are needed for Android TV. + * @hide + */ +@VintfStability +@SuppressWarnings(value={"out-array"}) +interface ITuner { + /** + * Get Frontend IDs + * + * It is used by the client to get all available frontends' IDs. + * + * @return an array of IDs for the available Frontends. + */ + int[] getFrontendIds(); + + /** + * Create a new instance of Frontend given a frontendId. + * + * It is used by the client to create a frontend instance. + * + * @param frontendId the id of the frontend to be opened. + * + * @return the newly created frontend interface. + */ + IFrontend openFrontendById(in int frontendId); + + /** + * Create a new instance of Demux. + * + * It is used by the client to create a Demux instance. + * + * @param out demuxId the newly created demux id will be the first + * element of the array. + * + * @return the newly created demux interface. + */ + IDemux openDemux(out int[] demuxId); + + /** + * Retrieve the Demux's Capabilities. + * + * @return the Demux's Capabilities. + */ + DemuxCapabilities getDemuxCaps(); + + /** + * Create a new instance of Descrambler. + * + * It is used by the client to create a Descrambler instance. + * + * @return the newly created descrambler interface. + */ + IDescrambler openDescrambler(); + + /** + * Retrieve the frontend's information. + * + * @return the frontend's information. + */ + FrontendInfo getFrontendInfo(in int frontendId); + + /** + * Get low-noise block downconverter (LNB) IDs. + * + * It is used by the client to get all available LNBs' IDs. + * + * @return an array of LnbId for the available LNBs. + */ + int[] getLnbIds(); + + /** + * Create a new instance of Lnb given a lnbId. + * + * It is used by the client to create a Lnb instance for satellite Frontend. + * + * @param lnbId the id of the LNB to be opened. + * + * @return the newly created Lnb interface. + */ + ILnb openLnbById(in int lnbId); + + /** + * Create a new instance of Lnb given a LNB name. + * + * It is used by the client to create a LNB instance for external device. + * + * @param lnbName the name for an external LNB to be opened. The app + * provides the name. Frammework doesn't depend on the name, instead + * use lnbId return from this call. + * @param out demuxId the newly opened Lnb id will be the first element of + * the array. + * + * @return the newly opened Lnb iterface. + */ + ILnb openLnbByName(in String lnbName, out int[] lnbId); +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/LnbEventType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/LnbEventType.aidl new file mode 100644 index 0000000000..a6230b0272 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/LnbEventType.aidl @@ -0,0 +1,42 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Lnb Event Type. + * @hide + */ +@VintfStability +@Backing(type="int") +enum LnbEventType { + DISEQC_RX_OVERFLOW, + + /** + * If LNB detect that outgoing Diseqc message isn't delivered on time. + */ + DISEQC_RX_TIMEOUT, + + /** + * If LNB detect that the incoming Diseqc message has parity error. + */ + DISEQC_RX_PARITY_ERROR, + + /** + * If LNB detect that the LNB is overload. + */ + LNB_OVERLOAD, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/LnbPosition.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/LnbPosition.aidl new file mode 100644 index 0000000000..067f6b199a --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/LnbPosition.aidl @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * The Position of LNB. + * @hide + */ +@VintfStability +@Backing(type="int") +enum LnbPosition { + UNDEFINED, + + POSITION_A, + + POSITION_B, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/LnbTone.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/LnbTone.aidl new file mode 100644 index 0000000000..f1d1598990 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/LnbTone.aidl @@ -0,0 +1,29 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Tone Type for LNB. + * @hide + */ +@VintfStability +@Backing(type="int") +enum LnbTone { + NONE, + + CONTINUOUS, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/LnbVoltage.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/LnbVoltage.aidl new file mode 100644 index 0000000000..03a42f23b0 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/LnbVoltage.aidl @@ -0,0 +1,43 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Power Voltage Type for LNB. + * @hide + */ +@VintfStability +@Backing(type="int") +enum LnbVoltage { + NONE, + + VOLTAGE_5V, + + VOLTAGE_11V, + + VOLTAGE_12V, + + VOLTAGE_13V, + + VOLTAGE_14V, + + VOLTAGE_15V, + + VOLTAGE_18V, + + VOLTAGE_19V, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/PlaybackSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/PlaybackSettings.aidl new file mode 100644 index 0000000000..47d3db6545 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/PlaybackSettings.aidl @@ -0,0 +1,54 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DataFormat; + +/** + * The Setting for the playback in DVR. + * @hide + */ +@VintfStability +parcelable PlaybackSettings { + /** + * Register for interested PlaybackStatus events so that the HAL can send these + * PlaybackStatus events back to client. + */ + int statusMask; + + /** + * Unused space size in bytes in the playback. The HAL uses it to trigger + * InputStatus::SPACE_ALMOST_EMPTY. + */ + int lowThreshold; + + /** + * Unused space size in bytes in the playback. The HAL uses it to trigger + * InputStatus::SPACE_ALMOST_FULL. + */ + int highThreshold; + + /** + * The data format in the playback. + */ + DataFormat dataFormat = DataFormat.UNDEFINED; + + /** + * The packet size in bytes in the playback. + */ + byte packetSize; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/PlaybackStatus.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/PlaybackStatus.aidl new file mode 100644 index 0000000000..545dc89e88 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/PlaybackStatus.aidl @@ -0,0 +1,45 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * A status of the playback in DVR. + * @hide + */ +@VintfStability +@Backing(type="int") +enum PlaybackStatus { + /** + * The space of the demux's playback is empty. + */ + SPACE_EMPTY = 1 << 0, + + /** + * The spece of the demux's playback is almost empty. + */ + SPACE_ALMOST_EMPTY = 1 << 1, + + /** + * The space of the demux's playback is almost full. + */ + SPACE_ALMOST_FULL = 1 << 2, + + /** + * The space of the demux's playback is full. + */ + SPACE_FULL = 1 << 3, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/RecordSettings.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/RecordSettings.aidl new file mode 100644 index 0000000000..94370d6974 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/RecordSettings.aidl @@ -0,0 +1,54 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +import android.hardware.tv.tuner.DataFormat; + +/** + * The Settings for the record in DVR. + * @hide + */ +@VintfStability +parcelable RecordSettings { + /** + * Register for interested RecordStatus events so that the HAL can send these + * PlaybackStatus events back to client. + */ + int statusMask; + + /** + * Unconsumed data size in bytes in the record. The HAL uses it to trigger + * OutputStatus::LOW_WATER. + */ + int lowThreshold; + + /** + * Unconsumed data size in bytes in the record. The HAL uses it to trigger + * OutputStatus::High_WATER. + */ + int highThreshold; + + /** + * The data format in the record. + */ + DataFormat dataFormat = DataFormat.UNDEFINED; + + /** + * The packet size in bytes in the record. + */ + byte packetSize; +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/RecordStatus.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/RecordStatus.aidl new file mode 100644 index 0000000000..64d9bd4a6f --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/RecordStatus.aidl @@ -0,0 +1,48 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * A status of data in the filter's buffer. + * @hide + */ +@VintfStability +@Backing(type="byte") +enum RecordStatus { + /** + * The data in the filter buffer is ready to be read. + */ + DATA_READY = 1 << 0, + + /** + * The available data amount in the filter buffer is at low level which is + * set to 25 percent by default. + */ + LOW_WATER = 1 << 1, + + /** + * The available data amount in the filter buffer is at high level which is + * set to 75 percent by default. + */ + HIGH_WATER = 1 << 2, + + /** + * The data in the filter buffer is full and newly filtered data is being + * discarded. + */ + OVERFLOW = 1 << 3, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/Result.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/Result.aidl new file mode 100644 index 0000000000..f19bf3beb2 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/Result.aidl @@ -0,0 +1,34 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Tuner error codes. Aidl will return these error codes as service specific + * errors in EX_SERVICE_SPECIFIC. + * @hide + */ +@VintfStability +@Backing(type="int") +enum Result { + SUCCESS, + UNAVAILABLE, + NOT_INITIALIZED, + INVALID_STATE, + INVALID_ARGUMENT, + OUT_OF_MEMORY, + UNKNOWN_ERROR, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/ScramblingStatus.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/ScramblingStatus.aidl new file mode 100644 index 0000000000..76f56ae6e7 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/ScramblingStatus.aidl @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Scrambling Status Type. + * @hide + */ +@VintfStability +@Backing(type="int") +enum ScramblingStatus { + /** + * Content’s scrambling status is unknown + */ + UNKNOWN = 1 << 0, + + /** + * Content is not scrambled. + */ + NOT_SCRAMBLED = 1 << 1, + + /** + * Content is scrambled. + */ + SCRAMBLED = 1 << 2, +} diff --git a/tv/tuner/aidl/android/hardware/tv/tuner/VideoStreamType.aidl b/tv/tuner/aidl/android/hardware/tv/tuner/VideoStreamType.aidl new file mode 100644 index 0000000000..108d986bd8 --- /dev/null +++ b/tv/tuner/aidl/android/hardware/tv/tuner/VideoStreamType.aidl @@ -0,0 +1,87 @@ +/* + * Copyright 2021 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. + */ + +package android.hardware.tv.tuner; + +/** + * Video stream coding format. + * @hide + */ +@VintfStability +@Backing(type="int") +enum VideoStreamType { + UNDEFINED, + + /* + * ITU-T | ISO/IEC Reserved + */ + RESERVED, + + /* + * ISO/IEC 11172 + */ + MPEG1, + + /* + * ITU-T Rec.H.262 and ISO/IEC 13818-2 + */ + MPEG2, + + /* + * ISO/IEC 14496-2 (MPEG-4 H.263 based video) + */ + MPEG4P2, + + /* + * ITU-T Rec.H.264 and ISO/IEC 14496-10 + */ + AVC, + + /* + * ITU-T Rec. H.265 and ISO/IEC 23008-2 + */ + HEVC, + + /* + * Microsoft VC.1 + */ + VC1, + + /* + * Google VP8 + */ + VP8, + + /* + * Google VP9 + */ + VP9, + + /* + * AOMedia Video 1 + */ + AV1, + + /* + * Chinese Standard + */ + AVS, + + /* + * New Chinese Standard + */ + AVS2, +} diff --git a/tv/tuner/aidl/default/Android.bp b/tv/tuner/aidl/default/Android.bp new file mode 100644 index 0000000000..cb8f87b61e --- /dev/null +++ b/tv/tuner/aidl/default/Android.bp @@ -0,0 +1,46 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "hardware_interfaces_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["hardware_interfaces_license"], +} + +cc_binary { + name: "android.hardware.tv.tuner-service.example", + relative_install_path: "hw", + init_rc: ["tuner-default.rc"], + vintf_fragments: ["tuner-default.xml"], + vendor: true, + compile_multilib: "first", + srcs: [ + "Demux.cpp", + "Descrambler.cpp", + "Dvr.cpp", + "Filter.cpp", + "Frontend.cpp", + "Lnb.cpp", + "TimeFilter.cpp", + "Tuner.cpp", + "service.cpp", + ], + static_libs: [ + "libaidlcommonsupport", + ], + shared_libs: [ + "android.hardware.common.fmq-V1-ndk", + "android.hardware.tv.tuner-V1-ndk", + "libbase", + "libbinder_ndk", + "libcutils", + "libdmabufheap", + "libfmq", + "libion", + "liblog", + "libutils", + ], + header_libs: [ + "media_plugin_headers", + ], +} diff --git a/tv/tuner/aidl/default/Demux.cpp b/tv/tuner/aidl/default/Demux.cpp new file mode 100644 index 0000000000..3937c6ab25 --- /dev/null +++ b/tv/tuner/aidl/default/Demux.cpp @@ -0,0 +1,443 @@ +/* + * Copyright 2021 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. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "android.hardware.tv.tuner-service.example-Demux" + +#include <aidl/android/hardware/tv/tuner/DemuxQueueNotifyBits.h> +#include <aidl/android/hardware/tv/tuner/Result.h> + +#include <utils/Log.h> +#include "Demux.h" + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +#define WAIT_TIMEOUT 3000000000 + +Demux::Demux(int32_t demuxId, std::shared_ptr<Tuner> tuner) { + mDemuxId = demuxId; + mTuner = tuner; +} + +Demux::~Demux() { + mFrontendInputThreadRunning = false; + std::lock_guard<std::mutex> lock(mFrontendInputThreadLock); +} + +::ndk::ScopedAStatus Demux::setFrontendDataSource(int32_t in_frontendId) { + ALOGV("%s", __FUNCTION__); + + if (mTuner == nullptr) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::NOT_INITIALIZED)); + } + + mFrontend = mTuner->getFrontendById(in_frontendId); + if (mFrontend == nullptr) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_STATE)); + } + + mTuner->setFrontendAsDemuxSource(in_frontendId, mDemuxId); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Demux::openFilter(const DemuxFilterType& in_type, int32_t in_bufferSize, + const std::shared_ptr<IFilterCallback>& in_cb, + std::shared_ptr<IFilter>* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + int64_t filterId; + filterId = ++mLastUsedFilterId; + + if (in_cb == nullptr) { + ALOGW("[Demux] callback can't be null"); + *_aidl_return = nullptr; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + + std::shared_ptr<Filter> filter = ndk::SharedRefBase::make<Filter>( + in_type, filterId, in_bufferSize, in_cb, this->ref<Demux>()); + if (!filter->createFilterMQ()) { + *_aidl_return = nullptr; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNKNOWN_ERROR)); + } + + mFilters[filterId] = filter; + if (filter->isPcrFilter()) { + mPcrFilterIds.insert(filterId); + } + bool result = true; + if (!filter->isRecordFilter()) { + // Only save non-record filters for now. Record filters are saved when the + // IDvr.attacheFilter is called. + mPlaybackFilterIds.insert(filterId); + if (mDvrPlayback != nullptr) { + result = mDvrPlayback->addPlaybackFilter(filterId, filter); + } + } + + if (!result) { + *_aidl_return = nullptr; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + + *_aidl_return = filter; + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Demux::openTimeFilter(std::shared_ptr<ITimeFilter>* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + mTimeFilter = ndk::SharedRefBase::make<TimeFilter>(this->ref<Demux>()); + + *_aidl_return = mTimeFilter; + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Demux::getAvSyncHwId(const std::shared_ptr<IFilter>& in_filter, + int32_t* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + int64_t id; + ::ndk::ScopedAStatus status; + + status = in_filter->getId64Bit(&id); + if (!status.isOk()) { + ALOGE("[Demux] Can't get filter Id."); + *_aidl_return = -1; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_STATE)); + } + + if (!mFilters[id]->isMediaFilter()) { + ALOGE("[Demux] Given filter is not a media filter."); + *_aidl_return = -1; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_STATE)); + } + + if (!mPcrFilterIds.empty()) { + // Return the lowest pcr filter id in the default implementation as the av sync id + *_aidl_return = *mPcrFilterIds.begin(); + return ::ndk::ScopedAStatus::ok(); + } + + ALOGE("[Demux] No PCR filter opened."); + *_aidl_return = -1; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_STATE)); +} + +::ndk::ScopedAStatus Demux::getAvSyncTime(int32_t in_avSyncHwId, int64_t* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + if (mPcrFilterIds.empty()) { + *_aidl_return = -1; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_STATE)); + } + if (in_avSyncHwId != *mPcrFilterIds.begin()) { + *_aidl_return = -1; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + + *_aidl_return = -1; + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Demux::close() { + ALOGV("%s", __FUNCTION__); + + set<int64_t>::iterator it; + for (it = mPlaybackFilterIds.begin(); it != mPlaybackFilterIds.end(); it++) { + mDvrPlayback->removePlaybackFilter(*it); + } + mPlaybackFilterIds.clear(); + mRecordFilterIds.clear(); + mFilters.clear(); + mLastUsedFilterId = -1; + mTuner->removeDemux(mDemuxId); + mFrontendInputThreadRunning = false; + std::lock_guard<std::mutex> lock(mFrontendInputThreadLock); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Demux::openDvr(DvrType in_type, int32_t in_bufferSize, + const std::shared_ptr<IDvrCallback>& in_cb, + std::shared_ptr<IDvr>* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + if (in_cb == nullptr) { + ALOGW("[Demux] DVR callback can't be null"); + *_aidl_return = nullptr; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + + set<int64_t>::iterator it; + switch (in_type) { + case DvrType::PLAYBACK: + mDvrPlayback = ndk::SharedRefBase::make<Dvr>(in_type, in_bufferSize, in_cb, + this->ref<Demux>()); + if (!mDvrPlayback->createDvrMQ()) { + mDvrPlayback = nullptr; + *_aidl_return = mDvrPlayback; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNKNOWN_ERROR)); + } + + for (it = mPlaybackFilterIds.begin(); it != mPlaybackFilterIds.end(); it++) { + if (!mDvrPlayback->addPlaybackFilter(*it, mFilters[*it])) { + ALOGE("[Demux] Can't get filter info for DVR playback"); + mDvrPlayback = nullptr; + *_aidl_return = mDvrPlayback; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNKNOWN_ERROR)); + } + } + + *_aidl_return = mDvrPlayback; + return ::ndk::ScopedAStatus::ok(); + case DvrType::RECORD: + mDvrRecord = ndk::SharedRefBase::make<Dvr>(in_type, in_bufferSize, in_cb, + this->ref<Demux>()); + if (!mDvrRecord->createDvrMQ()) { + mDvrRecord = nullptr; + *_aidl_return = mDvrRecord; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNKNOWN_ERROR)); + } + + *_aidl_return = mDvrRecord; + return ::ndk::ScopedAStatus::ok(); + default: + *_aidl_return = nullptr; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } +} + +::ndk::ScopedAStatus Demux::connectCiCam(int32_t in_ciCamId) { + ALOGV("%s", __FUNCTION__); + + mCiCamId = in_ciCamId; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Demux::disconnectCiCam() { + ALOGV("%s", __FUNCTION__); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Demux::removeFilter(int64_t filterId) { + ALOGV("%s", __FUNCTION__); + + if (mDvrPlayback != nullptr) { + mDvrPlayback->removePlaybackFilter(filterId); + } + mPlaybackFilterIds.erase(filterId); + mRecordFilterIds.erase(filterId); + mFilters.erase(filterId); + + return ::ndk::ScopedAStatus::ok(); +} + +void Demux::startBroadcastTsFilter(vector<int8_t> data) { + set<int64_t>::iterator it; + uint16_t pid = ((data[1] & 0x1f) << 8) | ((data[2] & 0xff)); + if (DEBUG_DEMUX) { + ALOGW("[Demux] start ts filter pid: %d", pid); + } + for (it = mPlaybackFilterIds.begin(); it != mPlaybackFilterIds.end(); it++) { + if (pid == mFilters[*it]->getTpid()) { + mFilters[*it]->updateFilterOutput(data); + } + } +} + +void Demux::sendFrontendInputToRecord(vector<int8_t> data) { + set<int64_t>::iterator it; + if (DEBUG_DEMUX) { + ALOGW("[Demux] update record filter output"); + } + for (it = mRecordFilterIds.begin(); it != mRecordFilterIds.end(); it++) { + mFilters[*it]->updateRecordOutput(data); + } +} + +void Demux::sendFrontendInputToRecord(vector<int8_t> data, uint16_t pid, uint64_t pts) { + sendFrontendInputToRecord(data); + set<int64_t>::iterator it; + for (it = mRecordFilterIds.begin(); it != mRecordFilterIds.end(); it++) { + if (pid == mFilters[*it]->getTpid()) { + mFilters[*it]->updatePts(pts); + } + } +} + +bool Demux::startBroadcastFilterDispatcher() { + set<int64_t>::iterator it; + + // Handle the output data per filter type + for (it = mPlaybackFilterIds.begin(); it != mPlaybackFilterIds.end(); it++) { + if (!mFilters[*it]->startFilterHandler().isOk()) { + return false; + } + } + + return true; +} + +bool Demux::startRecordFilterDispatcher() { + set<int64_t>::iterator it; + + for (it = mRecordFilterIds.begin(); it != mRecordFilterIds.end(); it++) { + if (!mFilters[*it]->startRecordFilterHandler().isOk()) { + return false; + } + } + + return true; +} + +::ndk::ScopedAStatus Demux::startFilterHandler(int64_t filterId) { + return mFilters[filterId]->startFilterHandler(); +} + +void Demux::updateFilterOutput(int64_t filterId, vector<int8_t> data) { + mFilters[filterId]->updateFilterOutput(data); +} + +void Demux::updateMediaFilterOutput(int64_t filterId, vector<int8_t> data, uint64_t pts) { + updateFilterOutput(filterId, data); + mFilters[filterId]->updatePts(pts); +} + +uint16_t Demux::getFilterTpid(int64_t filterId) { + return mFilters[filterId]->getTpid(); +} + +void Demux::startFrontendInputLoop() { + mFrontendInputThreadRunning = true; + pthread_create(&mFrontendInputThread, NULL, __threadLoopFrontend, this); + pthread_setname_np(mFrontendInputThread, "frontend_input_thread"); +} + +void* Demux::__threadLoopFrontend(void* user) { + Demux* const self = static_cast<Demux*>(user); + self->frontendInputThreadLoop(); + return 0; +} + +void Demux::frontendInputThreadLoop() { + if (!mFrontendInputThreadRunning) { + return; + } + + std::lock_guard<std::mutex> lock(mFrontendInputThreadLock); + if (!mDvrPlayback) { + ALOGW("[Demux] No software Frontend input configured. Ending Frontend thread loop."); + mFrontendInputThreadRunning = false; + return; + } + + while (mFrontendInputThreadRunning) { + uint32_t efState = 0; + ::android::status_t status = mDvrPlayback->getDvrEventFlag()->wait( + static_cast<uint32_t>(DemuxQueueNotifyBits::DATA_READY), &efState, WAIT_TIMEOUT, + true /* retry on spurious wake */); + if (status != ::android::OK) { + ALOGD("[Demux] wait for data ready on the playback FMQ"); + continue; + } + if (mDvrPlayback->getSettings().get<DvrSettings::Tag::playback>().dataFormat == + DataFormat::ES) { + if (!mDvrPlayback->processEsDataOnPlayback(true /*isVirtualFrontend*/, mIsRecording)) { + ALOGE("[Demux] playback es data failed to be filtered. Ending thread"); + break; + } + continue; + } + // Our current implementation filter the data and write it into the filter FMQ immediately + // after the DATA_READY from the VTS/framework + // This is for the non-ES data source, real playback use case handling. + if (!mDvrPlayback->readPlaybackFMQ(true /*isVirtualFrontend*/, mIsRecording) || + !mDvrPlayback->startFilterDispatcher(true /*isVirtualFrontend*/, mIsRecording)) { + ALOGE("[Demux] playback data failed to be filtered. Ending thread"); + break; + } + } + + mFrontendInputThreadRunning = false; + ALOGW("[Demux] Frontend Input thread end."); +} + +void Demux::stopFrontendInput() { + ALOGD("[Demux] stop frontend on demux"); + mKeepFetchingDataFromFrontend = false; + mFrontendInputThreadRunning = false; + std::lock_guard<std::mutex> lock(mFrontendInputThreadLock); +} + +void Demux::setIsRecording(bool isRecording) { + mIsRecording = isRecording; +} + +bool Demux::isRecording() { + return mIsRecording; +} + +bool Demux::attachRecordFilter(int64_t filterId) { + if (mFilters[filterId] == nullptr || mDvrRecord == nullptr || + !mFilters[filterId]->isRecordFilter()) { + return false; + } + + mRecordFilterIds.insert(filterId); + mFilters[filterId]->attachFilterToRecord(mDvrRecord); + + return true; +} + +bool Demux::detachRecordFilter(int64_t filterId) { + if (mFilters[filterId] == nullptr || mDvrRecord == nullptr) { + return false; + } + + mRecordFilterIds.erase(filterId); + mFilters[filterId]->detachFilterFromRecord(); + + return true; +} + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/Demux.h b/tv/tuner/aidl/default/Demux.h new file mode 100644 index 0000000000..4d9b7fe911 --- /dev/null +++ b/tv/tuner/aidl/default/Demux.h @@ -0,0 +1,189 @@ +/* + * Copyright 2021 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/tv/tuner/BnDemux.h> + +#include <fmq/AidlMessageQueue.h> +#include <math.h> +#include <set> +#include "Dvr.h" +#include "Filter.h" +#include "Frontend.h" +#include "TimeFilter.h" +#include "Tuner.h" + +using namespace std; + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +using ::aidl::android::hardware::common::fmq::MQDescriptor; +using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite; +using ::android::AidlMessageQueue; +using ::android::hardware::EventFlag; + +using FilterMQ = AidlMessageQueue<int8_t, SynchronizedReadWrite>; + +class Dvr; +class Filter; +class Frontend; +class TimeFilter; +class Tuner; + +class Demux : public BnDemux { + public: + Demux(int32_t demuxId, std::shared_ptr<Tuner> tuner); + ~Demux(); + + ::ndk::ScopedAStatus setFrontendDataSource(int32_t in_frontendId) override; + ::ndk::ScopedAStatus openFilter(const DemuxFilterType& in_type, int32_t in_bufferSize, + const std::shared_ptr<IFilterCallback>& in_cb, + std::shared_ptr<IFilter>* _aidl_return) override; + ::ndk::ScopedAStatus openTimeFilter(std::shared_ptr<ITimeFilter>* _aidl_return) override; + ::ndk::ScopedAStatus getAvSyncHwId(const std::shared_ptr<IFilter>& in_filter, + int32_t* _aidl_return) override; + ::ndk::ScopedAStatus getAvSyncTime(int32_t in_avSyncHwId, int64_t* _aidl_return) override; + ::ndk::ScopedAStatus close() override; + ::ndk::ScopedAStatus openDvr(DvrType in_type, int32_t in_bufferSize, + const std::shared_ptr<IDvrCallback>& in_cb, + std::shared_ptr<IDvr>* _aidl_return) override; + ::ndk::ScopedAStatus connectCiCam(int32_t in_ciCamId) override; + ::ndk::ScopedAStatus disconnectCiCam() override; + + // Functions interacts with Tuner Service + void stopFrontendInput(); + ::ndk::ScopedAStatus removeFilter(int64_t filterId); + bool attachRecordFilter(int64_t filterId); + bool detachRecordFilter(int64_t filterId); + ::ndk::ScopedAStatus startFilterHandler(int64_t filterId); + void updateFilterOutput(int64_t filterId, vector<int8_t> data); + void updateMediaFilterOutput(int64_t filterId, vector<int8_t> data, uint64_t pts); + uint16_t getFilterTpid(int64_t filterId); + void setIsRecording(bool isRecording); + bool isRecording(); + void startFrontendInputLoop(); + + /** + * A dispatcher to read and dispatch input data to all the started filters. + * Each filter handler handles the data filtering/output writing/filterEvent updating. + * Note that recording filters are not included. + */ + bool startBroadcastFilterDispatcher(); + void startBroadcastTsFilter(vector<int8_t> data); + + void sendFrontendInputToRecord(vector<int8_t> data); + void sendFrontendInputToRecord(vector<int8_t> data, uint16_t pid, uint64_t pts); + bool startRecordFilterDispatcher(); + + private: + // Tuner service + std::shared_ptr<Tuner> mTuner; + + // Frontend source + std::shared_ptr<Frontend> mFrontend; + + // A struct that passes the arguments to a newly created filter thread + struct ThreadArgs { + Demux* user; + int64_t filterId; + }; + + static void* __threadLoopFrontend(void* user); + void frontendInputThreadLoop(); + + /** + * To create a FilterMQ with the next available Filter ID. + * Creating Event Flag at the same time. + * Add the successfully created/saved FilterMQ into the local list. + * + * Return false is any of the above processes fails. + */ + void deleteEventFlag(); + bool readDataFromMQ(); + + int32_t mDemuxId = -1; + int32_t mCiCamId; + set<int64_t> mPcrFilterIds; + /** + * Record the last used filter id. Initial value is -1. + * Filter Id starts with 0. + */ + int64_t mLastUsedFilterId = -1; + /** + * Record all the used playback filter Ids. + * Any removed filter id should be removed from this set. + */ + set<int64_t> mPlaybackFilterIds; + /** + * Record all the attached record filter Ids. + * Any removed filter id should be removed from this set. + */ + set<int64_t> mRecordFilterIds; + /** + * A list of created Filter sp. + * The array number is the filter ID. + */ + std::map<int64_t, std::shared_ptr<Filter>> mFilters; + + /** + * Local reference to the opened Timer Filter instance. + */ + std::shared_ptr<TimeFilter> mTimeFilter; + + /** + * Local reference to the opened DVR object. + */ + std::shared_ptr<Dvr> mDvrPlayback; + std::shared_ptr<Dvr> mDvrRecord; + + // Thread handlers + pthread_t mFrontendInputThread; + /** + * If a specific filter's writing loop is still running + */ + bool mFrontendInputThreadRunning; + bool mKeepFetchingDataFromFrontend; + /** + * If the dvr recording is running. + */ + bool mIsRecording = false; + /** + * Lock to protect writes to the FMQs + */ + std::mutex mWriteLock; + /** + * Lock to protect writes to the input status + */ + std::mutex mFrontendInputThreadLock; + + // temp handle single PES filter + // TODO handle mulptiple Pes filters + int mPesSizeLeft = 0; + vector<uint8_t> mPesOutput; + + const bool DEBUG_DEMUX = false; +}; + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/Descrambler.cpp b/tv/tuner/aidl/default/Descrambler.cpp new file mode 100644 index 0000000000..586db73d1d --- /dev/null +++ b/tv/tuner/aidl/default/Descrambler.cpp @@ -0,0 +1,83 @@ +/* + * Copyright 2021 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. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "android.hardware.tv.tuner-service.example-Descrambler" + +#include <aidl/android/hardware/tv/tuner/IFrontendCallback.h> +#include <aidl/android/hardware/tv/tuner/Result.h> +#include <utils/Log.h> + +#include "Descrambler.h" + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +Descrambler::Descrambler() {} + +Descrambler::~Descrambler() {} + +::ndk::ScopedAStatus Descrambler::setDemuxSource(int32_t in_demuxId) { + ALOGV("%s", __FUNCTION__); + if (mDemuxSet) { + ALOGW("[ WARN ] Descrambler has already been set with a demux id %" PRIu32, + mSourceDemuxId); + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_STATE)); + } + mDemuxSet = true; + mSourceDemuxId = in_demuxId; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Descrambler::setKeyToken(const std::vector<uint8_t>& /* in_keyToken */) { + ALOGV("%s", __FUNCTION__); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Descrambler::addPid( + const DemuxPid& /* in_pid */, + const std::shared_ptr<IFilter>& /* in_optionalSourceFilter */) { + ALOGV("%s", __FUNCTION__); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Descrambler::removePid( + const DemuxPid& /* in_pid */, + const std::shared_ptr<IFilter>& /* in_optionalSourceFilter */) { + ALOGV("%s", __FUNCTION__); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Descrambler::close() { + ALOGV("%s", __FUNCTION__); + mDemuxSet = false; + + return ::ndk::ScopedAStatus::ok(); +} + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/Descrambler.h b/tv/tuner/aidl/default/Descrambler.h new file mode 100644 index 0000000000..ddf2c1db49 --- /dev/null +++ b/tv/tuner/aidl/default/Descrambler.h @@ -0,0 +1,54 @@ +/* + * Copyright 2021 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/tv/tuner/BnDescrambler.h> +#include <aidl/android/hardware/tv/tuner/ITuner.h> +#include <inttypes.h> + +using namespace std; + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +class Descrambler : public BnDescrambler { + public: + Descrambler(); + + ::ndk::ScopedAStatus setDemuxSource(int32_t in_demuxId) override; + ::ndk::ScopedAStatus setKeyToken(const std::vector<uint8_t>& in_keyToken) override; + ::ndk::ScopedAStatus addPid(const DemuxPid& in_pid, + const std::shared_ptr<IFilter>& in_optionalSourceFilter) override; + ::ndk::ScopedAStatus removePid( + const DemuxPid& in_pid, + const std::shared_ptr<IFilter>& in_optionalSourceFilter) override; + ::ndk::ScopedAStatus close() override; + + private: + virtual ~Descrambler(); + int32_t mSourceDemuxId; + bool mDemuxSet = false; +}; + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/Dvr.cpp b/tv/tuner/aidl/default/Dvr.cpp new file mode 100644 index 0000000000..9eadb8ce19 --- /dev/null +++ b/tv/tuner/aidl/default/Dvr.cpp @@ -0,0 +1,489 @@ +/* + * Copyright 2021 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. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "android.hardware.tv.tuner-service.example-Dvr" + +#include <aidl/android/hardware/tv/tuner/DemuxQueueNotifyBits.h> +#include <aidl/android/hardware/tv/tuner/Result.h> + +#include <utils/Log.h> +#include "Dvr.h" + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +#define WAIT_TIMEOUT 3000000000 + +Dvr::Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr<IDvrCallback>& cb, + std::shared_ptr<Demux> demux) { + mType = type; + mBufferSize = bufferSize; + mCallback = cb; + mDemux = demux; +} + +Dvr::~Dvr() { + // make sure thread has joined + close(); +} + +::ndk::ScopedAStatus Dvr::getQueueDesc(MQDescriptor<int8_t, SynchronizedReadWrite>* out_queue) { + ALOGV("%s", __FUNCTION__); + + *out_queue = mDvrMQ->dupeDesc(); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Dvr::configure(const DvrSettings& in_settings) { + ALOGV("%s", __FUNCTION__); + + mDvrSettings = in_settings; + mDvrConfigured = true; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Dvr::attachFilter(const std::shared_ptr<IFilter>& in_filter) { + ALOGV("%s", __FUNCTION__); + + int64_t filterId; + ::ndk::ScopedAStatus status = in_filter->getId64Bit(&filterId); + if (!status.isOk()) { + return status; + } + + if (!mDemux->attachRecordFilter(filterId)) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Dvr::detachFilter(const std::shared_ptr<IFilter>& in_filter) { + ALOGV("%s", __FUNCTION__); + + int64_t filterId; + ::ndk::ScopedAStatus status = in_filter->getId64Bit(&filterId); + if (!status.isOk()) { + return status; + } + + if (!mDemux->detachRecordFilter(filterId)) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Dvr::start() { + ALOGV("%s", __FUNCTION__); + if (mDvrThreadRunning) { + return ::ndk::ScopedAStatus::ok(); + } + + if (!mCallback) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::NOT_INITIALIZED)); + } + + if (!mDvrConfigured) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_STATE)); + } + + if (mType == DvrType::PLAYBACK) { + mDvrThreadRunning = true; + mDvrThread = std::thread(&Dvr::playbackThreadLoop, this); + } else if (mType == DvrType::RECORD) { + mRecordStatus = RecordStatus::DATA_READY; + mDemux->setIsRecording(mType == DvrType::RECORD); + } + + // TODO start another thread to send filter status callback to the framework + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Dvr::stop() { + ALOGV("%s", __FUNCTION__); + + mDvrThreadRunning = false; + if (mDvrThread.joinable()) { + mDvrThread.join(); + } + // thread should always be joinable if it is running, + // so it should be safe to assume recording stopped. + mDemux->setIsRecording(false); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Dvr::flush() { + ALOGV("%s", __FUNCTION__); + + mRecordStatus = RecordStatus::DATA_READY; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Dvr::close() { + ALOGV("%s", __FUNCTION__); + + stop(); + + return ::ndk::ScopedAStatus::ok(); +} + +bool Dvr::createDvrMQ() { + ALOGV("%s", __FUNCTION__); + + // Create a synchronized FMQ that supports blocking read/write + unique_ptr<DvrMQ> tmpDvrMQ = unique_ptr<DvrMQ>(new (nothrow) DvrMQ(mBufferSize, true)); + if (!tmpDvrMQ->isValid()) { + ALOGW("[Dvr] Failed to create FMQ of DVR"); + return false; + } + + mDvrMQ = move(tmpDvrMQ); + + if (EventFlag::createEventFlag(mDvrMQ->getEventFlagWord(), &mDvrEventFlag) != ::android::OK) { + return false; + } + + return true; +} + +EventFlag* Dvr::getDvrEventFlag() { + return mDvrEventFlag; +} + +void Dvr::playbackThreadLoop() { + ALOGD("[Dvr] playback threadLoop start."); + + while (mDvrThreadRunning) { + uint32_t efState = 0; + ::android::status_t status = + mDvrEventFlag->wait(static_cast<uint32_t>(DemuxQueueNotifyBits::DATA_READY), + &efState, WAIT_TIMEOUT, true /* retry on spurious wake */); + if (status != ::android::OK) { + ALOGD("[Dvr] wait for data ready on the playback FMQ"); + continue; + } + + // If the both dvr playback and dvr record are created, the playback will be treated as + // the source of the record. isVirtualFrontend set to true would direct the dvr playback + // input to the demux record filters or live broadcast filters. + bool isRecording = mDemux->isRecording(); + bool isVirtualFrontend = isRecording; + + if (mDvrSettings.get<DvrSettings::Tag::playback>().dataFormat == DataFormat::ES) { + if (!processEsDataOnPlayback(isVirtualFrontend, isRecording)) { + ALOGE("[Dvr] playback es data failed to be filtered. Ending thread"); + break; + } + maySendPlaybackStatusCallback(); + continue; + } + + // Our current implementation filter the data and write it into the filter FMQ immediately + // after the DATA_READY from the VTS/framework + // This is for the non-ES data source, real playback use case handling. + if (!readPlaybackFMQ(isVirtualFrontend, isRecording) || + !startFilterDispatcher(isVirtualFrontend, isRecording)) { + ALOGE("[Dvr] playback data failed to be filtered. Ending thread"); + break; + } + + maySendPlaybackStatusCallback(); + } + + mDvrThreadRunning = false; + ALOGD("[Dvr] playback thread ended."); +} + +void Dvr::maySendPlaybackStatusCallback() { + lock_guard<mutex> lock(mPlaybackStatusLock); + int availableToRead = mDvrMQ->availableToRead(); + int availableToWrite = mDvrMQ->availableToWrite(); + + PlaybackStatus newStatus = + checkPlaybackStatusChange(availableToWrite, availableToRead, + mDvrSettings.get<DvrSettings::Tag::playback>().highThreshold, + mDvrSettings.get<DvrSettings::Tag::playback>().lowThreshold); + if (mPlaybackStatus != newStatus) { + mCallback->onPlaybackStatus(newStatus); + mPlaybackStatus = newStatus; + } +} + +PlaybackStatus Dvr::checkPlaybackStatusChange(uint32_t availableToWrite, uint32_t availableToRead, + uint32_t highThreshold, uint32_t lowThreshold) { + if (availableToWrite == 0) { + return PlaybackStatus::SPACE_FULL; + } else if (availableToRead > highThreshold) { + return PlaybackStatus::SPACE_ALMOST_FULL; + } else if (availableToRead < lowThreshold) { + return PlaybackStatus::SPACE_ALMOST_EMPTY; + } else if (availableToRead == 0) { + return PlaybackStatus::SPACE_EMPTY; + } + return mPlaybackStatus; +} + +bool Dvr::readPlaybackFMQ(bool isVirtualFrontend, bool isRecording) { + // Read playback data from the input FMQ + int size = mDvrMQ->availableToRead(); + uint8_t playbackPacketSize = + static_cast<uint8_t>(mDvrSettings.get<DvrSettings::Tag::playback>().packetSize); + vector<int8_t> dataOutputBuffer; + dataOutputBuffer.resize(playbackPacketSize); + // Dispatch the packet to the PID matching filter output buffer + for (int i = 0; i < size / playbackPacketSize; i++) { + if (!mDvrMQ->read(dataOutputBuffer.data(), playbackPacketSize)) { + return false; + } + if (isVirtualFrontend) { + if (isRecording) { + mDemux->sendFrontendInputToRecord(dataOutputBuffer); + } else { + mDemux->startBroadcastTsFilter(dataOutputBuffer); + } + } else { + startTpidFilter(dataOutputBuffer); + } + } + + return true; +} + +bool Dvr::processEsDataOnPlayback(bool isVirtualFrontend, bool isRecording) { + // Read ES from the DVR FMQ + // Note that currently we only provides ES with metaData in a specific format to be parsed. + // The ES size should be smaller than the Playback FMQ size to avoid reading truncated data. + int size = mDvrMQ->availableToRead(); + vector<int8_t> dataOutputBuffer; + dataOutputBuffer.resize(size); + if (!mDvrMQ->read(dataOutputBuffer.data(), size)) { + return false; + } + + int metaDataSize = size; + int totalFrames = 0; + int videoEsDataSize = 0; + int audioEsDataSize = 0; + int audioPid = 0; + int videoPid = 0; + + vector<MediaEsMetaData> esMeta; + int videoReadPointer = 0; + int audioReadPointer = 0; + int frameCount = 0; + // Get meta data from the es + for (int i = 0; i < metaDataSize; i++) { + switch (dataOutputBuffer[i]) { + case 'm': + metaDataSize = 0; + getMetaDataValue(i, dataOutputBuffer.data(), metaDataSize); + videoReadPointer = metaDataSize; + continue; + case 'l': + getMetaDataValue(i, dataOutputBuffer.data(), totalFrames); + esMeta.resize(totalFrames); + continue; + case 'V': + getMetaDataValue(i, dataOutputBuffer.data(), videoEsDataSize); + audioReadPointer = metaDataSize + videoEsDataSize; + continue; + case 'A': + getMetaDataValue(i, dataOutputBuffer.data(), audioEsDataSize); + continue; + case 'p': + if (dataOutputBuffer[++i] == 'a') { + getMetaDataValue(i, dataOutputBuffer.data(), audioPid); + } else if (dataOutputBuffer[i] == 'v') { + getMetaDataValue(i, dataOutputBuffer.data(), videoPid); + } + continue; + case 'v': + case 'a': + if (dataOutputBuffer[i + 1] != ',') { + ALOGE("[Dvr] Invalid format meta data."); + return false; + } + esMeta[frameCount] = { + .isAudio = dataOutputBuffer[i] == 'a' ? true : false, + }; + i += 5; // Move to Len + getMetaDataValue(i, dataOutputBuffer.data(), esMeta[frameCount].len); + if (esMeta[frameCount].isAudio) { + esMeta[frameCount].startIndex = audioReadPointer; + audioReadPointer += esMeta[frameCount].len; + } else { + esMeta[frameCount].startIndex = videoReadPointer; + videoReadPointer += esMeta[frameCount].len; + } + i += 4; // move to PTS + getMetaDataValue(i, dataOutputBuffer.data(), esMeta[frameCount].pts); + frameCount++; + continue; + default: + continue; + } + } + + if (frameCount != totalFrames) { + ALOGE("[Dvr] Invalid meta data, frameCount=%d, totalFrames reported=%d", frameCount, + totalFrames); + return false; + } + + if (metaDataSize + audioEsDataSize + videoEsDataSize != size) { + ALOGE("[Dvr] Invalid meta data, metaSize=%d, videoSize=%d, audioSize=%d, totolSize=%d", + metaDataSize, videoEsDataSize, audioEsDataSize, size); + return false; + } + + // Read es raw data from the FMQ per meta data built previously + vector<int8_t> frameData; + map<int64_t, std::shared_ptr<IFilter>>::iterator it; + int pid = 0; + for (int i = 0; i < totalFrames; i++) { + frameData.resize(esMeta[i].len); + pid = esMeta[i].isAudio ? audioPid : videoPid; + memcpy(frameData.data(), dataOutputBuffer.data() + esMeta[i].startIndex, esMeta[i].len); + // Send to the media filters or record filters + if (!isRecording) { + for (it = mFilters.begin(); it != mFilters.end(); it++) { + if (pid == mDemux->getFilterTpid(it->first)) { + mDemux->updateMediaFilterOutput(it->first, frameData, + static_cast<uint64_t>(esMeta[i].pts)); + } + } + } else { + mDemux->sendFrontendInputToRecord(frameData, pid, static_cast<uint64_t>(esMeta[i].pts)); + } + startFilterDispatcher(isVirtualFrontend, isRecording); + frameData.clear(); + } + + return true; +} + +void Dvr::getMetaDataValue(int& index, int8_t* dataOutputBuffer, int& value) { + index += 2; // Move the pointer across the ":" to the value + while (dataOutputBuffer[index] != ',' && dataOutputBuffer[index] != '\n') { + value = ((dataOutputBuffer[index++] - 48) + value * 10); + } +} + +void Dvr::startTpidFilter(vector<int8_t> data) { + map<int64_t, std::shared_ptr<IFilter>>::iterator it; + for (it = mFilters.begin(); it != mFilters.end(); it++) { + uint16_t pid = ((data[1] & 0x1f) << 8) | ((data[2] & 0xff)); + if (DEBUG_DVR) { + ALOGW("[Dvr] start ts filter pid: %d", pid); + } + if (pid == mDemux->getFilterTpid(it->first)) { + mDemux->updateFilterOutput(it->first, data); + } + } +} + +bool Dvr::startFilterDispatcher(bool isVirtualFrontend, bool isRecording) { + if (isVirtualFrontend) { + if (isRecording) { + return mDemux->startRecordFilterDispatcher(); + } else { + return mDemux->startBroadcastFilterDispatcher(); + } + } + + map<int64_t, std::shared_ptr<IFilter>>::iterator it; + // Handle the output data per filter type + for (it = mFilters.begin(); it != mFilters.end(); it++) { + if (mDemux->startFilterHandler(it->first).isOk()) { + return false; + } + } + + return true; +} + +bool Dvr::writeRecordFMQ(const vector<int8_t>& data) { + lock_guard<mutex> lock(mWriteLock); + if (mRecordStatus == RecordStatus::OVERFLOW) { + ALOGW("[Dvr] stops writing and wait for the client side flushing."); + return true; + } + if (mDvrMQ->write(data.data(), data.size())) { + mDvrEventFlag->wake(static_cast<uint32_t>(DemuxQueueNotifyBits::DATA_READY)); + maySendRecordStatusCallback(); + return true; + } + + maySendRecordStatusCallback(); + return false; +} + +void Dvr::maySendRecordStatusCallback() { + lock_guard<mutex> lock(mRecordStatusLock); + int availableToRead = mDvrMQ->availableToRead(); + int availableToWrite = mDvrMQ->availableToWrite(); + + RecordStatus newStatus = + checkRecordStatusChange(availableToWrite, availableToRead, + mDvrSettings.get<DvrSettings::Tag::record>().highThreshold, + mDvrSettings.get<DvrSettings::Tag::record>().lowThreshold); + if (mRecordStatus != newStatus) { + mCallback->onRecordStatus(newStatus); + mRecordStatus = newStatus; + } +} + +RecordStatus Dvr::checkRecordStatusChange(uint32_t availableToWrite, uint32_t availableToRead, + uint32_t highThreshold, uint32_t lowThreshold) { + if (availableToWrite == 0) { + return RecordStatus::OVERFLOW; + } else if (availableToRead > highThreshold) { + return RecordStatus::HIGH_WATER; + } else if (availableToRead < lowThreshold) { + return RecordStatus::LOW_WATER; + } + return mRecordStatus; +} + +bool Dvr::addPlaybackFilter(int64_t filterId, std::shared_ptr<IFilter> filter) { + mFilters[filterId] = filter; + return true; +} + +bool Dvr::removePlaybackFilter(int64_t filterId) { + mFilters.erase(filterId); + return true; +} + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/Dvr.h b/tv/tuner/aidl/default/Dvr.h new file mode 100644 index 0000000000..68933aed70 --- /dev/null +++ b/tv/tuner/aidl/default/Dvr.h @@ -0,0 +1,150 @@ +/* + * Copyright 2021 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/tv/tuner/BnDvr.h> +#include <aidl/android/hardware/tv/tuner/RecordStatus.h> + +#include <fmq/AidlMessageQueue.h> +#include <math.h> +#include <atomic> +#include <set> +#include <thread> +#include "Demux.h" +#include "Frontend.h" +#include "Tuner.h" + +using namespace std; + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +using ::aidl::android::hardware::common::fmq::MQDescriptor; +using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite; +using ::android::AidlMessageQueue; +using ::android::hardware::EventFlag; + +using DvrMQ = AidlMessageQueue<int8_t, SynchronizedReadWrite>; + +struct MediaEsMetaData { + bool isAudio; + int startIndex; + int len; + int pts; +}; + +class Demux; +class Filter; +class Frontend; +class Tuner; + +class Dvr : public BnDvr { + public: + Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr<IDvrCallback>& cb, + std::shared_ptr<Demux> demux); + ~Dvr(); + + ::ndk::ScopedAStatus getQueueDesc( + MQDescriptor<int8_t, SynchronizedReadWrite>* out_queue) override; + ::ndk::ScopedAStatus configure(const DvrSettings& in_settings) override; + ::ndk::ScopedAStatus attachFilter(const std::shared_ptr<IFilter>& in_filter) override; + ::ndk::ScopedAStatus detachFilter(const std::shared_ptr<IFilter>& in_filter) override; + ::ndk::ScopedAStatus start() override; + ::ndk::ScopedAStatus stop() override; + ::ndk::ScopedAStatus flush() override; + ::ndk::ScopedAStatus close() override; + + /** + * To create a DvrMQ and its Event Flag. + * + * Return false is any of the above processes fails. + */ + bool createDvrMQ(); + bool writeRecordFMQ(const std::vector<int8_t>& data); + bool addPlaybackFilter(int64_t filterId, std::shared_ptr<IFilter> filter); + bool removePlaybackFilter(int64_t filterId); + bool readPlaybackFMQ(bool isVirtualFrontend, bool isRecording); + bool processEsDataOnPlayback(bool isVirtualFrontend, bool isRecording); + bool startFilterDispatcher(bool isVirtualFrontend, bool isRecording); + EventFlag* getDvrEventFlag(); + DvrSettings getSettings() { return mDvrSettings; } + + private: + // Demux service + std::shared_ptr<Demux> mDemux; + + DvrType mType; + uint32_t mBufferSize; + std::shared_ptr<IDvrCallback> mCallback; + std::map<int64_t, std::shared_ptr<IFilter>> mFilters; + + void deleteEventFlag(); + bool readDataFromMQ(); + void getMetaDataValue(int& index, int8_t* dataOutputBuffer, int& value); + void maySendPlaybackStatusCallback(); + void maySendRecordStatusCallback(); + PlaybackStatus checkPlaybackStatusChange(uint32_t availableToWrite, uint32_t availableToRead, + uint32_t highThreshold, uint32_t lowThreshold); + RecordStatus checkRecordStatusChange(uint32_t availableToWrite, uint32_t availableToRead, + uint32_t highThreshold, uint32_t lowThreshold); + /** + * A dispatcher to read and dispatch input data to all the started filters. + * Each filter handler handles the data filtering/output writing/filterEvent updating. + */ + void startTpidFilter(vector<int8_t> data); + void playbackThreadLoop(); + + unique_ptr<DvrMQ> mDvrMQ; + EventFlag* mDvrEventFlag; + /** + * Demux callbacks used on filter events or IO buffer status + */ + bool mDvrConfigured = false; + DvrSettings mDvrSettings; + + // Thread handlers + std::thread mDvrThread; + + // FMQ status local records + PlaybackStatus mPlaybackStatus; + RecordStatus mRecordStatus; + /** + * If a specific filter's writing loop is still running + */ + std::atomic<bool> mDvrThreadRunning; + bool mKeepFetchingDataFromFrontend; + /** + * Lock to protect writes to the FMQs + */ + std::mutex mWriteLock; + /** + * Lock to protect writes to the input status + */ + std::mutex mPlaybackStatusLock; + std::mutex mRecordStatusLock; + + const bool DEBUG_DVR = false; +}; + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/Filter.cpp b/tv/tuner/aidl/default/Filter.cpp new file mode 100644 index 0000000000..77ca2ee62b --- /dev/null +++ b/tv/tuner/aidl/default/Filter.cpp @@ -0,0 +1,1121 @@ +/* + * Copyright 2021 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. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "android.hardware.tv.tuner-service.example-Filter" + +#include <BufferAllocator/BufferAllocator.h> +#include <aidl/android/hardware/tv/tuner/DemuxFilterMonitorEventType.h> +#include <aidl/android/hardware/tv/tuner/DemuxQueueNotifyBits.h> +#include <aidl/android/hardware/tv/tuner/Result.h> +#include <aidlcommonsupport/NativeHandle.h> +#include <utils/Log.h> + +#include "Filter.h" + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +#define WAIT_TIMEOUT 3000000000 + +Filter::Filter() {} + +Filter::Filter(DemuxFilterType type, int64_t filterId, uint32_t bufferSize, + const std::shared_ptr<IFilterCallback>& cb, std::shared_ptr<Demux> demux) { + mType = type; + mFilterId = filterId; + mBufferSize = bufferSize; + mDemux = demux; + mCallback = cb; + + switch (mType.mainType) { + case DemuxFilterMainType::TS: + if (mType.subType.get<DemuxFilterSubType::Tag::tsFilterType>() == + DemuxTsFilterType::AUDIO || + mType.subType.get<DemuxFilterSubType::Tag::tsFilterType>() == + DemuxTsFilterType::VIDEO) { + mIsMediaFilter = true; + } + if (mType.subType.get<DemuxFilterSubType::Tag::tsFilterType>() == + DemuxTsFilterType::PCR) { + mIsPcrFilter = true; + } + if (mType.subType.get<DemuxFilterSubType::Tag::tsFilterType>() == + DemuxTsFilterType::RECORD) { + mIsRecordFilter = true; + } + break; + case DemuxFilterMainType::MMTP: + if (mType.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>() == + DemuxMmtpFilterType::AUDIO || + mType.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>() == + DemuxMmtpFilterType::VIDEO) { + mIsMediaFilter = true; + } + if (mType.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>() == + DemuxMmtpFilterType::RECORD) { + mIsRecordFilter = true; + } + break; + case DemuxFilterMainType::IP: + break; + case DemuxFilterMainType::TLV: + break; + case DemuxFilterMainType::ALP: + break; + default: + break; + } +} + +Filter::~Filter() { + mFilterThreadRunning = false; + std::lock_guard<std::mutex> lock(mFilterThreadLock); +} + +::ndk::ScopedAStatus Filter::getId64Bit(int64_t* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + *_aidl_return = mFilterId; + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::getId(int32_t* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + *_aidl_return = static_cast<int32_t>(mFilterId); + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::setDataSource(const std::shared_ptr<IFilter>& in_filter) { + ALOGV("%s", __FUNCTION__); + + mDataSource = in_filter; + mIsDataSourceDemux = false; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::getQueueDesc(MQDescriptor<int8_t, SynchronizedReadWrite>* out_queue) { + ALOGV("%s", __FUNCTION__); + + mIsUsingFMQ = mIsRecordFilter ? false : true; + + *out_queue = mFilterMQ->dupeDesc(); + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::configure(const DemuxFilterSettings& in_settings) { + ALOGV("%s", __FUNCTION__); + + mFilterSettings = in_settings; + switch (mType.mainType) { + case DemuxFilterMainType::TS: + mTpid = in_settings.get<DemuxFilterSettings::Tag::ts>().tpid; + break; + case DemuxFilterMainType::MMTP: + break; + case DemuxFilterMainType::IP: + break; + case DemuxFilterMainType::TLV: + break; + case DemuxFilterMainType::ALP: + break; + default: + break; + } + + mConfigured = true; + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::start() { + ALOGV("%s", __FUNCTION__); + mFilterThreadRunning = true; + vector<DemuxFilterEvent> events; + // All the filter event callbacks in start are for testing purpose. + switch (mType.mainType) { + case DemuxFilterMainType::TS: + createMediaEvent(events); + mCallback->onFilterEvent(events); + createTsRecordEvent(events); + mCallback->onFilterEvent(events); + createTemiEvent(events); + mCallback->onFilterEvent(events); + break; + case DemuxFilterMainType::MMTP: + createDownloadEvent(events); + mCallback->onFilterEvent(events); + createMmtpRecordEvent(events); + mCallback->onFilterEvent(events); + break; + case DemuxFilterMainType::IP: + createSectionEvent(events); + mCallback->onFilterEvent(events); + createIpPayloadEvent(events); + mCallback->onFilterEvent(events); + break; + case DemuxFilterMainType::TLV: + createMonitorEvent(events); + mCallback->onFilterEvent(events); + break; + case DemuxFilterMainType::ALP: + createMonitorEvent(events); + mCallback->onFilterEvent(events); + break; + default: + break; + } + return startFilterLoop(); +} + +::ndk::ScopedAStatus Filter::stop() { + ALOGV("%s", __FUNCTION__); + mFilterThreadRunning = false; + std::lock_guard<std::mutex> lock(mFilterThreadLock); + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::flush() { + ALOGV("%s", __FUNCTION__); + + // temp implementation to flush the FMQ + int size = mFilterMQ->availableToRead(); + int8_t* buffer = new int8_t[size]; + mFilterMQ->read(buffer, size); + delete[] buffer; + mFilterStatus = DemuxFilterStatus::DATA_READY; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::releaseAvHandle(const NativeHandle& in_avMemory, int64_t in_avDataId) { + ALOGV("%s", __FUNCTION__); + + if ((mSharedAvMemHandle != nullptr) && (in_avMemory.fds.size() > 0) && + (sameFile(in_avMemory.fds[0].get(), mSharedAvMemHandle->data[0]))) { + freeSharedAvHandle(); + return ::ndk::ScopedAStatus::ok(); + } + + if (mDataId2Avfd.find(in_avDataId) == mDataId2Avfd.end()) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + + ::close(mDataId2Avfd[in_avDataId]); + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::close() { + ALOGV("%s", __FUNCTION__); + + mFilterThreadRunning = false; + std::lock_guard<std::mutex> lock(mFilterThreadLock); + return mDemux->removeFilter(mFilterId); +} + +::ndk::ScopedAStatus Filter::configureIpCid(int32_t in_ipCid) { + ALOGV("%s", __FUNCTION__); + + if (mType.mainType != DemuxFilterMainType::IP) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_STATE)); + } + + mCid = in_ipCid; + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::getAvSharedHandle(NativeHandle* out_avMemory, int64_t* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + if (!mIsMediaFilter) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_STATE)); + } + + if (mSharedAvMemHandle != nullptr) { + *out_avMemory = ::android::dupToAidl(mSharedAvMemHandle); + *_aidl_return = BUFFER_SIZE_16M; + mUsingSharedAvMem = true; + return ::ndk::ScopedAStatus::ok(); + } + + int av_fd = createAvIonFd(BUFFER_SIZE_16M); + if (av_fd < 0) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::OUT_OF_MEMORY)); + } + + mSharedAvMemHandle = createNativeHandle(av_fd); + if (mSharedAvMemHandle == nullptr) { + ::close(av_fd); + *_aidl_return = 0; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNKNOWN_ERROR)); + } + ::close(av_fd); + mUsingSharedAvMem = true; + + *out_avMemory = ::android::dupToAidl(mSharedAvMemHandle); + *_aidl_return = BUFFER_SIZE_16M; + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::configureAvStreamType(const AvStreamType& in_avStreamType) { + ALOGV("%s", __FUNCTION__); + + if (!mIsMediaFilter) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNAVAILABLE)); + } + + switch (in_avStreamType.getTag()) { + case AvStreamType::Tag::audio: + mAudioStreamType = + static_cast<uint32_t>(in_avStreamType.get<AvStreamType::Tag::audio>()); + break; + case AvStreamType::Tag::video: + mVideoStreamType = + static_cast<uint32_t>(in_avStreamType.get<AvStreamType::Tag::video>()); + break; + default: + break; + } + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::configureMonitorEvent(int in_monitorEventTypes) { + ALOGV("%s", __FUNCTION__); + + int32_t newScramblingStatus = + in_monitorEventTypes & + static_cast<int32_t>(DemuxFilterMonitorEventType::SCRAMBLING_STATUS); + int32_t newIpCid = + in_monitorEventTypes & static_cast<int32_t>(DemuxFilterMonitorEventType::IP_CID_CHANGE); + + // if scrambling status monitoring flipped, record the new state and send msg on enabling + if (newScramblingStatus ^ mScramblingStatusMonitored) { + mScramblingStatusMonitored = newScramblingStatus; + if (mScramblingStatusMonitored) { + if (mCallback != nullptr) { + // Assuming current status is always NOT_SCRAMBLED + vector<DemuxFilterEvent> events; + DemuxFilterMonitorEvent monitorEvent; + events.resize(1); + monitorEvent.set<DemuxFilterMonitorEvent::Tag::scramblingStatus>( + ScramblingStatus::NOT_SCRAMBLED); + events[0].set<DemuxFilterEvent::monitorEvent>(monitorEvent); + mCallback->onFilterEvent(events); + } else { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_STATE)); + } + } + } + + // if ip cid monitoring flipped, record the new state and send msg on enabling + if (newIpCid ^ mIpCidMonitored) { + mIpCidMonitored = newIpCid; + if (mIpCidMonitored) { + if (mCallback != nullptr) { + // Return random cid + vector<DemuxFilterEvent> events; + DemuxFilterMonitorEvent monitorEvent; + events.resize(1); + monitorEvent.set<DemuxFilterMonitorEvent::Tag::cid>(1); + events[0].set<DemuxFilterEvent::monitorEvent>(monitorEvent); + mCallback->onFilterEvent(events); + } else { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_STATE)); + } + } + } + + return ::ndk::ScopedAStatus::ok(); +} + +bool Filter::createFilterMQ() { + ALOGV("%s", __FUNCTION__); + + // Create a synchronized FMQ that supports blocking read/write + std::unique_ptr<FilterMQ> tmpFilterMQ = + std::unique_ptr<FilterMQ>(new (std::nothrow) FilterMQ(mBufferSize, true)); + if (!tmpFilterMQ->isValid()) { + ALOGW("[Filter] Failed to create FMQ of filter with id: %" PRIu64, mFilterId); + return false; + } + + mFilterMQ = std::move(tmpFilterMQ); + + if (EventFlag::createEventFlag(mFilterMQ->getEventFlagWord(), &mFilterEventsFlag) != + ::android::OK) { + return false; + } + + return true; +} + +::ndk::ScopedAStatus Filter::startFilterLoop() { + pthread_create(&mFilterThread, NULL, __threadLoopFilter, this); + pthread_setname_np(mFilterThread, "filter_waiting_loop"); + return ::ndk::ScopedAStatus::ok(); +} + +void* Filter::__threadLoopFilter(void* user) { + Filter* const self = static_cast<Filter*>(user); + self->filterThreadLoop(); + return 0; +} + +void Filter::filterThreadLoop() { + if (!mFilterThreadRunning) { + return; + } + std::lock_guard<std::mutex> lock(mFilterThreadLock); + ALOGD("[Filter] filter %" PRIu64 " threadLoop start.", mFilterId); + + // For the first time of filter output, implementation needs to send the filter + // Event Callback without waiting for the DATA_CONSUMED to init the process. + while (mFilterThreadRunning) { + if (mFilterEvents.size() == 0) { + if (DEBUG_FILTER) { + ALOGD("[Filter] wait for filter data output."); + } + usleep(1000 * 1000); + continue; + } + + // After successfully write, send a callback and wait for the read to be done + if (mCallback != nullptr) { + if (mConfigured) { + vector<DemuxFilterEvent> startEvent; + startEvent.resize(1); + startEvent[0].set<DemuxFilterEvent::Tag::startId>(mStartId++); + mCallback->onFilterEvent(startEvent); + mConfigured = false; + } + mCallback->onFilterEvent(mFilterEvents); + } else { + ALOGD("[Filter] filter callback is not configured yet."); + mFilterThreadRunning = false; + return; + } + + mFilterEvents.resize(0); + mFilterStatus = DemuxFilterStatus::DATA_READY; + if (mCallback != nullptr) { + mCallback->onFilterStatus(mFilterStatus); + } + break; + } + + while (mFilterThreadRunning) { + uint32_t efState = 0; + // We do not wait for the last round of written data to be read to finish the thread + // because the VTS can verify the reading itself. + for (int i = 0; i < SECTION_WRITE_COUNT; i++) { + if (!mFilterThreadRunning) { + break; + } + while (mFilterThreadRunning && mIsUsingFMQ) { + ::android::status_t status = mFilterEventsFlag->wait( + static_cast<uint32_t>(DemuxQueueNotifyBits::DATA_CONSUMED), &efState, + WAIT_TIMEOUT, true /* retry on spurious wake */); + if (status != ::android::OK) { + ALOGD("[Filter] wait for data consumed"); + continue; + } + break; + } + + maySendFilterStatusCallback(); + + while (mFilterThreadRunning) { + std::lock_guard<std::mutex> lock(mFilterEventsLock); + if (mFilterEvents.size() == 0) { + continue; + } + // After successfully write, send a callback and wait for the read to be done + if (mCallback != nullptr) { + mCallback->onFilterEvent(mFilterEvents); + } + mFilterEvents.resize(0); + break; + } + // We do not wait for the last read to be done + // VTS can verify the read result itself. + if (i == SECTION_WRITE_COUNT - 1) { + ALOGD("[Filter] filter %" PRIu64 " writing done. Ending thread", mFilterId); + break; + } + } + break; + } + ALOGD("[Filter] filter thread ended."); +} + +void Filter::freeSharedAvHandle() { + if (!mIsMediaFilter) { + return; + } + native_handle_close(mSharedAvMemHandle); + native_handle_delete(mSharedAvMemHandle); + mSharedAvMemHandle = nullptr; +} + +void Filter::maySendFilterStatusCallback() { + if (!mIsUsingFMQ) { + return; + } + std::lock_guard<std::mutex> lock(mFilterStatusLock); + int availableToRead = mFilterMQ->availableToRead(); + int availableToWrite = mFilterMQ->availableToWrite(); + int fmqSize = mFilterMQ->getQuantumCount(); + + DemuxFilterStatus newStatus = checkFilterStatusChange( + availableToWrite, availableToRead, ceil(fmqSize * 0.75), ceil(fmqSize * 0.25)); + if (mFilterStatus != newStatus) { + if (mCallback != nullptr) { + mCallback->onFilterStatus(newStatus); + } + mFilterStatus = newStatus; + } +} + +DemuxFilterStatus Filter::checkFilterStatusChange(uint32_t availableToWrite, + uint32_t availableToRead, uint32_t highThreshold, + uint32_t lowThreshold) { + if (availableToWrite == 0) { + return DemuxFilterStatus::OVERFLOW; + } else if (availableToRead > highThreshold) { + return DemuxFilterStatus::HIGH_WATER; + } else if (availableToRead < lowThreshold) { + return DemuxFilterStatus::LOW_WATER; + } + return mFilterStatus; +} + +uint16_t Filter::getTpid() { + return mTpid; +} + +void Filter::updateFilterOutput(vector<int8_t>& data) { + std::lock_guard<std::mutex> lock(mFilterOutputLock); + mFilterOutput.insert(mFilterOutput.end(), data.begin(), data.end()); +} + +void Filter::updatePts(uint64_t pts) { + std::lock_guard<std::mutex> lock(mFilterOutputLock); + mPts = pts; +} + +void Filter::updateRecordOutput(vector<int8_t>& data) { + std::lock_guard<std::mutex> lock(mRecordFilterOutputLock); + mRecordFilterOutput.insert(mRecordFilterOutput.end(), data.begin(), data.end()); +} + +::ndk::ScopedAStatus Filter::startFilterHandler() { + std::lock_guard<std::mutex> lock(mFilterOutputLock); + switch (mType.mainType) { + case DemuxFilterMainType::TS: + switch (mType.subType.get<DemuxFilterSubType::Tag::tsFilterType>()) { + case DemuxTsFilterType::UNDEFINED: + break; + case DemuxTsFilterType::SECTION: + startSectionFilterHandler(); + break; + case DemuxTsFilterType::PES: + startPesFilterHandler(); + break; + case DemuxTsFilterType::TS: + startTsFilterHandler(); + break; + case DemuxTsFilterType::AUDIO: + case DemuxTsFilterType::VIDEO: + startMediaFilterHandler(); + break; + case DemuxTsFilterType::PCR: + startPcrFilterHandler(); + break; + case DemuxTsFilterType::TEMI: + startTemiFilterHandler(); + break; + default: + break; + } + break; + case DemuxFilterMainType::MMTP: + /*mmtpSettings*/ + break; + case DemuxFilterMainType::IP: + /*ipSettings*/ + break; + case DemuxFilterMainType::TLV: + /*tlvSettings*/ + break; + case DemuxFilterMainType::ALP: + /*alpSettings*/ + break; + default: + break; + } + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::startSectionFilterHandler() { + if (mFilterOutput.empty()) { + return ::ndk::ScopedAStatus::ok(); + } + if (!writeSectionsAndCreateEvent(mFilterOutput)) { + ALOGD("[Filter] filter %" PRIu64 " fails to write into FMQ. Ending thread", mFilterId); + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNKNOWN_ERROR)); + } + + mFilterOutput.clear(); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::startPesFilterHandler() { + std::lock_guard<std::mutex> lock(mFilterEventsLock); + if (mFilterOutput.empty()) { + return ::ndk::ScopedAStatus::ok(); + } + + for (int i = 0; i < mFilterOutput.size(); i += 188) { + if (mPesSizeLeft == 0) { + uint32_t prefix = (mFilterOutput[i + 4] << 16) | (mFilterOutput[i + 5] << 8) | + mFilterOutput[i + 6]; + if (DEBUG_FILTER) { + ALOGD("[Filter] prefix %d", prefix); + } + if (prefix == 0x000001) { + // TODO handle mulptiple Pes filters + mPesSizeLeft = (mFilterOutput[i + 8] << 8) | mFilterOutput[i + 9]; + mPesSizeLeft += 6; + if (DEBUG_FILTER) { + ALOGD("[Filter] pes data length %d", mPesSizeLeft); + } + } else { + continue; + } + } + + int endPoint = min(184, mPesSizeLeft); + // append data and check size + vector<int8_t>::const_iterator first = mFilterOutput.begin() + i + 4; + vector<int8_t>::const_iterator last = mFilterOutput.begin() + i + 4 + endPoint; + mPesOutput.insert(mPesOutput.end(), first, last); + // size does not match then continue + mPesSizeLeft -= endPoint; + if (DEBUG_FILTER) { + ALOGD("[Filter] pes data left %d", mPesSizeLeft); + } + if (mPesSizeLeft > 0) { + continue; + } + // size match then create event + if (!writeDataToFilterMQ(mPesOutput)) { + ALOGD("[Filter] pes data write failed"); + mFilterOutput.clear(); + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + maySendFilterStatusCallback(); + DemuxFilterPesEvent pesEvent; + pesEvent = { + // temp dump meta data + .streamId = static_cast<char16_t>(mPesOutput[3]), + .dataLength = static_cast<char16_t>(mPesOutput.size()), + }; + if (DEBUG_FILTER) { + ALOGD("[Filter] assembled pes data length %d", pesEvent.dataLength); + } + + int size = mFilterEvents.size(); + mFilterEvents.resize(size + 1); + mFilterEvents[size].set<DemuxFilterEvent::Tag::pes>(pesEvent); + mPesOutput.clear(); + } + + mFilterOutput.clear(); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::startTsFilterHandler() { + // TODO handle starting TS filter + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::startMediaFilterHandler() { + std::lock_guard<std::mutex> lock(mFilterEventsLock); + if (mFilterOutput.empty()) { + return ::ndk::ScopedAStatus::ok(); + } + + ::ndk::ScopedAStatus result; + if (mPts) { + result = createMediaFilterEventWithIon(mFilterOutput); + if (result.isOk()) { + mFilterOutput.clear(); + } + return result; + } + + for (int i = 0; i < mFilterOutput.size(); i += 188) { + if (mPesSizeLeft == 0) { + uint32_t prefix = (mFilterOutput[i + 4] << 16) | (mFilterOutput[i + 5] << 8) | + mFilterOutput[i + 6]; + if (DEBUG_FILTER) { + ALOGD("[Filter] prefix %d", prefix); + } + if (prefix == 0x000001) { + // TODO handle mulptiple Pes filters + mPesSizeLeft = (mFilterOutput[i + 8] << 8) | mFilterOutput[i + 9]; + mPesSizeLeft += 6; + if (DEBUG_FILTER) { + ALOGD("[Filter] pes data length %d", mPesSizeLeft); + } + } else { + continue; + } + } + + int endPoint = min(184, mPesSizeLeft); + // append data and check size + vector<int8_t>::const_iterator first = mFilterOutput.begin() + i + 4; + vector<int8_t>::const_iterator last = mFilterOutput.begin() + i + 4 + endPoint; + mPesOutput.insert(mPesOutput.end(), first, last); + // size does not match then continue + mPesSizeLeft -= endPoint; + if (DEBUG_FILTER) { + ALOGD("[Filter] pes data left %d", mPesSizeLeft); + } + if (mPesSizeLeft > 0 || mAvBufferCopyCount++ < 10) { + continue; + } + + result = createMediaFilterEventWithIon(mPesOutput); + if (result.isOk()) { + return result; + } + } + + mFilterOutput.clear(); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::createMediaFilterEventWithIon(vector<int8_t>& output) { + if (mUsingSharedAvMem) { + if (mSharedAvMemHandle == nullptr) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNKNOWN_ERROR)); + } + return createShareMemMediaEvents(output); + } + + return createIndependentMediaEvents(output); +} + +::ndk::ScopedAStatus Filter::startRecordFilterHandler() { + std::lock_guard<std::mutex> lock(mRecordFilterOutputLock); + if (mRecordFilterOutput.empty()) { + return ::ndk::ScopedAStatus::ok(); + } + + if (mDvr == nullptr || !mDvr->writeRecordFMQ(mRecordFilterOutput)) { + ALOGD("[Filter] dvr fails to write into record FMQ."); + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNKNOWN_ERROR)); + } + + DemuxFilterTsRecordEvent recordEvent; + recordEvent = { + .byteNumber = static_cast<int64_t>(mRecordFilterOutput.size()), + .pts = (mPts == 0) ? static_cast<int64_t>(time(NULL)) * 900000 : mPts, + .firstMbInSlice = 0, // random address + }; + + int size; + size = mFilterEvents.size(); + mFilterEvents.resize(size + 1); + mFilterEvents[size].set<DemuxFilterEvent::Tag::tsRecord>(recordEvent); + + mRecordFilterOutput.clear(); + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::startPcrFilterHandler() { + // TODO handle starting PCR filter + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::startTemiFilterHandler() { + // TODO handle starting TEMI filter + return ::ndk::ScopedAStatus::ok(); +} + +bool Filter::writeSectionsAndCreateEvent(vector<int8_t>& data) { + // TODO check how many sections has been read + ALOGD("[Filter] section handler"); + std::lock_guard<std::mutex> lock(mFilterEventsLock); + if (!writeDataToFilterMQ(data)) { + return false; + } + int size = mFilterEvents.size(); + mFilterEvents.resize(size + 1); + DemuxFilterSectionEvent secEvent; + secEvent = { + // temp dump meta data + .tableId = 0, + .version = 1, + .sectionNum = 1, + .dataLength = static_cast<char16_t>(data.size()), + }; + mFilterEvents[size].set<DemuxFilterEvent::Tag::section>(secEvent); + return true; +} + +bool Filter::writeDataToFilterMQ(const std::vector<int8_t>& data) { + std::lock_guard<std::mutex> lock(mWriteLock); + if (mFilterMQ->write(data.data(), data.size())) { + return true; + } + return false; +} + +void Filter::attachFilterToRecord(const std::shared_ptr<Dvr> dvr) { + mDvr = dvr; +} + +void Filter::detachFilterFromRecord() { + mDvr = nullptr; +} + +int Filter::createAvIonFd(int size) { + // Create an DMA-BUF fd and allocate an av fd mapped to a buffer to it. + auto buffer_allocator = std::make_unique<BufferAllocator>(); + if (!buffer_allocator) { + ALOGE("[Filter] Unable to create BufferAllocator object"); + return -1; + } + int av_fd = -1; + av_fd = buffer_allocator->Alloc("system-uncached", size); + if (av_fd < 0) { + ALOGE("[Filter] Failed to create av fd %d", errno); + return -1; + } + return av_fd; +} + +uint8_t* Filter::getIonBuffer(int fd, int size) { + uint8_t* avBuf = static_cast<uint8_t*>( + mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 /*offset*/)); + if (avBuf == MAP_FAILED) { + ALOGE("[Filter] fail to allocate buffer %d", errno); + return NULL; + } + return avBuf; +} + +native_handle_t* Filter::createNativeHandle(int fd) { + native_handle_t* nativeHandle; + if (fd < 0) { + nativeHandle = native_handle_create(/*numFd*/ 0, 0); + } else { + // Create a native handle to pass the av fd via the callback event. + nativeHandle = native_handle_create(/*numFd*/ 1, 0); + } + if (nativeHandle == NULL) { + ALOGE("[Filter] Failed to create native_handle %d", errno); + return NULL; + } + if (nativeHandle->numFds > 0) { + nativeHandle->data[0] = dup(fd); + } + return nativeHandle; +} + +::ndk::ScopedAStatus Filter::createIndependentMediaEvents(vector<int8_t>& output) { + int av_fd = createAvIonFd(output.size()); + if (av_fd == -1) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNKNOWN_ERROR)); + } + // copy the filtered data to the buffer + uint8_t* avBuffer = getIonBuffer(av_fd, output.size()); + if (avBuffer == NULL) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNKNOWN_ERROR)); + } + memcpy(avBuffer, output.data(), output.size() * sizeof(uint8_t)); + + native_handle_t* nativeHandle = createNativeHandle(av_fd); + if (nativeHandle == NULL) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNKNOWN_ERROR)); + } + + // Create a dataId and add a <dataId, av_fd> pair into the dataId2Avfd map + uint64_t dataId = mLastUsedDataId++ /*createdUID*/; + mDataId2Avfd[dataId] = dup(av_fd); + + // Create mediaEvent and send callback + int size = mFilterEvents.size(); + mFilterEvents.resize(size + 1); + + mFilterEvents[size] = DemuxFilterEvent::make<DemuxFilterEvent::Tag::media>(); + mFilterEvents[size].get<DemuxFilterEvent::Tag::media>().avMemory = + ::android::dupToAidl(nativeHandle); + mFilterEvents[size].get<DemuxFilterEvent::Tag::media>().dataLength = + static_cast<int32_t>(output.size()); + mFilterEvents[size].get<DemuxFilterEvent::Tag::media>().avDataId = static_cast<int64_t>(dataId); + if (mPts) { + mFilterEvents[size].get<DemuxFilterEvent::Tag::media>().pts = mPts; + mPts = 0; + } + + // Clear and log + native_handle_close(nativeHandle); + native_handle_delete(nativeHandle); + output.clear(); + mAvBufferCopyCount = 0; + if (DEBUG_FILTER) { + ALOGD("[Filter] av data length %d", static_cast<int32_t>(output.size())); + } + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Filter::createShareMemMediaEvents(vector<int8_t>& output) { + // copy the filtered data to the shared buffer + uint8_t* sharedAvBuffer = + getIonBuffer(mSharedAvMemHandle->data[0], output.size() + mSharedAvMemOffset); + if (sharedAvBuffer == NULL) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNKNOWN_ERROR)); + } + memcpy(sharedAvBuffer + mSharedAvMemOffset, output.data(), output.size() * sizeof(uint8_t)); + + // Create a memory handle with numFds == 0 + native_handle_t* nativeHandle = createNativeHandle(-1); + if (nativeHandle == NULL) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::UNKNOWN_ERROR)); + } + + // Create mediaEvent and send callback + int size = mFilterEvents.size(); + mFilterEvents.resize(size + 1); + mFilterEvents[size] = DemuxFilterEvent::make<DemuxFilterEvent::Tag::media>(); + mFilterEvents[size].get<DemuxFilterEvent::Tag::media>().avMemory = + ::android::dupToAidl(nativeHandle); + mFilterEvents[size].get<DemuxFilterEvent::Tag::media>().offset = + static_cast<int32_t>(mSharedAvMemOffset); + mFilterEvents[size].get<DemuxFilterEvent::Tag::media>().dataLength = + static_cast<int32_t>(output.size()); + if (mPts) { + mFilterEvents[size].get<DemuxFilterEvent::Tag::media>().pts = mPts; + mPts = 0; + } + mSharedAvMemOffset += output.size(); + + // Clear and log + native_handle_close(nativeHandle); + native_handle_delete(nativeHandle); + output.clear(); + if (DEBUG_FILTER) { + ALOGD("[Filter] shared av data length %d", static_cast<int32_t>(output.size())); + } + return ::ndk::ScopedAStatus::ok(); +} + +bool Filter::sameFile(int fd1, int fd2) { + struct stat stat1, stat2; + if (fstat(fd1, &stat1) < 0 || fstat(fd2, &stat2) < 0) { + return false; + } + return (stat1.st_dev == stat2.st_dev) && (stat1.st_ino == stat2.st_ino); +} + +void Filter::createMediaEvent(vector<DemuxFilterEvent>& events) { + AudioExtraMetaData audio; + events.resize(1); + + audio.adFade = 1; + audio.adPan = 2; + audio.versionTextTag = 3; + audio.adGainCenter = 4; + audio.adGainFront = 5; + audio.adGainSurround = 6; + + events[0] = DemuxFilterEvent::make<DemuxFilterEvent::Tag::media>(); + events[0].get<DemuxFilterEvent::Tag::media>().streamId = 1; + events[0].get<DemuxFilterEvent::Tag::media>().isPtsPresent = true; + events[0].get<DemuxFilterEvent::Tag::media>().dataLength = 3; + events[0].get<DemuxFilterEvent::Tag::media>().offset = 4; + events[0].get<DemuxFilterEvent::Tag::media>().isSecureMemory = true; + events[0].get<DemuxFilterEvent::Tag::media>().mpuSequenceNumber = 6; + events[0].get<DemuxFilterEvent::Tag::media>().isPesPrivateData = true; + events[0] + .get<DemuxFilterEvent::Tag::media>() + .extraMetaData.set<DemuxFilterMediaEventExtraMetaData::Tag::audio>(audio); + + int av_fd = createAvIonFd(BUFFER_SIZE_16M); + if (av_fd == -1) { + return; + } + + native_handle_t* nativeHandle = createNativeHandle(av_fd); + if (nativeHandle == nullptr) { + ::close(av_fd); + ALOGE("[Filter] Failed to create native_handle %d", errno); + return; + } + + // Create a dataId and add a <dataId, av_fd> pair into the dataId2Avfd map + uint64_t dataId = mLastUsedDataId++ /*createdUID*/; + mDataId2Avfd[dataId] = dup(av_fd); + + events[0].get<DemuxFilterEvent::Tag::media>().avDataId = static_cast<int64_t>(dataId); + events[0].get<DemuxFilterEvent::Tag::media>().avMemory = ::android::dupToAidl(nativeHandle); + + native_handle_close(nativeHandle); + native_handle_delete(nativeHandle); +} + +void Filter::createTsRecordEvent(vector<DemuxFilterEvent>& events) { + events.resize(2); + + DemuxPid pid; + DemuxFilterScIndexMask mask; + DemuxFilterTsRecordEvent tsRecord1; + pid.set<DemuxPid::Tag::tPid>(1); + mask.set<DemuxFilterScIndexMask::Tag::scIndex>(1); + tsRecord1.pid = pid; + tsRecord1.tsIndexMask = 1; + tsRecord1.scIndexMask = mask; + tsRecord1.byteNumber = 2; + + DemuxFilterTsRecordEvent tsRecord2; + tsRecord2.pts = 1; + tsRecord2.firstMbInSlice = 2; // random address + + events[0].set<DemuxFilterEvent::Tag::tsRecord>(tsRecord1); + events[1].set<DemuxFilterEvent::Tag::tsRecord>(tsRecord2); +} + +void Filter::createMmtpRecordEvent(vector<DemuxFilterEvent>& events) { + events.resize(2); + + DemuxFilterMmtpRecordEvent mmtpRecord1; + mmtpRecord1.scHevcIndexMask = 1; + mmtpRecord1.byteNumber = 2; + + DemuxFilterMmtpRecordEvent mmtpRecord2; + mmtpRecord2.pts = 1; + mmtpRecord2.mpuSequenceNumber = 2; + mmtpRecord2.firstMbInSlice = 3; + mmtpRecord2.tsIndexMask = 4; + + events[0].set<DemuxFilterEvent::Tag::mmtpRecord>(mmtpRecord1); + events[1].set<DemuxFilterEvent::Tag::mmtpRecord>(mmtpRecord2); +} + +void Filter::createSectionEvent(vector<DemuxFilterEvent>& events) { + events.resize(1); + + DemuxFilterSectionEvent section; + section.tableId = 1; + section.version = 2; + section.sectionNum = 3; + section.dataLength = 0; + + events[0].set<DemuxFilterEvent::Tag::section>(section); +} + +void Filter::createPesEvent(vector<DemuxFilterEvent>& events) { + events.resize(1); + + DemuxFilterPesEvent pes; + pes.streamId = 1; + pes.dataLength = 1; + pes.mpuSequenceNumber = 2; + + events[0].set<DemuxFilterEvent::Tag::pes>(pes); +} + +void Filter::createDownloadEvent(vector<DemuxFilterEvent>& events) { + events.resize(1); + + DemuxFilterDownloadEvent download; + download.itemId = 1; + download.mpuSequenceNumber = 2; + download.itemFragmentIndex = 3; + download.lastItemFragmentIndex = 4; + download.dataLength = 0; + + events[0].set<DemuxFilterEvent::Tag::download>(download); +} + +void Filter::createIpPayloadEvent(vector<DemuxFilterEvent>& events) { + events.resize(1); + + DemuxFilterIpPayloadEvent ipPayload; + ipPayload.dataLength = 0; + + events[0].set<DemuxFilterEvent::Tag::ipPayload>(ipPayload); +} + +void Filter::createTemiEvent(vector<DemuxFilterEvent>& events) { + events.resize(1); + + DemuxFilterTemiEvent temi; + temi.pts = 1; + temi.descrTag = 2; + temi.descrData = {3}; + + events[0].set<DemuxFilterEvent::Tag::temi>(temi); +} + +void Filter::createMonitorEvent(vector<DemuxFilterEvent>& events) { + events.resize(1); + + DemuxFilterMonitorEvent monitor; + monitor.set<DemuxFilterMonitorEvent::Tag::scramblingStatus>(ScramblingStatus::SCRAMBLED); + events[0].set<DemuxFilterEvent::Tag::monitorEvent>(monitor); +} + +void Filter::createRestartEvent(vector<DemuxFilterEvent>& events) { + events.resize(1); + + events[0].set<DemuxFilterEvent::Tag::startId>(1); +} + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/Filter.h b/tv/tuner/aidl/default/Filter.h new file mode 100644 index 0000000000..30eb24bda8 --- /dev/null +++ b/tv/tuner/aidl/default/Filter.h @@ -0,0 +1,242 @@ +/* + * Copyright 2021 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/tv/tuner/BnFilter.h> +#include <aidl/android/hardware/tv/tuner/Constant.h> + +#include <fmq/AidlMessageQueue.h> +#include <inttypes.h> +#include <ion/ion.h> +#include <math.h> +#include <sys/stat.h> +#include <set> +#include "Demux.h" +#include "Dvr.h" +#include "Frontend.h" + +using namespace std; + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +using ::aidl::android::hardware::common::NativeHandle; +using ::aidl::android::hardware::common::fmq::MQDescriptor; +using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite; +using ::android::AidlMessageQueue; +using ::android::hardware::EventFlag; + +using FilterMQ = AidlMessageQueue<int8_t, SynchronizedReadWrite>; +const uint32_t BUFFER_SIZE_16M = 0x1000000; + +class Demux; +class Dvr; + +class Filter : public BnFilter { + public: + Filter(); + + Filter(DemuxFilterType type, int64_t filterId, uint32_t bufferSize, + const std::shared_ptr<IFilterCallback>& cb, std::shared_ptr<Demux> demux); + + ~Filter(); + + ::ndk::ScopedAStatus getQueueDesc( + MQDescriptor<int8_t, SynchronizedReadWrite>* out_queue) override; + ::ndk::ScopedAStatus close() override; + ::ndk::ScopedAStatus configure(const DemuxFilterSettings& in_settings) override; + ::ndk::ScopedAStatus configureAvStreamType(const AvStreamType& in_avStreamType) override; + ::ndk::ScopedAStatus configureIpCid(int32_t in_ipCid) override; + ::ndk::ScopedAStatus configureMonitorEvent(int32_t in_monitorEventTypes) override; + ::ndk::ScopedAStatus start() override; + ::ndk::ScopedAStatus stop() override; + ::ndk::ScopedAStatus flush() override; + ::ndk::ScopedAStatus getAvSharedHandle(NativeHandle* out_avMemory, + int64_t* _aidl_return) override; + ::ndk::ScopedAStatus getId(int32_t* _aidl_return) override; + ::ndk::ScopedAStatus getId64Bit(int64_t* _aidl_return) override; + ::ndk::ScopedAStatus releaseAvHandle(const NativeHandle& in_avMemory, + int64_t in_avDataId) override; + ::ndk::ScopedAStatus setDataSource(const std::shared_ptr<IFilter>& in_filter) override; + + /** + * To create a FilterMQ and its Event Flag. + * + * Return false is any of the above processes fails. + */ + bool createFilterMQ(); + uint16_t getTpid(); + void updateFilterOutput(vector<int8_t>& data); + void updateRecordOutput(vector<int8_t>& data); + void updatePts(uint64_t pts); + ::ndk::ScopedAStatus startFilterHandler(); + ::ndk::ScopedAStatus startRecordFilterHandler(); + void attachFilterToRecord(const std::shared_ptr<Dvr> dvr); + void detachFilterFromRecord(); + void freeSharedAvHandle(); + bool isMediaFilter() { return mIsMediaFilter; }; + bool isPcrFilter() { return mIsPcrFilter; }; + bool isRecordFilter() { return mIsRecordFilter; }; + + private: + // Demux service + std::shared_ptr<Demux> mDemux; + // Dvr reference once the filter is attached to any + std::shared_ptr<Dvr> mDvr = nullptr; + /** + * Filter callbacks used on filter events or FMQ status + */ + std::shared_ptr<IFilterCallback> mCallback = nullptr; + + int64_t mFilterId; + int32_t mCid = static_cast<int32_t>(Constant::INVALID_IP_FILTER_CONTEXT_ID); + uint32_t mBufferSize; + DemuxFilterType mType; + bool mIsMediaFilter = false; + bool mIsPcrFilter = false; + bool mIsRecordFilter = false; + DemuxFilterSettings mFilterSettings; + + uint16_t mTpid; + std::shared_ptr<IFilter> mDataSource; + bool mIsDataSourceDemux = true; + vector<int8_t> mFilterOutput; + vector<int8_t> mRecordFilterOutput; + int64_t mPts = 0; + unique_ptr<FilterMQ> mFilterMQ; + bool mIsUsingFMQ = false; + EventFlag* mFilterEventsFlag; + vector<DemuxFilterEvent> mFilterEvents; + + // Thread handlers + pthread_t mFilterThread; + + // FMQ status local records + DemuxFilterStatus mFilterStatus; + /** + * If a specific filter's writing loop is still running + */ + bool mFilterThreadRunning; + bool mKeepFetchingDataFromFrontend; + + /** + * How many times a filter should write + * TODO make this dynamic/random/can take as a parameter + */ + const uint16_t SECTION_WRITE_COUNT = 10; + + bool DEBUG_FILTER = false; + + /** + * Filter handlers to handle the data filtering. + * They are also responsible to write the filtered output into the filter FMQ + * and update the filterEvent bound with the same filterId. + */ + ::ndk::ScopedAStatus startSectionFilterHandler(); + ::ndk::ScopedAStatus startPesFilterHandler(); + ::ndk::ScopedAStatus startTsFilterHandler(); + ::ndk::ScopedAStatus startMediaFilterHandler(); + ::ndk::ScopedAStatus startPcrFilterHandler(); + ::ndk::ScopedAStatus startTemiFilterHandler(); + ::ndk::ScopedAStatus startFilterLoop(); + + void deleteEventFlag(); + bool writeDataToFilterMQ(const std::vector<int8_t>& data); + bool readDataFromMQ(); + bool writeSectionsAndCreateEvent(vector<int8_t>& data); + void maySendFilterStatusCallback(); + DemuxFilterStatus checkFilterStatusChange(uint32_t availableToWrite, uint32_t availableToRead, + uint32_t highThreshold, uint32_t lowThreshold); + /** + * A dispatcher to read and dispatch input data to all the started filters. + * Each filter handler handles the data filtering/output writing/filterEvent updating. + */ + bool startFilterDispatcher(); + static void* __threadLoopFilter(void* user); + void filterThreadLoop(); + + int createAvIonFd(int size); + uint8_t* getIonBuffer(int fd, int size); + native_handle_t* createNativeHandle(int fd); + ::ndk::ScopedAStatus createMediaFilterEventWithIon(vector<int8_t>& output); + ::ndk::ScopedAStatus createIndependentMediaEvents(vector<int8_t>& output); + ::ndk::ScopedAStatus createShareMemMediaEvents(vector<int8_t>& output); + bool sameFile(int fd1, int fd2); + + void createMediaEvent(vector<DemuxFilterEvent>&); + void createTsRecordEvent(vector<DemuxFilterEvent>&); + void createMmtpRecordEvent(vector<DemuxFilterEvent>&); + void createSectionEvent(vector<DemuxFilterEvent>&); + void createPesEvent(vector<DemuxFilterEvent>&); + void createDownloadEvent(vector<DemuxFilterEvent>&); + void createIpPayloadEvent(vector<DemuxFilterEvent>&); + void createTemiEvent(vector<DemuxFilterEvent>&); + void createMonitorEvent(vector<DemuxFilterEvent>&); + void createRestartEvent(vector<DemuxFilterEvent>&); + + /** + * Lock to protect writes to the FMQs + */ + std::mutex mWriteLock; + /** + * Lock to protect writes to the filter event + */ + // TODO make each filter separate event lock + std::mutex mFilterEventsLock; + /** + * Lock to protect writes to the input status + */ + std::mutex mFilterStatusLock; + std::mutex mFilterThreadLock; + std::mutex mFilterOutputLock; + std::mutex mRecordFilterOutputLock; + + // temp handle single PES filter + // TODO handle mulptiple Pes filters + int mPesSizeLeft = 0; + vector<int8_t> mPesOutput; + + // A map from data id to ion handle + std::map<uint64_t, int> mDataId2Avfd; + uint64_t mLastUsedDataId = 1; + int mAvBufferCopyCount = 0; + + // Shared A/V memory handle + native_handle_t* mSharedAvMemHandle = nullptr; + bool mUsingSharedAvMem = false; + uint32_t mSharedAvMemOffset = 0; + + uint32_t mAudioStreamType; + uint32_t mVideoStreamType; + + // Scrambling status to be monitored + uint32_t mStatuses = 0; + + bool mConfigured = false; + int mStartId = 0; + uint8_t mScramblingStatusMonitored = 0; + uint8_t mIpCidMonitored = 0; +}; + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/Frontend.cpp b/tv/tuner/aidl/default/Frontend.cpp new file mode 100644 index 0000000000..438f897446 --- /dev/null +++ b/tv/tuner/aidl/default/Frontend.cpp @@ -0,0 +1,726 @@ +/* + * Copyright 2021 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. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "android.hardware.tv.tuner-service.example-Frontend" + +#include <aidl/android/hardware/tv/tuner/Result.h> +#include <utils/Log.h> + +#include "Frontend.h" + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +Frontend::Frontend(FrontendType type, int32_t id, std::shared_ptr<Tuner> tuner) { + mType = type; + mId = id; + mTuner = tuner; + // Init callback to nullptr + mCallback = nullptr; +} + +Frontend::~Frontend() {} + +::ndk::ScopedAStatus Frontend::close() { + ALOGV("%s", __FUNCTION__); + // Reset callback + mCallback = nullptr; + mIsLocked = false; + mTuner->removeFrontend(mId); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Frontend::setCallback(const std::shared_ptr<IFrontendCallback>& in_callback) { + ALOGV("%s", __FUNCTION__); + if (in_callback == nullptr) { + ALOGW("[ WARN ] Set Frontend callback with nullptr"); + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + + mCallback = in_callback; + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Frontend::tune(const FrontendSettings& /* in_settings */) { + ALOGV("%s", __FUNCTION__); + if (mCallback == nullptr) { + ALOGW("[ WARN ] Frontend callback is not set when tune"); + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_STATE)); + } + + mTuner->frontendStartTune(mId); + mCallback->onEvent(FrontendEventType::LOCKED); + mIsLocked = true; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Frontend::stopTune() { + ALOGV("%s", __FUNCTION__); + + mTuner->frontendStopTune(mId); + mIsLocked = false; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Frontend::scan(const FrontendSettings& in_settings, FrontendScanType in_type) { + ALOGV("%s", __FUNCTION__); + + if (mIsLocked) { + FrontendScanMessage msg; + msg.set<FrontendScanMessage::Tag::isEnd>(true); + mCallback->onScanMessage(FrontendScanMessageType::END, msg); + return ::ndk::ScopedAStatus::ok(); + } + + int32_t frequency = 0; + switch (in_settings.getTag()) { + case FrontendSettings::Tag::analog: + frequency = in_settings.get<FrontendSettings::Tag::analog>().frequency; + break; + case FrontendSettings::Tag::atsc: + frequency = in_settings.get<FrontendSettings::Tag::atsc>().frequency; + break; + case FrontendSettings::Tag::atsc3: + frequency = in_settings.get<FrontendSettings::Tag::atsc3>().frequency; + break; + case FrontendSettings::Tag::dvbs: + frequency = in_settings.get<FrontendSettings::Tag::dvbs>().frequency; + break; + case FrontendSettings::Tag::dvbc: + frequency = in_settings.get<FrontendSettings::Tag::dvbc>().frequency; + break; + case FrontendSettings::Tag::dvbt: + frequency = in_settings.get<FrontendSettings::Tag::dvbt>().frequency; + break; + case FrontendSettings::Tag::isdbs: + frequency = in_settings.get<FrontendSettings::Tag::isdbs>().frequency; + break; + case FrontendSettings::Tag::isdbs3: + frequency = in_settings.get<FrontendSettings::Tag::isdbs3>().frequency; + break; + case FrontendSettings::Tag::isdbt: + frequency = in_settings.get<FrontendSettings::Tag::isdbt>().frequency; + break; + default: + break; + } + + if (in_type == FrontendScanType::SCAN_BLIND) { + frequency += 100; + } + + { + FrontendScanMessage msg; + vector<int32_t> frequencies = {frequency}; + msg.set<FrontendScanMessage::Tag::frequencies>(frequencies); + mCallback->onScanMessage(FrontendScanMessageType::FREQUENCY, msg); + } + + { + FrontendScanMessage msg; + msg.set<FrontendScanMessage::Tag::progressPercent>(20); + mCallback->onScanMessage(FrontendScanMessageType::PROGRESS_PERCENT, msg); + } + + { + FrontendScanMessage msg; + vector<int32_t> symbolRates = {30}; + msg.set<FrontendScanMessage::Tag::symbolRates>(symbolRates); + mCallback->onScanMessage(FrontendScanMessageType::SYMBOL_RATE, msg); + } + + if (mType == FrontendType::DVBT) { + FrontendScanMessage msg; + msg.set<FrontendScanMessage::Tag::hierarchy>(FrontendDvbtHierarchy::HIERARCHY_NON_NATIVE); + mCallback->onScanMessage(FrontendScanMessageType::HIERARCHY, msg); + } + + if (mType == FrontendType::ANALOG) { + FrontendScanMessage msg; + msg.set<FrontendScanMessage::Tag::analogType>(FrontendAnalogType::PAL); + mCallback->onScanMessage(FrontendScanMessageType::ANALOG_TYPE, msg); + } + + { + FrontendScanMessage msg; + vector<uint8_t> plpIds = {2}; + msg.set<FrontendScanMessage::Tag::plpIds>(plpIds); + mCallback->onScanMessage(FrontendScanMessageType::PLP_IDS, msg); + } + + { + FrontendScanMessage msg; + vector<uint8_t> groupIds = {3}; + msg.set<FrontendScanMessage::Tag::groupIds>(groupIds); + mCallback->onScanMessage(FrontendScanMessageType::GROUP_IDS, msg); + } + + { + FrontendScanMessage msg; + vector<char16_t> inputStreamIds = {1}; + msg.set<FrontendScanMessage::Tag::inputStreamIds>(inputStreamIds); + mCallback->onScanMessage(FrontendScanMessageType::INPUT_STREAM_IDS, msg); + } + + switch (mType) { + case FrontendType::DVBT: { + FrontendScanMessage msg; + FrontendScanMessageStandard std; + std.set<FrontendScanMessageStandard::Tag::tStd>(FrontendDvbtStandard::AUTO); + msg.set<FrontendScanMessage::Tag::std>(std); + mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg); + break; + } + case FrontendType::DVBS: { + FrontendScanMessage msg; + FrontendScanMessageStandard std; + std.set<FrontendScanMessageStandard::Tag::sStd>(FrontendDvbsStandard::AUTO); + msg.set<FrontendScanMessage::Tag::std>(std); + mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg); + break; + } + case FrontendType::ANALOG: { + FrontendScanMessage msg; + FrontendScanMessageStandard std; + std.set<FrontendScanMessageStandard::Tag::sifStd>(FrontendAnalogSifStandard::AUTO); + msg.set<FrontendScanMessage::Tag::std>(std); + mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg); + break; + } + default: + break; + } + + { + FrontendScanMessage msg; + FrontendScanAtsc3PlpInfo info; + info.plpId = 1; + info.bLlsFlag = false; + vector<FrontendScanAtsc3PlpInfo> atsc3PlpInfos = {info}; + msg.set<FrontendScanMessage::Tag::atsc3PlpInfos>(atsc3PlpInfos); + mCallback->onScanMessage(FrontendScanMessageType::ATSC3_PLP_INFO, msg); + } + + { + FrontendScanMessage msg; + FrontendModulation modulation; + modulation.set<FrontendModulation::Tag::dvbc>(FrontendDvbcModulation::MOD_16QAM); + msg.set<FrontendScanMessage::Tag::modulation>(modulation); + mCallback->onScanMessage(FrontendScanMessageType::MODULATION, msg); + } + + { + FrontendScanMessage msg; + msg.set<FrontendScanMessage::Tag::isHighPriority>(true); + mCallback->onScanMessage(FrontendScanMessageType::HIGH_PRIORITY, msg); + } + + { + FrontendScanMessage msg; + msg.set<FrontendScanMessage::Tag::isLocked>(true); + mCallback->onScanMessage(FrontendScanMessageType::LOCKED, msg); + mIsLocked = true; + } + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Frontend::stopScan() { + ALOGV("%s", __FUNCTION__); + + mIsLocked = false; + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Frontend::getStatus(const std::vector<FrontendStatusType>& in_statusTypes, + std::vector<FrontendStatus>* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + for (int i = 0; i < in_statusTypes.size(); i++) { + FrontendStatusType type = in_statusTypes[i]; + FrontendStatus status; + // assign randomly selected values for testing. + switch (type) { + case FrontendStatusType::DEMOD_LOCK: { + status.set<FrontendStatus::isDemodLocked>(true); + break; + } + case FrontendStatusType::SNR: { + status.set<FrontendStatus::snr>(221); + break; + } + case FrontendStatusType::BER: { + status.set<FrontendStatus::ber>(1); + break; + } + case FrontendStatusType::PER: { + status.set<FrontendStatus::per>(2); + break; + } + case FrontendStatusType::PRE_BER: { + status.set<FrontendStatus::preBer>(3); + break; + } + case FrontendStatusType::SIGNAL_QUALITY: { + status.set<FrontendStatus::signalQuality>(4); + break; + } + case FrontendStatusType::SIGNAL_STRENGTH: { + status.set<FrontendStatus::signalStrength>(5); + break; + } + case FrontendStatusType::SYMBOL_RATE: { + status.set<FrontendStatus::symbolRate>(6); + break; + } + case FrontendStatusType::FEC: { + status.set<FrontendStatus::innerFec>(FrontendInnerFec::FEC_2_9); // value = 1 << 7 + break; + } + case FrontendStatusType::MODULATION: { + switch (mType) { + case FrontendType::ISDBS: { + FrontendModulationStatus modulationStatus; + modulationStatus.set<FrontendModulationStatus::Tag::isdbs>( + FrontendIsdbsModulation::MOD_BPSK); // value = 1 << 1 + status.set<FrontendStatus::modulationStatus>(modulationStatus); + break; + } + case FrontendType::DVBC: { + FrontendModulationStatus modulationStatus; + modulationStatus.set<FrontendModulationStatus::Tag::dvbc>( + FrontendDvbcModulation::MOD_16QAM); // value = 1 << 1 + status.set<FrontendStatus::modulationStatus>(modulationStatus); + break; + } + case FrontendType::DVBS: { + FrontendModulationStatus modulationStatus; + modulationStatus.set<FrontendModulationStatus::Tag::dvbs>( + FrontendDvbsModulation::MOD_QPSK); // value = 1 << 1 + status.set<FrontendStatus::modulationStatus>(modulationStatus); + break; + } + case FrontendType::ISDBS3: { + FrontendModulationStatus modulationStatus; + modulationStatus.set<FrontendModulationStatus::Tag::isdbs3>( + FrontendIsdbs3Modulation::MOD_BPSK); // value = 1 << 1 + status.set<FrontendStatus::modulationStatus>(modulationStatus); + break; + } + case FrontendType::ISDBT: { + FrontendModulationStatus modulationStatus; + modulationStatus.set<FrontendModulationStatus::Tag::isdbt>( + FrontendIsdbtModulation::MOD_DQPSK); // value = 1 << 1 + status.set<FrontendStatus::modulationStatus>(modulationStatus); + break; + } + default: + break; + } + break; + } + case FrontendStatusType::SPECTRAL: { + status.set<FrontendStatus::inversion>(FrontendSpectralInversion::NORMAL); + break; + } + case FrontendStatusType::LNB_VOLTAGE: { + status.set<FrontendStatus::lnbVoltage>(LnbVoltage::VOLTAGE_5V); + break; + } + case FrontendStatusType::PLP_ID: { + status.set<FrontendStatus::plpId>(101); // type uint8_t + break; + } + case FrontendStatusType::EWBS: { + status.set<FrontendStatus::isEWBS>(false); + break; + } + case FrontendStatusType::AGC: { + status.set<FrontendStatus::agc>(7); + break; + } + case FrontendStatusType::LNA: { + status.set<FrontendStatus::isLnaOn>(false); + break; + } + case FrontendStatusType::LAYER_ERROR: { + vector<bool> v = {false, true, true}; + status.set<FrontendStatus::isLayerError>(v); + break; + } + case FrontendStatusType::MER: { + status.set<FrontendStatus::mer>(8); + break; + } + case FrontendStatusType::FREQ_OFFSET: { + status.set<FrontendStatus::freqOffset>(9); + break; + } + case FrontendStatusType::HIERARCHY: { + status.set<FrontendStatus::hierarchy>(FrontendDvbtHierarchy::HIERARCHY_1_NATIVE); + break; + } + case FrontendStatusType::RF_LOCK: { + status.set<FrontendStatus::isRfLocked>(false); + break; + } + case FrontendStatusType::ATSC3_PLP_INFO: { + FrontendStatusAtsc3PlpInfo info1; + info1.plpId = 3; + info1.isLocked = false; + info1.uec = 313; + FrontendStatusAtsc3PlpInfo info2; + info2.plpId = 5; + info2.isLocked = true; + info2.uec = 515; + vector<FrontendStatusAtsc3PlpInfo> infos = {info1, info2}; + status.set<FrontendStatus::plpInfo>(infos); + break; + } + case FrontendStatusType::MODULATIONS: { + FrontendModulation modulation; + vector<FrontendModulation> modulations; + switch (mType) { + case FrontendType::ISDBS: { + modulation.set<FrontendModulation::Tag::isdbs>( + FrontendIsdbsModulation::MOD_BPSK); // value = 1 << 1 + modulations.push_back(modulation); + status.set<FrontendStatus::modulations>(modulations); + break; + } + case FrontendType::DVBC: { + modulation.set<FrontendModulation::Tag::dvbc>( + FrontendDvbcModulation::MOD_16QAM); // value = 1 << 1 + modulations.push_back(modulation); + status.set<FrontendStatus::modulations>(modulations); + break; + } + case FrontendType::DVBS: { + modulation.set<FrontendModulation::Tag::dvbs>( + FrontendDvbsModulation::MOD_QPSK); // value = 1 << 1 + modulations.push_back(modulation); + status.set<FrontendStatus::modulations>(modulations); + break; + } + case FrontendType::DVBT: { + modulation.set<FrontendModulation::Tag::dvbt>( + FrontendDvbtConstellation::CONSTELLATION_16QAM_R); // value = 1 << + // 16 + modulations.push_back(modulation); + status.set<FrontendStatus::modulations>(modulations); + break; + } + case FrontendType::ISDBS3: { + modulation.set<FrontendModulation::Tag::isdbs3>( + FrontendIsdbs3Modulation::MOD_BPSK); // value = 1 << 1 + modulations.push_back(modulation); + status.set<FrontendStatus::modulations>(modulations); + break; + } + case FrontendType::ISDBT: { + modulation.set<FrontendModulation::Tag::isdbt>( + FrontendIsdbtModulation::MOD_DQPSK); // value = 1 << 1 + modulations.push_back(modulation); + status.set<FrontendStatus::modulations>(modulations); + break; + } + case FrontendType::ATSC: { + modulation.set<FrontendModulation::Tag::atsc>( + FrontendAtscModulation::MOD_8VSB); // value = 1 << 2 + modulations.push_back(modulation); + status.set<FrontendStatus::modulations>(modulations); + break; + } + case FrontendType::ATSC3: { + modulation.set<FrontendModulation::Tag::atsc3>( + FrontendAtsc3Modulation::MOD_QPSK); // value = 1 << 1 + modulations.push_back(modulation); + status.set<FrontendStatus::modulations>(modulations); + break; + } + case FrontendType::DTMB: { + modulation.set<FrontendModulation::Tag::dtmb>( + FrontendDtmbModulation::CONSTELLATION_4QAM); // value = 1 << 1 + modulations.push_back(modulation); + status.set<FrontendStatus::modulations>(modulations); + break; + } + default: + break; + } + break; + } + case FrontendStatusType::BERS: { + vector<int32_t> bers = {1}; + status.set<FrontendStatus::bers>(bers); + break; + } + case FrontendStatusType::CODERATES: { + vector<FrontendInnerFec> rates; + rates.push_back(FrontendInnerFec::FEC_6_15); // value = 1 << 39 + status.set<FrontendStatus::codeRates>(rates); + break; + } + case FrontendStatusType::BANDWIDTH: { + FrontendBandwidth bandwidth; + switch (mType) { + case FrontendType::DVBC: { + bandwidth.set<FrontendBandwidth::Tag::dvbc>( + FrontendDvbcBandwidth::BANDWIDTH_6MHZ); // value = 1 << 1 + status.set<FrontendStatus::bandwidth>(bandwidth); + break; + } + case FrontendType::DVBT: { + bandwidth.set<FrontendBandwidth::Tag::dvbt>( + FrontendDvbtBandwidth::BANDWIDTH_8MHZ); // value = 1 << 1 + status.set<FrontendStatus::bandwidth>(bandwidth); + break; + } + case FrontendType::ISDBT: { + bandwidth.set<FrontendBandwidth::Tag::isdbt>( + FrontendIsdbtBandwidth::BANDWIDTH_8MHZ); // value = 1 << 1 + status.set<FrontendStatus::bandwidth>(bandwidth); + break; + } + case FrontendType::ATSC3: { + bandwidth.set<FrontendBandwidth::Tag::atsc3>( + FrontendAtsc3Bandwidth::BANDWIDTH_6MHZ); // value = 1 << 1 + status.set<FrontendStatus::bandwidth>(bandwidth); + break; + } + case FrontendType::DTMB: { + bandwidth.set<FrontendBandwidth::Tag::dtmb>( + FrontendDtmbBandwidth::BANDWIDTH_8MHZ); // value = 1 << 1 + status.set<FrontendStatus::bandwidth>(bandwidth); + break; + } + default: + break; + } + break; + } + case FrontendStatusType::GUARD_INTERVAL: { + FrontendGuardInterval interval; + switch (mType) { + case FrontendType::DVBT: { + interval.set<FrontendGuardInterval::Tag::dvbt>( + FrontendDvbtGuardInterval::INTERVAL_1_32); // value = 1 << 1 + status.set<FrontendStatus::interval>(interval); + break; + } + case FrontendType::ISDBT: { + interval.set<FrontendGuardInterval::Tag::isdbt>( + FrontendIsdbtGuardInterval::INTERVAL_1_32); // value = 1 << 1 + status.set<FrontendStatus::interval>(interval); + break; + } + case FrontendType::DTMB: { + interval.set<FrontendGuardInterval::Tag::dtmb>( + FrontendDtmbGuardInterval::PN_420_VARIOUS); // value = 1 << 1 + status.set<FrontendStatus::interval>(interval); + break; + } + default: + break; + } + break; + } + case FrontendStatusType::TRANSMISSION_MODE: { + FrontendTransmissionMode transMode; + switch (mType) { + case FrontendType::DVBT: { + transMode.set<FrontendTransmissionMode::Tag::dvbt>( + FrontendDvbtTransmissionMode::MODE_16K_E); // value = 1 << 8 + status.set<FrontendStatus::transmissionMode>(transMode); + break; + } + case FrontendType::ISDBT: { + transMode.set<FrontendTransmissionMode::Tag::isdbt>( + FrontendIsdbtMode::MODE_1); // value = 1 << 1 + status.set<FrontendStatus::transmissionMode>(transMode); + break; + } + case FrontendType::DTMB: { + transMode.set<FrontendTransmissionMode::Tag::dtmb>( + FrontendDtmbTransmissionMode::C1); // value = 1 << 1 + status.set<FrontendStatus::transmissionMode>(transMode); + break; + } + default: + break; + } + break; + } + case FrontendStatusType::UEC: { + status.set<FrontendStatus::uec>(4); + break; + } + case FrontendStatusType::T2_SYSTEM_ID: { + status.set<FrontendStatus::systemId>(5); + break; + } + case FrontendStatusType::INTERLEAVINGS: { + FrontendInterleaveMode interleave; + vector<FrontendInterleaveMode> interleaves; + switch (mType) { + case FrontendType::DVBC: { + // value = 1 << 1 + interleave.set<FrontendInterleaveMode::Tag::dvbc>( + FrontendCableTimeInterleaveMode::INTERLEAVING_128_1_0); + interleaves.push_back(interleave); + status.set<FrontendStatus::interleaving>(interleaves); + break; + } + case FrontendType::ATSC3: { + interleave.set<FrontendInterleaveMode::Tag::atsc3>( + FrontendAtsc3TimeInterleaveMode::CTI); // value = 1 << 1 + interleaves.push_back(interleave); + status.set<FrontendStatus::interleaving>(interleaves); + break; + } + case FrontendType::DTMB: { + interleave.set<FrontendInterleaveMode::Tag::dtmb>( + FrontendDtmbTimeInterleaveMode::TIMER_INT_240); // value = 1 << 1 + interleaves.push_back(interleave); + status.set<FrontendStatus::interleaving>(interleaves); + break; + } + default: + break; + } + break; + } + case FrontendStatusType::ISDBT_SEGMENTS: { + vector<uint8_t> segments = {2, 3}; + status.set<FrontendStatus::isdbtSegment>(segments); + break; + } + case FrontendStatusType::TS_DATA_RATES: { + vector<int32_t> dataRates = {4, 5}; + status.set<FrontendStatus::tsDataRate>(dataRates); + break; + } + case FrontendStatusType::ROLL_OFF: { + FrontendRollOff rollOff; + switch (mType) { + case FrontendType::DVBS: { + rollOff.set<FrontendRollOff::Tag::dvbs>( + FrontendDvbsRolloff::ROLLOFF_0_35); // value = 1 + status.set<FrontendStatus::rollOff>(rollOff); + break; + } + case FrontendType::ISDBS: { + rollOff.set<FrontendRollOff::Tag::isdbs>( + FrontendIsdbsRolloff::ROLLOFF_0_35); // value = 1 + status.set<FrontendStatus::rollOff>(rollOff); + break; + } + case FrontendType::ISDBS3: { + rollOff.set<FrontendRollOff::Tag::isdbs3>( + FrontendIsdbs3Rolloff::ROLLOFF_0_03); // value = 1 + status.set<FrontendStatus::rollOff>(rollOff); + break; + } + default: + break; + } + break; + } + case FrontendStatusType::IS_MISO: { + status.set<FrontendStatus::isMiso>(true); + break; + } + case FrontendStatusType::IS_LINEAR: { + status.set<FrontendStatus::isLinear>(true); + break; + } + case FrontendStatusType::IS_SHORT_FRAMES: { + status.set<FrontendStatus::isShortFrames>(true); + break; + } + default: { + continue; + } + } + _aidl_return->push_back(status); + } + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Frontend::setLna(bool /* in_bEnable */) { + ALOGV("%s", __FUNCTION__); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Frontend::setLnb(int32_t /* in_lnbId */) { + ALOGV("%s", __FUNCTION__); + if (!supportsSatellite()) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_STATE)); + } + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Frontend::linkCiCam(int32_t in_ciCamId, int32_t* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + mCiCamId = in_ciCamId; + *_aidl_return = 0; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Frontend::unlinkCiCam(int32_t /* in_ciCamId */) { + ALOGV("%s", __FUNCTION__); + + mCiCamId = -1; + + return ::ndk::ScopedAStatus::ok(); +} + +FrontendType Frontend::getFrontendType() { + return mType; +} + +int32_t Frontend::getFrontendId() { + return mId; +} + +bool Frontend::supportsSatellite() { + return mType == FrontendType::DVBS || mType == FrontendType::ISDBS || + mType == FrontendType::ISDBS3; +} + +bool Frontend::isLocked() { + return mIsLocked; +} + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/Frontend.h b/tv/tuner/aidl/default/Frontend.h new file mode 100644 index 0000000000..3c602cff8f --- /dev/null +++ b/tv/tuner/aidl/default/Frontend.h @@ -0,0 +1,75 @@ +/* + * Copyright 2021 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/tv/tuner/BnFrontend.h> +#include <fstream> +#include <iostream> +#include "Tuner.h" + +using namespace std; + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +class Tuner; + +class Frontend : public BnFrontend { + public: + Frontend(FrontendType type, int32_t id, std::shared_ptr<Tuner> tuner); + + ::ndk::ScopedAStatus setCallback( + const std::shared_ptr<IFrontendCallback>& in_callback) override; + ::ndk::ScopedAStatus tune(const FrontendSettings& in_settings) override; + ::ndk::ScopedAStatus stopTune() override; + ::ndk::ScopedAStatus close() override; + ::ndk::ScopedAStatus scan(const FrontendSettings& in_settings, + FrontendScanType in_type) override; + ::ndk::ScopedAStatus stopScan() override; + ::ndk::ScopedAStatus getStatus(const std::vector<FrontendStatusType>& in_statusTypes, + std::vector<FrontendStatus>* _aidl_return) override; + ::ndk::ScopedAStatus setLnb(int32_t in_lnbId) override; + ::ndk::ScopedAStatus setLna(bool in_bEnable) override; + ::ndk::ScopedAStatus linkCiCam(int32_t in_ciCamId, int32_t* _aidl_return) override; + ::ndk::ScopedAStatus unlinkCiCam(int32_t in_ciCamId) override; + + FrontendType getFrontendType(); + int32_t getFrontendId(); + string getSourceFile(); + bool isLocked(); + + private: + virtual ~Frontend(); + bool supportsSatellite(); + std::shared_ptr<IFrontendCallback> mCallback; + std::shared_ptr<Tuner> mTuner; + FrontendType mType = FrontendType::UNDEFINED; + int32_t mId = 0; + bool mIsLocked = false; + int32_t mCiCamId; + + std::ifstream mFrontendData; +}; + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/Lnb.cpp b/tv/tuner/aidl/default/Lnb.cpp new file mode 100644 index 0000000000..35d2da6310 --- /dev/null +++ b/tv/tuner/aidl/default/Lnb.cpp @@ -0,0 +1,81 @@ +/* + * Copyright 2021 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. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "android.hardware.tv.tuner-service.example-Lnb" + +#include "Lnb.h" +#include <utils/Log.h> + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +Lnb::Lnb() {} + +Lnb::Lnb(int id) { + mId = id; +} + +Lnb::~Lnb() {} + +::ndk::ScopedAStatus Lnb::setCallback(const std::shared_ptr<ILnbCallback>& /* in_callback */) { + ALOGV("%s", __FUNCTION__); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Lnb::setVoltage(LnbVoltage /* in_voltage */) { + ALOGV("%s", __FUNCTION__); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Lnb::setTone(LnbTone /* in_tone */) { + ALOGV("%s", __FUNCTION__); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Lnb::setSatellitePosition(LnbPosition /* in_position */) { + ALOGV("%s", __FUNCTION__); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Lnb::sendDiseqcMessage(const std::vector<uint8_t>& /* in_diseqcMessage */) { + ALOGV("%s", __FUNCTION__); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Lnb::close() { + ALOGV("%s", __FUNCTION__); + + return ::ndk::ScopedAStatus::ok(); +} + +int Lnb::getId() { + return mId; +} + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/Lnb.h b/tv/tuner/aidl/default/Lnb.h new file mode 100644 index 0000000000..bfe3097ddc --- /dev/null +++ b/tv/tuner/aidl/default/Lnb.h @@ -0,0 +1,53 @@ +/* + * Copyright 2021 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/tv/tuner/BnLnb.h> +#include <aidl/android/hardware/tv/tuner/ITuner.h> + +using namespace std; + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +class Lnb : public BnLnb { + public: + Lnb(); + Lnb(int id); + + ::ndk::ScopedAStatus setCallback(const std::shared_ptr<ILnbCallback>& in_callback) override; + ::ndk::ScopedAStatus setVoltage(LnbVoltage in_voltage) override; + ::ndk::ScopedAStatus setTone(LnbTone in_tone) override; + ::ndk::ScopedAStatus setSatellitePosition(LnbPosition in_position) override; + ::ndk::ScopedAStatus sendDiseqcMessage(const std::vector<uint8_t>& in_diseqcMessage) override; + ::ndk::ScopedAStatus close() override; + + int getId(); + + private: + int mId; + virtual ~Lnb(); +}; + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/OWNERS b/tv/tuner/aidl/default/OWNERS new file mode 100644 index 0000000000..bf2b609f3e --- /dev/null +++ b/tv/tuner/aidl/default/OWNERS @@ -0,0 +1,3 @@ +hgchen@google.com +shubang@google.com +quxiangfang@google.com diff --git a/tv/tuner/aidl/default/TimeFilter.cpp b/tv/tuner/aidl/default/TimeFilter.cpp new file mode 100644 index 0000000000..dde7be34ca --- /dev/null +++ b/tv/tuner/aidl/default/TimeFilter.cpp @@ -0,0 +1,90 @@ +/* + * Copyright 2021 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. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "android.hardware.tv.tuner-service.example-TimeFilter" + +#include <aidl/android/hardware/tv/tuner/Result.h> +#include <utils/Log.h> + +#include "TimeFilter.h" + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +TimeFilter::TimeFilter() {} + +TimeFilter::TimeFilter(std::shared_ptr<Demux> demux) { + mDemux = demux; +} + +TimeFilter::~TimeFilter() {} + +::ndk::ScopedAStatus TimeFilter::setTimeStamp(int64_t in_timeStamp) { + ALOGV("%s", __FUNCTION__); + if (in_timeStamp == INVALID_TIME_STAMP) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + mTimeStamp = in_timeStamp; + mBeginTime = time(NULL); + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus TimeFilter::clearTimeStamp() { + ALOGV("%s", __FUNCTION__); + mTimeStamp = INVALID_TIME_STAMP; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus TimeFilter::getTimeStamp(int64_t* _aidl_return) { + ALOGV("%s", __FUNCTION__); + if (mTimeStamp == INVALID_TIME_STAMP) { + *_aidl_return = mTimeStamp; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + + uint64_t currentTimeStamp = mTimeStamp + difftime(time(NULL), mBeginTime) * 900000; + *_aidl_return = currentTimeStamp; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus TimeFilter::getSourceTime(int64_t* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + *_aidl_return = 0; + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus TimeFilter::close() { + ALOGV("%s", __FUNCTION__); + mTimeStamp = INVALID_TIME_STAMP; + + return ::ndk::ScopedAStatus::ok(); +} + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/TimeFilter.h b/tv/tuner/aidl/default/TimeFilter.h new file mode 100644 index 0000000000..ff35c47d70 --- /dev/null +++ b/tv/tuner/aidl/default/TimeFilter.h @@ -0,0 +1,57 @@ +/* + * Copyright 2021 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/tv/tuner/BnTimeFilter.h> +#include "Demux.h" +#include "time.h" + +using namespace std; + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +#define INVALID_TIME_STAMP -1 + +class Demux; + +class TimeFilter : public BnTimeFilter { + public: + TimeFilter(); + TimeFilter(std::shared_ptr<Demux> demux); + ~TimeFilter(); + + ::ndk::ScopedAStatus setTimeStamp(int64_t in_timeStamp) override; + ::ndk::ScopedAStatus clearTimeStamp() override; + ::ndk::ScopedAStatus getTimeStamp(int64_t* _aidl_return) override; + ::ndk::ScopedAStatus getSourceTime(int64_t* _aidl_return) override; + ::ndk::ScopedAStatus close() override; + + private: + std::shared_ptr<Demux> mDemux; + uint64_t mTimeStamp = INVALID_TIME_STAMP; + time_t mBeginTime; +}; + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/Tuner.cpp b/tv/tuner/aidl/default/Tuner.cpp new file mode 100644 index 0000000000..678be54dbe --- /dev/null +++ b/tv/tuner/aidl/default/Tuner.cpp @@ -0,0 +1,353 @@ +/* + * Copyright 2021 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. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "android.hardware.tv.tuner-service.example-Tuner" + +#include <aidl/android/hardware/tv/tuner/Result.h> +#include <utils/Log.h> + +#include "Demux.h" +#include "Descrambler.h" +#include "Frontend.h" +#include "Lnb.h" +#include "Tuner.h" + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +Tuner::Tuner() {} + +void Tuner::init() { + // Static Frontends array to maintain local frontends information + // Array index matches their FrontendId in the default impl + mFrontendSize = 10; + mFrontends[0] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBS, 0, this->ref<Tuner>()); + mFrontends[1] = ndk::SharedRefBase::make<Frontend>(FrontendType::ATSC3, 1, this->ref<Tuner>()); + mFrontends[2] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBC, 2, this->ref<Tuner>()); + mFrontends[3] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBS, 3, this->ref<Tuner>()); + mFrontends[4] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBT, 4, this->ref<Tuner>()); + mFrontends[5] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBT, 5, this->ref<Tuner>()); + mFrontends[6] = ndk::SharedRefBase::make<Frontend>(FrontendType::ANALOG, 6, this->ref<Tuner>()); + mFrontends[7] = ndk::SharedRefBase::make<Frontend>(FrontendType::ATSC, 7, this->ref<Tuner>()); + mFrontends[8] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBS3, 8, this->ref<Tuner>()); + mFrontends[9] = ndk::SharedRefBase::make<Frontend>(FrontendType::DTMB, 9, this->ref<Tuner>()); + + vector<FrontendStatusType> statusCaps; + + FrontendCapabilities capsIsdbs; + capsIsdbs.set<FrontendCapabilities::Tag::isdbsCaps>(FrontendIsdbsCapabilities()); + mFrontendCaps[0] = capsIsdbs; + statusCaps = { + FrontendStatusType::DEMOD_LOCK, FrontendStatusType::SNR, + FrontendStatusType::FEC, FrontendStatusType::MODULATION, + FrontendStatusType::MODULATIONS, FrontendStatusType::ROLL_OFF, + }; + mFrontendStatusCaps[0] = statusCaps; + + FrontendCapabilities capsAtsc3; + capsAtsc3.set<FrontendCapabilities::Tag::atsc3Caps>(FrontendAtsc3Capabilities()); + mFrontendCaps[1] = capsAtsc3; + statusCaps = { + FrontendStatusType::BER, + FrontendStatusType::PER, + FrontendStatusType::ATSC3_PLP_INFO, + FrontendStatusType::MODULATIONS, + FrontendStatusType::BERS, + FrontendStatusType::INTERLEAVINGS, + FrontendStatusType::BANDWIDTH, + }; + mFrontendStatusCaps[1] = statusCaps; + + FrontendCapabilities capsDvbc; + capsDvbc.set<FrontendCapabilities::Tag::dvbcCaps>(FrontendDvbcCapabilities()); + mFrontendCaps[2] = capsDvbc; + statusCaps = { + FrontendStatusType::PRE_BER, FrontendStatusType::SIGNAL_QUALITY, + FrontendStatusType::MODULATION, FrontendStatusType::SPECTRAL, + FrontendStatusType::MODULATIONS, FrontendStatusType::CODERATES, + FrontendStatusType::INTERLEAVINGS, FrontendStatusType::BANDWIDTH, + }; + mFrontendStatusCaps[2] = statusCaps; + + FrontendCapabilities capsDvbs; + capsDvbs.set<FrontendCapabilities::Tag::dvbsCaps>(FrontendDvbsCapabilities()); + mFrontendCaps[3] = capsDvbs; + statusCaps = { + FrontendStatusType::SIGNAL_STRENGTH, FrontendStatusType::SYMBOL_RATE, + FrontendStatusType::MODULATION, FrontendStatusType::MODULATIONS, + FrontendStatusType::ROLL_OFF, FrontendStatusType::IS_MISO, + }; + mFrontendStatusCaps[3] = statusCaps; + + FrontendCapabilities capsDvbt; + capsDvbt.set<FrontendCapabilities::Tag::dvbtCaps>(FrontendDvbtCapabilities()); + mFrontendCaps[4] = capsDvbt; + statusCaps = { + FrontendStatusType::EWBS, + FrontendStatusType::PLP_ID, + FrontendStatusType::HIERARCHY, + FrontendStatusType::MODULATIONS, + FrontendStatusType::BANDWIDTH, + FrontendStatusType::GUARD_INTERVAL, + FrontendStatusType::TRANSMISSION_MODE, + FrontendStatusType::T2_SYSTEM_ID, + }; + mFrontendStatusCaps[4] = statusCaps; + + FrontendCapabilities capsIsdbt; + FrontendIsdbtCapabilities isdbtCaps{ + .modeCap = (int)FrontendIsdbtMode::MODE_1 | (int)FrontendIsdbtMode::MODE_2, + .bandwidthCap = (int)FrontendIsdbtBandwidth::BANDWIDTH_6MHZ, + .modulationCap = (int)FrontendIsdbtModulation::MOD_16QAM, + .coderateCap = (int)FrontendIsdbtCoderate::CODERATE_4_5 | + (int)FrontendIsdbtCoderate::CODERATE_6_7, + .guardIntervalCap = (int)FrontendIsdbtGuardInterval::INTERVAL_1_128, + }; + capsIsdbt.set<FrontendCapabilities::Tag::isdbtCaps>(isdbtCaps); + mFrontendCaps[5] = capsIsdbt; + statusCaps = { + FrontendStatusType::AGC, + FrontendStatusType::LNA, + FrontendStatusType::MODULATION, + FrontendStatusType::MODULATIONS, + FrontendStatusType::BANDWIDTH, + FrontendStatusType::GUARD_INTERVAL, + FrontendStatusType::TRANSMISSION_MODE, + FrontendStatusType::ISDBT_SEGMENTS, + }; + mFrontendStatusCaps[5] = statusCaps; + + FrontendCapabilities capsAnalog; + capsAnalog.set<FrontendCapabilities::Tag::analogCaps>(FrontendAnalogCapabilities()); + mFrontendCaps[6] = capsAnalog; + statusCaps = { + FrontendStatusType::LAYER_ERROR, + FrontendStatusType::MER, + FrontendStatusType::UEC, + FrontendStatusType::TS_DATA_RATES, + }; + mFrontendStatusCaps[6] = statusCaps; + + FrontendCapabilities capsAtsc; + capsAtsc.set<FrontendCapabilities::Tag::atscCaps>(FrontendAtscCapabilities()); + mFrontendCaps[7] = capsAtsc; + statusCaps = { + FrontendStatusType::FREQ_OFFSET, + FrontendStatusType::RF_LOCK, + FrontendStatusType::MODULATIONS, + FrontendStatusType::IS_LINEAR, + }; + mFrontendStatusCaps[7] = statusCaps; + + FrontendCapabilities capsIsdbs3; + capsIsdbs3.set<FrontendCapabilities::Tag::isdbs3Caps>(FrontendIsdbs3Capabilities()); + mFrontendCaps[8] = capsIsdbs3; + statusCaps = { + FrontendStatusType::DEMOD_LOCK, FrontendStatusType::MODULATION, + FrontendStatusType::MODULATIONS, FrontendStatusType::ROLL_OFF, + FrontendStatusType::IS_SHORT_FRAMES, + }; + mFrontendStatusCaps[8] = statusCaps; + + FrontendCapabilities capsDtmb; + capsDtmb.set<FrontendCapabilities::Tag::dtmbCaps>(FrontendDtmbCapabilities()); + mFrontendCaps[9] = capsDtmb; + statusCaps = { + FrontendStatusType::MODULATIONS, FrontendStatusType::INTERLEAVINGS, + FrontendStatusType::BANDWIDTH, FrontendStatusType::GUARD_INTERVAL, + FrontendStatusType::TRANSMISSION_MODE, + }; + mFrontendStatusCaps[9] = statusCaps; + + mLnbs.resize(2); + mLnbs[0] = ndk::SharedRefBase::make<Lnb>(0); + mLnbs[1] = ndk::SharedRefBase::make<Lnb>(1); +} + +Tuner::~Tuner() {} + +::ndk::ScopedAStatus Tuner::getFrontendIds(std::vector<int32_t>* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + _aidl_return->resize(mFrontendSize); + for (int i = 0; i < mFrontendSize; i++) { + (*_aidl_return)[i] = mFrontends[i]->getFrontendId(); + } + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Tuner::openFrontendById(int32_t in_frontendId, + std::shared_ptr<IFrontend>* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + if (in_frontendId >= mFrontendSize || in_frontendId < 0) { + ALOGW("[ WARN ] Frontend with id %d isn't available", in_frontendId); + *_aidl_return = nullptr; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + + *_aidl_return = mFrontends[in_frontendId]; + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Tuner::openDemux(std::vector<int32_t>* out_demuxId, + std::shared_ptr<IDemux>* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + mLastUsedId += 1; + mDemuxes[mLastUsedId] = ndk::SharedRefBase::make<Demux>(mLastUsedId, this->ref<Tuner>()); + + out_demuxId->push_back(mLastUsedId); + *_aidl_return = mDemuxes[mLastUsedId]; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Tuner::getDemuxCaps(DemuxCapabilities* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + // IP filter can be an MMTP filter's data source. + _aidl_return->linkCaps = {0x00, 0x00, 0x02, 0x00, 0x00}; + // Support time filter testing + _aidl_return->bTimeFilter = true; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Tuner::openDescrambler(std::shared_ptr<IDescrambler>* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + *_aidl_return = ndk::SharedRefBase::make<Descrambler>(); + + return ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Tuner::getFrontendInfo(int32_t in_frontendId, FrontendInfo* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + if (in_frontendId >= mFrontendSize) { + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + + // assign randomly selected values for testing. + *_aidl_return = { + .type = mFrontends[in_frontendId]->getFrontendType(), + .minFrequency = 139, + .maxFrequency = 1139, + .minSymbolRate = 45, + .maxSymbolRate = 1145, + .acquireRange = 30, + .exclusiveGroupId = 57, + .statusCaps = mFrontendStatusCaps[in_frontendId], + .frontendCaps = mFrontendCaps[in_frontendId], + }; + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Tuner::getLnbIds(std::vector<int32_t>* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + _aidl_return->resize(mLnbs.size()); + for (int i = 0; i < mLnbs.size(); i++) { + (*_aidl_return)[i] = mLnbs[i]->getId(); + } + + return ::ndk::ScopedAStatus::ok(); +} + +::ndk::ScopedAStatus Tuner::openLnbById(int32_t in_lnbId, std::shared_ptr<ILnb>* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + if (in_lnbId >= mLnbs.size()) { + *_aidl_return = nullptr; + return ::ndk::ScopedAStatus::fromServiceSpecificError( + static_cast<int32_t>(Result::INVALID_ARGUMENT)); + } + + *_aidl_return = mLnbs[in_lnbId]; + return ::ndk::ScopedAStatus::ok(); +} + +std::shared_ptr<Frontend> Tuner::getFrontendById(int32_t frontendId) { + ALOGV("%s", __FUNCTION__); + + return mFrontends[frontendId]; +} + +::ndk::ScopedAStatus Tuner::openLnbByName(const std::string& /* in_lnbName */, + std::vector<int32_t>* out_lnbId, + std::shared_ptr<ILnb>* _aidl_return) { + ALOGV("%s", __FUNCTION__); + + out_lnbId->push_back(1234); + *_aidl_return = ndk::SharedRefBase::make<Lnb>(); + + return ::ndk::ScopedAStatus::ok(); +} + +void Tuner::setFrontendAsDemuxSource(int32_t frontendId, int32_t demuxId) { + mFrontendToDemux[frontendId] = demuxId; + if (mFrontends[frontendId] != nullptr && mFrontends[frontendId]->isLocked()) { + mDemuxes[demuxId]->startFrontendInputLoop(); + } +} + +void Tuner::removeDemux(int32_t demuxId) { + map<int32_t, int32_t>::iterator it; + for (it = mFrontendToDemux.begin(); it != mFrontendToDemux.end(); it++) { + if (it->second == demuxId) { + it = mFrontendToDemux.erase(it); + break; + } + } + mDemuxes.erase(demuxId); +} + +void Tuner::removeFrontend(int32_t frontendId) { + mFrontendToDemux.erase(frontendId); +} + +void Tuner::frontendStopTune(int32_t frontendId) { + map<int32_t, int32_t>::iterator it = mFrontendToDemux.find(frontendId); + int32_t demuxId; + if (it != mFrontendToDemux.end()) { + demuxId = it->second; + mDemuxes[demuxId]->stopFrontendInput(); + } +} + +void Tuner::frontendStartTune(int32_t frontendId) { + map<int32_t, int32_t>::iterator it = mFrontendToDemux.find(frontendId); + int32_t demuxId; + if (it != mFrontendToDemux.end()) { + demuxId = it->second; + mDemuxes[demuxId]->startFrontendInputLoop(); + } +} + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/Tuner.h b/tv/tuner/aidl/default/Tuner.h new file mode 100644 index 0000000000..7af7ab8d53 --- /dev/null +++ b/tv/tuner/aidl/default/Tuner.h @@ -0,0 +1,87 @@ +/* + * Copyright 2021 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/tv/tuner/BnTuner.h> +#include <aidl/android/hardware/tv/tuner/FrontendCapabilities.h> + +#include <map> +#include "Demux.h" +#include "Frontend.h" +#include "Lnb.h" + +using namespace std; + +namespace aidl { +namespace android { +namespace hardware { +namespace tv { +namespace tuner { + +class Frontend; +class Demux; +class Lnb; + +class Tuner : public BnTuner { + public: + Tuner(); + virtual ~Tuner(); + + ::ndk::ScopedAStatus getFrontendIds(std::vector<int32_t>* _aidl_return) override; + ::ndk::ScopedAStatus openFrontendById(int32_t in_frontendId, + std::shared_ptr<IFrontend>* _aidl_return) override; + ::ndk::ScopedAStatus openDemux(std::vector<int32_t>* out_demuxId, + std::shared_ptr<IDemux>* _aidl_return) override; + ::ndk::ScopedAStatus getDemuxCaps(DemuxCapabilities* _aidl_return) override; + ::ndk::ScopedAStatus openDescrambler(std::shared_ptr<IDescrambler>* _aidl_return) override; + ::ndk::ScopedAStatus getFrontendInfo(int32_t in_frontendId, + FrontendInfo* _aidl_return) override; + ::ndk::ScopedAStatus getLnbIds(std::vector<int32_t>* _aidl_return) override; + ::ndk::ScopedAStatus openLnbById(int32_t in_lnbId, + std::shared_ptr<ILnb>* _aidl_return) override; + ::ndk::ScopedAStatus openLnbByName(const std::string& in_lnbName, + std::vector<int32_t>* out_lnbId, + std::shared_ptr<ILnb>* _aidl_return) override; + + std::shared_ptr<Frontend> getFrontendById(int32_t frontendId); + void setFrontendAsDemuxSource(int32_t frontendId, int32_t demuxId); + void frontendStartTune(int32_t frontendId); + void frontendStopTune(int32_t frontendId); + void removeDemux(int32_t demuxId); + void removeFrontend(int32_t frontendId); + void init(); + + private: + // Static mFrontends array to maintain local frontends information + map<int32_t, std::shared_ptr<Frontend>> mFrontends; + map<int32_t, FrontendCapabilities> mFrontendCaps; + map<int32_t, vector<FrontendStatusType>> mFrontendStatusCaps; + map<int32_t, int32_t> mFrontendToDemux; + map<int32_t, std::shared_ptr<Demux>> mDemuxes; + // To maintain how many Frontends we have + int mFrontendSize; + // The last used demux id. Initial value is -1. + // First used id will be 0. + int32_t mLastUsedId = -1; + vector<std::shared_ptr<Lnb>> mLnbs; +}; + +} // namespace tuner +} // namespace tv +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/tv/tuner/aidl/default/service.cpp b/tv/tuner/aidl/default/service.cpp new file mode 100644 index 0000000000..ac8d779c28 --- /dev/null +++ b/tv/tuner/aidl/default/service.cpp @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "android.hardware.tv.tuner-service.example" + +#include <android-base/logging.h> +#include <android/binder_manager.h> +#include <android/binder_process.h> + +#include "Tuner.h" + +using ::aidl::android::hardware::tv::tuner::Tuner; + +int main() { + ABinderProcess_setThreadPoolMaxThreadCount(8); + std::shared_ptr<Tuner> tuner = ndk::SharedRefBase::make<Tuner>(); + tuner->init(); + + const std::string instance = std::string() + Tuner::descriptor + "/default"; + binder_status_t status = AServiceManager_addService(tuner->asBinder().get(), instance.c_str()); + CHECK(status == STATUS_OK); + + ABinderProcess_joinThreadPool(); + return EXIT_FAILURE; // should not reached +} diff --git a/tv/tuner/aidl/default/tuner-default.rc b/tv/tuner/aidl/default/tuner-default.rc new file mode 100644 index 0000000000..fa09456f29 --- /dev/null +++ b/tv/tuner/aidl/default/tuner-default.rc @@ -0,0 +1,6 @@ +service vendor.tuner-default /vendor/bin/hw/android.hardware.tv.tuner-service.example + class hal + user media + group mediadrm drmrpc + ioprio rt 4 + writepid /dev/cpuset/foreground/tasks diff --git a/tv/tuner/aidl/default/tuner-default.xml b/tv/tuner/aidl/default/tuner-default.xml new file mode 100644 index 0000000000..f0d03adcea --- /dev/null +++ b/tv/tuner/aidl/default/tuner-default.xml @@ -0,0 +1,6 @@ +<manifest version="1.0" type="device"> + <hal format="aidl"> + <name>android.hardware.tv.tuner</name> + <fqname>ITuner/default</fqname> + </hal> +</manifest> diff --git a/tv/tuner/aidl/vts/OWNERS b/tv/tuner/aidl/vts/OWNERS new file mode 100644 index 0000000000..bf2b609f3e --- /dev/null +++ b/tv/tuner/aidl/vts/OWNERS @@ -0,0 +1,3 @@ +hgchen@google.com +shubang@google.com +quxiangfang@google.com diff --git a/tv/tuner/aidl/vts/functional/Android.bp b/tv/tuner/aidl/vts/functional/Android.bp new file mode 100644 index 0000000000..e5fb1e6b22 --- /dev/null +++ b/tv/tuner/aidl/vts/functional/Android.bp @@ -0,0 +1,77 @@ +// +// Copyright 2021 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. +// + +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "hardware_interfaces_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["hardware_interfaces_license"], +} + +cc_test { + name: "VtsHalTvTunerTargetTest", + defaults: [ + "VtsHalTargetTestDefaults", + "use_libaidlvintf_gtest_helper_static", + ], + srcs: [ + "DemuxTests.cpp", + "DescramblerTests.cpp", + "DvrTests.cpp", + "FilterTests.cpp", + "FrontendTests.cpp", + "LnbTests.cpp", + "VtsHalTvTunerTargetTest.cpp", + ], + generated_headers: [ + "tuner_testing_dynamic_configuration_V1_0_enums", + "tuner_testing_dynamic_configuration_V1_0_parser", + ], + generated_sources: [ + "tuner_testing_dynamic_configuration_V1_0_enums", + "tuner_testing_dynamic_configuration_V1_0_parser", + ], + header_libs: ["libxsdc-utils"], + static_libs: [ + "android.hardware.cas@1.0", + "android.hardware.cas@1.1", + "android.hardware.cas@1.2", + "android.hardware.common-V2-ndk", + "android.hardware.common.fmq-V1-ndk", + "android.hardware.tv.tuner-V1-ndk", + "libaidlcommonsupport", + "libfmq", + "libcutils", + ], + shared_libs: [ + "libbinder_ndk", + "libvndksupport", + "libxml2", + ], + data: [ + ":tuner_frontend_input_ts", + ":tuner_frontend_input_es", + ":tuner_testing_dynamic_configuration_V1_0", + ], + test_suites: [ + "general-tests", + "vts", + ], + + require_root: true, +} diff --git a/tv/tuner/aidl/vts/functional/AndroidTest.xml b/tv/tuner/aidl/vts/functional/AndroidTest.xml new file mode 100644 index 0000000000..f93ed78f01 --- /dev/null +++ b/tv/tuner/aidl/vts/functional/AndroidTest.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2021 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. +--> +<configuration description="Runs VtsHalTvTunerTargetTest."> + <option name="test-suite-tag" value="apct" /> + <option name="test-suite-tag" value="apct-native" /> + + <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"> + </target_preparer> + + <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer"> + <option name="cleanup" value="true" /> + <option name="push" value="VtsHalTvTunerTargetTest->/data/local/tmp/VtsHalTvTunerTargetTest" /> + <option name="push" value="test.es->/data/local/tmp/test.es" /> + </target_preparer> + + <test class="com.android.tradefed.testtype.GTest" > + <option name="native-test-device-path" value="/data/local/tmp" /> + <option name="module-name" value="VtsHalTvTunerTargetTest" /> + <option name="native-test-timeout" value="30m" /> + </test> +</configuration> diff --git a/tv/tuner/aidl/vts/functional/DemuxTests.cpp b/tv/tuner/aidl/vts/functional/DemuxTests.cpp new file mode 100644 index 0000000000..9de01e1eab --- /dev/null +++ b/tv/tuner/aidl/vts/functional/DemuxTests.cpp @@ -0,0 +1,64 @@ +/* + * Copyright 2021 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 "DemuxTests.h" + +AssertionResult DemuxTests::openDemux(std::shared_ptr<IDemux>& demux, int32_t& demuxId) { + std::vector<int32_t> id; + auto status = mService->openDemux(&id, &mDemux); + if (status.isOk()) { + demux = mDemux; + demuxId = id[0]; + } + return AssertionResult(status.isOk()); +} + +AssertionResult DemuxTests::setDemuxFrontendDataSource(int32_t frontendId) { + EXPECT_TRUE(mDemux) << "Test with openDemux first."; + auto status = mDemux->setFrontendDataSource(frontendId); + return AssertionResult(status.isOk()); +} + +AssertionResult DemuxTests::getDemuxCaps(DemuxCapabilities& demuxCaps) { + if (!mDemux) { + ALOGW("[vts] Test with openDemux first."); + return failure(); + } + auto status = mService->getDemuxCaps(&demuxCaps); + return AssertionResult(status.isOk()); +} + +AssertionResult DemuxTests::getAvSyncId(std::shared_ptr<IFilter> filter, int32_t& avSyncHwId) { + EXPECT_TRUE(mDemux) << "Demux is not opened yet."; + + auto status = mDemux->getAvSyncHwId(filter, &avSyncHwId); + return AssertionResult(status.isOk()); +} + +AssertionResult DemuxTests::getAvSyncTime(int32_t avSyncId) { + EXPECT_TRUE(mDemux) << "Demux is not opened yet."; + + int64_t syncTime; + auto status = mDemux->getAvSyncTime(avSyncId, &syncTime); + return AssertionResult(status.isOk()); +} + +AssertionResult DemuxTests::closeDemux() { + EXPECT_TRUE(mDemux) << "Test with openDemux first."; + auto status = mDemux->close(); + mDemux = nullptr; + return AssertionResult(status.isOk()); +} diff --git a/tv/tuner/aidl/vts/functional/DemuxTests.h b/tv/tuner/aidl/vts/functional/DemuxTests.h new file mode 100644 index 0000000000..7698de33b3 --- /dev/null +++ b/tv/tuner/aidl/vts/functional/DemuxTests.h @@ -0,0 +1,49 @@ +/* + * Copyright 2021 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/tv/tuner/DemuxCapabilities.h> +#include <aidl/android/hardware/tv/tuner/IDemux.h> +#include <aidl/android/hardware/tv/tuner/IFilter.h> +#include <aidl/android/hardware/tv/tuner/ITuner.h> + +#include <gtest/gtest.h> +#include <log/log.h> + +using ::testing::AssertionResult; + +using namespace aidl::android::hardware::tv::tuner; + +class DemuxTests { + public: + void setService(std::shared_ptr<ITuner> tuner) { mService = tuner; } + + AssertionResult openDemux(std::shared_ptr<IDemux>& demux, int32_t& demuxId); + AssertionResult setDemuxFrontendDataSource(int32_t frontendId); + AssertionResult getAvSyncId(std::shared_ptr<IFilter> filter, int32_t& avSyncHwId); + AssertionResult getAvSyncTime(int32_t avSyncId); + AssertionResult getDemuxCaps(DemuxCapabilities& demuxCaps); + AssertionResult closeDemux(); + + protected: + static AssertionResult failure() { return ::testing::AssertionFailure(); } + + static AssertionResult success() { return ::testing::AssertionSuccess(); } + + std::shared_ptr<ITuner> mService; + std::shared_ptr<IDemux> mDemux; +}; diff --git a/tv/tuner/aidl/vts/functional/DescramblerTests.cpp b/tv/tuner/aidl/vts/functional/DescramblerTests.cpp new file mode 100644 index 0000000000..157fa0479e --- /dev/null +++ b/tv/tuner/aidl/vts/functional/DescramblerTests.cpp @@ -0,0 +1,205 @@ +/* + * Copyright 2021 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 "DescramblerTests.h" + +using namespace std; + +AssertionResult DescramblerTests::createCasPlugin(int32_t caSystemId) { + auto status = mMediaCasService->isSystemIdSupported(caSystemId); + if (!status.isOk() || !status) { + ALOGW("[vts] Failed to check isSystemIdSupported."); + return failure(); + } + + mCasListener = new MediaCasListener(); + auto pluginStatus = mMediaCasService->createPluginExt(caSystemId, mCasListener); + if (!pluginStatus.isOk()) { + ALOGW("[vts] Failed to createPluginExt."); + return failure(); + } + mCas = ICas::castFrom(pluginStatus); + if (mCas == nullptr) { + ALOGW("[vts] Failed to get ICas."); + return failure(); + } + return success(); +} + +AssertionResult DescramblerTests::openCasSession(vector<uint8_t>& sessionId, + vector<uint8_t>& hidlPvtData) { + Status sessionStatus; + SessionIntent intent = SessionIntent::LIVE; + ScramblingMode mode = ScramblingMode::RESERVED; + auto returnVoid = + mCas->openSession_1_2(intent, mode, [&](Status status, const hidl_vec<uint8_t>& id) { + sessionStatus = status; + sessionId = id; + }); + if (!returnVoid.isOk() || (sessionStatus != Status::OK)) { + ALOGW("[vts] Failed to open cas session."); + mCas->closeSession(sessionId); + return failure(); + } + + if (hidlPvtData.size() > 0) { + auto status = mCas->setSessionPrivateData(sessionId, hidlPvtData); + if (status != android::hardware::cas::V1_0::Status::OK) { + ALOGW("[vts] Failed to set session private data"); + mCas->closeSession(sessionId); + return failure(); + } + } + + return success(); +} + +AssertionResult DescramblerTests::getKeyToken(int32_t caSystemId, string& provisonStr, + vector<uint8_t>& hidlPvtData, + vector<uint8_t>& token) { + if (createCasPlugin(caSystemId) != success()) { + ALOGW("[vts] createCasPlugin failed."); + return failure(); + } + + if (provisonStr.size() > 0) { + auto returnStatus = mCas->provision(hidl_string(provisonStr)); + if (returnStatus != android::hardware::cas::V1_0::Status::OK) { + ALOGW("[vts] provision failed."); + return failure(); + } + } + + return openCasSession(token, hidlPvtData); +} + +AssertionResult DescramblerTests::openDescrambler(int32_t demuxId) { + ndk::ScopedAStatus status; + status = mService->openDescrambler(&mDescrambler); + if (!status.isOk()) { + ALOGW("[vts] openDescrambler failed."); + return failure(); + } + + status = mDescrambler->setDemuxSource(demuxId); + if (!status.isOk()) { + ALOGW("[vts] setDemuxSource failed."); + return failure(); + } + + return success(); +} + +AssertionResult DescramblerTests::setKeyToken(vector<uint8_t>& token) { + ndk::ScopedAStatus status; + if (!mDescrambler) { + ALOGW("[vts] Descrambler is not opened yet."); + return failure(); + } + + status = mDescrambler->setKeyToken(token); + if (!status.isOk()) { + ALOGW("[vts] setKeyToken failed."); + return failure(); + } + + return success(); +} + +AssertionResult DescramblerTests::addPid(DemuxPid pid, + std::shared_ptr<IFilter> optionalSourceFilter) { + ndk::ScopedAStatus status; + if (!mDescrambler) { + ALOGW("[vts] Descrambler is not opened yet."); + return failure(); + } + + status = mDescrambler->addPid(pid, optionalSourceFilter); + if (!status.isOk()) { + ALOGW("[vts] addPid failed."); + return failure(); + } + + return success(); +} + +AssertionResult DescramblerTests::removePid(DemuxPid pid, + std::shared_ptr<IFilter> optionalSourceFilter) { + ndk::ScopedAStatus status; + if (!mDescrambler) { + ALOGW("[vts] Descrambler is not opened yet."); + return failure(); + } + + status = mDescrambler->removePid(pid, optionalSourceFilter); + if (!status.isOk()) { + ALOGW("[vts] removePid failed."); + return failure(); + } + + return success(); +} + +AssertionResult DescramblerTests::closeDescrambler() { + ndk::ScopedAStatus status; + if (!mDescrambler) { + ALOGW("[vts] Descrambler is not opened yet."); + return failure(); + } + + status = mDescrambler->close(); + mDescrambler = nullptr; + if (!status.isOk()) { + ALOGW("[vts] close Descrambler failed."); + return failure(); + } + + return success(); +} + +AssertionResult DescramblerTests::getDemuxPidFromFilterSettings(DemuxFilterType type, + const DemuxFilterSettings& settings, + DemuxPid& pid) { + switch (type.mainType) { + case DemuxFilterMainType::TS: + if (type.subType.get<DemuxFilterSubType::Tag::tsFilterType>() == + DemuxTsFilterType::AUDIO || + type.subType.get<DemuxFilterSubType::Tag::tsFilterType>() == + DemuxTsFilterType::VIDEO) { + pid.set<DemuxPid::Tag::tPid>(settings.get<DemuxFilterSettings::Tag::ts>().tpid); + } else { + ALOGW("[vts] Not a media ts filter!"); + return failure(); + } + break; + case DemuxFilterMainType::MMTP: + if (type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>() == + DemuxMmtpFilterType::AUDIO || + type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>() == + DemuxMmtpFilterType::VIDEO) { + pid.set<DemuxPid::Tag::mmtpPid>( + settings.get<DemuxFilterSettings::Tag::mmtp>().mmtpPid); + } else { + ALOGW("[vts] Not a media mmtp filter!"); + return failure(); + } + break; + default: + ALOGW("[vts] Not a media filter!"); + return failure(); + } + return success(); +} diff --git a/tv/tuner/aidl/vts/functional/DescramblerTests.h b/tv/tuner/aidl/vts/functional/DescramblerTests.h new file mode 100644 index 0000000000..f0b769141a --- /dev/null +++ b/tv/tuner/aidl/vts/functional/DescramblerTests.h @@ -0,0 +1,106 @@ +/* + * Copyright 2021 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 <gtest/gtest.h> +#include <log/log.h> +#include <utils/Condition.h> +#include <utils/Mutex.h> +#include <fstream> +#include <iostream> +#include <map> + +#include <android/hardware/cas/1.0/types.h> +#include <android/hardware/cas/1.2/ICas.h> +#include <android/hardware/cas/1.2/ICasListener.h> +#include <android/hardware/cas/1.2/IMediaCasService.h> +#include <android/hardware/cas/1.2/types.h> + +#include <aidl/android/hardware/tv/tuner/IDescrambler.h> +#include <aidl/android/hardware/tv/tuner/IDvr.h> +#include <aidl/android/hardware/tv/tuner/IDvrCallback.h> +#include <aidl/android/hardware/tv/tuner/ITuner.h> + +using android::Condition; +using android::Mutex; +using android::sp; +using android::hardware::hidl_string; +using android::hardware::hidl_vec; +using android::hardware::Return; +using android::hardware::Void; +using android::hardware::cas::V1_2::ICas; +using android::hardware::cas::V1_2::ICasListener; +using android::hardware::cas::V1_2::IMediaCasService; +using android::hardware::cas::V1_2::ScramblingMode; +using android::hardware::cas::V1_2::SessionIntent; +using android::hardware::cas::V1_2::Status; +using android::hardware::cas::V1_2::StatusEvent; + +using ::testing::AssertionResult; + +using namespace aidl::android::hardware::tv::tuner; + +class MediaCasListener : public ICasListener { + public: + virtual Return<void> onEvent(int32_t /*event*/, int32_t /*arg*/, + const hidl_vec<uint8_t>& /*data*/) override { + return Void(); + } + + virtual Return<void> onSessionEvent(const hidl_vec<uint8_t>& /*sessionId*/, int32_t /*event*/, + int32_t /*arg*/, + const hidl_vec<uint8_t>& /*data*/) override { + return Void(); + } + + virtual Return<void> onStatusUpdate(StatusEvent /*event*/, int32_t /*arg*/) override { + return Void(); + } +}; + +class DescramblerTests { + public: + void setService(std::shared_ptr<ITuner> tuner) { mService = tuner; } + void setCasService(sp<IMediaCasService> casService) { mMediaCasService = casService; } + + AssertionResult setKeyToken(std::vector<uint8_t>& token); + AssertionResult openDescrambler(int32_t demuxId); + AssertionResult addPid(DemuxPid pid, std::shared_ptr<IFilter> optionalSourceFilter); + AssertionResult removePid(DemuxPid pid, std::shared_ptr<IFilter> optionalSourceFilter); + AssertionResult closeDescrambler(); + AssertionResult getKeyToken(int32_t caSystemId, std::string& provisonStr, + std::vector<uint8_t>& hidlPvtData, std::vector<uint8_t>& token); + AssertionResult getDemuxPidFromFilterSettings(DemuxFilterType type, + const DemuxFilterSettings& settings, + DemuxPid& pid); + + protected: + static AssertionResult failure() { return ::testing::AssertionFailure(); } + + static AssertionResult success() { return ::testing::AssertionSuccess(); } + + std::shared_ptr<ITuner> mService; + std::shared_ptr<IDescrambler> mDescrambler; + android::sp<ICas> mCas; + android::sp<IMediaCasService> mMediaCasService; + android::sp<MediaCasListener> mCasListener; + + private: + AssertionResult openCasSession(std::vector<uint8_t>& sessionId, + std::vector<uint8_t>& hidlPvtData); + AssertionResult createCasPlugin(int32_t caSystemId); +}; diff --git a/tv/tuner/aidl/vts/functional/DvrTests.cpp b/tv/tuner/aidl/vts/functional/DvrTests.cpp new file mode 100644 index 0000000000..e35609977b --- /dev/null +++ b/tv/tuner/aidl/vts/functional/DvrTests.cpp @@ -0,0 +1,337 @@ +/* + * Copyright 2021 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 "DvrTests.h" + +#include <aidl/android/hardware/tv/tuner/DemuxQueueNotifyBits.h> + +void DvrCallback::startPlaybackInputThread(string& dataInputFile, PlaybackSettings& settings, + MQDesc& playbackMQDescriptor) { + mInputDataFile = dataInputFile; + mPlaybackSettings = settings; + mPlaybackMQ = std::make_unique<FilterMQ>(playbackMQDescriptor, true /* resetPointers */); + EXPECT_TRUE(mPlaybackMQ); + pthread_create(&mPlaybackThread, NULL, __threadLoopPlayback, this); + pthread_setname_np(mPlaybackThread, "test_playback_input_loop"); +} + +void DvrCallback::stopPlaybackThread() { + mPlaybackThreadRunning = false; + mKeepWritingPlaybackFMQ = false; + + android::Mutex::Autolock autoLock(mPlaybackThreadLock); +} + +void* DvrCallback::__threadLoopPlayback(void* user) { + DvrCallback* const self = static_cast<DvrCallback*>(user); + self->playbackThreadLoop(); + return 0; +} + +void DvrCallback::playbackThreadLoop() { + android::Mutex::Autolock autoLock(mPlaybackThreadLock); + mPlaybackThreadRunning = true; + + // Create the EventFlag that is used to signal the HAL impl that data have been + // written into the Playback FMQ + EventFlag* playbackMQEventFlag; + EXPECT_TRUE(EventFlag::createEventFlag(mPlaybackMQ->getEventFlagWord(), &playbackMQEventFlag) == + android::OK); + + int fd = open(mInputDataFile.c_str(), O_RDONLY | O_LARGEFILE); + int readBytes; + uint32_t regionSize = 0; + int8_t* buffer; + ALOGW("[vts] playback thread loop start %s", mInputDataFile.c_str()); + if (fd < 0) { + mPlaybackThreadRunning = false; + ALOGW("[vts] Error %s", strerror(errno)); + } + + while (mPlaybackThreadRunning) { + while (mKeepWritingPlaybackFMQ) { + int totalWrite = mPlaybackMQ->availableToWrite(); + if (totalWrite * 4 < mPlaybackMQ->getQuantumCount()) { + // Wait for the HAL implementation to read more data then write. + continue; + } + AidlMessageQueue<int8_t, SynchronizedReadWrite>::MemTransaction memTx; + if (!mPlaybackMQ->beginWrite(totalWrite, &memTx)) { + ALOGW("[vts] Fail to write into Playback fmq."); + mPlaybackThreadRunning = false; + break; + } + auto first = memTx.getFirstRegion(); + buffer = first.getAddress(); + regionSize = first.getLength(); + + if (regionSize > 0) { + readBytes = read(fd, buffer, regionSize); + if (readBytes <= 0) { + if (readBytes < 0) { + ALOGW("[vts] Read from %s failed.", mInputDataFile.c_str()); + } else { + ALOGW("[vts] playback input EOF."); + } + mPlaybackThreadRunning = false; + break; + } + } + if (regionSize == 0 || (readBytes == regionSize && regionSize < totalWrite)) { + auto second = memTx.getSecondRegion(); + buffer = second.getAddress(); + regionSize = second.getLength(); + int ret = read(fd, buffer, regionSize); + if (ret <= 0) { + if (ret < 0) { + ALOGW("[vts] Read from %s failed.", mInputDataFile.c_str()); + } else { + ALOGW("[vts] playback input EOF."); + } + mPlaybackThreadRunning = false; + break; + } + readBytes += ret; + } + if (!mPlaybackMQ->commitWrite(readBytes)) { + ALOGW("[vts] Failed to commit write playback fmq."); + mPlaybackThreadRunning = false; + break; + } + playbackMQEventFlag->wake(static_cast<uint32_t>(DemuxQueueNotifyBits::DATA_READY)); + } + } + + mPlaybackThreadRunning = false; + ALOGW("[vts] Playback thread end."); + close(fd); +} + +void DvrCallback::testRecordOutput() { + android::Mutex::Autolock autoLock(mMsgLock); + while (mDataOutputBuffer.empty()) { + if (-ETIMEDOUT == mMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) { + EXPECT_TRUE(false) << "record output matching pid does not output within timeout"; + stopRecordThread(); + return; + } + } + stopRecordThread(); + ALOGW("[vts] record pass and stop"); +} + +void DvrCallback::startRecordOutputThread(RecordSettings recordSettings, + MQDesc& recordMQDescriptor) { + mRecordMQ = std::make_unique<FilterMQ>(recordMQDescriptor, true /* resetPointers */); + EXPECT_TRUE(mRecordMQ); + struct RecordThreadArgs* threadArgs = + (struct RecordThreadArgs*)malloc(sizeof(struct RecordThreadArgs)); + threadArgs->user = this; + threadArgs->recordSettings = &recordSettings; + threadArgs->keepReadingRecordFMQ = &mKeepReadingRecordFMQ; + + pthread_create(&mRecordThread, NULL, __threadLoopRecord, (void*)threadArgs); + pthread_setname_np(mRecordThread, "test_record_input_loop"); +} + +void* DvrCallback::__threadLoopRecord(void* threadArgs) { + DvrCallback* const self = + static_cast<DvrCallback*>(((struct RecordThreadArgs*)threadArgs)->user); + self->recordThreadLoop(((struct RecordThreadArgs*)threadArgs)->recordSettings, + ((struct RecordThreadArgs*)threadArgs)->keepReadingRecordFMQ); + return 0; +} + +void DvrCallback::recordThreadLoop(RecordSettings* /*recordSettings*/, bool* keepReadingRecordFMQ) { + ALOGD("[vts] DvrCallback record threadLoop start."); + android::Mutex::Autolock autoLock(mRecordThreadLock); + mRecordThreadRunning = true; + mKeepReadingRecordFMQ = true; + + // Create the EventFlag that is used to signal the HAL impl that data have been + // read from the Record FMQ + EventFlag* recordMQEventFlag; + EXPECT_TRUE(EventFlag::createEventFlag(mRecordMQ->getEventFlagWord(), &recordMQEventFlag) == + android::OK); + + while (mRecordThreadRunning) { + while (*keepReadingRecordFMQ) { + uint32_t efState = 0; + android::status_t status = recordMQEventFlag->wait( + static_cast<int32_t>(DemuxQueueNotifyBits::DATA_READY), &efState, WAIT_TIMEOUT, + true /* retry on spurious wake */); + if (status != android::OK) { + ALOGD("[vts] wait for data ready on the record FMQ"); + continue; + } + // Our current implementation filter the data and write it into the filter FMQ + // immediately after the DATA_READY from the VTS/framework + if (!readRecordFMQ()) { + ALOGD("[vts] record data failed to be filtered. Ending thread"); + mRecordThreadRunning = false; + break; + } + } + } + + mRecordThreadRunning = false; + ALOGD("[vts] record thread ended."); +} + +bool DvrCallback::readRecordFMQ() { + android::Mutex::Autolock autoLock(mMsgLock); + bool result = false; + int readSize = mRecordMQ->availableToRead(); + mDataOutputBuffer.clear(); + mDataOutputBuffer.resize(readSize); + result = mRecordMQ->read(mDataOutputBuffer.data(), readSize); + EXPECT_TRUE(result) << "can't read from Record MQ"; + mMsgCondition.signal(); + return result; +} + +void DvrCallback::stopRecordThread() { + mKeepReadingRecordFMQ = false; + mRecordThreadRunning = false; +} + +AssertionResult DvrTests::openDvrInDemux(DvrType type, int32_t bufferSize) { + ndk::ScopedAStatus status; + EXPECT_TRUE(mDemux) << "Test with openDemux first."; + + // Create dvr callback + if (type == DvrType::PLAYBACK) { + mDvrPlaybackCallback = ndk::SharedRefBase::make<DvrCallback>(); + status = mDemux->openDvr(type, bufferSize, mDvrPlaybackCallback, &mDvrPlayback); + if (status.isOk()) { + mDvrPlaybackCallback->setDvr(mDvrPlayback); + } + } + + if (type == DvrType::RECORD) { + mDvrRecordCallback = ndk::SharedRefBase::make<DvrCallback>(); + status = mDemux->openDvr(type, bufferSize, mDvrRecordCallback, &mDvrRecord); + if (status.isOk()) { + mDvrRecordCallback->setDvr(mDvrRecord); + } + } + + return AssertionResult(status.isOk()); +} + +AssertionResult DvrTests::configDvrPlayback(DvrSettings setting) { + ndk::ScopedAStatus status = mDvrPlayback->configure(setting); + + return AssertionResult(status.isOk()); +} + +AssertionResult DvrTests::configDvrRecord(DvrSettings setting) { + ndk::ScopedAStatus status = mDvrRecord->configure(setting); + + return AssertionResult(status.isOk()); +} + +AssertionResult DvrTests::getDvrPlaybackMQDescriptor() { + ndk::ScopedAStatus status; + EXPECT_TRUE(mDemux) << "Test with openDemux first."; + EXPECT_TRUE(mDvrPlayback) << "Test with openDvr first."; + + status = mDvrPlayback->getQueueDesc(&mDvrPlaybackMQDescriptor); + + return AssertionResult(status.isOk()); +} + +AssertionResult DvrTests::getDvrRecordMQDescriptor() { + ndk::ScopedAStatus status; + EXPECT_TRUE(mDemux) << "Test with openDemux first."; + EXPECT_TRUE(mDvrRecord) << "Test with openDvr first."; + + status = mDvrRecord->getQueueDesc(&mDvrRecordMQDescriptor); + + return AssertionResult(status.isOk()); +} + +AssertionResult DvrTests::attachFilterToDvr(std::shared_ptr<IFilter> filter) { + ndk::ScopedAStatus status; + EXPECT_TRUE(mDemux) << "Test with openDemux first."; + EXPECT_TRUE(mDvrRecord) << "Test with openDvr first."; + + status = mDvrRecord->attachFilter(filter); + + return AssertionResult(status.isOk()); +} + +AssertionResult DvrTests::detachFilterToDvr(std::shared_ptr<IFilter> filter) { + ndk::ScopedAStatus status; + EXPECT_TRUE(mDemux) << "Test with openDemux first."; + EXPECT_TRUE(mDvrRecord) << "Test with openDvr first."; + + status = mDvrRecord->detachFilter(filter); + + return AssertionResult(status.isOk()); +} + +AssertionResult DvrTests::startDvrPlayback() { + ndk::ScopedAStatus status; + EXPECT_TRUE(mDemux) << "Test with openDemux first."; + EXPECT_TRUE(mDvrPlayback) << "Test with openDvr first."; + + status = mDvrPlayback->start(); + + return AssertionResult(status.isOk()); +} + +AssertionResult DvrTests::stopDvrPlayback() { + ndk::ScopedAStatus status; + EXPECT_TRUE(mDemux) << "Test with openDemux first."; + EXPECT_TRUE(mDvrPlayback) << "Test with openDvr first."; + + status = mDvrPlayback->stop(); + + return AssertionResult(status.isOk()); +} + +void DvrTests::closeDvrPlayback() { + ASSERT_TRUE(mDemux); + ASSERT_TRUE(mDvrPlayback); + ASSERT_TRUE(mDvrPlayback->close().isOk()); +} + +AssertionResult DvrTests::startDvrRecord() { + ndk::ScopedAStatus status; + EXPECT_TRUE(mDemux) << "Test with openDemux first."; + EXPECT_TRUE(mDvrRecord) << "Test with openDvr first."; + + status = mDvrRecord->start(); + + return AssertionResult(status.isOk()); +} + +AssertionResult DvrTests::stopDvrRecord() { + ndk::ScopedAStatus status; + EXPECT_TRUE(mDemux) << "Test with openDemux first."; + EXPECT_TRUE(mDvrRecord) << "Test with openDvr first."; + + status = mDvrRecord->stop(); + + return AssertionResult(status.isOk()); +} + +void DvrTests::closeDvrRecord() { + ASSERT_TRUE(mDemux); + ASSERT_TRUE(mDvrRecord); + ASSERT_TRUE(mDvrRecord->close().isOk()); +} diff --git a/tv/tuner/aidl/vts/functional/DvrTests.h b/tv/tuner/aidl/vts/functional/DvrTests.h new file mode 100644 index 0000000000..bda57b3dff --- /dev/null +++ b/tv/tuner/aidl/vts/functional/DvrTests.h @@ -0,0 +1,181 @@ +/* + * Copyright 2021 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 <fcntl.h> +#include <fmq/AidlMessageQueue.h> +#include <gtest/gtest.h> +#include <log/log.h> +#include <utils/Condition.h> +#include <utils/Mutex.h> +#include <fstream> +#include <iostream> +#include <map> + +#include <aidl/android/hardware/tv/tuner/BnDvrCallback.h> +#include <aidl/android/hardware/tv/tuner/IDvr.h> +#include <aidl/android/hardware/tv/tuner/ITuner.h> + +#include "FilterTests.h" + +using ::aidl::android::hardware::common::fmq::MQDescriptor; +using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite; +using ::android::AidlMessageQueue; +using ::android::Condition; +using ::android::Mutex; +using ::android::hardware::EventFlag; + +using namespace aidl::android::hardware::tv::tuner; +using namespace std; + +#define WAIT_TIMEOUT 3000000000 + +class DvrCallback : public BnDvrCallback { + public: + virtual ::ndk::ScopedAStatus onRecordStatus(RecordStatus status) override { + ALOGD("[vts] record status %hhu", status); + switch (status) { + case RecordStatus::DATA_READY: + break; + case RecordStatus::LOW_WATER: + break; + case RecordStatus::HIGH_WATER: + case RecordStatus::OVERFLOW: + ALOGD("[vts] record overflow. Flushing."); + EXPECT_TRUE(mDvr) << "Dvr callback is not set with an IDvr"; + if (mDvr) { + ndk::ScopedAStatus result = mDvr->flush(); + ALOGD("[vts] Flushing result %s.", result.getMessage()); + } + break; + } + return ndk::ScopedAStatus::ok(); + } + + virtual ::ndk::ScopedAStatus onPlaybackStatus(PlaybackStatus status) override { + // android::Mutex::Autolock autoLock(mMsgLock); + ALOGD("[vts] playback status %d", status); + switch (status) { + case PlaybackStatus::SPACE_EMPTY: + case PlaybackStatus::SPACE_ALMOST_EMPTY: + ALOGD("[vts] keep playback inputing %d", status); + mKeepWritingPlaybackFMQ = true; + break; + case PlaybackStatus::SPACE_ALMOST_FULL: + case PlaybackStatus::SPACE_FULL: + ALOGD("[vts] stop playback inputing %d", status); + mKeepWritingPlaybackFMQ = false; + break; + } + return ndk::ScopedAStatus::ok(); + } + + void stopPlaybackThread(); + void testRecordOutput(); + void stopRecordThread(); + + void startPlaybackInputThread(string& dataInputFile, PlaybackSettings& settings, + MQDesc& playbackMQDescriptor); + void startRecordOutputThread(RecordSettings recordSettings, MQDesc& recordMQDescriptor); + static void* __threadLoopPlayback(void* user); + static void* __threadLoopRecord(void* threadArgs); + void playbackThreadLoop(); + void recordThreadLoop(RecordSettings* recordSetting, bool* keepWritingPlaybackFMQ); + + bool readRecordFMQ(); + + void setDvr(std::shared_ptr<IDvr> dvr) { mDvr = dvr; } + + private: + struct RecordThreadArgs { + DvrCallback* user; + RecordSettings* recordSettings; + bool* keepReadingRecordFMQ; + }; + // uint16_t mDataLength = 0; + std::vector<int8_t> mDataOutputBuffer; + + std::map<uint32_t, std::unique_ptr<FilterMQ>> mFilterMQ; + std::unique_ptr<FilterMQ> mPlaybackMQ; + std::unique_ptr<FilterMQ> mRecordMQ; + std::map<uint32_t, EventFlag*> mFilterMQEventFlag; + + android::Mutex mMsgLock; + android::Mutex mPlaybackThreadLock; + android::Mutex mRecordThreadLock; + android::Condition mMsgCondition; + + bool mKeepWritingPlaybackFMQ = true; + bool mKeepReadingRecordFMQ = true; + bool mPlaybackThreadRunning; + bool mRecordThreadRunning; + pthread_t mPlaybackThread; + pthread_t mRecordThread; + string mInputDataFile; + PlaybackSettings mPlaybackSettings; + + std::shared_ptr<IDvr> mDvr = nullptr; + + // int mPidFilterOutputCount = 0; +}; + +class DvrTests { + public: + void setService(std::shared_ptr<ITuner> tuner) { mService = tuner; } + void setDemux(std::shared_ptr<IDemux> demux) { mDemux = demux; } + + void startPlaybackInputThread(string& dataInputFile, PlaybackSettings& settings) { + mDvrPlaybackCallback->startPlaybackInputThread(dataInputFile, settings, + mDvrPlaybackMQDescriptor); + }; + + void startRecordOutputThread(RecordSettings settings) { + mDvrRecordCallback->startRecordOutputThread(settings, mDvrRecordMQDescriptor); + }; + + void stopPlaybackThread() { mDvrPlaybackCallback->stopPlaybackThread(); } + void testRecordOutput() { mDvrRecordCallback->testRecordOutput(); } + void stopRecordThread() { mDvrRecordCallback->stopRecordThread(); } + + AssertionResult openDvrInDemux(DvrType type, int32_t bufferSize); + AssertionResult configDvrPlayback(DvrSettings setting); + AssertionResult configDvrRecord(DvrSettings setting); + AssertionResult getDvrPlaybackMQDescriptor(); + AssertionResult getDvrRecordMQDescriptor(); + AssertionResult attachFilterToDvr(std::shared_ptr<IFilter> filter); + AssertionResult detachFilterToDvr(std::shared_ptr<IFilter> filter); + AssertionResult stopDvrPlayback(); + AssertionResult startDvrPlayback(); + AssertionResult stopDvrRecord(); + AssertionResult startDvrRecord(); + void closeDvrPlayback(); + void closeDvrRecord(); + + protected: + static AssertionResult failure() { return ::testing::AssertionFailure(); } + + static AssertionResult success() { return ::testing::AssertionSuccess(); } + + std::shared_ptr<ITuner> mService; + std::shared_ptr<IDvr> mDvrPlayback; + std::shared_ptr<IDvr> mDvrRecord; + std::shared_ptr<IDemux> mDemux; + std::shared_ptr<DvrCallback> mDvrPlaybackCallback; + std::shared_ptr<DvrCallback> mDvrRecordCallback; + MQDesc mDvrPlaybackMQDescriptor; + MQDesc mDvrRecordMQDescriptor; +}; diff --git a/tv/tuner/aidl/vts/functional/FilterTests.cpp b/tv/tuner/aidl/vts/functional/FilterTests.cpp new file mode 100644 index 0000000000..381475a2a3 --- /dev/null +++ b/tv/tuner/aidl/vts/functional/FilterTests.cpp @@ -0,0 +1,362 @@ +/* + * Copyright 2021 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 "FilterTests.h" + +#include <inttypes.h> + +#include <aidl/android/hardware/tv/tuner/DemuxFilterMonitorEventType.h> +#include <aidlcommonsupport/NativeHandle.h> + +using ::aidl::android::hardware::common::NativeHandle; + +void FilterCallback::testFilterDataOutput() { + android::Mutex::Autolock autoLock(mMsgLock); + while (mPidFilterOutputCount < 1) { + if (-ETIMEDOUT == mMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) { + EXPECT_TRUE(false) << "filter output matching pid does not output within timeout"; + return; + } + } + mPidFilterOutputCount = 0; + ALOGW("[vts] pass and stop"); +} + +void FilterCallback::testFilterScramblingEvent() { + android::Mutex::Autolock autoLock(mMsgLock); + while (mScramblingStatusEvent < 1) { + if (-ETIMEDOUT == mMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) { + EXPECT_TRUE(false) << "scrambling event does not output within timeout"; + return; + } + } + mScramblingStatusEvent = 0; + ALOGW("[vts] pass and stop"); +} + +void FilterCallback::testFilterIpCidEvent() { + android::Mutex::Autolock autoLock(mMsgLock); + while (mIpCidEvent < 1) { + if (-ETIMEDOUT == mMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) { + EXPECT_TRUE(false) << "ip cid change event does not output within timeout"; + return; + } + } + mIpCidEvent = 0; + ALOGW("[vts] pass and stop"); +} + +void FilterCallback::testStartIdAfterReconfigure() { + android::Mutex::Autolock autoLock(mMsgLock); + while (!mStartIdReceived) { + if (-ETIMEDOUT == mMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) { + EXPECT_TRUE(false) << "does not receive start id within timeout"; + return; + } + } + mStartIdReceived = false; + ALOGW("[vts] pass and stop"); +} + +void FilterCallback::readFilterEventsData(const vector<DemuxFilterEvent>& events) { + ALOGW("[vts] reading filter event"); + // todo separate filter handlers + for (int i = 0; i < events.size(); i++) { + switch (events[i].getTag()) { + case DemuxFilterEvent::Tag::media: + ALOGD("[vts] Media filter event, avMemHandle numFds=%zu.", + events[i].get<DemuxFilterEvent::Tag::media>().avMemory.fds.size()); + dumpAvData(events[i].get<DemuxFilterEvent::Tag::media>()); + break; + case DemuxFilterEvent::Tag::tsRecord: + ALOGD("[vts] TS record filter event, pts=%" PRIu64 ", firstMbInSlice=%d", + events[i].get<DemuxFilterEvent::Tag::tsRecord>().pts, + events[i].get<DemuxFilterEvent::Tag::tsRecord>().firstMbInSlice); + break; + case DemuxFilterEvent::Tag::mmtpRecord: + ALOGD("[vts] MMTP record filter event, pts=%" PRIu64 + ", firstMbInSlice=%d, mpuSequenceNumber=%d, tsIndexMask=%d", + events[i].get<DemuxFilterEvent::Tag::mmtpRecord>().pts, + events[i].get<DemuxFilterEvent::Tag::mmtpRecord>().firstMbInSlice, + events[i].get<DemuxFilterEvent::Tag::mmtpRecord>().mpuSequenceNumber, + events[i].get<DemuxFilterEvent::Tag::mmtpRecord>().tsIndexMask); + break; + case DemuxFilterEvent::Tag::monitorEvent: + switch (events[i].get<DemuxFilterEvent::Tag::monitorEvent>().getTag()) { + case DemuxFilterMonitorEvent::Tag::scramblingStatus: + mScramblingStatusEvent++; + break; + case DemuxFilterMonitorEvent::Tag::cid: + mIpCidEvent++; + break; + default: + break; + } + break; + case DemuxFilterEvent::Tag::startId: + ALOGD("[vts] Restart filter event, startId=%d", + events[i].get<DemuxFilterEvent::Tag::startId>()); + mStartIdReceived = true; + break; + default: + break; + } + } +} + +bool FilterCallback::dumpAvData(const DemuxFilterMediaEvent& event) { + int32_t length = event.dataLength; + int32_t offset = event.offset; + int av_fd; + // read data from buffer pointed by a handle + if (event.avMemory.fds.size() == 0) { + if (mAvSharedHandle == nullptr) { + return false; + } + av_fd = mAvSharedHandle->data[0]; + } else { + av_fd = event.avMemory.fds[0].get(); + } + uint8_t* buffer = static_cast<uint8_t*>( + mmap(NULL, length + offset, PROT_READ | PROT_WRITE, MAP_SHARED, av_fd, 0)); + if (buffer == MAP_FAILED) { + ALOGE("[vts] fail to allocate av buffer, errno=%d", errno); + return false; + } + uint8_t output[length + 1]; + memcpy(output, buffer + offset, length); + // print buffer and check with golden output. + return true; +} + +AssertionResult FilterTests::openFilterInDemux(DemuxFilterType type, int32_t bufferSize) { + ndk::ScopedAStatus status; + EXPECT_TRUE(mDemux) << "Test with openDemux first."; + + // Create demux callback + mFilterCallback = ndk::SharedRefBase::make<FilterCallback>(); + + // Add filter to the local demux + status = mDemux->openFilter(type, bufferSize, mFilterCallback, &mFilter); + + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::getNewlyOpenedFilterId_64bit(int64_t& filterId) { + ndk::ScopedAStatus status; + EXPECT_TRUE(mDemux) << "Test with openDemux first."; + EXPECT_TRUE(mFilter) << "Test with openFilterInDemux first."; + EXPECT_TRUE(mFilterCallback) << "Test with openFilterInDemux first."; + + status = mFilter->getId64Bit(&mFilterId); + if (status.isOk()) { + mFilterCallback->setFilterId(mFilterId); + mFilterCallback->setFilterInterface(mFilter); + mUsedFilterIds.insert(mUsedFilterIds.end(), mFilterId); + mFilters[mFilterId] = mFilter; + mFilterCallbacks[mFilterId] = mFilterCallback; + filterId = mFilterId; + + // Check getId() too. + int32_t filterId32Bit; + status = mFilter->getId(&filterId32Bit); + } + + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::getSharedAvMemoryHandle(int64_t filterId) { + EXPECT_TRUE(mFilters[filterId]) << "Open media filter first."; + NativeHandle avMemory; + int64_t avMemSize; + ndk::ScopedAStatus status = mFilters[filterId]->getAvSharedHandle(&avMemory, &avMemSize); + if (status.isOk()) { + mAvSharedHandle = android::dupFromAidl(avMemory); + mFilterCallbacks[mFilterId]->setSharedHandle(mAvSharedHandle); + mFilterCallbacks[mFilterId]->setMemSize(avMemSize); + } + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::releaseShareAvHandle(int64_t filterId) { + ndk::ScopedAStatus status; + EXPECT_TRUE(mFilters[filterId]) << "Open media filter first."; + EXPECT_TRUE(mAvSharedHandle) << "No shared av handle to release."; + status = mFilters[filterId]->releaseAvHandle(::android::makeToAidl(mAvSharedHandle), + 0 /*dataId*/); + native_handle_close(mAvSharedHandle); + native_handle_delete(mAvSharedHandle); + mAvSharedHandle = nullptr; + + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::configFilter(DemuxFilterSettings setting, int64_t filterId) { + ndk::ScopedAStatus status; + EXPECT_TRUE(mFilters[filterId]) << "Test with getNewlyOpenedFilterId first."; + status = mFilters[filterId]->configure(setting); + + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::configAvFilterStreamType(AvStreamType type, int64_t filterId) { + ndk::ScopedAStatus status; + EXPECT_TRUE(mFilters[filterId]) << "Test with getNewlyOpenedFilterId first."; + + status = mFilters[filterId]->configureAvStreamType(type); + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::configIpFilterCid(int32_t ipCid, int64_t filterId) { + ndk::ScopedAStatus status; + EXPECT_TRUE(mFilters[filterId]) << "Open Ip filter first."; + + status = mFilters[filterId]->configureIpCid(ipCid); + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::getFilterMQDescriptor(int64_t filterId, bool getMqDesc) { + if (!getMqDesc) { + ALOGE("[vts] Filter does not need FMQ."); + return success(); + } + ndk::ScopedAStatus status; + EXPECT_TRUE(mFilters[filterId]) << "Test with getNewlyOpenedFilterId first."; + EXPECT_TRUE(mFilterCallbacks[filterId]) << "Test with getNewlyOpenedFilterId first."; + + status = mFilters[filterId]->getQueueDesc(&mFilterMQDescriptor); + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::startFilter(int64_t filterId) { + EXPECT_TRUE(mFilters[filterId]) << "Test with getNewlyOpenedFilterId first."; + + ndk::ScopedAStatus status = mFilters[filterId]->start(); + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::stopFilter(int64_t filterId) { + EXPECT_TRUE(mFilters[filterId]) << "Test with getNewlyOpenedFilterId first."; + + ndk::ScopedAStatus status = mFilters[filterId]->stop(); + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::closeFilter(int64_t filterId) { + EXPECT_TRUE(mFilters[filterId]) << "Test with getNewlyOpenedFilterId first."; + ndk::ScopedAStatus status = mFilters[filterId]->close(); + if (status.isOk()) { + for (int i = 0; i < mUsedFilterIds.size(); i++) { + if (mUsedFilterIds[i] == filterId) { + mUsedFilterIds.erase(mUsedFilterIds.begin() + i); + break; + } + } + mFilterCallbacks.erase(filterId); + mFilters.erase(filterId); + } + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::configureMonitorEvent(int64_t filterId, int32_t monitorEventTypes) { + EXPECT_TRUE(mFilters[filterId]) << "Test with getNewlyOpenedFilterId first."; + ndk::ScopedAStatus status; + + status = mFilters[filterId]->configureMonitorEvent(monitorEventTypes); + if (monitorEventTypes & static_cast<int32_t>(DemuxFilterMonitorEventType::SCRAMBLING_STATUS)) { + mFilterCallbacks[filterId]->testFilterScramblingEvent(); + } + if (monitorEventTypes & static_cast<int32_t>(DemuxFilterMonitorEventType::IP_CID_CHANGE)) { + mFilterCallbacks[filterId]->testFilterIpCidEvent(); + } + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::startIdTest(int64_t filterId) { + EXPECT_TRUE(mFilterCallbacks[filterId]) << "Test with getNewlyOpenedFilterId first."; + mFilterCallbacks[filterId]->testStartIdAfterReconfigure(); + return AssertionResult(true); +} + +AssertionResult FilterTests::openTimeFilterInDemux() { + if (!mDemux) { + ALOGW("[vts] Test with openDemux first."); + return failure(); + } + + // Add time filter to the local demux + auto status = mDemux->openTimeFilter(&mTimeFilter); + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::setTimeStamp(int64_t timeStamp) { + if (!mTimeFilter) { + ALOGW("[vts] Test with openTimeFilterInDemux first."); + return failure(); + } + + mBeginTimeStamp = timeStamp; + return AssertionResult(mTimeFilter->setTimeStamp(timeStamp).isOk()); +} + +AssertionResult FilterTests::getTimeStamp() { + if (!mTimeFilter) { + ALOGW("[vts] Test with openTimeFilterInDemux first."); + return failure(); + } + + int64_t timeStamp; + auto status = mTimeFilter->getTimeStamp(&timeStamp); + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::setFilterDataSource(int64_t sourceFilterId, int64_t sinkFilterId) { + if (!mFilters[sourceFilterId] || !mFilters[sinkFilterId]) { + ALOGE("[vts] setFilterDataSource filter not opened."); + return failure(); + } + + auto status = mFilters[sinkFilterId]->setDataSource(mFilters[sourceFilterId]); + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::setFilterDataSourceToDemux(int64_t filterId) { + if (!mFilters[filterId]) { + ALOGE("[vts] setFilterDataSourceToDemux filter not opened."); + return failure(); + } + + auto status = mFilters[filterId]->setDataSource(nullptr); + return AssertionResult(status.isOk()); +} + +AssertionResult FilterTests::clearTimeStamp() { + if (!mTimeFilter) { + ALOGW("[vts] Test with openTimeFilterInDemux first."); + return failure(); + } + + return AssertionResult(mTimeFilter->clearTimeStamp().isOk()); +} + +AssertionResult FilterTests::closeTimeFilter() { + if (!mTimeFilter) { + ALOGW("[vts] Test with openTimeFilterInDemux first."); + return failure(); + } + + return AssertionResult(mTimeFilter->close().isOk()); +} diff --git a/tv/tuner/aidl/vts/functional/FilterTests.h b/tv/tuner/aidl/vts/functional/FilterTests.h new file mode 100644 index 0000000000..91a0a4a54f --- /dev/null +++ b/tv/tuner/aidl/vts/functional/FilterTests.h @@ -0,0 +1,156 @@ +/* + * Copyright 2021 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/tv/tuner/BnFilterCallback.h> +#include <aidl/android/hardware/tv/tuner/IDemux.h> +#include <aidl/android/hardware/tv/tuner/IFilter.h> +#include <aidl/android/hardware/tv/tuner/ITuner.h> +#include <gtest/gtest.h> +#include <log/log.h> +#include <utils/Condition.h> +#include <utils/Mutex.h> +#include <map> + +#include <fmq/AidlMessageQueue.h> + +using ::aidl::android::hardware::common::fmq::MQDescriptor; +using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite; +using ::android::AidlMessageQueue; +using ::android::Condition; +using ::android::Mutex; +using ::android::hardware::EventFlag; + +using ::testing::AssertionResult; + +using namespace aidl::android::hardware::tv::tuner; +using namespace std; + +enum FilterEventType : uint8_t { + UNDEFINED, + SECTION, + MEDIA, + PES, + RECORD, + MMTPRECORD, + DOWNLOAD, + TEMI, +}; + +using FilterMQ = AidlMessageQueue<int8_t, SynchronizedReadWrite>; +using MQDesc = MQDescriptor<int8_t, SynchronizedReadWrite>; + +#define WAIT_TIMEOUT 3000000000 + +class FilterCallback : public BnFilterCallback { + public: + virtual ::ndk::ScopedAStatus onFilterEvent(const vector<DemuxFilterEvent>& events) override { + android::Mutex::Autolock autoLock(mMsgLock); + // Temprarily we treat the first coming back filter data on the matching pid a success + // once all of the MQ are cleared, means we got all the expected output + readFilterEventsData(events); + mPidFilterOutputCount++; + mMsgCondition.signal(); + return ::ndk::ScopedAStatus::ok(); + } + + virtual ::ndk::ScopedAStatus onFilterStatus(const DemuxFilterStatus /*status*/) override { + return ::ndk::ScopedAStatus::ok(); + } + + void setFilterId(int32_t filterId) { mFilterId = filterId; } + void setFilterInterface(std::shared_ptr<IFilter> filter) { mFilter = filter; } + void setFilterEventType(FilterEventType type) { mFilterEventType = type; } + void setSharedHandle(native_handle_t* sharedHandle) { mAvSharedHandle = sharedHandle; } + void setMemSize(uint64_t size) { mAvSharedMemSize = size; } + + void testFilterDataOutput(); + void testFilterScramblingEvent(); + void testFilterIpCidEvent(); + void testStartIdAfterReconfigure(); + + void readFilterEventsData(const vector<DemuxFilterEvent>& events); + bool dumpAvData(const DemuxFilterMediaEvent& event); + + private: + int32_t mFilterId; + std::shared_ptr<IFilter> mFilter; + FilterEventType mFilterEventType; + + native_handle_t* mAvSharedHandle = nullptr; + uint64_t mAvSharedMemSize = -1; + + android::Mutex mMsgLock; + android::Mutex mFilterOutputLock; + android::Condition mMsgCondition; + + int mPidFilterOutputCount = 0; + int mScramblingStatusEvent = 0; + int mIpCidEvent = 0; + bool mStartIdReceived = false; +}; + +class FilterTests { + public: + void setService(std::shared_ptr<ITuner> tuner) { mService = tuner; } + void setDemux(std::shared_ptr<IDemux> demux) { mDemux = demux; } + std::shared_ptr<IFilter> getFilterById(int64_t filterId) { return mFilters[filterId]; } + + map<int64_t, std::shared_ptr<FilterCallback>> getFilterCallbacks() { return mFilterCallbacks; } + + AssertionResult openFilterInDemux(DemuxFilterType type, int32_t bufferSize); + AssertionResult getNewlyOpenedFilterId_64bit(int64_t& filterId); + AssertionResult getSharedAvMemoryHandle(int64_t filterId); + AssertionResult releaseShareAvHandle(int64_t filterId); + AssertionResult configFilter(DemuxFilterSettings setting, int64_t filterId); + AssertionResult configAvFilterStreamType(AvStreamType type, int64_t filterId); + AssertionResult configIpFilterCid(int32_t ipCid, int64_t filterId); + AssertionResult configureMonitorEvent(int64_t filterId, int32_t monitorEventTypes); + AssertionResult getFilterMQDescriptor(int64_t filterId, bool getMqDesc); + AssertionResult startFilter(int64_t filterId); + AssertionResult stopFilter(int64_t filterId); + AssertionResult closeFilter(int64_t filterId); + AssertionResult startIdTest(int64_t filterId); + + AssertionResult openTimeFilterInDemux(); + AssertionResult setTimeStamp(int64_t timeStamp); + AssertionResult getTimeStamp(); + AssertionResult setFilterDataSource(int64_t sourceFilterId, int64_t sinkFilterId); + AssertionResult setFilterDataSourceToDemux(int64_t filterId); + AssertionResult clearTimeStamp(); + AssertionResult closeTimeFilter(); + + protected: + static AssertionResult failure() { return ::testing::AssertionFailure(); } + + static AssertionResult success() { return ::testing::AssertionSuccess(); } + + std::shared_ptr<ITuner> mService; + std::shared_ptr<IFilter> mFilter; + std::shared_ptr<IDemux> mDemux; + std::shared_ptr<ITimeFilter> mTimeFilter; + map<int64_t, std::shared_ptr<IFilter>> mFilters; + map<int64_t, std::shared_ptr<FilterCallback>> mFilterCallbacks; + + std::shared_ptr<FilterCallback> mFilterCallback; + MQDesc mFilterMQDescriptor; + vector<int64_t> mUsedFilterIds; + + native_handle_t* mAvSharedHandle = nullptr; + int64_t mFilterId = -1; + int64_t mBeginTimeStamp; +}; diff --git a/tv/tuner/aidl/vts/functional/FrontendTests.cpp b/tv/tuner/aidl/vts/functional/FrontendTests.cpp new file mode 100644 index 0000000000..93b79766dc --- /dev/null +++ b/tv/tuner/aidl/vts/functional/FrontendTests.cpp @@ -0,0 +1,486 @@ +/* + * Copyright 2021 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 "FrontendTests.h" + +ndk::ScopedAStatus FrontendCallback::onEvent(FrontendEventType frontendEventType) { + android::Mutex::Autolock autoLock(mMsgLock); + ALOGD("[vts] frontend event received. Type: %d", frontendEventType); + mEventReceived = true; + mMsgCondition.signal(); + switch (frontendEventType) { + case FrontendEventType::LOCKED: + mLockMsgReceived = true; + mLockMsgCondition.signal(); + break; + default: + // do nothing + break; + } + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus FrontendCallback::onScanMessage(FrontendScanMessageType type, + const FrontendScanMessage& message) { + android::Mutex::Autolock autoLock(mMsgLock); + while (!mScanMsgProcessed) { + mMsgCondition.wait(mMsgLock); + } + ALOGD("[vts] frontend scan message. Type: %d", type); + switch (message.getTag()) { + case FrontendScanMessage::modulation: + readFrontendScanMessage_Modulation(message.get<FrontendScanMessage::Tag::modulation>()); + break; + case FrontendScanMessage::Tag::isHighPriority: + ALOGD("[vts] frontend scan message high priority: %d", + message.get<FrontendScanMessage::Tag::isHighPriority>()); + break; + case FrontendScanMessage::Tag::annex: + ALOGD("[vts] frontend scan message dvbc annex: %hhu", + message.get<FrontendScanMessage::Tag::annex>()); + break; + default: + break; + } + mScanMessageReceived = true; + mScanMsgProcessed = false; + mScanMessageType = type; + mScanMessage = message; + mMsgCondition.signal(); + return ndk::ScopedAStatus::ok(); +} + +void FrontendCallback::readFrontendScanMessage_Modulation(FrontendModulation modulation) { + switch (modulation.getTag()) { + case FrontendModulation::Tag::dvbc: + ALOGD("[vts] frontend scan message modulation dvbc: %d", + modulation.get<FrontendModulation::Tag::dvbc>()); + break; + case FrontendModulation::Tag::dvbs: + ALOGD("[vts] frontend scan message modulation dvbs: %d", + modulation.get<FrontendModulation::Tag::dvbs>()); + break; + case FrontendModulation::Tag::isdbs: + ALOGD("[vts] frontend scan message modulation isdbs: %d", + modulation.get<FrontendModulation::Tag::isdbs>()); + break; + case FrontendModulation::Tag::isdbs3: + ALOGD("[vts] frontend scan message modulation isdbs3: %d", + modulation.get<FrontendModulation::Tag::isdbs3>()); + break; + case FrontendModulation::Tag::isdbt: + ALOGD("[vts] frontend scan message modulation isdbt: %d", + modulation.get<FrontendModulation::Tag::isdbt>()); + break; + case FrontendModulation::Tag::atsc: + ALOGD("[vts] frontend scan message modulation atsc: %d", + modulation.get<FrontendModulation::Tag::atsc>()); + break; + case FrontendModulation::Tag::atsc3: + ALOGD("[vts] frontend scan message modulation atsc3: %d", + modulation.get<FrontendModulation::Tag::atsc3>()); + break; + case FrontendModulation::Tag::dvbt: + ALOGD("[vts] frontend scan message modulation dvbt: %d", + modulation.get<FrontendModulation::Tag::dvbt>()); + break; + default: + break; + } +} + +void FrontendCallback::tuneTestOnLock(std::shared_ptr<IFrontend>& frontend, + FrontendSettings settings) { + ndk::ScopedAStatus result = frontend->tune(settings); + EXPECT_TRUE(result.isOk()); + + android::Mutex::Autolock autoLock(mMsgLock); + while (!mLockMsgReceived) { + if (-ETIMEDOUT == mLockMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) { + EXPECT_TRUE(false) << "Event LOCKED not received within timeout"; + mLockMsgReceived = false; + return; + } + } + mLockMsgReceived = false; +} + +void FrontendCallback::scanTest(std::shared_ptr<IFrontend>& frontend, FrontendConfig config, + FrontendScanType type) { + int32_t targetFrequency = getTargetFrequency(config.settings); + if (type == FrontendScanType::SCAN_BLIND) { + // reset the frequency in the scan configuration to test blind scan. The settings param of + // passed in means the real input config on the transponder connected to the DUT. + // We want the blind the test to start from lower frequency than this to check the blind + // scan implementation. + resetBlindScanStartingFrequency(config, targetFrequency - 100); + } + + ndk::ScopedAStatus result = frontend->scan(config.settings, type); + EXPECT_TRUE(result.isOk()); + + bool scanMsgLockedReceived = false; + bool targetFrequencyReceived = false; + + android::Mutex::Autolock autoLock(mMsgLock); +wait: + while (!mScanMessageReceived) { + if (-ETIMEDOUT == mMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) { + EXPECT_TRUE(false) << "Scan message not received within timeout"; + mScanMessageReceived = false; + mScanMsgProcessed = true; + return; + } + } + + if (mScanMessageType != FrontendScanMessageType::END) { + if (mScanMessageType == FrontendScanMessageType::LOCKED) { + scanMsgLockedReceived = true; + result = frontend->scan(config.settings, type); + EXPECT_TRUE(result.isOk()); + } + + if (mScanMessageType == FrontendScanMessageType::FREQUENCY) { + targetFrequencyReceived = + mScanMessage.get<FrontendScanMessage::Tag::frequencies>().size() > 0 && + mScanMessage.get<FrontendScanMessage::Tag::frequencies>()[0] == targetFrequency; + } + + if (mScanMessageType == FrontendScanMessageType::PROGRESS_PERCENT) { + ALOGD("[vts] Scan in progress...[%d%%]", + mScanMessage.get<FrontendScanMessage::Tag::progressPercent>()); + } + + mScanMessageReceived = false; + mScanMsgProcessed = true; + mMsgCondition.signal(); + goto wait; + } + + EXPECT_TRUE(scanMsgLockedReceived) << "Scan message LOCKED not received before END"; + EXPECT_TRUE(targetFrequencyReceived) << "frequency not received before LOCKED on blindScan"; + mScanMessageReceived = false; + mScanMsgProcessed = true; +} + +int32_t FrontendCallback::getTargetFrequency(FrontendSettings& settings) { + switch (settings.getTag()) { + case FrontendSettings::Tag::analog: + return settings.get<FrontendSettings::Tag::analog>().frequency; + case FrontendSettings::Tag::atsc: + return settings.get<FrontendSettings::Tag::atsc>().frequency; + case FrontendSettings::Tag::atsc3: + return settings.get<FrontendSettings::Tag::atsc3>().frequency; + case FrontendSettings::Tag::dvbc: + return settings.get<FrontendSettings::Tag::dvbc>().frequency; + case FrontendSettings::Tag::dvbs: + return settings.get<FrontendSettings::Tag::dvbs>().frequency; + case FrontendSettings::Tag::dvbt: + return settings.get<FrontendSettings::Tag::dvbt>().frequency; + case FrontendSettings::Tag::isdbs: + return settings.get<FrontendSettings::Tag::isdbs>().frequency; + case FrontendSettings::Tag::isdbs3: + return settings.get<FrontendSettings::Tag::isdbs3>().frequency; + case FrontendSettings::Tag::isdbt: + return settings.get<FrontendSettings::Tag::isdbt>().frequency; + default: + return 0; + } +} + +void FrontendCallback::resetBlindScanStartingFrequency(FrontendConfig& config, + int32_t resetingFreq) { + switch (config.settings.getTag()) { + case FrontendSettings::Tag::analog: + config.settings.get<FrontendSettings::Tag::analog>().frequency = resetingFreq; + break; + case FrontendSettings::Tag::atsc: + config.settings.get<FrontendSettings::Tag::atsc>().frequency = resetingFreq; + break; + case FrontendSettings::Tag::atsc3: + config.settings.get<FrontendSettings::Tag::atsc3>().frequency = resetingFreq; + break; + case FrontendSettings::Tag::dvbc: + config.settings.get<FrontendSettings::Tag::dvbc>().frequency = resetingFreq; + break; + case FrontendSettings::Tag::dvbs: + config.settings.get<FrontendSettings::Tag::dvbs>().frequency = resetingFreq; + break; + case FrontendSettings::Tag::dvbt: + config.settings.get<FrontendSettings::Tag::dvbt>().frequency = resetingFreq; + break; + case FrontendSettings::Tag::isdbs: + config.settings.get<FrontendSettings::Tag::isdbs>().frequency = resetingFreq; + break; + case FrontendSettings::Tag::isdbs3: + config.settings.get<FrontendSettings::Tag::isdbs3>().frequency = resetingFreq; + break; + case FrontendSettings::Tag::isdbt: + config.settings.get<FrontendSettings::Tag::isdbt>().frequency = resetingFreq; + break; + default: + break; + } +} + +AssertionResult FrontendTests::getFrontendIds() { + ndk::ScopedAStatus status; + status = mService->getFrontendIds(&mFeIds); + return AssertionResult(status.isOk()); +} + +AssertionResult FrontendTests::getFrontendInfo(int32_t frontendId) { + ndk::ScopedAStatus status; + status = mService->getFrontendInfo(frontendId, &mFrontendInfo); + return AssertionResult(status.isOk()); +} + +AssertionResult FrontendTests::openFrontendById(int32_t frontendId) { + ndk::ScopedAStatus status; + status = mService->openFrontendById(frontendId, &mFrontend); + return AssertionResult(status.isOk()); +} + +AssertionResult FrontendTests::setFrontendCallback() { + EXPECT_TRUE(mFrontend) << "Test with openFrontendById first."; + mFrontendCallback = ndk::SharedRefBase::make<FrontendCallback>(); + auto callbackStatus = mFrontend->setCallback(mFrontendCallback); + return AssertionResult(callbackStatus.isOk()); +} + +AssertionResult FrontendTests::scanFrontend(FrontendConfig config, FrontendScanType type) { + EXPECT_TRUE(mFrontendCallback) + << "test with openFrontendById/setFrontendCallback/getFrontendInfo first."; + + EXPECT_TRUE(mFrontendInfo.type == config.type) + << "FrontendConfig does not match the frontend info of the given id."; + + mFrontendCallback->scanTest(mFrontend, config, type); + return AssertionResult(true); +} + +AssertionResult FrontendTests::stopScanFrontend() { + EXPECT_TRUE(mFrontend) << "Test with openFrontendById first."; + ndk::ScopedAStatus status; + status = mFrontend->stopScan(); + + return AssertionResult(status.isOk()); +} + +AssertionResult FrontendTests::setLnb(int32_t lnbId) { + if (!mFrontendCallback) { + ALOGW("[vts] open and set frontend callback first."); + return failure(); + } + return AssertionResult(mFrontend->setLnb(lnbId).isOk()); +} + +AssertionResult FrontendTests::linkCiCam(int32_t ciCamId) { + ndk::ScopedAStatus status; + int32_t ltsId; + status = mFrontend->linkCiCam(ciCamId, <sId); + return AssertionResult(status.isOk()); +} + +AssertionResult FrontendTests::unlinkCiCam(int32_t ciCamId) { + ndk::ScopedAStatus status = mFrontend->unlinkCiCam(ciCamId); + return AssertionResult(status.isOk()); +} + +void FrontendTests::verifyFrontendStatus(vector<FrontendStatusType> statusTypes, + vector<FrontendStatus> expectStatuses) { + ASSERT_TRUE(mFrontend) << "Frontend is not opened yet."; + ndk::ScopedAStatus status; + vector<FrontendStatus> realStatuses; + + status = mFrontend->getStatus(statusTypes, &realStatuses); + ASSERT_TRUE(status.isOk() && realStatuses.size() == statusTypes.size()); + + for (int i = 0; i < statusTypes.size(); i++) { + FrontendStatusType type = statusTypes[i]; + switch (type) { + case FrontendStatusType::MODULATIONS: { + // TODO: verify modulations + break; + } + case FrontendStatusType::BERS: { + ASSERT_TRUE(std::equal(realStatuses[i].get<FrontendStatus::Tag::bers>().begin(), + realStatuses[i].get<FrontendStatus::Tag::bers>().end(), + expectStatuses[i].get<FrontendStatus::Tag::bers>().begin())); + break; + } + case FrontendStatusType::CODERATES: { + ASSERT_TRUE(std::equal( + realStatuses[i].get<FrontendStatus::Tag::codeRates>().begin(), + realStatuses[i].get<FrontendStatus::Tag::codeRates>().end(), + expectStatuses[i].get<FrontendStatus::Tag::codeRates>().begin())); + break; + } + case FrontendStatusType::GUARD_INTERVAL: { + // TODO: verify interval + break; + } + case FrontendStatusType::TRANSMISSION_MODE: { + // TODO: verify tranmission mode + break; + } + case FrontendStatusType::UEC: { + ASSERT_TRUE(realStatuses[i].get<FrontendStatus::Tag::uec>() == + expectStatuses[i].get<FrontendStatus::Tag::uec>()); + break; + } + case FrontendStatusType::T2_SYSTEM_ID: { + ASSERT_TRUE(realStatuses[i].get<FrontendStatus::Tag::systemId>() == + expectStatuses[i].get<FrontendStatus::Tag::systemId>()); + break; + } + case FrontendStatusType::INTERLEAVINGS: { + ASSERT_TRUE(std::equal( + realStatuses[i].get<FrontendStatus::Tag::interleaving>().begin(), + realStatuses[i].get<FrontendStatus::Tag::interleaving>().end(), + expectStatuses[i].get<FrontendStatus::Tag::interleaving>().begin())); + break; + } + case FrontendStatusType::ISDBT_SEGMENTS: { + ASSERT_TRUE(std::equal( + realStatuses[i].get<FrontendStatus::Tag::isdbtSegment>().begin(), + realStatuses[i].get<FrontendStatus::Tag::isdbtSegment>().end(), + expectStatuses[i].get<FrontendStatus::Tag::isdbtSegment>().begin())); + break; + } + case FrontendStatusType::TS_DATA_RATES: { + ASSERT_TRUE(std::equal( + realStatuses[i].get<FrontendStatus::Tag::tsDataRate>().begin(), + realStatuses[i].get<FrontendStatus::Tag::tsDataRate>().end(), + expectStatuses[i].get<FrontendStatus::Tag::tsDataRate>().begin())); + break; + } + case FrontendStatusType::ROLL_OFF: { + // TODO: verify roll off + break; + } + case FrontendStatusType::IS_MISO: { + ASSERT_TRUE(realStatuses[i].get<FrontendStatus::Tag::isMiso>() == + expectStatuses[i].get<FrontendStatus::Tag::isMiso>()); + break; + } + case FrontendStatusType::IS_LINEAR: { + ASSERT_TRUE(realStatuses[i].get<FrontendStatus::Tag::isLinear>() == + expectStatuses[i].get<FrontendStatus::Tag::isLinear>()); + break; + } + case FrontendStatusType::IS_SHORT_FRAMES: { + ASSERT_TRUE(realStatuses[i].get<FrontendStatus::Tag::isShortFrames>() == + expectStatuses[i].get<FrontendStatus::Tag::isShortFrames>()); + break; + } + default: { + continue; + } + } + } + ASSERT_TRUE(status.isOk()); +} + +AssertionResult FrontendTests::tuneFrontend(FrontendConfig config, bool testWithDemux) { + EXPECT_TRUE(mFrontendCallback) + << "test with openFrontendById/setFrontendCallback/getFrontendInfo first."; + + EXPECT_TRUE(mFrontendInfo.type == config.type) + << "FrontendConfig does not match the frontend info of the given id."; + + mIsSoftwareFe = config.isSoftwareFe; + if (mIsSoftwareFe && testWithDemux) { + if (getDvrTests()->openDvrInDemux(mDvrConfig.type, mDvrConfig.bufferSize) != success()) { + ALOGW("[vts] Software frontend dvr configure openDvr failed."); + return failure(); + } + if (getDvrTests()->configDvrPlayback(mDvrConfig.settings) != success()) { + ALOGW("[vts] Software frontend dvr configure Dvr playback failed."); + return failure(); + } + if (getDvrTests()->getDvrPlaybackMQDescriptor() != success()) { + ALOGW("[vts] Software frontend dvr configure get MQDesc failed."); + return failure(); + } + getDvrTests()->startPlaybackInputThread( + mDvrConfig.playbackInputFile, + mDvrConfig.settings.get<DvrSettings::Tag::playback>()); + } + mFrontendCallback->tuneTestOnLock(mFrontend, config.settings); + return AssertionResult(true); +} + +AssertionResult FrontendTests::stopTuneFrontend(bool testWithDemux) { + EXPECT_TRUE(mFrontend) << "Test with openFrontendById first."; + ndk::ScopedAStatus status; + status = mFrontend->stopTune(); + if (mIsSoftwareFe && testWithDemux) { + getDvrTests()->stopPlaybackThread(); + getDvrTests()->closeDvrPlayback(); + } + return AssertionResult(status.isOk()); +} + +AssertionResult FrontendTests::closeFrontend() { + EXPECT_TRUE(mFrontend) << "Test with openFrontendById first."; + ndk::ScopedAStatus status; + status = mFrontend->close(); + mFrontend = nullptr; + mFrontendCallback = nullptr; + return AssertionResult(status.isOk()); +} + +void FrontendTests::getFrontendIdByType(FrontendType feType, int32_t& feId) { + ASSERT_TRUE(getFrontendIds()); + ASSERT_TRUE(mFeIds.size() > 0); + for (size_t i = 0; i < mFeIds.size(); i++) { + ASSERT_TRUE(getFrontendInfo(mFeIds[i])); + if (mFrontendInfo.type != feType) { + continue; + } + feId = mFeIds[i]; + return; + } + feId = INVALID_ID; +} + +void FrontendTests::tuneTest(FrontendConfig frontendConf) { + int32_t feId; + getFrontendIdByType(frontendConf.type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(openFrontendById(feId)); + ASSERT_TRUE(setFrontendCallback()); + if (frontendConf.canConnectToCiCam) { + ASSERT_TRUE(linkCiCam(frontendConf.ciCamId)); + ASSERT_TRUE(unlinkCiCam(frontendConf.ciCamId)); + } + ASSERT_TRUE(tuneFrontend(frontendConf, false /*testWithDemux*/)); + verifyFrontendStatus(frontendConf.tuneStatusTypes, frontendConf.expectTuneStatuses); + ASSERT_TRUE(stopTuneFrontend(false /*testWithDemux*/)); + ASSERT_TRUE(closeFrontend()); +} + +void FrontendTests::scanTest(FrontendConfig frontendConf, FrontendScanType scanType) { + int32_t feId; + getFrontendIdByType(frontendConf.type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(openFrontendById(feId)); + ASSERT_TRUE(setFrontendCallback()); + ASSERT_TRUE(scanFrontend(frontendConf, scanType)); + ASSERT_TRUE(stopScanFrontend()); + ASSERT_TRUE(closeFrontend()); +} diff --git a/tv/tuner/aidl/vts/functional/FrontendTests.h b/tv/tuner/aidl/vts/functional/FrontendTests.h new file mode 100644 index 0000000000..b65704f64b --- /dev/null +++ b/tv/tuner/aidl/vts/functional/FrontendTests.h @@ -0,0 +1,138 @@ +/* + * Copyright 2021 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/tv/tuner/BnFrontendCallback.h> +#include <aidl/android/hardware/tv/tuner/IFrontend.h> +#include <aidl/android/hardware/tv/tuner/ITuner.h> + +#include <gtest/gtest.h> +#include <log/log.h> +#include <utils/Condition.h> +#include <utils/Mutex.h> + +#include "DvrTests.h" +#include "VtsHalTvTunerTestConfigurations.h" + +#define WAIT_TIMEOUT 3000000000 +#define INVALID_ID -1 + +using android::Condition; +using android::Mutex; + +using ::testing::AssertionResult; + +using namespace aidl::android::hardware::tv::tuner; +using namespace std; + +#define INVALID_ID -1 +#define WAIT_TIMEOUT 3000000000 + +class FrontendCallback : public BnFrontendCallback { + public: + virtual ndk::ScopedAStatus onEvent(FrontendEventType frontendEventType) override; + virtual ndk::ScopedAStatus onScanMessage(FrontendScanMessageType type, + const FrontendScanMessage& message) override; + + void tuneTestOnLock(std::shared_ptr<IFrontend>& frontend, FrontendSettings settings); + void scanTest(std::shared_ptr<IFrontend>& frontend, FrontendConfig config, + FrontendScanType type); + + // Helper methods + int32_t getTargetFrequency(FrontendSettings& settings); + void resetBlindScanStartingFrequency(FrontendConfig& config, int32_t resetingFreq); + + private: + void readFrontendScanMessage_Modulation(FrontendModulation modulation); + + bool mEventReceived = false; + bool mScanMessageReceived = false; + bool mLockMsgReceived = false; + bool mScanMsgProcessed = true; + FrontendScanMessageType mScanMessageType; + FrontendScanMessage mScanMessage; + vector<int8_t> mEventMessage; + android::Mutex mMsgLock; + android::Condition mMsgCondition; + android::Condition mLockMsgCondition; +}; + +class FrontendTests { + public: + void setService(std::shared_ptr<ITuner> tuner) { + mService = tuner; + getDvrTests()->setService(tuner); + getDefaultSoftwareFrontendPlaybackConfig(mDvrConfig); + } + + AssertionResult getFrontendIds(); + AssertionResult getFrontendInfo(int32_t frontendId); + AssertionResult openFrontendById(int32_t frontendId); + AssertionResult setFrontendCallback(); + AssertionResult scanFrontend(FrontendConfig config, FrontendScanType type); + AssertionResult stopScanFrontend(); + AssertionResult setLnb(int32_t lnbId); + AssertionResult tuneFrontend(FrontendConfig config, bool testWithDemux); + void verifyFrontendStatus(vector<FrontendStatusType> statusTypes, + vector<FrontendStatus> expectStatuses); + AssertionResult stopTuneFrontend(bool testWithDemux); + AssertionResult closeFrontend(); + + AssertionResult linkCiCam(int32_t ciCamId); + AssertionResult unlinkCiCam(int32_t ciCamId); + + void getFrontendIdByType(FrontendType feType, int32_t& feId); + void tuneTest(FrontendConfig frontendConf); + void scanTest(FrontendConfig frontend, FrontendScanType type); + + void setDvrTests(DvrTests* dvrTests) { mExternalDvrTests = dvrTests; } + void setDemux(std::shared_ptr<IDemux> demux) { getDvrTests()->setDemux(demux); } + void setSoftwareFrontendDvrConfig(DvrConfig conf) { mDvrConfig = conf; } + + protected: + static AssertionResult failure() { return ::testing::AssertionFailure(); } + static AssertionResult success() { return ::testing::AssertionSuccess(); } + + void getDefaultSoftwareFrontendPlaybackConfig(DvrConfig& dvrConfig) { + PlaybackSettings playbackSettings{ + .statusMask = 0xf, + .lowThreshold = 0x1000, + .highThreshold = 0x07fff, + .dataFormat = DataFormat::ES, + .packetSize = static_cast<int8_t>(188), + }; + dvrConfig.type = DvrType::PLAYBACK; + dvrConfig.playbackInputFile = "/data/local/tmp/test.es"; + dvrConfig.bufferSize = FMQ_SIZE_4M; + dvrConfig.settings.set<DvrSettings::playback>(playbackSettings); + } + + DvrTests* getDvrTests() { + return (mExternalDvrTests != nullptr ? mExternalDvrTests : &mDvrTests); + } + + std::shared_ptr<ITuner> mService; + std::shared_ptr<IFrontend> mFrontend; + FrontendInfo mFrontendInfo; + std::shared_ptr<FrontendCallback> mFrontendCallback; + vector<int32_t> mFeIds; + + DvrTests mDvrTests; + DvrTests* mExternalDvrTests = nullptr; + bool mIsSoftwareFe = false; + DvrConfig mDvrConfig; +}; diff --git a/tv/tuner/aidl/vts/functional/LnbTests.cpp b/tv/tuner/aidl/vts/functional/LnbTests.cpp new file mode 100644 index 0000000000..d62e58a055 --- /dev/null +++ b/tv/tuner/aidl/vts/functional/LnbTests.cpp @@ -0,0 +1,112 @@ +/* + * Copyright 2021 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 <log/log.h> + +#include "LnbTests.h" + +ndk::ScopedAStatus LnbCallback::onEvent(LnbEventType lnbEventType) { + android::Mutex::Autolock autoLock(mMsgLock); + ALOGD("[vts] lnb event received. Type: %d", lnbEventType); + mEventReceived = true; + mMsgCondition.signal(); + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus LnbCallback::onDiseqcMessage(const vector<uint8_t>& diseqcMessage) { + string msg(diseqcMessage.begin(), diseqcMessage.end()); + ALOGD("[vts] onDiseqcMessage %s", msg.c_str()); + return ndk::ScopedAStatus::ok(); +} + +AssertionResult LnbTests::getLnbIds(vector<int32_t>& ids) { + ndk::ScopedAStatus status; + status = mService->getLnbIds(&ids); + return AssertionResult(status.isOk()); +} + +AssertionResult LnbTests::openLnbById(int32_t lnbId) { + ndk::ScopedAStatus status; + status = mService->openLnbById(lnbId, &mLnb); + return AssertionResult(status.isOk()); +} + +AssertionResult LnbTests::openLnbByName(string lnbName, int32_t& id) { + ndk::ScopedAStatus status; + vector<int32_t> ids; + status = mService->openLnbByName(lnbName, &ids, &mLnb); + if (status.isOk()) { + id = ids[0]; + } + return AssertionResult(status.isOk()); +} + +AssertionResult LnbTests::setLnbCallback() { + if (!mLnb) { + ALOGW("[vts] Open Lnb first"); + return failure(); + } + mLnbCallback = ndk::SharedRefBase::make<LnbCallback>(); + auto callbackStatus = mLnb->setCallback(mLnbCallback); + return AssertionResult(callbackStatus.isOk()); +} + +AssertionResult LnbTests::setVoltage(LnbVoltage voltage) { + if (!mLnb) { + ALOGW("[vts] Open Lnb first"); + return failure(); + } + ndk::ScopedAStatus status = mLnb->setVoltage(voltage); + return AssertionResult(status.isOk()); +} + +AssertionResult LnbTests::setTone(LnbTone tone) { + if (!mLnb) { + ALOGW("[vts] Open Lnb first"); + return failure(); + } + ndk::ScopedAStatus status = mLnb->setTone(tone); + return AssertionResult(status.isOk()); +} + +AssertionResult LnbTests::setSatellitePosition(LnbPosition position) { + if (!mLnb) { + ALOGW("[vts] Open Lnb first"); + return failure(); + } + ndk::ScopedAStatus status = mLnb->setSatellitePosition(position); + return AssertionResult(status.isOk()); +} + +AssertionResult LnbTests::sendDiseqcMessage(vector<uint8_t> diseqcMsg) { + if (!mLnb) { + ALOGW("[vts] Open Lnb first"); + return failure(); + } + ndk::ScopedAStatus status = mLnb->sendDiseqcMessage(diseqcMsg); + return AssertionResult(status.isOk()); +} + +AssertionResult LnbTests::closeLnb() { + if (!mLnb) { + ALOGW("[vts] Open Lnb first"); + return failure(); + } + ndk::ScopedAStatus status = mLnb->close(); + mLnb = nullptr; + mLnbCallback = nullptr; + return AssertionResult(status.isOk()); +} diff --git a/tv/tuner/aidl/vts/functional/LnbTests.h b/tv/tuner/aidl/vts/functional/LnbTests.h new file mode 100644 index 0000000000..d6b5a259ca --- /dev/null +++ b/tv/tuner/aidl/vts/functional/LnbTests.h @@ -0,0 +1,71 @@ +/* + * Copyright 2021 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/tv/tuner/BnLnbCallback.h> +#include <aidl/android/hardware/tv/tuner/ILnb.h> +#include <aidl/android/hardware/tv/tuner/ITuner.h> +#include <gtest/gtest.h> +#include <log/log.h> +#include <utils/Condition.h> +#include <utils/Mutex.h> +#include <map> + +using android::Condition; +using android::Mutex; + +using ::testing::AssertionResult; + +using namespace aidl::android::hardware::tv::tuner; +using namespace std; + +class LnbCallback : public BnLnbCallback { + public: + virtual ::ndk::ScopedAStatus onEvent(LnbEventType lnbEventType) override; + virtual ::ndk::ScopedAStatus onDiseqcMessage( + const std::vector<uint8_t>& diseqcMessage) override; + + private: + bool mEventReceived = false; + android::Mutex mMsgLock; + android::Condition mMsgCondition; +}; + +class LnbTests { + public: + void setService(std::shared_ptr<ITuner> tuner) { mService = tuner; } + + AssertionResult getLnbIds(vector<int32_t>& ids); + AssertionResult openLnbById(int32_t lnbId); + AssertionResult openLnbByName(string lnbName, int32_t& lnbId); + AssertionResult setLnbCallback(); + AssertionResult setVoltage(LnbVoltage voltage); + AssertionResult setTone(LnbTone tone); + AssertionResult setSatellitePosition(LnbPosition position); + AssertionResult sendDiseqcMessage(vector<uint8_t> diseqcMsg); + AssertionResult closeLnb(); + + protected: + static AssertionResult failure() { return ::testing::AssertionFailure(); } + + static AssertionResult success() { return ::testing::AssertionSuccess(); } + + std::shared_ptr<ITuner> mService; + std::shared_ptr<ILnb> mLnb; + std::shared_ptr<LnbCallback> mLnbCallback; + vector<int32_t> mLnbIds; +}; diff --git a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.cpp b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.cpp new file mode 100644 index 0000000000..85e5c68b6a --- /dev/null +++ b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.cpp @@ -0,0 +1,878 @@ +/* + * Copyright 2021 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 "VtsHalTvTunerTargetTest.h" + +#include <aidl/Gtest.h> +#include <aidl/Vintf.h> +#include <android/binder_manager.h> +#include <android/binder_process.h> + +namespace { + +AssertionResult TunerBroadcastAidlTest::filterDataOutputTest() { + return filterDataOutputTestBase(mFilterTests); +} + +AssertionResult TunerPlaybackAidlTest::filterDataOutputTest() { + return filterDataOutputTestBase(mFilterTests); +} + +AssertionResult TunerDescramblerAidlTest::filterDataOutputTest() { + return filterDataOutputTestBase(mFilterTests); +} + +void TunerFilterAidlTest::configSingleFilterInDemuxTest(FilterConfig filterConf, + FrontendConfig frontendConf) { + int32_t feId; + int32_t demuxId; + std::shared_ptr<IDemux> demux; + int64_t filterId; + + mFrontendTests.getFrontendIdByType(frontendConf.type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + mFilterTests.setDemux(demux); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId)); + ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); + if (filterConf.type.mainType == DemuxFilterMainType::IP) { + ASSERT_TRUE(mFilterTests.configIpFilterCid(filterConf.ipCid, filterId)); + } + if (filterConf.monitorEventTypes > 0) { + ASSERT_TRUE(mFilterTests.configureMonitorEvent(filterId, filterConf.monitorEventTypes)); + } + ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc)); + ASSERT_TRUE(mFilterTests.startFilter(filterId)); + ASSERT_TRUE(mFilterTests.stopFilter(filterId)); + ASSERT_TRUE(mFilterTests.closeFilter(filterId)); + ASSERT_TRUE(mDemuxTests.closeDemux()); + ASSERT_TRUE(mFrontendTests.closeFrontend()); +} + +void TunerFilterAidlTest::reconfigSingleFilterInDemuxTest(FilterConfig filterConf, + FilterConfig filterReconf, + FrontendConfig frontendConf) { + int32_t feId; + int32_t demuxId; + std::shared_ptr<IDemux> demux; + int64_t filterId; + + mFrontendTests.getFrontendIdByType(frontendConf.type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + if (frontendConf.isSoftwareFe) { + mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]); + } + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + mFrontendTests.setDemux(demux); + mFilterTests.setDemux(demux); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId)); + ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); + ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc)); + ASSERT_TRUE(mFilterTests.startFilter(filterId)); + ASSERT_TRUE(mFilterTests.stopFilter(filterId)); + ASSERT_TRUE(mFilterTests.configFilter(filterReconf.settings, filterId)); + ASSERT_TRUE(mFilterTests.startFilter(filterId)); + ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/)); + ASSERT_TRUE(mFilterTests.startIdTest(filterId)); + ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/)); + ASSERT_TRUE(mFilterTests.stopFilter(filterId)); + ASSERT_TRUE(mFilterTests.closeFilter(filterId)); + ASSERT_TRUE(mDemuxTests.closeDemux()); + ASSERT_TRUE(mFrontendTests.closeFrontend()); +} + +void TunerFilterAidlTest::testTimeFilter(TimeFilterConfig filterConf) { + int32_t demuxId; + std::shared_ptr<IDemux> demux; + DemuxCapabilities caps; + + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + ASSERT_TRUE(mDemuxTests.getDemuxCaps(caps)); + ASSERT_TRUE(caps.bTimeFilter); + mFilterTests.setDemux(demux); + ASSERT_TRUE(mFilterTests.openTimeFilterInDemux()); + ASSERT_TRUE(mFilterTests.setTimeStamp(filterConf.timeStamp)); + ASSERT_TRUE(mFilterTests.getTimeStamp()); + ASSERT_TRUE(mFilterTests.clearTimeStamp()); + ASSERT_TRUE(mFilterTests.closeTimeFilter()); + ASSERT_TRUE(mDemuxTests.closeDemux()); +} + +void TunerBroadcastAidlTest::broadcastSingleFilterTest(FilterConfig filterConf, + FrontendConfig frontendConf) { + int32_t feId; + int32_t demuxId; + std::shared_ptr<IDemux> demux; + int64_t filterId; + + mFrontendTests.getFrontendIdByType(frontendConf.type, feId); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + if (mLnbId) { + ASSERT_TRUE(mFrontendTests.setLnb(*mLnbId)); + } + if (frontendConf.isSoftwareFe) { + mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]); + } + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + mFrontendTests.setDemux(demux); + mFilterTests.setDemux(demux); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId)); + ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); + ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc)); + ASSERT_TRUE(mFilterTests.startFilter(filterId)); + // tune test + ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/)); + ASSERT_TRUE(filterDataOutputTest()); + ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/)); + ASSERT_TRUE(mFilterTests.stopFilter(filterId)); + ASSERT_TRUE(mFilterTests.closeFilter(filterId)); + ASSERT_TRUE(mDemuxTests.closeDemux()); + ASSERT_TRUE(mFrontendTests.closeFrontend()); +} + +void TunerBroadcastAidlTest::broadcastSingleFilterTestWithLnb(FilterConfig filterConf, + FrontendConfig frontendConf, + LnbConfig lnbConf) { + if (lnbConf.name.compare(emptyHardwareId) == 0) { + vector<int32_t> ids; + ASSERT_TRUE(mLnbTests.getLnbIds(ids)); + ASSERT_TRUE(ids.size() > 0); + ASSERT_TRUE(mLnbTests.openLnbById(ids[0])); + mLnbId = &ids[0]; + } else { + mLnbId = (int32_t*)malloc(sizeof(int32_t)); + ASSERT_TRUE(mLnbTests.openLnbByName(lnbConf.name, *mLnbId)); + } + ASSERT_TRUE(mLnbTests.setLnbCallback()); + ASSERT_TRUE(mLnbTests.setVoltage(lnbConf.voltage)); + ASSERT_TRUE(mLnbTests.setTone(lnbConf.tone)); + ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConf.position)); + broadcastSingleFilterTest(filterConf, frontendConf); + ASSERT_TRUE(mLnbTests.closeLnb()); + mLnbId = nullptr; +} + +void TunerBroadcastAidlTest::mediaFilterUsingSharedMemoryTest(FilterConfig filterConf, + FrontendConfig frontendConf) { + int32_t feId; + int32_t demuxId; + std::shared_ptr<IDemux> demux; + int64_t filterId; + + mFrontendTests.getFrontendIdByType(frontendConf.type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + if (frontendConf.isSoftwareFe) { + mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]); + } + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + mFrontendTests.setDemux(demux); + mFilterTests.setDemux(demux); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId)); + ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); + ASSERT_TRUE(mFilterTests.getSharedAvMemoryHandle(filterId)); + ASSERT_TRUE(mFilterTests.configAvFilterStreamType(filterConf.streamType, filterId)); + ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc)); + ASSERT_TRUE(mFilterTests.startFilter(filterId)); + // tune test + ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/)); + ASSERT_TRUE(filterDataOutputTest()); + ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/)); + ASSERT_TRUE(mFilterTests.stopFilter(filterId)); + ASSERT_TRUE(mFilterTests.releaseShareAvHandle(filterId)); + ASSERT_TRUE(mFilterTests.closeFilter(filterId)); + ASSERT_TRUE(mDemuxTests.closeDemux()); + ASSERT_TRUE(mFrontendTests.closeFrontend()); +} + +void TunerPlaybackAidlTest::playbackSingleFilterTest(FilterConfig filterConf, DvrConfig dvrConf) { + int32_t demuxId; + std::shared_ptr<IDemux> demux; + int64_t filterId; + + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + mFilterTests.setDemux(demux); + mDvrTests.setDemux(demux); + ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize)); + ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrConf.settings)); + ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor()); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId)); + ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); + ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc)); + mDvrTests.startPlaybackInputThread(dvrConf.playbackInputFile, + dvrConf.settings.get<DvrSettings::Tag::playback>()); + ASSERT_TRUE(mDvrTests.startDvrPlayback()); + ASSERT_TRUE(mFilterTests.startFilter(filterId)); + ASSERT_TRUE(filterDataOutputTest()); + mDvrTests.stopPlaybackThread(); + ASSERT_TRUE(mFilterTests.stopFilter(filterId)); + ASSERT_TRUE(mDvrTests.stopDvrPlayback()); + ASSERT_TRUE(mFilterTests.closeFilter(filterId)); + mDvrTests.closeDvrPlayback(); + ASSERT_TRUE(mDemuxTests.closeDemux()); +} + +void TunerRecordAidlTest::recordSingleFilterTestWithLnb(FilterConfig filterConf, + FrontendConfig frontendConf, + DvrConfig dvrConf, LnbConfig lnbConf) { + if (lnbConf.name.compare(emptyHardwareId) == 0) { + vector<int32_t> ids; + ASSERT_TRUE(mLnbTests.getLnbIds(ids)); + ASSERT_TRUE(ids.size() > 0); + ASSERT_TRUE(mLnbTests.openLnbById(ids[0])); + mLnbId = &ids[0]; + } else { + mLnbId = (int32_t*)malloc(sizeof(int32_t)); + ASSERT_TRUE(mLnbTests.openLnbByName(lnbConf.name, *mLnbId)); + } + ASSERT_TRUE(mLnbTests.setLnbCallback()); + ASSERT_TRUE(mLnbTests.setVoltage(lnbConf.voltage)); + ASSERT_TRUE(mLnbTests.setTone(lnbConf.tone)); + ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConf.position)); + for (auto msgName : lnbRecord.diseqcMsgs) { + ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName])); + } + recordSingleFilterTest(filterConf, frontendConf, dvrConf); + ASSERT_TRUE(mLnbTests.closeLnb()); + mLnbId = nullptr; +} + +void TunerRecordAidlTest::attachSingleFilterToRecordDvrTest(FilterConfig filterConf, + FrontendConfig frontendConf, + DvrConfig dvrConf) { + int32_t demuxId; + std::shared_ptr<IDemux> demux; + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + mDvrTests.setDemux(demux); + + DvrConfig dvrSourceConfig; + if (record.hasFrontendConnection) { + int32_t feId; + mFrontendTests.getFrontendIdByType(frontendConf.type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + } else { + dvrSourceConfig = dvrMap[record.dvrSourceId]; + ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize)); + ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings)); + ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor()); + } + + int64_t filterId; + std::shared_ptr<IFilter> filter; + mFilterTests.setDemux(demux); + + ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize)); + ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings)); + ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor()); + + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId)); + ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); + ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc)); + filter = mFilterTests.getFilterById(filterId); + ASSERT_TRUE(filter != nullptr); + ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter)); + ASSERT_TRUE(mDvrTests.startDvrRecord()); + ASSERT_TRUE(mFilterTests.startFilter(filterId)); + ASSERT_TRUE(mFilterTests.stopFilter(filterId)); + ASSERT_TRUE(mDvrTests.stopDvrRecord()); + ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter)); + ASSERT_TRUE(mFilterTests.closeFilter(filterId)); + mDvrTests.closeDvrRecord(); + ASSERT_TRUE(mDemuxTests.closeDemux()); + + if (record.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.closeFrontend()); + } +} + +void TunerRecordAidlTest::recordSingleFilterTest(FilterConfig filterConf, + FrontendConfig frontendConf, DvrConfig dvrConf) { + int32_t demuxId; + std::shared_ptr<IDemux> demux; + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + mDvrTests.setDemux(demux); + + DvrConfig dvrSourceConfig; + if (record.hasFrontendConnection) { + int32_t feId; + mFrontendTests.getFrontendIdByType(frontendConf.type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + if (frontendConf.isSoftwareFe) { + mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[record.dvrSoftwareFeId]); + } + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + mFrontendTests.setDvrTests(&mDvrTests); + } else { + dvrSourceConfig = dvrMap[record.dvrSourceId]; + ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize)); + ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings)); + ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor()); + } + + int64_t filterId; + std::shared_ptr<IFilter> filter; + mFilterTests.setDemux(demux); + ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize)); + ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings)); + ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor()); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId)); + ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); + ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc)); + filter = mFilterTests.getFilterById(filterId); + ASSERT_TRUE(filter != nullptr); + mDvrTests.startRecordOutputThread(dvrConf.settings.get<DvrSettings::Tag::record>()); + ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter)); + ASSERT_TRUE(mDvrTests.startDvrRecord()); + ASSERT_TRUE(mFilterTests.startFilter(filterId)); + + if (record.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/)); + } else { + // Start DVR Source + mDvrTests.startPlaybackInputThread( + dvrSourceConfig.playbackInputFile, + dvrSourceConfig.settings.get<DvrSettings::Tag::playback>()); + ASSERT_TRUE(mDvrTests.startDvrPlayback()); + } + + mDvrTests.testRecordOutput(); + mDvrTests.stopRecordThread(); + + if (record.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/)); + } else { + mDvrTests.stopPlaybackThread(); + ASSERT_TRUE(mDvrTests.stopDvrPlayback()); + } + + ASSERT_TRUE(mFilterTests.stopFilter(filterId)); + ASSERT_TRUE(mDvrTests.stopDvrRecord()); + ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter)); + ASSERT_TRUE(mFilterTests.closeFilter(filterId)); + mDvrTests.closeDvrRecord(); + + if (record.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.closeFrontend()); + } else { + mDvrTests.closeDvrPlayback(); + } + + ASSERT_TRUE(mDemuxTests.closeDemux()); +} + +void TunerDescramblerAidlTest::scrambledBroadcastTest(set<struct FilterConfig> mediaFilterConfs, + FrontendConfig frontendConf, + DescramblerConfig descConfig) { + int32_t demuxId; + std::shared_ptr<IDemux> demux; + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + + DvrConfig dvrSourceConfig; + if (descrambling.hasFrontendConnection) { + int32_t feId; + mFrontendTests.getFrontendIdByType(frontendConf.type, feId); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + if (frontendConf.isSoftwareFe) { + mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[descrambling.dvrSoftwareFeId]); + } + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + mFrontendTests.setDemux(demux); + } else { + dvrSourceConfig = dvrMap[descrambling.dvrSourceId]; + mDvrTests.setDemux(demux); + ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize)); + ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings)); + ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor()); + } + + set<int64_t> filterIds; + int64_t filterId; + set<struct FilterConfig>::iterator config; + set<int64_t>::iterator id; + mFilterTests.setDemux(demux); + for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) { + ASSERT_TRUE(mFilterTests.openFilterInDemux((*config).type, (*config).bufferSize)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId)); + ASSERT_TRUE(mFilterTests.configFilter((*config).settings, filterId)); + filterIds.insert(filterId); + } + ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId)); + vector<uint8_t> token; + ASSERT_TRUE(mDescramblerTests.getKeyToken(descConfig.casSystemId, descConfig.provisionStr, + descConfig.hidlPvtData, token)); + mDescramblerTests.setKeyToken(token); + vector<DemuxPid> pids; + DemuxPid pid; + for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) { + ASSERT_TRUE(mDescramblerTests.getDemuxPidFromFilterSettings((*config).type, + (*config).settings, pid)); + pids.push_back(pid); + ASSERT_TRUE(mDescramblerTests.addPid(pid, nullptr)); + } + for (id = filterIds.begin(); id != filterIds.end(); id++) { + ASSERT_TRUE(mFilterTests.startFilter(*id)); + } + + if (descrambling.hasFrontendConnection) { + // tune test + ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/)); + } else { + // Start DVR Source + mDvrTests.startPlaybackInputThread( + dvrSourceConfig.playbackInputFile, + dvrSourceConfig.settings.get<DvrSettings::Tag::playback>()); + ASSERT_TRUE(mDvrTests.startDvrPlayback()); + } + + ASSERT_TRUE(filterDataOutputTest()); + + if (descrambling.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/)); + } else { + mDvrTests.stopPlaybackThread(); + ASSERT_TRUE(mDvrTests.stopDvrPlayback()); + } + + for (id = filterIds.begin(); id != filterIds.end(); id++) { + ASSERT_TRUE(mFilterTests.stopFilter(*id)); + } + for (auto pid : pids) { + ASSERT_TRUE(mDescramblerTests.removePid(pid, nullptr)); + } + ASSERT_TRUE(mDescramblerTests.closeDescrambler()); + for (id = filterIds.begin(); id != filterIds.end(); id++) { + ASSERT_TRUE(mFilterTests.closeFilter(*id)); + } + + if (descrambling.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.closeFrontend()); + } else { + mDvrTests.closeDvrPlayback(); + } + + ASSERT_TRUE(mDemuxTests.closeDemux()); +} + +TEST_P(TunerLnbAidlTest, SendDiseqcMessageToLnb) { + description("Open and configure an Lnb with specific settings then send a diseqc msg to it."); + if (!lnbLive.support) { + return; + } + if (lnbMap[lnbLive.lnbId].name.compare(emptyHardwareId) == 0) { + vector<int32_t> ids; + ASSERT_TRUE(mLnbTests.getLnbIds(ids)); + ASSERT_TRUE(ids.size() > 0); + ASSERT_TRUE(mLnbTests.openLnbById(ids[0])); + } else { + int32_t id; + ASSERT_TRUE(mLnbTests.openLnbByName(lnbMap[lnbLive.lnbId].name, id)); + } + ASSERT_TRUE(mLnbTests.setLnbCallback()); + ASSERT_TRUE(mLnbTests.setVoltage(lnbMap[lnbLive.lnbId].voltage)); + ASSERT_TRUE(mLnbTests.setTone(lnbMap[lnbLive.lnbId].tone)); + ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbMap[lnbLive.lnbId].position)); + for (auto msgName : lnbLive.diseqcMsgs) { + ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName])); + } + ASSERT_TRUE(mLnbTests.closeLnb()); +} + +TEST_P(TunerDemuxAidlTest, openDemux) { + description("Open and close a Demux."); + if (!live.hasFrontendConnection) { + return; + } + int32_t feId; + int32_t demuxId; + std::shared_ptr<IDemux> demux; + mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + ASSERT_TRUE(mDemuxTests.closeDemux()); + ASSERT_TRUE(mFrontendTests.closeFrontend()); +} + +TEST_P(TunerDemuxAidlTest, getAvSyncTime) { + description("Get the A/V sync time from a PCR filter."); + if (!live.hasFrontendConnection) { + return; + } + if (live.pcrFilterId.compare(emptyHardwareId) == 0) { + return; + } + int32_t feId; + int32_t demuxId; + std::shared_ptr<IDemux> demux; + int64_t mediaFilterId; + int64_t pcrFilterId; + int32_t avSyncHwId; + std::shared_ptr<IFilter> mediaFilter; + + mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + mFilterTests.setDemux(demux); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.videoFilterId].type, + filterMap[live.videoFilterId].bufferSize)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(mediaFilterId)); + ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.videoFilterId].settings, mediaFilterId)); + mediaFilter = mFilterTests.getFilterById(mediaFilterId); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.pcrFilterId].type, + filterMap[live.pcrFilterId].bufferSize)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(pcrFilterId)); + ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.pcrFilterId].settings, pcrFilterId)); + ASSERT_TRUE(mDemuxTests.getAvSyncId(mediaFilter, avSyncHwId)); + ASSERT_TRUE(pcrFilterId == avSyncHwId); + ASSERT_TRUE(mDemuxTests.getAvSyncTime(pcrFilterId)); + ASSERT_TRUE(mFilterTests.closeFilter(pcrFilterId)); + ASSERT_TRUE(mFilterTests.closeFilter(mediaFilterId)); + ASSERT_TRUE(mDemuxTests.closeDemux()); + ASSERT_TRUE(mFrontendTests.closeFrontend()); +} + +TEST_P(TunerFilterAidlTest, StartFilterInDemux) { + description("Open and start a filter in Demux."); + if (!live.hasFrontendConnection) { + return; + } + // TODO use parameterized tests + configSingleFilterInDemuxTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]); +} + +TEST_P(TunerFilterAidlTest, ConfigIpFilterInDemuxWithCid) { + description("Open and configure an ip filter in Demux."); + // TODO use parameterized tests + if (!live.hasFrontendConnection) { + return; + } + if (live.ipFilterId.compare(emptyHardwareId) == 0) { + return; + } + configSingleFilterInDemuxTest(filterMap[live.ipFilterId], frontendMap[live.frontendId]); +} + +TEST_P(TunerFilterAidlTest, ReconfigFilterToReceiveStartId) { + description("Recofigure and restart a filter to test start id."); + if (!live.hasFrontendConnection) { + return; + } + // TODO use parameterized tests + reconfigSingleFilterInDemuxTest(filterMap[live.videoFilterId], filterMap[live.videoFilterId], + frontendMap[live.frontendId]); +} + +TEST_P(TunerFilterAidlTest, SetFilterLinkage) { + description("Pick up all the possible linkages from the demux caps and set them up."); + DemuxCapabilities caps; + int32_t demuxId; + std::shared_ptr<IDemux> demux; + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + ASSERT_TRUE(mDemuxTests.getDemuxCaps(caps)); + mFilterTests.setDemux(demux); + for (int i = 0; i < caps.linkCaps.size(); i++) { + uint32_t bitMask = 1; + for (int j = 0; j < FILTER_MAIN_TYPE_BIT_COUNT; j++) { + if (caps.linkCaps[i] & (bitMask << j)) { + int64_t sourceFilterId; + int64_t sinkFilterId; + ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(i), FMQ_SIZE_16M)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(sourceFilterId)); + ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(j), FMQ_SIZE_16M)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(sinkFilterId)); + ASSERT_TRUE(mFilterTests.setFilterDataSource(sourceFilterId, sinkFilterId)); + ASSERT_TRUE(mFilterTests.setFilterDataSourceToDemux(sinkFilterId)); + ASSERT_TRUE(mFilterTests.closeFilter(sinkFilterId)); + ASSERT_TRUE(mFilterTests.closeFilter(sourceFilterId)); + } + } + } + ASSERT_TRUE(mDemuxTests.closeDemux()); +} + +TEST_P(TunerFilterAidlTest, testTimeFilter) { + description("Open a timer filter in Demux and set time stamp."); + if (!timeFilter.support) { + return; + } + // TODO use parameterized tests + testTimeFilter(timeFilterMap[timeFilter.timeFilterId]); +} + +TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsSectionFilterTest) { + description("Feed ts data from playback and configure Ts section filter to get output"); + if (!playback.support || playback.sectionFilterId.compare(emptyHardwareId) == 0) { + return; + } + playbackSingleFilterTest(filterMap[playback.sectionFilterId], dvrMap[playback.dvrId]); +} + +TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsAudioFilterTest) { + description("Feed ts data from playback and configure Ts audio filter to get output"); + if (!playback.support) { + return; + } + playbackSingleFilterTest(filterMap[playback.audioFilterId], dvrMap[playback.dvrId]); +} + +TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsVideoFilterTest) { + description("Feed ts data from playback and configure Ts video filter to get output"); + if (!playback.support) { + return; + } + playbackSingleFilterTest(filterMap[playback.videoFilterId], dvrMap[playback.dvrId]); +} + +TEST_P(TunerRecordAidlTest, RecordDataFlowWithTsRecordFilterTest) { + description("Feed ts data from frontend to recording and test with ts record filter"); + if (!record.support) { + return; + } + recordSingleFilterTest(filterMap[record.recordFilterId], frontendMap[record.frontendId], + dvrMap[record.dvrRecordId]); +} + +TEST_P(TunerRecordAidlTest, AttachFiltersToRecordTest) { + description("Attach a single filter to the record dvr test."); + // TODO use parameterized tests + if (!record.support) { + return; + } + attachSingleFilterToRecordDvrTest(filterMap[record.recordFilterId], + frontendMap[record.frontendId], dvrMap[record.dvrRecordId]); +} + +TEST_P(TunerRecordAidlTest, LnbRecordDataFlowWithTsRecordFilterTest) { + description("Feed ts data from Fe with Lnb to recording and test with ts record filter"); + if (!lnbRecord.support) { + return; + } + recordSingleFilterTestWithLnb(filterMap[lnbRecord.recordFilterId], + frontendMap[lnbRecord.frontendId], dvrMap[lnbRecord.dvrRecordId], + lnbMap[lnbRecord.lnbId]); +} + +TEST_P(TunerFrontendAidlTest, TuneFrontend) { + description("Tune one Frontend with specific setting and check Lock event"); + if (!live.hasFrontendConnection) { + return; + } + mFrontendTests.tuneTest(frontendMap[live.frontendId]); +} + +TEST_P(TunerFrontendAidlTest, AutoScanFrontend) { + description("Run an auto frontend scan with specific setting and check lock scanMessage"); + if (!scan.hasFrontendConnection) { + return; + } + mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_AUTO); +} + +TEST_P(TunerFrontendAidlTest, BlindScanFrontend) { + description("Run an blind frontend scan with specific setting and check lock scanMessage"); + if (!scan.hasFrontendConnection) { + return; + } + mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND); +} + +TEST_P(TunerFrontendAidlTest, TuneFrontendWithFrontendSettings) { + description("Tune one Frontend with setting and check Lock event"); + if (!live.hasFrontendConnection) { + return; + } + mFrontendTests.tuneTest(frontendMap[live.frontendId]); +} + +TEST_P(TunerFrontendAidlTest, BlindScanFrontendWithEndFrequency) { + description("Run an blind frontend scan with setting and check lock scanMessage"); + if (!scan.hasFrontendConnection) { + return; + } + mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND); +} + +TEST_P(TunerFrontendAidlTest, LinkToCiCam) { + description("Test Frontend link to CiCam"); + if (!live.hasFrontendConnection) { + return; + } + if (!frontendMap[live.frontendId].canConnectToCiCam) { + return; + } + mFrontendTests.tuneTest(frontendMap[live.frontendId]); +} + +TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowVideoFilterTest) { + description("Test Video Filter functionality in Broadcast use case."); + if (!live.hasFrontendConnection) { + return; + } + broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]); +} + +TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowAudioFilterTest) { + description("Test Audio Filter functionality in Broadcast use case."); + if (!live.hasFrontendConnection) { + return; + } + broadcastSingleFilterTest(filterMap[live.audioFilterId], frontendMap[live.frontendId]); +} + +TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowSectionFilterTest) { + description("Test Section Filter functionality in Broadcast use case."); + if (!live.hasFrontendConnection) { + return; + } + if (live.sectionFilterId.compare(emptyHardwareId) == 0) { + return; + } + broadcastSingleFilterTest(filterMap[live.sectionFilterId], frontendMap[live.frontendId]); +} + +TEST_P(TunerBroadcastAidlTest, IonBufferTest) { + description("Test the av filter data bufferring."); + if (!live.hasFrontendConnection) { + return; + } + broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]); +} + +TEST_P(TunerBroadcastAidlTest, LnbBroadcastDataFlowVideoFilterTest) { + description("Test Video Filter functionality in Broadcast with Lnb use case."); + if (!lnbLive.support) { + return; + } + broadcastSingleFilterTestWithLnb(filterMap[lnbLive.videoFilterId], + frontendMap[lnbLive.frontendId], lnbMap[lnbLive.lnbId]); +} + +TEST_P(TunerBroadcastAidlTest, MediaFilterWithSharedMemoryHandle) { + description("Test the Media Filter with shared memory handle"); + if (!live.hasFrontendConnection) { + return; + } + mediaFilterUsingSharedMemoryTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]); +} + +TEST_P(TunerDescramblerAidlTest, CreateDescrambler) { + description("Create Descrambler"); + if (!descrambling.support) { + return; + } + int32_t demuxId; + std::shared_ptr<IDemux> demux; + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + + if (descrambling.hasFrontendConnection) { + int32_t feId; + mFrontendTests.getFrontendIdByType(frontendMap[descrambling.frontendId].type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + } + + ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId)); + ASSERT_TRUE(mDescramblerTests.closeDescrambler()); + ASSERT_TRUE(mDemuxTests.closeDemux()); + + if (descrambling.hasFrontendConnection) { + ASSERT_TRUE(mFrontendTests.closeFrontend()); + } +} + +TEST_P(TunerDescramblerAidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) { + description("Test ts audio filter in scrambled broadcast use case"); + if (!descrambling.support) { + return; + } + set<FilterConfig> filterConfs; + filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.audioFilterId])); + filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.videoFilterId])); + scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId], + descramblerMap[descrambling.descramblerId]); +} + +INSTANTIATE_TEST_SUITE_P(PerInstance, TunerBroadcastAidlTest, + testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)), + android::PrintInstanceNameToString); + +INSTANTIATE_TEST_SUITE_P(PerInstance, TunerFrontendAidlTest, + testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)), + android::PrintInstanceNameToString); + +INSTANTIATE_TEST_SUITE_P(PerInstance, TunerFilterAidlTest, + testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)), + android::PrintInstanceNameToString); + +INSTANTIATE_TEST_SUITE_P(PerInstance, TunerRecordAidlTest, + testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)), + android::PrintInstanceNameToString); + +INSTANTIATE_TEST_SUITE_P(PerInstance, TunerLnbAidlTest, + testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)), + android::PrintInstanceNameToString); + +INSTANTIATE_TEST_SUITE_P(PerInstance, TunerDemuxAidlTest, + testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)), + android::PrintInstanceNameToString); + +INSTANTIATE_TEST_SUITE_P(PerInstance, TunerPlaybackAidlTest, + testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)), + android::PrintInstanceNameToString); + +INSTANTIATE_TEST_SUITE_P(PerInstance, TunerDescramblerAidlTest, + testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)), + android::PrintInstanceNameToString); + +} // namespace + +// Start thread pool to receive callbacks from AIDL service. +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + ABinderProcess_setThreadPoolMaxThreadCount(1); + ABinderProcess_startThreadPool(); + return RUN_ALL_TESTS(); +} diff --git a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h new file mode 100644 index 0000000000..13c5a801a5 --- /dev/null +++ b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTargetTest.h @@ -0,0 +1,372 @@ +/* + * Copyright 2021 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 <android/binder_manager.h> + +#include "DemuxTests.h" +#include "DescramblerTests.h" +#include "DvrTests.h" +#include "FrontendTests.h" +#include "LnbTests.h" + +using android::sp; + +namespace { + +bool initConfiguration() { + TunerTestingConfigAidlReader1_0::setConfigFilePath(configFilePath); + if (!TunerTestingConfigAidlReader1_0::checkConfigFileExists()) { + return false; + } + initFrontendConfig(); + initFilterConfig(); + initDvrConfig(); + connectHardwaresToTestCases(); + if (!validateConnections()) { + ALOGW("[vts] failed to validate connections."); + return false; + } + return true; +} + +static AssertionResult success() { + return ::testing::AssertionSuccess(); +} + +AssertionResult filterDataOutputTestBase(FilterTests& tests) { + // Data Verify Module + std::map<int64_t, std::shared_ptr<FilterCallback>>::iterator it; + std::map<int64_t, std::shared_ptr<FilterCallback>> filterCallbacks = tests.getFilterCallbacks(); + for (it = filterCallbacks.begin(); it != filterCallbacks.end(); it++) { + it->second->testFilterDataOutput(); + } + return success(); +} + +class TunerLnbAidlTest : public testing::TestWithParam<std::string> { + public: + virtual void SetUp() override { + if (AServiceManager_isDeclared(GetParam().c_str())) { + ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); + mService = ITuner::fromBinder(binder); + } else { + mService = nullptr; + } + ASSERT_NE(mService, nullptr); + ASSERT_TRUE(initConfiguration()); + + mLnbTests.setService(mService); + } + + protected: + static void description(const std::string& description) { + RecordProperty("description", description); + } + + std::shared_ptr<ITuner> mService; + LnbTests mLnbTests; +}; + +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerLnbAidlTest); + +class TunerDemuxAidlTest : public testing::TestWithParam<std::string> { + public: + virtual void SetUp() override { + if (AServiceManager_isDeclared(GetParam().c_str())) { + ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); + mService = ITuner::fromBinder(binder); + } else { + mService = nullptr; + } + ASSERT_NE(mService, nullptr); + ASSERT_TRUE(initConfiguration()); + + mFrontendTests.setService(mService); + mDemuxTests.setService(mService); + mFilterTests.setService(mService); + } + + protected: + static void description(const std::string& description) { + RecordProperty("description", description); + } + + std::shared_ptr<ITuner> mService; + FrontendTests mFrontendTests; + DemuxTests mDemuxTests; + FilterTests mFilterTests; +}; + +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerDemuxAidlTest); + +class TunerFilterAidlTest : public testing::TestWithParam<std::string> { + public: + virtual void SetUp() override { + if (AServiceManager_isDeclared(GetParam().c_str())) { + ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); + mService = ITuner::fromBinder(binder); + } else { + mService = nullptr; + } + ASSERT_NE(mService, nullptr); + initConfiguration(); + + mFrontendTests.setService(mService); + mDemuxTests.setService(mService); + mFilterTests.setService(mService); + } + + protected: + static void description(const std::string& description) { + RecordProperty("description", description); + } + + void configSingleFilterInDemuxTest(FilterConfig filterConf, FrontendConfig frontendConf); + void reconfigSingleFilterInDemuxTest(FilterConfig filterConf, FilterConfig filterReconf, + FrontendConfig frontendConf); + void testTimeFilter(TimeFilterConfig filterConf); + + DemuxFilterType getLinkageFilterType(int bit) { + DemuxFilterType type; + type.mainType = static_cast<DemuxFilterMainType>(1 << bit); + switch (type.mainType) { + case DemuxFilterMainType::TS: + type.subType.set<DemuxFilterSubType::Tag::tsFilterType>( + DemuxTsFilterType::UNDEFINED); + break; + case DemuxFilterMainType::MMTP: + type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>( + DemuxMmtpFilterType::UNDEFINED); + break; + case DemuxFilterMainType::IP: + type.subType.set<DemuxFilterSubType::Tag::ipFilterType>( + DemuxIpFilterType::UNDEFINED); + break; + case DemuxFilterMainType::TLV: + type.subType.set<DemuxFilterSubType::Tag::tlvFilterType>( + DemuxTlvFilterType::UNDEFINED); + break; + case DemuxFilterMainType::ALP: + type.subType.set<DemuxFilterSubType::Tag::alpFilterType>( + DemuxAlpFilterType::UNDEFINED); + break; + default: + break; + } + return type; + } + std::shared_ptr<ITuner> mService; + FrontendTests mFrontendTests; + DemuxTests mDemuxTests; + FilterTests mFilterTests; +}; + +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerFilterAidlTest); + +class TunerPlaybackAidlTest : public testing::TestWithParam<std::string> { + public: + virtual void SetUp() override { + if (AServiceManager_isDeclared(GetParam().c_str())) { + ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); + mService = ITuner::fromBinder(binder); + } else { + mService = nullptr; + } + ASSERT_NE(mService, nullptr); + ASSERT_TRUE(initConfiguration()); + + mFrontendTests.setService(mService); + mDemuxTests.setService(mService); + mFilterTests.setService(mService); + mDvrTests.setService(mService); + } + + protected: + static void description(const std::string& description) { + RecordProperty("description", description); + } + + std::shared_ptr<ITuner> mService; + FrontendTests mFrontendTests; + DemuxTests mDemuxTests; + FilterTests mFilterTests; + DvrTests mDvrTests; + + AssertionResult filterDataOutputTest(); + + void playbackSingleFilterTest(FilterConfig filterConf, DvrConfig dvrConf); +}; + +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerPlaybackAidlTest); + +class TunerRecordAidlTest : public testing::TestWithParam<std::string> { + public: + virtual void SetUp() override { + if (AServiceManager_isDeclared(GetParam().c_str())) { + ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); + mService = ITuner::fromBinder(binder); + } else { + mService = nullptr; + } + ASSERT_NE(mService, nullptr); + initConfiguration(); + + mFrontendTests.setService(mService); + mDemuxTests.setService(mService); + mFilterTests.setService(mService); + mDvrTests.setService(mService); + mLnbTests.setService(mService); + } + + protected: + static void description(const std::string& description) { + RecordProperty("description", description); + } + + void attachSingleFilterToRecordDvrTest(FilterConfig filterConf, FrontendConfig frontendConf, + DvrConfig dvrConf); + void recordSingleFilterTestWithLnb(FilterConfig filterConf, FrontendConfig frontendConf, + DvrConfig dvrConf, LnbConfig lnbConf); + void recordSingleFilterTest(FilterConfig filterConf, FrontendConfig frontendConf, + DvrConfig dvrConf); + + std::shared_ptr<ITuner> mService; + FrontendTests mFrontendTests; + DemuxTests mDemuxTests; + FilterTests mFilterTests; + DvrTests mDvrTests; + LnbTests mLnbTests; + + private: + int32_t* mLnbId = nullptr; +}; + +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerRecordAidlTest); + +class TunerFrontendAidlTest : public testing::TestWithParam<std::string> { + public: + virtual void SetUp() override { + if (AServiceManager_isDeclared(GetParam().c_str())) { + ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); + mService = ITuner::fromBinder(binder); + } else { + mService = nullptr; + } + ASSERT_NE(mService, nullptr); + initConfiguration(); + + mFrontendTests.setService(mService); + } + + protected: + static void description(const std::string& description) { + RecordProperty("description", description); + } + + std::shared_ptr<ITuner> mService; + FrontendTests mFrontendTests; +}; + +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerFrontendAidlTest); + +class TunerBroadcastAidlTest : public testing::TestWithParam<std::string> { + public: + virtual void SetUp() override { + if (AServiceManager_isDeclared(GetParam().c_str())) { + ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); + mService = ITuner::fromBinder(binder); + } else { + mService = nullptr; + } + ASSERT_NE(mService, nullptr); + initConfiguration(); + + mFrontendTests.setService(mService); + mDemuxTests.setService(mService); + mFilterTests.setService(mService); + mLnbTests.setService(mService); + mDvrTests.setService(mService); + } + + protected: + static void description(const std::string& description) { + RecordProperty("description", description); + } + + std::shared_ptr<ITuner> mService; + FrontendTests mFrontendTests; + DemuxTests mDemuxTests; + FilterTests mFilterTests; + LnbTests mLnbTests; + DvrTests mDvrTests; + + AssertionResult filterDataOutputTest(); + + void broadcastSingleFilterTest(FilterConfig filterConf, FrontendConfig frontendConf); + void broadcastSingleFilterTestWithLnb(FilterConfig filterConf, FrontendConfig frontendConf, + LnbConfig lnbConf); + void mediaFilterUsingSharedMemoryTest(FilterConfig filterConf, FrontendConfig frontendConf); + + private: + int32_t* mLnbId = nullptr; +}; + +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerBroadcastAidlTest); + +class TunerDescramblerAidlTest : public testing::TestWithParam<std::string> { + public: + virtual void SetUp() override { + if (AServiceManager_isDeclared(GetParam().c_str())) { + ::ndk::SpAIBinder binder(AServiceManager_waitForService(GetParam().c_str())); + mService = ITuner::fromBinder(binder); + } else { + mService = nullptr; + } + mCasService = IMediaCasService::getService(); + ASSERT_NE(mService, nullptr); + ASSERT_NE(mCasService, nullptr); + ASSERT_TRUE(initConfiguration()); + + mFrontendTests.setService(mService); + mDemuxTests.setService(mService); + mDvrTests.setService(mService); + mDescramblerTests.setService(mService); + mDescramblerTests.setCasService(mCasService); + } + + protected: + static void description(const std::string& description) { + RecordProperty("description", description); + } + + void scrambledBroadcastTest(set<struct FilterConfig> mediaFilterConfs, + FrontendConfig frontendConf, DescramblerConfig descConfig); + AssertionResult filterDataOutputTest(); + + std::shared_ptr<ITuner> mService; + android::sp<IMediaCasService> mCasService; + FrontendTests mFrontendTests; + DemuxTests mDemuxTests; + FilterTests mFilterTests; + DescramblerTests mDescramblerTests; + DvrTests mDvrTests; +}; + +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerDescramblerAidlTest); + +} // namespace diff --git a/tv/tuner/aidl/vts/functional/VtsHalTvTunerTestConfigurations.h b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTestConfigurations.h new file mode 100644 index 0000000000..b4fb54f5a0 --- /dev/null +++ b/tv/tuner/aidl/vts/functional/VtsHalTvTunerTestConfigurations.h @@ -0,0 +1,218 @@ +/* + * Copyright 2021 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 <binder/MemoryDealer.h> + +#include "../../../config/TunerTestingConfigAidlReaderV1_0.h" + +#include <aidl/android/hardware/tv/tuner/DataFormat.h> +#include <aidl/android/hardware/tv/tuner/DemuxAlpFilterType.h> +#include <aidl/android/hardware/tv/tuner/DemuxFilterMainType.h> +#include <aidl/android/hardware/tv/tuner/DemuxFilterMonitorEventType.h> +#include <aidl/android/hardware/tv/tuner/DemuxFilterSettings.h> +#include <aidl/android/hardware/tv/tuner/DemuxFilterType.h> +#include <aidl/android/hardware/tv/tuner/DemuxIpAddress.h> +#include <aidl/android/hardware/tv/tuner/DemuxIpFilterSettings.h> +#include <aidl/android/hardware/tv/tuner/DemuxIpFilterType.h> +#include <aidl/android/hardware/tv/tuner/DemuxMmtpFilterType.h> +#include <aidl/android/hardware/tv/tuner/DemuxRecordScIndexType.h> +#include <aidl/android/hardware/tv/tuner/DemuxTsFilterType.h> +#include <aidl/android/hardware/tv/tuner/DvrSettings.h> +#include <aidl/android/hardware/tv/tuner/DvrType.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtBandwidth.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtCoderate.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtConstellation.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtGuardInterval.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtHierarchy.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtSettings.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtStandard.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.h> +#include <aidl/android/hardware/tv/tuner/FrontendSettings.h> +#include <aidl/android/hardware/tv/tuner/FrontendType.h> +#include <aidl/android/hardware/tv/tuner/PlaybackSettings.h> +#include <aidl/android/hardware/tv/tuner/RecordSettings.h> + +using namespace std; +using namespace aidl::android::hardware::tv::tuner; +using namespace android::media::tuner::testing::configuration::V1_0; + +const int32_t FMQ_SIZE_4M = 0x400000; +const int32_t FMQ_SIZE_16M = 0x1000000; + +const string configFilePath = "/vendor/etc/tuner_vts_config_1_1.xml"; + +#define FILTER_MAIN_TYPE_BIT_COUNT 5 + +// Hardware configs +static map<string, FrontendConfig> frontendMap; +static map<string, FilterConfig> filterMap; +static map<string, DvrConfig> dvrMap; +static map<string, LnbConfig> lnbMap; +static map<string, TimeFilterConfig> timeFilterMap; +static map<string, vector<uint8_t>> diseqcMsgMap; +static map<string, DescramblerConfig> descramblerMap; + +// Hardware and test cases connections +static LiveBroadcastHardwareConnections live; +static ScanHardwareConnections scan; +static DvrPlaybackHardwareConnections playback; +static DvrRecordHardwareConnections record; +static DescramblingHardwareConnections descrambling; +static LnbLiveHardwareConnections lnbLive; +static LnbRecordHardwareConnections lnbRecord; +static TimeFilterHardwareConnections timeFilter; + +/** Config all the frontends that would be used in the tests */ +inline void initFrontendConfig() { + // The test will use the internal default fe when default fe is connected to any data flow + // without overriding in the xml config. + string defaultFeId = "FE_DEFAULT"; + FrontendDvbtSettings dvbtSettings{ + .frequency = 578000, + .transmissionMode = FrontendDvbtTransmissionMode::AUTO, + .bandwidth = FrontendDvbtBandwidth::BANDWIDTH_8MHZ, + .isHighPriority = true, + }; + frontendMap[defaultFeId].type = FrontendType::DVBT; + frontendMap[defaultFeId].settings.set<FrontendSettings::Tag::dvbt>(dvbtSettings); + + vector<FrontendStatusType> types; + types.push_back(FrontendStatusType::UEC); + types.push_back(FrontendStatusType::IS_MISO); + + vector<FrontendStatus> statuses; + FrontendStatus status; + status.set<FrontendStatus::Tag::uec>(4); + statuses.push_back(status); + status.set<FrontendStatus::Tag::isMiso>(true); + statuses.push_back(status); + + frontendMap[defaultFeId].tuneStatusTypes = types; + frontendMap[defaultFeId].expectTuneStatuses = statuses; + frontendMap[defaultFeId].isSoftwareFe = true; + frontendMap[defaultFeId].canConnectToCiCam = true; + frontendMap[defaultFeId].ciCamId = 0; + FrontendDvbtSettings dvbt; + dvbt.transmissionMode = FrontendDvbtTransmissionMode::MODE_8K_E; + frontendMap[defaultFeId].settings.set<FrontendSettings::Tag::dvbt>(dvbt); + // Read customized config + TunerTestingConfigAidlReader1_0::readFrontendConfig1_0(frontendMap); +}; + +inline void initFilterConfig() { + // The test will use the internal default filter when default filter is connected to any + // data flow without overriding in the xml config. + string defaultAudioFilterId = "FILTER_AUDIO_DEFAULT"; + string defaultVideoFilterId = "FILTER_VIDEO_DEFAULT"; + + filterMap[defaultVideoFilterId].type.mainType = DemuxFilterMainType::TS; + filterMap[defaultVideoFilterId].type.subType.set<DemuxFilterSubType::Tag::tsFilterType>( + DemuxTsFilterType::VIDEO); + filterMap[defaultVideoFilterId].bufferSize = FMQ_SIZE_16M; + filterMap[defaultVideoFilterId].settings = + DemuxFilterSettings::make<DemuxFilterSettings::Tag::ts>(); + filterMap[defaultVideoFilterId].settings.get<DemuxFilterSettings::Tag::ts>().tpid = 256; + DemuxFilterAvSettings video; + video.isPassthrough = false; + filterMap[defaultVideoFilterId] + .settings.get<DemuxFilterSettings::Tag::ts>() + .filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>(video); + filterMap[defaultVideoFilterId].monitorEventTypes = + static_cast<int32_t>(DemuxFilterMonitorEventType::SCRAMBLING_STATUS) | + static_cast<int32_t>(DemuxFilterMonitorEventType::IP_CID_CHANGE); + filterMap[defaultVideoFilterId].streamType.set<AvStreamType::Tag::video>( + VideoStreamType::MPEG1); + + filterMap[defaultAudioFilterId].type.mainType = DemuxFilterMainType::TS; + filterMap[defaultAudioFilterId].type.subType.set<DemuxFilterSubType::Tag::tsFilterType>( + DemuxTsFilterType::AUDIO); + filterMap[defaultAudioFilterId].bufferSize = FMQ_SIZE_16M; + filterMap[defaultAudioFilterId].settings = + DemuxFilterSettings::make<DemuxFilterSettings::Tag::ts>(); + filterMap[defaultAudioFilterId].settings.get<DemuxFilterSettings::Tag::ts>().tpid = 256; + DemuxFilterAvSettings audio; + audio.isPassthrough = false; + filterMap[defaultAudioFilterId] + .settings.get<DemuxFilterSettings::Tag::ts>() + .filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>(audio); + filterMap[defaultAudioFilterId].monitorEventTypes = + static_cast<int32_t>(DemuxFilterMonitorEventType::SCRAMBLING_STATUS) | + static_cast<int32_t>(DemuxFilterMonitorEventType::IP_CID_CHANGE); + filterMap[defaultAudioFilterId].streamType.set<AvStreamType::Tag::audio>(AudioStreamType::MP3); + // Read customized config + TunerTestingConfigAidlReader1_0::readFilterConfig1_0(filterMap); +}; + +/** Config all the dvrs that would be used in the tests */ +inline void initDvrConfig() { + // Read customized config + TunerTestingConfigAidlReader1_0::readDvrConfig1_0(dvrMap); +}; + +/** Read the vendor configurations of which hardware to use for each test cases/data flows */ +inline void connectHardwaresToTestCases() { + TunerTestingConfigAidlReader1_0::connectLiveBroadcast(live); + TunerTestingConfigAidlReader1_0::connectScan(scan); + TunerTestingConfigAidlReader1_0::connectDvrRecord(record); +}; + +inline bool validateConnections() { + if (record.support && !record.hasFrontendConnection && + record.dvrSourceId.compare(emptyHardwareId) == 0) { + ALOGW("[vts config] Record must support either a DVR source or a Frontend source."); + return false; + } + bool feIsValid = frontendMap.find(live.frontendId) != frontendMap.end() && + frontendMap.find(scan.frontendId) != frontendMap.end(); + feIsValid &= record.support ? frontendMap.find(record.frontendId) != frontendMap.end() : true; + + if (!feIsValid) { + ALOGW("[vts config] dynamic config fe connection is invalid."); + return false; + } + + bool dvrIsValid = frontendMap[live.frontendId].isSoftwareFe + ? dvrMap.find(live.dvrSoftwareFeId) != dvrMap.end() + : true; + + if (record.support) { + if (record.hasFrontendConnection) { + if (frontendMap[record.frontendId].isSoftwareFe) { + dvrIsValid &= dvrMap.find(record.dvrSoftwareFeId) != dvrMap.end(); + } + } else { + dvrIsValid &= dvrMap.find(record.dvrSourceId) != dvrMap.end(); + } + dvrIsValid &= dvrMap.find(record.dvrRecordId) != dvrMap.end(); + } + + if (!dvrIsValid) { + ALOGW("[vts config] dynamic config dvr connection is invalid."); + return false; + } + + bool filterIsValid = filterMap.find(live.audioFilterId) != filterMap.end() && + filterMap.find(live.videoFilterId) != filterMap.end(); + filterIsValid &= + record.support ? filterMap.find(record.recordFilterId) != filterMap.end() : true; + + if (!filterIsValid) { + ALOGW("[vts config] dynamic config filter connection is invalid."); + return false; + } + + return true; +} diff --git a/tv/tuner/config/OWNERS b/tv/tuner/config/OWNERS index 1b3d095f9c..bf2b609f3e 100644 --- a/tv/tuner/config/OWNERS +++ b/tv/tuner/config/OWNERS @@ -1,4 +1,3 @@ -nchalko@google.com -amyjojo@google.com +hgchen@google.com shubang@google.com quxiangfang@google.com diff --git a/tv/tuner/config/TunerTestingConfigAidlReaderV1_0.h b/tv/tuner/config/TunerTestingConfigAidlReaderV1_0.h new file mode 100644 index 0000000000..2d7be9e5fa --- /dev/null +++ b/tv/tuner/config/TunerTestingConfigAidlReaderV1_0.h @@ -0,0 +1,1000 @@ +/* + * Copyright 2021 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 <android-base/logging.h> +#include <android_media_tuner_testing_configuration_V1_0.h> +#include <android_media_tuner_testing_configuration_V1_0_enums.h> + +#include <aidl/android/hardware/tv/tuner/DataFormat.h> +#include <aidl/android/hardware/tv/tuner/DemuxAlpFilterType.h> +#include <aidl/android/hardware/tv/tuner/DemuxFilterAvSettings.h> +#include <aidl/android/hardware/tv/tuner/DemuxFilterEvent.h> +#include <aidl/android/hardware/tv/tuner/DemuxFilterMainType.h> +#include <aidl/android/hardware/tv/tuner/DemuxFilterRecordSettings.h> +#include <aidl/android/hardware/tv/tuner/DemuxFilterSectionSettings.h> +#include <aidl/android/hardware/tv/tuner/DemuxFilterSettings.h> +#include <aidl/android/hardware/tv/tuner/DemuxFilterType.h> +#include <aidl/android/hardware/tv/tuner/DemuxIpAddress.h> +#include <aidl/android/hardware/tv/tuner/DemuxIpFilterSettings.h> +#include <aidl/android/hardware/tv/tuner/DemuxIpFilterType.h> +#include <aidl/android/hardware/tv/tuner/DemuxMmtpFilterType.h> +#include <aidl/android/hardware/tv/tuner/DemuxRecordScIndexType.h> +#include <aidl/android/hardware/tv/tuner/DemuxTlvFilterType.h> +#include <aidl/android/hardware/tv/tuner/DemuxTsFilterType.h> +#include <aidl/android/hardware/tv/tuner/DvrSettings.h> +#include <aidl/android/hardware/tv/tuner/DvrType.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbsSettings.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtBandwidth.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtCoderate.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtConstellation.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtGuardInterval.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtHierarchy.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtPlpMode.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtSettings.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtStandard.h> +#include <aidl/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.h> +#include <aidl/android/hardware/tv/tuner/FrontendSettings.h> +#include <aidl/android/hardware/tv/tuner/FrontendStatus.h> +#include <aidl/android/hardware/tv/tuner/FrontendStatusType.h> +#include <aidl/android/hardware/tv/tuner/FrontendType.h> +#include <aidl/android/hardware/tv/tuner/LnbPosition.h> +#include <aidl/android/hardware/tv/tuner/LnbTone.h> +#include <aidl/android/hardware/tv/tuner/LnbVoltage.h> +#include <aidl/android/hardware/tv/tuner/PlaybackSettings.h> +#include <aidl/android/hardware/tv/tuner/RecordSettings.h> + +using namespace std; +using namespace aidl::android::hardware::tv::tuner; +using namespace android::media::tuner::testing::configuration::V1_0; + +const string emptyHardwareId = ""; + +static string mConfigFilePath; + +#define PROVISION_STR \ + "{ " \ + " \"id\": 21140844, " \ + " \"name\": \"Test Title\", " \ + " \"lowercase_organization_name\": \"Android\", " \ + " \"asset_key\": { " \ + " \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \ + " }, " \ + " \"cas_type\": 1, " \ + " \"track_types\": [ ] " \ + "} " + +struct FrontendConfig { + bool isSoftwareFe; + FrontendType type; + bool canConnectToCiCam; + int32_t ciCamId; + FrontendSettings settings; + vector<FrontendStatusType> tuneStatusTypes; + vector<FrontendStatus> expectTuneStatuses; +}; + +struct FilterConfig { + int32_t bufferSize; + DemuxFilterType type; + DemuxFilterSettings settings; + bool getMqDesc; + AvStreamType streamType; + int32_t ipCid; + int32_t monitorEventTypes; + + bool operator<(const FilterConfig& /*c*/) const { return false; } +}; + +struct DvrConfig { + DvrType type; + int32_t bufferSize; + DvrSettings settings; + string playbackInputFile; +}; + +struct LnbConfig { + string name; + LnbVoltage voltage; + LnbTone tone; + LnbPosition position; +}; + +struct TimeFilterConfig { + int64_t timeStamp; +}; + +struct DescramblerConfig { + int32_t casSystemId; + string provisionStr; + vector<uint8_t> hidlPvtData; +}; + +struct LiveBroadcastHardwareConnections { + bool hasFrontendConnection; + string frontendId; + string dvrSoftwareFeId; + string audioFilterId; + string videoFilterId; + string sectionFilterId; + string ipFilterId; + string pcrFilterId; + /* list string of extra filters; */ +}; + +struct ScanHardwareConnections { + bool hasFrontendConnection; + string frontendId; +}; + +struct DvrPlaybackHardwareConnections { + bool support; + string frontendId; + string dvrId; + string audioFilterId; + string videoFilterId; + string sectionFilterId; + /* list string of extra filters; */ +}; + +struct DvrRecordHardwareConnections { + bool support; + bool hasFrontendConnection; + string frontendId; + string dvrRecordId; + string dvrSoftwareFeId; + string recordFilterId; + string dvrSourceId; +}; + +struct DescramblingHardwareConnections { + bool support; + bool hasFrontendConnection; + string frontendId; + string dvrSoftwareFeId; + string audioFilterId; + string videoFilterId; + string descramblerId; + string dvrSourceId; + /* list string of extra filters; */ +}; + +struct LnbLiveHardwareConnections { + bool support; + string frontendId; + string audioFilterId; + string videoFilterId; + string lnbId; + vector<string> diseqcMsgs; + /* list string of extra filters; */ +}; + +struct LnbRecordHardwareConnections { + bool support; + string frontendId; + string dvrRecordId; + string recordFilterId; + string lnbId; + vector<string> diseqcMsgs; + /* list string of extra filters; */ +}; + +struct TimeFilterHardwareConnections { + bool support; + string timeFilterId; +}; + +struct TunerTestingConfigAidlReader1_0 { + public: + static void setConfigFilePath(string path) { mConfigFilePath = path; } + + static bool checkConfigFileExists() { + auto res = read(mConfigFilePath.c_str()); + if (res == nullopt) { + ALOGW("[ConfigReader] Couldn't read %s." + "Please check tuner_testing_dynamic_configuration.xsd" + "and sample_tuner_vts_config.xml for more details on how to config Tune VTS.", + mConfigFilePath.c_str()); + } + return (res != nullopt); + } + + static TunerConfiguration getTunerConfig() { return *read(mConfigFilePath.c_str()); } + + static DataFlowConfiguration getDataFlowConfiguration() { + return *getTunerConfig().getFirstDataFlowConfiguration(); + } + + static HardwareConfiguration getHardwareConfig() { + return *getTunerConfig().getFirstHardwareConfiguration(); + } + + static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) { + auto hardwareConfig = getHardwareConfig(); + if (hardwareConfig.hasFrontends()) { + // TODO: b/182519645 complete the tune status config + vector<FrontendStatusType> types; + vector<FrontendStatus> statuses; + + types.push_back(FrontendStatusType::DEMOD_LOCK); + types.push_back(FrontendStatusType::UEC); + types.push_back(FrontendStatusType::IS_MISO); + + FrontendStatus status; + status.set<FrontendStatus::Tag::isDemodLocked>(true); + statuses.push_back(status); + status.set<FrontendStatus::Tag::uec>(4); + statuses.push_back(status); + status.set<FrontendStatus::Tag::isMiso>(true); + statuses.push_back(status); + + auto frontends = *hardwareConfig.getFirstFrontends(); + for (auto feConfig : frontends.getFrontend()) { + string id = feConfig.getId(); + if (id.compare(string("FE_DEFAULT")) == 0) { + // overrid default + frontendMap.erase(string("FE_DEFAULT")); + } + FrontendType type; + switch (feConfig.getType()) { + case FrontendTypeEnum::UNDEFINED: + type = FrontendType::UNDEFINED; + break; + // TODO: b/182519645 finish all other frontend settings + case FrontendTypeEnum::ANALOG: + type = FrontendType::ANALOG; + break; + case FrontendTypeEnum::ATSC: + type = FrontendType::ATSC; + break; + case FrontendTypeEnum::ATSC3: + type = FrontendType::ATSC3; + break; + case FrontendTypeEnum::DVBC: + type = FrontendType::DVBC; + break; + case FrontendTypeEnum::DVBS: + type = FrontendType::DVBS; + frontendMap[id].settings.set<FrontendSettings::Tag::dvbs>( + readDvbsFrontendSettings(feConfig)); + break; + case FrontendTypeEnum::DVBT: { + type = FrontendType::DVBT; + frontendMap[id].settings.set<FrontendSettings::Tag::dvbt>( + readDvbtFrontendSettings(feConfig)); + break; + } + case FrontendTypeEnum::ISDBS: + type = FrontendType::ISDBS; + break; + case FrontendTypeEnum::ISDBS3: + type = FrontendType::ISDBS3; + break; + case FrontendTypeEnum::ISDBT: + type = FrontendType::ISDBT; + break; + case FrontendTypeEnum::DTMB: + type = FrontendType::DTMB; + break; + case FrontendTypeEnum::UNKNOWN: + ALOGW("[ConfigReader] invalid frontend type"); + return; + default: + ALOGW("[ConfigReader] fe already handled in 1_0 reader."); + break; + } + frontendMap[id].type = type; + frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend(); + // TODO: b/182519645 complete the tune status config + frontendMap[id].tuneStatusTypes = types; + frontendMap[id].expectTuneStatuses = statuses; + getCiCamInfo(feConfig, frontendMap[id].canConnectToCiCam, frontendMap[id].ciCamId); + } + } + } + + static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) { + auto hardwareConfig = getHardwareConfig(); + if (hardwareConfig.hasFilters()) { + auto filters = *hardwareConfig.getFirstFilters(); + for (auto filterConfig : filters.getFilter()) { + string id = filterConfig.getId(); + if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) { + // overrid default + filterMap.erase(string("FILTER_AUDIO_DEFAULT")); + } + if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) { + // overrid default + filterMap.erase(string("FILTER_VIDEO_DEFAULT")); + } + + DemuxFilterType type; + DemuxFilterSettings settings; + if (!readFilterTypeAndSettings(filterConfig, type, settings)) { + ALOGW("[ConfigReader] invalid filter type"); + return; + } + filterMap[id].type = type; + filterMap[id].bufferSize = filterConfig.getBufferSize(); + filterMap[id].getMqDesc = filterConfig.getUseFMQ(); + filterMap[id].settings = settings; + + if (filterConfig.hasMonitorEventTypes()) { + filterMap[id].monitorEventTypes = (uint32_t)filterConfig.getMonitorEventTypes(); + } + if (filterConfig.hasAvFilterSettings_optional()) { + auto av = filterConfig.getFirstAvFilterSettings_optional(); + if (av->hasAudioStreamType_optional()) { + filterMap[id].streamType.set<AvStreamType::Tag::audio>( + static_cast<AudioStreamType>(av->getAudioStreamType_optional())); + } + if (av->hasVideoStreamType_optional()) { + filterMap[id].streamType.set<AvStreamType::Tag::video>( + static_cast<VideoStreamType>(av->getVideoStreamType_optional())); + } + } + if (filterConfig.hasIpFilterConfig_optional()) { + auto ip = filterConfig.getFirstIpFilterConfig_optional(); + if (ip->hasIpCid()) { + filterMap[id].ipCid = ip->getIpCid(); + } + } + } + } + } + + static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) { + auto hardwareConfig = getHardwareConfig(); + if (hardwareConfig.hasDvrs()) { + auto dvrs = *hardwareConfig.getFirstDvrs(); + for (auto dvrConfig : dvrs.getDvr()) { + string id = dvrConfig.getId(); + DvrType type; + switch (dvrConfig.getType()) { + case DvrTypeEnum::PLAYBACK: + type = DvrType::PLAYBACK; + dvrMap[id].settings.set<DvrSettings::Tag::playback>( + readPlaybackSettings(dvrConfig)); + break; + case DvrTypeEnum::RECORD: + type = DvrType::RECORD; + dvrMap[id].settings.set<DvrSettings::Tag::record>( + readRecordSettings(dvrConfig)); + break; + case DvrTypeEnum::UNKNOWN: + ALOGW("[ConfigReader] invalid DVR type"); + return; + } + dvrMap[id].type = type; + dvrMap[id].bufferSize = static_cast<uint32_t>(dvrConfig.getBufferSize()); + if (dvrConfig.hasInputFilePath()) { + dvrMap[id].playbackInputFile = dvrConfig.getInputFilePath(); + } + } + } + } + + static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) { + auto hardwareConfig = getHardwareConfig(); + if (hardwareConfig.hasLnbs()) { + auto lnbs = *hardwareConfig.getFirstLnbs(); + for (auto lnbConfig : lnbs.getLnb()) { + string id = lnbConfig.getId(); + if (lnbConfig.hasName()) { + lnbMap[id].name = lnbConfig.getName(); + } else { + lnbMap[id].name = emptyHardwareId; + } + lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage()); + lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone()); + lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition()); + } + } + } + + static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) { + auto hardwareConfig = getHardwareConfig(); + if (hardwareConfig.hasDescramblers()) { + auto descramblers = *hardwareConfig.getFirstDescramblers(); + for (auto descramblerConfig : descramblers.getDescrambler()) { + string id = descramblerConfig.getId(); + descramblerMap[id].casSystemId = + static_cast<uint32_t>(descramblerConfig.getCasSystemId()); + if (descramblerConfig.hasProvisionStr()) { + descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr(); + } else { + descramblerMap[id].provisionStr = PROVISION_STR; + } + if (descramblerConfig.hasSesstionPrivatData()) { + auto privateData = descramblerConfig.getSesstionPrivatData(); + int size = privateData.size(); + descramblerMap[id].hidlPvtData.resize(size); + memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size); + } else { + descramblerMap[id].hidlPvtData.resize(256); + } + } + } + } + + static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) { + auto hardwareConfig = getHardwareConfig(); + if (hardwareConfig.hasDiseqcMessages()) { + auto msgs = *hardwareConfig.getFirstDiseqcMessages(); + for (auto msgConfig : msgs.getDiseqcMessage()) { + string name = msgConfig.getMsgName(); + for (uint8_t atom : msgConfig.getMsgBody()) { + diseqcMsgMap[name].push_back(atom); + } + } + } + } + + static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) { + auto hardwareConfig = getHardwareConfig(); + if (hardwareConfig.hasTimeFilters()) { + auto timeFilters = *hardwareConfig.getFirstTimeFilters(); + for (auto timeFilterConfig : timeFilters.getTimeFilter()) { + string id = timeFilterConfig.getId(); + timeFilterMap[id].timeStamp = + static_cast<uint64_t>(timeFilterConfig.getTimeStamp()); + } + } + } + + static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) { + auto dataFlow = getDataFlowConfiguration(); + if (dataFlow.hasClearLiveBroadcast()) { + live.hasFrontendConnection = true; + } else { + live.hasFrontendConnection = false; + return; + } + auto liveConfig = *dataFlow.getFirstClearLiveBroadcast(); + live.frontendId = liveConfig.getFrontendConnection(); + + live.audioFilterId = liveConfig.getAudioFilterConnection(); + live.videoFilterId = liveConfig.getVideoFilterConnection(); + if (liveConfig.hasPcrFilterConnection()) { + live.pcrFilterId = liveConfig.getPcrFilterConnection(); + } else { + live.pcrFilterId = emptyHardwareId; + } + if (liveConfig.hasSectionFilterConnection()) { + live.sectionFilterId = liveConfig.getSectionFilterConnection(); + } else { + live.sectionFilterId = emptyHardwareId; + } + if (liveConfig.hasDvrSoftwareFeConnection()) { + live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection(); + } + if (liveConfig.hasIpFilterConnection()) { + live.ipFilterId = liveConfig.getIpFilterConnection(); + } else { + live.ipFilterId = emptyHardwareId; + } + } + + static void connectScan(ScanHardwareConnections& scan) { + auto dataFlow = getDataFlowConfiguration(); + if (dataFlow.hasScan()) { + scan.hasFrontendConnection = true; + } else { + scan.hasFrontendConnection = false; + return; + } + auto scanConfig = *dataFlow.getFirstScan(); + scan.frontendId = scanConfig.getFrontendConnection(); + } + + static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) { + auto dataFlow = getDataFlowConfiguration(); + if (dataFlow.hasDvrPlayback()) { + playback.support = true; + } else { + playback.support = false; + return; + } + auto playbackConfig = *dataFlow.getFirstDvrPlayback(); + playback.dvrId = playbackConfig.getDvrConnection(); + playback.audioFilterId = playbackConfig.getAudioFilterConnection(); + playback.videoFilterId = playbackConfig.getVideoFilterConnection(); + if (playbackConfig.hasSectionFilterConnection()) { + playback.sectionFilterId = playbackConfig.getSectionFilterConnection(); + } else { + playback.sectionFilterId = emptyHardwareId; + } + } + + static void connectDvrRecord(DvrRecordHardwareConnections& record) { + auto dataFlow = getDataFlowConfiguration(); + if (dataFlow.hasDvrRecord()) { + record.support = true; + } else { + record.support = false; + return; + } + auto recordConfig = *dataFlow.getFirstDvrRecord(); + record.recordFilterId = recordConfig.getRecordFilterConnection(); + record.dvrRecordId = recordConfig.getDvrRecordConnection(); + if (recordConfig.hasDvrSoftwareFeConnection()) { + record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection(); + } + if (recordConfig.getHasFrontendConnection()) { + record.hasFrontendConnection = true; + record.dvrSourceId = emptyHardwareId; + record.frontendId = recordConfig.getFrontendConnection(); + } else { + record.hasFrontendConnection = false; + record.dvrSourceId = recordConfig.getDvrSourceConnection(); + } + } + + static void connectDescrambling(DescramblingHardwareConnections& descrambling) { + auto dataFlow = getDataFlowConfiguration(); + if (dataFlow.hasDescrambling()) { + descrambling.support = true; + } else { + descrambling.support = false; + return; + } + auto descConfig = *dataFlow.getFirstDescrambling(); + descrambling.descramblerId = descConfig.getDescramblerConnection(); + descrambling.audioFilterId = descConfig.getAudioFilterConnection(); + descrambling.videoFilterId = descConfig.getVideoFilterConnection(); + if (descConfig.hasDvrSoftwareFeConnection()) { + descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection(); + } + if (descConfig.getHasFrontendConnection()) { + descrambling.hasFrontendConnection = true; + descrambling.dvrSourceId = emptyHardwareId; + descrambling.frontendId = descConfig.getFrontendConnection(); + } else { + descrambling.hasFrontendConnection = false; + descrambling.dvrSourceId = descConfig.getDvrSourceConnection(); + } + } + + static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) { + auto dataFlow = getDataFlowConfiguration(); + if (dataFlow.hasLnbLive()) { + lnbLive.support = true; + } else { + lnbLive.support = false; + return; + } + auto lnbLiveConfig = *dataFlow.getFirstLnbLive(); + lnbLive.frontendId = lnbLiveConfig.getFrontendConnection(); + lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection(); + lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection(); + lnbLive.lnbId = lnbLiveConfig.getLnbConnection(); + if (lnbLiveConfig.hasDiseqcMsgSender()) { + for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) { + lnbLive.diseqcMsgs.push_back(msgName); + } + } + } + + static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) { + auto dataFlow = getDataFlowConfiguration(); + if (dataFlow.hasLnbRecord()) { + lnbRecord.support = true; + } else { + lnbRecord.support = false; + return; + } + auto lnbRecordConfig = *dataFlow.getFirstLnbRecord(); + lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection(); + lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection(); + lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection(); + lnbRecord.lnbId = lnbRecordConfig.getLnbConnection(); + if (lnbRecordConfig.hasDiseqcMsgSender()) { + for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) { + lnbRecord.diseqcMsgs.push_back(msgName); + } + } + } + + static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) { + auto dataFlow = getDataFlowConfiguration(); + if (dataFlow.hasTimeFilter()) { + timeFilter.support = true; + } else { + timeFilter.support = false; + return; + } + auto timeFilterConfig = *dataFlow.getFirstTimeFilter(); + timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection(); + } + + private: + static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) { + ALOGW("[ConfigReader] fe type is dvbt"); + FrontendDvbtSettings dvbtSettings{ + .frequency = (int32_t)feConfig.getFrequency(), + }; + if (!feConfig.hasDvbtFrontendSettings_optional()) { + ALOGW("[ConfigReader] no more dvbt settings"); + return dvbtSettings; + } + auto dvbt = feConfig.getFirstDvbtFrontendSettings_optional(); + uint32_t trans = static_cast<uint32_t>(dvbt->getTransmissionMode()); + dvbtSettings.transmissionMode = static_cast<FrontendDvbtTransmissionMode>(trans); + dvbtSettings.bandwidth = static_cast<FrontendDvbtBandwidth>(dvbt->getBandwidth()); + dvbtSettings.isHighPriority = dvbt->getIsHighPriority(); + dvbtSettings.hierarchy = static_cast<FrontendDvbtHierarchy>(dvbt->getHierarchy()); + dvbtSettings.hpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getHpCoderate()); + dvbtSettings.lpCoderate = static_cast<FrontendDvbtCoderate>(dvbt->getLpCoderate()); + dvbtSettings.guardInterval = + static_cast<FrontendDvbtGuardInterval>(dvbt->getGuardInterval()); + dvbtSettings.standard = static_cast<FrontendDvbtStandard>(dvbt->getStandard()); + dvbtSettings.isMiso = dvbt->getIsMiso(); + dvbtSettings.plpMode = static_cast<FrontendDvbtPlpMode>(dvbt->getPlpMode()); + dvbtSettings.plpId = dvbt->getPlpId(); + dvbtSettings.plpGroupId = dvbt->getPlpGroupId(); + if (dvbt->hasConstellation()) { + dvbtSettings.constellation = + static_cast<FrontendDvbtConstellation>(dvbt->getConstellation()); + } + return dvbtSettings; + } + + static FrontendDvbsSettings readDvbsFrontendSettings(Frontend feConfig) { + ALOGW("[ConfigReader] fe type is dvbs"); + FrontendDvbsSettings dvbsSettings{ + .frequency = (int32_t)feConfig.getFrequency(), + }; + if (!feConfig.hasDvbsFrontendSettings_optional()) { + ALOGW("[ConfigReader] no more dvbs settings"); + return dvbsSettings; + } + dvbsSettings.symbolRate = static_cast<uint32_t>( + feConfig.getFirstDvbsFrontendSettings_optional()->getSymbolRate()); + dvbsSettings.inputStreamId = static_cast<uint32_t>( + feConfig.getFirstDvbsFrontendSettings_optional()->getInputStreamId()); + auto dvbs = feConfig.getFirstDvbsFrontendSettings_optional(); + if (dvbs->hasScanType()) { + dvbsSettings.scanType = static_cast<FrontendDvbsScanType>(dvbs->getScanType()); + } + if (dvbs->hasIsDiseqcRxMessage()) { + dvbsSettings.isDiseqcRxMessage = dvbs->getIsDiseqcRxMessage(); + } + return dvbsSettings; + } + + static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type, + DemuxFilterSettings& settings) { + auto mainType = filterConfig.getMainType(); + auto subType = filterConfig.getSubType(); + + switch (mainType) { + case FilterMainTypeEnum::TS: { + ALOGW("[ConfigReader] filter main type is ts"); + type.mainType = DemuxFilterMainType::TS; + DemuxTsFilterSettings ts; + bool isTsSet = false; + switch (subType) { + case FilterSubTypeEnum::UNDEFINED: + type.subType.set<DemuxFilterSubType::Tag::tsFilterType>( + DemuxTsFilterType::UNDEFINED); + break; + case FilterSubTypeEnum::SECTION: + type.subType.set<DemuxFilterSubType::Tag::tsFilterType>( + DemuxTsFilterType::SECTION); + ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::section>( + readSectionFilterSettings(filterConfig)); + isTsSet = true; + break; + case FilterSubTypeEnum::PES: + // TODO: b/182519645 support all the filter settings + type.subType.set<DemuxFilterSubType::Tag::tsFilterType>( + DemuxTsFilterType::PES); + break; + case FilterSubTypeEnum::TS: + type.subType.set<DemuxFilterSubType::Tag::tsFilterType>( + DemuxTsFilterType::TS); + ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>( + true); + isTsSet = true; + break; + case FilterSubTypeEnum::PCR: + type.subType.set<DemuxFilterSubType::Tag::tsFilterType>( + DemuxTsFilterType::PCR); + ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>( + true); + isTsSet = true; + break; + case FilterSubTypeEnum::TEMI: + type.subType.set<DemuxFilterSubType::Tag::tsFilterType>( + DemuxTsFilterType::TEMI); + ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::noinit>( + true); + isTsSet = true; + break; + case FilterSubTypeEnum::AUDIO: + type.subType.set<DemuxFilterSubType::Tag::tsFilterType>( + DemuxTsFilterType::AUDIO); + ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>( + readAvFilterSettings(filterConfig)); + isTsSet = true; + break; + case FilterSubTypeEnum::VIDEO: + type.subType.set<DemuxFilterSubType::Tag::tsFilterType>( + DemuxTsFilterType::VIDEO); + ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::av>( + readAvFilterSettings(filterConfig)); + isTsSet = true; + break; + case FilterSubTypeEnum::RECORD: + type.subType.set<DemuxFilterSubType::Tag::tsFilterType>( + DemuxTsFilterType::RECORD); + ts.filterSettings.set<DemuxTsFilterSettingsFilterSettings::Tag::record>( + readRecordFilterSettings(filterConfig)); + isTsSet = true; + break; + default: + ALOGW("[ConfigReader] ts subtype is not supported"); + return false; + } + if (filterConfig.hasPid()) { + ts.tpid = static_cast<int32_t>(filterConfig.getPid()); + isTsSet = true; + } + if (isTsSet) { + settings.set<DemuxFilterSettings::Tag::ts>(ts); + } + break; + } + case FilterMainTypeEnum::MMTP: { + ALOGW("[ConfigReader] filter main type is mmtp"); + type.mainType = DemuxFilterMainType::MMTP; + DemuxMmtpFilterSettings mmtp; + bool isMmtpSet = false; + switch (subType) { + case FilterSubTypeEnum::UNDEFINED: + type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>( + DemuxMmtpFilterType::UNDEFINED); + break; + case FilterSubTypeEnum::SECTION: + type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>( + DemuxMmtpFilterType::SECTION); + mmtp.filterSettings + .set<DemuxMmtpFilterSettingsFilterSettings::Tag::section>( + readSectionFilterSettings(filterConfig)); + isMmtpSet = true; + break; + case FilterSubTypeEnum::PES: + type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>( + DemuxMmtpFilterType::PES); + // TODO: b/182519645 support all the filter settings + break; + case FilterSubTypeEnum::MMTP: + type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>( + DemuxMmtpFilterType::MMTP); + mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::noinit>( + true); + isMmtpSet = true; + break; + case FilterSubTypeEnum::AUDIO: + type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>( + DemuxMmtpFilterType::AUDIO); + mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::av>( + readAvFilterSettings(filterConfig)); + isMmtpSet = true; + break; + case FilterSubTypeEnum::VIDEO: + type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>( + DemuxMmtpFilterType::VIDEO); + mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::av>( + readAvFilterSettings(filterConfig)); + isMmtpSet = true; + break; + case FilterSubTypeEnum::RECORD: + type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>( + DemuxMmtpFilterType::RECORD); + mmtp.filterSettings.set<DemuxMmtpFilterSettingsFilterSettings::Tag::record>( + readRecordFilterSettings(filterConfig)); + isMmtpSet = true; + break; + case FilterSubTypeEnum::DOWNLOAD: + type.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>( + DemuxMmtpFilterType::DOWNLOAD); + // TODO: b/182519645 support all the filter settings + break; + default: + ALOGW("[ConfigReader] mmtp subtype is not supported"); + return false; + } + if (filterConfig.hasPid()) { + mmtp.mmtpPid = static_cast<int32_t>(filterConfig.getPid()); + isMmtpSet = true; + } + if (isMmtpSet) { + settings.set<DemuxFilterSettings::Tag::mmtp>(mmtp); + } + break; + } + case FilterMainTypeEnum::IP: { + ALOGW("[ConfigReader] filter main type is ip"); + type.mainType = DemuxFilterMainType::IP; + DemuxIpFilterSettings ip; + switch (subType) { + case FilterSubTypeEnum::UNDEFINED: + type.subType.set<DemuxFilterSubType::Tag::ipFilterType>( + DemuxIpFilterType::UNDEFINED); + break; + case FilterSubTypeEnum::SECTION: + type.subType.set<DemuxFilterSubType::Tag::ipFilterType>( + DemuxIpFilterType::SECTION); + ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::section>( + readSectionFilterSettings(filterConfig)); + settings.set<DemuxFilterSettings::Tag::ip>(ip); + break; + case FilterSubTypeEnum::NTP: + type.subType.set<DemuxFilterSubType::Tag::ipFilterType>( + DemuxIpFilterType::NTP); + ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>( + true); + settings.set<DemuxFilterSettings::Tag::ip>(ip); + break; + case FilterSubTypeEnum::IP: { + ip.ipAddr = readIpAddress(filterConfig), + ip.filterSettings + .set<DemuxIpFilterSettingsFilterSettings::Tag::bPassthrough>( + readPassthroughSettings(filterConfig)); + settings.set<DemuxFilterSettings::Tag::ip>(ip); + break; + } + case FilterSubTypeEnum::IP_PAYLOAD: + type.subType.set<DemuxFilterSubType::Tag::ipFilterType>( + DemuxIpFilterType::IP_PAYLOAD); + ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>( + true); + settings.set<DemuxFilterSettings::Tag::ip>(ip); + break; + case FilterSubTypeEnum::PAYLOAD_THROUGH: + type.subType.set<DemuxFilterSubType::Tag::ipFilterType>( + DemuxIpFilterType::PAYLOAD_THROUGH); + ip.filterSettings.set<DemuxIpFilterSettingsFilterSettings::Tag::noinit>( + true); + settings.set<DemuxFilterSettings::Tag::ip>(ip); + break; + default: + ALOGW("[ConfigReader] mmtp subtype is not supported"); + return false; + } + break; + } + default: + // TODO: b/182519645 support all the filter configs + ALOGW("[ConfigReader] filter main type is not supported in dynamic config"); + return false; + } + return true; + } + + static DemuxIpAddress readIpAddress(Filter filterConfig) { + DemuxIpAddress ipAddress; + vector<uint8_t> data; + if (!filterConfig.hasIpFilterConfig_optional()) { + return ipAddress; + } + auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional(); + if (ipFilterConfig->hasSrcPort()) { + ipAddress.srcPort = ipFilterConfig->getSrcPort(); + } + if (ipFilterConfig->hasDestPort()) { + ipAddress.dstPort = ipFilterConfig->getDestPort(); + } + if (ipFilterConfig->getFirstSrcIpAddress()->getIsIpV4()) { + data.resize(4); + memcpy(data.data(), ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 4); + ipAddress.srcIpAddress.set<DemuxIpAddressIpAddress::Tag::v4>(data); + } else { + data.resize(6); + memcpy(data.data(), ipFilterConfig->getFirstSrcIpAddress()->getIp().data(), 6); + ipAddress.srcIpAddress.set<DemuxIpAddressIpAddress::Tag::v6>(data); + } + if (ipFilterConfig->getFirstDestIpAddress()->getIsIpV4()) { + data.resize(4); + memcpy(data.data(), ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 4); + ipAddress.dstIpAddress.set<DemuxIpAddressIpAddress::Tag::v4>(data); + } else { + data.resize(6); + memcpy(data.data(), ipFilterConfig->getFirstDestIpAddress()->getIp().data(), 6); + ipAddress.dstIpAddress.set<DemuxIpAddressIpAddress::Tag::v6>(data); + } + return ipAddress; + } + + static bool readPassthroughSettings(Filter filterConfig) { + if (!filterConfig.hasIpFilterConfig_optional()) { + return false; + } + auto ipFilterConfig = filterConfig.getFirstIpFilterConfig_optional(); + if (ipFilterConfig->hasDataPassthrough()) { + return ipFilterConfig->getDataPassthrough(); + } + return false; + } + + static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) { + DemuxFilterSectionSettings settings; + if (!filterConfig.hasSectionFilterSettings_optional()) { + return settings; + } + auto section = filterConfig.getFirstSectionFilterSettings_optional(); + settings.isCheckCrc = section->getIsCheckCrc(); + settings.isRepeat = section->getIsRepeat(); + settings.isRaw = section->getIsRaw(); + return settings; + } + + static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) { + DemuxFilterAvSettings settings; + if (!filterConfig.hasAvFilterSettings_optional()) { + return settings; + } + auto av = filterConfig.getFirstAvFilterSettings_optional(); + settings.isPassthrough = av->getIsPassthrough(); + return settings; + } + + static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) { + DemuxFilterRecordSettings settings; + if (!filterConfig.hasRecordFilterSettings_optional()) { + return settings; + } + auto record = filterConfig.getFirstRecordFilterSettings_optional(); + settings.tsIndexMask = record->getTsIndexMask(); + settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType()); + return settings; + } + + static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) { + ALOGW("[ConfigReader] dvr type is playback"); + PlaybackSettings playbackSettings{ + .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()), + .lowThreshold = static_cast<int32_t>(dvrConfig.getLowThreshold()), + .highThreshold = static_cast<int32_t>(dvrConfig.getHighThreshold()), + .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()), + .packetSize = static_cast<int8_t>(dvrConfig.getPacketSize()), + }; + return playbackSettings; + } + + static RecordSettings readRecordSettings(Dvr dvrConfig) { + ALOGW("[ConfigReader] dvr type is record"); + RecordSettings recordSettings{ + .statusMask = static_cast<uint8_t>(dvrConfig.getStatusMask()), + .lowThreshold = static_cast<int32_t>(dvrConfig.getLowThreshold()), + .highThreshold = static_cast<int32_t>(dvrConfig.getHighThreshold()), + .dataFormat = static_cast<DataFormat>(dvrConfig.getDataFormat()), + .packetSize = static_cast<int8_t>(dvrConfig.getPacketSize()), + }; + return recordSettings; + } + + static void getCiCamInfo(Frontend feConfig, bool& canConnectToCiCam, int32_t& ciCamId) { + if (!feConfig.hasConnectToCicamId()) { + canConnectToCiCam = false; + ciCamId = -1; + } + canConnectToCiCam = true; + ciCamId = static_cast<int32_t>(feConfig.getConnectToCicamId()); + } +}; diff --git a/vibrator/aidl/default/Android.bp b/vibrator/aidl/default/Android.bp index d463f51511..5a65e759f0 100644 --- a/vibrator/aidl/default/Android.bp +++ b/vibrator/aidl/default/Android.bp @@ -13,7 +13,7 @@ cc_library_static { shared_libs: [ "libbase", "libbinder_ndk", - "android.hardware.vibrator-V2-ndk_platform", + "android.hardware.vibrator-V2-ndk", ], export_include_dirs: ["include"], srcs: [ @@ -35,7 +35,7 @@ cc_binary { shared_libs: [ "libbase", "libbinder_ndk", - "android.hardware.vibrator-V2-ndk_platform", + "android.hardware.vibrator-V2-ndk", ], static_libs: [ "libvibratorexampleimpl", diff --git a/vibrator/bench/Android.bp b/vibrator/bench/Android.bp index e4c9cfb33d..73e274fe41 100644 --- a/vibrator/bench/Android.bp +++ b/vibrator/bench/Android.bp @@ -29,7 +29,7 @@ cc_benchmark { "benchmark.cpp", ], shared_libs: [ - "android.hardware.vibrator-V1-cpp", + "android.hardware.vibrator-V2-cpp", "android.hardware.vibrator@1.0", "android.hardware.vibrator@1.1", "android.hardware.vibrator@1.2", diff --git a/weaver/aidl/default/Android.bp b/weaver/aidl/default/Android.bp index 37a9c947d5..70d91718de 100644 --- a/weaver/aidl/default/Android.bp +++ b/weaver/aidl/default/Android.bp @@ -34,7 +34,7 @@ cc_binary { "Weaver.cpp", ], shared_libs: [ - "android.hardware.weaver-V1-ndk_platform", + "android.hardware.weaver-V1-ndk", "libbase", "libbinder_ndk", ], diff --git a/weaver/aidl/vts/Android.bp b/weaver/aidl/vts/Android.bp index 8dec4c17f0..cf1661ce1e 100644 --- a/weaver/aidl/vts/Android.bp +++ b/weaver/aidl/vts/Android.bp @@ -34,7 +34,7 @@ cc_test { "libbinder_ndk", "libbase", ], - static_libs: ["android.hardware.weaver-V1-ndk_platform"], + static_libs: ["android.hardware.weaver-V1-ndk"], test_suites: [ "general-tests", "vts", |