Wie sollte man eine Tastatur/Maus/Touchscreen abfragen ...

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Wie sollte man eine Tastatur/Maus/Touchscreen abfragen ...

Beitrag von alexander_ro » 16.02.2017 09:52:54

Hi Mädels ... Jungs ... :-)

Für eine Benutzer KI Schnittstelle baue ich gerade so was ähnliches wie eine Linux-Shell nur soll die mit Hardware beschleunigter 3D-Grafik arbeiten können. Damit die KI Illustrationen besser anzeigen kann und die CPU vom Grafischen Output entlastet wird. Dazu benutze ich Mesa und OpenGL ES 2.0 (die Hardware kann keine neuere Version) und C++. Die Buchstaben Bitmaps generiert mir FreeType. Soweit was es tun soll und auch schon tut. Ich will möglichst nicht viele Abhängigkeiten zu anderen Paketen haben aber auch nicht alles neu erfinden. Deshalb kommt auch Freetype zum Einsatz. Laufen soll das Programm dann wie eine virtuelle Shell die beim init automatisch gestartet wird.

Was mir noch fehlt ist die Abfrage der Tastatur/Maus/Touchscreen. Man findet dazu viel im Internet aber zum Teil eignen sich diese nicht oder sind veraltet.

Tastatur und Sprach Unterstützung ist jetzt nicht das wo ich mich besonders gut auskenne. Meine Linuxe sind alle so konfiguriert das sie UTF-8 benutzen. Gefunden habe ich mehrere Sachen: std::cin oder std::wcin die geben aber schon eine bestimmte Funktionsweise vor. Das ganze wollte ich so nicht. Was ich auch noch entdeckt habe ist die Event Schnittstelle des Linux Kernels. Macht dann der Kernel auch die Umsetzung für z.B. Deutsche oder Englische Tastatur oder muss ich das dann selber Programmieren?

Oder kennt Ihr noch was besseres?

Viele Grüße
Alexander

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von eggy » 16.02.2017 22:44:13

Auch wenns Deinem "möglichst wenige Abhängigkeiten"-Kriterium nicht ganz entspricht, schau Dir doch mal an was man mit Qt alles machen kann,
z.B. "Touchkeyboard" https://youtu.be/yIsQHinTw00

alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 17.02.2017 12:44:47

Hübsch keine Frage. Aber kann man Qt verwenden wenn man keinen normalen Desktop (KDE, Gnome, Xfce) installiert hat?

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von MSfree » 17.02.2017 13:15:14

alexander_ro hat geschrieben:Aber kann man Qt verwenden wenn man keinen normalen Desktop (KDE, Gnome, Xfce) installiert hat?
Ja und noch viel mehr. Qt ist plattformübergreifend, Anwendungen, die mit Qt unter Linux entwickelt worden sind, laufen durch neukompilieren sogar unter MacOSX und Windows, wo es auch kein Gnome, KDE etc gibt.

alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 17.02.2017 13:27:41

Schon aber bei Mac und Windows gibt es einen Desktop bei mir nicht nur EGL Mesa was man hat so braucht um OpenGL zum laufen zu bekommen. Kennst Du da vielleicht ein Beispiel irgendwo dazu? Ich habe nur welche gefunden die unter den bekannten Desktop Systemen laufen.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von MSfree » 17.02.2017 13:58:47

alexander_ro hat geschrieben:Ich habe nur welche gefunden die unter den bekannten Desktop Systemen laufen.
OpenGL funktioniert sobald du einen X11-Server gestartet hast, zumindest solange die Graphikkarte OpenGL unterstützt. Von der Desktopumgebung ist das doch völlig unabhängig.

alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 17.02.2017 15:29:45

Ein X11-Server ist ja schon fast ein Desktop ... ;-)
Bei mir läuft aber kein X11-Server ich habe das so gemacht: https://github.com/robclark/kmscube
Sieht bei mir ein bisschen anders noch aus aber meins habe ich noch nicht in mein Git Repo gestellt. Deshalb kann man das noch nicht öffentlich anschauen.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von MSfree » 17.02.2017 15:41:26

alexander_ro hat geschrieben:Bei mir läuft aber kein X11-Server
Dann kannst du Qt auch knicken. Das setzt X11 (oder Windows oder OSX) voraus.

