Ich hänge gerade ein bisschen fest. Habe mehrere Dreh-Encoder, die je
einen Wert hoch bzw runter-regeln sollen. Die Werte haben einen Minimal-
und einen Maximalwert und verhalten sich unterschiedlich bei erreichen
dieser Werte.
Manche sollen bei "Überlauf" einfach am entsprechenden oberen oder
unteren Ende des Wertebereichs "festgehalten" werden, andere sollen eine
Art modulo haben und bei durchschreiten des einen Limits einfach ans
andere ende Gesetzt werden.
Bsp:
1. +1 -> 1 2 3 4 5 6 6 6 6 6 6 6 -1 -> 5 4 3 2 1 1 1 1 1
2. +1 -> 1 2 3 4 5 6 1 2 3 4 5 6 -1 -> 5 4 3 2 1 6 5 4 3
Hier ein auszug aus dem Code
1 | //graytab is static signed char, die codeaufschlüsselung funktioniert, es wird korrekt hoch bzw runtergezählt bis eben zum Überlauf
|
2 |
|
3 | {
|
4 | if ((*(device->mem->value) + ((device->increment) * graytab[graycode[i]])) < (device->min))
|
5 | {
|
6 | if (device->modulo)
|
7 | {
|
8 | *(device->mem->value) = (device->max);
|
9 | }
|
10 | else
|
11 | {
|
12 | *(device->mem->value) = (device->min);
|
13 | }
|
14 | }
|
15 | else if ((*(device->mem->value) + ((device->increment) * graytab[graycode[i]])) > (device->max))
|
16 | {
|
17 | if (device->modulo)
|
18 | {
|
19 | *(device->mem->value) = (device->min);
|
20 | }
|
21 | else
|
22 | {
|
23 | *(device->mem->value) = (device->max);
|
24 | }
|
25 | }
|
26 | else
|
27 | {
|
28 | *(device->mem->value) = ((*(device->mem->value) + ((device->increment) * graytab[graycode[i]])));
|
29 | }
|
Das ganze funktioniert aber noch nicht so recht, zb ist min 0 und der
Wert wird aber bis -1 runtergezählt und beim hochzählen geht er bis 19
(max ist 20) und springt dann wieder auf -1.
Gibt es grundsätzlich für dieser Zweck elegantere Lösungen (abgesehen
vom % Operator, der Funktioniert dafür auch nicht richtig weil
0-Durchlauf beim runterzählen nicht erkannt wird)