2014-06-22 10 views
6

Io gestisco una macchina giocattolo a distanza utilizzando .Come codice python d'ora il codice è il seguitoPython stampa chiave ed uscita Listener

def getkey(): 
     fd = sys.stdin.fileno() 
     old = termios.tcgetattr(fd) 
     new = termios.tcgetattr(fd) 
     new[3] = new[3] & ~TERMIOS.ICANON & ~TERMIOS.ECHO 
     new[6][TERMIOS.VMIN] = 1 
     new[6][TERMIOS.VTIME] = 0 
     termios.tcsetattr(fd, TERMIOS.TCSANOW, new) 
     c = None 
     try: 
       c = os.read(fd, 1) 
     finally: 
       termios.tcsetattr(fd, TERMIOS.TCSAFLUSH, old) 
     return c 

def car(): 
    while True: 
     key = getkey() 
     if key == 's': #Down arrow 
      print "Down" 
      Backward() 
     elif key == 'w': #Up arrow 
      print "Up" 
      forward() 
     elif key == 'a': 
      print "left" 
      Left() 
     elif key == 'd': 
      print "Right" 
      Right() 
     elif key == 'q': #Quit 
      print "That's It" 
      break 
def forward(): 
    GPIO.output(11,True) #Move forward 

quando premo 'w' in avanti() viene chiamato il metodo e la la macchina avanza ma non si ferma fino a quando non ho il esco dal programma o chiamo GPIO.output (11, Flase) da qualche altro metodo.

C'è un listener chiave che rileva il rilascio chiave di una chiave particolare.

Per esempio, se 'w' pressato chiamato questo metodo e, se rilasciato chiamata di un altro metodo codice

Sudo

if w_isPressed() 
    forward() 
else if w_isReleased() 
    stop() 
+1

Non è possibile farlo senza l'effettivo accesso da tastiera. Il tuo terminale invia solo la pressione di un tasto, quindi non puoi sapere quando è stata rilasciata una chiave. – Blender

+1

Potresti riuscire a farlo usando PyGame. – kindall

risposta

1

ho visto Pygame libreria di sviluppo del gioco in uso con successo in scenari simili prima , gestendo sistemi e macchinari in tempo reale nella produzione, non solo esempi di giocattoli. Penso che sia un candidato adatto anche qui. Controlla il modulo pygame.key per ciò che è possibile fare con l'input da tastiera.

In breve, se non si ha familiarità con lo sviluppo del gioco, si esegue il polling continuo di eventi come le modifiche dello stato di input all'interno di un ciclo di gioco "infinito" e si reagisce di conseguenza. Solitamente aggiorna i parametri del sistema usando delta per tempo trascorso. C'è un sacco di tutorial su questo e Pygame disponibile in giro e Pygame docs sono abbastanza solidi.

Un semplice esempio di come andare a questo proposito:

import pygame 

pygame.init() 

# to spam the pygame.KEYDOWN event every 100ms while key being pressed 
pygame.key.set_repeat(100, 100) 

while 1: 
    for event in pygame.event.get(): 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_w: 
       print 'go forward' 
      if event.key == pygame.K_s: 
       print 'go backward' 
     if event.type == pygame.KEYUP: 
      print 'stop' 

Avrai bisogno di giocare con pygame.KEYDOWN, pygame.KEYUP e pygame.key.set_repeat a seconda di come viene implementato il vostro movimento auto.

+0

Una limitazione a pygame è che richiede una visualizzazione connectecd. Cioè, questo approccio non funziona se ci si connette a un lampone senza testa pi con SSH. – malte