Python - Una duda sencilla (creo)

 
Vista:

Una duda sencilla (creo)

Publicado por Eduardo (11 intervenciones) el 19/03/2014 18:49:10
Buenas tardes a todos. Ante todo me presento: mi nombre es Eduardo y soy de Zaragoza. Estoy realizando una réplica reducida de una máquina arcade Donkey Kong (podéis verla aquí: http://www.retrovicio.org/foro/showthread.php?27582-Donkey-Kong-quot-reducida-quot-con-Raspberry-Pi y como "cerebro de la bestia" he usado una Raspberry. La máquina arranca directamente en el juego Donkey Kong, pero le he puesto un botón en la parte de atrás para poder acceder a un menú y poder elegir otros juegos. El botón va conectado al GPIO de la Raspberry y cuando se pulsa ejecuta esto
1
2
3
4
5
6
7
8
9
10
11
import RPi.GPIO as GPIO
import time
import os
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN,pull_up_down=GPIO.PUD_UP)
while True:
='editor_indent'>if(GPIO.input(17) == False):
='editor_indent'>
='editor_indent'>os.system("cd /home/pi/.advance")
='editor_indent'>
='editor_indent'>os.system("advmenu")
='editor_indent'>
='editor_indent'>break
time.sleep(1)

Esto funciona a la perfección y me lanza el menú si pulso el botón cuando estoy en la línea de comandos, pero si estoy dentro del juego no funciona. Para que funcionara estando dentro del juego, primero tendría que salir con Escape, darle a la flecha hacia abajo para elejir exit y pulsar enter. Es decir tengo que enviar una secuencia de Escape, flecha abajo y Enter. El problema es que no tengo ni idea de Python y no se como añadir esto. Si alguien me pudiera echar una mano le estaría muy agradecido.
Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 2.239
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Una duda sencilla (creo)

Publicado por xve (1646 intervenciones) el 19/03/2014 19:26:58
Hola Eduardo, muy chulo lo que estas haciendo... estaria muy bien que documentaras como lo has hecho y lo compartieras...

Sobre tu pregunta, el juego se ejecuta directamente sobre consola, o sobre algún entorno gráfico?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Una duda sencilla (creo)

Publicado por Eduardo (11 intervenciones) el 19/03/2014 19:59:41
Buenas tardes xve y muchas gracias por responder.
En el hilo que he puesto al principio voy poniendo todo el proceso. Además si alguien tiene cualquier duda estaré encantado de responderle.
El juego que se ejecuta al arrancar la máquina es la rom del Donkey Kong, ejecutada con el programa Advmame desde la línea de comandos. Es decir que cuando arranca la máquina, en el fichero /home/pi/.profile he añadido al final dos líneas
1
2
cd emulators/mame4all-pi
./mame dkongjp
Para salir del juego se pulsa ESC, entonces te sale un menu en pantalla con dos opciones Continue o Exit, le das a la flecha hacia abajo para seleccionar Exit y pulsas Enter. El problema es que al ser una máquina arcade no hay teclado, solo joystick y botones, de ahí que ponga en la parte trasera el botón para acceder al menu.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 2.239
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Una duda sencilla (creo)

Publicado por xve (1646 intervenciones) el 19/03/2014 21:41:23
Hola Eduardo, muchas gracias por comentarlo...

y.... porque no simplemente cuando se inicie el python, cierras la aplicación directamente con un kill por ejemplo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Una duda sencilla (creo)

Publicado por Eduardo (11 intervenciones) el 19/03/2014 21:51:55
El tema es que no tengo ni idea de python. Supongo que el kill lo tendría que añadir justo debajo de la línea
1
if(GPIO.input(17) == False):
Pero, ¿exactamente que tengo que poner?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 2.239
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

matar un proceso

Publicado por xve (1646 intervenciones) el 20/03/2014 08:31:33
Hola Eduardo, una manera es matar el proceso directamente...
Si el proceso por ejemplo se llama donkey, seria algo así:

1
os.system("killall donkey")

otra manera, seria matar un proceso por su id...
1
2
3
4
5
import commands
 
pid=commands.getoutput("ps aux | grep 'donkey' | grep -v grep | awk '{print $2}'")
if pid:
    commands.getoutput("kill %s" % pid)

Espero que te sirva... coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

matar un proceso

Publicado por Eduardo (11 intervenciones) el 24/03/2014 15:44:48
Gracias xve de nuevo por responder. Hoy he probado lo que comentabas y efectivamente mato el proceso con un "killall advmame", con lo que me sale del juego, pero el problema es que luego no me lanza el menu. Ahora lo tengo así
1
2
3
4
5
6
7
8
9
10
11
import RPi.GPIO as GPIO
import time
import os
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN,pull_up_down=GPIO.PUD_UP)
while True:
      if(GPIO.input(17) == False):
            os.system("killall advmame")
            os.system("advmenu")
            continue
