Power Script PIN356ONOFFRESET avec switches SNES d'origine
-
@neeeeb ben du coup y'a toujours possibilité de le diviser en plusieurs fichiers par pas mal de critères non ?
-
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...
-
@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
-
@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).
-
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
-
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
-
@ff-sounds said in Power Script PIN356ONOFFRESET avec switches SNES d'origine:
if tmp:
return True
else:
return Falseben 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
-
@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).
-
-
@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
-
Alors
ps -ef | grep emulatorlauncher | grep retroarch
ne renvoi rien sous ES, mais rien en jeu aussi...
Alors queps -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 ! -
@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 ? -
ç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 -
@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
-
@supernature2k after the last update or the 2018.03.30 version, I do not remember for sure, the led is not lit when it enters the recalbox, it just turns on when I turn on the raspberry.
-
@ff-sounds moi je testerais si tmp contient la chaîne de caractères "-p1guid", ce qui n'est pas le cas quand tu es dans ES.
-
Je vais regarder à ça, merci pour le tuyau
grep
retourne p1guid sous ES aussi , il renvoi la commande en fait, donc l'idée de tester si présence d'une suite de caractère semble mauvaise.
C'est peut être pour ça qu'à la base c'est par les PID que la fonctionoffreset()
est faite.Je vais voir pour reprendre cette piste si pas concluant avec grep !
-
ps -ef | grep [e]mulatorlauncher
corrige le problème, ,merci le lienPetit truc louche qui vient de m'arriver, j'ai descendu le store électrique du salon à l'instant car ça cogne dur, hé ben recalbox a reboot en appuyant sur l'interrupteur (mural je précise) !!!
@supernature2k @Substring, une idée du pourquoi ? la gestion du GPIO et de la masse ?Holala, j'ai pas fini avec tout ça... lol
-
@ff-sounds said in Power Script PIN356ONOFFRESET avec switches SNES d'origine:
Petit truc louche qui vient de m'arriver, j'ai descendu le store électrique du salon à l'instant car ça cogne dur, hé ben recalbox a reboot en appuyant sur l'interrupteur (mural je précise) !!!
ahah oui c'est un vieux bug, je croyais que le nouveau script corrigeait le problème
-
YOUHOUU ! ça fonctionne !
il y avait 2 problèmes en fait:
-
celui corrigé par la commande
ps -ef | grep [e]mulatorlauncher
-
Et le
Popen
qui n'envoyait pas la dite commande...
donc on corrige avecproce=subprocess.Popen(['/bin/sh', '-c', 'ps -ef | grep [e]mulatorlauncher'], stdout=subprocess.PIPE)
@supernature2k copie @Substring
Quand tu me demandais de faire une MR pour l'intégrer, tu parlais d'un script qui gère le onoff et push comme l'actuel ?
ou bien seulement le onoff pour uniquement une config matériel ON/OFF + RESETJ'entends par là, est ce que tu veux que les appuis courts/longs actuels soient remplacés par ce que j'ai fait ?
pour rappel :- switch ON/OFF classique (PUSH serait éventuellement : shutdown propre quelque soit le temps d'appui, en fait je crois qu'il n'y aurait rien à changer dans ce cas, à tester sinon ONOFFRESET et PUSHRESET plus nécéssaire)
- Reset court en jeu => reset du jeu
- Reset long en jeu => retour ES
- Reset court sous ES => reboot propre
- Reset long sous ES => rien
Dites-moi
EDIT: pour info, la gestion LED fonctionne correctement aussi
-