Forum: PC-Programmierung Stress mit USB-Touchscreen am Raspberry 3+


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Es handelt sich um einen Hanns-G HT225HPB, 21.5" Monitor.

Ich erstelle eine Xojo-App für einen Info-Monitor (Kiosk-System), die 
mit einem Touchscreen bedient werden soll. Der Touch-Teil des Monitors 
ist per USB mit dem Rechner verbunden, der Bild-Teil per HDMI. 
Betriebssystem ist das aktuelle Raspbian Stretch auf einem 3+. 
Normalerweise esetzt der Touch ja schlicht und einfach die Maus, ein Tip 
auf die richtige Stelle und ein Button feuert den "Action"- oder eine 
Listbox den "Change"-Event ... und gut ist.

Leider scheint das unter Linux nicht so zu stimmen. Wenn ich z.B. den 
Finger rel. "zaghaft" auf einen Button setze, bekommt der zwar den Focus 
oder wechselt sogar optisch in den Zustand "gedrückt", aber sonst 
passiert nix. Verfahre ich so mit einer Listbox, wird die betreffende 
Zeile zwar ge-highlighted, aber der Change-Event nicht ausgelöst und der 
Listindex ändert sich auch nicht.

Bei den Buttons habe ich mir damit geholfen, dass alle möglichen Events 
(Action, GotFocus, MouseEnter, MouseDown, MouseUp) die gleiche Funktion 
auslösen, natürlich durch eine Logik verknüpft, um Mehrfachauslösungen 
zu vermeiden. So werden immerhin (geschätze) 95% aller Fingertips 
erkannt ...

Mit Maus-Bedienung funktioniert die Anwendung übrigens absolut genau so, 
wie sie soll, jeder Klick wird erkannt.


Bei der Listbox ist das ungleich schwieriger, hier habe ich nur Chage 
und CellKlick zusammenfassen können, was die "Ausbeute" auf max. 50% 
bringt.

Mir scheint, dass die Ursache eine Art "Drucksensitivität" des Touch 
ist, obwohl Nichts dergleichen in dessen technischer Beschreibung steht, 
während es bei der Maus nur Klick oder nicht Klick gibt.

Kann man das Touch-Verhalten auf System-Ebene irgendwie "eindeutiger" 
machen?

Eigentlich ist das aber alles Sch**ße - kann man das Problem nicht an 
der Wurzel packen? Wiso gibt es überhaup solche halbgaren Reaktionen? 
Danke für Tips.

von Andreas K. (andreas_k209)


Lesenswert?

gibt es sowas wie onTouch das Du noch abfangen musst? Touchscreens mit 
"drucksensitivität" sind mir noch nicht untergekommen.

Drucksensitivität kenne ich nur von Grafiktabletts.

Wenn das HTML/Javascript ist, gibt es bei TouchEvent u.U, mehrere 
erkannte Finger die man auswerten kann aber man kann auch nur auf den 
ersten reagieren.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Frank E. schrieb:
> kann man das Problem nicht an der Wurzel packen?

Das Problem scheint zu sein, daß Du den Unterschied zwischen Touch und 
Maus nicht zu verstehen scheinst. Bei einer Maus ist Klicken und 
Zeigerbewegen klar voneinander zu unterscheiden - kein Wunder, macht ja 
auch unterschiedliche Hardware.

Bei Touch ist das anders, wenn damit ein Mauszeiger bewegt werden soll, 
muss das vom Klicken oder gar dem Bewegen mit gedrückter Maustaste 
unterschieden werden.

Deswegen erzeugt der Touchtreiber jede Menge unterschiedlicher Events, 
die Deine Anwendung auseinanderhalten muss.

von Thomas (Gast)


Lesenswert?

Frank E. schrieb:
> Eigentlich ist das aber alles Sch**ße - kann man das Problem nicht an
> der Wurzel packen? Wiso gibt es überhaup solche halbgaren Reaktionen?

Nun bisher bin ich davon ausgegangen dass du nur Probleme mit 
Netzwerktechnik hast. Aber das Problem scheint allgemeiner.

Lösung: Sag deinem Kunden, er soll ein Teil nehmen was auch unter Linux 
funktioniert.
ups Du hast es selbst rausgesucht?
Dann würde ich auf der HP schauen ob die Touchdriver für Linux anbieten.
ups Die haben nichts?
Dann würde ich mal googlen ob es andere Leute gibt die vielleicht eine 
Lösung gefunden haben.
ups Dein Google geht auch nicht?

Ich nach das mal für dich....
raspberrypi.stackexchange.com/questions/60383/

