Homepage Forums RetroPie Project GPIO Adapter, ControlBlock etc. How to: Exit emulator to emulationstation using GPIO button

Viewing 5 posts - 1 through 5 (of 5 total)
  • Author
    Posts
  • #100759

    I’ve came up with a method to be able to have an external pushbutton that is used to exit an emulator back to emulationstation. The way it works is by either sending a sigterm signal to the emulator, and if that doesn’t work, to try simulating a keypress (ESC). Some emulators don’t accept keypress from python’s uinput, so sigterm must be used. Some emulators don’t accept sigterm, so uinput must be used.

    This is a python script, and uinput must be installed. You can test if uinput is properly installed by going to a command prompt and typing in
    python
    Then when you are in python idle,
    import uinput
    If it comes back with >>> , everything is working fine. If it says ImportError: No module named uinput, then it isn’t installed. On my image I downloaded from here, uinput was not installed correctly. To install uinput, try

    pip install python-uinput
    If that doesn’t work, try
    easy_install python-uinput

    RPi.GPIO must also be installed. In a command window, try
    sudo apt-get install python-dev python-rpi.gpio

    Now the script must be created. Save the following script as exit.py in /home/pi/

    from time import sleep
    import os
    import RPi.GPIO as GPIO
    import uinput
    
    key_events=( uinput.KEY_ESC, )
    device=uinput.Device(key_events)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    
    def exitEmulator(channel):
        print('exitEmulator')
        pids = [pid for pid in os.listdir('/proc') if pid.isdigit()]
    
        for pid in pids:
            try:
                commandpath = open(os.path.join('/proc', pid, 'cmdline'), 'rb').read()
                if commandpath[0:24] == '/opt/retropie/emulators/':
                    os.system('kill -TERM %s' % pid)
                    print('kill -TERM %s' % pid)
                    device.emit(uinput.KEY_ESC,1)
                    sleep(2)
                    device.emit(uinput.KEY_ESC,0)
            except IOError:
                continue
    GPIO.add_event_detect(3, GPIO.RISING, callback=exitEmulator, bouncetime=500)
    
    while True:
        sleep(10)

    Now create another file, exit.sh in /home/pi/

    #!/bin/sh
    
    cd /
    cd /home/pi
    sudo python exit.py
    cd /

    Now, cron must be edited. Enter in a command terminal,
    sudo crontab -e
    Add the following line to the end,
    @reboot sh /home/pi/exit.sh

    Some of the code above has been gathered from around the web. –this link– shows how to exit all emulators too, however if done by this method, it is a hard exit because sigkill is used. This can cause all sorts of headaches like SRM’s not being saved, high scores not being saved using mame, etc… So I modified it to use sigterm. However, mame4all doesn’t accept sigterm signals and I certainly didn’t want to use a sigkill, so then I added uinput KEY_ESC to exit out of mame4all and it works.

    The button works for me as intended. I set up a pushbutton attached to GPIO 3 on a Raspberry Pi 2 and it exits the emulator cleanly to emulationstation. Because I have it set to GPIO3, it also boots my Pi when it is shut off.

    If there are any other questions, I’ll do my best to answer them.

    #101818
    dougie1970
    Participant

    thanks for the info and can you take a pic of how to add the button to the GPIO .

    #101886

    It’s simple, just connect from GPIO3 to ground using a push button type button. Look at your rpi documentation for the correct pins. On the rpi2 b+ they are right next to each other

    #102841
    Anonymous
    Inactive

    thanks for sharing this.

    i do not understand why gpio boots up your pi…what am i missing here?

    #102843

    It’s a largely undocumented feature using GPIO3 to boot a Pi. See http://elinux.org/RPI_safe_mode#cite_note-1
    ‘Wake from halt’

Viewing 5 posts - 1 through 5 (of 5 total)
  • The forum ‘GPIO Adapter, ControlBlock etc.’ is closed to new topics and replies.