Weil dir eine Dauer-gedrückte Taste bei der Abfrage als eine Serie von
TRUEs aus der get_key_rpt_l rauskommen.
D.h. du musst das so behandeln, als ob der Benutzer die Taste immer
wieder drücken und loslassen würde. Ein Autorepeat verhält sich genau
so, was im Regelfall auch soweit Sinn macht, denn wenn ich mit den
Tasten einen Zahlenwert vergrößere oder verkleinere, dann will ich das
ja genau so haben.
1 | ...
|
2 |
|
3 | if( get_key_press( 1 << INCREASE_KEY ) ||
|
4 | get_key_rpt( 1 << INCREASE_KEY )
|
5 | {
|
6 | Zähler erhöhen
|
7 | }
|
Drückt der Benutzer einmalig auf die Taste, dann wird der Zähler erhöht.
Bleibt er länger drauf, dann werden dem Programm über get_key_rpt
laufend weitere Tastendrucke vorgegaukelt, die dann ebenfalls zu den
Zählererhöhungen führen.
Du musst allerdings nicht beide Aufrufe in ein und derselben Abfrage
haben. Zb. kann man obiges auch so benutzen
1 | if( get_key_press( 1 << INCREASE_KEY ) )
|
2 | {
|
3 | Zähler um 1 erhöhen
|
4 | }
|
5 |
|
6 | if( get_key_rpt( 1 << INCREASE_KEY )
|
7 | {
|
8 | Zähler um 10 erhöhen
|
9 | }
|
Drückt der Benutzer einmalig auf die Taste, dann erhöht er den Zähler um
1. Bleibt er auf der Taste drauf, dann fängt der Zähler an, sich um
jeweils 10 zu erhöhen.
Bei dir wäre das dann zb. das du mit einem get_key_press den
Schaltvorgang machst und beim get_key_rpt den Dimmvorgang, wobei du
selbstverständlich die Richtungsumschaltung dann nur im get_key_rpt
machst. Wichtig: Die Richtungsumschaltung muss sich an den Zahlenwerten
orientieren und nicht an den Tastendrücken. Denn der get_key_rpt liefert
ja mehrmals ein TRUE zurück solange der Benutzer auf der Taste bleibt.
Aber er tut das nicht bei jedem Aufruf, sondern in den eingestellten
Zeitintervallen, die den Autorepeat darstellen sollen.
Und genau da liegt auch das Problem in deinem Code. Du hast dich hier
1 | if( get_key_long_r( 1<<KEY0 ) || get_key_rpt_l( 1<<KEY0 ))
|
2 | {
|
3 | pressed = 1;
|
4 | if( direction )
|
5 | {
|
6 | if( pwm < 255 )
|
7 | ++pwm;
|
8 | }
|
9 | else
|
10 | {
|
11 | if( pwm > 0 )
|
12 | --pwm;
|
13 | }
|
14 | }
|
15 | else if( pressed )
|
16 | {
|
17 | pressed = 0;
|
18 | direction = 1 - direction;
|
19 | }
|
mit dem pressed Flag selbst ausgetrickst.
1 | if( get_key_long_r( 1<<KEY0 ) || get_key_rpt_l( 1<<KEY0 ))
|
2 | {
|
3 | if( direction )
|
4 | {
|
5 | if( pwm < 255 )
|
6 | ++pwm;
|
7 | }
|
8 | else
|
9 | {
|
10 | if( pwm > 0 )
|
11 | --pwm;
|
12 | }
|
13 |
|
14 | if( pwm == 0 || pwm == 255 )
|
15 | direction = 1 - direction;
|
16 | }
|