Thomas

von Daniel A. (daniel-a)


Angehängte Dateien:

Lesenswert?

Ich mache jetzt mal vorerst die wilde Annahme, dass deine Anwendung 
nicht das Problem ist.

Ich habe viele Geräte mit Linux und Touchscreen, aber so ein Problem 
hatte ich noch nie. Schau erstmal nach, ob die richtigen Events 
überhaupt generiert werden. Allgemein geht das mit evtest. Um zu sehen, 
was der X Server liefert, falls man den verwendet, kann man noch X Input 
verwenden. Hier mal ein paar ausgaben eines meiner Touchscreens zum 
vergleich.

Hier mit XInput, ein 4 mal drauf gedrückt, 2mal dabei noch die Position 
geändert, plus noch die Abfrage interessanter Einstellungen:
1
daniel@colibri:~$ grep "input driver" /var/log/Xorg.0.log
2
[     8.060] (II) Using input driver 'libinput' for 'Video Bus'
3
[     8.103] (II) Using input driver 'libinput' for 'Surface Pro 3/4 Buttons'
4
[     8.136] (II) No input driver specified, ignoring this device.
5
[     8.137] (II) No input driver specified, ignoring this device.
6
[     8.137] (II) No input driver specified, ignoring this device.
7
[     8.137] (II) No input driver specified, ignoring this device.
8
[     8.137] (II) No input driver specified, ignoring this device.
9
[     8.138] (II) No input driver specified, ignoring this device.
10
[     8.138] (II) Using input driver 'libinput' for 'Microsoft LifeCam Front: Micros'
11
[     8.200] (II) Using input driver 'libinput' for 'Microsoft LifeCam Rear: Microso'
12
[     8.244] (II) No input driver specified, ignoring this device.
13
[     8.245] (II) No input driver specified, ignoring this device.
14
[     8.245] (II) Using input driver 'libinput' for 'NTRG0001:01 1B96:1B05 Pen'
15
[     8.327] (II) No input driver specified, ignoring this device.
16
[     8.327] (II) Using input driver 'libinput' for 'NTRG0001:01 1B96:1B05'
17
[     8.356] (II) No input driver specified, ignoring this device.
18
[  7289.305] (II) No input driver specified, ignoring this device.
19
[  7289.343] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Consumer Control'
20
[  7289.356] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Consumer Control'
21
[  7289.358] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Keyboard'
22
[  7289.376] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Touchpad'
23
[ 18558.484] (II) No input driver specified, ignoring this device.
24
[ 18558.515] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Keyboard'
25
[ 18558.533] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Consumer Control'
26
[ 18558.557] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Consumer Control'
27
[ 18558.559] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Touchpad'
28
[ 21116.061] (II) No input driver specified, ignoring this device.
29
[ 21116.088] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Keyboard'
30
[ 21116.118] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Consumer Control'
31
[ 21116.134] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Consumer Control'
32
[ 21116.135] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Touchpad'
33
daniel@colibri:~$ xinput
34
⎡ Virtual core pointer                      id=2  [master pointer  (3)]
35
⎜   ↳ Virtual core XTEST pointer                id=4  [slave  pointer  (2)]
36
⎜   ↳ NTRG0001:01 1B96:1B05                     id=11  [slave  pointer  (2)]
37
⎜   ↳ Microsoft Surface Type Cover Consumer Control  id=13  [slave  pointer  (2)]
38
⎜   ↳ Microsoft Surface Type Cover Touchpad     id=15  [slave  pointer  (2)]
39
⎣ Virtual core keyboard                     id=3  [master keyboard (2)]
40
    ↳ Virtual core XTEST keyboard               id=5  [slave  keyboard (3)]
41
    ↳ Video Bus                                 id=6  [slave  keyboard (3)]
42
    ↳ Surface Pro 3/4 Buttons                   id=7  [slave  keyboard (3)]
43
    ↳ Microsoft LifeCam Front: Micros           id=8  [slave  keyboard (3)]
44
    ↳ Microsoft LifeCam Rear: Microso           id=9  [slave  keyboard (3)]
45
    ↳ NTRG0001:01 1B96:1B05 Pen                 id=10  [slave  keyboard (3)]
46
    ↳ Microsoft Surface Type Cover Keyboard     id=12  [slave  keyboard (3)]
47
    ↳ Microsoft Surface Type Cover Consumer Control  id=14  [slave  keyboard (3)]
48
daniel@colibri:~$ xinput list --long 11
49
NTRG0001:01 1B96:1B05                     id=11  [slave  pointer  (2)]
50
  Reporting 6 classes:
