1*38e8c45fSAndroid Build Coastguard Worker /* 2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2008 The Android Open Source Project 3*38e8c45fSAndroid Build Coastguard Worker * 4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*38e8c45fSAndroid Build Coastguard Worker * 8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*38e8c45fSAndroid Build Coastguard Worker * 10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License. 15*38e8c45fSAndroid Build Coastguard Worker */ 16*38e8c45fSAndroid Build Coastguard Worker 17*38e8c45fSAndroid Build Coastguard Worker #pragma once 18*38e8c45fSAndroid Build Coastguard Worker 19*38e8c45fSAndroid Build Coastguard Worker #include <android-base/result.h> 20*38e8c45fSAndroid Build Coastguard Worker #include <input/InputDevice.h> 21*38e8c45fSAndroid Build Coastguard Worker 22*38e8c45fSAndroid Build Coastguard Worker #include <stdint.h> 23*38e8c45fSAndroid Build Coastguard Worker #include <utils/Errors.h> 24*38e8c45fSAndroid Build Coastguard Worker #include <utils/Tokenizer.h> 25*38e8c45fSAndroid Build Coastguard Worker #include <set> 26*38e8c45fSAndroid Build Coastguard Worker 27*38e8c45fSAndroid Build Coastguard Worker namespace android { 28*38e8c45fSAndroid Build Coastguard Worker 29*38e8c45fSAndroid Build Coastguard Worker struct AxisInfo { 30*38e8c45fSAndroid Build Coastguard Worker enum Mode { 31*38e8c45fSAndroid Build Coastguard Worker // Axis value is reported directly. 32*38e8c45fSAndroid Build Coastguard Worker MODE_NORMAL = 0, 33*38e8c45fSAndroid Build Coastguard Worker // Axis value should be inverted before reporting. 34*38e8c45fSAndroid Build Coastguard Worker MODE_INVERT = 1, 35*38e8c45fSAndroid Build Coastguard Worker // Axis value should be split into two axes 36*38e8c45fSAndroid Build Coastguard Worker MODE_SPLIT = 2, 37*38e8c45fSAndroid Build Coastguard Worker }; 38*38e8c45fSAndroid Build Coastguard Worker 39*38e8c45fSAndroid Build Coastguard Worker // Axis mode. 40*38e8c45fSAndroid Build Coastguard Worker Mode mode; 41*38e8c45fSAndroid Build Coastguard Worker 42*38e8c45fSAndroid Build Coastguard Worker // Axis id. 43*38e8c45fSAndroid Build Coastguard Worker // When split, this is the axis used for values smaller than the split position. 44*38e8c45fSAndroid Build Coastguard Worker int32_t axis; 45*38e8c45fSAndroid Build Coastguard Worker 46*38e8c45fSAndroid Build Coastguard Worker // When split, this is the axis used for values after higher than the split position. 47*38e8c45fSAndroid Build Coastguard Worker int32_t highAxis; 48*38e8c45fSAndroid Build Coastguard Worker 49*38e8c45fSAndroid Build Coastguard Worker // The split value, or 0 if not split. 50*38e8c45fSAndroid Build Coastguard Worker int32_t splitValue; 51*38e8c45fSAndroid Build Coastguard Worker 52*38e8c45fSAndroid Build Coastguard Worker // The flat value, or -1 if none. 53*38e8c45fSAndroid Build Coastguard Worker int32_t flatOverride; 54*38e8c45fSAndroid Build Coastguard Worker AxisInfoAxisInfo55*38e8c45fSAndroid Build Coastguard Worker AxisInfo() : mode(MODE_NORMAL), axis(-1), highAxis(-1), splitValue(0), flatOverride(-1) { 56*38e8c45fSAndroid Build Coastguard Worker } 57*38e8c45fSAndroid Build Coastguard Worker }; 58*38e8c45fSAndroid Build Coastguard Worker 59*38e8c45fSAndroid Build Coastguard Worker /** 60*38e8c45fSAndroid Build Coastguard Worker * Describes a mapping from keyboard scan codes and joystick axes to Android key codes and axes. 61*38e8c45fSAndroid Build Coastguard Worker * 62*38e8c45fSAndroid Build Coastguard Worker * This object is immutable after it has been loaded. 63*38e8c45fSAndroid Build Coastguard Worker */ 64*38e8c45fSAndroid Build Coastguard Worker class KeyLayoutMap { 65*38e8c45fSAndroid Build Coastguard Worker public: 66*38e8c45fSAndroid Build Coastguard Worker static base::Result<std::shared_ptr<KeyLayoutMap>> load(const std::string& filename, 67*38e8c45fSAndroid Build Coastguard Worker const char* contents = nullptr); 68*38e8c45fSAndroid Build Coastguard Worker static base::Result<std::shared_ptr<KeyLayoutMap>> loadContents(const std::string& filename, 69*38e8c45fSAndroid Build Coastguard Worker const char* contents); 70*38e8c45fSAndroid Build Coastguard Worker 71*38e8c45fSAndroid Build Coastguard Worker status_t mapKey(int32_t scanCode, int32_t usageCode, 72*38e8c45fSAndroid Build Coastguard Worker int32_t* outKeyCode, uint32_t* outFlags) const; 73*38e8c45fSAndroid Build Coastguard Worker std::vector<int32_t> findScanCodesForKey(int32_t keyCode) const; 74*38e8c45fSAndroid Build Coastguard Worker std::optional<int32_t> findScanCodeForLed(int32_t ledCode) const; 75*38e8c45fSAndroid Build Coastguard Worker std::vector<int32_t> findUsageCodesForKey(int32_t keyCode) const; 76*38e8c45fSAndroid Build Coastguard Worker std::optional<int32_t> findUsageCodeForLed(int32_t ledCode) const; 77*38e8c45fSAndroid Build Coastguard Worker 78*38e8c45fSAndroid Build Coastguard Worker std::optional<AxisInfo> mapAxis(int32_t scanCode) const; 79*38e8c45fSAndroid Build Coastguard Worker const std::string getLoadFileName() const; 80*38e8c45fSAndroid Build Coastguard Worker // Return pair of sensor type and sensor data index, for the input device abs code 81*38e8c45fSAndroid Build Coastguard Worker base::Result<std::pair<InputDeviceSensorType, int32_t>> mapSensor(int32_t absCode) const; 82*38e8c45fSAndroid Build Coastguard Worker 83*38e8c45fSAndroid Build Coastguard Worker virtual ~KeyLayoutMap(); 84*38e8c45fSAndroid Build Coastguard Worker 85*38e8c45fSAndroid Build Coastguard Worker private: 86*38e8c45fSAndroid Build Coastguard Worker static base::Result<std::shared_ptr<KeyLayoutMap>> load(Tokenizer* tokenizer); 87*38e8c45fSAndroid Build Coastguard Worker 88*38e8c45fSAndroid Build Coastguard Worker struct Key { 89*38e8c45fSAndroid Build Coastguard Worker int32_t keyCode; 90*38e8c45fSAndroid Build Coastguard Worker uint32_t flags; 91*38e8c45fSAndroid Build Coastguard Worker }; 92*38e8c45fSAndroid Build Coastguard Worker 93*38e8c45fSAndroid Build Coastguard Worker struct Led { 94*38e8c45fSAndroid Build Coastguard Worker int32_t ledCode; 95*38e8c45fSAndroid Build Coastguard Worker }; 96*38e8c45fSAndroid Build Coastguard Worker 97*38e8c45fSAndroid Build Coastguard Worker struct Sensor { 98*38e8c45fSAndroid Build Coastguard Worker InputDeviceSensorType sensorType; 99*38e8c45fSAndroid Build Coastguard Worker int32_t sensorDataIndex; 100*38e8c45fSAndroid Build Coastguard Worker }; 101*38e8c45fSAndroid Build Coastguard Worker 102*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t, Key> mKeysByScanCode; 103*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t, Key> mKeysByUsageCode; 104*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t, AxisInfo> mAxes; 105*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t, Led> mLedsByScanCode; 106*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t, Led> mLedsByUsageCode; 107*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t, Sensor> mSensorsByAbsCode; 108*38e8c45fSAndroid Build Coastguard Worker std::set<std::string> mRequiredKernelConfigs; 109*38e8c45fSAndroid Build Coastguard Worker std::string mLoadFileName; 110*38e8c45fSAndroid Build Coastguard Worker 111*38e8c45fSAndroid Build Coastguard Worker KeyLayoutMap(); 112*38e8c45fSAndroid Build Coastguard Worker 113*38e8c45fSAndroid Build Coastguard Worker const Key* getKey(int32_t scanCode, int32_t usageCode) const; 114*38e8c45fSAndroid Build Coastguard Worker 115*38e8c45fSAndroid Build Coastguard Worker class Parser { 116*38e8c45fSAndroid Build Coastguard Worker KeyLayoutMap* mMap; 117*38e8c45fSAndroid Build Coastguard Worker Tokenizer* mTokenizer; 118*38e8c45fSAndroid Build Coastguard Worker 119*38e8c45fSAndroid Build Coastguard Worker public: 120*38e8c45fSAndroid Build Coastguard Worker Parser(KeyLayoutMap* map, Tokenizer* tokenizer); 121*38e8c45fSAndroid Build Coastguard Worker ~Parser(); 122*38e8c45fSAndroid Build Coastguard Worker status_t parse(); 123*38e8c45fSAndroid Build Coastguard Worker 124*38e8c45fSAndroid Build Coastguard Worker private: 125*38e8c45fSAndroid Build Coastguard Worker status_t parseKey(); 126*38e8c45fSAndroid Build Coastguard Worker status_t parseAxis(); 127*38e8c45fSAndroid Build Coastguard Worker status_t parseLed(); 128*38e8c45fSAndroid Build Coastguard Worker status_t parseSensor(); 129*38e8c45fSAndroid Build Coastguard Worker status_t parseRequiredKernelConfig(); 130*38e8c45fSAndroid Build Coastguard Worker }; 131*38e8c45fSAndroid Build Coastguard Worker }; 132*38e8c45fSAndroid Build Coastguard Worker 133*38e8c45fSAndroid Build Coastguard Worker } // namespace android 134