I’m currently in the process of building my own custom gamepad using a Teensy, but a lot of software/games don’t recognize it off the bat as a standard plug and play controller which is what led me to HID Remapper. I could get it to work without HID Remapper by finagling with layout configurations, but I’d prefer something that just works without all that messing around. After doing some more research though I stumbled upon HID Forwarder and think that can suit my needs even better.
Essentially what I want is to generate controller input via software, send it to HID Forwarder, and have HID Forwarder forward those in the same plug and play manner that HID Remapper does. My target platform is PC so ideally I’d just send button press commands to a plugged in HID Forwarder via serial and it would send back emulated controller input. Is this the proper use case for HID Forwarder?
Wouldn’t that require a lot of low level USB tinkering? I already have it set up in the same format (i.e. button presses on my controller map to the same values that button presses on a standard DualShock do), but it only really shows up as say a DualShock when it’s plugged in to HID Remappper. Will just changing the descriptors to my desired controller type be enough if it is mapped the same, or is it more involved than that?
HID Remapper doesn’t do anything magical there, you should be able to copy the IDs and descriptor it uses. Which emulated device type are you using that gives you the desired results?
Switch gamepad/Stadia controller show up under SDL in RPCS3 (PS3 emulator) controller configuration, but PS4 arcade stick/XAC do not show up at all. I noticed that for all the controllers that do not show up (including my custom controller), they present 10 axis values, whereas the working ones only present 4 (2 for left analog and 2 for right analog). My controller presents 32 buttons and 10 axis values as per the default Teensy joystick module; do you think this is the primary issue?
Software like Steam, SDL, etc. keeps a whitelist of product IDs for specific controllers they support and have a known good mapping for. HID Remapper just pretends to be those controllers and that’s your best bet for your Teensy solution. I assume you don’t actually need 32 buttons and 10 axes (since you’re not getting them anyway when you go through HID Remapper) so I would recommend just setting the IDs, descriptor and report format to one of the controllers you know work correctly in the software that you use.
(In a perfect world this wouldn’t be needed and one “class driver” would be enough for all devices, like it is for mice or keyboards, but sadly history didn’t go this way for game controllers.)
Yup, I started fiddling with the VIDs/PIDs setting them to known controller values and it started getting picked up right away, though now some of the mappings are off. Will have to edit the report descriptor, but I have a much better grip on things and can take it from here. Thanks for the background info too, it really helped round out my understanding of the space; sometimes it’s confusing not only trying to understand how a piece of tech works, but why it works in the specific way it does instead of some more elegant solution instead.
Got it working nicely using the HoriPad descriptor; thanks again for your guidance! I really like this format since it’s so simple: no motion controls, digital instead of analog triggers, etc. What model/SKU HoriPad is it? Thinking of buying one to do a little reverse engineering myself.