Benutzeravatar
schorsch_76
Beiträge: 2597
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von schorsch_76 » 17.02.2017 16:26:33

Unter linux ist das devinput system für dich da. Es kann auch über "In Kernel Keymaps" übersetzten.

[1] https://www.kernel.org/doc/html/latest/ ... input.html

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von eggy » 17.02.2017 17:55:39

MSfree hat geschrieben:
alexander_ro hat geschrieben:Bei mir läuft aber kein X11-Server
Dann kannst du Qt auch knicken. Das setzt X11 (oder Windows oder OSX) voraus.
Jein, bestimmte Module ja, andere nicht.

Und in der 5.8 kann man wohl direkt auf nen Wayland-Unterbau zugreifen, auf Youtube gabs nen Kurzvortrag dazu, http://blog.qt.io/blog/2016/06/13/new-c ... qtwayland/

Und dann gibts auch noch sowas
http://doc.qt.io/QtForDeviceCreation/qt ... -b2qt.html
und ganz neu wohl auf ne QML Version auf nem Minimal-Android aufsetzend

Benutzeravatar
schorsch_76
Beiträge: 2597
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von schorsch_76 » 17.02.2017 21:54:48

alexander_ro hat geschrieben:Hstd::cin oder std::wcin die geben aber schon eine bestimmte Funktionsweise vor. Das ganze wollte ich so nicht.
Du könntest auch die Posix Schnittstelle nutzen fd0/1/2 und darauf mit Posix syscalls direct operieren. Das hätte nur posix als Abhängigkeit ;)

Hier wäre auch ein gutes Online BUch das ich auch in "echt" habe. Sehr gutes Buch was Posix angeht :)
The Linux Programming Interface by Michael Kerrisk

http://blog.man7.org/2009/07/whats-book-about.html
http://www.man7.org/tlpi/index.html

alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 18.02.2017 07:45:27

Macht denn stdin etwas anderes als std::cin. Ich dachte das tut von der Funktionsweise das gleiche. Die drei stdin, stdout und stderr werden vom Kernel den Prozessen zur Verfügung gestellt?

Die evdev Schnittstelle ist glaube die Userland Seite von dem Kerneltreiber Teil den Du oben verlinkt hast.
https://en.wikipedia.org/wiki/Evdev

Das habe ich gerade auch noch entdeckt: http://thiemonge.org/getting-started-with-uinput

Das Buch sieht interessant aus aber ob es mir jetzt dabei viel hilft bin ich mir nicht sicher. Ich habe so ein ähnliches aber nicht wirklich viel hilfreiches gefunden. Scheint so als ob keiner Tastatur Eingaben in seinen Programmen benötigen würde ... :-(

Benutzeravatar
schorsch_76
Beiträge: 2597
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von schorsch_76 » 18.02.2017 10:27:53

std::cin hat noch das locale stream interface. fd0/1/2 sind die direkten File Descriptoren die vom Kernel kommen.

STDIN von der C Seite hat noch libc dazwischen.

Am Ende, egal was du machst, hast du immer ein Byte das dir die Tastatur gegeben hat.

Die libc/libc++ machen noch buffering. Die File Descriptoren nicht. Die libc hat jedes Program als Abhängigkeit das mit dem gcc kompiliert wurde. Als warum nicht das nutzen? Wenn du ein grafisches OpenGL System am laufen hast, wird auch diese Bibliothek ein Tastatur Interface haben. Wie es mit Mesa direkt aussieht, weis ich gerade nicht.
Dein Programm wird vermutlich Event orientiert arbeiten. Warum nicht dann einen Thread oder asio::io_object auf dem Tastatur Interface lauschen lassen und die Tasten als Events weiter geben in der Eventqueue?

Die Randbedingungen die du für das Tastatur/Maus Interface willst sind nicht bekannt, deshalb können wir nur raten...

http://who-t.blogspot.de/2016/05/the-di ... evdev.html

alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 18.02.2017 14:05:31

Und ich dachte ich hätte das am Anfang so schön erklärt ... :-)

