• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 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 #ifndef _UI_INPUTREADER_JOYSTICK_INPUT_MAPPER_H
18 #define _UI_INPUTREADER_JOYSTICK_INPUT_MAPPER_H
19 
20 #include "InputMapper.h"
21 
22 namespace android {
23 
24 class JoystickInputMapper : public InputMapper {
25 public:
26     explicit JoystickInputMapper(InputDeviceContext& deviceContext);
27     virtual ~JoystickInputMapper();
28 
29     virtual uint32_t getSources() override;
30     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) override;
31     virtual void dump(std::string& dump) override;
32     virtual void configure(nsecs_t when, const InputReaderConfiguration* config,
33                            uint32_t changes) override;
34     virtual void reset(nsecs_t when) override;
35     virtual void process(const RawEvent* rawEvent) override;
36 
37 private:
38     struct Axis {
AxisAxis39         explicit Axis(const RawAbsoluteAxisInfo& rawAxisInfo, const AxisInfo& axisInfo,
40                       bool explicitlyMapped, float scale, float offset, float highScale,
41                       float highOffset, float min, float max, float flat, float fuzz,
42                       float resolution, float filter)
43               : rawAxisInfo(rawAxisInfo),
44                 axisInfo(axisInfo),
45                 explicitlyMapped(explicitlyMapped),
46                 scale(scale),
47                 offset(offset),
48                 highScale(highScale),
49                 highOffset(highOffset),
50                 min(min),
51                 max(max),
52                 flat(flat),
53                 fuzz(fuzz),
54                 resolution(resolution),
55                 filter(filter) {
56             resetValue();
57         }
58 
59         RawAbsoluteAxisInfo rawAxisInfo;
60         AxisInfo axisInfo;
61 
62         bool explicitlyMapped; // true if the axis was explicitly assigned an axis id
63 
64         float scale;      // scale factor from raw to normalized values
65         float offset;     // offset to add after scaling for normalization
66         float highScale;  // scale factor from raw to normalized values of high split
67         float highOffset; // offset to add after scaling for normalization of high split
68 
69         float min;        // normalized inclusive minimum
70         float max;        // normalized inclusive maximum
71         float flat;       // normalized flat region size
72         float fuzz;       // normalized error tolerance
73         float resolution; // normalized resolution in units/mm
74 
75         float filter;           // filter out small variations of this size
76         float currentValue;     // current value
77         float newValue;         // most recent value
78         float highCurrentValue; // current value of high split
79         float highNewValue;     // most recent value of high split
80 
resetValueAxis81         void resetValue() {
82             this->currentValue = 0;
83             this->newValue = 0;
84             this->highCurrentValue = 0;
85             this->highNewValue = 0;
86         }
87     };
88 
89     static Axis createAxis(const AxisInfo& AxisInfo, const RawAbsoluteAxisInfo& rawAxisInfo,
90                            bool explicitlyMapped);
91 
92     // Axes indexed by raw ABS_* axis index.
93     std::unordered_map<int32_t, Axis> mAxes;
94 
95     void sync(nsecs_t when, nsecs_t readTime, bool force);
96 
97     bool haveAxis(int32_t axisId);
98     void pruneAxes(bool ignoreExplicitlyMappedAxes);
99     bool filterAxes(bool force);
100 
101     static bool hasValueChangedSignificantly(float filter, float newValue, float currentValue,
102                                              float min, float max);
103     static bool hasMovedNearerToValueWithinFilteredRange(float filter, float newValue,
104                                                          float currentValue, float thresholdValue);
105 
106     static bool isCenteredAxis(int32_t axis);
107     static int32_t getCompatAxis(int32_t axis);
108 
109     static void addMotionRange(int32_t axisId, const Axis& axis, InputDeviceInfo* info);
110     static void setPointerCoordsAxisValue(PointerCoords* pointerCoords, int32_t axis, float value);
111 };
112 
113 } // namespace android
114 
115 #endif // _UI_INPUTREADER_JOYSTICK_INPUT_MAPPER_H