Danke combie, genau das hatte ich gesucht. (Siehe Anhang im vorigen Post von combie)
Eine globale Variablendeklaration müsste man also in der .cpp-datei machen:
uint8_t globaleButtonVariable = 0; // definition
...
// Dort kann man sie dann auch verwenden ...
globaleButtonVariable = but_id;
In der .h-datei aber extern wieder machen.
extern uint8_t globaleButtonVariable; // deklaration
Und dann kann man sie in der Main-Datei also im Loop einfach verwenden:
void loop()
{
Usb.Task();
if(globaleButtonVariable)
{
Serial.print("Dn: ");
Serial.println(globaleButtonVariable, DEC);
globaleButtonVariable = 0; // nachricht konsumieren
}
}
Dank an combie!!
Aber sorry, wer kommt schon auf die Idee nach "Übersetzungseinheit C++ extern" zu suchen, wenn er einen Joystick in seinem Projekt einbinden will und sich durch huderte Seiten Beispielcode wühlt. Dass globale Variable nicht die schönste Lösung sind und ich die Ereignisse, die ja offenbar in den Libraries irgendwie definiert sind verwenden wollen würde, hatte ich auch bereits geschrieben. Inzwischen habe ich mir auch solch eine Lösung erarbeitet durch kleinweise Umarbeitung eines funktionierenden Beispiels (in meinem Fall das SRWS1 Steerinwheel.)
Hier für alle, die meine etwas andere Quick&Dirty-Lösung interessiert.
Um den Joystickzustände im Loop abzufragen schreib ich mir public Methoden im JoystickReportParser:
Hier die Ergänzungen im .h-file (die letzten beiden Zeilen kamen hinzu):
class JoystickReportParser : public HIDReportParser {
JoystickEvents *joyEvents;
uint8_t oldPad[RPT_GEMEPAD_LEN];
uint8_t oldHat;
uint16_t oldButtons;
uint8_t mode;
public:
JoystickReportParser(JoystickEvents *evt);
virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
virtual uint16_t getButtons(); // <--- hier wird eine neue Methode definiert.
virtual uint8_t getHatswitch(); // <--- hier eine Andere.
};
Im .cpp-file gibt man an, was die neuen Methoden tun sollen:
uint16_t JoystickReportParser::getButtons() {
return oldButtons;
}
uint8_t JoystickReportParser::getHatswitch() {
return oldHat>>4;
}
Und dann kann man im loop endlich darauf zugreifen:
JoystickEvents JoyEvents;
JoystickReportParser Joy(&JoyEvents);
// blabla weitere Definitionen ...
setup() {...}
void loop() {
Usb.Task();
Serial.print(" Buttons: ");
Serial.print(Joy.getButtons());
Serial.print(" Hat: ");
Serial.println(Joy.getHatswitch());
delay(200);
}
Das hat natürlich den Nachteil, dass in diesem oben gezeigten Beispielfall ein Tastendruck durch den Rost fällt, wenn die Taste nur ganz kurz (innerhalb der 200ms Delaytime) gedrückt wird. In meinem Anwendungsfall habe ich aber einen 10ms Updatezyklus und da geht nix mehr verloren.
Die Ereignisse stehen weitherhin zur Verfügung, wenn man die benutzen will, aber hier ging es ja darum, wie man die Zustände im Loop verwenden kann.
Natürlich muss man sich noch darum kümmern, dass das Joystick-Protokoll auch richtig ausgelesen wird und in den hier verwendeten Variablen "oldButtons" und "oldHat" das Richtige drinsteht. Das Protokoll ist ja von Joystick zu Joystick verschieden, aber das war hier ja nicht das Thema.