From 5670cb4e2d352f6bbcaffe83c32a8d0bdb3d7882 Mon Sep 17 00:00:00 2001 From: Rune Harlyk Date: Wed, 12 Jul 2023 15:21:30 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=B9=20Simplifies=20websocket=20message?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/lib/socket.ts | 2 +- lib/ServerHandlers/src/WebsocketHandler.h | 12 +- lib/ServerHandlers/src/Websockethandler.cpp | 137 ++++++++++---------- src/spot.cpp | 35 ++--- 4 files changed, 103 insertions(+), 83 deletions(-) diff --git a/app/src/lib/socket.ts b/app/src/lib/socket.ts index 6764b52..dcc7a3d 100644 --- a/app/src/lib/socket.ts +++ b/app/src/lib/socket.ts @@ -8,7 +8,7 @@ export const data = writable(new Float32Array(13)) export const status:Writable = writable('CLOSED') -export const socket = writable(null) +export const socket:Writable = writable(null) export const connect = (url:string) => { status.set('CONNECTING') diff --git a/lib/ServerHandlers/src/WebsocketHandler.h b/lib/ServerHandlers/src/WebsocketHandler.h index 73a32fd..7b4994a 100644 --- a/lib/ServerHandlers/src/WebsocketHandler.h +++ b/lib/ServerHandlers/src/WebsocketHandler.h @@ -1,5 +1,15 @@ #include +#include "ArduinoJson.h" -extern uint8_t wsData[6]; +extern uint8_t inputData[6]; + +struct websocket_message { + bool is_handled; + uint8_t identifier; + uint8_t* data; + size_t len; +}; + +extern websocket_message wsm; void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len); \ No newline at end of file diff --git a/lib/ServerHandlers/src/Websockethandler.cpp b/lib/ServerHandlers/src/Websockethandler.cpp index 03cfa0c..e7a7cc6 100644 --- a/lib/ServerHandlers/src/Websockethandler.cpp +++ b/lib/ServerHandlers/src/Websockethandler.cpp @@ -1,70 +1,75 @@ #include -uint8_t wsData[6] = {}; +uint8_t inputData[6] = {}; +uint16_t servoData[12] = {}; -void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){ - if(type == WS_EVT_CONNECT){ - Serial.printf("ws[%s][%u] connect\n", server->url(), client->id()); - client->printf("Hello Client %u :)", client->id()); - client->ping(); - } else if(type == WS_EVT_DISCONNECT){ - Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id()); - } else if(type == WS_EVT_ERROR){ - Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data); - } else if(type == WS_EVT_PONG){ - Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len)?(char*)data:""); - } else if(type == WS_EVT_DATA){ - AwsFrameInfo * info = (AwsFrameInfo*)arg; - String msg = ""; - if(info->final && info->index == 0 && info->len == len){ - //the whole message is in a single frame and we got all of it's data - //Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT)?"text":"binary", info->len); - - if(info->opcode == WS_TEXT){ - for(size_t i=0; i < info->len; i++) { - msg += (char) data[i]; - } - } else { - char buff[6]; - for(size_t i=0; i < info->len; i++) { - wsData[i] = (uint8_t) data[i]; - //sprintf(buff, "%02x ", (uint8_t) data[i]); - //msg += buff ; - } - } - } else { - //message is comprised of multiple frames or the frame is split into multiple packets - if(info->index == 0){ - if(info->num == 0) - Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); - Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len); - } - - Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT)?"text":"binary", info->index, info->index + len); - - if(info->opcode == WS_TEXT){ - for(size_t i=0; i < len; i++) { - msg += (char) data[i]; - } - } else { - char buff[3]; - for(size_t i=0; i < len; i++) { - sprintf(buff, "%02x ", (uint8_t) data[i]); - msg += buff ; - } - } - Serial.printf("%s\n",msg.c_str()); - - if((info->index + len) == info->len){ - Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len); - if(info->final){ - Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary"); - if(info->message_opcode == WS_TEXT) - client->text("I got your text message"); - else - client->binary("I got your binary message"); - } - } - } +esp_err_t parseControllerPacket(uint8_t* data, uint64_t lenght){ + log_i("parsing controller packet"); + for(size_t i=0; i < lenght; i++) { + inputData[i] = (uint8_t) data[i]; } -} \ No newline at end of file + return ESP_OK; +} + +esp_err_t parseServoPacket(uint8_t* _data, uint64_t lenght){ + log_i("parsing servo packet"); + uint16_t* data = (uint16_t*)_data; + for(size_t i=0; i < lenght/2; i++) { + servoData[i] = data[i]; + } + log_i("done parsing servo packet. There was %u int", lenght); + return ESP_OK; +} + +enum data_packet_t { + CONTROLLER_PACKET, + SERVO_PACKET, + toggle, +}; + +void handleWebSocketBufferMessage(void* arg, uint8_t* data, size_t len, AsyncWebSocket* server, AsyncWebSocketClient* client) { + wsm.identifier = data[0]; + wsm.data = data+1; + wsm.len = len; + wsm.is_handled = false; +} + +void handleWebSocketMessage(void* arg, uint8_t* data, size_t len, AsyncWebSocket* server, AsyncWebSocketClient* client) { + AwsFrameInfo* info = (AwsFrameInfo*)arg; + if(info->final && info->index == 0 && info->len == len){ + if(info->opcode == WS_TEXT) return; + handleWebSocketBufferMessage(arg, data, len, server, client); + } +} + +void handleNewConnection(AsyncWebSocket* server, AsyncWebSocketClient* client){ + log_i("ws[%s][%u] connect\n", server->url(), client->id()); + + StaticJsonDocument<600> json; + json["ssid"] = "Rune private network"; + json["password"] = "a9b8c7d6e5f4g3H2I1"; + json["sketchSize"] = ESP.getSketchSize(); + json["sketchMD5"] = ESP.getSketchMD5(); + json["freeSketchSize"] = ESP.getFreeSketchSpace(); + json["chipCores"] = ESP.getChipCores(); + json["chipModel"] = ESP.getChipModel(); + json["chipRevision"] = ESP.getChipRevision(); + json["cpuFreq"] = ESP.getCpuFreqMHz(); + json["heapSize"] = ESP.getHeapSize(); + json["psramSize"] = ESP.getPsramSize(); + json["sdkVersion"] = ESP.getSdkVersion(); + json["eFuseMac"] = ESP.getEfuseMac(); + json["resetReason"] = esp_reset_reason(); + + char data[400]; + size_t len = serializeJson(json, data); + client->text(data, len); +} + +void onWsEvent(AsyncWebSocket* server, AsyncWebSocketClient* client, AwsEventType type, void* arg, uint8_t* data, size_t len) { + if (type == WS_EVT_CONNECT) handleNewConnection(server, client); + else if (type == WS_EVT_DISCONNECT) log_i("ws[%s][%u] disconnect\n", server->url(), client->id()); + else if (type == WS_EVT_ERROR) log_i("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data); + else if (type == WS_EVT_PONG) log_i("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len) ? (char*)data : ""); + else if (type == WS_EVT_DATA) handleWebSocketMessage(arg, data, len, server, client); +} diff --git a/src/spot.cpp b/src/spot.cpp index 7ddb427..69c37aa 100644 --- a/src/spot.cpp +++ b/src/spot.cpp @@ -1,5 +1,7 @@ #include +websocket_message wsm; + Spot::Spot() : _events(EVENTSOURCE_PATH) , _ws(WEBSOCKET_PATH) @@ -56,21 +58,24 @@ uint8_t Spot::cpu_temperature(){ esp_err_t Spot::broadcast_data(){ if(millis() - _last_broadcast < 50) return ESP_OK; - size_t numContent = 13; - float content[numContent]; - content[0] = WiFi.RSSI(); - content[1] = _mpu.getTemp(); - content[2] = _mpu.getAccX(); - content[3] = _mpu.getAccY(); - content[4] = _mpu.getAccZ(); - content[5] = _mpu.getAngleX(); - content[6] = _mpu.getAngleY(); - content[7] = _mpu.getAngleZ(); - content[8] = cpu_temperature(); - content[9] = _leftUss.ping_cm(); - content[10] = _rightUss.ping_cm(); - content[11] = ESP.getFreeHeap(); - content[12] = ESP.getFreePsram(); + _mpu.update(); + size_t numContent = 14; + float content[numContent] = { + WiFi.RSSI(), + _mpu.getTemp(), + _mpu.getAngleX(), + _mpu.getAngleY(), + _mpu.getAngleZ(), + cpu_temperature(), + _leftUss.ping_cm(), + _rightUss.ping_cm(), + ESP.getFreeHeap(), + ESP.getFreePsram(), + ESP.getMinFreeHeap(), + ESP.getMinFreePsram(), + ESP.getMaxAllocHeap(), + ESP.getMaxAllocPsram(), + }; uint8_t* buf = (uint8_t*) &content; size_t buf_len = sizeof(buf);