Guide: Advanced Controller Mappings
-
@spud11 Thanks, EctoOne. I will have a go with your script too and I'll let you know. Thanks.
-
@EctoOne Hi. I adapted your script as below which I think should work:
#!/bin/sh ## Uncomment one or all of the following if you need to find some information about the emulator or roms ## Name of the emulator #echo $1 >> /dev/shm/runcommand.log ## Name of the software used for running the emulation #echo $2 >> /dev/shm/runcommand.log ## Name of the rom #echo $3 >> /dev/shm/runcommand.log ##Executed command line #echo $4 >> /dev/shm/runcommand.log ### The FUN begins #Get ROM name striping full path rom="${3##*/}" ### Set variables for your joypad and emulator ### Basic Configuraions - Standard controller mappings DragonRise="/opt/retropie/supplementary/xboxdrv/bin/xboxdrv --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.2.3:1.0-event-joystick \ --silent \ --detach-kernel-driver \ --deadzone=4000 \ --deadzone-trigger 15% \ --force-feedback \ --mimic-xpad \ --trigger-as-button \ --ui-buttonmap lb=void,rb=void,tl=void,tr=void,guide=void,lt=void,rt=void \ ### Extended Configurations ### Specific emulator configuration or any other parameters you will need only for some emulators amiga="--device-name "Amiga Joystick Player 1 (xboxdrv)" \ --evdev-absmap ABS_X=y1,ABS_Y=x1 \ --evdev-keymap BTN_TRIGGER=x,BTN_THUMB=y,BTN_THUMB2=a,BTN_PINKIE=b,BTN_BASE3=back,BTN_BASE6=start \" fourway="--four-way-restrictor" ### Kill Command xboxkill="sudo killall xboxdrv" ### Execute the driver with the configuration you need # $1 is the name of the emulation, not the name of the software used # it is intellivision not jzintv case $1 in amiga) $xboxkill joycommand="$DragonRise $amiga &" eval $joycommand ;; esac
I ended up with the following output:
/opt/retropie/configs/all/runcommand-onstart.sh: line 5: $'\r': command not found /opt/retropie/configs/all/runcommand-onstart.sh: line 8: $'\r': command not found /opt/retropie/configs/all/runcommand-onstart.sh: line 11: $'\r': command not found /opt/retropie/configs/all/runcommand-onstart.sh: line 14: $'\r': command not found /opt/retropie/configs/all/runcommand-onstart.sh: line 15: $'\r': command not found /opt/retropie/configs/all/runcommand-onstart.sh: line 19: $'\r': command not found /opt/retropie/configs/all/runcommand-onstart.sh: line 36: Amiga Joystick Player 1 (xboxdrv): command not found /opt/retropie/configs/all/runcommand-onstart.sh: line 37: --evdev-absmap: command not found /opt/retropie/configs/all/runcommand-onstart.sh: line 38: --evdev-keymap: command not found /opt/retropie/configs/all/runcommand-onstart.sh: line 39: $'\r': command not found /opt/retropie/configs/all/runcommand-onstart.sh: line 41: $'\r': command not found /opt/retropie/configs/all/runcommand-onstart.sh: line 42: $'\r': command not found /opt/retropie/configs/all/runcommand-onstart.sh: line 45: $'\r': command not found /opt/retropie/configs/all/runcommand-onstart.sh: line 49: syntax error near unexpected token `$'in\r'' /opt/retropie/configs/all/runcommand-onstart.sh: line 49: `case $1 in ' Parameters: Executing: pushd /opt/retropie/emulators/uae4arm/; ./uae4arm -config="/home/pi/RetroPie/roms/amiga/Alien Breed Tower Assault.uae" /opt/retropie/emulators/uae4arm /opt/retropie/supplementary/runcommand Amiberry build 2017-01-08, by Dimitris (MiDWaN) Panokostas and Olly Aigner Based on previous work by Chips and TomB (Pandora) Joystick 0 : DragonRise Inc. Generic USB Joystick Buttons: 12 Axis: 4 Hats: 1 Joystick 1 : DragonRise Inc. Generic USB Joystick Buttons: 12 Axis: 4 Hats: 1 Joystick 2 : DragonRise Inc. Generic USB Joystick Buttons: 12 Axis: 4 Hats: 1 Joystick 3 : DragonRise Inc. Generic USB Joystick Buttons: 12 Axis: 4 Hats: 1 starting sound thread.. stopping sound thread.. xboxdrv: no process found
I'll trawl the forums and see if I can find any information about the error $'\r'. Thanks.
I'll probably need to think of options other than using runcommand-onstart. Possibly even recompiling the emulator itself.
-
@spud11
I'm no tech expert but seeing you getting even more errors with my script let's me think that either your xboxdrv version is different or something went wrong during the installation.Edit: From what I've found is that \r seems to be caused by Windows newline characters. You said that you're using Notepad++ so that would make sense if you copy/pasted my script. So you should try to ssh into your Pi with putty. Use nano to edit the file (mentioned above by @mediamogul), delete everything, and copy it back in using middle mouse button. Or delete the file and make a new one with nano.
-
@EctoOne Thanks for that tip. I'll try that later.
That might explain why earlier on, I was finding that the xboxdrv script was working 100% in rc.local only when the whole script was on one line, but didn't seem to work when I had used
\
andenter
at the end of each line.I'll try the copy/paste way with nano first and then, if that doesn't work, I'll manually type it all back in with nano. A bit laborious but best way to ensure the script works.
Just checked the WinSCP documentation too:
"Text/ASCII Transfer Mode
For this reason, file transfer clients and servers support a text/ASCII transfer mode.
When transferring a file in this mode, the file gets (ideally) converted from a format native to a source system, to a format native to a target system.
For example, when uploading a text file using text mode from Windows to Unix system, the file line endings get converted from CR+LF to LF.
Opposite to the text/ASCII transfer mode is a binary transfer mode that transfer the file as is (binary identical).
WinSCP by default uses the binary transfer mode for all regular file transfers. "I've also at various times copied the runcommand-onstart.sh from Windows to the Pi and made the file executable, so based on the above, the transfer is likely to have been in binary transfer mode by default, meaning that /r new line errors are very possible.
-
You, Sirs, are Gods! Thank you to you both for your patience and help. EctoOne, you were ultimately correct. It had to do with the "newline" issue as between Windows and Unix.
To help anyone else with a similar issue, what I did was, via Putty, I deleted the old runcommand-onstart.sh and created a new one and made it executable. Then I typed:
sudo nano /opt/retropie/configs/all/runcommand-onstart.sh
and manually typed in the whole code with the if/then statement:
#!/bin/sh if [ "$1" = "amiga" ] then sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.2.3:1.0-event-joystick \ --silent \ --detach-kernel-driver \ --force-feedback \ --deadzone-trigger 15% \ --deadzone 4000 \ --trigger-as-button \ --mimic-xpad \ --device-name "Amiga Joystick Player 1 (xboxdrv)" \ --evdev-absmap ABS_X=y1,ABS_Y=x1 \ --evdev-keymap BTN_TRIGGER=X,BTN_THUMB=Y,BTN_THUMB2=A,BTN_PINKIE=B,BTN_BASE3=BACK,BTN_BASE6=START \ --ui-buttonmap lb=void,rb=void,tl=void,tr=void,guide=void,lt=void,rt=void \ & fi
Xboxdrv now works as it should with the uae4arm emulator. I have a runcommand-onend.sh file as well which terminates xboxdrv automatically.
I have now altered the default settings in WinSCP from "binary" to "text", but decided that, from a pure troubleshooting perspective, it would just be easier to manually enter the details with putty, rather than copy and paste from another file or use WinSCP to transfer the file or edit.
Also, there is one other thing. I've got samba shares operating as well in Windows and regularly transferred files including the runcommand-onstart.sh (which I'd sometimes created in Windows with Notepad++ during this troubleshooting process) from Windows to the raspberry pi. I'm sure that would also have led to the "newline" issue too.
Sometimes it's just better to use the raspberry pi's native editors, I suppose. Thanks, guys.
-
Glad to see you got it going.
-
Hey quick question, is it possible to map 2 controllers with Xboxdrv for two players to be able to play? It might have been discussed in the thread but I didn't find it. I found mappings for the 2nd player though so I'm assuming it's possible just wasn't sure how to pull it off.
-
Sure. You'd just string two commands together instead of having just one. A quick example for Intellivision would look like
if [ "$1" = "intellivision" ] then sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.2:1.0-event-joystick \ --detach-kernel-driver \ --force-feedback \ --dpad-as-button \ --trigger-as-button \ --deadzone-trigger 15% \ --deadzone 4000 \ --device-name "Logitech Rumblepad 2 (xboxdrv)" \ --silent \ --axismap -Y1=Y1,-Y2=Y2 \ --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_Z=x2,ABS_RZ=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \ --evdev-keymap BTN_THUMB2=a,BTN_THUMB=b,BTN_TOP=x,BTN_TRIGGER=y,BTN_BASE3=back,BTN_BASE4=start,BTN_TOP2=lb,BTN_PINKIE=rb,BTN_BASE5=tl,BTN_BASE6=tr,BTN_BASE=lt,BTN_BASE2=rt \ --ui-axismap X1=KEY_S:KEY_D,Y1=KEY_E:KEY_X,X2=KEY_1:KEY_2,Y2=KEY_3:KEY_4,lt+X2=KEY_5:KEY_6,lt+Y2=KEY_7:KEY_8,rt+X2=KEY_9:KEY_0,rt+Y2=KEY_MINUS:KEY_EQUAL \ --ui-buttonmap b=KEY_LEFTSHIFT,a=KEY_UNKNOWN,x=KEY_LEFTCTRL,y=KEY_LEFTALT,lb=KEY_UNKNOWN,rb=KEY_UNKNOWN,lt=KEY_UNKNOWN,rt=KEY_UNKNOWN,tl=KEY_UNKNOWN,tr=KEY_UNKNOWN,du=KEY_E,dd=KEY_X,dl=KEY_S,dr=KEY_D,start=KEY_PAUSE \ --ui-buttonmap back=cycle-key:KEY_F6:KEY_F5 \ --ui-buttonmap back+start=KEY_F1,back+b=KEY_F12,back+y=KEY_F11,back+a=KEY_PAUSE \ --ui-buttonmap lt+a=KEY_A,lt+b=KEY_B,lt+x=KEY_X,lt+y=KEY_Y,lt+lb=KEY_L,lt+rb=KEY_R,lt+du=KEY_UP,lt+dd=KEY_DOWN,lt+dl=KEY_LEFT,lt+dr=KEY_RIGHT,lt+start=KEY_T,lt+back=KEY_E \ --ui-buttonmap guide=void \ & sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.4:1.0-event-joystick \ --detach-kernel-driver \ --force-feedback \ --dpad-as-button \ --trigger-as-button \ --deadzone-trigger 15% \ --deadzone 4000 \ --device-name "Logitech Rumblepad 2 (xboxdrv)" \ --silent \ --axismap -Y1=Y1,-Y2=Y2 \ --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_Z=x2,ABS_RZ=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \ --evdev-keymap BTN_THUMB2=a,BTN_THUMB=b,BTN_TOP=x,BTN_TRIGGER=y,BTN_BASE3=back,BTN_BASE4=start,BTN_TOP2=lb,BTN_PINKIE=rb,BTN_BASE5=tl,BTN_BASE6=tr,BTN_BASE=lt,BTN_BASE2=rt \ --ui-axismap X1=KEY_J:KEY_K,Y1=KEY_I:KEY_M,X2=KEY_KP1:KEY_KP2,Y2=KEY_KP3:KEY_KP4,lt+X2=KEY_KP5:KEY_KP6,lt+Y2=KEY_KP7:KEY_KP8,rt+X2=KEY_KP9:KEY_DOT,rt+Y2=KEY_0:KEY_ENTER \ --ui-buttonmap b=KEY_RIGHTSHIFT,a=KEY_UNKNOWN,x=KEY_RIGHTCTRL,y=KEY_RIGHTALT,lb=KEY_UNKNOWN,rb=KEY_UNKNOWN,lt=KEY_UNKNOWN,rt=KEY_UNKNOWN,tl=KEY_UNKNOWN,tr=KEY_UNKNOWN,du=KEY_I,dd=KEY_M,dl=KEY_J,dr=KEY_K,back=KEY_UNKNOWN,start=KEY_PAUSE \ --ui-buttonmap back+start=KEY_F1,back+b=KEY_F12,back+y=KEY_F11,back+a=KEY_PAUSE \ --ui-buttonmap lt+a=KEY_A,lt+b=KEY_B,lt+x=KEY_X,lt+y=KEY_Y,lt+lb=KEY_L,lt+rb=KEY_R,lt+du=KEY_UP,lt+dd=KEY_DOWN,lt+dl=KEY_LEFT,lt+dr=KEY_RIGHT,lt+start=KEY_T,lt+back=KEY_E \ --ui-buttonmap guide=void \ & fi
You can even have both those commands set to run by default and have others run for individual games using
elif
. Adding a map command to the example above that will only launch for 'Masters of The Universe: The Power of He-Man' would look like:if [ "$1" = "intellivision" ] && [ "$3" = "/home/pi/RetroPie/roms/intellivision/Masters of the Universe-The Power of He-Man! (1983) (Mattel).int" ] then sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.2:1.0-event-joystick \ --detach-kernel-driver \ --force-feedback \ --dpad-as-button \ --trigger-as-button \ --deadzone-trigger 15% \ --deadzone 4000 \ --device-name "Logitech Rumblepad 2 (xboxdrv)" \ --silent \ --axismap -Y1=Y1,-Y2=Y2 \ --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_Z=x2,ABS_RZ=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \ --evdev-keymap BTN_THUMB2=a,BTN_THUMB=b,BTN_TOP=x,BTN_TRIGGER=y,BTN_BASE3=back,BTN_BASE4=start,BTN_TOP2=lb,BTN_PINKIE=rb,BTN_BASE5=tl,BTN_BASE6=tr,BTN_BASE=lt,BTN_BASE2=rt \ --ui-axismap X1=KEY_S:KEY_D,Y1=KEY_E:KEY_X,X2=KEY_1:KEY_2,Y2=KEY_3:KEY_4,lt+X2=KEY_5:KEY_6,lt+Y2=KEY_7:KEY_8,rt+X2=KEY_9:KEY_0,rt+Y2=KEY_MINUS:KEY_EQUAL \ --ui-buttonmap b=KEY_LEFTSHIFT,a=KEY_2,x=KEY_LEFTCTRL,y=KEY_LEFTALT,lb=KEY_UNKNOWN,rb=KEY_UNKNOWN,lt=KEY_UNKNOWN,rt=KEY_UNKNOWN,tl=KEY_UNKNOWN,tr=KEY_UNKNOWN,du=KEY_E,dd=KEY_X,dl=KEY_S,dr=KEY_D,start=KEY_PAUSE \ --ui-buttonmap back=cycle-key:KEY_F6:KEY_F5 \ --ui-buttonmap back+start=KEY_F1,back+b=KEY_F12,back+y=KEY_F11,back+a=KEY_PAUSE \ --ui-buttonmap lt+a=KEY_A,lt+b=KEY_B,lt+x=KEY_X,lt+y=KEY_Y,lt+lb=KEY_L,lt+rb=KEY_R,lt+du=KEY_UP,lt+dd=KEY_DOWN,lt+dl=KEY_LEFT,lt+dr=KEY_RIGHT,lt+start=KEY_T,lt+back=KEY_E \ --ui-buttonmap guide=void \ & elif [ "$1" = "intellivision" ] then sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.2:1.0-event-joystick \ --detach-kernel-driver \ --force-feedback \ --dpad-as-button \ --trigger-as-button \ --deadzone-trigger 15% \ --deadzone 4000 \ --device-name "Logitech Rumblepad 2 (xboxdrv)" \ --silent \ --axismap -Y1=Y1,-Y2=Y2 \ --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_Z=x2,ABS_RZ=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \ --evdev-keymap BTN_THUMB2=a,BTN_THUMB=b,BTN_TOP=x,BTN_TRIGGER=y,BTN_BASE3=back,BTN_BASE4=start,BTN_TOP2=lb,BTN_PINKIE=rb,BTN_BASE5=tl,BTN_BASE6=tr,BTN_BASE=lt,BTN_BASE2=rt \ --ui-axismap X1=KEY_S:KEY_D,Y1=KEY_E:KEY_X,X2=KEY_1:KEY_2,Y2=KEY_3:KEY_4,lt+X2=KEY_5:KEY_6,lt+Y2=KEY_7:KEY_8,rt+X2=KEY_9:KEY_0,rt+Y2=KEY_MINUS:KEY_EQUAL \ --ui-buttonmap b=KEY_LEFTSHIFT,a=KEY_UNKNOWN,x=KEY_LEFTCTRL,y=KEY_LEFTALT,lb=KEY_UNKNOWN,rb=KEY_UNKNOWN,lt=KEY_UNKNOWN,rt=KEY_UNKNOWN,tl=KEY_UNKNOWN,tr=KEY_UNKNOWN,du=KEY_E,dd=KEY_X,dl=KEY_S,dr=KEY_D,start=KEY_PAUSE \ --ui-buttonmap back=cycle-key:KEY_F6:KEY_F5 \ --ui-buttonmap back+start=KEY_F1,back+b=KEY_F12,back+y=KEY_F11,back+a=KEY_PAUSE \ --ui-buttonmap lt+a=KEY_A,lt+b=KEY_B,lt+x=KEY_X,lt+y=KEY_Y,lt+lb=KEY_L,lt+rb=KEY_R,lt+du=KEY_UP,lt+dd=KEY_DOWN,lt+dl=KEY_LEFT,lt+dr=KEY_RIGHT,lt+start=KEY_T,lt+back=KEY_E \ --ui-buttonmap guide=void \ & sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.4:1.0-event-joystick \ --detach-kernel-driver \ --force-feedback \ --dpad-as-button \ --trigger-as-button \ --deadzone-trigger 15% \ --deadzone 4000 \ --device-name "Logitech Rumblepad 2 (xboxdrv)" \ --silent \ --axismap -Y1=Y1,-Y2=Y2 \ --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_Z=x2,ABS_RZ=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \ --evdev-keymap BTN_THUMB2=a,BTN_THUMB=b,BTN_TOP=x,BTN_TRIGGER=y,BTN_BASE3=back,BTN_BASE4=start,BTN_TOP2=lb,BTN_PINKIE=rb,BTN_BASE5=tl,BTN_BASE6=tr,BTN_BASE=lt,BTN_BASE2=rt \ --ui-axismap X1=KEY_J:KEY_K,Y1=KEY_I:KEY_M,X2=KEY_KP1:KEY_KP2,Y2=KEY_KP3:KEY_KP4,lt+X2=KEY_KP5:KEY_KP6,lt+Y2=KEY_KP7:KEY_KP8,rt+X2=KEY_KP9:KEY_DOT,rt+Y2=KEY_0:KEY_ENTER \ --ui-buttonmap b=KEY_RIGHTSHIFT,a=KEY_UNKNOWN,x=KEY_RIGHTCTRL,y=KEY_RIGHTALT,lb=KEY_UNKNOWN,rb=KEY_UNKNOWN,lt=KEY_UNKNOWN,rt=KEY_UNKNOWN,tl=KEY_UNKNOWN,tr=KEY_UNKNOWN,du=KEY_I,dd=KEY_M,dl=KEY_J,dr=KEY_K,back=KEY_UNKNOWN,start=KEY_PAUSE \ --ui-buttonmap back+start=KEY_F1,back+b=KEY_F12,back+y=KEY_F11,back+a=KEY_PAUSE \ --ui-buttonmap lt+a=KEY_A,lt+b=KEY_B,lt+x=KEY_X,lt+y=KEY_Y,lt+lb=KEY_L,lt+rb=KEY_R,lt+du=KEY_UP,lt+dd=KEY_DOWN,lt+dl=KEY_LEFT,lt+dr=KEY_RIGHT,lt+start=KEY_T,lt+back=KEY_E \ --ui-buttonmap guide=void \ & fi
So basically it dictates that if the system is Intellivision and the ROM is He-Man, then it will launch the He-Man map command. Otherwise, if the system is Intellivision with no specified ROM, it will always fall back to the default one and two player map commands.
-
@mediamogul Nice! So there are certain games you don't want to run in two player mode like He-Man?
-
Not really. It'll just ignore the second controller input if it's a game that doesn't use it.
-
@mediamogul Thanks, mediamogul.
I've also managed to get 2 players working (see below) based on your response to @Hubz, albeit I'm still having the same problems with the "newlines" and finding I'm manually re-doing the carriage returns to get it working.
#!/bin/sh if [ "$1" = "amiga" ] then sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv > /dev/null 2>&1 \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.3:1.0-event-joystick \ --silent \ --detach-kernel-driver \ --force-feedback \ --deadzone-trigger 15% \ --deadzone 4000 \ --trigger-as-button \ --mimic-xpad \ --device-name "Amiga Joystick Player 1 (xboxdrv)" \ --evdev-absmap ABS_X=y1,ABS_Y=x1 \ --evdev-keymap BTN_TRIGGER=X,BTN_THUMB=Y,BTN_THUMB2=A,BTN_PINKIE=B,BTN_BASE3=BACK,BTN_BASE6=START \ --ui-buttonmap lb=void,rb=void,tl=void,tr=void,guide=void,lt=void,rt=void \ & sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv >/dev/null 2>&1 \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.1:1.0-event-joystick \ --silent \ --detach-kernel-driver \ --force-feedback \ --deadzone-trigger 15% \ --deadzone 4000 \ --trigger-as-button \ --mimic-xpad \ --device-name "Amiga Joystick Player 2 (xboxdrv)" \ --evdev-absmap ABS_X=y1,ABS_Y=x1 \ --evdev-keymap BTN_TRIGGER=Y,BTN_THUMB=A,BTN_THUMB2=BACK,BTN_PINKIE=X,BTN_TOP=B,BTN_TOP2=START \ --ui-buttonmap lb=void,rb=void,tl=void,tr=void,guide=void,lt=void,rt=void \ & fi
Since getting this Amiga script working, I've tried to make a script for multiple emulators, similar to the one appearing in my response to @EctoOne at 275 above. I wasn't successful.
As I've got the Amiga script working based on the if/then statement, I was wondering whether it's possible to adapt the existing script using another if/then statement so that I might also be able to use xboxdrv for particular Arcade games that require 4 way joysticks (like Pacman and Donkey Kong). I've got a list of about 200 arcade games that apparently use 4 way, rather than 8 way, joysticks. I suspect this script might end up being very long....
Thanks for any help.
-
@spud11 said in Guide: Advanced Controller Mappings:
I'm still having the same problems with the "newlines" and finding I'm manually re-doing the carriage returns to get it working.
I had a similar problem with the OSX TextEdit, but was able to set it to Unicode UTF-8. That might not be the exact setting in your case, but it'll end up being easier if you can adapt Notepad++ to omit the rogue carriage returns or find another text editor that doesn't have that issue.
I suspect this script might end up being very long.
It would indeed. This would seem like a good opportunity to use @MadHorse's expanded case statement technique from the xboxdrv guide. In his example there, you'll see an area for adding just the ROM names of titles that should use a four-way restrictor, making the script much shorter and more manageable.
-
@mediamogul Hi! Here I am, with a few naive questions if I may. This morning I managed to have some time and looked into xboxdrv. I was trying out a simple example to see if I could remap a button to a key, but it didn't seem to work in the game I was trying it in so I thought of dropping by again.
I got to launch xboxdrv "properly", and having it assign a new id to my controller. In this case, I was just trying to assign "select" on my controller to "escape" on the keyboard. I did the whole evtest thing.I ran
sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv \ --evdev /dev/input/by-id/usb-Sony_PLAYSTATION_R_3_Controller-event-joystick \ --silent \ --detach-kernel-driver \ --force-feedback \ --deadzone-trigger 15% \ --deadzone 4000 \ --mimic-xpad \ --evdev-keymap BTN_TRIGGER=b \ --ui-buttonmap b=KEY_ESC
But escape didn't seem to be registered, so I'm surely doing something wrong here. I believe I also tried it with
--evdev /dev/input/event2
But got similar non-results. :)
Is there a way I can just press the buttons on my controller and see if the keys are registering, say by sending characters to the terminal? I'm happy to map it to any other key. Is the right way for that to launch xboxdrv (for instance, via SSH), and go to the terminal on the Pi?
Just so I can continue testing.
Do I need to explicitly map all the buttons from the controller? Do I explicitly need to map app evdev-keymap definitions to -ui-buttonmap definitions?
Thanks, and sorry for the trouble.
-
it didn't seem to work in the game I was trying it in
If the game happened to be running from a RetroArch core, RetroArch requires a udev rule be set before it will recognize the virtual keyboard. That information is located at the tail-end of section 3A of the guide.
Is there a way I can just press the buttons on my controller and see if the keys are registering
You could map a letter for your test key and open up something like
nano
to see if it enters correctly. Something more substantial would be to consider that the virtual keyboard actually registers as a normal keyboard event, so you could test every keypress you map to it withevtest
.Do I need to explicitly map all the buttons from the controller? Do I explicitly need to map app evdev-keymap definitions to -ui-buttonmap definitions?
No, your example is fine and an ideal first test.
Thanks, and sorry for the trouble.
No trouble at all.
-
@mediamogul Thanks.
The nano test was what I had in mind - just wanted to confirm what was the right approach to test it, given that when I launch xboxdrv at the moment it just takes over the window. I suppose I could launch it as a daemon, but for quick iterations I'd rather test it like this.
I'll launch xboxdrv from SSH, and then in the Pi's command line I'll check for key presses.
It's not a RetroArch core per se, but the GameMaker port. I'll look into the udev thingie, though, if events are being registered but don't make it to the game.
Thank you for your excellent service here! I'll report back when I do have the chance to test this, but may only be in the coming days.
-
@pjft said in Guide: Advanced Controller Mappings:
It's not a RetroArch core per se, but the GameMaker port.
It seems like I remember helping someone setup xboxdrv with a GameMaker port several months ago where the same thing was required, so that could be it.
I'll report back when I do have the chance to test this, but may only be in the coming days.
Keen beans mean Gene.
-
@mediamogul Thanks.
So, indeed, the terminal shows the keys I'm pressing, and I can control Rick Dangerous (of all things)!
I can't, however, send my inputs to GameMaker. I even tried disconnecting my keyboard, thinking it could be something like it defaulting to the first keyboard it detected, but nada.
Here's the command I'm using:
sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv \ --evdev /dev/input/event2 \ --silent \ --detach-kernel-driver \ --force-feedback \ --deadzone-trigger 15% \ --deadzone 4000 \ --mimic-xpad \ --dpad-as-button \ --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_Z=x2,ABS_RZ=y2,ABS_#48=lt,ABS_#49=rt \ --evdev-keymap KEY_#302=a,KEY_#301=b,BTN_DEAD=x,KEY_#300=y,BTN_THUMB=tl,BTN_THUMB2=tr, BTN_BASE5=lb,BTN_BASE6=rb,BTN_TRIGGER=back,KEY_#720=guide, BTN_TOP=start,BTN_TOP2=du,BTN_PINKIE=dr,BTN_BASE=dd,BTN_BASE2=dl \ --ui-buttonmap a=KEY_Z,b=KEY_X,x=KEY_S,y=KEY_A,lb=KEY_F1,rb=KEY_F12,lt=KEY_HOME, rt=KEY_HOME,tl=KEY_HOME,tr=KEY_HOME,du=KEY_UP,dd=KEY_DOWN, dl=KEY_LEFT,dr=KEY_RIGHT,start=KEY_ESC \ --calibration x1=-32767:0:32767,y1=-32767:0:32767,x2=-32767:0:32767,y2=-32767:0:32767 &
(yes, I broke some of the lines here deliberately, for legibility, but they're all together as they should).
I even added the udev thingie you have in this post, as well as the one in the wiki (in case they're different - using only one didn't do much).
sudo nano /etc/udev/rules.d/99-xboxdrv.rules SUBSYSTEM=="input", ATTRS{name}=="Microsoft X-Box 360 pad - Keyboard Emulation", GROUP="users", MODE="0666", ENV{ID_INPUT_KEYBOARD}="1"
and
sudo nano /etc/udev/rules.d/55-permissions-uinput.rules KERNEL=="uinput", MODE="0660", GROUP="users"
and rebooted.
I'm calling it a day here, but curious as to what else you'd suggest me doing here - if anything.
By all means, your guide was tremendously helpful, and knowing that I can at least set it up for some other games is great! Just curious to see if we could get the GameMaker ones on board as well, but it's not critical.
Thanks, have a great day!
-
@pjft said in Guide: Advanced Controller Mappings:
I broke some of the lines here deliberately, for legibility, but they're all together as they should
When I've tried to do that in the past, the command always ends prematurely at the break and xboxdrv ignores everything afterward. Is there some special carriage return that keeps them together?
-
@mediamogul Oh, no, sorry.
What I meant is that I broke the lines here in the forum, as it was messing up my whole window when I pasted them here. Not in the terminal.
The command is, effectively the following - apologies for the lack of formatting as it's unwieldy:
sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv
--evdev /dev/input/event2
--silent
--detach-kernel-driver
--force-feedback
--deadzone-trigger 15%
--deadzone 4000
--mimic-xpad
--dpad-as-button
--evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_Z=x2,ABS_RZ=y2,ABS_#48=lt,ABS_#49=rt
--evdev-keymap KEY_#302=a,KEY_#301=b,BTN_DEAD=x,KEY_#300=y,BTN_THUMB=tl,BTN_THUMB2=tr,BTN_BASE5=lb,BTN_BASE6=rb,BTN_TRIGGER=back,KEY_#720=guide,BTN_TOP=start,BTN_TOP2=du,BTN_PINKIE=dr,BTN_BASE=dd,BTN_BASE2=dl
--ui-buttonmap a=KEY_Z,b=KEY_X,x=KEY_S,y=KEY_A,lb=KEY_F1,rb=KEY_F12,lt=KEY_HOME,rt=KEY_HOME,tl=KEY_HOME,tr=KEY_HOME,du=KEY_UP,dd=KEY_DOWN,dl=KEY_LEFT,dr=KEY_RIGHT,start=KEY_ESC
--calibration x1=-32767:0:32767,y1=-32767:0:32767,x2=-32767:0:32767,y2=-32767:0:32767
& -
Ah, OK. I'll try to dig up that post from a while back and see what happened there. It could be that it didn't work in GameMaker then either.
Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.
Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.