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

question-closed C/C++ Arduino - jak zwrócić zmienną

Object Storage Arubacloud
0 głosów
138 wizyt
pytanie zadane 14 stycznia 2021 w C i C++ przez Miki Bywalec (2,480 p.)
zamknięte 15 stycznia 2021 przez Miki

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

komentarz zamknięcia: problem rozwiązany

2 odpowiedzi

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

Chcę zwrócić za pomocą "return" tablicę data[3]

Niech ta tablica będzie polem klasy Events, wtedy będziesz miał do niej dostęp z poziomu gamepadEvents.

komentarz 15 stycznia 2021 przez Miki Bywalec (2,480 p.)

Dlaczego na najprostsze rozwiązania najtrudniej wpaść angry Dzięki działa idealnie yes

 

Kod dla potomnych:

#include <hiduniversal.h>


struct EventData{
  uint8_t channel[7];
};

#define rpt_gamepad_len 7

class Events{
  public:
    int data[7];
    int ch0;
    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){
  for(uint8_t i=0; i<rpt_gamepad_len; i++){
    data[i] = evt->channel[i];
    //Serial.println(data[i]);
    ch0 = data[0];
  }
}


/////////////////////////////////////////////////////////////////////////////////////////


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 = gamepadEvents.ch0;
  Serial.println("test");
  Serial.println(x);
}

 

0 głosów
odpowiedź 15 stycznia 2021 przez Bondrusiek Maniak (61,370 p.)

Hej,

mam pomysł który może Cię nakierować do rozwiązania problemu:

class Events{
  public:
    virtual int OnChanged(const EventData *evt); //<-  chcesz aby funkcja zwróciła int wiec //zamieniamy void na int
};
 

Następnie musimy zmienić definicję funkcje:

int Events::OnChanged(const EventData *evt){ //zmiana void na int
  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 -> to musisz zwrócić po obliczeniu ich po pętli
}

Masz zdefiniowaną zmienną globalną gamePad typu Events i odwołaj się do niej w funkcji loop za pomocą '.':

void loop(){
  Usb.Task();
 
  uint8_t *buf; //musisz przypisać jej jakieś dane bo zostanie wykorzystane w tej funkcji
  int x;
  x = gamepadEvents.OnChanged((const EventData*)buf); // test1 - nie działa
   
}

 

komentarz 15 stycznia 2021 przez Miki Bywalec (2,480 p.)

Próbowałem we wszystkie możliwe strony pozmieniać ten kod ale w/w sposób nie działa. Albo zwraca 0 albo jakieś śmieci. Zrobię to bez return. Dzięki za pomoc yes

Podobne pytania

0 głosów
0 odpowiedzi 103 wizyt
pytanie zadane 13 października 2020 w C i C++ przez Miki Bywalec (2,480 p.)
0 głosów
2 odpowiedzi 187 wizyt
pytanie zadane 3 stycznia 2020 w Mikrokontrolery przez manager96 Bywalec (2,050 p.)
0 głosów
1 odpowiedź 570 wizyt
pytanie zadane 2 stycznia 2020 w Mikrokontrolery przez manager96 Bywalec (2,050 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...