Recalbox Forum

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

    Power Script PIN356ONOFFRESET avec switches SNES d'origine

    Recalbox Général
    pin356onoffrese on off button snes originale
    8
    80
    15014
    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.
    • epsilonzero
      epsilonzero @FF-Sounds last edited by

      @ff-sounds Effectivement tu n'es pas le seul dans ce cas la ^^
      Je bosse sur le même projet que toi, sauf que je n'ai pas encore testé le script des boutons ON/OFF et RESET et je suis comme toi preneur d'une solution pour composer avec le switch bistable ON/OFF et le momentané RESET 😉

      1 Reply Last reply Reply Quote 0
      • supernature2k
        supernature2k @FF-Sounds last edited by supernature2k

        @ff-sounds can you please test dat s**t: (tu remplaces le fichier rpi-pin356-power.py et dans recalbox.conf tu choisi system.power.switch=PIN356ONOFFRESET)

        import RPi.GPIO as GPIO
        import time
        import os
        import thread
        import datetime
        import socket
        import sys
        import argpa**e
        from datetime import datetime
        from configgen import recalboxFiles
        # this last one retrieves emulators bin names
        
        pa**er = argpa**e.ArgumentPa**er(description='power manager')
        pa**er.add_argument("-m", help="mode onoff or push", type=str, required=True)
        args = pa**er.pa**e_args()
        
        mode = args.m
        
        IPADDR = "127.0.0.1"
        PORTNUM = 55355
        # IP and port for retroarch network commands
        
        POWERPLUS = 3
        RESETPLUS = 2
        LED = 14
        
        GPIO.setwarnings(False)		# no warnings
        GPIO.setmode(GPIO.BCM)		# set up BCM GPIO numbering 
         
        GPIO.setup(RESETPLUS, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        # GPIO on pin 3 is the GPIO 2 in BCM mode
        #to Reset+
        
        GPIO.setup(POWERPLUS, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        # GPIO on pin 5 is the GPIO 3 in BCM mode
        #to Power+
        
        GPIO.setup(LED, GPIO.OUT)
        GPIO.output(LED, True)
        # GPIO on pin 8 is the GPIO 14 in BCM mode
        #to LED+
        
          
        # Define a threaded callback function to run in another thread when events are detected  
        def button_pressed(channel):
        	if channel == POWERPLUS:
        		speed=0.15
        		shutdownstring="shutdown -h now"
        		nwcommand="QUIT"
        		
        	elif channel == RESETPLUS:
        		speed=0.05
        		shutdownstring="shutdown -r now"
        		nwcommand="RESET"
        		
        	timer = 0
        	flag = True
        	while flag:
        		if GPIO.input(channel) == False:
        			timer += 1
        			print "Button pressed"
        		elif GPIO.input(channel) == True:
        		
        			print "Button released"
        			print timer
        		
        			#timer adds 1 each 0.1 seconds if timer = 10, button is pressed for 1s
        			if (timer > 10):
        				offreset(speed, shutdownstring)
        				print "shutdown"
        			elif (timer >1):
        				retroarch(nwcommand)
        				print "retroarch"
        				killthats**t(channel)
        				
        			timer = 0
        			flag = False
        		time.sleep(0.1)
        	
        def button_changed(channel):
        	if channel == POWERPLUS:
        		speed=0.15
        		shutdownstring="shutdown -h now"
        	
        	offreset(speed, shutdownstring)
        	
        #	on power short press, trying to kill all listed emus 
        def killthats**t(channel):
        	if channel == POWERPLUS:
        		for bin in recalboxFiles.recalboxBins:
        				print bin
        				proc = os.path.basename(bin)
        				print proc
        				os.system("killall -9 "+proc)
        
        # 	on long button press clean stop	of ES then shutdown -h or -r		
        def offreset(speed, shutdownstring):
        	thread.start_new_thread( blink, (speed, ))
        	flag=True
        	pids = [pid for pid in os.listdir('/proc') if pid.isdigit()]
        	os.system("/etc/init.d/S31emulationstation stop")
        	while flag:
        		flag = False
        		for pid in pids:
        				try:
        					print pid
        					commandpath = open(os.path.join('/proc', pid, 'cmdline'), 'rb').read()
        					if "emulationstation" in commandpath:
        						flag = True
        				except IOError:
        					continue
        	os.system(shutdownstring)
        
        # threaded blinking function for LED	
        def blink(speed):
        	while True:  
        			GPIO.output(LED, False)
        			time.sleep(speed)
        			GPIO.output(LED, True)
        			time.sleep(speed)
        
        
        # 	sending network command to retroarch (only exit and reset atm)		
        def retroarch(nwcommand):
        	try:
        		s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        	except socket.error:
        		print 'Failed to create socket'
        		sys.exit()
        	s.sendto(nwcommand, (IPADDR, PORTNUM))
        		
        if mode == "onoff" :
            GPIO.add_event_detect(POWERPLUS, GPIO.RISING, callback=button_changed, bouncetime=2)
        elif mode == "push":
            GPIO.add_event_detect(POWERPLUS, GPIO.BOTH, callback=button_pressed, bouncetime=2)
        
        GPIO.add_event_detect(RESETPLUS, GPIO.BOTH, callback=button_pressed, bouncetime=2)
        
        while True:
        	time.sleep(0.2)
        

        Si ça fonctionne, je le mettrai dans la prochaine release

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

        FF-Sounds 1 Reply Last reply Reply Quote 0
        • FF-Sounds
          FF-Sounds @supernature2k last edited by

          @supernature2k

          T'as fait une petite erreur dans le nom de la nouvelle fonction button_changed, elle est nommée button_pressed comme l'autre 😉
          Après cette correction:

          • Avec un switch ON/OFF, ça fonctionne correctement
          • Avec un PUSH ON/OFF, le boot fonctionne correctement mais, une fois booté, il n'y que l'appui court qui est pris en compte, pas de timer visiblement, dès qu'on appui, shutdown propre direct... pas de reboot que ce soit en jeu ou sous ES

          Pour le RESET, il n'y a que le reset du system Retroarch en jeu qui ne fonctionne pas...

          Merci pour la modif en tout cas 🙂

          supernature2k 1 Reply Last reply Reply Quote 0
          • supernature2k
            supernature2k @FF-Sounds last edited by

            @ff-sounds J'avoue je viens de le faire à l'arrache du bureau... pas testé 🙂
            je vais éditer le post...

            Pour passer en momentary il faut du coup activer le :
            system.power.switch=PIN356PUSHRESET dans recalbox.conf (tu peux tester?)

            Pour le reset RA, c'est étrange, il a toujours fonctionné chez moi.

            Check le retroarchcustom.cfg et vérifie que tu as bien une ligne :

            network_cmd_enable = "true"

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

            FF-Sounds 1 Reply Last reply Reply Quote 0
            • FF-Sounds
              FF-Sounds @supernature2k last edited by FF-Sounds

              @supernature2k

              Haaaa mais je ne savais pas qu'il existait ce mode PIN356PUSHRESET !!
              D'où le if mode == "onoff"/elif mode == "push".... rolala...

              En effet, network_cmd_enable = "true" n'était pas dans retroarchcustom.cfg, à corriger dans la prochaine release, il ne doit pas y être initialement je pense, car jamais touché à retroarchcustom.cfg

              ça fonctionne bien avec l'ajout de la ligne en mode PIN356PUSHRESET et PIN356ONOFFRESET 🙂

              Je vais me pencher sur un script perso dans ce cas, avec:

              • switch ON/OFF classique
              • Reset court en jeu => reset du jeu
              • Reset long en jeu => retour ES
              • Reset court sous ES => reboot propre
              • Reset long sous ES => rien

              Je partagerai le code pour ceux que ça intéresseraient 🙂 (c'est quoi la fonction pour mettre du code sur le forum ??)

              Merci beaucoup !

              supernature2k 1 Reply Last reply Reply Quote 0
              • supernature2k
                supernature2k @FF-Sounds last edited by

                @ff-sounds Pas bête cette idée de script, si tu y arrives fait une MR pour l'ajouter 🙂

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

                FF-Sounds 1 Reply Last reply Reply Quote 0
                • FF-Sounds
                  FF-Sounds @supernature2k last edited by FF-Sounds

                  @supernature2k

                  Est ce que tu pourrais me dire comment identifier si Retroarch est en cours d'execution ?
                  Le reset court et long en jeu c'est facile (et ça marche !), mais pour poser les conditions pour ES il faut que je sache si on est en jeu ou pas...
                  Je ne sais pas comment faire du coup.
                  Ma pratique du code (même pas Python en plus) remonte à 2002.. lol !

                  Please help 🙂

                  supernature2k 1 Reply Last reply Reply Quote 0
                  • supernature2k
                    supernature2k @FF-Sounds last edited by

                    @ff-sounds Pour retroarch tu peux chercher si le pid existe (comme je le fais pour ES pour le clean shutdown).
                    Par contre il y a les autres emulateurs standalone, là ça se complique

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

                    FF-Sounds 1 Reply Last reply Reply Quote 0
                    • FF-Sounds
                      FF-Sounds @supernature2k last edited by

                      @supernature2k

                      Salut !

                      Bon alors après plein d'essais, ça ne fonctionne pas, y'a un truc que je pige pas, tant pis, je vais laisser le reset court/long en jeu, ça me va bien comme ça 🙂

                      Comme tu dis, ça se complique pour les autres emus standalone, je me demande si il n'y a pas un moyen de savoir qui à la main en affichage, ce serait vite réglé !
                      si pas ES on est en jeu, simplement 🙂

                      A réfléchir !

                      Merci pour le coup de main !

                      voljega 1 Reply Last reply Reply Quote 0
                      • voljega
                        voljega Banned @FF-Sounds last edited by

                        @ff-sounds suffit de vérifier qu'il y a un processus avec 'emulatorlauncher.py' dans le titre de lancé par ps -ef | grep emulatorlauncher si oui tu es en cours d'exécution d'un emulateur, sinon dans ES

                        FF-Sounds 1 Reply Last reply Reply Quote 0
                        • FF-Sounds
                          FF-Sounds @voljega last edited by

                          @voljega

                          Oui c'est pas bête, mais je suis loin d'assurer à max en code !
                          J'ai la logique mais pas tous les "mots" pour mettre en oeuvre, alors c'est plutôt embêtant 🙂

                          Mais je vais y regarder, ça m’intéresse, ça prendra le temps que ça prendra, je demanderai peut être un coup de main 😉

                          Merci pour ton aide !

                          1 Reply Last reply Reply Quote 0
                          • FF-Sounds
                            FF-Sounds last edited by FF-Sounds

                            @voljega @supernature2k

                            Bonjour,

                            J'ai besoin de vos lumières, j'ai testé tout un tas de chose, il me manque juste un truc, je n'arrive pas un récupéré une variable (present) pour la tester...

                            Please help 🙂

                            		elif (timer >1):
                            			search_launcher(channel)
                            				if present == True:
                            					nwcommand="RESET"
                            					retroarch(nwcommand)
                            					print "retroarch"
                            					killthats**t(channel)
                            				else:	
                            					speed=0.05
                            					shutdownstring="shutdown -r now"
                            					offreset(speed, shutdownstring)
                            					print "reboot"
                            		timer = 0
                            		flag = False
                            	time.sleep(0.1)
                            	
                            def search_launcher(channel):
                            	if channel == RESETPLUS:
                            		pids = [pid for pid in os.listdir('/proc') if pid.isdigit()]
                            		for pid in pids:
                            			try:
                            				print pid
                            				commandpath = open(os.path.join('/proc', pid, 'cmdline'), 'rb').read()
                            				if "emulatorlauncher" in commandpath:
                            					present = True
                            			except IOError:
                            				continue
                            
                            1 Reply Last reply Reply Quote 0
                            • NeeeeB
                              NeeeeB last edited by NeeeeB

                              def search_launcher(channel):
                                   if channel == RESETPLUS:
                                       proc = subprocess.Popen('ps -ef | grep emulatorlauncher', stdout=subprocess.PIPE)
                                       tmp = proc.stdout.read()
                                       if tmp:
                                           present = true
                                       else:
                                           present = false
                              

                              Pas sur du tout de mon coup, le python n'est pas un langage que je maitrise ^^
                              Y'a même moyen de se passer de ta variable present et de tester le result renvoyé par search_launcher (à la place de present = true tu mets result = true, pareil pour false, et dans la première partie de ton code tu fais if search_launcher(channel) == true : etc...

                              Vieux geek ^^
                              GameList Editor : https://github.com/NeeeeB/GameList_Editor

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

                                	elif (timer >1):
                                			if search_launcher(channel) == True:
                                				nwcommand="RESET"
                                				retroarch(nwcommand)
                                				print "retroarch"
                                				killthats**t(channel)
                                			else:	
                                				speed=0.05
                                				shutdownstring="shutdown -r now"
                                				offreset(speed, shutdownstring)
                                				print "reboot"
                                	timer = 0
                                	flag = False
                                time.sleep(0.1)
                                
                                def search_launcher(channel):
                                    if channel == RESETPLUS:
                                	proc=subprocess.Popen('ps -ef | grep emulatorlauncher', stdout=subprocess.PIPE)
                                        tmp=proc.stdout.read()
                                        if tmp:
                                            return True
                                        else:
                                            return False
                                

                                Un truc dans le genre, les cadors du .py seront plus à même de valider ma grouille ^^

                                Vieux geek ^^
                                GameList Editor : https://github.com/NeeeeB/GameList_Editor

                                voljega 1 Reply Last reply Reply Quote 1
                                • voljega
                                  voljega Banned @NeeeeB last edited by voljega

                                  @neeeeb @FF-Sounds ouip ce que t'as dit neeeeb est plus simple et moins source d'erreur, je ne me souviens plus de la portée exacte des variables en python.

                                  autre possiblité, déclare juste ta varaible en haut de ton code en dehors de toute fonction, juste par present = False (après les imports tout de même)

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

                                    Les variables globales c'est le mal ^^ j'essaye toujours de les éviter au maximum.

                                    Vieux geek ^^
                                    GameList Editor : https://github.com/NeeeeB/GameList_Editor

                                    voljega 1 Reply Last reply Reply Quote 0
                                    • voljega
                                      voljega Banned @NeeeeB last edited by voljega

                                      @NeeeeB mouais c'est un peu idéologique en python (si tu fais pas de l'objet) ça me semble pas très dommageable perso, je le ferai pas en javascript ou en C++ ça c'est sûr 😛

                                      NeeeeB 1 Reply Last reply Reply Quote 1
                                      • NeeeeB
                                        NeeeeB @voljega last edited by

                                        @voljega disons que quand t'as une unité de 6000 lignes t'as du mal à t'y retrouver après...mais sinon oui c'est pas spécialement dommageable, ça rend juste les choses moins lisibles selon moi.

                                        Vieux geek ^^
                                        GameList Editor : https://github.com/NeeeeB/GameList_Editor

                                        voljega 1 Reply Last reply Reply Quote 0
                                        • voljega
                                          voljega Banned @NeeeeB last edited by

                                          @neeeeb le problème dans ce cas c'est plutôt d'avoir une unité de 6000 lignes 😉

                                          NeeeeB 1 Reply Last reply Reply Quote 0
                                          • NeeeeB
                                            NeeeeB @voljega last edited by

                                            @voljega ça dépend du soft que tu développes tu sais...dans mon taf c'est pas rare, genre l'algo de prescription de médicaments y'a tellement de cas à gérer que rien qu'à lui tout seul il pèse pas loin des 4000 lignes, sur une fonction avec une dizaine d'inner procedures.

                                            Vieux geek ^^
                                            GameList Editor : https://github.com/NeeeeB/GameList_Editor

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

                                            Want to support us ?

                                            98
                                            Online

                                            99.6k
                                            Users

                                            28.1k
                                            Topics

                                            187.1k
                                            Posts

                                            Copyright © 2021 recalbox.com