1 /*
2  *  Copyright (C) 2015-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 #include "JoystickTranslator.h"
10 
11 #include "guilib/LocalizeStrings.h"
12 #include "input/joysticks/DriverPrimitive.h"
13 #include "utils/StringUtils.h"
14 
15 using namespace KODI;
16 using namespace JOYSTICK;
17 
HatStateToString(HAT_STATE state)18 const char* CJoystickTranslator::HatStateToString(HAT_STATE state)
19 {
20   switch (state)
21   {
22     case HAT_STATE::UP:
23       return "UP";
24     case HAT_STATE::DOWN:
25       return "DOWN";
26     case HAT_STATE::RIGHT:
27       return "RIGHT";
28     case HAT_STATE::LEFT:
29       return "LEFT";
30     case HAT_STATE::RIGHTUP:
31       return "UP RIGHT";
32     case HAT_STATE::RIGHTDOWN:
33       return "DOWN RIGHT";
34     case HAT_STATE::LEFTUP:
35       return "UP LEFT";
36     case HAT_STATE::LEFTDOWN:
37       return "DOWN LEFT";
38     default:
39       break;
40   }
41 
42   return "RELEASED";
43 }
44 
TranslateAnalogStickDirection(ANALOG_STICK_DIRECTION dir)45 const char* CJoystickTranslator::TranslateAnalogStickDirection(ANALOG_STICK_DIRECTION dir)
46 {
47   switch (dir)
48   {
49     case ANALOG_STICK_DIRECTION::UP:
50       return "up";
51     case ANALOG_STICK_DIRECTION::DOWN:
52       return "down";
53     case ANALOG_STICK_DIRECTION::RIGHT:
54       return "right";
55     case ANALOG_STICK_DIRECTION::LEFT:
56       return "left";
57     default:
58       break;
59   }
60 
61   return "";
62 }
63 
TranslateAnalogStickDirection(const std::string & dir)64 ANALOG_STICK_DIRECTION CJoystickTranslator::TranslateAnalogStickDirection(const std::string& dir)
65 {
66   if (dir == "up")
67     return ANALOG_STICK_DIRECTION::UP;
68   if (dir == "down")
69     return ANALOG_STICK_DIRECTION::DOWN;
70   if (dir == "right")
71     return ANALOG_STICK_DIRECTION::RIGHT;
72   if (dir == "left")
73     return ANALOG_STICK_DIRECTION::LEFT;
74 
75   return ANALOG_STICK_DIRECTION::NONE;
76 }
77 
TranslateWheelDirection(WHEEL_DIRECTION dir)78 const char* CJoystickTranslator::TranslateWheelDirection(WHEEL_DIRECTION dir)
79 {
80   switch (dir)
81   {
82     case WHEEL_DIRECTION::RIGHT:
83       return "right";
84     case WHEEL_DIRECTION::LEFT:
85       return "left";
86     default:
87       break;
88   }
89 
90   return "";
91 }
92 
TranslateWheelDirection(const std::string & dir)93 WHEEL_DIRECTION CJoystickTranslator::TranslateWheelDirection(const std::string& dir)
94 {
95   if (dir == "right")
96     return WHEEL_DIRECTION::RIGHT;
97   if (dir == "left")
98     return WHEEL_DIRECTION::LEFT;
99 
100   return WHEEL_DIRECTION::NONE;
101 }
102 
TranslateThrottleDirection(THROTTLE_DIRECTION dir)103 const char* CJoystickTranslator::TranslateThrottleDirection(THROTTLE_DIRECTION dir)
104 {
105   switch (dir)
106   {
107     case THROTTLE_DIRECTION::UP:
108       return "up";
109     case THROTTLE_DIRECTION::DOWN:
110       return "down";
111     default:
112       break;
113   }
114 
115   return "";
116 }
117 
TranslateThrottleDirection(const std::string & dir)118 THROTTLE_DIRECTION CJoystickTranslator::TranslateThrottleDirection(const std::string& dir)
119 {
120   if (dir == "up")
121     return THROTTLE_DIRECTION::UP;
122   if (dir == "down")
123     return THROTTLE_DIRECTION::DOWN;
124 
125   return THROTTLE_DIRECTION::NONE;
126 }
127 
PositionToSemiAxisDirection(float position)128 SEMIAXIS_DIRECTION CJoystickTranslator::PositionToSemiAxisDirection(float position)
129 {
130   if (position > 0)
131     return SEMIAXIS_DIRECTION::POSITIVE;
132   else if (position < 0)
133     return SEMIAXIS_DIRECTION::NEGATIVE;
134 
135   return SEMIAXIS_DIRECTION::ZERO;
136 }
137 
PositionToWheelDirection(float position)138 WHEEL_DIRECTION CJoystickTranslator::PositionToWheelDirection(float position)
139 {
140   if (position > 0.0f)
141     return WHEEL_DIRECTION::RIGHT;
142   else if (position < 0.0f)
143     return WHEEL_DIRECTION::LEFT;
144 
145   return WHEEL_DIRECTION::NONE;
146 }
147 
PositionToThrottleDirection(float position)148 THROTTLE_DIRECTION CJoystickTranslator::PositionToThrottleDirection(float position)
149 {
150   if (position > 0.0f)
151     return THROTTLE_DIRECTION::UP;
152   else if (position < 0.0f)
153     return THROTTLE_DIRECTION::DOWN;
154 
155   return THROTTLE_DIRECTION::NONE;
156 }
157 
GetPrimitiveName(const CDriverPrimitive & primitive)158 std::string CJoystickTranslator::GetPrimitiveName(const CDriverPrimitive& primitive)
159 {
160   std::string primitiveTemplate;
161 
162   switch (primitive.Type())
163   {
164     case PRIMITIVE_TYPE::BUTTON:
165       primitiveTemplate = g_localizeStrings.Get(35015); // "Button %d"
166       break;
167     case PRIMITIVE_TYPE::SEMIAXIS:
168       primitiveTemplate = g_localizeStrings.Get(35016); // "Axis %d"
169       break;
170     default:
171       break;
172   }
173 
174   return StringUtils::Format(primitiveTemplate.c_str(), primitive.Index());
175 }
176