Forum Programmation.python Lecture de données de souris

Posté par  (site web personnel) .
Étiquettes : aucune
0
23
nov.
2008
Bonsoir,

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  . Évalué à 2.

    Je ne sais pas comment tu as fait, mais chez moi le périphérique /dev/input/mice est réservé à l'utilisateur root. Donc je ne vois pas comment ce programme peut marcher.

    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  . Évalué à 2.

      Peut-être qu'il est lancé en root.

      Sinon, c'est vrai qu'avec de l'indentation ce serait mieux :-)

      Envoyé depuis mon lapin.

      • [^] # Re: Les droits roots ?

        Posté par  (site web personnel) . Évalué à 1.

        Effectivement, le programme tourne en root.

        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  . Évalué à 2.

      La balise "code" ne restitue pas les indentations. Il faut ruser avec les espaces insécables mais je ne sais plus comment :-(
  • # Transcription naïve

    Posté par  . Évalué à 2.

    Voilà une version en Python qui fonctionne. À lancer avec les droits qui vont bien.

    #! /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  (site web personnel) . Évalué à 1.

      Merci beaucoup. Je vais tester ce soir, mais je sens que ça va beaucoup m'aider.
    • [^] # avec le module struct

      Posté par  (site web personnel) . Évalué à 2.

      moi j'ai utilisé le module struct, bon je sais y'a que 3 valeurs à récupérer, mais il est fait pour ça au lieu de s'amuser avec des ord et autres shift

      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  . Évalué à 1.

        Ah voilà, le module struct ! Hier soir je regardais ctypes sans trouvé mon bonheur. Je n'étais vraiment pas réveillé.

        Pour les espaces insécables, j'ai simplement mis des &nbsp;. 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.