• 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

0 głosów
57 wizyt
pytanie zadane 9 lutego w C i C++ przez Miki Bywalec (2,450 p.)
zamknięte 10 lutego 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 przez j23 Mędrzec (166,180 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 przez Miki Bywalec (2,450 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

0 głosów
0 odpowiedzi 41 wizyt
+1 głos
1 odpowiedź 500 wizyt
0 głosów
2 odpowiedzi 866 wizyt
pytanie zadane 8 kwietnia 2017 w Mikrokontrolery przez Stami Gaduła (3,780 p.)

85,852 zapytań

134,629 odpowiedzi

298,887 komentarzy

56,719 pasjonatów

Advent of Code 2021

Top 15 użytkowników

  1. 807p. - rucin93
  2. 806p. - nidomika
  3. 806p. - CC PL
  4. 803p. - Whistleroosh
  5. 761p. - adrian17
  6. 754p. - Michal Drewniak
  7. 751p. - Mikbac
  8. 747p. - Mateusz Bogdan
  9. 686p. - Argeento
  10. 683p. - tokox
  11. 649p. - ScriptyChris
  12. 642p. - s. Dorota Kowalewska
  13. 609p. - Vinox
  14. 601p. - Marcin Harasimowicz
  15. 551p. - TheLukaszNs
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...