2011-01-31 10 views
10

Sé que Linux proporciona datos de cumplidos de 2 bits de 9 bits de/dev/input/mice. También sé que puede obtener esos datos a través de/dev/hidraw0, donde hidraw es su dispositivo USB que proporciona datos brutos del HID. Sé que los datos enviados son el delta del movimiento (desplazamiento) en lugar de la posición. Por el puedo también puedo ver datos de galimatías a través de "cat/dev/input/mice". Mi pregunta es:¡Obtén los deltas del mouse con Python! (en Linux)

¿Puede decirme usando el lenguaje Python cómo puedo leer esta información? Realmente prefiero obtener esa información en enteros simples. Pero ha resultado difícil. El verdadero problema es leer los malditos datos. ¿Hay alguna manera de leer bits y hacer aritmética de bit? (En la actualidad no estoy preocupada por asuntos relacionados con el usuario raíz. Por favor, asuma el script se ejecuta en la raíz.)

(Mi referencia principal era http://www.computer-engineering.org/ps2mouse/)

Respuesta

10

Estoy en un dispositivo básico y no tengo acceso a X o ... así que event.py no funciona.

Así que aquí es mi simple parte de código de decodificación de interpretar de "obsoleto" '/ dev/input/mice':

import struct 

file = open("/dev/input/mice", "rb"); 

def getMouseEvent(): 
    buf = file.read(3); 
    button = ord(buf[0]); 
    bLeft = button & 0x1; 
    bMiddle = (button & 0x4) > 0; 
    bRight = (button & 0x2) > 0; 
    x,y = struct.unpack("bb", buf[1:]); 
    print ("L:%d, M: %d, R: %d, x: %d, y: %d\n" % (bLeft,bMiddle,bRight, x, y)); 
    # return stuffs 

while(1): 
    getMouseEvent(); 
file.close(); 
+3

Tenga en cuenta que necesita ejecutar esto como root. – srlm

+0

He estado buscando una estructura que defina estos 3 bytes, pero tal vez no exista. Gracias por este ejemplo. – JustinB

+0

debe ser un tipo de cadena en esta línea: 'button = ord (str (buf [0]) [0]);' Pero, ¿cómo usarlo sin derechos de root? –

2

Sí, Python puede leer un archivo en formato binario. Simplemente use un indicador 'b' cuando abre un archivo, p. open('dev/input/mice', 'rb').

Python también es compatible con todas las típicas operaciones aritméticas bit a bit: turnos, inversiones, bit a bit AND, OR, XOR, y no, etc.

Probablemente estaría mejor servido mediante el uso de una biblioteca para procesar estos datos, en lugar de hacerlo por tu cuenta, sin embargo.

+0

No se olvide de [ 'struct'] (http: //docs.python .org/library/struct.html). – ephemient

+0

Gracias por su pronta respuesta. Una pregunta a través de dev/input/mice cambia continuamente ya que la posición del mouse cambia continuamente ¿hay alguna manera de leerlo en tiempo real? – JohnRoach

+0

@JoRoRoach No estoy seguro. Sin embargo, en general no quiere leer datos que cambian a medida que los lee. Nuevamente, la mejor idea sería usar una biblioteca que haga todo el trabajo por usted –

3

Los datos del sistema de entrada aparecen como estructuras, no como números enteros simples. El dispositivo de los ratones está en desuso, creo. El método preferido son las interfaces del dispositivo de eventos, donde también se pueden obtener los eventos de entrada del mouse (y otros). Escribí un código que hace esto, el Event.py module Puede usar eso, o comenzar desde allí.

+0

¡Guau! Buen código! Actualmente estoy investigando. Solo una pregunta, ¿cómo se obtiene el movimiento? Puedo ver los códigos del botón del mouse en la línea 307. ¿Me puede dar un pequeño ejemplo de cómo puedo usar esto? – JohnRoach

+0

@john ¡Gracias! En este momento no tengo un ejemplo específico de mouse, pero veré si puedo proporcionar uno. Por ahora, hay un ejemplo concreto de interfaz de dispositivo para un [mando de PowerMate] (http://code.google.com/p/pycopia/source/browse/trunk/core/pycopia/OS/Linux/powermate.py), que es un dispositivo de movimiento relativo similar. La autoprueba en la parte inferior es otro ejemplo. Luego, hay una [pequeña aplicación] (http://code.google.com/p/pycopia/source/browse/trunk/core/pycopia/OS/Linux/mastervolume.py) creada con eso que lo usa como un volumen control con pantalla en pantalla. – Keith

+0

Acabo de enterarme de que me enviaste una respuesta. Lo estaré comprobando. ¿Has podido encontrar un ejemplo específico de ratón? – JohnRoach

Cuestiones relacionadas