Also die normalen Sachen wie libc libstdc++ sind natürlich vorhanden. Ich meinte ja es sollen wenig Abhängigkeiten werden aber nicht keine.

Ich weiß jetzt nicht genau was Du wissen willst. Ich dachte an eine Klasse die Daten von der Tastatur Sammelt und per Event das Inputprogramm der KI Informiert das es Arbeit gibt. Eingaben sind Texte also Normale Sprache kann man vermutlich mit einem Chat-Programm vergleichen nur das gegenüber kein Mensch sondern der Computer antwortet.

Wichtig ist das ich bereits während der Eingabe man die Texte im Programm verarbeiten kann. Das geht ja mit std::cin so nicht weil man die Daten erst nach dem return erhält. Wenn man dann stdin mit open öffnet und dann mit read oder so liest geht es vermutlich. Was ich halt gerne vermeiden würde das ich die die ganzen Tastaturlayouts (also die Locale) selber interpretieren muss.

[Edit]
Maus oder Touch soll dann eine Zeichen Erkennung bekommen dann muss man nicht unbedingt die Tastatur verwenden. So irgendwann in der Zukunft vielleicht mal eine Spracherkennung.
[/Edit]

[Edit 2]
Oh hatte ich vergessen zu beantworten. Ich benutze nur Mesa sonst nicht und das hat keine Möglichkeit zur Tastatur abfrage.

Ja am Tastatur Interface lauschen ist schon das was ich auch meinte aber an welchem?
An /dev/stdin oder denen unter /dev/input ich weiß nicht was jetzt die Modernere oder bessere Methode ist.
[/Edit2]

Benutzeravatar
schorsch_76
Beiträge: 2597
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von schorsch_76 » 18.02.2017 19:59:00

Ich nutze bsp sehr gerne boost::asio als eventqueue ;) Da kann man auch auf einfache fds dann einen Handler laufen lassen.

Das wird bsp hier eine Idee beschrieben die ich für mich angepasst habe:
http://mostlycoding.blogspot.de/2009/05 ... lpful.html

http://www.boost.org/doc/libs/1_63_0/do ... descriptor
Da kannst du auch den fd des input device reingeben, bei "async_read() bzw. on_read()" bekommst du die Eingabedaten. Daraus machst du ein Function object das du wieder in den io_service postest. Das fo wird dann ausgeführt und mach "seine Magie, Kommandoparsing, was auch immer". Es postet seine Aktionen wieder im io_service ;)

So ähnlich wie in dem blog post.

Code: Alles auswählen

io_service.post(boost::bind(an_expensive_calculation, 42));
Wenn du dann mal Spracherkennung machen willst, hörst du am Microfon, erzeugst du ein fo, wirst es in den io_service, der führt es aus, danach kann die spracherkennung dieselbe Aktion auslösen wie bsp ein Tastaturshortcut ;) Der Trick ist, das das function object Daten tragen kann. Der io_service kann nicht nur für networking genutzt werden. Er ist eine thread safe Function object queue. Das ist der Kern von asio.

Es ist fast wie das Kommandopattern.
https://de.wikipedia.org/wiki/Kommando_ ... smuster%29

alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 18.02.2017 21:28:45

Danke für die Erklärung zu dem asio das war mir noch nicht alles bekannt.

Ich habe schon ein Eventsystem das hatten wir hier schon mal im Forum besprochen (lange her). Das hatte Dir nicht recht gefallen wollen ich finde es aber gut das möchte ich behalten. Sehe ich das richtig uinput und evdev kann man benutzen um aus dem Userland Nachrichten über den Kernel zwischen Prozessen auszutauschen?

Wenn ich richtig gelesen habe: Wayland verwendet evdev für die Eingabegeräte. Also die unter /dev/input ...

Benutzeravatar
schorsch_76
Beiträge: 2597
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von schorsch_76 » 19.02.2017 16:10:58

Um Nachrichten zwischen Prozessen auszutauschen gibt es:
  • Posix Message Queue man 3 mq_send
  • Pipes
  • Sockets
  • Unix Domain Sockets
  • Shared Memory
  • DBus
  • ...


http://tldp.org/LDP/lpg/node7.html
http://tldp.org/LDP/lpg/lpg.html

