Jugando con el Big Red Button

Durante los últimos meses ha estado rondando por la oficina un Big Red Button, un producto que vende DreamCheeky. Un botón USB con una caja protectora que recuerda mucho a los que se pueden ver en las películas de acción. El jefe –normalmente alguna especie de General en el Gobierno estadounidense- sopesa todas sus opciones mientras se seca el sudor de la frente, y, viéndose encerrado, le dice a su subordinado en un tono ceremonial “Está bien, hazlo”. Este, entonces, después de intentar tragar saliva, levanta lentamente la tapa del botón, lo pulsa, y cierra la tapa de nuevo, con la sensación de que el último puente ha sido quemado con ese sencillo acto. De que la opinión pública no les perdonará sus crímenes, pero ellos sabían que no quedaba otra solución.

big-red-button

Ilustración 1, Big Red Button

El caso es que cuando tienes a mano un botón con un aspecto tan peligroso, lo programas para que haga cosas peligrosas. Bueno, todo lo peligrosas que se pueden hacer sin romper nada. Nada importante, al menos.

Resulta que el software que distribuye DreamCheeky con el Big Red Button –además de requerir que te registres para poder descargarlo–, deja bastante que desear. Es, en realidad, algo hecho en Flash que te permite escoger entre abrir una página web (¡para que parezca que estás trabajando en el trabajo! Alucinante, ¿cierto?), hacer sonar una explosión, y un par de cosas más que realmente no tienen sentido alguno. El valor del producto desde luego no está en el software que se distribuye con él, pero por quince dólares no vamos a pedirle peras al olmo.

Big Red Button is for every stressed out office dweller… and anyone who likes to dodge work tasks from time to time. Functions include “Boom,” to take out frustration by virtually destroying your computer, “I’m Working,” a working spreadsheet so your boss knows you mean business even if you don’t, “Punch Up,” to upload a photo of your office foe and wallop!, “Webkey,” takes you to your favorite url, and “Take-a-Break,” because you deserve it.

Por suerte, el botón ha despertado el interés de más de una persona, e Internet es un lugar lleno de recursos. Como el aparato tiene una funcionalidad limitada, y es, al fin y al cabo, USB, se puede programar libremente. Simplemente hay que escuchar a las señales adecuadas, y, cuando se recibían, actuar en consecuencia.

El Big Red Button es un dispositivo HID –Human Interface Device-. El estándar HID define dos componentes, el host y el dispositivo. El segundo es el aparato que interactúa directamente con el humano -en nuestro caso, el producto del que hablo-. El host es quien se comunica con el device y recibe como datos de entrada las acciones llevadas a cabo sobre este. También es posible que el host envíe datos de salida al device, y que este se los comunique al humano (vibración, luz, sonido…), pero el Big Red Button carece de feedback. Dos ejemplos comunes de este tipo de dispositivo los conocemos todos, ratón y teclado.

Si vamos a trabajar con .NET, podríamos escuchar directamente con la HidLibrary. Sólo necesitamos conocer el vendor id y el product id del Big Red Button (0x1D34 y 0x000D respectivamente), así como los bytes que hay que escribir en el dispositivo (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02) para que este nos devuelva su estado actual:

Unknown = 0x00
Errored = 0x01
LidClosed = 0x15
ButtonPressed = 0x16
LidOpen = 0x17

Sin embargo, alguien ya se ha encargado de ello, así que vamos a tratar de re-inventar la rueda lo menos posible y vamos a utilizar una librería que envuelva todo lo necesario para trabajar con el Big Red Button, elaborada a su vez sobre la HidLibrary ya comentada anteriormente. El wrapper del que hablo es DreamCheeky.BigRedButton (diría que el nombre está siendo usado sin permiso), está disponible en GitHub, y si estamos trabajando en Visual Studio lo podremos descargar utilizando la terminal de NuGet con el siguiente comando.

> Install-Package DreamCheeky.BigRedButton

Una vez tengamos disponible esto, solo nos queda decidir qué queremos que haga nuestro gran botón. Y resulta que a mí se me había ocurrido algo divertido. ¡Matemos procesos al azar! Unos cuantos toques de botón, y el ordenador se quedará para el reinicio. ¿Barra de tareas? No la necesitas. ¿El documento de Word super-impor-tante que en el que estás trabajando? Adióooooos.

La forma de hacer esto es muy sencilla. Todo lo que necesitaremos está bajo los namespaces System.Diagnostics y System.ComponentModel. De momento solo lo he probado en Windows con .NET, pero a lo mejor está portado en su totalidad a Mono y el siguiente ejemplo funciona también bajo GNU/Linux y OS X.

Podemos conseguir un array de los procesos en ejecución mediante la llamada Process.GetProcesses(). Seleccionaremos uno al azar, y sobre él ejecutaremos Kill(). Seguidamente, esperaremos a que termine con la llamada WaitForExit(). Podría suceder que no tengamos los privilegios suficientes como para matar ese proceso. En ese caso, saltaría una Win32Exception. Lo que he hecho en este caso es llevar la cuenta de un número máximo de reintentos. Si lo que queremos es matar un proceso, y el escogido no se deja, repitamos de nuevo la operación a ver si hay más suerte.

Como no quiero dependencias hacia arriba de System.Diagnostics (y mandar hacia arriba la representación de un proceso que ya está muerto no me parece lo más adecuado), he añadido también un struct en el que enviaremos a quien haya llamado al mataor la información de qué proceso se ha terminado.

La librería DreamCheeky.BigRedButton nos permite saber cuándo se ha pulsado el botón, y cuándo se ha abierto o cerrado la tapa. Sin embargo, solo me interesa la primera acción.

Como BigRedButton es una clase IDisposable, la rodearemos en un using para que sea liberada tan pronto como deje de ser útil. Por último, añadiremos el EventDelegate necesario al evento ButtonPressed, y ¡estamos listos!

processboomer

Ilustración 2, el proyecto en funcionamiento

El código completo está, cómo no, disponible en GitHub.

Deja un comentario