time.sleep(1)

cuando pulso el botón, como te comentaba, sale del juego, pero en vez de lanzar el menú (el programa advmenu) me sale este error:

1
sh: 1: advmenu: not found

Sin embargo, si tecleo advmenu en la línea de comandos, si que arranca. No entiendo que puede ser.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 2.239
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

matar un proceso

Publicado por xve (1646 intervenciones) el 24/03/2014 18:28:10
Hola Eduardo, prueba a poner la ruta absoluta del archivo advmenu... algo así pero con la ruta correcta:
1
os.system("/usr/bin/advmenu")

Coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

matar un proceso

Publicado por Eduardo (11 intervenciones) el 24/03/2014 19:31:04
Ya lo he probado y ahora sale:

1
sh: 1: /home/pi/.advance/advmenu: Permission denied
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 2.239
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

matar un proceso

Publicado por xve (1646 intervenciones) el 24/03/2014 20:40:19
Con que usuario lo estas ejecutando?

si no lo vas a ejecutar como root, puedes hacer varias cosas... darles derechos de SUID o dar derechos de ejecución para todos los usuarios...

SUID
1
chmod +s /home/pi/.advance/advmenu

Derecho de ejecución para todo el mundo
1
chmod a+x /home/pi/.advance/advmenu

espero que te sirva... coméntanos, ok
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

matar un proceso

Publicado por Eduardo (11 intervenciones) el 24/03/2014 22:38:08
Nada, que no hay manera. No se que estoy haciendo mal, pero algo que tendría que ser sencillo se me está resistiendo.

Vamos a ver si me aclaro yo mismo y os lo explico:

1º) Cuando arranca la raspberry entra directamente al advmame, en concreto al juego donkey kong (dkong). Esto lo he conseguido simplemente añadiendo 2 líneas al final del fichero /home/pi/.profile. Son estas:
1
2
cd /home/pi/.advance
advmame dkong

2º )Una vez que ha arrancado y ya esta el juego ejecutándose, si le doy a la tecla ESCAPE salgo del advmame a la línea de comandos, como usuario pi, y concretamente, en el directorio /home/pi/.advance

3º) Si ahora escribo advmenu y ENTER, entro sin problemas al programa en cuestión. El advmenu no es otra cosa que un frontend para poder elegir los juegos mediante una interface gráfica en la que te vas desplazando por las imágenes de los juegos disponibles con el joystick. Una vez estás sobre el juego que te interesa, pulsas el botón de salto de la máquina y entras en el juego (lo que hace el advmenu en ese momento es ejecutar "advmame nombredeljuego")

4º) Como ya expliqué el problema es que es una máquina arcade, por lo que carece de teclado y todo el proceso descrito en los puntos 2 y 3 se lo tengo que asignar a un botón.

5º)Mediante el script y gracias a tus consejos he conseguido que salga de advmame (hemos sustituido el pulsar la tecla ESCAPE por el killall advmame del script). Hasta aquí todo OK.

6º)Lo siguiente es sustituir el advmenu+ENTER que tecleo en la línea de comandos por una (o varias) líneas del script. He comprobado que advmenu funciona igual estés como root o como pi, y que además no hay que indicarle la ruta completa, es decir esté en la carpeta que esté, y con cualquier usuario, tecleo advmenu y funciona.

7º)Con la última indicación que me has dado, algo hemos avanzado, pero sigue sin arrancar. Ahora salen todas las líneas del fichero de configuración que el advmenu lee al arrancar (mas de 200) dando error, como si no existieran, o el fichero de configuración estuviera en blanco, cosa que no es cierta. El problema es que sale tan rápido que no me da tiempo a ver el error del principio. ¿Cómo puedo subir hacia arriba para verlo? Perdona que sea tan torpe pero esto del linux y el python son dos mundos desconocidos para mi.

Muchas gracias por tu paciencia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 2.239
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

matar un proceso

Publicado por xve (1646 intervenciones) el 25/03/2014 08:10:56
Hola Eduardo, antetodo te agradezco mucho tu descripción, la verdad es que me gustaria hacerte una pregunta.... yo dispongo de una raspberry-py, y no estoy metido en el mundo de los juegos, pero me gustaria mucho disponer de un joystik con su boton igual que las maquinas de verdad... me puedes decir:
- donde lo has comprado?
- como has instalado los juegos?


Ahora paso a responder tu pregunta del punto 7.
Con las teclas Shift+RePag podrás subir para visualizar los mensajes superiores...

Coméntanos el error que te da ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

matar un proceso

Publicado por Eduardo (11 intervenciones) el 25/03/2014 10:00:28
-El joystick y los botones los he comprado en Factory Arcade. En la Raspberry se pueden conectar directamente al GPIO, aunque yo para no complicarme he utilizado un interface para un jugador que se conecta directamente al usb. También tiene la ventaja de que te viene con el cableado fastom completo para el joystick y los botones. Tienes interface para uno o dos jugadores.

