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