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