Emulator Exit button GPIO



  • very lazy, didn't even try it :

    import os
    import RPi.GPIO as GPIO
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    
    def exitEmulator(channel):
        print('exitEmulator')
        os.system('killall retroarch')
        
    GPIO.add_event_detect(17, GPIO.RISING, callback=exitEmulator, bouncetime=500)
    
    while True:
        sleep(10)
    

    that can work, only for retroarch for now

    you should start this file from a custom.sh located at /recalbox/share/system (you need to create it). Create it yourself add python yourfile.py inside, chmod u+x custom.sh and reboot



  • Thanks, I'll try it in a bit.


  • Moderator
    Team
    Creator
    Moderator

    I think import time is needed for the sleep function.
    Also, I would do it the other way for button press: GPIO.PUD_UP and GPIO.FALLING

    the code:

    import os
    import RPi.GPIO as GPIO
    import time
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    
    def exitEmulator(channel):
        print('exitEmulator')
        os.system('killall retroarch')
        
    GPIO.add_event_detect(17, GPIO.FALLING, callback=exitEmulator, bouncetime=500)
    
    while True:
        sleep(10)
    

  • Moderator
    Team
    Creator
    Moderator

    Ok Guys, I made some test.

    I put a cable on Pin5 and pin6 and run the following code:

    import os
    import RPi.GPIO as GPIO
    import time
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    
    def exitEmulator(channel):
        print("exitEmulator")
        os.system("killall retroarch")
        
    GPIO.add_event_detect(3, GPIO.FALLING, callback=exitEmulator, bouncetime=500)
    
    while True:
        time.sleep(10)
    

    And... it's working :)

    Of course in this current state, it's only working with retroarch emulators



  • haha i'm the man :D

    Seriously, most of emulators are listed in the recalboxFiles.py. Would need to improve it because all bins are not listed there. But I really like this idea : kill the running emulator, or even reset the game (there is a topic on it somewhere, will gid this and update my post) -> https://forum.recalbox.com/topic/3435/game-reset/6


  • Moderator
    Team
    Creator
    Moderator

    solution via python with network commands:

    import os
    import RPi.GPIO as GPIO
    import time
    import socket
    import sys
    # addressing information of target
    IPADDR = "127.0.0.1"
    PORTNUM = 55355
     
    # enter the data content of the UDP packet
    PACKETDATA = "RESET"
     
    # initialize a socket, think of it as a cable
    # SOCK_DGRAM specifies that this is UDP
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    except socket.error:
        print 'Failed to create socket'
        sys.exit()
    #s.connect((IPADDR, PORTNUM))
     
    # connect the socket, think of it as connecting the cable to the address location
    
    data = bytes(PACKETDATA)
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    
    def exitEmulator(channel):
    	print("exitEmulator")
    	print(IPADDR)
    	print(PORTNUM)
    	print(PACKETDATA)
    	s.sendto(PACKETDATA, (IPADDR, PORTNUM))
        
    GPIO.add_event_detect(3, GPIO.FALLING, callback=exitEmulator, bouncetime=500)
    
    while True:
        time.sleep(10)
    

  • Moderator
    Moderator
    Team

    @supernature2k Hi,

    I'm replying to this old topic because I'm currently working on a project that needs such a feature. I tried your last script, I just removed GPIO code at for now to test, so here is my code:

    import os
    import time
    import socket
    import sys
    # addressing information of target
    IPADDR = "127.0.0.1"
    PORTNUM = 55355
    
    # enter the data content of the UDP packet
    PACKETDATA = "RESET"
    
    # initialize a socket, think of it as a cable
    # SOCK_DGRAM specifies that this is UDP
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    except socket.error:
        print 'Failed to create socket'
        sys.exit()
    #s.connect((IPADDR, PORTNUM))
    
    # connect the socket, think of it as connecting the cable to the address location
    
    data = bytes(PACKETDATA)
    
    print("exitEmulator")
    print(IPADDR)
    print(PORTNUM)
    print(PACKETDATA)
    s.sendto(PACKETDATA, (IPADDR, PORTNUM))
    

    So to try it, I start a retroarch game then I launch the script:

    # python rpi-exit-emulator.py 
    exitEmulator
    127.0.0.1
    55355
    RESET
    

    But in fact it does nothing, I'm still in the game (with no reset). Any idea ? :)



  • @oyyodams it's RESET, not exit ;)


  • Moderator
    Moderator
    Team

    @substring yes that's it's supposed to do... but no reset by the way...



  • @oyyodams check on command line if you can connect to the port ;) some netcat commands should do it


  • Moderator
    Moderator
    Team

    @substring Well I found a great doc on the wiki. But...

    • I can't use netcast: nc is not include in this buildroot build (and I can't rebuild by now)
    • It seems retroarch doesn't respond to any command. I tried to edit retroarch.cfg to add network_cmd_enable = "true", nothing better (even after reboot)

    I will not let go;)



  • @oyyodams hold the door !!!


  • Moderator
    Moderator
    Team

    @substring Hodor

    Don't worry I keep up the good work, things begin to be better, news soon ;)


  • Moderator
    Moderator
    Team

    Ok solution:

    network_cmd_enable = "true" has to be added in /recalbox/share/system/configs/retroarch/retroarchcustom.cfg


  • Moderator
    Team
    Creator
    Moderator

    @oyyodams sorry I'm late...
    Does it work now?


  • Moderator
    Moderator
    Team

    @supernature2k yes, see my post above ;) Thanks a lot for your scripts!


Log in to reply
 

Want to support us ?

Join us on :

276
Online

42841
Users

17179
Topics

129192
Posts

Looks like your connection to Recalbox Forum was lost, please wait while we try to reconnect.