1 /*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "FrameHandlerUltrasonics.h"
18
19 #include <aidl/android/hardware/automotive/evs/EvsEventDesc.h>
20 #include <aidl/android/hardware/automotive/evs/EvsEventType.h>
21 #include <aidl/android/hardware/automotive/evs/IEvsUltrasonicsArray.h>
22 #include <aidl/android/hardware/automotive/evs/UltrasonicsDataFrameDesc.h>
23 #include <android-base/logging.h>
24
25 using ::aidl::android::hardware::automotive::evs::EvsEventDesc;
26 using ::aidl::android::hardware::automotive::evs::EvsEventType;
27 using ::aidl::android::hardware::automotive::evs::IEvsUltrasonicsArray;
28 using ::aidl::android::hardware::automotive::evs::UltrasonicsDataFrameDesc;
29 using ::ndk::ScopedAStatus;
30
31 namespace {
32
33 // Struct used by SerializeWaveformData().
34 struct WaveformData {
35 uint8_t receiverId;
36 std::vector<std::pair<float, float>> readings;
37 };
38
39 } // namespace
40
FrameHandlerUltrasonics(const std::shared_ptr<IEvsUltrasonicsArray> & pArray)41 FrameHandlerUltrasonics::FrameHandlerUltrasonics(
42 const std::shared_ptr<IEvsUltrasonicsArray>& pArray)
43 : mEvsUltrasonicsArray(pArray), mReceiveFramesCount(0) {
44 // Nothing but member initialization
45 }
46
notify(const EvsEventDesc & evsEvent)47 ScopedAStatus FrameHandlerUltrasonics::notify(const EvsEventDesc& evsEvent) {
48 switch (evsEvent.aType) {
49 case EvsEventType::STREAM_STARTED:
50 case EvsEventType::STREAM_STOPPED:
51 case EvsEventType::FRAME_DROPPED:
52 case EvsEventType::TIMEOUT:
53 mReceivedEvents.emplace_back(evsEvent);
54 break;
55 default:
56 LOG(ERROR) << "Received unexpected event";
57 }
58
59 return ScopedAStatus::ok();
60 }
61
62 // De-serializes shared memory to vector of WaveformData.
63 // TODO(b/149950362): Add a common library for serializing and deserializing waveform data.
DeSerializeWaveformData(std::vector<uint32_t> recvReadingsCountList,uint8_t * pData)64 std::vector<WaveformData> DeSerializeWaveformData(std::vector<uint32_t> recvReadingsCountList,
65 uint8_t* pData) {
66 std::vector<WaveformData> waveformDataList(recvReadingsCountList.size());
67
68 for (int i = 0; i < waveformDataList.size(); i++) {
69 // Set Id
70 memcpy(&waveformDataList[i].receiverId, pData, sizeof(uint8_t));
71 pData += sizeof(uint8_t);
72
73 waveformDataList[i].readings.resize(recvReadingsCountList[i]);
74
75 for (auto& reading : waveformDataList[i].readings) {
76 // Set the time of flight.
77 memcpy(&reading.first, pData, sizeof(float));
78 pData += sizeof(float);
79
80 // Set the resonance.
81 memcpy(&reading.second, pData, sizeof(float));
82 pData += sizeof(float);
83 }
84 }
85 return waveformDataList;
86 }
87
DataFrameValidator(const UltrasonicsDataFrameDesc &)88 bool DataFrameValidator(const UltrasonicsDataFrameDesc& /*dataFrameDesc*/) {
89 // TODO(b/214026378): implement a method to validate an ultrasonics data frame
90 (void)DeSerializeWaveformData;
91 return true;
92 }
93
deliverDataFrame(const UltrasonicsDataFrameDesc & dataFrameDesc)94 ScopedAStatus FrameHandlerUltrasonics::deliverDataFrame(
95 const UltrasonicsDataFrameDesc& dataFrameDesc) {
96 LOG(DEBUG) << "FrameHandlerUltrasonics::receiveFrames";
97
98 mReceiveFramesCount++;
99
100 if (!DataFrameValidator(dataFrameDesc)) {
101 mAllFramesValid = false;
102 }
103
104 // Send done with data frame.
105 mEvsUltrasonicsArray->doneWithDataFrame(dataFrameDesc);
106 return ScopedAStatus::ok();
107 }
108
checkEventReceived(const EvsEventDesc & evsEvent)109 bool FrameHandlerUltrasonics::checkEventReceived(const EvsEventDesc& evsEvent) {
110 LOG(DEBUG) << "FrameHandlerUltrasonics::checkEventReceived";
111 int size = mReceivedEvents.size(); // work around
112 LOG(DEBUG) << "Received event number: " << size;
113 auto iter = find(mReceivedEvents.begin(), mReceivedEvents.end(), evsEvent);
114 return iter != mReceivedEvents.end();
115 }
116
getReceiveFramesCount()117 int FrameHandlerUltrasonics::getReceiveFramesCount() {
118 return mReceiveFramesCount;
119 }
120
areAllFramesValid()121 bool FrameHandlerUltrasonics::areAllFramesValid() {
122 return mAllFramesValid;
123 }
124