Witam,
napisałem kod (przerobiłem gotowca), który działa. Podczas rozbudowy kodu natrafiłem jednak na problem i nie potrafię sobie z nim poradzić (jestem mocno zielony w c/c++)
Chcę zwrócić za pomocą "return" tablicę data[3] do pętli loop() i tam chcę ją przypisać do zmiennej. Tablica znajduje się w void Events::OnChanged(const EventData *evt)
Z tego co się orientuję to mam tutaj odwołanie do metody znajdującej się w klasie i nie wiem jak to przerobić. Na sieci znalazłem informację, że trzeba przebudować klasę ale ja ledwo orientuję się co tutaj się dzieje więc to mnie przerasta
Potrzebuję wynik z tablicy data[] w loop() bo tam będę go przekazywał do kolejnych funkcji sterujących robotem
Link do biblioteki
Cały kod wygląda następująco:
#include <hiduniversal.h>
struct EventData{
uint8_t channel[7];
};
#define rpt_gamepad_len 7
class Events{
public:
virtual void OnChanged(const EventData *evt);
};
class ReportParser:public HIDReportParser{
Events *gamepadEvents;
uint64_t oldPad[rpt_gamepad_len];
public:
ReportParser(Events *evt):gamepadEvents(evt){};
virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
};
/////////////////////////////////////////////////////////////////////////////////////////
void ReportParser::Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf){
bool match = true;
for(uint8_t i=0; i<rpt_gamepad_len; i++){
if(buf[i] != oldPad[i]){
match = false;
break;
}
}
if(!match && gamepadEvents){
gamepadEvents->OnChanged((const EventData*)buf);
for(uint8_t i=0; i<rpt_gamepad_len; i++)
oldPad[i] = buf[i];
}
}
void Events::OnChanged(const EventData *evt){
int data[7];
for(uint8_t i=0; i<rpt_gamepad_len; i++){
data[i] = evt->channel[i];
Serial.println(data[i]); // tu wszystko dziala
return data[3]; // test tylko dla 3
}
}
/////////////////////////////////////////////////////////////////////////////////////////
USB Usb;
HIDUniversal Hid(&Usb);
Events gamepadEvents;
ReportParser Gamepad(&gamepadEvents);
void setup(){
Serial.begin(115200);
Serial.println("GAMEPAD");
if(Usb.Init() == -1)
Serial.println("OSC did not start");
delay(200);
if(!Hid.SetReportParser(0, &Gamepad))
ErrorMessage<uint8_t>(PSTR("SetReportParser"), 1);
}
void loop(){
Usb.Task();
//int x
//x = void Events::OnChanged(const EventData *evt) // test1 - nie działa
//x = data[3]; // nie wiem jak to tu przekazać
}
PS. Program przechwytuje naciśnięty przycisk w padzie połączonym do arduino przez usb host shield za pomoca usb przesyłającego radiowo sygnał. Piszę na wszelki wypadek jakby komuś ta wiedza była potrzebna do szczęścia