Unterschied zwischen /dev/input/mouse0 und /dev/input/mice

Unterschied zwischen /dev/input/mouse0 und /dev/input/mice

Ich arbeite mit einem Maus-USB-Treiber und weiß wirklich nicht, wie ich die von /dev/input/mouse0und gesendeten Informationen unterscheiden und verwenden soll./dev/input/mice

Nach einigen Suchen bei Google fand ich diesen Code zur Verwendung/dev/input/mice

int fd, bytes;
unsigned char data[4];

const char *pDevice = "/dev/input/mice";

// Open Mouse
fd = open(pDevice, O_RDWR);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pDevice);
    return -1;
}

int left, middle, right;
signed char x, y;

// Read Mouse
bytes = read(fd, data, sizeof(data));

if(bytes > 0)
{
    left = data[0] & 0x1;
    right = data[0] & 0x2;
    middle = data[0] & 0x4;

    x = data[1];
    y = data[2];
    printf("x=%d, y=%d, left=%d, middle=%d, right=%d\n", x, y, left, middle, right);

    if(left)
        return left;
    if(right)
        return right;
    if(middle)
        return middle;
}

return 0;

Dieses Programm funktioniert, hat aber keine Informationen zum Scrollrad erhalten.

Ich konnte ein Programm finden, das/dev/input/event0

int fd;
struct input_event ev
const char* pFile = "/dev/input/event0";

fd = open(pFile, O_RDONLY);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pFile);are
    return -1;
}

read(fd, &ev, sizeof(ev));
std::cout << "type : " << ev.type << "  code : " << ev.code << "  value : " << ev.value << std::endl;

close(fd);

return 0;

Bei diagonalen Bewegungen tritt jedoch ein Problem auf, da in dieser Datei immer nur eine Koordinate gleichzeitig gespeichert wird und die X-Koordinate Vorrang vor der Y-Koordinate hat. Daher ist es ziemlich ärgerlich, wenn Sie die Maus auf der Y-Achse bewegen möchten.

Ich habe keinen verwendbaren Code gefunden /dev/input/mouse0. Welche Informationen sind also in dieser Datei gespeichert?

Meine Fragen sind:

  1. Welche Informationen werden in gespeichert /dev/input/mouse0?
  2. Wie kann ich alle Mausinformationen lesen, ohne 2 Dateien zu öffnen und ohne dass ein Prioritätsproblem auftritt (Rad-Scrollen + Bewegung der X-/Y-Achse)?

Antwort1

DerLinux Input Subsystem Userspace-API-Dokumentationbeantwortet Ihre Fragen. Im Allgemeinen /dev/input/werden alle Dateien bereitgestellt vonEreignishandlerdie Geräteereignisse an den Benutzerbereich verteilen.

Was sind /dev/input/mouse0 und /dev/input/mice?

Von demEinführung(wichtige Teile von mir hervorgehoben)

1.3.1.3. Mausdev

mousedev ist ein Hack, um ältere Programme, die Mauseingaben verwenden, wieder zum Laufen zu bringen. Es nimmt Ereignisse von Mäusen oder Digitalisierern/Tablets entgegen und stellt dem Userland ein Mausgerät im PS/2-Stil (à la /dev/psaux) zur Verfügung.

Mousedev-Geräte in /dev/input (wie oben gezeigt) sind:

crw-r--r--   1 root     root      13,  32 Mar 28 22:45 mouse0
crw-r--r--   1 root     root      13,  33 Mar 29 00:41 mouse1
crw-r--r--   1 root     root      13,  34 Mar 29 00:41 mouse2
crw-r--r--   1 root     root      13,  35 Apr  1 10:50 mouse3 ... 
...
crw-r--r--   1 root     root      13,  62 Apr  1 10:50 mouse30
crw-r--r--   1 root     root      13,  63 Apr  1 10:50 mice

