Redy y sus ‘marcianitos’

Como monté mi propia máquina de marcianitos

Llave de control paterno

Posted by Redy Rodriguez en 22 \22\UTC enero \22\UTC 2008

Como entre las roms de mame tengo algunas de juegos para adultos, he pensado en poner una llave a la maquinita que no permita jugar a esos juegos si no está activada.

No conozco ningún frontend con esa opción. El wah!cade no la tiene, pero se me ocurrió una forma sencilla de implementarla:

Primero el hardware: Como no quiero gastar más botones del teclado para la llave, se me ocurrió usar el puerto serie (ya que mi ordenador tiene dos, y desde un script en bash puedo consultar fácilmente el estado de los pines de un puerto serie con statserial.

La llave consistirá en un contacto que se cierra entre los pines 7 y 8 (conector db9) del puerto serie, que son CTS y DCD. La patilla CTS es de salida y el ordenador la pone a uno normalmente siempre, DCD es de entrada y el modem la pondría a 1 cuando detecta portadora. En nuestro caso estará a uno cuando la llave cierre el contacto entre CTS y DCD y a cero si el contacto de la llave está abierto.

¿Como lo compruebo? Si llamamos a statserial con el argumento -d nos devuelve un número que interpretado bit a bit sería

+---+---+---+---+---+---+---+---+---+
| 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+---+---+---+---+---+---+---+---+---+
|DSR|RI |DCD|CTS|XXX|XXX|RTS|DTR|XXX|
+---+---+---+---+---+---+---+---+---+

Así que DCD es el bit 6 (de peso 20 en hexadecimal). Haciendo un and lógico del número obtenido con 0x20 obtendremos 0 si el DCD está desactivado (llave abierta) o un valor positivo si está cerrada. Así que un simple if ya nos permite conocer el estado de la llave:

if (( $(statserial -d /dev/ttyS1) & 0x20)) then

Ahora sólo nos queda saber que juegos hay que censurar: En el fichero catver.ini todas las roms que son de juegos para adultos contienen la cadena ‘*Mature*’ en la categoría. Así que solo hay que hacer una búsqueda con grep del nombre de la rom (que siempre se pasa como último parámetro al script) en el fichero catver.ini y ver si está la palabra ‘*Mature*’. Si está comprobamos la llave, y si no está activada, sacamos un mensaje durante cinco segundos -podría hacerlo de muchas maneras pero lo hice con zenity- y cancelamos el script. En cualquier otro caso llamamos al auténtico ejecutable de xmame. Como tengo varios (xmame.x11 xmame.SDL) se me ocurrió hacer un solo script para todos en ~/bin y enlaces simbólicos con el mismo nombre de los ejecutables de mame que están en /usr/game/ luego solo tengo que quitar el path de $0 y ponerle un /usr/game/ pra llamar al ejecutable. El script enterito queda así:

#! /bin/bash
CATEGORY="$(grep -i "^${!#}=" ~/emulators/mame/catver.ini)"
if echo $CATEGORY |grep -qi "*mature*"
then
  if !(( $(statserial -d /dev/ttyS1) & 0x20))
  then
     echo Juego de adultos >&2
     zenity --warning --text "Este es un juego para adultos.\n\n\nPara poder jugar inserte la llave"  &
     sleep 5 ; kill %%
     exit 1
  fi
fi
# ahora llamo al mismo ejecutable que el nombre del script pero en /usr/games/
/usr/games/${0##*/} "$@"

¿Simple no?

pantallazo.png

Así es más o menos como queda (bueno sin las barras de gnome, es que lo lancé desde gnome para poder capturar el pantallazo, y en este ordenador no tengo gimp para quitárselas).

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: