1 /* 2 * Copyright (C) 2014-2018 Team Kodi 3 * This file is part of Kodi - https://kodi.tv 4 * 5 * SPDX-License-Identifier: GPL-2.0-or-later 6 * See LICENSES/README.md for more information. 7 */ 8 9 #pragma once 10 11 #include "PeripheralAddon.h" // for FeatureMap 12 #include "input/joysticks/DriverPrimitive.h" 13 #include "input/joysticks/JoystickTypes.h" 14 #include "input/joysticks/interfaces/IButtonMap.h" 15 #include "peripherals/PeripheralTypes.h" 16 #include "threads/CriticalSection.h" 17 18 namespace PERIPHERALS 19 { 20 class CPeripheral; 21 22 class CAddonButtonMap : public KODI::JOYSTICK::IButtonMap 23 { 24 public: 25 CAddonButtonMap(CPeripheral* device, 26 const std::weak_ptr<CPeripheralAddon>& addon, 27 const std::string& strControllerId); 28 29 ~CAddonButtonMap(void) override; 30 31 // Implementation of IButtonMap ControllerID(void)32 std::string ControllerID(void) const override { return m_strControllerId; } 33 34 std::string Location(void) const override; 35 36 bool Load(void) override; 37 38 void Reset(void) override; 39 40 bool IsEmpty(void) const override; 41 42 bool GetFeature(const KODI::JOYSTICK::CDriverPrimitive& primitive, 43 KODI::JOYSTICK::FeatureName& feature) override; 44 45 KODI::JOYSTICK::FEATURE_TYPE GetFeatureType(const KODI::JOYSTICK::FeatureName& feature) override; 46 47 bool GetScalar(const KODI::JOYSTICK::FeatureName& feature, 48 KODI::JOYSTICK::CDriverPrimitive& primitive) override; 49 50 void AddScalar(const KODI::JOYSTICK::FeatureName& feature, 51 const KODI::JOYSTICK::CDriverPrimitive& primitive) override; 52 53 bool GetAnalogStick(const KODI::JOYSTICK::FeatureName& feature, 54 KODI::JOYSTICK::ANALOG_STICK_DIRECTION direction, 55 KODI::JOYSTICK::CDriverPrimitive& primitive) override; 56 57 void AddAnalogStick(const KODI::JOYSTICK::FeatureName& feature, 58 KODI::JOYSTICK::ANALOG_STICK_DIRECTION direction, 59 const KODI::JOYSTICK::CDriverPrimitive& primitive) override; 60 61 bool GetRelativePointer(const KODI::JOYSTICK::FeatureName& feature, 62 KODI::JOYSTICK::RELATIVE_POINTER_DIRECTION direction, 63 KODI::JOYSTICK::CDriverPrimitive& primitive) override; 64 65 void AddRelativePointer(const KODI::JOYSTICK::FeatureName& feature, 66 KODI::JOYSTICK::RELATIVE_POINTER_DIRECTION direction, 67 const KODI::JOYSTICK::CDriverPrimitive& primitive) override; 68 69 bool GetAccelerometer(const KODI::JOYSTICK::FeatureName& feature, 70 KODI::JOYSTICK::CDriverPrimitive& positiveX, 71 KODI::JOYSTICK::CDriverPrimitive& positiveY, 72 KODI::JOYSTICK::CDriverPrimitive& positiveZ) override; 73 74 void AddAccelerometer(const KODI::JOYSTICK::FeatureName& feature, 75 const KODI::JOYSTICK::CDriverPrimitive& positiveX, 76 const KODI::JOYSTICK::CDriverPrimitive& positiveY, 77 const KODI::JOYSTICK::CDriverPrimitive& positiveZ) override; 78 79 bool GetWheel(const KODI::JOYSTICK::FeatureName& feature, 80 KODI::JOYSTICK::WHEEL_DIRECTION direction, 81 KODI::JOYSTICK::CDriverPrimitive& primitive) override; 82 83 void AddWheel(const KODI::JOYSTICK::FeatureName& feature, 84 KODI::JOYSTICK::WHEEL_DIRECTION direction, 85 const KODI::JOYSTICK::CDriverPrimitive& primitive) override; 86 87 bool GetThrottle(const KODI::JOYSTICK::FeatureName& feature, 88 KODI::JOYSTICK::THROTTLE_DIRECTION direction, 89 KODI::JOYSTICK::CDriverPrimitive& primitive) override; 90 91 void AddThrottle(const KODI::JOYSTICK::FeatureName& feature, 92 KODI::JOYSTICK::THROTTLE_DIRECTION direction, 93 const KODI::JOYSTICK::CDriverPrimitive& primitive) override; 94 95 bool GetKey(const KODI::JOYSTICK::FeatureName& feature, 96 KODI::JOYSTICK::CDriverPrimitive& primitive) override; 97 98 void AddKey(const KODI::JOYSTICK::FeatureName& feature, 99 const KODI::JOYSTICK::CDriverPrimitive& primitive) override; 100 101 void SetIgnoredPrimitives( 102 const std::vector<KODI::JOYSTICK::CDriverPrimitive>& primitives) override; 103 104 bool IsIgnored(const KODI::JOYSTICK::CDriverPrimitive& primitive) override; 105 106 bool GetAxisProperties(unsigned int axisIndex, int& center, unsigned int& range) override; 107 108 void SaveButtonMap() override; 109 110 void RevertButtonMap() override; 111 112 private: 113 typedef std::map<KODI::JOYSTICK::CDriverPrimitive, KODI::JOYSTICK::FeatureName> DriverMap; 114 typedef std::vector<KODI::JOYSTICK::CDriverPrimitive> JoystickPrimitiveVector; 115 116 // Utility functions 117 static DriverMap CreateLookupTable(const FeatureMap& features); 118 119 static JOYSTICK_FEATURE_PRIMITIVE GetAnalogStickIndex(KODI::JOYSTICK::ANALOG_STICK_DIRECTION dir); 120 static JOYSTICK_FEATURE_PRIMITIVE GetRelativePointerIndex( 121 KODI::JOYSTICK::RELATIVE_POINTER_DIRECTION dir); 122 static JOYSTICK_FEATURE_PRIMITIVE GetPrimitiveIndex(KODI::JOYSTICK::WHEEL_DIRECTION dir); 123 static JOYSTICK_FEATURE_PRIMITIVE GetPrimitiveIndex(KODI::JOYSTICK::THROTTLE_DIRECTION dir); 124 125 CPeripheral* const m_device; 126 std::weak_ptr<CPeripheralAddon> m_addon; 127 const std::string m_strControllerId; 128 FeatureMap m_features; 129 DriverMap m_driverMap; 130 JoystickPrimitiveVector m_ignoredPrimitives; 131 mutable CCriticalSection m_mutex; 132 }; 133 } // namespace PERIPHERALS 134