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