• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Arduino. Przekazanie zmiennej do funkcji w innej klasie

Object Storage Arubacloud
0 głosów
511 wizyt
pytanie zadane 9 lutego 2021 w C i C++ przez Miki Bywalec (2,480 p.)
zamknięte 10 lutego 2021 przez Miki

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();
}

 

komentarz zamknięcia: problem rozwiązany

1 odpowiedź

+1 głos
odpowiedź 10 lutego 2021 przez j23 Mędrzec (194,920 p.)

Zrób w klasie Events pole, które jest wskaźnikiem do obiektu (lub po prostu obiektem) klasy Channels. Ewentualnie niech Events dziedziczy po  Channels (wtedy odkomentuj linie 14).

komentarz 10 lutego 2021 przez Miki Bywalec (2,480 p.)

Dzięki za pomoc.

Zrobiłem obiekt:

Channels Ch;

i zmieniłem wywołanie funkcji:

Ch.Decoder(data[0], data[1], data[2], data[3], data[4], data[5], data[6]);

Podobne pytania

+1 głos
1 odpowiedź 129 wizyt
pytanie zadane 20 kwietnia 2022 w C i C++ przez Quatil Nowicjusz (130 p.)
0 głosów
0 odpowiedzi 78 wizyt
+1 głos
1 odpowiedź 854 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...