1 /* 2 * Copyright (C) 2021 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_LIGHT_CONTROLLER_H 18 #define _UI_INPUTREADER_LIGHT_CONTROLLER_H 19 20 #include "PeripheralControllerInterface.h" 21 22 namespace android { 23 24 class PeripheralController : public PeripheralControllerInterface { 25 // Refer to https://developer.android.com/reference/kotlin/android/graphics/Color 26 /* Number of colors : {red, green, blue} */ 27 static constexpr size_t COLOR_NUM = 3; 28 static constexpr int32_t MAX_BRIGHTNESS = 0xff; 29 30 public: 31 explicit PeripheralController(InputDeviceContext& deviceContext); 32 ~PeripheralController() override; 33 34 void populateDeviceInfo(InputDeviceInfo* deviceInfo) override; 35 void dump(std::string& dump) override; 36 bool setLightColor(int32_t lightId, int32_t color) override; 37 bool setLightPlayerId(int32_t lightId, int32_t playerId) override; 38 std::optional<int32_t> getLightColor(int32_t lightId) override; 39 std::optional<int32_t> getLightPlayerId(int32_t lightId) override; 40 std::optional<int32_t> getBatteryCapacity(int32_t batteryId) override; 41 std::optional<int32_t> getBatteryStatus(int32_t batteryId) override; 42 43 private: getDeviceId()44 inline int32_t getDeviceId() { return mDeviceContext.getId(); } getDeviceContext()45 inline InputDeviceContext& getDeviceContext() { return mDeviceContext; } 46 47 InputDeviceContext& mDeviceContext; 48 void configureLights(); 49 void configureBattries(); 50 51 struct Battery { BatteryBattery52 explicit Battery(InputDeviceContext& context, const std::string& name, int32_t id) 53 : context(context), name(name), id(id) {} ~BatteryBattery54 virtual ~Battery() {} 55 InputDeviceContext& context; 56 std::string name; 57 int32_t id; 58 }; 59 60 struct Light { LightLight61 explicit Light(InputDeviceContext& context, const std::string& name, int32_t id, 62 InputDeviceLightType type) 63 : context(context), name(name), id(id), type(type) {} ~LightLight64 virtual ~Light() {} 65 InputDeviceContext& context; 66 std::string name; 67 int32_t id; 68 InputDeviceLightType type; 69 setLightColorLight70 virtual bool setLightColor(int32_t color) { return false; } getLightColorLight71 virtual std::optional<int32_t> getLightColor() { return std::nullopt; } setLightPlayerIdLight72 virtual bool setLightPlayerId(int32_t playerId) { return false; } getLightPlayerIdLight73 virtual std::optional<int32_t> getLightPlayerId() { return std::nullopt; } 74 dumpLight75 virtual void dump(std::string& dump) {} 76 77 std::optional<std::int32_t> getRawLightBrightness(int32_t rawLightId); 78 void setRawLightBrightness(int32_t rawLightId, int32_t brightness); 79 }; 80 81 struct MonoLight : public Light { MonoLightMonoLight82 explicit MonoLight(InputDeviceContext& context, const std::string& name, int32_t id, 83 int32_t rawId) 84 : Light(context, name, id, InputDeviceLightType::MONO), rawId(rawId) {} 85 int32_t rawId; 86 87 bool setLightColor(int32_t color) override; 88 std::optional<int32_t> getLightColor() override; 89 void dump(std::string& dump) override; 90 }; 91 92 struct RgbLight : public Light { RgbLightRgbLight93 explicit RgbLight(InputDeviceContext& context, int32_t id, 94 const std::unordered_map<LightColor, int32_t>& rawRgbIds, 95 std::optional<int32_t> rawGlobalId) 96 : Light(context, "RGB", id, InputDeviceLightType::RGB), 97 rawRgbIds(rawRgbIds), 98 rawGlobalId(rawGlobalId) { 99 brightness = rawGlobalId.has_value() 100 ? getRawLightBrightness(rawGlobalId.value()).value_or(MAX_BRIGHTNESS) 101 : MAX_BRIGHTNESS; 102 } 103 // Map from color to raw light id. 104 std::unordered_map<LightColor, int32_t /* rawLightId */> rawRgbIds; 105 // Optional global control raw light id. 106 std::optional<int32_t> rawGlobalId; 107 int32_t brightness; 108 109 bool setLightColor(int32_t color) override; 110 std::optional<int32_t> getLightColor() override; 111 void dump(std::string& dump) override; 112 }; 113 114 struct MultiColorLight : public Light { MultiColorLightMultiColorLight115 explicit MultiColorLight(InputDeviceContext& context, const std::string& name, int32_t id, 116 int32_t rawId) 117 : Light(context, name, id, InputDeviceLightType::MULTI_COLOR), rawId(rawId) {} 118 int32_t rawId; 119 120 bool setLightColor(int32_t color) override; 121 std::optional<int32_t> getLightColor() override; 122 void dump(std::string& dump) override; 123 }; 124 125 struct PlayerIdLight : public Light { PlayerIdLightPlayerIdLight126 explicit PlayerIdLight(InputDeviceContext& context, const std::string& name, int32_t id, 127 const std::unordered_map<int32_t, int32_t>& rawLightIds) 128 : Light(context, name, id, InputDeviceLightType::PLAYER_ID), 129 rawLightIds(rawLightIds) {} 130 // Map from player Id to raw light Id 131 std::unordered_map<int32_t, int32_t> rawLightIds; 132 133 bool setLightPlayerId(int32_t palyerId) override; 134 std::optional<int32_t> getLightPlayerId() override; 135 void dump(std::string& dump) override; 136 }; 137 138 int32_t mNextId = 0; 139 140 // Light color map from light color to the color index. 141 static const std::unordered_map<std::string, size_t> LIGHT_COLORS; 142 143 // Light map from light ID to Light 144 std::unordered_map<int32_t, std::unique_ptr<Light>> mLights; 145 146 // Battery map from battery ID to battery 147 std::unordered_map<int32_t, std::unique_ptr<Battery>> mBatteries; 148 }; 149 150 } // namespace android 151 152 #endif // _UI_INPUTREADER_LIGHT_CONTROLLER_H 153