• 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

VPS Starter Arubacloud
0 głosów
521 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 (194,920 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 (194,920 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 (194,920 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 243 wizyt
pytanie zadane 1 maja 2021 w C i C++ przez Marak123 Stary wyjadacz (11,190 p.)
0 głosów
1 odpowiedź 286 wizyt
0 głosów
0 odpowiedzi 353 wizyt
pytanie zadane 19 lipca 2021 w C i C++ przez Marak123 Stary wyjadacz (11,190 p.)

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...