Guide: Advanced Controller Mappings
-
Not all controllers have a unique event name. I believe you said you were wanting to map your PS4 controller and it appears to be listed above under the name "Sony Interactive Entertainment Wireless Controller". It's event handler is "event0", so you'll need to use "event0" to move on to the next steps.
-
@mediamogul Ok ... I figured out that it was the
--mimic -xpad \
that was preventing the controller from being renamed. Do I need that line ?I know have ...
I: Bus=0000 Vendor=0000 Product=0000 Version=0000 N: Name="donotroller" P: Phys= S: Sysfs=/devices/virtual/input/input2 U: Uniq= H: Handlers=js1 event2 B: PROP=0 B: EV=20000b B: KEY=7cdb0000 0 0 0 0 0 0 0 0 0 B: ABS=3061b B: FF=1 3f870000 0 0
-
Do I need that line ?
You do not. If it's there, it will mimic the naming scheme and button arrangement of an authentic XBox3600 controller. Without it, you're free to create a virtual controller to your own specs.
-
@spud11 Hey Spud, would you mind sharing your list of 4-way games? Or tell me how you were able to figure them out? Was going to add them all to my script :)
-
@mediamogul OMG - Its working - a little chunky (slow) for command and conquer ... but i think that means I just need to adjust my dosbox config. Any suggestions would be appreciated.
One note ... I am adding the code to my fame config files ... I am not sure if this is the most elegant way of handling this ... what do you think .. here is an example.
#!/bin/bash sudo killall >/dev/null xboxdrv sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv \ --evdev /dev/input/event0 \ --silent \ --detach-kernel-driver \ --force-feedback \ --deadzone-trigger 15% \ --deadzone 4000 \ --device-name "donotroller" \ --calibration x1=-32767:0:32767,y1=-32767:0:32767,x2=-32767:0:32767,y2=-32767:0:32767 \ --trigger-as-button \ --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_Z=x2,ABS_RZ=y2,ABS_RX=lt,ABS_RY=rt,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \ --evdev-keymap BTN_EAST=a,BTN_C=b,BTN_SOUTH=x,BTN_NORTH=y,BTN_WEST=lb,BTN_Z=rb,BTN_START=tl,BTN_SELECT=tr,BTN_THUMBL=guide,BTN_TL2=back,BTN_TR2=start \ --axismap -Y1=Y1,-Y2=Y2 \ --ui-axismap x1=REL_X:10,y1=REL_Y:10 \ --ui-buttonmap b=BTN_LEFT,a=BTN_RIGHT,start=KEY_F5 \ --ui-buttonmap guide=void,x=void,y=void,lb=void,rb=void,tl=void,tr=void,lt=void,rt=void,back=void \ --ui-axismap x2=void \ -- \ /opt/retropie/emulators/dosbox/bin/dosbox -conf "/home/pi/RetroPie/roms/pc/CC_conf.conf"
-
@Hubz Certainly. I got the list from the website below:
http://www.armchairarcade.com/neo/node/486001 . Ali Baba and 40 Thieves 002 . Alpha Fighter / Head On 003 . Amidar 004 . Anteater 005 . Arm Wrestling 006 . Armored Car 007 . Astro Blaster 008 . Astro Fighter 009 . Astro Invader 010 . Bagman 011 . Balloon Bomber 012 . Barrier 013 . Black Hole 014 . Blasto 015 . Blockade 016 . Burger Time 017 . Car Jamboree 018 . Carnival 019 . Cavelon 020 . Chameleon 021 . Checkman 022 . Chinese Hero 023 . Circus Charlie 024 . Commando 025 . Comotion 026 . Congo Bongo 027 . Cops'n Robbers 028 . Cosmic Guerilla 029 . Cosmos1981 030 . Crash 031 . Crazy Kong (set 1) 032 . Crush Roller 033 . Dazzler 034 . Defend the Terra Attack on the Red UFO (bootleg) 035 . Devil Fish 036 . Diamond Run 037 . Dig Dug 038 . Dig Dug II 039 . Digger 040 . Disco No.1 041 . Do! Run Run (set 1) 042 . Dominos 043 . Dommy 044 . Donkey Kong 045 . Donkey Kong 3 046 . Donkey Kong Junior 047 . Dorodon (set 1) 048 . Dr. Micro 049 . Dragon Buster 050 . Dream Shopper 051 . Elevator Action 052 . Eyes 053 . Faster, Harder, More Challenging Q*bert (prototype) 054 . Fire Trap (US) 055 . Forty-Love 056 . Frogger 057 . Galaga 058 . Galaxian 059 . Galaxy Wars 060 . Gals Panic 061 . Gun Dealer (set 1) 062 . Guzzler 063 . Hard Hat 064 . Head On (2 players) 065 . Head On 2 066 . Heiankyo Alien 067 . Hexa 068 . Hustle 069 . Intrepid 070 . Invader's Revenge 071 . Invinco / Head On 2 072 . Iron Horse 073 . Joust 2 - Survival of the Fittest 074 . Jr. Pac-Man 075 . Jump Coaster 076 . Jumping Jack 077 . Jungler 078 . Karate Champ (US) 079 . Karian Cross (Rev. 1.0) 080 . Kicker 081 . King & Balloon 082 . Kung-Fu Master 083 . Lady Bug 084 . Las Vegas Girl (Girl '94) 085 . Lasso 086 . Levers 087 . Lock'n'Chase 088 . Loco-Motion 089 . Logger 090 . Logic Pro (Japan) 091 . Logic Pro 2 (Japan) 092 . Lunar Rescue 093 . Lupin III 094 . Mahjong Satsujin Jiken (Japan 881017) 095 . Mappy 096 . Marvin's Maze 097 . Meikyu Jima (Japan) 098 . Mikie 099 . Minesweeper 100 . Minky Monkey 101 . Monster Bash 102 . Moon Alien Part 2 103 . Moon Quasar 104 . Mouse Trap (version 5) 105 . Mr. Do! 106 . Mr. Do's Castle 107 . Mr. Do's Wild Ride 108 . Mr. F. Lea 109 . Mr. Goemon (Japan) 110 . Mr. Jong 111 . Mr. TNT 112 . Ms. Pac-Man 113 . Mysterious Stones 114 . NATO Defense 115 . Naughty Boy 116 . Net Wars 117 . New Rally X 118 . Oli-Boo-Chu 119 . Ozma Wars 120 . Pac & Pal 121 . Pac-Man 122 . Pac-Man Plus 123 . Pairs (System Ten) (Japan 890826) 124 . Pengo 125 . Pepper II 126 . Perestroika Girls 127 . Pettan Pyuu (Japan) 128 . Pickin' 129 . Pig Newton (version C) 130 . Pirate Ship HigeMaru 131 . Pisces 132 . Pleiads 133 . Pooyan 134 . Pop Flamer 135 . Popeye (revision D) 136 . Pulsar 137 . Punch-Out!! 138 . Q*bert 139 . Q*bert's Qubes 140 . Qix 141 . Radar Scope 142 . Raiders5 143 . Rally X 144 . Rampage (revision 3) 145 . Reikai Doushi (Japan) 146 . Return of the Invaders 147 . Robby Roto 148 . Roc'n Rope 149 . Rolling Thunder (new version) 150 . Route 16 151 . Route 16 152 . Samurai 153 . Samurai Nihon-ichi 154 . Satan's Hollow 155 . Scrambled Egg 156 . Side Track 157 . Sindbad Mystery 158 . Solar Fox 159 . Son of Phoenix 160 . Space Chaser 161 . Space Invaders 162 . Space Invaders Part II 163 . Space Laser 164 . Space Panic 165 . Space Zap 166 . Spectar (revision 3) 167 . Springer 168 . Stratovox 169 . Streaking 170 . Super Bagman 171 . Super Invader Attack 172 . Super Pac-Man 173 . Super Punch-Out!! 174 . Super Qix 175 . Super Space Invaders '91 176 . SWAT 177 . Tactician (set 1) 178 . Tank Battalion 179 . Tapper (Budweiser) 180 . Targ 181 . Taxi Driver 182 . Telephone Mahjong (Japan 890111) 183 . The Amazing Adventures of Mr. F. Lea 184 . The Electric Yo-Yo 185 . The Electric Yo-Yo (set 1) 186 . The End 187 . The Glob 188 . Thief 189 . Timber 190 . Time Limit 191 . Tomahawk 777 192 . Tower of Druaga 193 . Toypop 194 . Tranquilizer Gun 195 . Triple Punch 196 . Tutankham 197 . Van Van Car 198 . Volfied (World) 199 . VS Gong Fight 200 . Wai Wai Jockey Gate-In! 201 . Warp & Warp 202 . Wiping 203 . Wonder Momo 204 . Yam! Yam!? 205 . Zero Zone 206 . Zig Zag (Galaxian hardware, set 1) 207 . Zoo Keeper (set 1) 208 . Zzyzzyxx
If you manage to create the right code to get them going, please let me know. I'll be working on it myself fairly shortly using the $3 scenario.
-
@spud11 ... That Commando might be the Sega commando, not the Capcom one. Unless memory is playing tricks on me, I'd have a hard time playing the Capcom one with 4 directions only. I never played the Sega one, so that's why I'm guessing it's that one. I may be wrong though.
Also unsure of whether Rolling Thunder wouldn't allow you to turn while crouching, which would suggest that there'd be use in 8-way controls.
Still, great list, will certainly keep it for reference!
-
@mediamogul That made me laugh. By the way, I have got it working up to a point using the @madhorse technique.
The code is below, and a couple of interesting pointers for anyone else who finds themselves stuck and is not sure why:
(a) the issue you alluded to with the --device-name problem definitely is a problem. It really doesn't seem to like any "white space" or "brackets" in the name. Adding underscores instead seems to work;
(b) the start of each line shouldn't start with a number. For example, I've got "amiga1" for the name of my first Amiga joystick. If I had that as "1amiga", it would spit out errors. I think that's why my previous code wasn't working - because I had names like "8way" and "4way" for my joysticks. Starting a line with a number is verboten;
(c) although I had set up a separate folder on the pi for my cocktail (arcade vertical) games, I needed to point to mame-libretro to get it working as I'm using lr-mame2003;
(d) it's possible to get 2 (or more) joysticks working at the same time by using & but you have to remember to refer back to the "basic" joystick configuration each time.
#!/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 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 scummVM="--axismap -Y1=Y1,-Y2=Y2 \ --ui-axismap x1=REL_X:10,y1=REL_Y:10 \ --ui-buttonmap a=BTN_LEFT,b=BTN_RIGHT,start=KEY_F5,back=KEY_ESC \ --ui-buttonmap guide=void,x=void,y=void,lb=void,rb=void,tl=void,tr=void,lt=void,rt=void,back=void \ --ui-axismap x2=void" 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" 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" 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" 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" 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" 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" 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" 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" 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" fourway="--four-way-restrictor" invert="--ui-buttonmap du=KEY_DOWN,dd=KEY_UP" ### 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 mame-libretro) case $rom in "amidar.zip"|"atetris.zip"|"puckman.zip") # Configuration used only for these ROMs $xboxkill joycommand="$basic $joy3restricted & $basic $joy4restricted &" eval $joycommand ;; *) # Configuration for every other ROMs on this emulator $xboxkill joycommand="$basic $joy3unrestricted & $basic $joy4unrestricted &" eval $joycommand ;; esac ;; daphne) ;; scummvm) $xboxkill joycommand="$basic $scummVM &" eval $joycommand ;; amiga) $xboxkill joycommand="$basic $amiga1 & $basic $amiga2 &" eval $joycommand ;; intellivision) ;; esac
So where I'm up to with this is that the Amiga joysticks work.
But the same can't be said for the "cocktail" games. When I start Amidar for example, the little yellow writing at the bottom comes up and it informs me that the 4 DragonRise joysticks are set up and also starts joy3restricted and joy4restricted, but that they are unconfigured. The result of that is that I can't press any joystick buttons at all once the rom has begun (although the keyboard still works). Using TAB to get to Mame's internal menu doesn't help as I can't change the buttons. Exiting out of the rom with the keyboard triggers the runcommand-onend.sh file killing xboxdrv and everything then works as per normal using the xpad driver. (If I start Amidar without loading xboxdrv, then everything works but of course I'm using an 8-way unrestricted joystick.)
To troubleshoot, as I'm using lr-mame2003, using putty I have first started xboxdrv for those 2 joysticks (joy3restricted and joy4restricted), then fired up retroarch and configured those joysticks as users 5 and 6, saving the configurations to retroarch.cfg.
I then go back, start Amidar again, and note that joy3restricted and joy4restricted have started, but once again - no buttons work and using the mame TAB interface again doesn't do anything.
Not sure where to go from here. Any help would be great please.
-
@pjft I definitely can't take credit for the list, but I imagine you'll be right - that some of the games aren't really 4 way. I have the same recollection as you about Commando. I'm sure it's 8 way.
It's going to be trial and error, I feel, for a lot of these games, particularly as there's going to be a need to match the game names to the actual rom names. Haven't figured out yet an automatic method of doing this to save time. May have to do it manually.....
-
@spud11 Thanks a ton for the list! BTW I ran into that same error too with the devicename not working when having spaces in it. Glad to know I wasn't crazy and it happened to others as it took me forever to troubleshoot.
-
@Hubz No problems. It was mediamogul who picked it up.
-
Glad to see things working out here. I'll add the information about
--device-name
to the guide . -
@mediamogul That's a good idea.
I'm still having a bit of trouble as per 3 posts ago. Hoping you might still be able to help, if possible, please.
-
Have those particular virtual controllers been mapped through Emulation Station like any other controller? If not, it could be that there's no automatic configuration for them at
/opt/retropie/configs/all/retroarch/autoconfig
for RetroArch to draw on. -
@mediamogul Hi. Yes, they are in fact both mapped:
Player_3_-_4-Way_Joystick_xboxdrv.cfg
input_driver = "udev" input_device = "Player_3_-_4-Way_Joystick_xboxdrv" input_b_btn = "1" input_y_btn = "3" input_select_btn = "8" input_start_btn = "9" input_up_axis = "+0" input_down_axis = "-0" input_left_axis = "+1" input_right_axis = "-1" input_a_btn = "0" input_x_btn = "2"
Player_4_-_4-Way_Joystick_xboxdrv.cfg
input_driver = "udev" input_device = "Player_4_-_4-Way_Joystick_xboxdrv" input_b_btn = "1" input_y_btn = "3" input_select_btn = "8" input_start_btn = "9" input_up_axis = "+0" input_down_axis = "-0" input_left_axis = "+1" input_right_axis = "-1" input_a_btn = "0" input_x_btn = "2"
And thinking about it, I'll need to map the corresponding 8 way configs to Users 7 and 8 in Retroarch too, given that all other roms will rely on those 8 way configs. Personally, I'd just prefer for the xpad (rather than xboxdrv) driver to work for normal 8 way mame-libretro joystick games, but when I added the hash to the below, xboxdrv wouldn't load at all:
;; *) # Configuration for every other ROMs on this emulator $xboxkill # joycommand="$basic $joy3unrestricted & $basic $joy4unrestricted &" # eval $joycommand ;;
I've also tried to edit, without success, the individual amidar.zip.cfg file which is as follows by adding the extra line at the top:
# Settings made here will only override settings in the global retroarch.cfg if placed above the #include line input_player3_joypad_index = 5 video_allow_rotate = "true" video_rotation = "3" aspect_ratio_index = "19" video_aspect_ratio_auto = "false" video_aspect_ratio = "1.75" #include "/opt/retropie/configs/all/retroarch.cfg"
-
You may just want to map those final two controllers for keyboard input. I have most of my controllers mapped like that anyway. RetroArch will still respect all the controller button mappings, but have a separate set for keyboard keys as well. An example of one and two player keyboard controls from my own
retroarch.cfg
is:input_player1_a = "a" input_player1_b = "b" input_player1_y = "y" input_player1_x = "x" input_player1_start = "t" input_player1_select = "e" input_player1_l = "l" input_player1_r = "r" input_player1_left = "left" input_player1_right = "right" input_player1_up = "up" input_player1_down = "down" input_player1_l2 = "d" input_player1_r2 = "f" input_player1_l3 = "c" input_player1_r3 = "v" input_player2_a = "k" input_player2_b = "m" input_player2_y = "o" input_player2_x = "n" input_player2_start = "num9" input_player2_select = "num0" input_player2_l = "p" input_player2_r = "q" input_player2_left = "g" input_player2_right = "h" input_player2_up = "i" input_player2_down = "j" input_player2_l2 = "s" input_player2_r2 = "u" input_player2_l3 = "w" input_player2_r3 = "z"
-
So far I am mainly using this for dosbox to capture the mouse. Are there reason to use this as the main controller rather than the xpad default mapping ?
The systems I am suing are :
DosBOX
Vice (C64)
Amiberry (amiga)
Daphne (Dragon's Lair)
Mame 2003I am currently initiating the xboxdrv in the .sh of each game for DosBOX.
Thanks
-
@mediamogul Hi. I had my input references slightly wrong (
input_player1_joypad_index = 4
). I'm assuming the 4 corresponds to User 5's input in Retroarch (which in my case is now mapped to Player_3_-4-Way_Joystick_xboxdrv) and 5 corresponds to User 6's input in Retroarch (mapped to Player_4-_4-Way_Joystick_xboxdrv). So I have amended the input indexes below to reflect that.Adapting your code, to change the settings for Amidar only at the moment, I would just change amidar.zip.cfg as follows:
# Settings made here will only override settings in the global retroarch.cfg if placed above the #include line input_player1_joypad_index = 4 input_player1_a = "a" input_player1_b = "b" input_player1_y = "y" input_player1_x = "x" input_player1_start = "t" input_player1_select = "e" input_player1_left = "left" input_player1_right = "right" input_player1_up = "up" input_player1_down = "down" input_player2_joypad_index = 5 input_player2_a = "k" input_player2_b = "m" input_player2_y = "o" input_player2_x = "n" input_player2_start = "num9" input_player2_select = "num0" input_player2_left = "g" input_player2_right = "h" input_player2_up = "i" input_player2_down = "j" video_allow_rotate = "true" video_rotation = "3" aspect_ratio_index = "19" video_aspect_ratio_auto = "false" video_aspect_ratio = "1.75" #include "/opt/retropie/configs/all/retroarch.cfg"
After that, I would just remap the buttons in game with the TAB menu?
Thanks.
-
@spud11 said in Guide: Advanced Controller Mappings:
After that, I would just remap the buttons in game with the TAB menu?
After that, RetroArch just assumes the keyboard presses are coming from it's own "Retropad" controller as the proper button presses, so it'll work without any further remapping.
-
@mediamogul Thanks, mediamogul. Will try later in the day and let you know how I go.
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.