Hiding Steam controller and feeding its data to my own program

Originally posted by FunnyBunny14

I'm trying to create a driver for the steam controller to turn it into a generic DirectInput device, but before I do that I first need to hide the controller from the system and only give its data to my program.
Can I use HidGuardian for that? And if I can't, how would I go about implementing a similar ability?

Originally posted by evilC

I have a steam controller set up an HG installed, I will give it a whirl and see if HG can stop Steam from being able to see it.

Would really love to see you succeed here, but TBH I doubt it will be possible to represent the SC as a DI device, because AFAIK a SC has more axes than one DI controller supports (8 axes):
2 for the stick
2 analog triggers
2 touchpads with 2 axes each
3-axis Gyro

However, as long as you could write some kind of API that would let me poll the state of the inputs, I am writing software that would let you remap any of those inputs to whatever you want.

I already support things that do not represent as sticks (eg the Tobii eye tracker, Voice commands etc) so supporting Steam Controllers in this way would be little to no extra work.
In order for this to work, all you would need is a C# library that conforms to my IProvider interface.

Originally posted by evilC

OK, so I just tested, and HidGuardian can indeed stop Steam from seeing the SC. If I press the Steam button, it does not open Steam.
So as long as you could whip something up that can read the inputs of the controller (even if it just a C DLL), then we could add it as a provider to IOWrapper, and you could then easily remap to any of the other providers.

Currently, output-wise, I have an Interception provider (keyboard/mouse) and vJoy. I tried to implement ViGEm this weekend, but ran into the architecture issues Nefarius mentioned in his post. If it is going to be a while before Nefarius' new C# API, I could probably implement Shaul's vGen in the meantime or something.

BTW, IOWrapper is not the whole project, it is just the back-end. We have a GUI front-end that can interact with all the providers and allow you to remap stuff.

Here is a screenshot of our current prototype showing inputs from the Interception (Keyboard/Mouse), Tobii (Eye tracker) and DirectInput Providers.


Originally posted by FunnyBunny14

I completely forgot for a while that I posted here (well, I got distracted by more stuff related to this, can happen I guess ~.~). I didn't know that directinput only supported 8 axes, but that doesn't really matter that much since multiple devices are a thing (thankfully). It's still way better than XInput, though.
I was looking a bit more into the USB APIs and such, but nothing particularly useful came out of it. I do kinda get the concept a bit more, and several days brainstorming helps with getting a grasp on how I want to do things.

I've already built up a fairly significant list of sources for me to find the data I need on the steam controller.
I must thank you, though, for reminding me of vJoy. Oh, and I'm grateful for the existence of HidGuardian and Cerberus too, of course, since that takes a massive load of my shoulders!

P.S.: My line of thought is reasonably simple for now. My first goal is to create a real-time display of the gyro angles and touchpad/joystick coordinates as well as the button displays so I can get a feel for the controller without any software on it. I'll then add some basic calibration functions and update the display a bit to be more intuitive and output the data as axes and buttons to vjoy as a simple test.
With that done, I'll simply have fun tinkering with setting up control scheme customisation. (Seriously, I'm so looking forward to this! I have so many ideas, like modifiers to axes for advanced aiming stuff, and, and, and!!!! Well, simply put, I'll be in heaven :slight_smile: )

Edit: While having the seperate dll and using your program would be interesting, I don't think that would allow me to do everything I want. I'll consider it though, because it might be useful to have a short-term backup.
A specific example of something I probably wouldn't have without my own program, btw, is the ability to use a trackpad or similar as a modification on an existing axis that a previously mentioned - what this would mean, for example, is for my pitch and yaw axes I could set up my right trackpad to add to/subtract from them on the fly for minor changes to my heading in order to finely aim while generally flying my ship in a certain direction.

Originally posted by evilC

The app we are writing should be able to use one axis to trim another - the predecessor that we are replacing can already do that! Everything is plugin based - so you just need a plugin that accepts two axes as inputs (The base axis plus the trackpad) and has one axis as an output. You are then totally free to implement whatever logic you desire to control how the inputs affect the output.

If you have discord, please feel free to drop in and chat: https://discord.gg/MmnhQYQ