[solved] Problem bei der Programmierung meiner Fernbedienung

Die Programmierung des c't-Bot
Antworten
anonybot
Friends of Sonny
Friends of Sonny
Beiträge: 194
Registriert: 07 Okt 2015, 00:14

[solved] Problem bei der Programmierung meiner Fernbedienung

Beitrag von anonybot » 02 Mär 2016, 13:12

Hallo zusammen,

ich habe schon einige Kolleg_innen im IRC gefragt, leider ließ sich ein Problem bei der Um- und Neubelegung einiger Tasten auf meiner Fernbedienung nicht lösen.

Ich arbeite mit dem Code ct-Bot 1978.
Zur Steuerung meines Bots habe ich eine Fernbedienung, die eigentlich im Code bereits vorhanden ist: Technisat_TTS35AI. Auf der physischen Fernbedienungstastatur findet sich ein Steuerkkreuz (oben, unten, rechts, links, OK in der Mitte), das ich gerne für vorwärts, rückwärts, rechts drehen, links drehen und stopp verwenden möchte.

Deaktiviere ich im Code die Standard-FB HQ_RC_UNIVERS29_334 und aktiviere ich dafür die Technisat_TTS35AI spuckt Eclipse gleich eine ganze Reihe an Fehlern aus:
Description Resource Path Location Type
‘RC5_CODE_DOT’ undeclared (first use in this function) gui.c /ct-Bot/ui line 201 C/C++ Problem
‘RC5_CODE_PLAY’ undeclared (first use in this function) gui.c /ct-Bot/ui line 208 C/C++ Problem
‘RC5_CODE_STOP’ undeclared (first use in this function) gui.c /ct-Bot/ui line 204 C/C++ Problem
make: *** [ui/gui.o] Error 1 ct-Bot C/C++ Problem
make: *** Waiting for unfinished jobs.... ct-Bot C/C++ Problem
recipe for target 'ui/gui.o' failed subdir.mk /ct-Bot/Debug-MCU-m1284p/ui line 24 C/C++ Problem
each undeclared identifier is reported only once for each function it appears in gui.c /ct-Bot/ui line 201 C/C++ Problem
Da die Standard-FB soweit funktioniert, gehe ich also zurück auf default (HQ_RC_UNIVERS29_334) und versuche nur die Tasten neu- bzw. umzulegen, die ich gerne haben möchte.

Ich beginne mit der OK-Taste (laut meinem Bot-Display hat diesen den Wert 0017), füge also in Eclipse -> Project-Explorer -> ct-Bot -> include -> rc5-codes.h im Abschnitt * HQ RC Univers 29, Geraetecode 334 eine Zeile

Code: Alles auswählen

#define RC5_CODE_OK			(0x0017 & RC5_MASK)			/*!< Taste OK */
hinzu, speichere, kein Fehler. Der Stand ist jetzt also:

Code: Alles auswählen

/*!
 * Default-Fernbedienung
 * HQ RC Univers 29, Geraetecode 334
 */
#ifdef RC_HAVE_HQ_RC_UNIVERS29_334
#define RC5_CODE_PWR		(0x118C & RC5_MASK)		/*!< Taste An/Aus */

#define RC5_CODE_0			(0x1180 & RC5_MASK)		/*!< Taste 0 / 10 */
#define RC5_CODE_1			(0x1181 & RC5_MASK)		/*!< Taste 1 */
#define RC5_CODE_2			(0x1182 & RC5_MASK)		/*!< Taste 2 */
#define RC5_CODE_3			(0x1183 & RC5_MASK)		/*!< Taste 3 */
#define RC5_CODE_4			(0x1184 & RC5_MASK)		/*!< Taste 4 */
#define RC5_CODE_5			(0x1185 & RC5_MASK)		/*!< Taste 5 */
#define RC5_CODE_6			(0x1186 & RC5_MASK)		/*!< Taste 6 */
#define RC5_CODE_7			(0x1187 & RC5_MASK)		/*!< Taste 7 */
#define RC5_CODE_8			(0x1188 & RC5_MASK)		/*!< Taste 8 */
#define RC5_CODE_9			(0x1189 & RC5_MASK)		/*!< Taste 9 */
#define RC5_CODE_11			(0x118A & RC5_MASK)		/*!< Taste 11 / 1- */
#define RC5_CODE_12			(0x11A3 & RC5_MASK)		/*!< Taste 12 / 2- */

