1 /*
2  * Copyright (C) 2021 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 #pragma once
18 
19 #include <android/hardware/sensors/2.1/types.h>
20 #include <fmq/AidlMessageQueue.h>
21 #include "ConvertUtils.h"
22 #include "EventMessageQueueWrapper.h"
23 #include "ISensorsWrapper.h"
24 
25 namespace aidl {
26 namespace android {
27 namespace hardware {
28 namespace sensors {
29 namespace implementation {
30 
31 class EventMessageQueueWrapperAidl
32     : public ::android::hardware::sensors::V2_1::implementation::EventMessageQueueWrapperBase {
33   public:
EventMessageQueueWrapperAidl(std::unique_ptr<::android::AidlMessageQueue<::aidl::android::hardware::sensors::Event,::aidl::android::hardware::common::fmq::SynchronizedReadWrite>> & queue)34     EventMessageQueueWrapperAidl(
35             std::unique_ptr<::android::AidlMessageQueue<
36                     ::aidl::android::hardware::sensors::Event,
37                     ::aidl::android::hardware::common::fmq::SynchronizedReadWrite>>& queue)
38         : mQueue(std::move(queue)) {}
39 
getEventFlagWord()40     virtual std::atomic<uint32_t>* getEventFlagWord() override {
41         return mQueue->getEventFlagWord();
42     }
43 
availableToRead()44     virtual size_t availableToRead() override { return mQueue->availableToRead(); }
45 
availableToWrite()46     size_t availableToWrite() override { return mQueue->availableToWrite(); }
47 
read(::android::hardware::sensors::V2_1::Event * events,size_t numToRead)48     virtual bool read(::android::hardware::sensors::V2_1::Event* events,
49                       size_t numToRead) override {
50         bool success = mQueue->read(mIntermediateEventBuffer.data(), numToRead);
51         for (int i = 0; i < numToRead; ++i) {
52             convertToHidlEvent(mIntermediateEventBuffer[i], &events[i]);
53         }
54         return success;
55     }
56 
write(const::android::hardware::sensors::V2_1::Event * events,size_t numToWrite)57     bool write(const ::android::hardware::sensors::V2_1::Event* events,
58                size_t numToWrite) override {
59         for (int i = 0; i < numToWrite; ++i) {
60             convertToAidlEvent(events[i], &mIntermediateEventBuffer[i]);
61         }
62         return mQueue->write(mIntermediateEventBuffer.data(), numToWrite);
63     }
64 
write(const std::vector<::android::hardware::sensors::V2_1::Event> & events)65     virtual bool write(
66             const std::vector<::android::hardware::sensors::V2_1::Event>& events) override {
67         for (int i = 0; i < events.size(); ++i) {
68             convertToAidlEvent(events[i], &mIntermediateEventBuffer[i]);
69         }
70         return mQueue->write(mIntermediateEventBuffer.data(), events.size());
71     }
72 
writeBlocking(const::android::hardware::sensors::V2_1::Event * events,size_t count,uint32_t readNotification,uint32_t writeNotification,int64_t timeOutNanos,::android::hardware::EventFlag * evFlag)73     bool writeBlocking(const ::android::hardware::sensors::V2_1::Event* events, size_t count,
74                        uint32_t readNotification, uint32_t writeNotification, int64_t timeOutNanos,
75                        ::android::hardware::EventFlag* evFlag) override {
76         for (int i = 0; i < count; ++i) {
77             convertToAidlEvent(events[i], &mIntermediateEventBuffer[i]);
78         }
79         return mQueue->writeBlocking(mIntermediateEventBuffer.data(), count, readNotification,
80                                      writeNotification, timeOutNanos, evFlag);
81     }
82 
getQuantumCount()83     size_t getQuantumCount() override { return mQueue->getQuantumCount(); }
84 
85   private:
86     std::unique_ptr<::android::AidlMessageQueue<
87             ::aidl::android::hardware::sensors::Event,
88             ::aidl::android::hardware::common::fmq::SynchronizedReadWrite>>
89             mQueue;
90     std::array<::aidl::android::hardware::sensors::Event,
91                ::android::hardware::sensors::V2_1::implementation::MAX_RECEIVE_BUFFER_EVENT_COUNT>
92             mIntermediateEventBuffer;
93 };
94 
95 }  // namespace implementation
96 }  // namespace sensors
97 }  // namespace hardware
98 }  // namespace android
99 }  // namespace aidl
100