EDIT: Ausserdem gibt es auch noch TIPC. Das ist auch im mainline Kernel, ist nur wenig bekannt.
http://www.slideshare.net/JonMaloy/intr ... ng-service
https://en.wikipedia.org/wiki/Transpare ... munication

alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 20.02.2017 10:35:13

Für was ist dann das uinput gedacht?

DBUS habe ich bisher noch nicht benutzt die anderen kenne ich aber. Stimmt die nimmt man normal für so etwas her.

TIPC kenne ich auch noch nicht klingt aber interessant weil es so wie man es liest weniger Aufwändig ist als eine Verbindung über Domainsockets mit TCP und man kann aber weiter die Socket Schnittstelle verwenden.

Benutzeravatar
schorsch_76
Beiträge: 2597
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von schorsch_76 » 20.02.2017 12:15:28

uinput ist dafür da, wenn du bsp eine Touch Screen Treiber daemon schreibst, dass du die Maus Position schicken kannst ;) Du lannst damit auh per Programm die Maus bewegen, Klicks auslösen etc pp.

alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 06.03.2017 19:19:03

Beim lesen von stdin bekommt man die Daten erst wenn die Returntaste betätigt wurde. Das scheint hier das Standard verhalten zu sein. Das ist jetzt für mein vorhaben nicht gut geeignet.

Das mit den Kernel Events liefert mehrer Events pro Tastendruck das ist so Ok für meine Anwendung. Aber diese Scancodes haben nicht wirklich etwas mit einem Zeichensatz oder dem Tastatur Layout. Wenn man das alles selber konvertieren muss ist es schon ein bisschen Mühsam. Aber wie es aussieht der einzige weg an jeden einzelnen Tastendruck zu kommen.

So habe ich das jetzt mal zu experimentieren gemacht:

Code: Alles auswählen

unsigned char Keyboard::KernelEventRead (void)
{
  ssize_t rcRead;
  struct input_event eventKeyboard;

  //while (1)
  {
    rcRead = read (idIntKeyboard, &eventKeyboard, sizeof eventKeyboard);

    if (rcRead == (ssize_t) -1)
    {
      return 0;
    }
    else
    if (rcRead != sizeof eventKeyboard)
    {
      return 0;
    }
  }

// Prüfen ob es ein Tastencode ist
  if (eventKeyboard.type == EV_KEY)
  {
    if (eventKeyboard.value == 0)
      std::cout << "Value: Taste loslassen"  << std::endl;
    else
    if (eventKeyboard.value == 1)
      std::cout << "Value: Taste gedrückt" << std::endl;
    else
    if (eventKeyboard.value == 2)
      std::cout << "Value: Auto repeat" << std::endl;

    std::cout << "Code : " << eventKeyboard.code  << std::endl;
  }

  return eventKeyboard.code;
}

alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 09.03.2017 22:44:13

Ich habe jetzt noch das Paket kbd entdeckt das macht ja die Zeichenumsetzung (Scancode => Keycode) aber das geht wie es scheint nur mit /dev/console und das wieder ist etwas das bereits auf die Typische Computer Console zugeschnitten ist. Gibt scheinbar wirklich nur den Weg das über die Kernel Eventschnittstelle für Eingabegeräte zu lesen und die Umsetzung zwischen Scan... und Keycode selber zu bauen. EDV zu Fuß halt. Hatte gedacht es gibt für so eine alltägliche Aufgaben fertige Lösungen. Falsch gedacht ...

Benutzeravatar
schorsch_76
Beiträge: 2597
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von schorsch_76 » 10.03.2017 08:24:15

SIehe
http://stackoverflow.com/questions/3649 ... e-in-linux

Man könnte auch einfach mal in QT oder GTK reinschauen wie die das machen ;)

alexander_ro
Beiträge: 298
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 10.03.2017 16:48:53

@schorsch_76: Den Link von Dir habe ich mir mal angeschaut. Aber das Programm habe ich nicht ganz verstanden. Die benutzen auf jeden Fall auch die Event Schnittstelle.

Ich schaue mir gerade die libinput von Wayland an. Habe aber da noch nicht die richtige stelle gefunden.
https://cgit.freedesktop.org/wayland/libinput/tree/src

Antworten