fix some websocket shit

This commit is contained in:
Laila van Reenen 2024-08-10 14:13:01 +02:00
parent 6d22572a75
commit 7844c38e51
Signed by: LailaTheElf
GPG Key ID: 1F4E6EE3E6DDF769
7 changed files with 64 additions and 23 deletions

View File

@ -160,7 +160,7 @@ async def run(ws, path):
client = await new_boat(message[0], message[2], ws)
if client is not None:
async for message in ws:
print("boat" + client['id'] + " says " + message)
print("boat" + client['id'] + " says '" + message + "'")
break
async def main():

@ -1 +1 @@
Subproject commit ae59563e7da09ba3f974be92b8a02bdfdf7d1dab
Subproject commit 8204cb08658d293e65a27af46c4d4596bdedaf91

View File

@ -3,18 +3,10 @@
#include <stdint.h>
// #define WIFI_SSID "UPC46273"
// #define WIFI_AUTH WIFI_AUTH_WPA_PSK
// #define WIFI_PASS "SPHZHKRY"
// #define WIFI_SSID "Wifi Ding"
// #define WIFI_AUTH WIFI_AUTH_WPA_WPA2_PSK
// #define WIFI_PASS "Weet ik niet."
#define WIFI_SSID "MBCBootjes"
#define WIFI_AUTH WIFI_AUTH_WPA_WPA2_PSK
#define WIFI_PASS "hetgrootedok"
// #define UDP_PORT 1234
#define BOAT_NAME "Test boat"
static uint8_t BoatId = 1;
@ -28,7 +20,8 @@ static uint8_t BoatId = 1;
#define SERVOS_CH5
#define SERVOS_CH6
#define WS_RX_BUFFER_LEN 512
#define WS_RX_BUFFER_LEN 1024
#define WS_TX_BUFFER_LEN 128
#define WS_URL "ws://10.254.0.1:8080/"
#define LOGGER_BUFFER_SIZE 65536

View File

@ -21,6 +21,12 @@ void logger_printf(const char *fmt, ...)
puts(&Logger_buff[Logger_buff_wp]);
Logger_buff_wp += len + 1;
if (Logger_buff_wp >= LOGGER_BUFFER_SIZE)
{
logger_clearBuffer();
LOG_W("buffer cleard, becouse it was full");
}
}
void logger_printFullLog(CLI_t* cli)

View File

@ -134,12 +134,13 @@ void app_main() {
case STATE_WS_CONNECTING:
ws_client = ws_connect(WS_URL);
cli_ws_client = CLI_init((CLI_charOutFn)&ws_putchar, cmdList);
MainState = STATE_WS_WAIT_CONNECTION;
break;
case STATE_WS_WAIT_CONNECTION:
if (ws_client->connected)
{
cli_ws_client = CLI_init((CLI_charOutFn)&charOut_ws, cmdList);
cli_ws_client.echo = false;
MainState = STATE_IDEL;
}
break;
@ -149,14 +150,16 @@ void app_main() {
case STATE_DRIVING:
if (!ws_client->connected)
{
CLI_deinit(&cli_ws_client);
MainState = STATE_WS_WAIT_CONNECTION;
}
charIn = ws_getchar(ws_client);
if (charIn != 255)
// charIn = ws_getchar(ws_client);
while ((charIn = ws_getchar(ws_client)) != 255)
{
CLI_charIn(&cli_ws_client, charIn);
}
ws_sendData(ws_client);
break;
}
}

View File

