diff --git a/ground-station.py b/ground-station.py index 7a5142b..e218ea7 100644 --- a/ground-station.py +++ b/ground-station.py @@ -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(): diff --git a/rx_esp32/lib/cli b/rx_esp32/lib/cli index ae59563..8204cb0 160000 --- a/rx_esp32/lib/cli +++ b/rx_esp32/lib/cli @@ -1 +1 @@ -Subproject commit ae59563e7da09ba3f974be92b8a02bdfdf7d1dab +Subproject commit 8204cb08658d293e65a27af46c4d4596bdedaf91 diff --git a/rx_esp32/src/config.h b/rx_esp32/src/config.h index e69e3d2..45127a7 100644 --- a/rx_esp32/src/config.h +++ b/rx_esp32/src/config.h @@ -3,18 +3,10 @@ #include -// #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 diff --git a/rx_esp32/src/logger.c b/rx_esp32/src/logger.c index 840a91c..868fc66 100644 --- a/rx_esp32/src/logger.c +++ b/rx_esp32/src/logger.c @@ -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) diff --git a/rx_esp32/src/main.c b/rx_esp32/src/main.c index 34ae828..a491f19 100644 --- a/rx_esp32/src/main.c +++ b/rx_esp32/src/main.c @@ -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; } } diff --git a/rx_esp32/src/ws.c b/rx_esp32/src/ws.c index 3a01ceb..88621cf 100644 --- a/rx_esp32/src/ws.c +++ b/rx_esp32/src/ws.c @@ -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; + } } diff --git a/rx_esp32/src/ws.h b/rx_esp32/src/ws.h index 433bcff..a3504c1 100644 --- a/rx_esp32/src/ws.h +++ b/rx_esp32/src/ws.h @@ -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