2 * Copyright (C) 2005-2024 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
18 #include "PlatformDefs.h"
20 #include "utils/StringUtils.h"
26 /// \ingroup peripherals
30 * \brief Indicates a joystick has no preference for port number
32 constexpr auto JOYSTICK_NO_PORT_REQUESTED
= -1;
34 enum PeripheralBusType
36 PERIPHERAL_BUS_UNKNOWN
= 0,
42 PERIPHERAL_BUS_ANDROID
,
44 #if defined(TARGET_DARWIN)
45 PERIPHERAL_BUS_GCCONTROLLER
,
47 PERIPHERAL_BUS_APPLICATION
,
50 enum PeripheralFeature
70 PERIPHERAL_UNKNOWN
= 0,
85 using PeripheralPtr
= std::shared_ptr
<CPeripheral
>;
86 using PeripheralVector
= std::vector
<PeripheralPtr
>;
88 class CPeripheralAddon
;
89 using PeripheralAddonPtr
= std::shared_ptr
<CPeripheralAddon
>;
90 using PeripheralAddonVector
= std::vector
<PeripheralAddonPtr
>;
92 class CEventPollHandle
;
93 using EventPollHandlePtr
= std::unique_ptr
<CEventPollHandle
>;
95 class CEventLockHandle
;
96 using EventLockHandlePtr
= std::unique_ptr
<CEventLockHandle
>;
104 struct PeripheralDeviceSetting
106 std::shared_ptr
<CSetting
> m_setting
;
110 struct PeripheralDeviceMapping
112 std::vector
<PeripheralID
> m_PeripheralID
;
113 PeripheralBusType m_busType
;
114 PeripheralType m_class
;
115 std::string m_strDeviceName
;
116 PeripheralType m_mappedTo
;
117 std::map
<std::string
, PeripheralDeviceSetting
> m_settings
;
120 class PeripheralTypeTranslator
123 static const char* TypeToString(const PeripheralType type
)
127 case PERIPHERAL_BLUETOOTH
:
131 case PERIPHERAL_DISK
:
137 case PERIPHERAL_NYXBOARD
:
139 case PERIPHERAL_TUNER
:
141 case PERIPHERAL_IMON
:
143 case PERIPHERAL_JOYSTICK
:
145 case PERIPHERAL_KEYBOARD
:
147 case PERIPHERAL_MOUSE
:
154 static PeripheralType
GetTypeFromString(const std::string
& strType
)
156 std::string
strTypeLowerCase(strType
);
157 StringUtils::ToLower(strTypeLowerCase
);
159 if (strTypeLowerCase
== "bluetooth")
160 return PERIPHERAL_BLUETOOTH
;
161 else if (strTypeLowerCase
== "cec")
162 return PERIPHERAL_CEC
;
163 else if (strTypeLowerCase
== "disk")
164 return PERIPHERAL_DISK
;
165 else if (strTypeLowerCase
== "hid")
166 return PERIPHERAL_HID
;
167 else if (strTypeLowerCase
== "nic")
168 return PERIPHERAL_NIC
;
169 else if (strTypeLowerCase
== "nyxboard")
170 return PERIPHERAL_NYXBOARD
;
171 else if (strTypeLowerCase
== "tuner")
172 return PERIPHERAL_TUNER
;
173 else if (strTypeLowerCase
== "imon")
174 return PERIPHERAL_IMON
;
175 else if (strTypeLowerCase
== "joystick")
176 return PERIPHERAL_JOYSTICK
;
177 else if (strTypeLowerCase
== "keyboard")
178 return PERIPHERAL_KEYBOARD
;
179 else if (strTypeLowerCase
== "mouse")
180 return PERIPHERAL_MOUSE
;
182 return PERIPHERAL_UNKNOWN
;
185 static const char* BusTypeToString(const PeripheralBusType type
)
189 case PERIPHERAL_BUS_USB
:
191 case PERIPHERAL_BUS_PCI
:
193 case PERIPHERAL_BUS_CEC
:
195 case PERIPHERAL_BUS_ADDON
:
197 #ifdef TARGET_ANDROID
198 case PERIPHERAL_BUS_ANDROID
:
201 #if defined(TARGET_DARWIN)
202 case PERIPHERAL_BUS_GCCONTROLLER
:
203 return "darwin_gccontroller";
205 case PERIPHERAL_BUS_APPLICATION
:
206 return "application";
212 static PeripheralBusType
GetBusTypeFromString(const std::string
& strType
)
214 std::string
strTypeLowerCase(strType
);
215 StringUtils::ToLower(strTypeLowerCase
);
217 if (strTypeLowerCase
== "usb")
218 return PERIPHERAL_BUS_USB
;
219 else if (strTypeLowerCase
== "pci")
220 return PERIPHERAL_BUS_PCI
;
221 else if (strTypeLowerCase
== "cec")
222 return PERIPHERAL_BUS_CEC
;
223 else if (strTypeLowerCase
== "addon")
224 return PERIPHERAL_BUS_ADDON
;
225 #ifdef TARGET_ANDROID
226 else if (strTypeLowerCase
== "android")
227 return PERIPHERAL_BUS_ANDROID
;
229 #if defined(TARGET_DARWIN)
230 else if (strTypeLowerCase
== "darwin_gccontroller")
231 return PERIPHERAL_BUS_GCCONTROLLER
;
233 else if (strTypeLowerCase
== "application")
234 return PERIPHERAL_BUS_APPLICATION
;
236 return PERIPHERAL_BUS_UNKNOWN
;
239 static const char* FeatureToString(const PeripheralFeature type
)
249 case FEATURE_NYXBOARD
:
253 case FEATURE_BLUETOOTH
:
259 case FEATURE_JOYSTICK
:
263 case FEATURE_POWER_OFF
:
265 case FEATURE_KEYBOARD
:
269 case FEATURE_UNKNOWN
:
275 static PeripheralFeature
GetFeatureTypeFromString(const std::string
& strType
)
277 std::string
strTypeLowerCase(strType
);
278 StringUtils::ToLower(strTypeLowerCase
);
280 if (strTypeLowerCase
== "hid")
282 else if (strTypeLowerCase
== "cec")
284 else if (strTypeLowerCase
== "disk")
286 else if (strTypeLowerCase
== "nyxboard")
287 return FEATURE_NYXBOARD
;
288 else if (strTypeLowerCase
== "bluetooth")
289 return FEATURE_BLUETOOTH
;
290 else if (strTypeLowerCase
== "tuner")
291 return FEATURE_TUNER
;
292 else if (strTypeLowerCase
== "imon")
294 else if (strTypeLowerCase
== "joystick")
295 return FEATURE_JOYSTICK
;
296 else if (strTypeLowerCase
== "rumble")
297 return FEATURE_RUMBLE
;
298 else if (strTypeLowerCase
== "poweroff")
299 return FEATURE_POWER_OFF
;
300 else if (strTypeLowerCase
== "keyboard")
301 return FEATURE_KEYBOARD
;
302 else if (strTypeLowerCase
== "mouse")
303 return FEATURE_MOUSE
;
305 return FEATURE_UNKNOWN
;
308 static int HexStringToInt(const char* strHex
)
311 sscanf(strHex
, "%x", &iVal
);
315 static void FormatHexString(int iVal
, std::string
& strHexString
)
322 strHexString
= StringUtils::Format("{:04X}", iVal
);
326 class PeripheralScanResult
329 explicit PeripheralScanResult(const PeripheralBusType busType
)
330 : m_busType(busType
), m_mappedBusType(busType
)
334 PeripheralScanResult(void) = default;
336 bool operator==(const PeripheralScanResult
& right
) const
338 return m_iVendorId
== right
.m_iVendorId
&& m_iProductId
== right
.m_iProductId
&&
339 m_type
== right
.m_type
&& m_busType
== right
.m_busType
&&
340 StringUtils::EqualsNoCase(m_strLocation
, right
.m_strLocation
);
343 bool operator!=(const PeripheralScanResult
& right
) const { return !(*this == right
); }
345 PeripheralType m_type
= PERIPHERAL_UNKNOWN
;
346 std::string m_strLocation
;
348 int m_iProductId
= 0;
349 PeripheralType m_mappedType
= PERIPHERAL_UNKNOWN
;
350 std::string m_strDeviceName
;
351 PeripheralBusType m_busType
= PERIPHERAL_BUS_UNKNOWN
;
352 PeripheralBusType m_mappedBusType
= PERIPHERAL_BUS_UNKNOWN
;
353 unsigned int m_iSequence
= 0; // when more than one adapter of the same type is found
356 struct PeripheralScanResults
358 bool GetDeviceOnLocation(const std::string
& strLocation
, PeripheralScanResult
* result
) const
360 for (const auto& it
: m_results
)
362 if (it
.m_strLocation
== strLocation
)
371 bool ContainsResult(const PeripheralScanResult
& result
) const
373 return std::find(m_results
.begin(), m_results
.end(), result
) != m_results
.end();
376 std::vector
<PeripheralScanResult
> m_results
;
380 } // namespace PERIPHERALS