2011-10-06 18 views
10

Intento controlar el mouse en Linux. Xlib parece a las obras, pero cuando trato de usarlo con OpenCV, continúa repitiéndose:¿Cómo controlar el movimiento del mouse en Linux?

Resource temporarily unavailable 

así que decido escribir "/ dev/psaux". El código es el siguiente:

#include <unistd.h> 
#include <string.h> 
#include <stdio.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 


int main() { 
    unsigned char a[5]={0, 0xff, 0, 0x28, 0xff}; 
    int fp = open ("/dev/psaux", O_WRONLY); 
    if(!fp)printf("open error:%s\n", strerror(errno)); 
    for(int i = 0; i < 10; i++) 
     printf("write:%d\t\t%s\n", write(fp, a, 5), strerror(errno)); 
    close(fp); 
    return 0; 
} 

compilarlo con:

gcc my_psaux.c -o my_psaux -std=gnu99 -g 

Ejecutar y obtener

$sudo ./my_psaux 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 
write:5 Success 

Sin embargo, el ratón no se mueve. Luego abro una nueva terminal, escribo "sudo cat/dev/psaux" y ejecuto "my_psaux". Pero yo no gano nada. No hay nada escrito en "/ dev/psaux"?

¿Alguien podría ayudarme?

Si este no es un buen método para controlar el mouse, ¿podría alguien decirme otro?

+4

A no ser que se está esperando el ratón para mover físicamente, no creo que escribiendo al puerto PS/2 es la forma correcta de hacerlo ... – Blindy

+0

Gracias por su comentario . Solía ​​pensar así. Sin embargo, tal como dijo @R .., _es algo más parecido a un terminal_. En otras palabras, aún no hemos llegado al mouse. – thundertrick

+0

Lo dudo, todavía suena * muy * confundido ... – Blindy

Respuesta

13

Muchas gracias a @R .. por recordarme algunas otras formas en lugar de /dev/psaux

Así que intentaron /dev/input/mouse* y /dev/input/event*

Mediante el uso de

cat /proc/bus/input/devices 

consigo este :

I: Bus=0003 Vendor=0461 Product=4d81 Version=0111 
N: Name="USB Optical Mouse" 
P: Phys=usb-0000:00:1d.0-1/input0 
S: Sysfs=/devices/pci0000:00/0000:00:1d.0/usb6/6-1/6-1:1.0/input/input10 
U: Uniq= 
H: Handlers=mouse2 event10 
B: EV=17 
B: KEY=70000 0 0 0 0 0 0 0 0 
B: REL=143 
B: MSC=10 

Después de la prueba, solo funciona /dev/input/event10. El código es el siguiente:

#include <stdio.h> 
#include <unistd.h> 
#include <linux/input.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/time.h> 

int main() { 
    struct input_event event, event_end; 

    int fd = open("/dev/input/event10", O_RDWR); 
    if (fd < 0) { 
    printf("Errro open mouse:%s\n", strerror(errno)); 
    return -1; 
    } 
    memset(&event, 0, sizeof(event)); 
    memset(&event, 0, sizeof(event_end)); 
    gettimeofday(&event.time, NULL); 
    event.type = EV_REL; 
    event.code = REL_X; 
    event.value = 100; 
    gettimeofday(&event_end.time, NULL); 
    event_end.type = EV_SYN; 
    event_end.code = SYN_REPORT; 
    event_end.value = 0; 
    for (int i=0; i<5; i++) { 
    write(fd, &event, sizeof(event));// Move the mouse 
    write(fd, &event_end, sizeof(event_end));// Show move 
    sleep(1);// wait 
    } 
    close(fd); 
    return 0; 
} 
2

El mouse no es un dispositivo loopback/echo. Es más como una terminal. ¿Esperaría escribir datos en un terminal (que aparecería en la pantalla) para hacer que los mismos caracteres vuelvan a usted como entrada? Lo mismo aplica para el mouse; el único punto por escrito es enviar secuencias de escape que cambien su modo (por ejemplo, el protocolo utilizado o la resolución).

Si desea "controlar" el mouse, debe inyectar los eventos de otra forma o proporcionar un fifo (named pipe) o pseudo-tty en lugar de /dev/psaux para que el sistema de entrada pueda leer. Sin embargo, esta es probablemente una forma bastante equivocada de hacer las cosas ...

Si explica por qué necesita controlar el mouse, quizás podríamos ofrecerle mejores enfoques alternativos a lo que está tratando de hacer.

+0

Gracias por responder. Pipe suena una buena idea. Estoy tratando de hacer algo (como kinect) para controlar el movimiento del mouse. Xlib ha sido probado pero falló. ¿Cualquier sugerencia? – thundertrick

+0

@R ..Al contrario de lo que respondiste, los dispositivos/dev/input/event * hacen eco de todo lo que les escribes si es compatible con los eventos admitidos por el dispositivo. Una llamada de escritura() a un dispositivo/dev/input/event * inyecta los eventos escritos, como si el evento proviniera del propio dispositivo: consulte http://lxr.free-electrons.com/source/drivers/input/evdev .C# L457 – fons

+0

Interesante. No he verificado esto, pero parece ser un comportamiento específico de evdev. Ciertamente, el nodo del dispositivo 'psaux' no se comportó de esa manera; Permitió que los comandos que controlan las configuraciones del dispositivo (como ppp) se escriban en el mouse. –

Cuestiones relacionadas