tcp_cmd
After testing
This commit is contained in:
@@ -10,8 +10,8 @@
|
|||||||
#define MAX_CMD_LEN 50
|
#define MAX_CMD_LEN 50
|
||||||
|
|
||||||
static const char* TAG = "tcp_cmd";
|
static const char* TAG = "tcp_cmd";
|
||||||
static uint32_t color_txt = 0xff000000; // Store text color
|
static uint32_t color_txt = 0xff000000; // Store text color
|
||||||
static uint32_t color_bg = 0xff000000; // Store background 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_write(struct tcp_pcb* pcb, const char* str);
|
||||||
static void tcp_cmd_print_header(struct tcp_pcb* pcb);
|
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
|
* @brief This function prints the help text
|
||||||
* @param pcb The tcp_pcb struct to write to
|
* @param pcb The tcp_pcb struct to write to
|
||||||
*/
|
*/
|
||||||
void
|
|
||||||
static void tcp_cmd_print_help(struct tcp_pcb* pcb) {
|
static void tcp_cmd_print_help(struct tcp_pcb* pcb) {
|
||||||
tcp_cmd_write(pcb,
|
tcp_cmd_write(pcb, "help : shows a list of commands\r\n"
|
||||||
"help : shows a list of commands\r\n"
|
"clear text/images : clears the text or images on the lcd\r\n"
|
||||||
"text \"<text>\" : puts text on the lcd\r\n"
|
"text \"<text>\" : puts text on the lcd\r\n"
|
||||||
"color <r> <g> <b> : set the background color of the lcd\r\n"
|
"bgColor <r> <g> <b> : set the background color of the lcd\r\n"
|
||||||
"textColor <r> <g> <b> : set the color of the text\r\n"
|
"color <r> <g> <b> : set the color of the text\r\n"
|
||||||
"listImages : shows a list with images in the filesystem\r\n"
|
"listFiles : shows a list with images in the filesystem\r\n"
|
||||||
"setImage <image_name> : put an image on the screen\r\n"
|
"setImage <image_name> : put an image on the screen\r\n"
|
||||||
"setGift <image_name> : put a gif on the screen\r\n"
|
"setGif <image_name> : put a gif on the screen\r\n"
|
||||||
"exit : closes the connection\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]);
|
str_tolower(argv[0]);
|
||||||
if (strcmp(argv[0], "help") == 0) {
|
if (strcmp(argv[0], "help") == 0) {
|
||||||
|
LOG_INFO(TAG, "Printing help");
|
||||||
tcp_cmd_print_help(pcb);
|
tcp_cmd_print_help(pcb);
|
||||||
return false;
|
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_clear_text();
|
||||||
lcd_display_text((uint8_t*)argv[1], 10, 10, color_txt, color_bg, LCD_FONT24);
|
lcd_clear_images();
|
||||||
return false;
|
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 \"<text>\"\n");
|
tcp_cmd_write(pcb, "Usage: text \"<text>\"\n");
|
||||||
tcp_cmd_write(pcb, "Usage: text <word>\n");
|
tcp_cmd_write(pcb, "Usage: text <word>\n");
|
||||||
return false;
|
return false;
|
||||||
} if (strcmp(argv[0], "bgcolor") == 0) {
|
}
|
||||||
|
if (strcmp(argv[0], "bgcolor") == 0) {
|
||||||
if (argc == 2) {
|
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;
|
color_bg |= 0xff000000;
|
||||||
return false;
|
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 = 0xff000000;
|
||||||
color_bg |= (uint32_t)strtol(argv[1], NULL, 10) << 16;
|
color_bg |= (uint32_t)strtoul(argv[1], NULL, 10) << 16;
|
||||||
color_bg |= (uint32_t)strtol(argv[2], NULL, 10) << 8;
|
color_bg |= (uint32_t)strtoul(argv[2], NULL, 10) << 8;
|
||||||
color_bg |= (uint32_t)strtol(argv[3], NULL, 10);
|
color_bg |= (uint32_t)strtoul(argv[3], NULL, 10);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
LOG_WARN(TAG, "Bad usage of bgcolor");
|
||||||
tcp_cmd_write(pcb, "Usage: bgcolor <background color>\n");
|
tcp_cmd_write(pcb, "Usage: bgcolor <background color>\n");
|
||||||
tcp_cmd_write(pcb, "Usage: bgcolor r g b\n");
|
tcp_cmd_write(pcb, "Usage: bgcolor r g b\n");
|
||||||
return false;
|
return false;
|
||||||
} if (strcmp(argv[0], "color") == 0) {
|
}
|
||||||
|
if (strcmp(argv[0], "color") == 0) {
|
||||||
if (argc == 2) {
|
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;
|
color_txt |= 0xff000000;
|
||||||
return false;
|
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 = 0xff000000;
|
||||||
color_txt |= (uint32_t)strtol(argv[1], NULL, 10) << 16;
|
color_txt |= (uint32_t)strtoul(argv[1], NULL, 10) << 16;
|
||||||
color_txt |= (uint32_t)strtol(argv[2], NULL, 10) << 8;
|
color_txt |= (uint32_t)strtoul(argv[2], NULL, 10) << 8;
|
||||||
color_txt |= (uint32_t)strtol(argv[3], NULL, 10);
|
color_txt |= (uint32_t)strtoul(argv[3], NULL, 10);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
LOG_WARN(TAG, "Bad usage of color");
|
||||||
tcp_cmd_write(pcb, "Usage: color 0x<txt color>\n");
|
tcp_cmd_write(pcb, "Usage: color 0x<txt color>\n");
|
||||||
tcp_cmd_write(pcb, "Usage: color <r> <g> <b>\n");
|
tcp_cmd_write(pcb, "Usage: color <r> <g> <b>\n");
|
||||||
return false;
|
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
|
void* mem = NULL; // Pointer for internal use by the llfs library
|
||||||
llfs_file_t* file;
|
llfs_file_t* file;
|
||||||
while ((file = llfs_next_file(&mem, NULL)) != NULL) {
|
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");
|
tcp_cmd_write(pcb, "\r\n");
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} if (strcmp(argv[0], "setimage") == 0) {
|
}
|
||||||
|
if (strcmp(argv[0], "setimage") == 0) {
|
||||||
if (argc >= 2) {
|
if (argc >= 2) {
|
||||||
ext = get_filename_ext(argv[1]);
|
ext = get_filename_ext(argv[1]);
|
||||||
if (strcmp(ext, "bmp") != 0) {
|
if (strcmp(ext, "bmp") != 0) {
|
||||||
|
LOG_WARN(TAG, "setimage: File is not a bmp");
|
||||||
tcp_cmd_write(pcb, "File is not a bmp\n");
|
tcp_cmd_write(pcb, "File is not a bmp\n");
|
||||||
return false;
|
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);
|
lcd_draw_img_from_fs(argv[1], 0, 0);
|
||||||
return false;
|
return false;
|
||||||
} if (argc == 4) {
|
}
|
||||||
lcd_clear_images();
|
if (argc == 4) {
|
||||||
lcd_draw_img_from_fs(argv[1], (uint32_t)atoi(argv[2]), (uint32_t)atoi(argv[3]));
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
LOG_WARN(TAG, "Bad usage of setimage");
|
||||||
tcp_cmd_write(pcb, "Usage: setimage <filename>\n");
|
tcp_cmd_write(pcb, "Usage: setimage <filename>\n");
|
||||||
tcp_cmd_write(pcb, "Usage: setimage <filename> <x> <y>\n");
|
tcp_cmd_write(pcb, "Usage: setimage <filename> <x> <y>\n");
|
||||||
return false;
|
return false;
|
||||||
} if (strcmp(argv[0], "setgif") == 0) {
|
}
|
||||||
|
if (strcmp(argv[0], "setgif") == 0) {
|
||||||
if (argc >= 2) {
|
if (argc >= 2) {
|
||||||
char* ext = get_filename_ext(argv[1]);
|
ext = get_filename_ext(argv[1]);
|
||||||
if (strcmp(ext, "gif") != 0) {
|
if (strcmp(ext, "gif") != 0) {
|
||||||
|
LOG_WARN(TAG, "setgif: File is not a gif");
|
||||||
tcp_cmd_write(pcb, "File is not a gif\n");
|
tcp_cmd_write(pcb, "File is not a gif\n");
|
||||||
return false;
|
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);
|
lcd_draw_gif_from_fs(argv[1], 0, 0);
|
||||||
return false;
|
return false;
|
||||||
} if (argc == 4) {
|
}
|
||||||
lcd_clear_images();
|
if (argc == 4) {
|
||||||
lcd_draw_gif_from_fs(argv[1], (uint32_t)atoi(argv[2]), (uint32_t)atoi(argv[3]));
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG_WARN(TAG, "Bad usage of setgif");
|
||||||
tcp_cmd_write(pcb, "Usage: setgif <filename>\n");
|
tcp_cmd_write(pcb, "Usage: setgif <filename>\n");
|
||||||
tcp_cmd_write(pcb, "Usage: setgif <filename> <x> <y>\n");
|
tcp_cmd_write(pcb, "Usage: setgif <filename> <x> <y>\n");
|
||||||
return false;
|
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");
|
tcp_cmd_write(pcb, "Exiting...\n");
|
||||||
lcd_clear_images();
|
lcd_clear_images();
|
||||||
lcd_clear_text();
|
lcd_clear_text();
|
||||||
tcp_close(pcb);
|
tcp_close(pcb);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
LOG_WARN(TAG, "Unknown command: %s", argv[0]);
|
||||||
tcp_cmd_write(pcb, "Unknown command: ");
|
tcp_cmd_write(pcb, "Unknown command: ");
|
||||||
tcp_cmd_write(pcb, argv[0]);
|
tcp_cmd_write(pcb, argv[0]);
|
||||||
tcp_cmd_write(pcb, "\n");
|
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;
|
char* next;
|
||||||
|
|
||||||
LWIP_UNUSED_ARG(arg);
|
LWIP_UNUSED_ARG(arg);
|
||||||
LOG_DEBUG(TAG, "TCP data received");
|
|
||||||
|
|
||||||
// Connection closed?
|
// Connection closed?
|
||||||
if (p == NULL && err == ERR_OK) {
|
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);
|
tcp_recved(pcb, p->tot_len);
|
||||||
|
|
||||||
remove_newline(cmd);
|
remove_newline(cmd);
|
||||||
|
LOG_INFO(TAG, "cmd: %s", cmd);
|
||||||
// Split string into tokens by delimiter (space)
|
// Split string into tokens by delimiter (space)
|
||||||
argv[0] = get_next_token(cmd, " ", &next);
|
argv[0] = get_next_token(cmd, " ", &next);
|
||||||
argc = 1;
|
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);
|
close_conn = tcp_cmd_parser(pcb, argc, argv);
|
||||||
|
|
||||||
if (close_conn) {
|
if (close_conn) {
|
||||||
|
LOG_INFO(TAG, "Closing connection");
|
||||||
tcp_cmd_close(pcb);
|
tcp_cmd_close(pcb);
|
||||||
} else {
|
} else {
|
||||||
tcp_cmd_write(pcb, "$> ");
|
tcp_cmd_write(pcb, "$>");
|
||||||
}
|
}
|
||||||
|
|
||||||
defer:
|
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_err(pcb, NULL);
|
||||||
tcp_poll(pcb, NULL, 4);
|
tcp_poll(pcb, NULL, 4);
|
||||||
|
|
||||||
|
LOG_INFO(TAG, "New connection accepted");
|
||||||
tcp_cmd_print_header(pcb);
|
tcp_cmd_print_header(pcb);
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
@@ -368,7 +427,6 @@ void tcp_cmd_init(void) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
tcp_pcb = tcp_listen(tcp_pcb);
|
tcp_pcb = tcp_listen(tcp_pcb);
|
||||||
if (tcp_pcb == NULL) {
|
if (tcp_pcb == NULL) {
|
||||||
LOG_CRIT(TAG, "Failed to listen");
|
LOG_CRIT(TAG, "Failed to listen");
|
||||||
|
|||||||
Reference in New Issue
Block a user