1*38e8c45fSAndroid Build Coastguard Worker /* 2*38e8c45fSAndroid Build Coastguard Worker * Copyright 2022 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 <condition_variable> 20*38e8c45fSAndroid Build Coastguard Worker #include <mutex> 21*38e8c45fSAndroid Build Coastguard Worker #include <optional> 22*38e8c45fSAndroid Build Coastguard Worker #include <unordered_map> 23*38e8c45fSAndroid Build Coastguard Worker #include <vector> 24*38e8c45fSAndroid Build Coastguard Worker 25*38e8c45fSAndroid Build Coastguard Worker #include <EventHub.h> 26*38e8c45fSAndroid Build Coastguard Worker #include <InputDevice.h> 27*38e8c45fSAndroid Build Coastguard Worker #include <ftl/flags.h> 28*38e8c45fSAndroid Build Coastguard Worker #include <input/PropertyMap.h> 29*38e8c45fSAndroid Build Coastguard Worker #include <input/VirtualKeyMap.h> 30*38e8c45fSAndroid Build Coastguard Worker #include <utils/Errors.h> 31*38e8c45fSAndroid Build Coastguard Worker #include <utils/KeyedVector.h> 32*38e8c45fSAndroid Build Coastguard Worker 33*38e8c45fSAndroid Build Coastguard Worker namespace android { 34*38e8c45fSAndroid Build Coastguard Worker 35*38e8c45fSAndroid Build Coastguard Worker class FakeEventHub : public EventHubInterface { 36*38e8c45fSAndroid Build Coastguard Worker struct KeyInfo { 37*38e8c45fSAndroid Build Coastguard Worker int32_t keyCode; 38*38e8c45fSAndroid Build Coastguard Worker uint32_t flags; 39*38e8c45fSAndroid Build Coastguard Worker }; 40*38e8c45fSAndroid Build Coastguard Worker 41*38e8c45fSAndroid Build Coastguard Worker struct SensorInfo { 42*38e8c45fSAndroid Build Coastguard Worker InputDeviceSensorType sensorType; 43*38e8c45fSAndroid Build Coastguard Worker int32_t sensorDataIndex; 44*38e8c45fSAndroid Build Coastguard Worker }; 45*38e8c45fSAndroid Build Coastguard Worker 46*38e8c45fSAndroid Build Coastguard Worker struct Device { 47*38e8c45fSAndroid Build Coastguard Worker InputDeviceIdentifier identifier; 48*38e8c45fSAndroid Build Coastguard Worker ftl::Flags<InputDeviceClass> classes; 49*38e8c45fSAndroid Build Coastguard Worker PropertyMap configuration; 50*38e8c45fSAndroid Build Coastguard Worker KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes; 51*38e8c45fSAndroid Build Coastguard Worker KeyedVector<int, bool> relativeAxes; 52*38e8c45fSAndroid Build Coastguard Worker KeyedVector<int32_t, int32_t> keyCodeStates; 53*38e8c45fSAndroid Build Coastguard Worker KeyedVector<int32_t, int32_t> scanCodeStates; 54*38e8c45fSAndroid Build Coastguard Worker KeyedVector<int32_t, int32_t> switchStates; 55*38e8c45fSAndroid Build Coastguard Worker KeyedVector<int32_t, int32_t> absoluteAxisValue; 56*38e8c45fSAndroid Build Coastguard Worker KeyedVector<int32_t, KeyInfo> keysByScanCode; 57*38e8c45fSAndroid Build Coastguard Worker KeyedVector<int32_t, KeyInfo> keysByUsageCode; 58*38e8c45fSAndroid Build Coastguard Worker std::map<int32_t, int32_t> keyRemapping; 59*38e8c45fSAndroid Build Coastguard Worker KeyedVector<int32_t, bool> leds; 60*38e8c45fSAndroid Build Coastguard Worker // fake mapping which would normally come from keyCharacterMap 61*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t, int32_t> keyCodeMapping; 62*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t, SensorInfo> sensorsByAbsCode; 63*38e8c45fSAndroid Build Coastguard Worker BitArray<MSC_MAX> mscBitmask; 64*38e8c45fSAndroid Build Coastguard Worker std::vector<VirtualKeyDefinition> virtualKeys; 65*38e8c45fSAndroid Build Coastguard Worker bool enabled; 66*38e8c45fSAndroid Build Coastguard Worker std::optional<RawLayoutInfo> layoutInfo; 67*38e8c45fSAndroid Build Coastguard Worker std::string sysfsRootPath; 68*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t, std::vector<int32_t>> mtSlotValues; 69*38e8c45fSAndroid Build Coastguard Worker enableDevice70*38e8c45fSAndroid Build Coastguard Worker status_t enable() { 71*38e8c45fSAndroid Build Coastguard Worker enabled = true; 72*38e8c45fSAndroid Build Coastguard Worker return OK; 73*38e8c45fSAndroid Build Coastguard Worker } 74*38e8c45fSAndroid Build Coastguard Worker disableDevice75*38e8c45fSAndroid Build Coastguard Worker status_t disable() { 76*38e8c45fSAndroid Build Coastguard Worker enabled = false; 77*38e8c45fSAndroid Build Coastguard Worker return OK; 78*38e8c45fSAndroid Build Coastguard Worker } 79*38e8c45fSAndroid Build Coastguard Worker DeviceDevice80*38e8c45fSAndroid Build Coastguard Worker explicit Device(ftl::Flags<InputDeviceClass> classes) : classes(classes), enabled(true) {} 81*38e8c45fSAndroid Build Coastguard Worker }; 82*38e8c45fSAndroid Build Coastguard Worker 83*38e8c45fSAndroid Build Coastguard Worker std::mutex mLock; 84*38e8c45fSAndroid Build Coastguard Worker std::condition_variable mEventsCondition; 85*38e8c45fSAndroid Build Coastguard Worker 86*38e8c45fSAndroid Build Coastguard Worker KeyedVector<int32_t, Device*> mDevices; 87*38e8c45fSAndroid Build Coastguard Worker std::vector<std::string> mExcludedDevices; 88*38e8c45fSAndroid Build Coastguard Worker std::vector<RawEvent> mEvents GUARDED_BY(mLock); 89*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t /*deviceId*/, std::vector<TouchVideoFrame>> mVideoFrames; 90*38e8c45fSAndroid Build Coastguard Worker std::vector<int32_t> mVibrators = {0, 1}; 91*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t, RawLightInfo> mRawLightInfos; 92*38e8c45fSAndroid Build Coastguard Worker // Simulates a device light brightness, from light id to light brightness. 93*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t /* lightId */, int32_t /* brightness*/> mLightBrightness; 94*38e8c45fSAndroid Build Coastguard Worker // Simulates a device light intensities, from light id to light intensities map. 95*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t /* lightId */, std::unordered_map<LightColor, int32_t>> 96*38e8c45fSAndroid Build Coastguard Worker mLightIntensities; 97*38e8c45fSAndroid Build Coastguard Worker // fake sysfs node path and value. 98*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t /*deviceId*/, bool /* wakeupNode*/> mKernelWakeup; 99*38e8c45fSAndroid Build Coastguard Worker 100*38e8c45fSAndroid Build Coastguard Worker public: 101*38e8c45fSAndroid Build Coastguard Worker static constexpr int32_t DEFAULT_BATTERY = 1; 102*38e8c45fSAndroid Build Coastguard Worker static constexpr int32_t BATTERY_STATUS = 4; 103*38e8c45fSAndroid Build Coastguard Worker static constexpr int32_t BATTERY_CAPACITY = 66; 104*38e8c45fSAndroid Build Coastguard Worker static const std::string BATTERY_DEVPATH; 105*38e8c45fSAndroid Build Coastguard Worker 106*38e8c45fSAndroid Build Coastguard Worker virtual ~FakeEventHub(); FakeEventHub()107*38e8c45fSAndroid Build Coastguard Worker FakeEventHub() {} 108*38e8c45fSAndroid Build Coastguard Worker 109*38e8c45fSAndroid Build Coastguard Worker void addDevice(int32_t deviceId, const std::string& name, ftl::Flags<InputDeviceClass> classes, 110*38e8c45fSAndroid Build Coastguard Worker int bus = 0); 111*38e8c45fSAndroid Build Coastguard Worker void removeDevice(int32_t deviceId); 112*38e8c45fSAndroid Build Coastguard Worker 113*38e8c45fSAndroid Build Coastguard Worker bool isDeviceEnabled(int32_t deviceId) const override; 114*38e8c45fSAndroid Build Coastguard Worker status_t enableDevice(int32_t deviceId) override; 115*38e8c45fSAndroid Build Coastguard Worker status_t disableDevice(int32_t deviceId) override; 116*38e8c45fSAndroid Build Coastguard Worker 117*38e8c45fSAndroid Build Coastguard Worker void addConfigurationProperty(int32_t deviceId, const char* key, const char* value); 118*38e8c45fSAndroid Build Coastguard Worker void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration); 119*38e8c45fSAndroid Build Coastguard Worker 120*38e8c45fSAndroid Build Coastguard Worker void addAbsoluteAxis(int32_t deviceId, int axis, int32_t minValue, int32_t maxValue, int flat, 121*38e8c45fSAndroid Build Coastguard Worker int fuzz, int resolution = 0); 122*38e8c45fSAndroid Build Coastguard Worker void addRelativeAxis(int32_t deviceId, int32_t axis); 123*38e8c45fSAndroid Build Coastguard Worker void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value); 124*38e8c45fSAndroid Build Coastguard Worker 125*38e8c45fSAndroid Build Coastguard Worker void setRawLayoutInfo(int32_t deviceId, RawLayoutInfo info); 126*38e8c45fSAndroid Build Coastguard Worker 127*38e8c45fSAndroid Build Coastguard Worker void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state); 128*38e8c45fSAndroid Build Coastguard Worker void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state); 129*38e8c45fSAndroid Build Coastguard Worker void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state); 130*38e8c45fSAndroid Build Coastguard Worker 131*38e8c45fSAndroid Build Coastguard Worker void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, int32_t keyCode, 132*38e8c45fSAndroid Build Coastguard Worker uint32_t flags); 133*38e8c45fSAndroid Build Coastguard Worker void addKeyCodeMapping(int32_t deviceId, int32_t fromKeyCode, int32_t toKeyCode); 134*38e8c45fSAndroid Build Coastguard Worker void setKeyRemapping(int32_t deviceId, const std::map<int32_t, int32_t>& keyRemapping) const; 135*38e8c45fSAndroid Build Coastguard Worker void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition); 136*38e8c45fSAndroid Build Coastguard Worker 137*38e8c45fSAndroid Build Coastguard Worker void addSensorAxis(int32_t deviceId, int32_t absCode, InputDeviceSensorType sensorType, 138*38e8c45fSAndroid Build Coastguard Worker int32_t sensorDataIndex); 139*38e8c45fSAndroid Build Coastguard Worker 140*38e8c45fSAndroid Build Coastguard Worker void setMscEvent(int32_t deviceId, int32_t mscEvent); 141*38e8c45fSAndroid Build Coastguard Worker 142*38e8c45fSAndroid Build Coastguard Worker void addLed(int32_t deviceId, int32_t led, bool initialState); 143*38e8c45fSAndroid Build Coastguard Worker void addRawLightInfo(int32_t rawId, RawLightInfo&& info); 144*38e8c45fSAndroid Build Coastguard Worker void fakeLightBrightness(int32_t rawId, int32_t brightness); 145*38e8c45fSAndroid Build Coastguard Worker void fakeLightIntensities(int32_t rawId, 146*38e8c45fSAndroid Build Coastguard Worker const std::unordered_map<LightColor, int32_t> intensities); 147*38e8c45fSAndroid Build Coastguard Worker bool getLedState(int32_t deviceId, int32_t led); 148*38e8c45fSAndroid Build Coastguard Worker 149*38e8c45fSAndroid Build Coastguard Worker std::vector<std::string>& getExcludedDevices(); 150*38e8c45fSAndroid Build Coastguard Worker 151*38e8c45fSAndroid Build Coastguard Worker void setVideoFrames( 152*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<int32_t /*deviceId*/, std::vector<TouchVideoFrame>> videoFrames); 153*38e8c45fSAndroid Build Coastguard Worker 154*38e8c45fSAndroid Build Coastguard Worker void enqueueEvent(nsecs_t when, nsecs_t readTime, int32_t deviceId, int32_t type, int32_t code, 155*38e8c45fSAndroid Build Coastguard Worker int32_t value); 156*38e8c45fSAndroid Build Coastguard Worker void assertQueueIsEmpty(); 157*38e8c45fSAndroid Build Coastguard Worker void setSysfsRootPath(int32_t deviceId, std::string sysfsRootPath) const; 158*38e8c45fSAndroid Build Coastguard Worker // Populate fake slot values to be returned by the getter, size of the values should be equal to 159*38e8c45fSAndroid Build Coastguard Worker // the slot count 160*38e8c45fSAndroid Build Coastguard Worker void setMtSlotValues(int32_t deviceId, int32_t axis, const std::vector<int32_t>& values); 161*38e8c45fSAndroid Build Coastguard Worker base::Result<std::vector<int32_t>> getMtSlotValues(int32_t deviceId, int32_t axis, 162*38e8c45fSAndroid Build Coastguard Worker size_t slotCount) const override; 163*38e8c45fSAndroid Build Coastguard Worker bool setKernelWakeEnabled(int32_t deviceId, bool enabled) override; 164*38e8c45fSAndroid Build Coastguard Worker bool fakeReadKernelWakeup(int32_t deviceId) const; 165*38e8c45fSAndroid Build Coastguard Worker 166*38e8c45fSAndroid Build Coastguard Worker private: 167*38e8c45fSAndroid Build Coastguard Worker Device* getDevice(int32_t deviceId) const; 168*38e8c45fSAndroid Build Coastguard Worker 169*38e8c45fSAndroid Build Coastguard Worker ftl::Flags<InputDeviceClass> getDeviceClasses(int32_t deviceId) const override; 170*38e8c45fSAndroid Build Coastguard Worker InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const override; 171*38e8c45fSAndroid Build Coastguard Worker int32_t getDeviceControllerNumber(int32_t) const override; 172*38e8c45fSAndroid Build Coastguard Worker std::optional<PropertyMap> getConfiguration(int32_t deviceId) const override; 173*38e8c45fSAndroid Build Coastguard Worker std::optional<RawAbsoluteAxisInfo> getAbsoluteAxisInfo(int32_t deviceId, 174*38e8c45fSAndroid Build Coastguard Worker int axis) const override; 175*38e8c45fSAndroid Build Coastguard Worker bool hasRelativeAxis(int32_t deviceId, int axis) const override; 176*38e8c45fSAndroid Build Coastguard Worker bool hasInputProperty(int32_t, int) const override; 177*38e8c45fSAndroid Build Coastguard Worker bool hasMscEvent(int32_t deviceId, int mscEvent) const override final; 178*38e8c45fSAndroid Build Coastguard Worker status_t mapKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, int32_t metaState, 179*38e8c45fSAndroid Build Coastguard Worker int32_t* outKeycode, int32_t* outMetaState, uint32_t* outFlags) const override; 180*38e8c45fSAndroid Build Coastguard Worker const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const; 181*38e8c45fSAndroid Build Coastguard Worker 182*38e8c45fSAndroid Build Coastguard Worker status_t mapAxis(int32_t, int32_t, AxisInfo*) const override; 183*38e8c45fSAndroid Build Coastguard Worker base::Result<std::pair<InputDeviceSensorType, int32_t>> mapSensor( 184*38e8c45fSAndroid Build Coastguard Worker int32_t deviceId, int32_t absCode) const override; 185*38e8c45fSAndroid Build Coastguard Worker void setExcludedDevices(const std::vector<std::string>& devices) override; 186*38e8c45fSAndroid Build Coastguard Worker std::vector<RawEvent> getEvents(int) override; 187*38e8c45fSAndroid Build Coastguard Worker std::vector<TouchVideoFrame> getVideoFrames(int32_t deviceId) override; 188*38e8c45fSAndroid Build Coastguard Worker int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const override; 189*38e8c45fSAndroid Build Coastguard Worker std::optional<RawLayoutInfo> getRawLayoutInfo(int32_t deviceId) const override; 190*38e8c45fSAndroid Build Coastguard Worker int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const override; 191*38e8c45fSAndroid Build Coastguard Worker int32_t getSwitchState(int32_t deviceId, int32_t sw) const override; 192*38e8c45fSAndroid Build Coastguard Worker std::optional<int32_t> getAbsoluteAxisValue(int32_t deviceId, int32_t axis) const override; 193*38e8c45fSAndroid Build Coastguard Worker int32_t getKeyCodeForKeyLocation(int32_t deviceId, int32_t locationKeyCode) const override; 194*38e8c45fSAndroid Build Coastguard Worker 195*38e8c45fSAndroid Build Coastguard Worker // Return true if the device has non-empty key layout. 196*38e8c45fSAndroid Build Coastguard Worker bool markSupportedKeyCodes(int32_t deviceId, const std::vector<int32_t>& keyCodes, 197*38e8c45fSAndroid Build Coastguard Worker uint8_t* outFlags) const override; 198*38e8c45fSAndroid Build Coastguard Worker bool hasScanCode(int32_t deviceId, int32_t scanCode) const override; 199*38e8c45fSAndroid Build Coastguard Worker bool hasKeyCode(int32_t deviceId, int32_t keyCode) const override; 200*38e8c45fSAndroid Build Coastguard Worker bool hasLed(int32_t deviceId, int32_t led) const override; 201*38e8c45fSAndroid Build Coastguard Worker void setLedState(int32_t deviceId, int32_t led, bool on) override; 202*38e8c45fSAndroid Build Coastguard Worker void getVirtualKeyDefinitions(int32_t deviceId, 203*38e8c45fSAndroid Build Coastguard Worker std::vector<VirtualKeyDefinition>& outVirtualKeys) const override; 204*38e8c45fSAndroid Build Coastguard Worker const std::shared_ptr<KeyCharacterMap> getKeyCharacterMap(int32_t) const override; 205*38e8c45fSAndroid Build Coastguard Worker bool setKeyboardLayoutOverlay(int32_t, std::shared_ptr<KeyCharacterMap>) override; 206*38e8c45fSAndroid Build Coastguard Worker vibrate(int32_t,const VibrationElement &)207*38e8c45fSAndroid Build Coastguard Worker void vibrate(int32_t, const VibrationElement&) override {} cancelVibrate(int32_t)208*38e8c45fSAndroid Build Coastguard Worker void cancelVibrate(int32_t) override {} 209*38e8c45fSAndroid Build Coastguard Worker std::vector<int32_t> getVibratorIds(int32_t deviceId) const override; 210*38e8c45fSAndroid Build Coastguard Worker 211*38e8c45fSAndroid Build Coastguard Worker std::optional<int32_t> getBatteryCapacity(int32_t, int32_t) const override; 212*38e8c45fSAndroid Build Coastguard Worker std::optional<int32_t> getBatteryStatus(int32_t, int32_t) const override; 213*38e8c45fSAndroid Build Coastguard Worker std::vector<int32_t> getRawBatteryIds(int32_t deviceId) const override; 214*38e8c45fSAndroid Build Coastguard Worker std::optional<RawBatteryInfo> getRawBatteryInfo(int32_t deviceId, 215*38e8c45fSAndroid Build Coastguard Worker int32_t batteryId) const override; 216*38e8c45fSAndroid Build Coastguard Worker 217*38e8c45fSAndroid Build Coastguard Worker std::vector<int32_t> getRawLightIds(int32_t deviceId) const override; 218*38e8c45fSAndroid Build Coastguard Worker std::optional<RawLightInfo> getRawLightInfo(int32_t deviceId, int32_t lightId) const override; 219*38e8c45fSAndroid Build Coastguard Worker void setLightBrightness(int32_t deviceId, int32_t lightId, int32_t brightness) override; 220*38e8c45fSAndroid Build Coastguard Worker void setLightIntensities(int32_t deviceId, int32_t lightId, 221*38e8c45fSAndroid Build Coastguard Worker std::unordered_map<LightColor, int32_t> intensities) override; 222*38e8c45fSAndroid Build Coastguard Worker std::optional<int32_t> getLightBrightness(int32_t deviceId, int32_t lightId) const override; 223*38e8c45fSAndroid Build Coastguard Worker std::optional<std::unordered_map<LightColor, int32_t>> getLightIntensities( 224*38e8c45fSAndroid Build Coastguard Worker int32_t deviceId, int32_t lightId) const override; 225*38e8c45fSAndroid Build Coastguard Worker void sysfsNodeChanged(const std::string& sysfsNodePath) override; dump(std::string &)226*38e8c45fSAndroid Build Coastguard Worker void dump(std::string&) const override {} monitor()227*38e8c45fSAndroid Build Coastguard Worker void monitor() const override {} requestReopenDevices()228*38e8c45fSAndroid Build Coastguard Worker void requestReopenDevices() override {} wake()229*38e8c45fSAndroid Build Coastguard Worker void wake() override {} 230*38e8c45fSAndroid Build Coastguard Worker }; 231*38e8c45fSAndroid Build Coastguard Worker 232*38e8c45fSAndroid Build Coastguard Worker } // namespace android 233