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.
    • 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
      • voljega
        voljega Banned @NeeeeB last edited by

        @neeeeb dans ce cas il devrait être découpé en plusieurs sous fonctions 🙂

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

          @NeeeeB @voljega

          Salut !
          Je vois que ma demande a suscité des réponses , ça fait plaisir 🙂 merci !
          Je ne vais pas rentrer dans votre "bataille" idéologique ^^ je ne suis pas assez calé pour en discuter 😛

          Je teste le code ce soir et vous tiens au courant, j'ai hâte 😉

          Encore merci !

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

            @FF-Sounds de rien 😉

            @voljega c'est déjà le cas, relis ce que j'ai écrit ^^ et au final ça ne change rien, les sous fonctions (inner procedures dans mon langage) sont dans la même unité, donc le nombre de ligne de l'unité sera toujours le même...enfin bref ^^

            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 qu'est ce que t'appelle une unité ? Un package / fichier ?

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

                @voljega un fichier, qui peut contenir 1 à xxxx fonctions, comme un package en java, ou un fichier .c en C++

                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 ben du coup y'a toujours possibilité de le diviser en plusieurs fichiers par pas mal de critères non ?

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

                    @voljega @NeeeeB

                    Bon alors après plusieurs essais, ça ne fonctionne pas, grrr
                    Le dernier code testé ci-dessous, il y a la LED qui fonctionne, le retour ES en jeu sur appui long, normal, pas touché à ça, mais pour les appuis courts toujours aucune réactions !
                    J'ai essayé un peu tout...

                    import RPi.GPIO as GPIO
                    import time
                    import os
                    import thread
                    import datetime
                    import socket
                    import sys
                    import argpa**e
                    import subprocess
                    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
                    # present = False
                    
                    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):
                    	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):
                    				nwcommand="QUIT"
                    				retroarch(nwcommand)
                    				print "retroarch"
                    
                    			elif (timer >1):
                    
                    #				search_launcher(channel)
                    #				if present == True:
                    #					nwcommand="RESET"
                    #					retroarch(nwcommand)
                    #					print "retroarch"
                    #					killthats**t(channel)
                    				if search_launcher(channel) == True:
                    					nwcommand="RESET"
                    					retroarch(nwcommand)
                    					print "retroarch"
                    					killthats**t(channel)
                    #				else
                    				elif search_launcher(channel) == False:	
                    					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:
                    		proce=subprocess.Popen('ps -ef | grep emulatorlauncher', stdout=subprocess.PIPE)
                    		tmp=proce.stdout.read()
                    		if tmp:
                    			return True
                    		else:
                    			return False
                    			
                    #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
                    	
                    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)
                    

                    Help...

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

                      @ff-sounds essaye de faire des logs dans un fichier pour voir où l'exécution de ton code passe et si les différents types d'appui sont bien détectés

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

                        @voljega bah si tu veux rendre ton architecture de code illisible parce que t'as disséminé des fonctions relatives à la même chose un peu partout, oui tu peux...mais pour garder une cohérence et une lisibilité on préfère mettre tout ce qui se rapporte a la même chose dans la même unité.
                        Après je parle pour le Delphi, où ça ne pose aucun souci de faire comme ça.
                        Franchement si tu voyais l'usine à gaz qu'on développe (3.500.000 lignes de code), y'a déjà assez d'unités pour qu'on s'y perde en cherchant qqchose...
                        Je préfère vraiment quand j'ouvre U_PrescriptionEditor.pas (par exemple) y trouver tout ce qui se rapporte à l'éditeur de prescriptions que devoir aller chercher 10 unités pour avoir tout le code relatif sous les yeux. D'ailleurs ça serait même bien chiant parce qu'il faudrait importer toutes les unités entre elles etc...ce qui alourdit bien la compilation.

                        M'enfin après on a tous une manière de développer différente.
                        Tkt on m'a bien appris aussi que le code doit être modulaire, mais parfois trop de modulaire tue le modulaire.

                        @FF-Sounds en même temps je t'ai donné du code dont je ne suis absolument pas certain qu'il soit correct ^^ (ceci dit Voljega n'a pas eu l'air de tiquer dessus donc ça devrait être bon).

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

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

                          bah après j'ai pas regardé en détail détail et je suis pas non plus le big boss du python mais si le script s'exécute sans erreur il ne reste plus qu'à débugguer 🙂

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

                            @voljega

                            Heu faire des logs... tu m'en demandes beaucoup là ^^

                            Les 2 types d'appui fonctionnent, j'ai repris le code original du rpi-pin356-power + petite modif de @supernature2k pour le ONOFF 😉
                            Celui-ci fonctionne très bien d'ailleurs.

                            Sur celui que j'ai modifié, il suffit que je mette en commentaire les lignes ci-dessous pour que le reset court fasse un reboot proprement :

                            			elif (timer >1):
                            
                            #				if search_launcher(channel) == True:
                            #					nwcommand="RESET"
                            #					retroarch(nwcommand)
                            #					print "retroarch"
                            #					killthats**t(channel)
                            #				elif search_launcher(channel) == False:	
                            					speed=0.05
                            					shutdownstring="shutdown -r now"
                            					offreset(speed, shutdownstring)
                            					print "reboot"
                            			timer = 0
                            			flag = False
                            		time.sleep(0.1)
                            

                            Donc il y a bien un truc qui cloche ici :

                            				if search_launcher(channel) == True:
                            					nwcommand="RESET"
                            					retroarch(nwcommand)
                            					print "retroarch"
                            					killthats**t(channel)
                            				elif search_launcher(channel) == False:
                            

                            ou là: (pour info j'ai bien ajouté import subprocess)

                            def search_launcher(channel):
                            	if channel == RESETPLUS:
                            		proce=subprocess.Popen('ps -ef | grep emulatorlauncher', stdout=subprocess.PIPE)
                            		tmp=proce.stdout.read()
                            		if tmp:
                            			return True
                            		else:
                            			return False
                            
                            voljega 1 Reply Last reply Reply Quote 0
                            • voljega
                              voljega Banned @FF-Sounds last edited by

                              @ff-sounds said in Power Script PIN356ONOFFRESET avec switches SNES d'origine:

                              if tmp:
                              return True
                              else:
                              return False

                              ben qu'est ce que ça retourne tmp parce que là tu testes quoi ? qu'il est pas vide seulement ? parce que c'est possible qu'il soit pas vide ...

                              fais des print de tes variables sinon

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

                                @voljega
                                C'est ce que j'allais suggérer.
                                Je suis parti du fait que tmp serait vide si la commande 'ps -ef | grep emulatorlauncher' ne renvoyait rien, mais ce n'est peut être pas le cas, peut être que même si ça ne trouve pas de process avec emulatorlauncher dans le nom ça renvoie quand même quelque chose...

                                @FF-Sounds balance cette commande en SSH quand tu es sur l'interface EmulationStation et regarde ce que ça renvoie. (au pire donne nous ce que ça renvoie et on modifiera le script en conséquence).

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

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

                                  @NeeeeB @voljega

                                  Idem, je suis parti du principe que ça ne renvoyait rien...
                                  Voilà ce que j'ai avec Putty:

                                  login as: root
                                  root@192.168.199.17's password:
                                  # ps -ef | grep emulatorlauncher
                                   1444 root     grep emulatorlauncher
                                  

                                  ça veut dire que ça renvoi bien un truc non ?

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

                                    @ff-sounds oui ça te renvoie la commande que tu viens de rentrer 😄

                                    essaye de faire ps -ef | grep emulatorlauncher | grep retroarch peut-être mais pas sûr que ça marche mieux

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

                                      @voljega

                                      Alors ps -ef | grep emulatorlauncher | grep retroarch ne renvoi rien sous ES, mais rien en jeu aussi...
                                      Alors que ps -ef | grep emulatorlauncher renvoi bien un processus avec emulatorlauncher en jeu !

                                      j'ai regardé les options de grep, donc cette variante serait peut-etre pas mal :
                                      ps -ef | grep -c emulatorlauncher ça me renvoi le nombre d'itération trouvée 😉
                                      sous ES j'ai 1 donc si je teste >= 2 , ça serait ok !

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

                                        @ff-sounds ouais mais d'expérience des fois la ligne 1444 root grep emulatorlauncher n'est pas renvoyé 😄

                                        donne moi le résultat de la commande ps -ef | grep emulatorlauncher en jeu ?

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

                                          @voljega

                                          ça donne ça :

                                          # ps -ef | grep emulatorlauncher
                                           1437 root     sh -c python /usr/lib/python2.7/site-packages/configgen/emulatorlauncher.pyc -p1index 0 -p1guid 05000000504c415953544154494f4e00 -p1name "PLAYSTATION(R)3 Controller" -p1nbaxes 4 -p1devicepath /dev/input/event2 -p2index 1 -p2guid 15000000010000000100000000010000 -p2name "SNES pad" -p2nbaxes 2 -p2devicepath /dev/input/event0 -p3index 2 -p3guid 15000000010000000100000000010000 -p3name "SNES pad" -p3nbaxes 2 -p3devicepath /dev/input/event1  -system gba -rom /recalbox/share/roms/gba/Anguna\ \(Nathan\ Tolbert\ and\ Chris\ Hildenbrand\).gba -emulator default -core default -ratio auto 2> /recalbox/share/system/logs/es_launch_stderr.log | head -300 > /recalbox/share/system/logs/es_launch_stdout.log
                                           1438 root     python /usr/lib/python2.7/site-packages/configgen/emulatorlauncher.pyc -p1index 0 -p1guid 05000000504c415953544154494f4e00 -p1name PLAYSTATION(R)3 Controller -p1nbaxes 4 -p1devicepath /dev/input/event2 -p2index 1 -p2guid 15000000010000000100000000010000 -p2name SNES pad -p2nbaxes 2 -p2devicepath /dev/input/event0 -p3index 2 -p3guid 15000000010000000100000000010000 -p3name SNES pad -p3nbaxes 2 -p3devicepath /dev/input/event1 -system gba -rom /recalbox/share/roms/gba/Anguna (Nathan Tolbert and Chris Hildenbrand).gba -emulator default -core default -ratio auto
                                           1548 root     grep emulatorlauncher
                                          

                                          Dans ce cas, il faut vérifier aussi si grep est présent dans le résultat
                                          => si oui, >=2 sinon >=1

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

                                            @ff-sounds grepper grep ça va être dur 😛

                                            essaye ps cax | grep emulatorlauncher ?

                                            sinon fouille là dedans : https://stackoverflow.com/questions/9117507/linux-unix-command-to-determine-if-process-is-running?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

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

                                            Want to support us ?

                                            97
                                            Online

                                            99.6k
                                            Users

                                            28.1k
                                            Topics

                                            187.1k
                                            Posts

                                            Copyright © 2021 recalbox.com