#define RC5_CODE_GREEN		(0x01BA & RC5_MASK)		/*!< Gruene Taste */
#define RC5_CODE_RED		(0x01BD & RC5_MASK)		/*!< Rote Taste */
#define RC5_CODE_YELLOW		(0x01B1 & RC5_MASK)		/*!< Gelbe Taste */
#define RC5_CODE_BLUE		(0x01B0 & RC5_MASK)		/*!< Blaue Taste */

#define RC5_CODE_I_II		(0x11AB & RC5_MASK)		/*!< I/II-Taste */
#define RC5_CODE_TV_VCR		(0x11B8 & RC5_MASK)		/*!< TV/VCR-Taste */

#define RC5_CODE_DOT		(0x11B7 & RC5_MASK)		/*!< Taste mit rundem Punkt */

#define RC5_CODE_PLAY		(0x11B5 & RC5_MASK)		/*!< PLAY-Taste */
#define RC5_CODE_STILL		(0x11A9 & RC5_MASK)		/*!< Pause Taste */
#define RC5_CODE_STOP		(0x11B6 & RC5_MASK)		/*!< Stopp Taste */
#define RC5_CODE_BWD		(0x11B2 & RC5_MASK)		/*!< Backward Taste */
#define RC5_CODE_FWD		(0x11B4 & RC5_MASK)		/*!< Forward Taste */

#define RC5_CODE_CH_PC		(0x11BF & RC5_MASK)		/*!< CH*P/C Taste */
#define RC5_CODE_MUTE		(0x01BF & RC5_MASK)		/*!< Mute-Taste */

#define RC5_VOL_PLUS		(0x1190 & RC5_MASK)		/*!< Vol + Taste */
#define RC5_VOL_MINUS		(0x1191 & RC5_MASK)		/*!< Vol - Taste */

#define RC5_CH_PLUS			(0x11A0 & RC5_MASK)		/*!< Ch + Taste */
#define RC5_CH_MINUS		(0x11A1 & RC5_MASK)		/*!< Ch - Taste */


#define RC5_CODE_UP			RC5_CODE_STILL			/*!< Taste Hoch */
#define RC5_CODE_DOWN		RC5_CODE_STOP			/*!< Taste Runter */
#define RC5_CODE_LEFT		RC5_CODE_BWD			/*!< Taste Links */
#define RC5_CODE_RIGHT		RC5_CODE_FWD			/*!< Taste Rechts */
#define RC5_CODE_OK			(0x0017 & RC5_MASK)			/*!< Taste OK */
#endif // RC_HAVE_HQ_RC_UNIVERS29_334
Danach ändere ich in Eclipse -> Project-Explorer -> ct-Bot -> ui -> rc5.c die Zeile

Code: Alles auswählen

case RC5_CODE_PWR:		rc5_emergency_stop(); break;
in

Code: Alles auswählen

case RC5_CODE_OK:		rc5_emergency_stop(); break;
und speichere, kein Fehler.

Jetzt wechsele ich zurück nach rc5-codes.h und ändere Schrittweise die Belegung von

Code: Alles auswählen

#define RC5_CODE_UP			RC5_CODE_STILL			/*!< Taste Hoch */
#define RC5_CODE_DOWN		RC5_CODE_STOP			/*!< Taste Runter */
#define RC5_CODE_LEFT		RC5_CODE_BWD			/*!< Taste Links */
#define RC5_CODE_RIGHT		RC5_CODE_FWD			/*!< Taste Rechts */
Also beginnend mit

Code: Alles auswählen

