1 /*
2  * Copyright (C) 2017 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 #ifndef HIDUTIL_HIDREPORT_H_
17 #define HIDUTIL_HIDREPORT_H_
18 
19 #include "HidGlobal.h"
20 #include "HidLocal.h"
21 #include "TriState.h"
22 #include <cstdint>
23 #include <memory>
24 #include <iostream>
25 #include <utility>
26 
27 namespace HidUtil {
28 
29 class HidParser;
30 class HidTreeNode;
31 
32 // HidReport represent an input, output or feature report
33 class HidReport {
34     friend std::ostream& operator<<(std::ostream& os, const HidReport& h);
35 public:
36     HidReport(uint32_t type_, uint32_t data, const HidGlobal &global, const HidLocal &local);
37 
38     // This is called during parsing process when the parser regroups multi-valued report into one
39     void setCollapsed(uint32_t fullUsage);
40 
41     // get report id
42     unsigned int getReportId() const;
43     // get type of report, return constant of HidDef::MainTag
44     unsigned int getType() const;
45     // Full sensor usage
46     unsigned int getFullUsage() const;
47 
48     // binary properties
49     bool isArray() const;
50     bool isData() const;
51     bool isVariable() const;
52 
53     // logical and physical value range
54     std::pair<int64_t, int64_t> getLogicalRange() const;
55     std::pair<int64_t, int64_t> getPhysicalRange() const;
56     double getExponentValue() const;
57 
58     // return HID unit nibbles in an unsigned int
59     unsigned int getUnit() const;
60 
61     // size in bits
62     size_t getSize() const;
63     // dimension (if it is vector/matrix) or number of concurrent input values
64     // it is also used to calculate memory foot print
65     size_t getCount() const;
66 
67     // for output to stream
68     static std::string reportTypeToString(int type);
69     std::string getStringType() const;
70     std::string getExponentString() const;
71     std::string getUnitString() const;
72     std::string getFlagString() const;
73     const std::vector<unsigned int>& getUsageVector() const;
74 private:
75     bool mIsCollapsed;
76 
77     // mandatary fields
78     unsigned int mReportType;
79     unsigned int mFlag;
80     unsigned int mUsagePage;
81     unsigned int mUsage;
82     std::vector<unsigned int> mUsageVector;
83 
84     int mLogicalMin;        // 32 bit is enough
85     int mLogicalMax;
86     unsigned int mReportSize;
87     unsigned int mReportCount;
88 
89     // these below are optional
90     tri_int mPhysicalMin;
91     tri_int mPhysicalMax;
92 
93     tri_uint mExponent;
94     tri_uint mUnit;
95     tri_uint mReportId;
96 };
97 
98 std::ostream& operator<<(std::ostream& os, const HidReport& h);
99 } // namespace HidUtil
100 #endif // HIDUTIL_HIDREPORT_H_
101