@@ -118,15 +118,19 @@ class InputDev(object):
118
118
Class representing a joystick device config.
119
119
Maps the inputs of the device to event names
120
120
name: the device's name
121
- guid: the GUID, as retuned by SDL
121
+ guid: the GUID, as returned by SDL
122
+ pid: the ProductID of the device
123
+ vid: the VendorID of the device
122
124
hats - a dictionary of { <HatNo>: list(<HatValue>, <Event>) }
123
125
buttons - a dict of { <ButtonNo>: <Event> }
124
126
axis - a dict of { <AxisNo>: list(<AxisDirection>, <Event>) }
125
127
"""
126
128
127
- def __init__ (self , _name : str , _guid : str ):
129
+ def __init__ (self , _name : str , _vid : int , _pid : int ):
128
130
self .name = _name
129
- self .guid = _guid
131
+ self .guid = None
132
+ self .vid = _vid
133
+ self .pid = _pid
130
134
self .axis = {}
131
135
self .buttons = {}
132
136
self .hats = {}
@@ -153,7 +157,7 @@ def get_axis_event(self, index: int, value: int) -> list:
153
157
return None
154
158
155
159
def __str__ (self ) -> str :
156
- return str (f'{ self .name } , hats: { self .hats } , buttons: { self .buttons } , axis: { self .axis } ' )
160
+ return str (f'{ self .name } (P: { self . pid } , V: { self . vid } ) , hats: { self .hats } , buttons: { self .buttons } , axis: { self .axis } ' )
157
161
158
162
159
163
def generic_event_map (input : str , event_map : dict ) -> str :
@@ -227,7 +231,7 @@ def get_all_ra_config(def_buttons: list) -> list:
227
231
"""
228
232
ra_config_list = []
229
233
# add a generic mapping at index 0, to be used for un-configured joysticks
230
- generic_dev = InputDev ("*" , "*" )
234
+ generic_dev = InputDev ("*" , None , None )
231
235
generic_dev .add_mappings (
232
236
{}, # no axis
233
237
{0 : 'b' , 1 : 'a' , 3 : 'y' , 4 : 'x' }, # 4 buttons
@@ -236,7 +240,7 @@ def get_all_ra_config(def_buttons: list) -> list:
236
240
ra_config_list .append (generic_dev )
237
241
js_cfg_dir = CONFIG_DIR + '/all/retroarch-joypads/'
238
242
239
- config = ConfigParser (delimiters = "=" , strict = False , interpolation = None )
243
+ config = ConfigParser (delimiters = "=" , strict = False , interpolation = None , converters = { 'int' : ( lambda s : s . strip ( '"' ))} )
240
244
for file in os .listdir (js_cfg_dir ):
241
245
# skip non '.cfg' files
242
246
if not file .endswith ('.cfg' ) or file .startswith ('.' ):
@@ -247,8 +251,12 @@ def get_all_ra_config(def_buttons: list) -> list:
247
251
config .clear ()
248
252
# ConfigParser needs a section, make up a section to appease it
249
253
config .read_string ('[device]\n ' + cfg_file .read ())
254
+ LOG .debug (f'Parsing config "{ file } "' )
250
255
conf_vals = config ['device' ]
251
256
dev_name = conf_vals ['input_device' ].strip ('"' )
257
+ # fallback to None if there are no PID/VID in the configuration
258
+ dev_vid = conf_vals .getint ('input_vendor_id' , None )
259
+ dev_pid = conf_vals .getint ('input_product_id' , None )
252
260
253
261
# translate the RetroArch inputs from the configuration file
254
262
axis , buttons , hats = {}, {}, {}
@@ -268,9 +276,10 @@ def get_all_ra_config(def_buttons: list) -> list:
268
276
axis .setdefault (input_index , []).append ((input_value , event_name ))
269
277
else :
270
278
continue
271
- ra_dev_config = InputDev (dev_name , None )
279
+ ra_dev_config = InputDev (dev_name , dev_vid , dev_pid )
272
280
ra_dev_config .add_mappings (axis , buttons , hats )
273
281
ra_config_list .append (ra_dev_config )
282
+ LOG .debug (f'Added config for "{ dev_name } " from "{ file } "' )
274
283
except Exception as e :
275
284
LOG .warning (f'Parsing error for { file } : { e } ' )
276
285
continue
@@ -370,12 +379,16 @@ def handle_new_input(e: SDL_Event, axis_norm_value: int = 0) -> bool:
370
379
stick = joystick .SDL_JoystickOpen (event .jdevice .which )
371
380
name = joystick .SDL_JoystickName (stick ).decode ('utf-8' )
372
381
guid = create_string_buffer (33 )
382
+ vid = joystick .SDL_JoystickGetVendor (stick )
383
+ pid = joystick .SDL_JoystickGetProduct (stick )
384
+
373
385
_SDL_JoystickGetGUIDString (joystick .SDL_JoystickGetGUID (stick ), guid , 33 )
374
- LOG .debug (f'Joystick #{ joystick .SDL_JoystickInstanceID (stick )} { name } added' )
386
+ LOG .debug (f'Joystick #{ joystick .SDL_JoystickInstanceID (stick )} { name } (P: { pid } , V: { vid } ) added' )
375
387
conf_found = False
376
- # try to find a configuration for the joystick
388
+ # try to find a configuration for the joystick, based on name, GUID and Vendor/Product IDs
377
389
for key , dev_conf in enumerate (configs ):
378
- if dev_conf .name == str (name ) or dev_conf .guid == guid .value .decode ():
390
+ if dev_conf .name == str (name ) or dev_conf .guid == guid .value .decode () or \
391
+ (dev_conf .pid == str (pid ) and dev_conf .vid == str (vid )):
379
392
# Add the matching joystick configuration to the watched list
380
393
active_devices [joystick .SDL_JoystickInstanceID (stick )] = (key , stick )
381
394
LOG .debug (f'Added configuration for known device { configs [key ]} ' )
0 commit comments