Forum: Compiler & IDEs Touchscreen (tslib) "debounce"


von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Hi,

ich bastle gerade mit der tslib herum. Dabei stosse ich auf folgendes 
Problem und weiss gerade nicht weiter.

Wenn ich auf den Touchscreen tippe, werden gleich mehrere Clicks 
registriert.

Meine Funktion zum abfragen sie so aus:
1
...
2
clock_t time1;
3
...
4
int getxy(int *x, int *y) {
5
    int ret=0;
6
    while( (time1 + (CLOCKS_PER_SEC)) <= clock() ) {
7
      printf("x");
8
    }
9
    ret = ts_read(ts, &samp, 1);
10
    if(ret < 0) { printf("can't read from touchscreen!\n"); return(-1); }
11
  if(debug) printf("ts_debug: x: %d y: %d\n", samp.x, samp.y);
12
    *x = samp.x;
13
    *y = samp.y;
14
    time1 = clock();
15
    return 0;
16
}
clock_t ist ein unsigned int und clock() liefert die Anzahl der clocks 
seit Programmstart zurück. CLOCKS_PER_SEC ist ein #define, welches die 
Anzahl der Clocks pro Sekunde enthält.
time1 ist eine globale Variable (clock_t).

Normalerweise sollte er doch hier warten bis er in der Funktion 
fortfährt, bis eine Sekunde seit dem letzten Click vergangen ist, nur 
leider funzt das nicht, er fährt einfach so weiter fort.

Irgendwo ist ein Denkfehler drin und ich finde ihn nicht, vielleicht 
könnt ihr mir ja helfen.

von Stefan E. (sternst)


Lesenswert?

Die while-Bedingung macht keinen Sinn. "time1 + (CLOCKS_PER_SEC)" ist 
ein konstanter Wert (konstant innerhalb der Schleife), der auf 
kleiner-gleich gegen einen sich vergrößernden Wert getestet wird. Daraus 
ergibt sich, dass die Bedingung entweder sofort false, oder für immer 
(zumindest bis zum Überlauf des von clock() gelieferten Wertes) true 
ist.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Hmmm jetzt hab ich den Fehler entdeckt, das <= wurde zu > und er wartet 
mir brav die Sekunde.
Jetzt hab ich noch CLOCKS_PER_SEC/3, aber stosse auf ein weiteres 
Problem.

Er "erkennt" trotzdem immer mehrere Clicks auf einmal, die dann 
nacheinander, als stehen sie in einer Warteschlange, an getxy() gegeben 
werden.
Ich habe es schon mit einem dummy ts_read() in der Warteschleife 
versucht, aber dann kann ich nicht draufbleiben, es wird dann nur ein 
click gezählt, obwohl die getxy mehrfach aufgerufen wird.
Sprich ich habe einen Button, der eine Variable runterzählt. Ohne die 
Warteschleife kann ich auf dem Button bleiben und er zählt immer weiter 
runter (was so gewollt ist) und wenn ich den dummy-read einbaue, muss 
ich pro Runterzählen einmal drücken und wieder loslassen.

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.