#define RC5_CODE_UP			RC5_CODE_STILL			/*!< Taste Hoch */
in den Wert, den mein Bot für meine UP-Taste des Steuerkreuzes anzeigt (1020), also

Code: Alles auswählen

#define RC5_CODE_UP			(0x1020 & RC5_MASK)			/*!< Taste Hoch */
Ich speichere: Fehler!
Description Resource Path Location Type
duplicate case value rc5.c /ct-Bot/ui line 276 C/C++ Problem
make: *** [ui/rc5.o] Error 1 ct-Bot C/C++ Problem
make: *** Waiting for unfinished jobs.... ct-Bot C/C++ Problem
previously used here rc5.c /ct-Bot/ui line 268 C/C++ Problem
recipe for target 'ui/rc5.o' failed subdir.mk /ct-Bot/Debug-MCU-m1284p/ui line 24 C/C++ Problem
"Duplicate case value" zeigt mir in rc5.c die Zeile

Code: Alles auswählen

case RC5_CH_PLUS:		bot_servo(NULL, SERVO1, DOOR_CLOSE); break;
Nun ist es so, dass der Code für die Standard-FB beim Drücken der UP-Taste tatsächlich die Bot-Klappe schließt. Der Code der Standard-FB "verlinkt" die Taste RC5_CODE_UP mit RC5_CODE_STILL:

Code: Alles auswählen

#define RC5_CODE_STILL		(0x11A9 & RC5_MASK)		/*!< Pause Taste */
Eigenartig daran ist, dass RC5_CODE_STILL nirgends in rc5.c genutzt wird.

Was hat das also mit der Fehlermeldung zu tun, die "Duplicate case value" für

Code: Alles auswählen

case RC5_CH_PLUS:		bot_servo(NULL, SERVO1, DOOR_CLOSE); break;
meldet, da RC5_CH_PLUS doch ordentlich definiert ist mit

Code: Alles auswählen

define RC5_CH_PLUS			(0x11A0 & RC5_MASK)		/*!< Ch + Taste */
...also einem ganz anderen Wert als RC5_CODE_STILL (und damit auch RC5_CODE_UP) zugeordnet ist?

#-o

Danke im Voraus!

Edit: Verdeutlichungen in Formulierungen.
Zuletzt geändert von anonybot am 03 Mär 2016, 00:59, insgesamt 1-mal geändert.
Von mir selbst verfasste (daher nicht zitierte) Inhalte dieses Beitrags sind zur Weiternutzung unter CC-BY-SA freigegeben +++ ct-Bot -> Libre-Bot? - Diskussion zur Zukunft des ct-Bots +++ anonybot sagt hello!

anonybot
Friends of Sonny
Friends of Sonny
Beiträge: 194
Registriert: 07 Okt 2015, 00:14

Re: Probleme bei der Programmierung meiner Fernbedienung

Beitrag von anonybot » 03 Mär 2016, 00:40

Problem gelöst. Kurz gefasst:

Auf meiner Fernbedienung rufen unterschiedliche Tasten die selben Codes hervor. Wenn ich daher eine Taste belegt habe, deren "Zwilling" aber mit einer anderen Bot-Funktion belegt war, hat Eclipse natürlich einen Konflikt gemeldet. Bei mir sind das bspw. die Tasten Steuerkreuz-hoch und Programm-plus, die beide in der Originalbelegung die Bot-Klappe öffnen.

Man sollte zur Sicherheit also erstmal sämtliche Codes aufschreiben, die die Tastatur über das Bot-Display ausgibt und sicherstellen, dass jede Taste einen einmaligen Code - sofern zwei Tasten den selben Code haben, können diese folglich nur die die selbe Funktion verwendet werden.
Zuletzt geändert von anonybot am 03 Mär 2016, 22:56, insgesamt 1-mal geändert.
Von mir selbst verfasste (daher nicht zitierte) Inhalte dieses Beitrags sind zur Weiternutzung unter CC-BY-SA freigegeben +++ ct-Bot -> Libre-Bot? - Diskussion zur Zukunft des ct-Bots +++ anonybot sagt hello!

