2011-01-31 14 views
10

Wiem, że Linux podaje 9-bitowe 2-komplementy danych z/dev/input/mice. Wiem też, że możesz uzyskać te dane za pośrednictwem/dev/hidraw0 gdzie hidraw jest twoim urządzeniem USB przekazującym surowe dane z HID. Wiem, że wysyłane dane to delta ruchu (przesunięcia), a nie pozycja. Przez nią mogę również przeglądać bełkotliwe dane za pośrednictwem "cat/dev/input/mice". Moje pytanie brzmi:Pobierz deltę myszy za pomocą Pythona! (w Linuksie)

Czy możesz mi powiedzieć, używając języka Python, jak mogę odczytać te dane? Naprawdę wolę uzyskać te dane, jak w prostych liczbach całkowitych. Ale okazało się trudne. Prawdziwym problemem jest czytanie tych przeklętych danych. Czy istnieje sposób na odczytywanie bitów i robienie arytmetyki bitowej? (Obecnie nie jestem martwić się kwestiami związanymi użytkownik root. Należy założyć, że skrypt jest uruchamiany w korzeniu).

(My głównym punktem odniesienia była http://www.computer-engineering.org/ps2mouse/)

Odpowiedz

10

Jestem na podstawowym urządzeniu i nie mam dostępu do X lub ... więc event.py nie działa.

Więc oto moja prostsza część kodu dekodowania interpretować z "przestarzałe" '/ 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

Pamiętaj, że musisz uruchomić to jako root. – srlm

+0

Szukałem struktury, która definiuje 3 bajty, ale może nie istnieje. Dzięki za ten przykład. – JustinB

+0

musi być typem ciągu w tym wierszu: 'button = ord (str (buf [0]) [0];' 'Ale jak z niego korzystać bez uprawnień roota? –

2

Tak, Python może odczytać plik w postaci binarnej. Po otwarciu pliku wystarczy użyć flagi 'b'open('dev/input/mice', 'rb').

Python obsługuje wszystkie typowe operacje arytmetyczne bitowe: zmiana, inwersje, logiczną AND, OR, XOR, a nie, itp

Ty pewnie lepiej podawane przy użyciu biblioteki do przetwarzania tych danych, zamiast robić to na własną rękę.

+0

Nie zapomnij o [ 'struct'] (http: //docs.python .org/library/struct.html). – ephemient

+0

Dziękujemy za szybką odpowiedź. Jedno pytanie, czy dev/input/mice ciągle się zmieniają, ponieważ pozycja myszy ciągle się zmienia, czy istnieje sposób na odczytanie jej w czasie rzeczywistym? – JohnRoach

+0

@JohnRoach Nie jestem pewien. Generalnie nie chcesz czytać danych, które zmieniają się podczas czytania. Ponownie, najlepszym pomysłem byłoby skorzystanie z biblioteki, która wykonuje całą ciężką pracę dla Ciebie. –

3

Dane z systemu wejściowego są wyświetlane jako struktury, a nie proste liczby całkowite. Uważam, że urządzenie myszy jest przestarzałe. Preferowaną metodą są interfejsy urządzeń zdarzeń, w których można również uzyskać zdarzenia wejściowe myszy (i inne). Napisałem kod, który to robi, Event.py module Możesz tego użyć, lub zacznij od tego.

+0

Wow !! Niezły kod! Obecnie przeglądam to. Tylko raz pytanie Jak uzyskać ruch widzę kody przycisków myszy w linii 307. Czy możesz dać mi krótki przykład na to, jak mogę tego użyć? – JohnRoach

+0

@john Dzięki! W tej chwili nie mam konkretnego przykładu myszy, ale zobaczę, czy mogę go dostarczyć. Na razie istnieje konkretny przykład interfejsu urządzenia dla pokrętła [PowerMate] (http://code.google.com/p/pycopia/source/browse/trunk/core/pycopia/OS/Linux/powermate.py), który jest podobnym urządzeniem ruchu względnego. Autotest na dole to kolejny przykład. Następnie jest dostępna aplikacja [small app] (http://code.google.com/p/procopia/source/browse/trunk/core/pycopia/OS/Linux/mastervolume.py), która używa jej jako woluminu sterowanie z wyświetlaczem ekranowym. – Keith

+0

Właśnie dowiedziałem się, że wysłałeś mi odpowiedź. Sprawdzę to. Czy byłeś w stanie znaleźć konkretny przykład myszy? – JohnRoach

Powiązane problemy