PDA

View Full Version : Fixing the way IL2 assigns Joystick IDs


EvilJoven
10-16-2011, 12:55 AM
I finally discovered how IL2 and a few other games assign joystick IDs. Now that this is known, is it fixable?

Currently, IL2 assigns IDs to joysticks alphabetically via the Vendor/Device ID. In my case, the list is as follows:

VID_044F&PID_0402 - Thrustmaster Warthog Stick
VID_044F&PID_0404 - Thrustmaster Warthog Throttle
VID_046D&PID_C215 - Logitech Extreme 3D Pro
VID_046D&PID_C216 - Logitech Dual Action Gamepad
VID_068E&PID_C0F2 - CH Pro Pedals USB
VID_068E&PID_00FA - CH THROTTLE QUADRANT

Because of this you have to remap all of your controls whenever something is removed/replaced.

The proper method is to assign joysticks ID's based on the list found in the following registry key: HKEY_CURRENT_USER\System\CurrentControlSet\Control \MediaResources\Joystick\DINPUT.DLL\CurrentJoystic kSettings

Devices are assigned IDs here as they're installed. It adds to better usability as devices retain their IDs, even as they're unplugged and plugged back in. The order of devices can even be changed by editing the values in this key or by using utilities that do it for you.

Is there any way TD can change the way IL2 enumerates joysticks to use this registry key? That way people like me who use a lot of different hardware won't have to remap our controls simply because we don't want to have everything plugged in permanently.

Artist
10-16-2011, 05:40 PM
I second that motion!

I had to write YaDeLi just because I was unable to get the needed device into the first four devices that IL-2 supports

Artist

RegRag1977
10-17-2011, 01:48 PM
I'm with too

EvilJoven
10-19-2011, 06:02 PM
EDIT: Here's what I posted on the 777 Forums as well as in the IL2-CoD subforum. It seems that they use the same method of assigning joystick IDs for Rise of Flight that the IL2 games use. This should better outline what is happening and what should be happening:

Rise of flight isn't assigning joystick ID's properly.

Currently, the game does something like this:

When the game is launched, it scans the list of game controllers, probably from here: HKEY_CURRENT_USER\System\CurrentControlSet\Control \MediaProperties\PrivateProperties\Joystick\OEM

And then the game goes down the list and assigns joystick IDs 1 to whatever to each device, if it's currently plugged in.

So, here's the list of ALL the controllers I use on my PC:

VID_044F&PID_0402 - Thrustmaster Warthog Stick
VID_044F&PID_0404 - Thrustmaster Warthog Throttle
VID_044F&PID_FFFF - Thrustmaster Virtual Game Controller (root) - THIS ONLY SHOWS UP IF THE TARGET PROFILER IS ACTIVE AND REPLACES THE ABOVE 2 STICKS
VID_046D&PID_C215 - Logitech Extreme 3D Pro
VID_046D&PID_C216 - Logitech Dual Action Gamepad
VID_068E&PID_C0F2 - CH Pro Pedals USB
VID_068E&PID_00FA - CH Throttle Quadrant USB


Normally I use this stuff without the Thrustmaster TARGET profiler running and with the Logitech stuff unplugged as I only use these for console ports and games with simplified flight models like the Battlefield games and ARMA, so most of the time when I launch Rise of flight, it sees these controllers.

VID_044F&PID_0402 - Thrustmaster Warthog Stick
VID_044F&PID_0404 - Thrustmaster Warthog Throttle
VID_068E&PID_C0F2 - CH Pro Pedals USB
VID_068E&PID_00FA - CH Throttle Quadrant USB

And these controllers are assigned 1-4 in game.

Here's where the problem comes in. Let's say, for instance, I try to use TARGET. If I do, all of a sudden my list looks like this:

VID_044F&PID_FFFF - Thrustmaster Virtual Game Controller (root)
VID_068E&PID_C0F2 - CH Pro Pedals USB
VID_068E&PID_00FA - CH Throttle Quadrant USB

So now the Pedals aren't ID3 and the Quadrant isn't ID4, they've both been moved up a spot because the Warthog sticks were replaced by the virtual game controller.

Now I have to remap EVERYTHING that I had mapped to the pedals as well as the quadrant.

And if I didn't run target but forget to unplug my gamepad...

VID_044F&PID_0402 - Thrustmaster Warthog Stick
VID_044F&PID_0404 - Thrustmaster Warthog Throttle
VID_046D&PID_C216 - Logitech Dual Action Gamepad
VID_068E&PID_C0F2 - CH Pro Pedals USB
VID_068E&PID_00FA - CH Throttle Quadrant USB

If I had this, the gamepad axis would be controlling my rudder inputs and my pedals would have throttle inputs mapped to it.

So basically, by assigning joystick IDs this way, it means that once I create a key mapping I need to have only those controllers plugged in. Any variation will cause problems unless I luck out and the controllers I do want to use happen to fall in the same spot, alphabetically.


