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