Hallo allerseits,
momentan befasse ich mich mit den Anpassungen dieses vorgefertigten auf
IRMP basiernden Moodlight-Programms
Beitrag "noch ein AVR Moodlight"
Re: noch ein AVR Moodlight
AVR-Moodlight-20120308.tar.gz (86,6 KB, 103 Downloads)
an meine bestehende Schaltung und an diejenigen Fernbedienungen, die mir
zur Verfügung stehen.
Nachdem nun die Anpassung an meine NEC-Fernbedienung gelungen war,
wollte ich dies auch für die RC5-Fernbedienung vornehmen. Klappte auch.
Ebenso für das Kaseikyo-Protokoll.
Nun sollten beide Fernbedienungen wahlweise erkannt werden und genau da
beginnt mein Problem.
Die Protokolle werden einzeln erkannt, bei jedem Tastendruck blitzt die
Toggle-LED kurz auf, bleibt aber niemals an und mir ist vor allem die
Wirkungsweise der IF-Abfrage unklar, da ich mich beim Durchdenken immer
in Widersprücken verstricke.
Ich verstehe die Wirkungsweise dieser Zeilen folgendermaßen:
In My_PROTO und MY_REMOTE werden Protokoll und Geräte-Code derjenigen
Fernbedienung festgelegt, auf die das Programm reagieren soll.
Diese werden dann beide verglichen mit "irmp_data.protocol" und
"irmp_data.address".
Falls die "richtigen" Signale empfangen wurden, soll eine Aktion
abhängig von der gedrückten Taste geschehen, sofern es eine der
definierten Tasten ist, hier also nur die vier Tasten ON/OFF und 1, 2,
3.
Die IF-Abfrage benutzt !=, das ich mit "ungleich" übersetze.
Falls ("Vergleich1 auf Ungleichheit" ODER "Vergleich2 auf Ungleichheit")
toggle die LED und return.
Das würde die Aktionen auslösen, sofern nur einer der Partner ungleich
wäre. Das ist aber falsch.
Was genau macht eigentlich das Return?
Return kenne ich, um einen Rückgabewert an das übergeordnete Programm zu
geben. Z.B. return (0) oder return variablenname.
Falls nicht die richtige Fernbedienung (Protokoll und Gerätecode)
erkannt wurden, soll die nachfolgende switch-case-Abfrage garnicht
durchlaufen werden.
Ich wäre um Tipps dankbar.
mit freundlichem Gruß
____________________________________________
in moodlight.c (Darstellung etwas gekürzt):
1 | /* remote control address and command codes */
|
2 |
|
3 | #define MY_PROTO IRMP_NEC_PROTOCOL /* IR protocol and */
|
4 | #define MY_REMOTE 0x916e /* system code */
|
5 |
|
6 |
|
7 | ....
|
8 | ....
|
9 |
|
10 |
|
11 | /* last received IR signal */
|
12 |
|
13 | IRMP_DATA irmp_data;
|
14 |
|
15 |
|
16 | /* evaluate an IR remote signal */
|
17 | void moodlight_remote(void)
|
18 | {
|
19 |
|
20 | /* es geht um genau diese IF-Abfrage, die ich nicht genau verstehe <<<<<<<<<<<<<--<<<<<<<<<---<<<<<<<<---*/
|
21 | if ( irmp_data.protocol != MY_PROTO
|
22 | || irmp_data.address != MY_REMOTE) {
|
23 | PORTC ^= 1 << PC5; // LED toggeln
|
24 | return;
|
25 | }
|
26 |
|
27 | switch (irmp_data.command) {
|
28 |
|
29 | case KEY_OPERATE: /* on/off */
|
30 | {
|
31 | if ((irmp_data.flags & IRMP_FLAG_REPETITION) == 0) {
|
32 | ml.flags ^= ML_FLAG_OFF;
|
33 | if (ml.flags & ML_FLAG_OFF) {
|
34 | level_r = 0;
|
35 | level_g = 0;
|
36 | level_b = 0;
|
37 | } else {
|
38 | moodlight_wakeup();
|
39 | }
|
40 | }
|
41 | break;
|
42 | }
|
43 |
|
44 | case KEY_1:
|
45 | {
|
46 | ml.mode = 1;
|
47 | ml.delay = 6;
|
48 | ml.flags = 0;
|
49 | ml.cycle = 1;
|
50 | tick = 1;
|
51 | break;
|
52 | }
|
53 |
|
54 | case KEY_2:
|
55 | {
|
56 | ml.mode = 2;
|
57 | ml.delay = 4;
|
58 | ml.flags = 0;
|
59 | ml.cycle = 1;
|
60 | tick = 1;
|
61 | break;
|
62 | }
|
63 |
|
64 | case KEY_3:
|
65 | {
|
66 | ml.mode = 3;
|
67 | ml.delay = 4;
|
68 | ml.flags = 0;
|
69 | ml.cycle = 0;
|
70 | tick = 1;
|
71 | break;
|
72 | }
|
73 | }
|
74 | }
|