Forum >> Principianti >> rilevamento pressione tasto (magari il tasto ESC)

Pagina: Indietro 1 2

Questo programma parte con avvio automatico e gestisce attraverso impulso esterno lo spegnimento del raspberry stesso alla sera; a questo programma manca però una cosa fondamentale in fase di test .... POTERLO FERMARE.

Ecco a cosa mi serve quello che ho chiesto .... un comando che io durante il programma premendo un tasto (es. ESC) mi blocchi il programma mi permetta di fare le correzzioni del caso.

In fase di test "basterebbe" lanciare la procedura da shell ed interromperla con "CTRL+C"
Python 3.8.2 (default, Jul 16 2020, 14:00:26) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> import time
>>> actions = 0
>>> while True:
	actions += 1
	print('Eseguita azione', actions)
	time.sleep(3)

	
Eseguita azione 1
Eseguita azione 2
Traceback (most recent call last):
  File "<pyshell#8>", line 4, in <module>
    time.sleep(3)
KeyboardInterrupt
>>> 
Per quanto riguarda "il comando", personalmente ed alla base delle mie attuali conoscenze, lo darei dall'esterno ... una specie di "comando remoto" in sostanza, nel fine settimana cercherò di abbozzare un esempio di ciò che mi è venuto in mente.

Certo Nuzzopippo , il problema è che ho messo il raspberry in modo che il programma parta al suo boot (quindi senza interfaccia grafica) e poi dovevo bloccarlo ..... e non c’è stato verso di bloccarlo; sfortunanatamente non avevo neppure l’SSH abilitato ..... morale della favola INFERMABILE.
Soluzione .... formattare la SD , e reinstallare tutto... fortunatamente avevo copia dei programmi su una chiavetta; ecco perché vorrei poterlo bloccare da “dentro” il programma.

Grazie




------
Alberto
Certo Nuzzopippo , il problema è che ho messo il raspberry in modo che il programma parta al suo boot (quindi senza interfaccia grafica) e poi dovevo bloccarlo ..... e non c’è stato verso di bloccarlo; sfortunanatamente non avevo neppure l’SSH abilitato ..... morale della favola INFERMABILE.
Soluzione .... formattare la SD , e reinstallare tutto... fortunatamente avevo copia dei programmi su una chiavetta; ecco perché vorrei poterlo bloccare da “dentro” il programma.
beh ... pur non conoscendo 'sto benedetto raspberry, credo proprio che così come hai inserito lo script al boot potresti toglierlo. Comunque, che non sia una buona idea inserire al boot routines in sviluppo l'hai già visto da Te, spero che la cosa non Ti dia problemi anche in fase di test.




'sta giornata l'ho dedicata tutta all'idea che Ti avevo anticipato, cioè ad una predisposizione per ordine "remoto" che possa fermare uno script di shell ... precisazione probabilmente inutile, "ordine remoto" significa "da un programma esterno", che gira sulla stessa macchina o su di un'altra macchina in rete.

Ho sviluppato un esempio proprio minimale senza gestione degli errori ed accorgimenti "solidi", e già così è un bel po' di codice, ma che potrebbe anche andare bene per test "volanti" da togliere poi, una volta definiti i dettagli applicativi che Vi sono necessari.

L'idea implementata prevede una procedura che avvia 4 programmi "esterni", a distanza di 100 secondi uno dall'altro, tramite subprocess.Popen, detti avvii sono effettuati in un ciclo (potrebbe anche essere "infinito") che ad ogni passaggio valuta una variabile globale "command", di default vuota, se tale variabile assume il valore di "quit" il ciclo si interrompe e gli eventuali programmi esterni avviati vengono distrutti, in caso contrario avviene la normale prosecuzione che prevede il termine dell'applicazione di avvio una volta lanciato il 4° programma esterno, mentre i programmi esterni proseguono sino al termine il loro ciclo di vita.

Tanto l'applicazione, quanto il programmi esterni registrano in uno specifico file di log le loro azioni (giusto per poter controllare) oltre che stamparle a video, assumono esista una directory "logs" nella direttrice dell'applicazione, devi crearla a mano.

L'applicazione di "avvio", prima di avviare il ciclo di chiamate dei programmi esterni istanzia un oggetto (classe "Comunicator" nel codice) che estende "treading.Thread" che pone un socket in ascolto su tutte le porte 7678 della macchina, Comunicator prevede quale parametro una funzione dedicata a variare la variabile globale command, che fornisce un "set" di comandi da interpretare al processo (impostati solo "get log" e "quit" nell'esempio).

allegherò i files relativi alla routine di esempio ("launcher_and_commands.py") e dei "programmi esterni" ("external_01-04.py")

allegherò, anche il semplicissimo file "commander.py" che provvede ad inviare due comandi ed attendere la chiusura della connessione.

L'esempio è proprio minale, come detto, provalo e vedi se ti possa essere utile per i tuoi scopi di test, naturalmente, in tal caso, dovrai adattare le impostazioni alle Tue esigenze.

Spero Ti possa essere utile.

Ciao ;)

Fatti non foste a viver come bruti...
Allegati


Pagina: Indietro 1 2



Esegui il login per scrivere una risposta.