Witam,
Mam problem aby w Arduino przekazać zmienną z jednej funkcji do drugiej (obie funkcje są w innych klasach). Według błędu powinienem zadeklarować funkcję Decoder w klasie Events tylko nie wiem jak, ponieważ używając void dalej mi to nie działa
Chodzi mi o ten fragment kodu:
void Events::OnChanged(const EventData *evt){
for(uint8_t i=0; i<rpt_len; i++){
data[i] = evt->channel[i];
}
Decoder(data[0], data[1], data[2], data[3], data[4], data[5], data[6]); // 'Decoder' was not declared in this scope
}
Cały program:
#include <hiduniversal.h>
struct EventData{
uint8_t channel[7];
};
#define rpt_len 7
class Events{
public:
int data[7];
virtual void OnChanged(const EventData *evt);
//virtual void Decoder(int d0, int d1, int d2, int d3, int d4, int d5, int d6);
};
class ReportParser : public HIDReportParser{
Events *E;
uint64_t oldPad[rpt_len];
public:
ReportParser(Events *evt) : E(evt){};
virtual void Parse(USBHID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
};
class Channels{
public:
virtual void Decoder(int d1, int d2, int d3, int d4, int d5, int d6, int d7);
};
/////////////////////////////////////////////////////////////////////////////////////////
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_len; i++){
if(buf[i] != oldPad[i]){
match = false;
break;
}
}
if(!match && E){
E->OnChanged((const EventData*)buf);
for(uint8_t i=0; i<rpt_len; i++)
oldPad[i] = buf[i];
}
}
void Events::OnChanged(const EventData *evt){
for(uint8_t i=0; i<rpt_len; i++){
data[i] = evt->channel[i];
}
Decoder(data[0], data[1], data[2], data[3], data[4], data[5], data[6]); // 'Decoder' was not declared in this scope
}
//void Events::Decoder(int d0, int d1, int d2, int d3, int d4, int d5, int d6){
void Channels::Decoder(int d0, int d1, int d2, int d3, int d4, int d5, int d6){
if (d0 == 32) Serial.println("RB");
if (d0 == 128) Serial.println("RT");
if (d0 == 1) Serial.println("Y");
if (d0 == 2) Serial.println("B");
if (d0 == 4) Serial.println("A");
if (d0 == 8) Serial.println("X");
if (d5 != 128) {Serial.print("Axis R X: "); Serial.println(d5);}
if (d6 != 128) {Serial.print("Axis R Y: "); Serial.println(d6);}
if (d1 == 8) Serial.println("R");
if (d1 == 1) Serial.println("SELECT");
if (d1 == 2) Serial.println("START");
if (d1 == 16) Serial.println("HOME");
if (d0 == 16) Serial.println("LB");
if (d0 == 64) Serial.println("LT");
if (d2 == 0) Serial.println("UP");
if (d2 == 2) Serial.println("RIGHT");
if (d2 == 4) Serial.println("DOWN");
if (d2 == 6) Serial.println("LEFT");
if (d3 != 128) {Serial.print("Axis L X: "); Serial.println(d3);}
if (d4 != 128) {Serial.print("Axis L Y: "); Serial.println(d4);}
if (d1 == 4) Serial.println("L");
}
/////////////////////////////////////////////////////////////////////////////////////////
USB Usb;
HIDUniversal Hid(&Usb);
Events E;
ReportParser RP(&E);
void setup(){
Serial.begin(115200);
Serial.println("Gamepad");
if(Usb.Init() == -1)
Serial.println("OSC did not start");
delay(200);
if(!Hid.SetReportParser(0, &RP))
ErrorMessage<uint8_t>(PSTR("SetReportParser"), 1);
}
void loop(){
Usb.Task();
}