THIS IS HOW YOU FIX THIS

The proper way a game should be assigning joystick IDs based on the registry key HKEY_CURRENT_USER\System\CurrentControlSet\Control \MediaResources\Joystick\DINPUT.DLL\CurrentJoystic kSettings

When a controller is plugged in to the PC for the first time it's assigned an ID which generally don't change, even if the device is unplugged and plugged back in, unless a piece of software does it deliberately.

Here's an example. This is how my joysticks are currently set up when everything is plugged in (this software, which allows me to change the joystick IDs around, can be found at http://www.wingmanteam.com/latest_software/gadgets.htm ):

http://i.imgur.com/TOYhB.png

Now, here's what happens when I unplug the Logitech Extreme 3D Pro and run the profiler, which essentially detaches both the Warthog stick and throttle and attaches a virtual joystick which the software assigns as ID 1

http://i.imgur.com/VqDdw.png

Notice how this doesn't cause any problems with the rudders, throttle quadrant and gamepad. They have retained their ID.

So, with this change, people won't have nearly as much trouble with their joysticks.

I've already posted this on the 1C forums as both IL-2 games seem to also use this improper method of assigning joystick IDs.

Fortunately, the DCS games, MS FSX, the FSX FSUIPC addon and a lot of other games are using the proper method.

Artist
10-20-2011, 10:42 AM
Hi EvilJoven,

I wish it were as simple as that. From my experiences with developing YaDeLi: The IDs you've mentioned (and which can be changed with Joystick ID' Swapper) exist only in the old Win32 API (http://msdn.microsoft.com/en-us/library/windows/desktop/dd757108(v=vs.85).aspx) which is almost deprecated. They are not, I repeat not, used or accessible in/from DirectInput (http://msdn.microsoft.com/en-us/library/ee416842(v=VS.85).aspx), which is used IL-2. DirectInput uses a GUID-system (http://en.wikipedia.org/wiki/Globally_unique_identifier) to identify and re-recognize devices.

@Daidalos Team: I've used this mechanism in YaDeLi to reliably connect devices to a IL-2 DeviceLink channel and would gladly supply source code, help, and support - if you decide to do somthing in this direction.

Artist

EvilJoven
10-20-2011, 03:28 PM
Hi EvilJoven,

I wish it were as simple as that. From my experiences with developing YaDeLi: The IDs you've mentioned (and which can be changed with Joystick ID' Swapper) exist only in the old Win32 API (http://msdn.microsoft.com/en-us/library/windows/desktop/dd757108(v=vs.85).aspx) which is almost deprecated. They are not, I repeat not, used or accessible in/from DirectInput (http://msdn.microsoft.com/en-us/library/ee416842(v=VS.85).aspx), which is used IL-2. DirectInput uses a GUID-system (http://en.wikipedia.org/wiki/Globally_unique_identifier) to identify and re-recognize devices.

@Daidalos Team: I've used this mechanism in YaDeLi to reliably connect devices to a IL-2 DeviceLink channel and would gladly supply source code, help, and support - if you decide to do somthing in this direction.

Artist

I think we both might be wrong on this one. You're right that the registry keys and values I was working with earlier don't seem to have any bearing on the joystick ID.

Fortunately, I found out what does.

When I worked on this some more to confirm whether or not you were correct, I discovered that when you change the joystick ID in either that joystick ID utility I use or by setting the primary controller from within the Game Controller Settings (in the control panel in XP or brought up by right clicking on a joystick in the Devices and Printers window) you're changing the Joystick ID binary value key for the associated controller, located here:

HKEY_CURRENT_USER\System\CurrentControlSet\Control \MediaProperties\PrivateProperties\DirectInput\<VENDOR AND DEVICE ID>\Calibration\0

This seems to be what sets the joystick ID.

The end result is the same. If IL-2 can be modified so that it assigns joystick IDs by reading from THAT key it should sort things out nicely.

Artist
10-20-2011, 03:46 PM
Great discovery, EvilJoven! I just relied on the DirectInput-documentation from Microsoft and that never ever hinted at what you've found out...

Reverse Engineering scores a point over RTFM! :grin:

Now the question is: Is TD prepared to rely on an undocumented feature (mixing DirectInput with Win32 API) in order to solve a serious inconvenience for all those having more that 4 controllers...

I surely hope so! TD, please?

Artist

Edit, PS: You're sure that it is "HKEY_CURRENT_USER\System\..."? I find all you've written about under "HKEY_LOCAL_MACHINE\System\..."

EvilJoven
10-20-2011, 05:11 PM
On my win7x64 pc it all the stuff relating to the Directinput joystick ID settings is stored under HKCU. Unless I missed something in process monitor, when changing IDs around this is the only place it's done.

Artist
10-20-2011, 06:22 PM
Secrets of Windows: It's Xp SP3 here and there's no "\System" under HKCU - only within HKLM. Could it be the shadowing of Win7? Wonder what a software API call would find...

Good to know, though.

Artist