Je cherche à lire les données de /dev/input/mice dans un programme en python. Après documentation, j'ai trouvé le format des données du fichier /dev/input/mice, et j'ai un programme en C qui lit très bien le fichier mais en python, je n'y arrive pas...
Voici le programme en C:
#include
#include >stdlib.h<
#include >math.h<
main()
{
FILE *fmouse;
double dx, dy;
double distance;
char bytes_read[5];
int left_pressed;
left_pressed = 0;
fmouse = fopen( "/dev/input/mice","r" );
dx = 0;
dy = 0;
while(!left_pressed) {
fread( bytes_read, sizeof(char), 3, fmouse);
left_pressed = bytes_read[0] & 1;
dx = dx + (double)bytes_read[1];
dy = dy + (double)bytes_read[2];
printf("x is %f\n", dx);
printf("y is %f\n", dy);
}
fclose(fmouse);
}
J'utilise en fait les deux capteurs d'une souris USB démontée pour mesurer la ratation de deux moteurs électriques dans un robot.
Est-ce que quelqu'un aurait une idée pour écrire un programme similaire en python?
Merci
# Les droits roots ?
Posté par dkremer . Évalué à 2.
En deuxième, le programme n'est pas complet, car il manque des en-têtes.
Il y a une balise code pour mieux présenter les programmes.
Tu peux aussi mettre des commentaires, c'est sympa à lire dans un programme.
[^] # Re: Les droits roots ?
Posté par yellowiscool . Évalué à 2.
Sinon, c'est vrai qu'avec de l'indentation ce serait mieux :-)
Envoyé depuis mon lapin.
[^] # Re: Les droits roots ?
Posté par nakan (site web personnel) . Évalué à 1.
En fait, je suis en train de créer un robot, et toute l'intelligence est écrite en python. J'utilise les capteurs de déplacement X et Y d'une souris à boule USB pour mesurer l'avancement de chaque roue, d'ou mon besoin.
Le programme en C, je l'ai trouvé en partie sur le net, je n'ai fait que de le modifier pour mes besoins, mais comme tout le reste tourne en python, je voulais aussi intégrer cette partie là dans mon programme.
Navré pour l'indentation et le format.
[^] # Re: Les droits roots ?
Posté par Kerro . Évalué à 2.
# Transcription naïve
Posté par MsieurHappy . Évalué à 2.
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
def shift(c):
n = ord(c)
return n if n <= 128 else n - 256
def main():
try:
fmouse = open("/dev/input/mice", "r")
left_pressed = 0
dx = 0.0
dy = 0.0
while not left_pressed:
bytes_read = fmouse.read(3)
left_pressed = ord(bytes_read[0]) & 1
dx = dx + shift(bytes_read[1])
dy = dy + shift(bytes_read[2])
print "x is", dx
print "y is", dy
finally:
fmouse.close()
if __name__ == "__main__":
main()
[^] # Re: Transcription naïve
Posté par nakan (site web personnel) . Évalué à 1.
[^] # avec le module struct
Posté par solsTiCe (site web personnel) . Évalué à 2.
import struct
f = open('/dev/input/mice')
left_pressed = 0
dx,dy = 0,0
while not left_pressed:
bytes_read = f.read(3)
(l,x,y) = struct.unpack('3b', bytes_read)
left_pressed = l & 1
dx += x
dy += y
print 'x = %d, y = %d' % (dx,dy)
f.close()
p.s.: je sais pas comment faire pour que mes tab(espaces) soient respectés.
je vois pas l'intérêt d'utiliser des doubles dans le code original en C.
[^] # Re: avec le module struct
Posté par MsieurHappy . Évalué à 1.
Pour les espaces insécables, j'ai simplement mis des . Je ne sais pas si il y a une autre méthode.
ce qui donne un joli (python2.6-isé)
import struct
with open('/dev/input/mice') as f:
left_pressed = 0
dx,dy = 0,0
while not left_pressed:
bytes_read = f.read(3)
(l,x,y) = struct.unpack('3b', bytes_read)
left_pressed = l & 1
dx += x
dy += y
print 'x = %d, y = %d' % (dx,dy)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.