Recalbox Forum

    • Register
    • Login
    • Search
    • Recent
    • Tags
    • recalbox.com
    • Gitlab repository
    • Documentation
    • Discord

    Emulator Exit button GPIO

    GamePad/GPIO/USB encoder
    button gpio stop emulator
    4
    22
    13309
    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.
    • supernature2k
      supernature2k last edited by

      Sleep 10?

      Pi powered NES | Gameboy HD | RecalStation | RecalDrive
      Upvote messages if it has been useful ;)

      1 Reply Last reply Reply Quote 0
      • crispycritter911
        crispycritter911 last edited by

        Yeah, I've copied and pasted it from a Reddit thread. Here is where I got it from.
        https://www.reddit.com/r/raspberry_pi/comments/2yw4fn/finally_set_up_retropie_complete_with_a_gpio/

        I really like the look and feel of RecalBox and wanted to use it in my other pi but had a few hiccups a long the way. One of them being this emulator exit button that I cannot get working on RecalBox. I think the other was the SNES GPIO adapter which I have kind of figured out.

        1 Reply Last reply Reply Quote 0
        • Substring
          Substring last edited by

          The script is not that hard to adapt :

          • list binaries that one wants to shutdown. So far, there is moonlight, retroarch, fba2x, kodilauncher.sh, mupen64plus, scummvm
          • instead of getting cmdline, get exe (it's a symbolic link)
          • check that exe is among the listed binaries. If so, kill the pid

          One could make that script way more dirty : just throw a kill of all known processes, anyway only one of them is supposed to run at once

          The next recalbox version will add those binaries : dosbox, PPSSPPSDL, reicast.elf, linapple, x64

          What's your knowledge of python ?

          Former dev - Please reply with @substring so that i am notified when you answer me
          Ex dev - Merci de me répondre en utilisant @substring pour que je sois notifé

          1 Reply Last reply Reply Quote 0
          • crispycritter911
            crispycritter911 last edited by

            My knowledge of Python is pretty much nil. I haven't had any real coding background whatsoever. I've tinkered and modified some stuff ini files for the original xbox to help automate flashing bios and setting up hard drives the way I like it. But that's really it. I usually take other peoples code and modify it to suit my needs. I would like to go back to college someday to learn about coding. Thanks for the input.

            1 Reply Last reply Reply Quote 0
            • Substring
              Substring last edited by Substring

              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

              Former dev - Please reply with @substring so that i am notified when you answer me
              Ex dev - Merci de me répondre en utilisant @substring pour que je sois notifé

              1 Reply Last reply Reply Quote 0
              • crispycritter911
                crispycritter911 last edited by

                Thanks, I'll try it in a bit.

                1 Reply Last reply Reply Quote 0
                • supernature2k
                  supernature2k last edited by supernature2k

                  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)
                  

                  Pi powered NES | Gameboy HD | RecalStation | RecalDrive
                  Upvote messages if it has been useful ;)

                  1 Reply Last reply Reply Quote 0
                  • supernature2k
                    supernature2k last edited by

                    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

                    Pi powered NES | Gameboy HD | RecalStation | RecalDrive
                    Upvote messages if it has been useful ;)

                    1 Reply Last reply Reply Quote 0
                    • Substring
                      Substring last edited by Substring

                      haha i'm the man 😄

                      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

                      Former dev - Please reply with @substring so that i am notified when you answer me
                      Ex dev - Merci de me répondre en utilisant @substring pour que je sois notifé

                      1 Reply Last reply Reply Quote 0
                      • supernature2k
                        supernature2k last edited by

                        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)
                        

                        Pi powered NES | Gameboy HD | RecalStation | RecalDrive
                        Upvote messages if it has been useful ;)

                        OyyoDams 1 Reply Last reply Reply Quote 1
                        • OyyoDams
                          OyyoDams Staff @supernature2k last edited by OyyoDams

                          @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 ? 🙂

                          Substring 1 Reply Last reply Reply Quote 0
                          • Substring
                            Substring @OyyoDams last edited by

                            @oyyodams it's RESET, not exit 😉

                            Former dev - Please reply with @substring so that i am notified when you answer me
                            Ex dev - Merci de me répondre en utilisant @substring pour que je sois notifé

                            OyyoDams 1 Reply Last reply Reply Quote 0
                            • OyyoDams
                              OyyoDams Staff @Substring last edited by

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

                              Substring 1 Reply Last reply Reply Quote 0
                              • Substring
                                Substring @OyyoDams last edited by

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

                                Former dev - Please reply with @substring so that i am notified when you answer me
                                Ex dev - Merci de me répondre en utilisant @substring pour que je sois notifé

                                OyyoDams 1 Reply Last reply Reply Quote 0
                                • OyyoDams
                                  OyyoDams Staff @Substring last edited by

                                  @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;)

                                  Substring 1 Reply Last reply Reply Quote 0
                                  • Substring
                                    Substring @OyyoDams last edited by

                                    @oyyodams hold the door !!!

                                    Former dev - Please reply with @substring so that i am notified when you answer me
                                    Ex dev - Merci de me répondre en utilisant @substring pour que je sois notifé

                                    OyyoDams 1 Reply Last reply Reply Quote 1
                                    • OyyoDams
                                      OyyoDams Staff @Substring last edited by

                                      @substring Hodor

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

                                      1 Reply Last reply Reply Quote 0
                                      • OyyoDams
                                        OyyoDams Staff last edited by

                                        Ok solution:

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

                                        supernature2k 1 Reply Last reply Reply Quote 0
                                        • supernature2k
                                          supernature2k @OyyoDams last edited by

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

                                          Pi powered NES | Gameboy HD | RecalStation | RecalDrive
                                          Upvote messages if it has been useful ;)

                                          OyyoDams 1 Reply Last reply Reply Quote 0
                                          • OyyoDams
                                            OyyoDams Staff @supernature2k last edited by

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

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

                                            Want to support us ?

                                            83
                                            Online

                                            99.6k
                                            Users

                                            28.1k
                                            Topics

                                            187.1k
                                            Posts

                                            Copyright © 2021 recalbox.com