tobi
Friends of Gort
Friends of Gort
Beiträge: 63
Registriert: 28 Apr 2011, 16:45

Re: [solved] Problem bei der Programmierung meiner Fernbedie

Beitrag von tobi » 03 Mär 2016, 22:05

Hi,

auch wenn du das Problem schon gelöst hast :) noch zwei Hinweise:
  • Hast du die Dokumentation am Anfang der Datei rc5-codes.h gelesen?

    Code: Alles auswählen

    /* Im Normalbetrieb hilft die Beschraenkung der RC5_MASK auf RC5_COMMAND dem Bot,
     * moeglichst viele FBs zu erkennen.
     * Zum erfassen neuer Codes sollte man unbedingt RC5_MASK auf (RC5_COMMAND|RC5_ADDRESS) setzen */
    Dadurch ändert sich die Anzeige im Display, das sollte man beachten, wenn man die Codes dort überprüft.
  • Dass sich der Code mit Technisat_TTS35AI nicht übersetzen lässt, ist vermutlich ein Fehler, der nicht aufgefallen ist, weil das niemand mit dieser Fernbedienung gemeldet hat. Wenn sie weniger unterschiedliche Tasten hast, wie du geschrieben hast, gehen vermutlich ein paar Funktionen nicht, eben weil es dafür dann keine Tasten mehr gibt. Den Fehler beim Übersetzen sollte man vielleicht aber trotzdem korrigieren.
Tobi

anonybot
Friends of Sonny
Friends of Sonny
Beiträge: 194
Registriert: 07 Okt 2015, 00:14

Re: [solved] Problem bei der Programmierung meiner Fernbedie

Beitrag von anonybot » 03 Mär 2016, 23:02

tobi hat geschrieben:Hi,

auch wenn du das Problem schon gelöst hast :) noch zwei Hinweise:
Hi tobi,

besten Dank! :)
tobi hat geschrieben:
  • Hast du die Dokumentation am Anfang der Datei rc5-codes.h gelesen?
Ja, aber wie immer wie ein S****** vorm Uhrwerk. #-o
tobi hat geschrieben:

Code: Alles auswählen

/* Im Normalbetrieb hilft die Beschraenkung der RC5_MASK auf RC5_COMMAND dem Bot,
 * moeglichst viele FBs zu erkennen.
 * Zum erfassen neuer Codes sollte man unbedingt RC5_MASK auf (RC5_COMMAND|RC5_ADDRESS) setzen */
Dadurch ändert sich die Anzeige im Display, das sollte man beachten, wenn man die Codes dort überprüft.
Also

Code: Alles auswählen

// Normalbetrieb
#define RC5_MASK (RC5_COMMAND)					/*!< Welcher Teil des Kommandos wird ausgewertet? */
// Erfassen neuer FB-Codes
//#define RC5_MASK (RC5_COMMAND|RC5_ADDRESS)	/*!< Welcher Teil des Kommandos wird ausgewertet? */
in

Code: Alles auswählen

// Normalbetrieb
//#define RC5_MASK (RC5_COMMAND)					/*!< Welcher Teil des Kommandos wird ausgewertet? */
// Erfassen neuer FB-Codes
#define RC5_MASK (RC5_COMMAND|RC5_ADDRESS)	/*!< Welcher Teil des Kommandos wird ausgewertet? */
ändern, Bot flashen und dann erst die Codes auf dem Display auslesen?
tobi hat geschrieben:
  • Dass sich der Code mit Technisat_TTS35AI nicht übersetzen lässt, ist vermutlich ein Fehler, der nicht aufgefallen ist, weil das niemand mit dieser Fernbedienung gemeldet hat. Wenn sie weniger unterschiedliche Tasten hast, wie du geschrieben hast, gehen vermutlich ein paar Funktionen nicht, eben weil es dafür dann keine Tasten mehr gibt. Den Fehler beim Übersetzen sollte man vielleicht aber trotzdem korrigieren.