@ -42,20 +42,22 @@ static void ws_event_handler(void* handler_args, esp_event_base_t base, int32_t
break;
case WEBSOCKET_EVENT_DATA:
LOG_D("ws_event_handler: data recieved (opcode=%02x)", data->op_code);
if (data->op_code == 0x2)
// LOG_D("ws_event_handler: data recieved opcode %d", data->op_code);
if (data->op_code == 0x02)
{
LOG_D("ws_event_handler: binary data recieved");
// ESP_LOG_BUFFER_HEX("Received binary data", data->data_ptr, data->data_len);
}
}
else if (data->op_code == 0x08 && data->data_len == 2)
{
LOG_W("ws_event_handler: recieved closed message (code: %d)", (((int16_t)(data->data_ptr[0]))<<8) + data->data_ptr[1]);
// ESP_LOGW(TAG, "Received closed message with code=%d", 256 * data->data_ptr[0] + data->data_ptr[1]);
}
else
}
else if (data->op_code == 0x09 || data->op_code == 0x0A)
{ // pong or pong packet
// do nothing, handled by esp_websocket
}
else if (data->op_code == 0x01 && data->data_len > 0)
{
LOG_D("ws_event_handler: data recieved (opcode: %02x, size: %d): '%.*s'", data->op_code, data->data_len, data->data_len, (char*) data->data_ptr);
// LOG_D("ws_event_handler: cmd recieved (len: %d): '%.*s'", data->data_len, data->data_len, (char*) data->data_ptr);
uint16_t sizeLeft = WS_RX_BUFFER_LEN + client->rxBuffer_rp - client->rxBuffer_wp;
if (sizeLeft > WS_RX_BUFFER_LEN)
{
@ -74,12 +76,20 @@ static void ws_event_handler(void* handler_args, esp_event_base_t base, int32_t
memcpy(&client->rxBuffer[0], data->data_ptr + sizeLeft, data->data_len - sizeLeft);
}
client->rxBuffer_wp += data->data_len;
if (client->txBuffer_wp >= WS_RX_BUFFER_LEN)
{
client->txBuffer_wp -= WS_RX_BUFFER_LEN;
}
}
else
{
LOG_E("ws_event_handler: no space left in buffer. data ignored (free space: %u)", data->data_len, sizeLeft + client->rxBuffer_rp);
}
}
else
{
LOG_D("ws_event_handler: data recieved (opcode: 0x%02x, size: %d): '%.*s'", data->op_code, data->data_len, data->data_len, (char*) data->data_ptr);
}
break;
case WEBSOCKET_EVENT_ERROR:
if (data->error_handle.esp_ws_handshake_status_code != 0)
@ -94,6 +104,9 @@ static void ws_event_handler(void* handler_args, esp_event_base_t base, int32_t
LOG_E("ws_event_handler: captured as transport's socket errno %d", data->error_handle.esp_transport_sock_errno);
}
break;
default:
LOG_D("ws_event_handler: a unkown event happened: %d", event_id);
break;
}
}
@ -102,6 +115,7 @@ ws_client_t ws_connect(char *url)
ws_client_t client = malloc(sizeof(ws_client_data_t));
client->rxBuffer_rp = 0;
client->rxBuffer_wp = 0;
client->txBuffer_wp = 0;
memset(&(client->rxBuffer[0]), 0, WS_RX_BUFFER_LEN);
const esp_websocket_client_config_t ws_conf = {
@ -132,5 +146,27 @@ int ws_getchar(ws_client_t client)
void ws_putchar(ws_client_t client, char c)
{
esp_websocket_client_send_text(client->handle, &c, 1, 1000); //TODO: convert RTOS tick in ms
if (client->txBuffer_wp == WS_TX_BUFFER_LEN)
{
ws_sendData(client);
if (client->txBuffer_wp == WS_TX_BUFFER_LEN)
{
LOG_E("ws_sendData: no space left in tx buffer. data ignored");
return;
}
}
client->txBuffer[client->txBuffer_wp] = c;
client->txBuffer_wp++;
}
void ws_sendData(ws_client_t client)
{
if ((client->txBuffer_wp > 0) && esp_websocket_client_is_connected(client->handle))
{
LOG_D("ws_sendData: (%d b) '%.*s'", client->txBuffer_wp, client->txBuffer_wp, (char *)&client->txBuffer[0]);
esp_websocket_client_send_text(client->handle, (char *)&client->txBuffer[0], client->txBuffer_wp, 1000 * portTICK_PERIOD_MS);
client->txBuffer_wp = 0;
}
}

View File

@ -13,11 +13,14 @@ typedef struct {
unsigned char rxBuffer[WS_RX_BUFFER_LEN];
uint16_t rxBuffer_wp;
uint16_t rxBuffer_rp;
unsigned char txBuffer[WS_TX_BUFFER_LEN];
uint16_t txBuffer_wp;
} ws_client_data_t;
typedef ws_client_data_t* ws_client_t;
ws_client_t ws_connect(char *url);
int ws_getchar(ws_client_t client);
void ws_putchar(ws_client_t client, char c);
void ws_sendData(ws_client_t client);
#endif