51
    Class originated from: 11. Type: XIButtonClass
52
    Buttons supported: 7
53
    Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right"
54
    Button state:
55
    Class originated from: 11. Type: XIValuatorClass
56
    Detail for Valuator 0:
57
      Label: Abs MT Position X
58
      Range: 0.000000 - 65535.000000
59
      Resolution: 0 units/m
60
      Mode: absolute
61
      Current value: 44204.000000
62
    Class originated from: 11. Type: XIValuatorClass
63
    Detail for Valuator 1:
64
      Label: Abs MT Position Y
65
      Range: 0.000000 - 65535.000000
66
      Resolution: 0 units/m
67
      Mode: absolute
68
      Current value: 49817.000000
69
    Class originated from: 11. Type: XIValuatorClass
70
    Detail for Valuator 2:
71
      Label: Rel Horiz Scroll
72
      Range: -1.000000 - -1.000000
73
      Resolution: 0 units/m
74
      Mode: relative
75
    Class originated from: 11. Type: XIValuatorClass
76
    Detail for Valuator 3:
77
      Label: Rel Vert Scroll
78
      Range: -1.000000 - -1.000000
79
      Resolution: 0 units/m
80
      Mode: relative
81
    Class originated from: 11. Type: XITouchClass
82
    Touch mode: direct
83
    Max number of touches: 15
84
85
daniel@colibri:~$ xinput --list-props 11
86
Device 'NTRG0001:01 1B96:1B05':
87
  Device Enabled (141):  1
88
  Coordinate Transformation Matrix (143):  1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
89
  libinput Calibration Matrix (280):  1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
90
  libinput Calibration Matrix Default (281):  1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
91
  libinput Send Events Modes Available (263):  1, 0
92
  libinput Send Events Mode Enabled (264):  0, 0
93
  libinput Send Events Mode Enabled Default (265):  0, 0
94
  Device Node (266):  "/dev/input/event3"
95
  Device Product ID (267):  7062, 6917
96
97
daniel@colibri:~$ xinput --test 11
98
motion a[0]=41603 a[1]=40380 
99
button press   1 a[0]=41603 a[1]=40380 
100
motion a[0]=41603 a[1]=40380 
101
button release 1 a[0]=41603 a[1]=40380 
102
motion a[0]=39733 a[1]=48980 
103
button press   1 a[0]=39733 a[1]=48980 
104
motion a[0]=39808 a[1]=49053 
105
motion a[0]=40033 a[1]=49335 
106
motion a[0]=40368 a[1]=49754 
107
motion a[0]=40791 a[1]=50427 
108
motion a[0]=40791 a[1]=50427 
109
button release 1 a[0]=40791 a[1]=50427 
110
motion a[0]=32163 a[1]=54604 
111
button press   1 a[0]=32163 a[1]=54604 
112
motion a[0]=32170 a[1]=54586 
113
motion a[0]=32177 a[1]=54550 
114
motion a[0]=32190 a[1]=54504 
115
motion a[0]=32211 a[1]=54441 
116
motion a[0]=32238 a[1]=54350 
117
motion a[0]=32293 a[1]=54222 
118
motion a[0]=32347 a[1]=54058 
119
motion a[0]=32436 a[1]=53822 
120
motion a[0]=32497 a[1]=53649 
121
motion a[0]=32497 a[1]=53649 
122
button release 1 a[0]=32497 a[1]=53649 
123
motion a[0]=41084 a[1]=52666 
124
button press   1 a[0]=41084 a[1]=52666 
125
motion a[0]=41084 a[1]=52666 
126
button release 1 a[0]=41084 a[1]=52666

evtest Beispiel ist im Anhang.

Neben den Angaben von oben aber bei dir wären die Ausgabe von "cat 
/proc/bus/input/devices" und dmesg auch noch nützlich. Damit könnte man 
sehen, ob das Problem beim Touchscreen/Treiber und dessen ausgegebenen 
Daten, oder woanders liegt. In letzterem Fall könnte der verwendete X11 
input Treiber oder eine Einstellung davon problematisch sein, oder auch 
der verwendete Window Manager (oder gar das fehlen davon).

Sobald man weiss, wo das Problem liegt, kann man es lösen.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Rufus Τ. F. schrieb:
> Frank E. schrieb:
>> kann man das Problem nicht an der Wurzel packen?
>
> Das Problem scheint zu sein, daß Du den Unterschied zwischen Touch und
> Maus nicht zu verstehen scheinst. Bei einer Maus ist Klicken und

