Guide: Advanced Controller Mappings
-
@mediamogul Hi mediamogul. Could I ask where the output would have been saved please? The usual statements came up on screen briefly for both joysticks (ie the js/event number etc). Or would you prefer I just enter the code into the commandline? Thanks.
-
I would first look at
/dev/shm/runcommand.log
, but if there's nothing there, entering it into the command line should indeed show the error. -
@mediamogul Hi. I've now tested both with the script and the commandline. I think I removed a space before one of the # and that caused the problem. Everything seems to be working now (touch wood). I found the best way to test was to test both the restricted code and the unrestricted code in a shoot 'em up. It's clear as daylight that the code is working when you can't do diagonals in a shoot 'em up. Thanks for your advice on this.
Lr-mame2003 doesn't seem to have a "native" key for exiting the emulator. It relies on Retroarch. In Retroarch, I've got the "exit from emulator" set up to operate when I hold down the space key and press escape on the keyboard. As I've only got 6 buttons on Joystick 3 and, so far, I've mapped buttons 5 and 6 to "coin" (key 5) and "start" (key 1), respectively, I was wondering if it were possible to map button 5 to both keys 5 and 1 and then map button 6 to space and escape, so I can exit without the keyboard. From reading through most of the thread again, I can't see anything that really resembles what I want to do.
I've looked at your examples where you've mapped 2 buttons on the joystick (basically a modifier) to a key on the keyboard. But I want to do the opposite - press one button and it presses 2 keys.
Looking at the manual for xboxdrv, there seems to be "cycle" and "sequence" commands. The sequence one looks most likely, but I'm not sure it can be used to press a key while holding down another key.
Worst case, I suppose I could just remap the emulator keys via TAB so that if I press the 1 key it both gives me a coin and starts the game and then just map xboxdrv accordingly. I have done that before, but I don't think that's going to resolve the "exit from emulator" issue with lr-mame2003, and so I was hoping for a more elegant xboxdrv solution if there is one please.
Or perhaps I'm missing something obvious. It is getting quite late here.... Thanks.
-
I want to do the opposite - press one button and it presses 2 keys.
Using the 'A' button as an example, you would map keys 1 and 5 to it with:
--ui-buttonmap a=KEY_1+KEY_5
I'm glad to see all this is starting to turn your way. With all your controls coexisting in various ways, your setup has been uniquely complicated.
-
Hey finished my Atari ST Mapping and it works pretty good if someone else would like to try it.
atarist="--axismap -Y1=Y1,-Y2=Y2
--ui-axismap x2=REL_X:10,y2=REL_Y:10
--ui-axismap x1=KEY_LEFT:KEY_RIGHT,y1=KEY_DOWN:KEY_UP
--ui-buttonmap du=KEY_UP,dd=KEY_DOWN,dl=KEY_LEFT,dr=KEY_RIGHT,back+start=KEY_RIGHTALT+KEY_Q
--ui-buttonmap lt=BTN_LEFT,rt=BTN_RIGHT,back=KEY_F12,start=KEY_1,y=KEY_RIGHTCTRL,a=KEY_SPACE,b=KEY_ENTER,x=KEY_ESC,lb=KEY_Y,rb=KEY_N
--ui-buttonmap guide=void,tl=void,tr=void
--ui-axismap x2=void" -
You've got some nice touches in there. One of my favorite options for using an external mapper like this is the ability to map 'start+select' to exit everything. The result is an almost perfect unified console feeling that normally can't be had, given the wild west of software options available throughout RetroPie. Nice job!
-
Thanks! I came from tinkering for years with Hyperspin and Launchbox, and while Launchbox has a few features I miss, it's hard to beat the customization you can do with Retropie as well as the stability of the Linux environment.
-
Ok .. so i have everything working. I have a question regarding the evdev line.
I add and subtract keyboards and controllers all the time.
Using something like --evdev /dev/input/event2 does not always work because depending on the connection order the event number can change.
Is there a way to ensure the identity of a device somehow ? I have had to change my scripts to correspond with my event number manually within my scripts and would love to not have to worry about that.
Thanks
-
If a controller doesn't have a unique event name (obtained in the first section of the guide), then you should be able to specify it's path found at
/dev/input/by-path/
. As long as the controller is plugged into that same USB port every time, the event path should be accessible. For example, when my Logitech RumblePad is connected to the upper left USB port, it's event can always be accessed at/dev/input/by-path/platform-3f980000.usb-usb-0:1.2:1.0-event-joystick
. -
@mediamogul right .. but as I am using wireless controllers ... by_path wont work right ?
-
It might still create a unique event path of it's own. I've never tested it with a Bluetooth controller. If the event name and path are not an option, I'm afraid event numbers are the only other recourse.
-
@mediamogul Thanks for this. I've adapted that and all seems to work as intended. Just now a matter of adding all 208 games that are 4 way restricted. Then I'll turn to some of the other emulators like Daphne, I think.
It most definitely is a complicated setup I've got. I really appreciate your help and patience. What a great community the Retropie community is.
#!/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 ### Code begins ### Get ROM full path rom="${3##*/}" ### Set variables for joysticks and emulators ### Basic Configurations - Standard controller mappings basic="sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv \ --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 configurations or any other parameters you will need only for some emulators ### Player 1 and 2 joystick settings for Amiga games - only change is to the axes which have been swapped; not mapped to UAE4ARM's default keyboard settings amiga1="--evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.3:1.0-event-joystick \ --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" amiga2="--evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.1:1.0-event-joystick \ --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" ### Settings for Arcade games that require 4-Way Restricted Joysticks joy1restricted="--evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.3:1.0-event-joystick \ --device-name "Player_1_-_4-Way_Joystick_xboxdrv" \ --evdev-absmap ABS_X=x1,ABS_Y=y1 \ --four-way-restrictor \ --evdev-keymap BTN_TRIGGER=y,BTN_THUMB=a,BTN_THUMB2=back,BTN_PINKIE=x,BTN_TOP=b,BTN_TOP2=start" joy2restricted="--evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.1:1.0-event-joystick \ --device-name "Player_2_-_4-Way_Joystick_xboxdrv" \ --evdev-absmap ABS_X=x1,ABS_Y=y1 \ --four-way-restrictor \ --evdev-keymap BTN_TRIGGER=y,BTN_THUMB=a,BTN_THUMB2=back,BTN_PINKIE=x,BTN_TOP=b,BTN_TOP2=start" joy3restricted="--evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.2:1.0-event-joystick \ --device-name "Player_3_-_4-Way_Joystick_xboxdrv" \ --evdev-absmap ABS_X=x1,ABS_Y=y1 \ --four-way-restrictor \ --evdev-keymap BTN_TRIGGER=y,BTN_THUMB=a,BTN_THUMB2=back,BTN_PINKIE=x,BTN_TOP=b,BTN_TOP2=start" joy4restricted="--evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.4:1.0-event-joystick \ --device-name "Player_4_-_4-Way_Joystick_xboxdrv" \ --evdev-absmap ABS_X=x1,ABS_Y=y1 \ --four-way-restrictor \ --evdev-keymap BTN_TRIGGER=y,BTN_THUMB=a,BTN_THUMB2=back,BTN_PINKIE=x,BTN_TOP=b,BTN_TOP2=start" ### Settings for Arcade games that use 8-Way Unrestricted Joysticks joy1unrestricted="--evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.3:1.0-event-joystick \ --device-name "Player_1_-_8-Way_Joystick_xboxdrv" \ --evdev-absmap ABS_X=x1,ABS_Y=y1 \ --evdev-keymap BTN_TRIGGER=y,BTN_THUMB=a,BTN_THUMB2=back,BTN_PINKIE=x,BTN_TOP=b,BTN_TOP2=start" joy2unrestricted="--evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.1:1.0-event-joystick \ --device-name "Player_2_-_8-Way_Joystick_xboxdrv" \ --evdev-absmap ABS_X=x1,ABS_Y=y1 \ --evdev-keymap BTN_TRIGGER=y,BTN_THUMB=a,BTN_THUMB2=back,BTN_PINKIE=x,BTN_TOP=b,BTN_TOP2=start" joy3unrestricted="--evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.2:1.0-event-joystick \ --device-name "Player_3_-_8-Way_Joystick_xboxdrv" \ --evdev-absmap ABS_X=x1,ABS_Y=y1 \ --evdev-keymap BTN_TRIGGER=y,BTN_THUMB=a,BTN_THUMB2=back,BTN_PINKIE=x,BTN_TOP=b,BTN_TOP2=start" joy4unrestricted="--evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.4:1.0-event-joystick \ --device-name "Player_4_-_8-Way_Joystick_xboxdrv" \ --evdev-absmap ABS_X=x1,ABS_Y=y1 \ --evdev-keymap BTN_TRIGGER=y,BTN_THUMB=a,BTN_THUMB2=back,BTN_PINKIE=x,BTN_TOP=b,BTN_TOP2=start" ### Settings for mame-libretro Arcade games in landscape mode - joysticks emulating virtual keyboards ### The joystick buttons have been mapped to the emulator's default keys. In lr-mame 2003 in game, press TAB to determine default keys. ### Player 1's default keys are: Buttons 1-4 (LCTRL, LALT, SPACE, LSHIFT), Start (1), Coin (5), Movement (Arrow keys) ### Player 2's default keys are: Buttons 1-4 (a, s, q, w), Start (2), Coin (6), Movement (g, d, r, f) ### For Joystick 1 (Player 1), Buttons 1 to 4 are for fire and jump and so on. Button 5 will start Player 1; Button 6 will start Player 2; Holding Button 5 and pressing Button 6 together will exit emulator in line with Retroarch hotkey ### For Joystick 2 (Player 2), Buttons 1 to 4 are for fire and jump and so on. Button 5 will start Player 2; Button 6 does nothing; Holding Button 5 and pressing Button 6 together will exit emulator in line with Retroarch hotkey joy1="--ui-axismap X1=KEY_LEFT:KEY_RIGHT,Y1=KEY_UP:KEY_DOWN \ --ui-buttonmap a=KEY_LEFTCTRL,b=KEY_LEFTALT,x=KEY_SPACE,y=KEY_LEFTSHIFT,back=KEY_5+KEY_1,start=KEY_6+KEY_2,back+start=KEY_SPACE+KEY_ESC" joy2="--ui-axismap X1=KEY_D:KEY_G,Y1=KEY_R:KEY_F \ --ui-buttonmap a=KEY_A,b=KEY_S,x=KEY_Q,y=KEY_W,back=KEY_6+KEY_2,start=KEY_UNKNOWN,back+start=KEY_SPACE+KEY_ESC" ### Settings for mame-libretro Arcade games in folder 'Arcade-Vertical' in portrait/cocktail mode - joysticks emulating virtual keyboards ### The joystick buttons have been mapped to the emulator's default keys. In lr-mame 2003 in game, press TAB to determine default keys. ### Player 1's default keys are: Buttons 1-4 (LCTRL, LALT, SPACE, LSHIFT), Start (1), Coin (5), Movement (Arrow keys) ### Player 2's default keys are: Buttons 1-4 (a, s, q, w), Start (2), Coin (6), Movement (g, d, r, f) ### Because Joysticks 3 and 4 are in portrait (not landscape) mode, the axes needed to be mapped differently (eg for Joystick 3, left and right became down and up). ### For Joystick 3 (Player 1), Buttons 1 to 4 are for fire and jump and so on. Button 5 will start Player 1; Button 6 will start Player 2; Holding Button 5 and pressing Button 6 together will exit emulator in line with Retroarch hotkey ### For Joystick 4 (Player 2), Buttons 1 to 4 are for fire and jump and so on. Button 5 will start Player 2; Button 6 does nothing; Holding Button 5 and pressing Button 6 together will exit emulator in line with Retroarch hotkey joy3="--ui-axismap X1=KEY_DOWN:KEY_UP,Y1=KEY_RIGHT:KEY_LEFT \ --ui-buttonmap a=KEY_LEFTCTRL,b=KEY_LEFTALT,x=KEY_SPACE,y=KEY_LEFTSHIFT,back=KEY_5+KEY_1,start=KEY_6+KEY_2,back+start=KEY_SPACE+KEY_ESC" joy4="--ui-axismap X1=KEY_F:KEY_R,Y1=KEY_G:KEY_D \ --ui-buttonmap a=KEY_A,b=KEY_S,x=KEY_Q,y=KEY_W,back=KEY_6+KEY_2,start=KEY_UNKNOWN,back+start=KEY_SPACE+KEY_ESC" ### Kill xboxdrv command xboxkill="sudo killall xboxdrv" ### Execute the driver with the configuration you need ### $1 is the name of the system emulation (eg mame-libretro), not the name of the emulator (eg not lr-mame2003), nor the name of the folder (eg not "arcade", not "mame-libretro", not "arcade-vertical" ### $1 - The system (eg: atari2600, nes, snes, megadrive, fba, etc). ### $2 - The emulator (eg: lr-stella, lr-fceumm, lr-picodrive, pifba, etc). ### $3 - The full path to the rom file. ### $4 - The full command line used to launch the emulator. ### This information can be obtained from /dev/shm/runcommand.info case $1 in mame-libretro) case $rom in "afighter.zip"|"alibaba.zip"|"amidar.zip"|"armwrest.zip"|"astinvad.zip"|"atetris.zip"|"anteater.zip"|"armorcar.zip"|"astrob.zip"|"astrof.zip"|"bagman.zip"|"ballbomb.zip"|"barrier.zip"|"blkhole.zip"|"blasto.zip"|"blockade.zip"|"btime.zip"|"carjmbre.zip"|"carnival.zip"|"cavelon.zip"|"chameleo.zip"|"checkman.zip"|"chinhero.zip"|"circusc.zip"|"ckong.zip"|"commando.zip"|"congo.zip"|"crush.zip"|"dazzler.zip"|"devilfsh.zip"|"digdug.zip"|"digdug2.zip"|"digger.zip"|"disco.zip"|"dkong.zip"|"dkong3.zip"|"dkongjr.zip"|"dommy.zip"|"dorodon.zip"|"mrdo.zip"|"puckman.zip"|"mspacman.zip") # Configuration used only for these ROMs $xboxkill joycommand="$basic $joy3restricted $joy3 & $basic $joy4restricted $joy4 &" eval $joycommand ;; *) # Configuration for every other ROM in respect of this emulator $xboxkill joycommand="$basic $joy3unrestricted $joy3 & $basic $joy4unrestricted $joy4 &" eval $joycommand ;; esac ;; amiga) $xboxkill joycommand="$basic $amiga1 & $basic $amiga2 &" eval $joycommand ;; esac
-
@Hubz Hi. I've added about 30 or so of the Arcade games that use 4 way restricted joysticks. Probably sometime during the next week I'll get to the remaining ones and will post them all. You'll see in my most recent message to mediamogul where I include the block of code, how far I've got.
-
@Hubz Hi. I've now identified 132 of the 208 4-way joystick restricted games. I'm using portrait mode, so I've only identified the ones I believe work in portrait mode. Here is the list from my runcommand-onstart.sh file:
### Arcade Games in portrait mode that use 4 way restricted joysticks - 132 of 208 identified games RestrictedArcadeGamesPortraitMode=""alibaba.zip"|"amidar.zip"|"armwrest.zip"|"astinvad.zip"|"atetris.zip"|"anteater.zip"|"armorcar.zip"|"astrob.zip"|"astrof.zip"|"bagman.zip"|"ballbomb.zip"|"barrier.zip"|"blkhole.zip"|"blasto.zip"|"blockade.zip"|"btime.zip"|"carjmbre.zip"|"carnival.zip"|"cavelon.zip"|"chameleo.zip"|"checkman.zip"|"chinhero.zip"|"circusc.zip"|"ckong.zip"|"commando.zip"|"congo.zip"|"dazzler.zip"|"devilfsh.zip"|"digdug.zip"|"digdug2.zip"|"digger.zip"|"disco.zip"|"dkong.zip"|"dkong3.zip"|"dkongjr.zip"|"docastle.zip"|"dommy.zip"|"dorodon.zip"|"frogger.zip"|"galaga.zip"|"galaxian.zip"|"galxwars.zip"|"guzzler.zip"|"invrvnge.zip"|"invinco.zip"|"jjack.zip"|"joust2.zip"|"jrpacman.zip"|"jumpcoas.zip"|"jungler.zip"|"kchamp.zip"|"kicker.zip"|"kingball.zip"|"ladybug.zip"|"lasso.zip"|"levers.zip"|"lnc.zip"|"locomotn.zip"|"logger.zip"|"lrescue.zip"|"lupin3.zip"|"mappy.zip"|"marvins.zip"|"mikie.zip"|"mmonkey.zip"|"monsterb.zip"|"moonal2.zip"|"moonqsr.zip"|"mrdo.zip"|"mrflea.zip"|"mrjong.zip"|"mrtnt.zip"|"mspacman.zip"|"mystston.zip"|"naughtyb.zip"|"netwars.zip"|"olibochu.zip"|"ozmawars.zip"|"pacnpal.zip"|"pacplus.zip"|"pengo.zip"|"perestro.zip"|"pickin.zip"|"pignewt.zip"|"pisces.zip"|"pleiads.zip"|"pooyan.zip"|"popflame.zip"|"puckman.zip"|"pulsar.zip"|"qbert.zip"|"qbertqub.zip"|"qix.zip"|"radarscp.zip"|"retofinv.zip"|"rocnrope.zip"|"route16.zip"|"samurai.zip"|"tsamurai.zip"|"scregg.zip"|"sindbadm.zip"|"solarfox.zip"|"sonofphx.zip"|"invadpt2.zip"|"panic.zip"|"shollow.zip"|"spclaser.zip"|"sqbert.zip"|"streakng.zip"|"sbagman.zip"|"superpac.zip"|"superqix.zip"|"ssi.zip"|"swat.zip"|"tactcian.zip"|"tankbatt.zip"|"taxidrvr.zip"|"elecyoyo.zip"|"theend.zip"|"timelimt.zip"|"tomahawk.zip"|"todruaga.zip"|"tranqgun.zip"|"triplep.zip"|"tutankhm.zip"|"vanvan.zip"|"volfied.zip"|"vsgongf.zip"|"wiping.zip"|"warpwarp.zip"|"zigzag.zip"|"zzyzzyxx.zip""
Further down in my runcommand-onstart.sh file, I have the following:
case $1 in mame-libretro) case $rom in $RestrictedArcadeGamesPortraitMode) # Configuration used only for these ROMs $xboxkill joycommand="$basic $joy3restricted $joy3keys & $basic $joy4restricted $joy4keys &" eval $joycommand ;; *) # Configuration for every other ROM in respect of this emulator $xboxkill joycommand="$basic $joy3unrestricted $joy3keys & $basic $joy4unrestricted $joy4keys &" eval $joycommand ;; esac ;;
I hope this helps you.
-
Got a ti99 mapping, only problem is it seems like the emulator maps fire to EVERY button so I can't get the DPAD to map to keys as the controls don't respond unless I do --evdev-no-grab on my controller config which means the emu takes priority. Any tricks that I could do to fix that? Also after reading a tip from AtariAge i was able to get rid of the annoying cursor that displays on the emu by compiling from source if anybody wants my binary I'll be happy to share.
ti99="--ui-axismap x2=void
--ui-axismap x1=void,y1=void
--ui-buttonmap du=KEY_NUMERIC_8,dd=KEY_NUMERIC_2,dl=KEY_NUMERIC_4,dr=KEY_NUMERIC_6
--ui-buttonmap lt=void,rt=void,start+back=KEY_ESC,start=KEY_1,back=KEY_2,y=KEY_NUMERIC_0,a=KEY_SPACE,b=KEY_ENTER,x=void
--ui-buttonmap lb=void,rb=void,guide=void,tl=void,tr=void" -
I'm having a bit of trouble fully imagining the scenario you're describing. If you're just wanting to add on a key combination to quit the software on top of the controls that already exist for the physical controller, I do have a suggestion that would work for that situation.
Making use of
--evdev-no-grab
, as you already are, you can then key-map all the buttons of your controller toKEY_UNKNOWN
. At that point the controller is fully key-mapped, but the software won't register the key presses as being anything it's familiar with, leaving the physical controller free to operate without conflict. From there, you can add:--ui-buttonmap back+start=KEY_ESC
A difference from your example above is that I put 'back+start' instead of 'start+back'. It's a subtle difference in feeling, but if you're trying to bring the controls in line with RetroArch, 'select' is the modifier key and will always have to be pressed first. Mapping it the other way around in xboxdrv would required that 'start' be pressed first before the action can take place.
-
@mediamogul Good catch on the backwards start+back that was bugging me!
Yeah I didn't explain my problem well but basically the D-Pad buttons are automatically being mapped as the fire button for the TI99sim emulator. So they're basically overwriting my custom mappings for the D-Pad no matter what. If I remove the evdev-no-grab though then nothing works at all.
-
@mediamogul Hi. I'm trying to exclude a couple of games from being mapped by xboxdrv - arkanoid and tempest (and their derivatives). In my code, I've now switched the
case $1 in
tocase $2 in
and applied it tolr-mame2003
only, rather than to all mame-libretro cores. That seems to be working.Basically, I would prefer for xboxdrv not to operate at all for arkanoid and tempest as the retroarch driver and the controls (dials) I've already set up work pretty seamlessly. However, these games are also lr-mame2003 games on my system and are caught by the
*)
code.Does that mean then that if I set up a new code/statement just for arkanoid and tempest with the
--evdev-no-grab
setting and theKEY-UNKNOWN
command, I can prevent xboxdrv from operating which should "leave the physical controller free to operate without conflict" (ie the retroarch joystick driver to operate freely)?Or is there a simpler "exclude" command I could put in the script directed just to tempest/arkanoid?
(If neither is possible, worst case, I'll just change the emulator/core for these 2 games.)
Thanks.
-
Does that mean then that if I set up a new code/statement just for arkanoid and tempest with the --evdev-no-grab setting and the KEY-UNKNOWN command, I can prevent xboxdrv from operating which should "leave the physical controller free to operate without conflict" (ie the retroarch joystick driver to operate freely)?
That should work, yes.
Or is there a simpler "exclude" command I could put in the script directed just to tempest/arkanoid?
I've never done it myself, but you should be able to add those two as a case that just doesn't execute anything.
-
I've now identified 132 of the 208 4-way joystick restricted games.
I'm thinking of doing this myself. What source were you referencing for 4-way strict games?
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.