Jedes Mausgerät ist einer einzelnen Maus oder einem einzelnen Digitalisierer zugeordnet, mit Ausnahme der letzten - Mäuse. Dieses einzelne Zeichengerät wird von allen Mäusen und Digitalisierern gemeinsam genutzt, und selbst wenn keines angeschlossen ist, ist das Gerät vorhanden. Dies ist beim Hotplugging von USB-Mäusen nützlich, sodass ältere Programme, die kein Hotplugging unterstützen, das Gerät auch dann öffnen können, wenn keine Mäuse vorhanden sind. [...]

Mousedev generiert entweder PS/2-, ImPS/2- (Microsoft IntelliMouse) oder ExplorerPS/2-Protokolle (IntelliMouse Explorer), je nachdem, was das Programm, das die Daten liest, wünscht. Sie können GPM und X auf eine dieser Optionen einstellen.Sie benötigen ImPS/2, wenn Sie das Rad einer USB-Maus nutzen möchtenund ExplorerPS/2, wenn Sie zusätzliche (bis zu 5) Tasten verwenden möchten.

...das könnte auch der Grund sein, warum Sie keine Mausrad-Ereignisse sehen. Da es sich um einen „Hack“ für ältere Programme handelt, sollten Sie es nicht verwenden, wenn es nicht unbedingt nötig ist.

Wie kann ich alle Mausinformationen lesen [...]?

Verwenden Sie die entsprechende /dev/input/eventXDatei, die bereitgestellt wird vonAbonnieren(der Eventhandler, nicht zu verwechseln mit dem Xorg-Treiber evdev). Das ist es, was Ihr zweiter Codeausschnitt offensichtlich macht.

...aber was ist mit dem Prioritätsproblem?

Es gibt kein Prioritätsproblem. Laut2.2. Ereigniscodes:

SYN_REPORT:

Wird verwendet, um Ereignisse zu synchronisieren und in Pakete von Eingabedatenänderungen zu trennenzum gleichen Zeitpunkt auftretend. Beispielsweise kann eine Mausbewegung die REL_X- und REL_Y-Werte für eine Bewegung festlegen und dann einen SYN_REPORT ausgeben. Die nächste Bewegung gibt weitere REL_X- und REL_Y-Werte aus und sendet einen weiteren SYN_REPORT.

Da alle aufeinanderfolgenden Ereignisse bis zu einem SYN_REPORTEreignis als gleichzeitig eingetreten angesehen werden können, spielt die Reihenfolge ihrer Meldung keine Rolle.

Zum Beispiel (mithilfedieses ProgrammIch habe auf GitHub gefunden):

time:1528290186.256449  type:EV_REL     code:REL_X      value:-1
time:1528290186.256449  type:EV_REL     code:REL_Y      value:1
time:1528290186.256449  type:EV_SYN     code:SYN_REPORT value:0
time:1528290186.264460  type:EV_REL     code:REL_Y      value:1
time:1528290186.264460  type:EV_REL     code:REL_WHEEL  value:-1
time:1528290186.264460  type:EV_SYN     code:SYN_REPORT value:0

Wie Sie sehen, sind gleichzeitige Ereignisse nicht nur durch SYN_REPORTEreignisse getrennt, sie haben auch denselben Zeitstempel.

Übrigens können Sie auch evtestdie von einem Gerät generierten Ereignisse anzeigen. Den Quellcode finden SieHierwenn Sie daran interessiert sind, wie es funktioniert.

Antwort2

In meinem Fall habe ich versucht, das Mausereignis des Betriebssystems auszuführen. Mein Code app.jswar:

var Mouse = require("./node_modules/node-mouse/mouse");
 
var m = new Mouse();
 
m.on("mousedown",function(event) {
    console.log(event);
});
 
m.on("mouseup",function(event) {
    console.log(event);
});
 
// same as mouseup, but fired after
m.on("click",function(event) {
    console.log(event);
});
 
 
m.on("mousemove", function(event) {
    console.log(event);
});

ich liefnode app.js

also es gibt mir folgenden Fehler

Error: EACCES: permission denied, open '/dev/input/mice'
Emitted 'error' event on Mouse instance at:

also lauf einfach sudo so

node app.js

es gibt nicht den folgenden Fehler

{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 1,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}

verwandte Informationen