Was soll der Unfug?

> Zeigerbewegen klar voneinander zu unterscheiden - kein Wunder, macht ja
> auch unterschiedliche Hardware.

Ist ein entschlossener Tip per Touchscreen auf einen Button etwa kein 
Klick?

Außerdem schrieb ich ja, dass ich das Button-Problem mit der 
Zusammenfassung der unterschiedlichsten Events fast perfekt erledigt 
habe. Bei der erreichten Erfolgsrate wird ein Benutzer bei einer der 
rel. seltenen Nicht-Reaktionen eher an einen eigenen Fehler glauben und 
einfach nochmal tippen.

Problematisch ist eher die Listbox. Dieses GUI-Element kann eigentlich 
gar keinen Unterschied zwischen dem wechselnden Highlighting einer 
Zeile, dem entsperechenen Change-Event und dem zugehörigen Property 
"Listindex" machen, schaft es aber - unter Linux - trotzdem.

Am Mac habe ich noch keinen Touchmonitor ausprobiert, aber unter Windows 
schon, und dort gibt es das Problem definitiv nicht. Muss ich also von 
einem Bug in Xojo ausgehen?

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Daniel A. schrieb:
> Ich mache jetzt mal vorerst die wilde Annahme, dass deine
> Anwendung
> nicht das Problem ist.
>
> Ich habe viele Geräte mit Linux und Touchscreen, aber so ein Problem
> hatte ich noch nie. Schau erstmal nach, ob die richtigen Events
> überhaupt generiert werden. Allgemein geht das mit evtest. Um zu sehen,
> was der X Server liefert, falls man den verwendet, kann man noch X Input
> verwenden. Hier mal ein paar ausgaben eines meiner Touchscreens zum
> vergleich.
>
> ...

Oh, sehr komplexe Angelegenheit. So tief wollte ich als 
Anwendungsentwickler eigentlich nicht einsteigen. Ich nahm bisher an - 
und unter Windows ist das auch so - dass ein nicht über spezielle 
Treiber eingebundener Touch als HID einfach eine Maus emuliert ... was 
er ja meistens auch tut, nur eben nicht zuverlässig. Meine Anwendung ist 
kein Multipoint- Projekt ...

von Daniel A. (daniel-a)


Lesenswert?

Beim xinput --test ist das wichtige einfach, dass das "button press 1" 
und "button release 1" beim draufdrücken kommt. Wenn das da ist, ist des 
Problem vermutlich der X window manager. Angenommen, es wird X11 
verwendet, und nicht wayland oder Framebufferanwendungen oder so.

von Henning Block (Gast)


Lesenswert?

Es kommt vermutlich zu spät, aber das Problem lag mit ziemlicher 
Sicherheit an der Firmware des Bildschirms. Ich habe exakt das 
beschriebene Phänomen mit dem Bildschirm und einem Raspberry Pi 4 sowohl 
unter Raspbian als auch unter Android 11 (OmniROM) erlebt, während es 
aber an einem Windows-PC tadesllos reagiert hat. Habe dann von der 
Hersteller-Seite ein Tool runtergeladen (google nach TC_PTool_2008, ist 
dann eine WIN8.rar) und danach reagierte das Display auch unter Raspbian 
und Android wie erwartet.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Danke für die (wenn auch späte) Rückmeldung.

Es gibt ja hier so Experten, die immer nur die Hälfte lesen und dann 
überheblich und allwissend tun - um so wohltuender ist mal eine Antwort, 
die mein Problem versteht und wenigstens teilweise nachvollziehen kann.

Allerdings ist da sicher nicht nur in der Firmware des Bildschirmes ein 
Bug, sondern auch irgendwie im Linux-Unterbau oder meiner Xojo-IDE 
ebenfalls. Denn wenn ein GUI-Element sich zwar beim Anklicken/tippen 
einfärbt und dann aber nicht auch der zugehörige Event-Handler ausgelöst 
wird, ist sicher nicht nur der Bildschirm, daran schuld ... es ei denn, 
es gibt (systemintern) abartig exotischen Varinten von Events, mit denen 
aber sonst nienand rechnet ...

Wie ich weiter oben schrieb, ich "missbrauche" den Mouse-Enter-Event 
(Betreten des GUI-Elements), der sehr zuverlässig kommt. Beim Eintreffen 
dieses Events befördere ich die Maus per System-Call sofort wieder in 
die linke untere Ecke, so dass jeder neue Tip auf ein GUI-Element mit 
Sicherheit auch ein Mouse-Enter auslöst ... damit kann ich leben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.