From 1072e349c0517dc0d15dd74c7ccde065a6c036b0 Mon Sep 17 00:00:00 2001 From: Sander Speetjens Date: Fri, 1 Dec 2023 23:33:01 +0100 Subject: [PATCH] tcp_cmd After testing --- project/Core/Src/tcp_cmd.c | 148 ++++++++++++++++++++++++++----------- 1 file changed, 103 insertions(+), 45 deletions(-) diff --git a/project/Core/Src/tcp_cmd.c b/project/Core/Src/tcp_cmd.c index 5982430..dfdb1fe 100644 --- a/project/Core/Src/tcp_cmd.c +++ b/project/Core/Src/tcp_cmd.c @@ -10,8 +10,8 @@ #define MAX_CMD_LEN 50 static const char* TAG = "tcp_cmd"; -static uint32_t color_txt = 0xff000000; // Store text color -static uint32_t color_bg = 0xff000000; // Store background color +static uint32_t color_txt = 0xff000000; // Store text color +static uint32_t color_bg = 0xff000000; // Store background color static void tcp_cmd_write(struct tcp_pcb* pcb, const char* str); static void tcp_cmd_print_header(struct tcp_pcb* pcb); @@ -45,17 +45,16 @@ static void tcp_cmd_print_header(struct tcp_pcb* pcb) { * @brief This function prints the help text * @param pcb The tcp_pcb struct to write to */ -void static void tcp_cmd_print_help(struct tcp_pcb* pcb) { - tcp_cmd_write(pcb, - "help : shows a list of commands\r\n" - "text \"\" : puts text on the lcd\r\n" - "color : set the background color of the lcd\r\n" - "textColor : set the color of the text\r\n" - "listImages : shows a list with images in the filesystem\r\n" - "setImage : put an image on the screen\r\n" - "setGift : put a gif on the screen\r\n" - "exit : closes the connection\r\n"); + tcp_cmd_write(pcb, "help : shows a list of commands\r\n" + "clear text/images : clears the text or images on the lcd\r\n" + "text \"\" : puts text on the lcd\r\n" + "bgColor : set the background color of the lcd\r\n" + "color : set the color of the text\r\n" + "listFiles : shows a list with images in the filesystem\r\n" + "setImage : put an image on the screen\r\n" + "setGif : put a gif on the screen\r\n" + "exit : closes the connection\r\n"); } /** @@ -154,48 +153,92 @@ static bool tcp_cmd_parser(struct tcp_pcb* pcb, int argc, char** argv) { } str_tolower(argv[0]); if (strcmp(argv[0], "help") == 0) { + LOG_INFO(TAG, "Printing help"); tcp_cmd_print_help(pcb); return false; - } if (strcmp(argv[0], "text") == 0) { - if (argc == 2) { + } + if (strcmp(argv[0], "clear") == 0) { + if (argc == 1) { + LOG_INFO(TAG, "Clearing screen"); lcd_clear_text(); - lcd_display_text((uint8_t*)argv[1], 10, 10, color_txt, color_bg, LCD_FONT24); + lcd_clear_images(); return false; } + if (argc == 2) { + if (strcmp(argv[1], "text") == 0) { + LOG_INFO(TAG, "Clearing text"); + lcd_clear_text(); + return false; + } + if (strcmp(argv[1], "images") == 0) { + LOG_INFO(TAG, "Clearing images"); + lcd_clear_images(); + return false; + } + LOG_WARN(TAG, "Bad usage of clear"); + tcp_cmd_write(pcb, "Usage: clear text\r\n"); + tcp_cmd_write(pcb, "Usage: clear images\r\n"); + return false; + } + } + if (strcmp(argv[0], "text") == 0) { + if (argc == 2) { + LOG_INFO(TAG, "Setting text %s @ 10, 10", argv[1]); + lcd_display_text((const char*)argv[1], 10, 10, color_txt, color_bg, LCD_FONT24); + return false; + } + if (argc == 4) { + LOG_INFO(TAG, "Setting text %s @ %lu, %lu", argv[1], (uint32_t)strtoul(argv[2], NULL, 10), (uint32_t)strtoul(argv[3], NULL, 10)); + lcd_display_text((const char*)argv[1], (uint32_t)strtoul(argv[2], NULL, 10), (uint32_t)strtoul(argv[3], NULL, 10), color_txt, color_bg, LCD_FONT24); + return false; + } + LOG_WARN(TAG, "Bad usage of text"); tcp_cmd_write(pcb, "Usage: text \"\"\n"); tcp_cmd_write(pcb, "Usage: text \n"); return false; - } if (strcmp(argv[0], "bgcolor") == 0) { + } + if (strcmp(argv[0], "bgcolor") == 0) { if (argc == 2) { - color_bg = (uint32_t)strtol(argv[1], NULL, 16); + LOG_INFO(TAG, "Setting background color to %s", argv[1]); + color_bg = (uint32_t)strtoul(argv[1], NULL, 16); color_bg |= 0xff000000; return false; - } if (argc == 4) { + } + if (argc == 4) { + LOG_INFO(TAG, "Setting background color to %s %s %s", argv[1], argv[2], argv[3]); color_bg = 0xff000000; - color_bg |= (uint32_t)strtol(argv[1], NULL, 10) << 16; - color_bg |= (uint32_t)strtol(argv[2], NULL, 10) << 8; - color_bg |= (uint32_t)strtol(argv[3], NULL, 10); + color_bg |= (uint32_t)strtoul(argv[1], NULL, 10) << 16; + color_bg |= (uint32_t)strtoul(argv[2], NULL, 10) << 8; + color_bg |= (uint32_t)strtoul(argv[3], NULL, 10); return false; } + LOG_WARN(TAG, "Bad usage of bgcolor"); tcp_cmd_write(pcb, "Usage: bgcolor \n"); tcp_cmd_write(pcb, "Usage: bgcolor r g b\n"); return false; - } if (strcmp(argv[0], "color") == 0) { + } + if (strcmp(argv[0], "color") == 0) { if (argc == 2) { - color_txt = (uint32_t)strtol(argv[1], NULL, 16); + LOG_INFO(TAG, "Setting text color to %s", argv[1]); + color_txt = (uint32_t)strtoul(argv[1], NULL, 16); color_txt |= 0xff000000; return false; - } if (argc == 4) { + } + if (argc == 4) { + LOG_INFO(TAG, "Setting text color to %s %s %s", argv[1], argv[2], argv[3]); color_txt = 0xff000000; - color_txt |= (uint32_t)strtol(argv[1], NULL, 10) << 16; - color_txt |= (uint32_t)strtol(argv[2], NULL, 10) << 8; - color_txt |= (uint32_t)strtol(argv[3], NULL, 10); + color_txt |= (uint32_t)strtoul(argv[1], NULL, 10) << 16; + color_txt |= (uint32_t)strtoul(argv[2], NULL, 10) << 8; + color_txt |= (uint32_t)strtoul(argv[3], NULL, 10); return false; } + LOG_WARN(TAG, "Bad usage of color"); tcp_cmd_write(pcb, "Usage: color 0x\n"); tcp_cmd_write(pcb, "Usage: color \n"); return false; - } if (strcmp(argv[0], "listimages") == 0) { + } + if (strcmp(argv[0], "listfiles") == 0) { + LOG_INFO(TAG, "Listing files"); void* mem = NULL; // Pointer for internal use by the llfs library llfs_file_t* file; while ((file = llfs_next_file(&mem, NULL)) != NULL) { @@ -203,51 +246,65 @@ static bool tcp_cmd_parser(struct tcp_pcb* pcb, int argc, char** argv) { tcp_cmd_write(pcb, "\r\n"); } return false; - } if (strcmp(argv[0], "setimage") == 0) { + } + if (strcmp(argv[0], "setimage") == 0) { if (argc >= 2) { ext = get_filename_ext(argv[1]); if (strcmp(ext, "bmp") != 0) { + LOG_WARN(TAG, "setimage: File is not a bmp"); tcp_cmd_write(pcb, "File is not a bmp\n"); return false; } - } if (argc == 2) { - lcd_clear_images(); + } + if (argc == 2) { + LOG_INFO(TAG, "Setting image %s @ 0, 0", argv[1]); lcd_draw_img_from_fs(argv[1], 0, 0); return false; - } if (argc == 4) { - lcd_clear_images(); - lcd_draw_img_from_fs(argv[1], (uint32_t)atoi(argv[2]), (uint32_t)atoi(argv[3])); + } + if (argc == 4) { + LOG_INFO(TAG, "Setting image %s @ %lu, %lu", argv[1], (uint32_t)strtoul(argv[2], NULL, 10), (uint32_t)strtoul(argv[3], NULL, 10)); + lcd_draw_img_from_fs(argv[1], (uint32_t)strtoul(argv[2], NULL, 10), (uint32_t)strtoul(argv[3], NULL, 10)); return false; } + LOG_WARN(TAG, "Bad usage of setimage"); tcp_cmd_write(pcb, "Usage: setimage \n"); tcp_cmd_write(pcb, "Usage: setimage \n"); return false; - } if (strcmp(argv[0], "setgif") == 0) { + } + if (strcmp(argv[0], "setgif") == 0) { if (argc >= 2) { - char* ext = get_filename_ext(argv[1]); + ext = get_filename_ext(argv[1]); if (strcmp(ext, "gif") != 0) { + LOG_WARN(TAG, "setgif: File is not a gif"); tcp_cmd_write(pcb, "File is not a gif\n"); return false; } - } if (argc == 2) { - lcd_clear_images(); + } + if (argc == 2) { + LOG_INFO(TAG, "Setting gif %s @ 0, 0", argv[1]); lcd_draw_gif_from_fs(argv[1], 0, 0); return false; - } if (argc == 4) { - lcd_clear_images(); - lcd_draw_gif_from_fs(argv[1], (uint32_t)atoi(argv[2]), (uint32_t)atoi(argv[3])); + } + if (argc == 4) { + LOG_INFO(TAG, "Setting gif %s @ %lu, %lu", argv[1], (uint32_t)strtoul(argv[2], NULL, 10), (uint32_t)strtoul(argv[3], NULL, 10)); + lcd_draw_gif_from_fs(argv[1], (uint32_t)strtoul(argv[2], NULL, 10), (uint32_t)strtoul(argv[3], NULL, 10)); return false; } + + LOG_WARN(TAG, "Bad usage of setgif"); tcp_cmd_write(pcb, "Usage: setgif \n"); tcp_cmd_write(pcb, "Usage: setgif \n"); return false; - } if (strcmp(argv[0], "exit") == 0) { + } + if (strcmp(argv[0], "exit") == 0) { + LOG_INFO(TAG, "Closing connection"); tcp_cmd_write(pcb, "Exiting...\n"); lcd_clear_images(); lcd_clear_text(); tcp_close(pcb); return true; } + LOG_WARN(TAG, "Unknown command: %s", argv[0]); tcp_cmd_write(pcb, "Unknown command: "); tcp_cmd_write(pcb, argv[0]); tcp_cmd_write(pcb, "\n"); @@ -271,7 +328,6 @@ err_t tcp_cmd_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err) { char* next; LWIP_UNUSED_ARG(arg); - LOG_DEBUG(TAG, "TCP data received"); // Connection closed? if (p == NULL && err == ERR_OK) { @@ -297,6 +353,7 @@ err_t tcp_cmd_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err) { tcp_recved(pcb, p->tot_len); remove_newline(cmd); + LOG_INFO(TAG, "cmd: %s", cmd); // Split string into tokens by delimiter (space) argv[0] = get_next_token(cmd, " ", &next); argc = 1; @@ -311,9 +368,10 @@ err_t tcp_cmd_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err) { close_conn = tcp_cmd_parser(pcb, argc, argv); if (close_conn) { + LOG_INFO(TAG, "Closing connection"); tcp_cmd_close(pcb); } else { - tcp_cmd_write(pcb, "$> "); + tcp_cmd_write(pcb, "$>"); } defer: @@ -336,6 +394,7 @@ static err_t tcp_cmd_accept(void* arg, struct tcp_pcb* pcb, err_t err) { tcp_err(pcb, NULL); tcp_poll(pcb, NULL, 4); + LOG_INFO(TAG, "New connection accepted"); tcp_cmd_print_header(pcb); return ERR_OK; } @@ -368,7 +427,6 @@ void tcp_cmd_init(void) { return; } - tcp_pcb = tcp_listen(tcp_pcb); if (tcp_pcb == NULL) { LOG_CRIT(TAG, "Failed to listen");