Revert "Move libprotocan to hardware/interfaces/automotive domain"
Revert submission 16551592-protocan_move
Reason for revert: Breaking git_master-wihtout-vendor
BUGID: b/213244647
Reverted Changes:
I4d0a1dcff:Move libprotocan to hardware/interfaces/automotive...
I166ea7741:Move libprotocan to hardware/interfaces/automotive...
Change-Id: I190155faa9cec22931baa4b0b245037b61f15cf9
diff --git a/automotive/can/1.0/tools/libprotocan/Android.bp b/automotive/can/1.0/tools/libprotocan/Android.bp
deleted file mode 100644
index 76c238b..0000000
--- a/automotive/can/1.0/tools/libprotocan/Android.bp
+++ /dev/null
@@ -1,42 +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.
-//
-
-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_library_static {
- name: "libprotocan",
- defaults: ["android.hardware.automotive.vehicle@2.0-protocan-defaults"],
- vendor: true,
- srcs: [
- "Checksum.cpp",
- "MessageCounter.cpp",
- "MessageDef.cpp",
- "MessageInjector.cpp",
- "Signal.cpp",
- ],
- export_include_dirs: ["include"],
-
- shared_libs: [
- "android.hardware.automotive.can@1.0",
- ],
-}
diff --git a/automotive/can/1.0/tools/libprotocan/Checksum.cpp b/automotive/can/1.0/tools/libprotocan/Checksum.cpp
deleted file mode 100644
index 72fb0af..0000000
--- a/automotive/can/1.0/tools/libprotocan/Checksum.cpp
+++ /dev/null
@@ -1,28 +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.
- */
-
-#include <libprotocan/Checksum.h>
-
-namespace android::hardware::automotive::protocan {
-
-Checksum::Checksum(Signal signal, formula f) : mSignal(signal), mFormula(f) {}
-
-void Checksum::update(can::V1_0::CanMessage& msg) const {
- mSignal.set(msg, 0);
- mSignal.set(msg, mFormula(msg) % (mSignal.maxValue + 1));
-}
-
-} // namespace android::hardware::automotive::protocan
diff --git a/automotive/can/1.0/tools/libprotocan/MessageCounter.cpp b/automotive/can/1.0/tools/libprotocan/MessageCounter.cpp
deleted file mode 100644
index ef9882f..0000000
--- a/automotive/can/1.0/tools/libprotocan/MessageCounter.cpp
+++ /dev/null
@@ -1,61 +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.
- */
-
-#include <libprotocan/MessageCounter.h>
-
-#include <android-base/logging.h>
-
-namespace android::hardware::automotive::protocan {
-
-/** Whether to log counter state messages. */
-static constexpr bool kSuperVerbose = false;
-
-MessageCounter::MessageCounter(Signal signal) : upperBound(signal.maxValue + 1), mSignal(signal) {}
-
-Signal::value MessageCounter::next() const {
- CHECK(mCurrent.has_value()) << "Counter not initialized. Did you call isReady?";
- return (*mCurrent + 1) % upperBound;
-}
-
-void MessageCounter::read(const can::V1_0::CanMessage& msg) {
- auto val = mSignal.get(msg);
-
- if (!mCurrent.has_value()) {
- LOG(VERBOSE) << "Got first counter val of " << val;
- mCurrent = val;
- return;
- }
-
- auto nextVal = next();
- if (nextVal == val) {
- if constexpr (kSuperVerbose) {
- LOG(VERBOSE) << "Got next counter val of " << nextVal;
- }
- mCurrent = nextVal;
- } else {
- LOG(DEBUG) << "Ignoring next counter val of " << val << ", waiting for " << nextVal;
- }
-}
-
-bool MessageCounter::isReady() const { return mCurrent.has_value(); }
-
-void MessageCounter::increment(can::V1_0::CanMessage& msg) {
- auto newVal = next();
- mCurrent = newVal;
- mSignal.set(msg, newVal);
-}
-
-} // namespace android::hardware::automotive::protocan
diff --git a/automotive/can/1.0/tools/libprotocan/MessageDef.cpp b/automotive/can/1.0/tools/libprotocan/MessageDef.cpp
deleted file mode 100644
index 23ce1df..0000000
--- a/automotive/can/1.0/tools/libprotocan/MessageDef.cpp
+++ /dev/null
@@ -1,62 +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.
- */
-
-#include <libprotocan/MessageDef.h>
-
-#include <android-base/logging.h>
-
-namespace android::hardware::automotive::protocan {
-
-using can::V1_0::CanMessage;
-using can::V1_0::CanMessageId;
-
-MessageDef::MessageDef(CanMessageId id, uint16_t len, std::map<std::string, Signal> signals,
- std::optional<Signal> counter, std::optional<Checksum> checksum)
- : id(id), kLen(len), kSignals(std::move(signals)), kCounter(counter), kChecksum(checksum) {}
-
-const Signal& MessageDef::operator[](const std::string& signalName) const {
- auto it = kSignals.find(signalName);
- CHECK(it != kSignals.end()) << "Signal " << signalName << " doesn't exist";
- return it->second;
-}
-
-CanMessage MessageDef::makeDefault() const {
- CanMessage msg = {};
- msg.id = id;
- msg.payload.resize(kLen);
-
- for (auto const& [name, signal] : kSignals) {
- signal.setDefault(msg);
- }
-
- return msg;
-}
-
-MessageCounter MessageDef::makeCounter() const {
- CHECK(kCounter.has_value()) << "Can't build a counter for message without such signal";
- return MessageCounter(*kCounter);
-}
-
-void MessageDef::updateChecksum(can::V1_0::CanMessage& msg) const {
- if (!kChecksum.has_value()) return;
- kChecksum->update(msg);
-}
-
-bool MessageDef::validate(const can::V1_0::CanMessage& msg) const {
- return msg.payload.size() >= kLen;
-}
-
-} // namespace android::hardware::automotive::protocan
diff --git a/automotive/can/1.0/tools/libprotocan/MessageInjector.cpp b/automotive/can/1.0/tools/libprotocan/MessageInjector.cpp
deleted file mode 100644
index 7c45eaa..0000000
--- a/automotive/can/1.0/tools/libprotocan/MessageInjector.cpp
+++ /dev/null
@@ -1,110 +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.
- */
-
-#include <libprotocan/MessageInjector.h>
-
-#include <android-base/logging.h>
-
-#include <thread>
-
-namespace android::hardware::automotive::protocan {
-
-/** Whether to log injected messages. */
-static constexpr bool kSuperVerbose = true;
-
-using namespace std::literals::chrono_literals;
-
-using can::V1_0::CanMessage;
-using can::V1_0::CanMessageId;
-using can::V1_0::ICanBus;
-using can::V1_0::Result;
-
-MessageInjector::MessageInjector(MessageDef msgDef,
- std::optional<std::chrono::milliseconds> interMessageDelay)
- : kMsgDef(std::move(msgDef)),
- kInterMessageDelay(interMessageDelay),
- mCounter(msgDef.makeCounter()) {}
-
-void MessageInjector::inject(const CanMessage& msg) { inject({msg}); }
-
-void MessageInjector::inject(const std::initializer_list<can::V1_0::CanMessage> msgs) {
- std::lock_guard<std::mutex> lock(mMessagesGuard);
- for (const auto& msg : msgs) {
- if constexpr (kSuperVerbose) {
- LOG(VERBOSE) << "Message scheduled for injection: " << toString(msg);
- }
-
- mMessages.push(msg);
- }
-}
-
-void MessageInjector::processQueueLocked(can::V1_0::ICanBus& bus) {
- if (mMessages.empty() || !mCounter.isReady()) return;
-
- auto paddingMessagesCount = mCounter.upperBound - (mMessages.size() % mCounter.upperBound);
- auto padMessage = kMsgDef.makeDefault();
- for (unsigned i = 0; i < paddingMessagesCount; i++) {
- mMessages.push(padMessage);
- }
-
- while (!mMessages.empty()) {
- auto&& outMsg = mMessages.front();
-
- mCounter.increment(outMsg);
- kMsgDef.updateChecksum(outMsg);
-
- if constexpr (kSuperVerbose) {
- LOG(VERBOSE) << "Injecting message: " << toString(outMsg);
- }
- auto result = bus.send(outMsg);
- if (result != Result::OK) {
- LOG(ERROR) << "Message injection failed: " << toString(result);
- }
-
- mMessages.pop();
-
- // This would block onReceive, but the class is not supposed to be used in production anyway
- // (see MessageInjector docstring).
- if (kInterMessageDelay.has_value()) {
- std::this_thread::sleep_for(*kInterMessageDelay);
- }
- }
-}
-
-void MessageInjector::onReceive(ICanBus& bus, const CanMessage& msg) {
- if (!kMsgDef.validate(msg)) return;
-
- std::lock_guard<std::mutex> lock(mMessagesGuard);
-
- mCounter.read(msg);
- processQueueLocked(bus);
-}
-
-MessageInjectorManager::MessageInjectorManager(
- std::initializer_list<std::shared_ptr<MessageInjector>> injectors) {
- std::transform(injectors.begin(), injectors.end(), std::inserter(mInjectors, mInjectors.end()),
- [](const std::shared_ptr<MessageInjector>& injector) {
- return std::make_pair(injector->kMsgDef.id, std::move(injector));
- });
-}
-
-void MessageInjectorManager::onReceive(sp<ICanBus> bus, const CanMessage& msg) {
- auto it = mInjectors.find(msg.id);
- if (it == mInjectors.end()) return;
- it->second->onReceive(*bus, msg);
-}
-
-} // namespace android::hardware::automotive::protocan
diff --git a/automotive/can/1.0/tools/libprotocan/Signal.cpp b/automotive/can/1.0/tools/libprotocan/Signal.cpp
deleted file mode 100644
index bc3e070..0000000
--- a/automotive/can/1.0/tools/libprotocan/Signal.cpp
+++ /dev/null
@@ -1,84 +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.
- */
-
-#include <libprotocan/Signal.h>
-
-#include <android-base/logging.h>
-
-namespace android::hardware::automotive::protocan {
-
-static uint8_t calculateLastByteMask(uint16_t start, uint8_t length) {
- unsigned lastByteBits = (start + length) % 8;
- unsigned lastBytePadding = (8 - lastByteBits) % 8;
- return 0xFF >> lastBytePadding;
-}
-
-static uint8_t calculateFirstByteMask(uint16_t firstByte, uint8_t firstBit, uint16_t lastByte,
- uint8_t lastMask) {
- uint8_t firstMask = 0xFF << firstBit;
- if (firstByte == lastByte) firstMask &= lastMask;
- return firstMask;
-}
-
-Signal::Signal(uint16_t start, uint8_t length, value defVal)
- : maxValue((1u << length) - 1),
- kFirstByte(start / 8),
- kFirstBit(start % 8),
- kFirstByteBits(8 - kFirstBit),
- kLastByte((start + length - 1) / 8),
- kLastMask(calculateLastByteMask(start, length)),
- kFirstMask(calculateFirstByteMask(kFirstByte, kFirstBit, kLastByte, kLastMask)),
- kDefVal(defVal) {
- CHECK(length > 0) << "Signal length must not be zero";
-}
-
-Signal::value Signal::get(const can::V1_0::CanMessage& msg) const {
- CHECK(msg.payload.size() > kLastByte)
- << "Message is too short. Did you call MessageDef::validate?";
-
- Signal::value v = 0;
- if (kLastByte != kFirstByte) v = kLastMask & msg.payload[kLastByte];
-
- for (int i = kLastByte - 1; i > kFirstByte; i--) {
- v = (v << 8) | msg.payload[i];
- }
-
- return (v << kFirstByteBits) | ((msg.payload[kFirstByte] & kFirstMask) >> kFirstBit);
-}
-
-void Signal::set(can::V1_0::CanMessage& msg, Signal::value val) const {
- CHECK(msg.payload.size() > kLastByte)
- << "Signal requires message of length " << (kLastByte + 1)
- << " which is beyond message length of " << msg.payload.size();
-
- uint8_t firstByte = val << kFirstBit;
- val >>= kFirstByteBits;
-
- msg.payload[kFirstByte] = (msg.payload[kFirstByte] & ~kFirstMask) | (firstByte & kFirstMask);
-
- for (int i = kFirstByte + 1; i < kLastByte; i++) {
- msg.payload[i] = val & 0xFF;
- val >>= 8;
- }
-
- if (kLastByte != kFirstByte) {
- msg.payload[kLastByte] = (msg.payload[kLastByte] & ~kLastMask) | (val & kLastMask);
- }
-}
-
-void Signal::setDefault(can::V1_0::CanMessage& msg) const { set(msg, kDefVal); }
-
-} // namespace android::hardware::automotive::protocan
diff --git a/automotive/can/1.0/tools/libprotocan/include/libprotocan/Checksum.h b/automotive/can/1.0/tools/libprotocan/include/libprotocan/Checksum.h
deleted file mode 100644
index ff1dc91..0000000
--- a/automotive/can/1.0/tools/libprotocan/include/libprotocan/Checksum.h
+++ /dev/null
@@ -1,37 +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.
- */
-
-#pragma once
-
-#include <android/hardware/automotive/can/1.0/types.h>
-#include <libprotocan/Signal.h>
-
-namespace android::hardware::automotive::protocan {
-
-class Checksum {
- public:
- using formula = std::function<Signal::value(const can::V1_0::CanMessage&)>;
-
- Checksum(Signal signal, formula f);
-
- void update(can::V1_0::CanMessage& msg) const;
-
- private:
- const Signal mSignal;
- const formula mFormula;
-};
-
-} // namespace android::hardware::automotive::protocan
diff --git a/automotive/can/1.0/tools/libprotocan/include/libprotocan/MessageCounter.h b/automotive/can/1.0/tools/libprotocan/include/libprotocan/MessageCounter.h
deleted file mode 100644
index 56113be..0000000
--- a/automotive/can/1.0/tools/libprotocan/include/libprotocan/MessageCounter.h
+++ /dev/null
@@ -1,55 +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.
- */
-
-#pragma once
-
-#include <android/hardware/automotive/can/1.0/types.h>
-#include <libprotocan/Signal.h>
-
-namespace android::hardware::automotive::protocan {
-
-class MessageCounter {
- public:
- const Signal::value upperBound;
-
- MessageCounter(Signal signal);
-
- /**
- * Parse CAN message sent by external ECU to determine current counter value.
- */
- void read(const can::V1_0::CanMessage& msg);
-
- /**
- * States whether current counter value is determined.
- */
- bool isReady() const;
-
- /**
- * Increment current counter value and set it in a new message.
- *
- * Caller must check isReady() at least once before calling this method.
- */
- void increment(can::V1_0::CanMessage& msg);
-
- private:
- const Signal mSignal;
-
- std::optional<Signal::value> mCurrent = std::nullopt;
-
- Signal::value next() const;
-};
-
-} // namespace android::hardware::automotive::protocan
diff --git a/automotive/can/1.0/tools/libprotocan/include/libprotocan/MessageDef.h b/automotive/can/1.0/tools/libprotocan/include/libprotocan/MessageDef.h
deleted file mode 100644
index 79b21e1..0000000
--- a/automotive/can/1.0/tools/libprotocan/include/libprotocan/MessageDef.h
+++ /dev/null
@@ -1,69 +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.
- */
-
-#pragma once
-
-#include <android/hardware/automotive/can/1.0/types.h>
-#include <libprotocan/Checksum.h>
-#include <libprotocan/MessageCounter.h>
-#include <libprotocan/Signal.h>
-
-namespace android::hardware::automotive::protocan {
-
-/**
- * CAN message definition (not the actual message data).
- *
- * Describes static message properties (message ID, signals etc).
- */
-class MessageDef {
- public:
- const can::V1_0::CanMessageId id;
-
- /**
- * Create message definition.
- *
- * Currently only constant length messages are supported.
- *
- * \param id CAN message ID
- * \param len CAN message length
- * \param signals CAN signal definitions
- * \param counter Designated CAN signal definition for message counter, if the message has one
- * \param checksum Designated CAN signal definition for payload checksum, if the message has one
- */
- MessageDef(can::V1_0::CanMessageId id, uint16_t len, std::map<std::string, Signal> signals,
- std::optional<Signal> counter = std::nullopt,
- std::optional<Checksum> checksum = std::nullopt);
-
- const Signal& operator[](const std::string& signalName) const;
-
- can::V1_0::CanMessage makeDefault() const;
- MessageCounter makeCounter() const;
-
- void updateChecksum(can::V1_0::CanMessage& msg) const;
-
- /**
- * Validate the message payload is large enough to hold all the signals.
- */
- bool validate(const can::V1_0::CanMessage& msg) const;
-
-private:
- const uint16_t kLen;
- const std::map<std::string, Signal> kSignals;
- const std::optional<Signal> kCounter;
- const std::optional<Checksum> kChecksum;
-};
-
-} // namespace android::hardware::automotive::protocan
diff --git a/automotive/can/1.0/tools/libprotocan/include/libprotocan/MessageInjector.h b/automotive/can/1.0/tools/libprotocan/include/libprotocan/MessageInjector.h
deleted file mode 100644
index b0ea260..0000000
--- a/automotive/can/1.0/tools/libprotocan/include/libprotocan/MessageInjector.h
+++ /dev/null
@@ -1,78 +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.
- */
-
-#pragma once
-
-#include <android-base/macros.h>
-#include <android/hardware/automotive/can/1.0/ICanBus.h>
-#include <libprotocan/MessageCounter.h>
-#include <libprotocan/MessageDef.h>
-#include <utils/Mutex.h>
-
-#include <queue>
-
-namespace android::hardware::automotive::protocan {
-
-class MessageInjectorManager;
-
-/**
- * Injects CAN messages with a counter to an existing system.
- *
- * This class is NOT meant to use in production - there should be no need to inject counted CAN
- * messages where the other sender is also broadcasting them. If this is the case, it may be a sign
- * your CAN network needs a redesign. This tool is intended for use for testing and demo purposes.
- */
-class MessageInjector {
- public:
- MessageInjector(MessageDef msgDef, std::optional<std::chrono::milliseconds> interMessageDelay);
-
- void inject(const can::V1_0::CanMessage& msg);
- void inject(const std::initializer_list<can::V1_0::CanMessage> msgs);
-
- private:
- const MessageDef kMsgDef;
- const std::optional<std::chrono::milliseconds> kInterMessageDelay;
- MessageCounter mCounter;
-
- mutable std::mutex mMessagesGuard;
- std::queue<can::V1_0::CanMessage> mMessages GUARDED_BY(mMessagesGuard);
-
- void onReceive(can::V1_0::ICanBus& bus, const can::V1_0::CanMessage& msg);
- void processQueueLocked(can::V1_0::ICanBus& bus);
-
- friend class MessageInjectorManager;
-
- DISALLOW_COPY_AND_ASSIGN(MessageInjector);
-};
-
-/**
- * Routes intercepted messages to MessageInjector instances configured to handle specific CAN
- * message (CAN message ID). Intercepted messages from other nodes in CAN network are used to read
- * current counter value in order to spoof the next packet.
- */
-class MessageInjectorManager {
- public:
- MessageInjectorManager(std::initializer_list<std::shared_ptr<MessageInjector>> injectors);
-
- void onReceive(sp<can::V1_0::ICanBus> bus, const can::V1_0::CanMessage& msg);
-
- private:
- std::map<can::V1_0::CanMessageId, std::shared_ptr<MessageInjector>> mInjectors;
-
- DISALLOW_COPY_AND_ASSIGN(MessageInjectorManager);
-};
-
-} // namespace android::hardware::automotive::protocan
diff --git a/automotive/can/1.0/tools/libprotocan/include/libprotocan/Signal.h b/automotive/can/1.0/tools/libprotocan/include/libprotocan/Signal.h
deleted file mode 100644
index 7c0f119..0000000
--- a/automotive/can/1.0/tools/libprotocan/include/libprotocan/Signal.h
+++ /dev/null
@@ -1,50 +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.
- */
-
-#pragma once
-
-#include <android-base/macros.h>
-#include <android/hardware/automotive/can/1.0/types.h>
-
-namespace android::hardware::automotive::protocan {
-
-/**
- * TODO(twasilczyk): right now, only Little Endian signals are supported.
- */
-class Signal {
- public:
- using value = uint64_t;
-
- const value maxValue;
-
- Signal(uint16_t start, uint8_t length, value defVal = 0);
-
- value get(const can::V1_0::CanMessage& msg) const;
- void set(can::V1_0::CanMessage& msg, value val) const;
- void setDefault(can::V1_0::CanMessage& msg) const;
-
- private:
- const uint16_t kFirstByte; ///< Index of first byte that holds the signal
- const uint8_t kFirstBit; ///< Index of first bit within first byte
- const uint8_t kFirstByteBits; ///< How many bits of the first byte belong to the signal
- const uint16_t kLastByte; ///< Index of last byte that holds the signal
- const uint8_t kLastMask; ///< Bits of the last byte that belong to the signal
- const uint8_t kFirstMask; ///< Bits of the first byte that belong to the signal
-
- const value kDefVal;
-};
-
-} // namespace android::hardware::automotive::protocan
diff --git a/automotive/can/1.0/tools/libprotocan/tests/Android.bp b/automotive/can/1.0/tools/libprotocan/tests/Android.bp
deleted file mode 100644
index 251cc06..0000000
--- a/automotive/can/1.0/tools/libprotocan/tests/Android.bp
+++ /dev/null
@@ -1,39 +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.
-//
-
-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: "libprotocan_signal_test",
- defaults: ["android.hardware.automotive.can@defaults"],
- vendor: true,
- gtest: true,
- srcs: ["libprotocan_signal_test.cpp"],
- static_libs: [
- "libprotocan",
- ],
- shared_libs: [
- "android.hardware.automotive.can@1.0",
- "libhidlbase",
- ],
-}
diff --git a/automotive/can/1.0/tools/libprotocan/tests/libprotocan_signal_test.cpp b/automotive/can/1.0/tools/libprotocan/tests/libprotocan_signal_test.cpp
deleted file mode 100644
index 19c1209..0000000
--- a/automotive/can/1.0/tools/libprotocan/tests/libprotocan_signal_test.cpp
+++ /dev/null
@@ -1,218 +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.
- */
-
-#include <libprotocan/Signal.h>
-
-#include <gtest/gtest.h>
-
-namespace android::hardware::automotive::protocan::unittest {
-
-TEST(SignalTest, TestGetSingleBytes) {
- can::V1_0::CanMessage msg = {};
- msg.payload = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
- for (unsigned i = 0; i < msg.payload.size(); i++) {
- Signal signal(8 * i, 8);
- ASSERT_EQ(i, signal.get(msg));
- }
-}
-
-TEST(SignalTest, TestSetSingleBytes) {
- std::vector<can::V1_0::CanMessage> msgs = {{}, {}, {}};
- msgs[0].payload = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
- msgs[1].payload = {0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB};
- msgs[2].payload = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- for (unsigned i = 0; i < msgs[0].payload.size(); i++) {
- Signal signal(8 * i, 8);
-
- for (auto&& msgOriginal : msgs) {
- auto msgModified = msgOriginal;
- signal.set(msgModified, 0xBA);
-
- auto msgExpected = msgOriginal;
- msgExpected.payload[i] = 0xBA;
-
- ASSERT_EQ(msgExpected, msgModified) << "i=" << i;
- }
- }
-}
-
-TEST(SignalTest, TestGetStart4) {
- /* Data generated with Python3:
- *
- * from cantools.database.can import *
- * hex(Message(1, 'm', 4, [Signal('s', 4, 16, byte_order='little_endian')]).
- * decode(b'\xde\xad\xbe\xef')['s'])
- */
-
- can::V1_0::CanMessage msg = {};
- msg.payload = {0xDE, 0xAD, 0xBE, 0xEF};
- can::V1_0::CanMessage msg2 = {};
- msg2.payload = {0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD};
-
- Signal s0_4(0, 4);
- Signal s4_4(4, 4);
- Signal s4_8(4, 8);
- Signal s4_16(4, 16);
- Signal s4_28(4, 28);
- Signal s12_8(12, 8);
- Signal s12_12(12, 12);
- Signal s12_16(12, 16);
- Signal s12_20(12, 20);
- Signal s12_32(12, 32);
-
- ASSERT_EQ(0xEu, s0_4.get(msg));
- ASSERT_EQ(0xDu, s4_4.get(msg));
- ASSERT_EQ(0xDDu, s4_8.get(msg));
- ASSERT_EQ(0xEADDu, s4_16.get(msg));
- ASSERT_EQ(0xEFBEADDu, s4_28.get(msg));
- ASSERT_EQ(0xEAu, s12_8.get(msg));
- ASSERT_EQ(0xBEAu, s12_12.get(msg));
- ASSERT_EQ(0xFBEAu, s12_16.get(msg));
- ASSERT_EQ(0xEFBEAu, s12_20.get(msg));
- ASSERT_EQ(0xDDEEFBEAu, s12_32.get(msg2));
-}
-
-TEST(SignalTest, TestGet64) {
- /* Data generated with Python3:
- *
- * from cantools.database.can import *
- * hex(Message(1, 'm', 9, [Signal('s', 4, 64, byte_order='little_endian')]).
- * decode(b'\xde\xad\xbe\xef\xab\xbc\xcd\xde\xef')['s'])
- */
-
- can::V1_0::CanMessage msg = {};
- msg.payload = {0xDE, 0xAD, 0xBE, 0xEF, 0xAB, 0xBC, 0xCD, 0xDE, 0xEF};
-
- Signal s0_64(0, 64);
- Signal s8_64(8, 64);
- Signal s4_64(4, 64);
- Signal s1_64(1, 64);
-
- ASSERT_EQ(0xDECDBCABEFBEADDEu, s0_64.get(msg));
- ASSERT_EQ(0xEFDECDBCABEFBEADu, s8_64.get(msg));
- ASSERT_EQ(0xFDECDBCABEFBEADDu, s4_64.get(msg));
- ASSERT_EQ(0xEF66DE55F7DF56EFu, s1_64.get(msg));
-}
-
-TEST(SignalTest, TestGetAllStarts) {
- /* Data generated with Python3:
- *
- * from cantools.database.can import *
- * hex(Message(1, 'm', 6, [Signal('s', 0, 20, byte_order='little_endian')]).
- * decode(b'\xde\xad\xbe\xef\xde\xad')['s'])
- */
-
- std::map<int, Signal::value> shifts = {
- {0, 0xEADDEu}, {1, 0xF56EFu}, {2, 0xFAB77u}, {3, 0x7D5BBu}, {4, 0xBEADDu}, {5, 0xDF56Eu},
- {6, 0xEFAB7u}, {7, 0xF7D5Bu}, {8, 0xFBEADu}, {9, 0x7DF56u}, {10, 0xBEFABu}, {11, 0xDF7D5u},
- };
-
- can::V1_0::CanMessage msg = {};
- msg.payload = {0xDE, 0xAD, 0xBE, 0xEF, 0xCC, 0xCC};
-
- for (auto const& [start, expected] : shifts) {
- Signal s(start, 20);
- ASSERT_EQ(expected, s.get(msg)) << "shift of " << start << " failed";
- }
-}
-
-TEST(SignalTest, TestSetStart4) {
- /* Data generated with Python3:
- *
- * from cantools.database.can import *
- * so=4 ; sl=8
- * md = Message(1, 'm', 4, [Signal('a1', 0, so), Signal('a2', so+sl, 32-so-sl),
- * Signal('s', so, sl, byte_order='little_endian')])
- * m = md.decode(b'\xcc\xcc\xcc\xcc')
- * m['s'] = 0xDE
- * binascii.hexlify(md.encode(m)).upper()
- */
- typedef struct {
- int start;
- int length;
- Signal::value setValue;
- hidl_vec<uint8_t> payload;
- } case_t;
-
- std::vector<case_t> cases = {
- {0, 4, 0xDu, {0xCD, 0xCC, 0xCC, 0xCC}}, {4, 4, 0xDu, {0xDC, 0xCC, 0xCC, 0xCC}},
- {4, 8, 0xDEu, {0xEC, 0xCD, 0xCC, 0xCC}}, {4, 16, 0xDEADu, {0xDC, 0xEA, 0xCD, 0xCC}},
- {4, 24, 0xDEADBEu, {0xEC, 0xDB, 0xEA, 0xCD}}, {4, 28, 0xDEADBEEu, {0xEC, 0xBE, 0xAD, 0xDE}},
- {12, 8, 0xDEu, {0xCC, 0xEC, 0xCD, 0xCC}}, {12, 12, 0xDEAu, {0xCC, 0xAC, 0xDE, 0xCC}},
- {12, 16, 0xDEADu, {0xCC, 0xDC, 0xEA, 0xCD}}, {12, 20, 0xDEADBu, {0xCC, 0xBC, 0xAD, 0xDE}},
- };
-
- can::V1_0::CanMessage msg = {};
- msg.payload = {0xCC, 0xCC, 0xCC, 0xCC};
-
- for (auto const& tcase : cases) {
- Signal s(tcase.start, tcase.length);
-
- can::V1_0::CanMessage expectedMsg = {};
- expectedMsg.payload = tcase.payload;
-
- can::V1_0::CanMessage editedMsg = msg;
- s.set(editedMsg, tcase.setValue);
-
- ASSERT_EQ(expectedMsg, editedMsg) << " set(" << tcase.start << ", " << tcase.length << ")";
- }
-}
-
-TEST(SignalTest, TestSetAllStarts) {
- /* Data generated with Python3:
- * from cantools.database.can import *
- * import binascii
- * import textwrap
- *
- * length = 20
- * for start in range(0, 32 - length):
- * signals = [Signal('s', start, length, byte_order='little_endian')]
- * if start > 0: signals.append(Signal('a', 0, start, byte_order='little_endian'))
- * signals.append(Signal('b', start + length, 32 - start - length,
- * byte_order='little_endian'))
- *
- * md = Message(1, 'm', 4, signals)
- * m = md.decode(b'\xcc\xcc\xcc\xcc')
- * m['s'] = 0xDEADB
- * out = binascii.hexlify(md.encode(m)).decode('ascii').upper()
- * out = ', '.join(['0x{}'.format(v) for v in textwrap.wrap(out, 2)])
- * print('{{ {:d}, {{ {:s} }}}},'.format(start, out))
- */
-
- std::map<int, hidl_vec<uint8_t>> shifts = {
- {0, {0xDB, 0xEA, 0xCD, 0xCC}}, {1, {0xB6, 0xD5, 0xDB, 0xCC}}, {2, {0x6C, 0xAB, 0xF7, 0xCC}},
- {3, {0xDC, 0x56, 0xEF, 0xCC}}, {4, {0xBC, 0xAD, 0xDE, 0xCC}}, {5, {0x6C, 0x5B, 0xBD, 0xCD}},
- {6, {0xCC, 0xB6, 0x7A, 0xCF}}, {7, {0xCC, 0x6D, 0xF5, 0xCE}}, {8, {0xCC, 0xDB, 0xEA, 0xCD}},
- {9, {0xCC, 0xB6, 0xD5, 0xDB}}, {10, {0xCC, 0x6C, 0xAB, 0xF7}}, {11, {0xCC, 0xDC, 0x56, 0xEF}},
- };
-
- can::V1_0::CanMessage msg = {};
- msg.payload = {0xCC, 0xCC, 0xCC, 0xCC};
-
- for (auto const& [start, expectedPayload] : shifts) {
- Signal s(start, 20);
-
- can::V1_0::CanMessage expectedMsg = {};
- expectedMsg.payload = expectedPayload;
-
- can::V1_0::CanMessage editedMsg = msg;
- s.set(editedMsg, 0xDEADB);
-
- ASSERT_EQ(expectedMsg, editedMsg) << "shift of " << start << " failed";
- }
-}
-
-} // namespace android::hardware::automotive::protocan::unittest