-Para los juegos depende de lo que quieras emular, pero lo mas sencillo es instalar el PiMame, que esencialmente es una recopilación de emuladores para la Raspberry, ya preconfigurados, con lo que ahorras mucho tiempo. Concretamente trae todos estos emuladores:

MAME - AdvanceMAME & MAME4ALL
CPS I / CPS II - Final Burn Alpha
Neo Geo - GNGeo
Playstation - pcsx-reARMed
Genesis - DGen
SNES - SNES9x
NES - AdvMESS
Gameboy - Gearboy
Gameboy Advance - GPSP
ScummVM
Atari 2600 - Stella
Cavestory - NXEngine
Commodore 64 - VICE

Una vez tengas los emuladores necesitas las roms de los juegos. Sin problemas, te facilito las que quieras del sistema que quieras. Estaré encantado de echarte una mano en todo lo que pueda si decides ir adelante con el tema.
Ahora voy a ver si pruebo lo que me has dicho y te comento. Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

matar un proceso

Publicado por Eduardo (11 intervenciones) el 25/03/2014 10:42:34
Visto. Efectivamente el problema es el que apuntaba antes: el advmenu tiene un fichero de configuracion (advmame.rc) que lee cuando arranca. Es del tipo:
1
2
3
4
5
6
7
config save_at_exit
device_alsa_device default
device_alsa_mixer channel
device_color_bgr15 yes
device_color_bgr16 yes
device_color_bgr24 yes
...

Pues bien, ahora cuando pulso el botón, mata el proceso del juego y sale bien, pero no llega a arrancar el advmenu, dando el siguiente error:
1
2
3
4
5
6
7
/home/pi/.advance/advmenu: 1: /home/pi/.advance/advmenu: config: not found
/home/pi/.advance/advmenu: 2: /home/pi/.advance/advmenu: device_alsa_device: not found
/home/pi/.advance/advmenu: 3: /home/pi/.advance/advmenu: device_alsa_mixer: not found
/home/pi/.advance/advmenu: 4: /home/pi/.advance/advmenu: device_color_bgr15: not found
/home/pi/.advance/advmenu: 5: /home/pi/.advance/advmenu: device_color_bgr16: not found
/home/pi/.advance/advmenu: 6: /home/pi/.advance/advmenu: device_color_bgr24: not found
...

Muy raro, porque me he asegurado de darle permisos de lectura y escritura también al advmenu.rc, e incluso indicarle la ruta al advmenu de donde está el admenu.rc.
Estoy bloqueado. Si no tienes alguna sugerencia, creo que voy a reinstalar y empezar de 0.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 2.239
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

matar un proceso

Publicado por xve (1646 intervenciones) el 25/03/2014 11:00:03
Hola Eduardo, puede ser que lo busque en el path donde se ejecuta... revisa las opciones del programa, para especificar la ubicación del archivo de configuración...

Prueba con:
advmenu --help

Seguramente, hay alguna opción para especificar el archivo de configuración, algo como: advmenu -c /path/advmame.rc
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 2.239
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

matar un proceso

Publicado por xve (1646 intervenciones) el 25/03/2014 11:07:17
Muchas gracias por comentarlo Eduardo...

Si lo entiendo bien, comprando el joystik (http://www.factoryarcade.es/tienda/product.php?id_product=336) y esta placa (http://www.factoryarcade.es/tienda/product.php?id_product=26) se conecta todo bien? no hay que comprar nada mas?

Voy a descargarme la imagen y ha restaurarla, haber que tal...

Muchas gracias por tus comentario Eduardo!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

matar un proceso

Publicado por Eduardo (11 intervenciones) el 25/03/2014 11:08:58
Si, esa opción existe y ya la tengo puesta en el script de python:
1
advmenu -cfg /home/pi/.advance/advmenu.rc
pero nada. También he probado con
1
advmenu -cfg /home/pi/.advance/prueba
que lo que hace es, si no existe el archivo de configuración "prueba", crear uno con todas las opciones por defecto, pero tampoco: sigue dando el mismo error.

Lo curioso es que desde línea de comandos todo funciona perfectamente, y se supone que en el script estoy haciendo lo mismo. No se, se me agotan las ideas...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

matar un proceso

Publicado por Eduardo (11 intervenciones) el 25/03/2014 11:13:24
Efectivamente, conectas el interface al puerto usb de la Raspberry y el joystick y botones al interface mediante los cables fastom. Luego hay que configurar el emulador (sencillo) y... a jugar!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

matar un proceso

Publicado por Eduardo (11 intervenciones) el 26/03/2014 14:32:54
Nada que no hay manera. He reinstalado todo con la nueva versión del PiMame y sigue igual. Una pregunta ¿no es posible, como planteaba al principio, enviar pulsaciones de teclas en el script?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar