/* * 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_SENSORHAL_EXT_HIDRAW_DEVICE_H #define ANDROID_SENSORHAL_EXT_HIDRAW_DEVICE_H #include "HidDevice.h" #include <HidParser.h> #include <string> #include <vector> #include <unordered_set> #include <unordered_map> namespace android { namespace SensorHalExt { using HidUtil::HidParser; using HidUtil::HidReport; class HidRawDevice : public HidDevice { friend class HidRawDeviceTest; public: HidRawDevice(const std::string &devName, const std::unordered_set<unsigned int> &usageSet); virtual ~HidRawDevice(); // test if the device initialized successfully bool isValid(); // implement HidDevice pure virtuals virtual HidDeviceInfo& getDeviceInfo() override { return mDeviceInfo; } virtual bool getFeature(uint8_t id, std::vector<uint8_t> *out) override; virtual bool setFeature(uint8_t id, const std::vector<uint8_t> &in) override; virtual bool sendReport(uint8_t id, std::vector<uint8_t> &data) override; virtual bool receiveReport(uint8_t *id, std::vector<uint8_t> *data) override; protected: bool populateDeviceInfo(); size_t getReportSize(int type, uint8_t id); bool generateDigest(const std::unordered_set<uint32_t> &usage); size_t calculateReportBitSize(const std::vector<HidReport> &reportItems); const HidParser::ReportPacket *getReportPacket(unsigned int type, unsigned int id); typedef std::pair<unsigned int, unsigned int> ReportTypeIdPair; struct UnsignedIntPairHash { size_t operator()(const ReportTypeIdPair& v) const { std::hash<unsigned int> hash; return hash(v.first) ^ hash(v.second); } }; std::unordered_map<ReportTypeIdPair, const HidParser::ReportPacket *, UnsignedIntPairHash> mReportTypeIdMap; HidParser::DigestVector mDigestVector; private: std::mutex mIoBufferLock; std::vector<uint8_t> mIoBuffer; int mDevFd; HidDeviceInfo mDeviceInfo; bool mMultiIdDevice; int mValid; HidRawDevice(const HidRawDevice &) = delete; void operator=(const HidRawDevice &) = delete; }; } // namespace SensorHalExt } // namespace android #endif // ANDROID_SENSORHAL_EXT_HIDRAW_DEVICE_H