xbmc
PeripheralTypes.h
1 /*
2  * Copyright (C) 2005-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 <algorithm>
12 #include <map>
13 #include <memory>
14 #include <stdio.h>
15 #include <string>
16 #include <vector>
17 #ifdef TARGET_WINDOWS
18 #include "PlatformDefs.h"
19 #endif
20 #include "utils/StringUtils.h"
21 
22 class CSetting;
23 
24 namespace PERIPHERALS
25 {
26 enum PeripheralBusType
27 {
28  PERIPHERAL_BUS_UNKNOWN = 0,
29  PERIPHERAL_BUS_USB,
30  PERIPHERAL_BUS_PCI,
31  PERIPHERAL_BUS_CEC,
32  PERIPHERAL_BUS_ADDON,
33 #ifdef TARGET_ANDROID
34  PERIPHERAL_BUS_ANDROID,
35 #endif
36 #if defined(TARGET_DARWIN)
37  PERIPHERAL_BUS_GCCONTROLLER,
38 #endif
39  PERIPHERAL_BUS_APPLICATION,
40 };
41 
42 enum PeripheralFeature
43 {
44  FEATURE_UNKNOWN = 0,
45  FEATURE_HID,
46  FEATURE_NIC,
47  FEATURE_DISK,
48  FEATURE_NYXBOARD,
49  FEATURE_CEC,
50  FEATURE_BLUETOOTH,
51  FEATURE_TUNER,
52  FEATURE_IMON,
53  FEATURE_JOYSTICK,
54  FEATURE_RUMBLE,
55  FEATURE_POWER_OFF,
56  FEATURE_KEYBOARD,
57  FEATURE_MOUSE,
58 };
59 
60 enum PeripheralType
61 {
62  PERIPHERAL_UNKNOWN = 0,
63  PERIPHERAL_HID,
64  PERIPHERAL_NIC,
65  PERIPHERAL_DISK,
66  PERIPHERAL_NYXBOARD,
67  PERIPHERAL_CEC,
68  PERIPHERAL_BLUETOOTH,
69  PERIPHERAL_TUNER,
70  PERIPHERAL_IMON,
71  PERIPHERAL_JOYSTICK,
72  PERIPHERAL_KEYBOARD,
73  PERIPHERAL_MOUSE,
74 };
75 
76 class CPeripheral;
77 using PeripheralPtr = std::shared_ptr<CPeripheral>;
78 using PeripheralVector = std::vector<PeripheralPtr>;
79 
80 class CPeripheralAddon;
81 using PeripheralAddonPtr = std::shared_ptr<CPeripheralAddon>;
82 using PeripheralAddonVector = std::vector<PeripheralAddonPtr>;
83 
84 class CEventPollHandle;
85 using EventPollHandlePtr = std::unique_ptr<CEventPollHandle>;
86 
87 class CEventLockHandle;
88 using EventLockHandlePtr = std::unique_ptr<CEventLockHandle>;
89 
91 {
92  int m_iVendorId;
93  int m_iProductId;
94 };
95 
97 {
98  std::shared_ptr<CSetting> m_setting;
99  int m_order;
100 };
101 
103 {
104  std::vector<PeripheralID> m_PeripheralID;
105  PeripheralBusType m_busType;
106  PeripheralType m_class;
107  std::string m_strDeviceName;
108  PeripheralType m_mappedTo;
109  std::map<std::string, PeripheralDeviceSetting> m_settings;
110 };
111 
113 {
114 public:
115  static const char* TypeToString(const PeripheralType type)
116  {
117  switch (type)
118  {
119  case PERIPHERAL_BLUETOOTH:
120  return "bluetooth";
121  case PERIPHERAL_CEC:
122  return "cec";
123  case PERIPHERAL_DISK:
124  return "disk";
125  case PERIPHERAL_HID:
126  return "hid";
127  case PERIPHERAL_NIC:
128  return "nic";
129  case PERIPHERAL_NYXBOARD:
130  return "nyxboard";
131  case PERIPHERAL_TUNER:
132  return "tuner";
133  case PERIPHERAL_IMON:
134  return "imon";
135  case PERIPHERAL_JOYSTICK:
136  return "joystick";
137  case PERIPHERAL_KEYBOARD:
138  return "keyboard";
139  case PERIPHERAL_MOUSE:
140  return "mouse";
141  default:
142  return "unknown";
143  }
144  };
145 
146  static PeripheralType GetTypeFromString(const std::string& strType)
147  {
148  std::string strTypeLowerCase(strType);
149  StringUtils::ToLower(strTypeLowerCase);
150 
151  if (strTypeLowerCase == "bluetooth")
152  return PERIPHERAL_BLUETOOTH;
153  else if (strTypeLowerCase == "cec")
154  return PERIPHERAL_CEC;
155  else if (strTypeLowerCase == "disk")
156  return PERIPHERAL_DISK;
157  else if (strTypeLowerCase == "hid")
158  return PERIPHERAL_HID;
159  else if (strTypeLowerCase == "nic")
160  return PERIPHERAL_NIC;
161  else if (strTypeLowerCase == "nyxboard")
162  return PERIPHERAL_NYXBOARD;
163  else if (strTypeLowerCase == "tuner")
164  return PERIPHERAL_TUNER;
165  else if (strTypeLowerCase == "imon")
166  return PERIPHERAL_IMON;
167  else if (strTypeLowerCase == "joystick")
168  return PERIPHERAL_JOYSTICK;
169  else if (strTypeLowerCase == "keyboard")
170  return PERIPHERAL_KEYBOARD;
171  else if (strTypeLowerCase == "mouse")
172  return PERIPHERAL_MOUSE;
173 
174  return PERIPHERAL_UNKNOWN;
175  };
176 
177  static const char* BusTypeToString(const PeripheralBusType type)
178  {
179  switch (type)
180  {
181  case PERIPHERAL_BUS_USB:
182  return "usb";
183  case PERIPHERAL_BUS_PCI:
184  return "pci";
185  case PERIPHERAL_BUS_CEC:
186  return "cec";
187  case PERIPHERAL_BUS_ADDON:
188  return "addon";
189 #ifdef TARGET_ANDROID
190  case PERIPHERAL_BUS_ANDROID:
191  return "android";
192 #endif
193 #if defined(TARGET_DARWIN)
194  case PERIPHERAL_BUS_GCCONTROLLER:
195  return "darwin_gccontroller";
196 #endif
197  case PERIPHERAL_BUS_APPLICATION:
198  return "application";
199  default:
200  return "unknown";
201  }
202  };
203 
204  static PeripheralBusType GetBusTypeFromString(const std::string& strType)
205  {
206  std::string strTypeLowerCase(strType);
207  StringUtils::ToLower(strTypeLowerCase);
208 
209  if (strTypeLowerCase == "usb")
210  return PERIPHERAL_BUS_USB;
211  else if (strTypeLowerCase == "pci")
212  return PERIPHERAL_BUS_PCI;
213  else if (strTypeLowerCase == "cec")
214  return PERIPHERAL_BUS_CEC;
215  else if (strTypeLowerCase == "addon")
216  return PERIPHERAL_BUS_ADDON;
217 #ifdef TARGET_ANDROID
218  else if (strTypeLowerCase == "android")
219  return PERIPHERAL_BUS_ANDROID;
220 #endif
221 #if defined(TARGET_DARWIN)
222  else if (strTypeLowerCase == "darwin_gccontroller")
223  return PERIPHERAL_BUS_GCCONTROLLER;
224 #endif
225  else if (strTypeLowerCase == "application")
226  return PERIPHERAL_BUS_APPLICATION;
227 
228  return PERIPHERAL_BUS_UNKNOWN;
229  };
230 
231  static const char* FeatureToString(const PeripheralFeature type)
232  {
233  switch (type)
234  {
235  case FEATURE_HID:
236  return "HID";
237  case FEATURE_NIC:
238  return "NIC";
239  case FEATURE_DISK:
240  return "disk";
241  case FEATURE_NYXBOARD:
242  return "nyxboard";
243  case FEATURE_CEC:
244  return "CEC";
245  case FEATURE_BLUETOOTH:
246  return "bluetooth";
247  case FEATURE_TUNER:
248  return "tuner";
249  case FEATURE_IMON:
250  return "imon";
251  case FEATURE_JOYSTICK:
252  return "joystick";
253  case FEATURE_RUMBLE:
254  return "rumble";
255  case FEATURE_POWER_OFF:
256  return "poweroff";
257  case FEATURE_KEYBOARD:
258  return "keyboard";
259  case FEATURE_MOUSE:
260  return "mouse";
261  case FEATURE_UNKNOWN:
262  default:
263  return "unknown";
264  }
265  };
266 
267  static PeripheralFeature GetFeatureTypeFromString(const std::string& strType)
268  {
269  std::string strTypeLowerCase(strType);
270  StringUtils::ToLower(strTypeLowerCase);
271 
272  if (strTypeLowerCase == "hid")
273  return FEATURE_HID;
274  else if (strTypeLowerCase == "cec")
275  return FEATURE_CEC;
276  else if (strTypeLowerCase == "disk")
277  return FEATURE_DISK;
278  else if (strTypeLowerCase == "nyxboard")
279  return FEATURE_NYXBOARD;
280  else if (strTypeLowerCase == "bluetooth")
281  return FEATURE_BLUETOOTH;
282  else if (strTypeLowerCase == "tuner")
283  return FEATURE_TUNER;
284  else if (strTypeLowerCase == "imon")
285  return FEATURE_IMON;
286  else if (strTypeLowerCase == "joystick")
287  return FEATURE_JOYSTICK;
288  else if (strTypeLowerCase == "rumble")
289  return FEATURE_RUMBLE;
290  else if (strTypeLowerCase == "poweroff")
291  return FEATURE_POWER_OFF;
292  else if (strTypeLowerCase == "keyboard")
293  return FEATURE_KEYBOARD;
294  else if (strTypeLowerCase == "mouse")
295  return FEATURE_MOUSE;
296 
297  return FEATURE_UNKNOWN;
298  };
299 
300  static int HexStringToInt(const char* strHex)
301  {
302  int iVal;
303  sscanf(strHex, "%x", &iVal);
304  return iVal;
305  };
306 
307  static void FormatHexString(int iVal, std::string& strHexString)
308  {
309  if (iVal < 0)
310  iVal = 0;
311  if (iVal > 65536)
312  iVal = 65536;
313 
314  strHexString = StringUtils::Format("{:04X}", iVal);
315  };
316 };
317 
319 {
320 public:
321  explicit PeripheralScanResult(const PeripheralBusType busType)
322  : m_busType(busType), m_mappedBusType(busType)
323  {
324  }
325 
326  PeripheralScanResult(void) = default;
327 
328  bool operator==(const PeripheralScanResult& right) const
329  {
330  return m_iVendorId == right.m_iVendorId && m_iProductId == right.m_iProductId &&
331  m_type == right.m_type && m_busType == right.m_busType &&
332  StringUtils::EqualsNoCase(m_strLocation, right.m_strLocation);
333  }
334 
335  bool operator!=(const PeripheralScanResult& right) const { return !(*this == right); }
336 
337  PeripheralType m_type = PERIPHERAL_UNKNOWN;
338  std::string m_strLocation;
339  int m_iVendorId = 0;
340  int m_iProductId = 0;
341  PeripheralType m_mappedType = PERIPHERAL_UNKNOWN;
342  std::string m_strDeviceName;
343  PeripheralBusType m_busType = PERIPHERAL_BUS_UNKNOWN;
344  PeripheralBusType m_mappedBusType = PERIPHERAL_BUS_UNKNOWN;
345  unsigned int m_iSequence = 0; // when more than one adapter of the same type is found
346 };
347 
349 {
350  bool GetDeviceOnLocation(const std::string& strLocation, PeripheralScanResult* result) const
351  {
352  for (const auto& it : m_results)
353  {
354  if (it.m_strLocation == strLocation)
355  {
356  *result = it;
357  return true;
358  }
359  }
360  return false;
361  }
362 
363  bool ContainsResult(const PeripheralScanResult& result) const
364  {
365  return std::find(m_results.begin(), m_results.end(), result) != m_results.end();
366  }
367 
368  std::vector<PeripheralScanResult> m_results;
369 };
370 } // namespace PERIPHERALS
Definition: PeripheralTypes.h:348
Definition: PeripheralTypes.h:318
Definition: RetroPlayerInput.h:15
Setting base class containing all the properties which are common to all settings independent of the ...
Definition: Setting.h:46
Definition: PeripheralTypes.h:90
Definition: PeripheralTypes.h:96
Definition: PeripheralTypes.h:112
static std::string Format(const std::string &fmt, Args &&... args)
Get a formatted string similar to sprintf.
Definition: StringUtils.h:79
Definition: PeripheralTypes.h:102