Okay, allerdings bin ich atm sehr froh, dass der Bot sich nun so steuern lässt wie gewünscht. Kann ich meinen aktuellen Code irgendwie "snapshotten", den Original-Code herunterladen, mir die Fehlermeldung genauer notieren und dann wieder auf den Snapshot zurückgehen?
Von mir selbst verfasste (daher nicht zitierte) Inhalte dieses Beitrags sind zur Weiternutzung unter CC-BY-SA freigegeben +++ ct-Bot -> Libre-Bot? - Diskussion zur Zukunft des ct-Bots +++ anonybot sagt hello!

lenchen
Friends of Gort
Friends of Gort
Beiträge: 56
Registriert: 12 Apr 2011, 15:31

Re: [solved] Problem bei der Programmierung meiner Fernbedie

Beitrag von lenchen » 15 Apr 2016, 21:23

Hi,
anonybot hat geschrieben:Also

Code: Alles auswählen

// Normalbetrieb
#define RC5_MASK (RC5_COMMAND)					/*!< Welcher Teil des Kommandos wird ausgewertet? */
// Erfassen neuer FB-Codes
//#define RC5_MASK (RC5_COMMAND|RC5_ADDRESS)	/*!< Welcher Teil des Kommandos wird ausgewertet? */
in

Code: Alles auswählen

// Normalbetrieb
//#define RC5_MASK (RC5_COMMAND)					/*!< Welcher Teil des Kommandos wird ausgewertet? */
// Erfassen neuer FB-Codes
#define RC5_MASK (RC5_COMMAND|RC5_ADDRESS)	/*!< Welcher Teil des Kommandos wird ausgewertet? */
ändern, Bot flashen und dann erst die Codes auf dem Display auslesen?
ja genau (falls das noch aktuell ist :roll: ).
anonybot hat geschrieben:Okay, allerdings bin ich atm sehr froh, dass der Bot sich nun so steuern lässt wie gewünscht. Kann ich meinen aktuellen Code irgendwie "snapshotten", den Original-Code herunterladen, mir die Fehlermeldung genauer notieren und dann wieder auf den Snapshot zurückgehen?
Check das Projekt doch einfach 2x (oder so oft wie nötig) aus, du kannst in Eclipse einfach mehrere Projekte vom Bot-Code machen mit unterschiedlichen Ständen. Musst dann nur einen anderen Projektnamen vergeben beim auschecken, also z.B. ct-Bot-testing.

Grüße
Lena

anonybot
Friends of Sonny
Friends of Sonny
Beiträge: 194
Registriert: 07 Okt 2015, 00:14

Re: [solved] Problem bei der Programmierung meiner Fernbedie

Beitrag von anonybot » 21 Apr 2016, 00:06

lenchen hat geschrieben:
anonybot hat geschrieben:Okay, allerdings bin ich atm sehr froh, dass der Bot sich nun so steuern lässt wie gewünscht. Kann ich meinen aktuellen Code irgendwie "snapshotten", den Original-Code herunterladen, mir die Fehlermeldung genauer notieren und dann wieder auf den Snapshot zurückgehen?
Check das Projekt doch einfach 2x (oder so oft wie nötig) aus, du kannst in Eclipse einfach mehrere Projekte vom Bot-Code machen mit unterschiedlichen Ständen. Musst dann nur einen anderen Projektnamen vergeben beim auschecken, also z.B. ct-Bot-testing.
Konnte das Problem zwischenzeitlich lösen, aber über Antworten freue ich mich immer! :D

Bis die Tage im IRC...
Von mir selbst verfasste (daher nicht zitierte) Inhalte dieses Beitrags sind zur Weiternutzung unter CC-BY-SA freigegeben +++ ct-Bot -> Libre-Bot? - Diskussion zur Zukunft des ct-Bots +++ anonybot sagt hello!

Antworten