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

question-closed [ESP32 C++] Błąd z funkcja w klasie

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
878 wizyt
pytanie zadane 28 kwietnia 2021 w C i C++ przez Marak123 Stary wyjadacz (11,190 p.)
zamknięte 29 kwietnia 2021 przez Marak123

Witam smiley

Ja przychodzę z takim pytaniem uzupełniającym moją wiedzę. 

Chodzi mi o błąd, ten błąd:

include/WebSocket.h:66:45: error: invalid use of non-static member function
   void initWebSocket()  { ws.onEvent(onEvent); server.addHandler(&ws); }

Ten błąd wskazuje na funkcję typu void która jest w klasie. Programuje płytkę esp32 i chciałem rozdzielić kod na parę plików i udało mi się to tylko że mam jeden mały problem z właśnie tą funkcją. 

Ta funkcja jest w klasie jak już wspomniałem i w tej funkcji są wykonywane 2 inne funkcje i wszystko by było spoko gdyby nie ten jeden błąd który wskazuje na wykonie ten pierwszej funkcji ws.onEvent(onEvent) i pokazuje ze jest jakiś problem z wywołanie tej funkcji bo musi być static albo coś i gdy definiuję tą unkcję onEvent jako static to dziła tylko ze wtedy sypie mi się reszta kodu bo wszystko muszę zmienić na static każdą funkcje wykonywaną w tej funkcji itp.

Wie ktoś może jak to naprawić?? I czy jest jakieś inne wyjście niż definiować tą funkcję onEvent jako static??

I w ogóle dlaczego tak się dzieje mając tą funkcje w klasie, bo poza klasą normalnie działa i nie ma problemu??

Bym był wdzięczny za każdą pomoc. Dzięki.

[Edit] Kodzik:

class WebSocket
{
public:
  AsyncWebServer server;
  AsyncWebSocket ws;
  static Variables variable;

  WebSocket(Variables vars) : server(80), ws("/ws") { Variables variable{vars}; };

  void notifyClients(StaticJsonDocument<JSON_OBJECT_SIZE(10)> json)
  {
    char data[500];
    size_t len = serializeJson(json, data);
    //Serial.println(data);
    ws.textAll(data, len);
  }

  void handleWebSocketMessage(void *arg, uint8_t *data, size_t len)
  {
    AwsFrameInfo *info = (AwsFrameInfo *)arg;
    if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT)
    {
      const uint8_t size = JSON_OBJECT_SIZE(10);
      StaticJsonDocument<size> json;
      DeserializationError err = deserializeJson(json, data);
      if (err) { Serial.printf("Wystapił blad z funkcja \"deserializeJson()\": %s\n", err.c_str()); return; }

      String pin = json["pin"];
      int position = inArray(variable.pins.size(), variable.pins, pin);
      if (json["action"] == "power") { digitalWrite(pin.toInt(), json["turn"]); variable.pinsPower[position] = !variable.pinsPower[position]; notifyClients(json); }
    }
  }

  void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len)
  {
    switch (type)
    {
    case WS_EVT_CONNECT:
      Serial.printf("Klient o ip \"%s\" polaczyl sie z WebSocket i nadano mu id #%u\n", client->remoteIP().toString().c_str(), client->id());
      break;
    case WS_EVT_DISCONNECT:
      Serial.printf("Klient WebSocket o id #%u zakonczyl polaczenie.\n", client->id());
      break;
    case WS_EVT_DATA:
      handleWebSocketMessage(arg, data, len);
      break;
    case WS_EVT_PONG:
      Serial.printf("PING: Uzytkownik o ip \"%s\" pingoje WebSocket\n", client->remoteIP().toString().c_str());
      break;
    case WS_EVT_ERROR:
      break;
    }
  }

  void initWebSocket()  { 
       ws.onEvent(onEvent); // <====== Tutaj wystepuje ten blad
       server.addHandler(&ws); 
  }

  //Server WWW
  static String processor(const String &var) { 
       if (var == "ARRAY") {
           int lengthStringArray = variable.pins.size(); 
           return createJSArray(lengthStringArray, variable); 
       } 
       return "ERROR";
  }

  void ServerInit() {
    server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(SPIFFS, "/index.html", String(), false, processor); });
  }

    server.begin();
  }
};

 

komentarz zamknięcia: Dzięki za pomoc
komentarz 28 kwietnia 2021 przez j23 Mędrzec (195,260 p.)
Bez (fragmentu) kodu ciężko coś sensownego odpowiedzieć.
komentarz 28 kwietnia 2021 przez Marak123 Stary wyjadacz (11,190 p.)
Ok w sumie racja wstawiłem już kodzik.

1 odpowiedź

0 głosów
odpowiedź 28 kwietnia 2021 przez j23 Mędrzec (195,260 p.)
edycja 29 kwietnia 2021 przez j23

Według dokumentacji AsyncWebSocket::onEvent przyjmuje argument typu AwsEventHandler, który jest funktorem std::function<...>, zatem można metodę zbindować. To powinno zadziałać:

#include <functional>
/* ... */

void initWebSocket()  
{ 
	using namespace std::placeholders;

	ws.onEvent(std::bind(&WebSocket::onEvent, this, _1, _2, _3, _4, _5, _6));
	server.addHandler(&ws); 
}

 

komentarz 28 kwietnia 2021 przez Marak123 Stary wyjadacz (11,190 p.)
Rzeczywiście działa ciekawe rozwiązanie wie wpadł bym na to.

Dzięki. Męczyłem się z tym od paru godzin.
komentarz 28 kwietnia 2021 przez Marak123 Stary wyjadacz (11,190 p.)
A odnośnie dokumentacji to dało by rady podesłać mi linka bym był bardzo wdzięczny.

Bo wpisując 'AsyncWebSocket documentation' to wyskakuje mi tylko GitHub i jakieś fora nie wiem za bardzo gdzie szukać opisu tych funkcji.
komentarz 28 kwietnia 2021 przez j23 Mędrzec (195,260 p.)
Z tą dokumentacją to trochę automatem pojechałem, bo w rzeczywistości przejrzałem nagłówki tej biblioteki.

Na GitHubie jest jakaś namiastka dokumentacji. Resztę pewnie musisz wyciągnąć ze źródeł.
komentarz 29 kwietnia 2021 przez Marak123 Stary wyjadacz (11,190 p.)

Aha ok to jeszcze raz dzięki za pomoc.yessmiley

Podobne pytania

+1 głos
0 odpowiedzi 398 wizyt
pytanie zadane 1 maja 2021 w C i C++ przez Marak123 Stary wyjadacz (11,190 p.)
0 głosów
1 odpowiedź 348 wizyt
0 głosów
0 odpowiedzi 648 wizyt
pytanie zadane 19 lipca 2021 w C i C++ przez Marak123 Stary wyjadacz (11,190 p.)

93,188 zapytań

142,204 odpowiedzi

322,027 komentarzy

62,515 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2817p. - dia-Chann
  2. 2769p. - Łukasz Piwowar
  3. 2759p. - Łukasz Eckert
  4. 2704p. - Tomasz Bielak
  5. 2678p. - Łukasz Siedlecki
  6. 2627p. - CC PL
  7. 2485p. - Marcin Putra
  8. 2443p. - rucin93
  9. 2418p. - Michal Drewniak
  10. 2367p. - Adrian Wieprzkowicz
  11. 2317p. - Mikbac
  12. 2156p. - Anonim 3619784
  13. 2127p. - Michał Telesz
  14. 1733p. - rafalszastok
  15. 1628p. - Dominik Łempicki (kapitan)
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 polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...