• Recent
  • Tags
  • Popular
  • Home
  • Docs
  • Register
  • Login
RetroPie forum home
  • Recent
  • Tags
  • Popular
  • Home
  • Docs
  • Register
  • Login
Please do not post a support request without first reading and following the advice in https://retropie.org.uk/forum/topic/3/read-this-first

Exiting the PCSX2 emulator with gamepad buttons combo instead of keyboard 'ESC' key

Scheduled Pinned Locked Moved Help and Support
pcsx2exit emulatorgamepad configscript
12 Posts 6 Posters 5.8k Views
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D
    Daragon
    last edited by Daragon 30 Jan 2021, 14:15

    Hello,

    does anybody has a solution to close a PCSX2 emulator in Retropie with gamepad buttons combo?

    I was searching for it for a while and unfortunatelly found out, that this requirement is not considered as important for developers. That's a pity and also funny in my opinion, but never mind...

    I'd like to do it anyway and found a solution from @ringnutz. He created a script that should do it:
    https://github.com/ringnutz/retropie-pcsx2-wrapper
    Unfortuntally it is not working for me in Ubuntu 20.04 Retropie app and I do not know if that's because of my bad or it is just not up to date solution. Does anybody has a better solution or uses this one without any problem with updated Retropie?

    I installed required python's packages with pip3 (evdev, psutil) and changed chmod premissions for those scripts. Then I used a cat /proc/bus/input/devices command to know to what number do I need to change an event file in the next part. The command's result was: "H: Handlers=event13 js0" (what is js0 file?). So I changed that file to "event13". In the same script I also changed the button numbers to 8 and 9, because I think these are numbers of SELECT and START buttons - I found this information in Retropie during input configuration.

    Anyway - this does not work. I tried also to execute the script on my own with ./gamepad_wrapper.py , but I got an error that it does not know import commands in first lines:
    from evdev import InputDevice, categorize, ecodes
    import psutil
    from subprocess import Popen

    and also syntax error in 8th line: gamepad = InputDevice('/dev/input/event13')

    I really would like to solve it. Absence of exiting the emulator with gamepad is really stupid in console in my opinion.

    Thank you.

    T 1 Reply Last reply 30 Jan 2021, 16:48 Reply Quote 0
    • T
      The Doctor @Daragon
      last edited by 30 Jan 2021, 16:48

      @daragon to exit a game in any emulator you can use your hotkey button plus start button.

      D 1 Reply Last reply 30 Jan 2021, 16:58 Reply Quote 0
      • D
        Daragon @The Doctor
        last edited by Daragon 30 Jan 2021, 16:58

        @the-doctor unfortunatelly not in PCSX2 :)

        EDIT:
        So, I figure it out on my own. There were few syntactic errors and the scripts needed to be tweak little bit, but it is working now and I finally can quit PCSX2 with gamepad button combination. Thank you @ringnutz .

        C 1 Reply Last reply 25 Feb 2021, 20:27 Reply Quote 0
        • C
          copywizard2 @Daragon
          last edited by 25 Feb 2021, 20:27

          @daragon

          hello i,am stuck at the same piece you where could you please help me with the syntactic errors you mentioned?

          from: can't read /var/mail/evdev
          ./gamepad_wrapper.py: line 2: import: command not found
          from: can't read /var/mail/subprocess
          ./gamepad_wrapper.py: line 8: syntax error near unexpected token (' ./gamepad_wrapper.py: line 8: gamepad = InputDevice('/dev/input/event15')'

          my error looks similar to yours i know the right device number is 15 and the button numbers but it won,t work any help would be appreciated

          1 Reply Last reply Reply Quote 0
          • P
            parasven
            last edited by parasven 27 Feb 2021, 09:24

            At one point i came across the same question of how to convienetly exit non retroarch emulators.

            I found this program called antimicro where you can create controller configs. So i made a profile that lets you execeute ALT + F4 when you press "Select" and "Start"

            In my runcommand-onstart.sh i have it setup like this:

            case $system in
                    "ps2")
                            ## Launch antimicro in the background with a specific profile, which allows us to exit the emulator via standart button combination select + start
                            ## Just like retroarch allows us to
                            antimicro --tray --profile /opt/retropie/configs/all/antimicro_configs/xinput-altf4.gamecontroller.amgp &
                            ;;
            esac
            

            It basically starts up the antimicro when the system is ps2 and puts it in background.

            My runcommand-onend.sh looks like this:

            ### Only kill antimicro  if it is actually running
            if [[ $(pgrep -c antimicro) > 0 ]]
            then
                    kill $(pgrep antimicro)
            fi
            ##############
            
            

            Content of my antimicro configfile:

            <?xml version="1.0" encoding="UTF-8"?>
            <gamecontroller configversion="19" appversion="2.23">
                <!--The SDL name for a joystick is included for informational purposes only.-->
                <sdlname>XInput Controller</sdlname>
                <!--The GUID for a joystick is included for informational purposes only.-->
                <guid>030000005e0400008e02000010010000</guid>
                <names/>
                <sets>
                    <set index="1">
                        <trigger index="1">
                            <throttle>positivehalf</throttle>
                        </trigger>
                        <trigger index="2">
                            <throttle>positivehalf</throttle>
                        </trigger>
                        <button index="5">
                            <setselect>2</setselect>
                            <setselectcondition>while-held</setselectcondition>
                        </button>
                    </set>
                    <set index="2">
                        <trigger index="1">
                            <throttle>positivehalf</throttle>
                        </trigger>
                        <trigger index="2">
                            <throttle>positivehalf</throttle>
                        </trigger>
                        <button index="5">
                            <setselect>1</setselect>
                            <setselectcondition>while-held</setselectcondition>
                            <slots>
                                <slot>
                                    <code>0x1000023</code>
                                    <mode>keyboard</mode>
                                </slot>
                            </slots>
                        </button>
                        <button index="7">
                            <slots>
                                <slot>
                                    <code>0x1000033</code>
                                    <mode>keyboard</mode>
                                </slot>
                            </slots>
                        </button>
                    </set>
                </sets>
            </gamecontroller>
            

            You might have to fiddle around with the profile since this is made to work with XboxDrv. This has worked quite well for me. Since im running Retropie on a x86 build i dont know if antimicro is available on rasperypie OS

            https://github.com/parasven

            C S 2 Replies Last reply 28 Feb 2021, 12:30 Reply Quote 0
            • C
              copywizard2 @parasven
              last edited by copywizard2 28 Feb 2021, 12:30

              @parasven

              Thanks alot for your super quick reply! i,am also running a x86 system i,am using retropie on ubuntu.

              I have installed antimicro and i have started it so i have the info like the guid and name of the controller and put them into the antimicro configfile.

              But it still won,t work

              what is did was re-use the old runcommand-onend and onstart scripts and input you script. Then i changed the directory in the runcommand-onstart.sh to the directory of the antimicro configfile.
              and i renamed the gamepad_wrapper.sh to gamepad_wrapper.amgp.

              any idea what is going wrong here?

              ps. when i start the script using the command in the onstart file by hand then it works! somehow it does not start with the emulator i think?

              **p.s.s. i found this in the runcommand.log so it works but there is an error

              /opt/retropie/configs/all/runcommand-onstart.sh: line 7: syntax error near unexpected token newline' /opt/retropie/configs/all/runcommand-onstart.sh: line 7: easc'

              do you know if the script you posted is complete?**

              i think easc should be esac? but then the error is gone fron runcommand.log but then it still does not work!

              P 1 Reply Last reply 28 Feb 2021, 18:38 Reply Quote 0
              • P
                parasven @copywizard2
                last edited by parasven 28 Feb 2021, 18:38

                @copywizard2
                you are correct!
                Since my runcomand script "switch case" statement includes much more entries i simply cut off and made a typo.

                easc must be esac -> "case" backwards :)

                Edit:

                In my onstart script i assign another variable:

                # get the system name
                system=$1
                

                You either have to add that to you onstart script or just use $1 in the switch case statement like so:

                case $1 in
                

                https://github.com/parasven

                1 Reply Last reply Reply Quote 0
                • C
                  copywizard2
                  last edited by 28 Feb 2021, 21:03

                  Thanks alot your amazing! it worked with the $1 replacing the $system!

                  1 Reply Last reply Reply Quote 0
                  • D
                    Daragon
                    last edited by Daragon 29 Dec 2021, 09:11

                    So sorry that I was not able to reply to you sooner, I can see that you've got another solution to do that.

                    The solution through two cycles is not the best in my opinion, but it works. I am not sure if this is universal solution (I doubt), but I made a clean RetroPie install a week ago, paste all three scripts in config folder and it works without any problem. Anyway, If somebody is still interresting what I did, I tweaked those three scripts little bit to look like this:

                    runcommand-onstart.sh:
                    I also use xdotool in RetroPie to move mouse pointer to the right bottom corner. For bigger resolution screens those numbers should be higher I suppose. If you are using xdotool, too or want to use it, simply install it and unmark that line, if not, leave it as it is (I also use it at boot in my start script when splash is playing, so my pointer is still at bottom, but for some people it is not necessary). The file is completely identical as the old one without xdotool line.

                    #!/bin/bash
                    #if ps2 was selected, then start gamepad_wrapper script to catch buttons combo to kill PCSX2 process
                    if [[ $1 = 'ps2' ]]; then
                            #xdotool mousemove 2000 2000
                    	/usr/bin/python3 /opt/retropie/configs/all/gamepad_wrapper.py &
                    fi
                    

                    gamepad_wrapper.py:
                    I had to tweak this file little bit to match my controllers and purpose. Anyway I had few problems that I had to solve:

                    -first of them was that only one of my controllers worked with this script (when gamepad object is created), now the button combo (SELECT+START) works with first controller connected, so it is little bit more universal for my purpose. This is because of cmd_output object I created.

                    -second problem was button code variables. I did not know what my codes for SELECT and START are, so I simply started ./gamepad_wrapper.py from terminal and pressed buttons, so I could see what numbers it prints (to do so, unmark print(event0.code) and if you want also print(event1.code))

                    -third problem was that if I use SELECT btn in my game and then START btn I quit the emulator. That's exactly what I want, but I do not want to do it everytime. Script waits for user button inputs at start and if correct button is pressed, it continues to next loop where it is waiting for second combo btn, if a wrong button was pressed, the combination is canceled and script waits for the first button again. As I said, it is not ideal, but it works. You can simply edit combo if you want for example to add third btn, etc. but I like it as it is.

                    I use 8bitdo SF30 pro controllers, so my wrapper looks like this:

                    #!/usr/bin/env python3
                    #imports necessary parts
                    from evdev import InputDevice, categorize, ecodes
                    import psutil
                    from subprocess import Popen
                    
                    #creates object 'gamepad' to store the data
                    import os
                    cmd_output = os.popen('cat /proc/bus/input/devices | grep Handlers=event | grep js')
                    gamepad = InputDevice("/dev/input/"+cmd_output.read()[12:19])
                    
                    #button code variables (change to suit your device)
                    button0 = 314
                    button1 = 315
                    
                    #process to look for to kill when BOTH keys were pressed
                    procName = '/usr/games/PCSX2'
                    
                    #!/usr/bin/env python3
                    #imports necessary parts
                    from evdev import InputDevice, categorize, ecodes
                    import psutil
                    from subprocess import Popen
                    
                    #creates object 'gamepad' to store the data
                    import os
                    cmd_output = os.popen('cat /proc/bus/input/devices | grep Handlers=event | grep js')
                    gamepad = InputDevice("/dev/input/"+cmd_output.read()[12:19])
                    
                    #button code variables (change to suit your device)
                    button0 = 314
                    button1 = 315
                    
                    #process to look for to kill when BOTH keys were pressed
                    procName = '/usr/games/PCSX2'
                    
                    #loop through pressed buttons in event0
                    for event0 in gamepad.read_loop():
                        if event0.type == ecodes.EV_KEY:
                            if event0.value == 1:     
                                #print(event0.code);      
                                #Button 1 pressed
                                if event0.code == button0: 
                                    #loop through pressed buttons in event1
                                    for event1 in gamepad.read_loop():  
                                        if event1.type == ecodes.EV_KEY:
                                            if event1.value == 1:        
                                                #print(event1.code);               
                                                #Button 2 pressed
                                                if event1.code == button1:
                                                    for process in psutil.process_iter():
                                                        if procName in process.cmdline():
                                                            process.terminate()
                                                            exit()
                                                            break;       
                                                #Button 2 not pressed
                                                break;
                    
                    

                    Last script runcommand-onend.sh is identical:

                    #!/bin/bash
                    #if ps2 was selected and buttons combo was pressed cleanup the Python wrapper process
                    if [[ $1 = 'ps2' ]]; then
                    	PROCS=$(ps aux | grep gamepad_wrapper.py | awk '{ print $2 }')
                    	for PROC in ${PROCS[@]}
                    	do
                    		kill "$PROC"
                    	done
                    fi
                    

                    I hope my explanation is sufficient.

                    S 1 Reply Last reply 15 Oct 2022, 21:02 Reply Quote 1
                    • S
                      sazechman @Daragon
                      last edited by 15 Oct 2022, 21:02

                      @Daragon

                      I tried your solution but cannot seem to get the script to work. I am not a python coder so I have no idea what these errors mean. Any insite would be appreciated. I took your gamepad_wrapper.py and ran it in a terminal to try to get the proper controller codes by uncommenting the print statements and received the following:

                      retropie@retropie:/opt/retropie/configs/all$ ./gamepad_wrapper.py
                      Traceback (most recent call last):
                      File "/usr/local/lib/python3.10/dist-packages/evdev/device.py", line 125, in init
                      fd = os.open(dev, os.O_RDWR | os.O_NONBLOCK)
                      FileNotFoundError: [Errno 2] No such file or directory: '/dev/input/event6 '

                      During handling of the above exception, another exception occurred:

                      Traceback (most recent call last):
                      File "/opt/retropie/configs/all/./gamepad_wrapper.py", line 10, in <module>
                      gamepad = InputDevice("/dev/input/"+cmd_output.read()[12:19])
                      File "/usr/local/lib/python3.10/dist-packages/evdev/device.py", line 127, in init
                      fd = os.open(dev, os.O_RDONLY | os.O_NONBLOCK)
                      FileNotFoundError: [Errno 2] No such file or directory: '/dev/input/event6 '

                      here is the contents of my /dev/input directory:

                      retropie@retropie:/dev/input$ ls -la
                      total 0
                      drwxr-xr-x 4 root root 460 Oct 14 10:02 .
                      drwxr-xr-x 20 root root 4380 Oct 14 10:02 ..
                      drwxr-xr-x 2 root root 160 Oct 14 10:02 by-id
                      drwxr-xr-x 2 root root 200 Oct 14 10:02 by-path
                      crw-rw---- 1 root input 13, 64 Oct 13 18:25 event0
                      crw-rw---- 1 root input 13, 65 Oct 13 18:25 event1
                      crw-rw---- 1 root input 13, 74 Oct 13 18:25 event10
                      crw-rw---- 1 root input 13, 75 Oct 13 18:25 event11
                      crw-rw---- 1 root input 13, 76 Oct 13 18:25 event12
                      crw-rw---- 1 root input 13, 77 Oct 13 18:25 event13
                      crw-rw---- 1 root input 13, 78 Oct 13 18:25 event14
                      crw-rw---- 1 root input 13, 66 Oct 14 01:34 event2
                      crw-rw----+ 1 root input 13, 67 Oct 14 10:02 event3
                      crw-rw---- 1 root input 13, 68 Oct 14 01:34 event4
                      crw-rw---- 1 root input 13, 69 Oct 14 01:34 event5
                      crw-rw----+ 1 root input 13, 70 Oct 13 18:25 event6
                      crw-rw---- 1 root input 13, 71 Oct 14 01:34 event7
                      crw-rw---- 1 root input 13, 72 Oct 13 18:25 event8
                      crw-rw---- 1 root input 13, 73 Oct 13 18:25 event9
                      crw-rw----+ 1 root input 13, 0 Oct 13 18:25 js0
                      crw-rw----+ 1 root input 13, 1 Oct 14 10:02 js1
                      crw-rw---- 1 root input 13, 63 Oct 13 18:25 mice
                      crw-rw---- 1 root input 13, 32 Oct 14 01:34 mouse0

                      what else should I post.

                      thanks for any help you can give.
                      Scott

                      1 Reply Last reply Reply Quote 0
                      • S
                        sazechman @parasven
                        last edited by 15 Oct 2022, 23:16

                        @parasven

                        I have tried your solution but am having trouble with the antimicro progam itself. It launches just fine and the scripts onstart and onend work. I am having problems configuring antimicro. I have read the wiki for it and have tried to no avail. There does not seem to be a forum for help for the antimacro program itself. Any suggustions would be appreciated.

                        1 Reply Last reply Reply Quote 0
                        • H
                          HopRanger
                          last edited by 5 Jan 2023, 16:13

                          I found this can be done with the -nogui parameter using the nightly build of pcsx2. Not sure if this applies to the version Retropie uses. I had a hard time finding this solution when searching the web.

                          In pcsx2 I set a hotkey for Shut Down Virtual Machine. With the -nogui parameter pcsx2 will exit when you press the shutdown hotkey.

                          See also:
                          https://wiki.pcsx2.net/Command-line_support

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          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.

                            This community forum collects and processes your personal information.
                            consent.not_received