From f9eb677dc08d6c5438fa88ceae90c24abbd475f4 Mon Sep 17 00:00:00 2001 From: Roelandts_Gert Date: Mon, 11 Dec 2023 11:37:39 +0100 Subject: [PATCH 1/3] reverted to original files --- project/Core/Inc/tcp_cmd.h | 22 +++++ project/Core/Src/tcp_cmd.c | 198 +++++++++++++++++++++++++++++++++++++ 2 files changed, 220 insertions(+) create mode 100644 project/Core/Inc/tcp_cmd.h create mode 100644 project/Core/Src/tcp_cmd.c diff --git a/project/Core/Inc/tcp_cmd.h b/project/Core/Inc/tcp_cmd.h new file mode 100644 index 0000000..4134085 --- /dev/null +++ b/project/Core/Inc/tcp_cmd.h @@ -0,0 +1,22 @@ +/* + * cmd.h + * + * Created on: 13 Nov 2023 + * Author: gertr + */ + +#ifndef INC_TCP_CMD_H_ +#define INC_TCP_CMD_H_ + +#include "lcd_api.h" +#include "llfs.h" +#include "log.h" +#include +#include +#include + + +void tcp_cmd_init( void ); + + +#endif /* INC_TCP_CMD_H_ */ diff --git a/project/Core/Src/tcp_cmd.c b/project/Core/Src/tcp_cmd.c new file mode 100644 index 0000000..1e21d90 --- /dev/null +++ b/project/Core/Src/tcp_cmd.c @@ -0,0 +1,198 @@ +/* + * cmd.c + * + * Created on: 13 Nov 2023 + * Author: Gert Roelandts + */ +#include + +uint32_t result_txt = 0xff000000; // Store text color +uint32_t result_bg = 0xff000000; // Store background color + +static void tcp_cmd_close(struct tcp_pcb* pcb) { + tcp_arg(pcb, NULL); + tcp_sent(pcb, NULL); + tcp_recv(pcb, NULL); + tcp_close(pcb); +} + +static err_t tcp_cmd_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err) { + size_t i; + size_t len; + size_t number_of_files; + uint8_t file_in_fs; + uint8_t check = 0; + + char* pc; + char tcp_buffer[1024]; + char text[256]; + char color_r[3]; + char color_g[3]; + char color_b[3]; + + char text_color_r[3]; + char text_color_g[3]; + char text_color_b[3]; + + char extension[4]; + + char* endptr; + + + if (err == ERR_OK && p != NULL) { + tcp_recved(pcb, p->tot_len); + pc = (char*)p->payload; + len = p->tot_len; + + for (size_t i = 0; i < len; i++) { + tcp_buffer[i] = pc[i]; + } + + if (!strncmp(tcp_buffer, "help", 4)) { + check = 1; + tcp_write(pcb, "help : laat lijst zien met alle commando's\r\n" + "text : geeft tekst mee die op LCD komt (uw_text)\r\n" + "color : kleur achtergrond van scherm (255 255 255)\r\n" + "textColor : kleur van tekst (255 255 255)\r\n" + "listImages: laat een lijst zien van de mogelijke afbeeldingen\r\n" + "setImage : veranderd te afbeelding (naam_afbeelding)\r\n" + "exit : sluit de verbinding\r\n", 354, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + tcp_output(pcb); + } else if (!strncmp(tcp_buffer, "text ", 5)) { + for (i = 0; i < len - 4; i++) { + text[i] = tcp_buffer[i + 5]; + } + text[i - 1] = '\0'; + lcd_clear_text(); + lcd_display_text(text, 10, 10, result_txt, result_bg, LCD_FONT24); + + + check = 1; + } else if (!strncmp(tcp_buffer, "color", 5)) { + for (size_t i = 0; i < 3; i++) { + color_r[i] = tcp_buffer[i + 6]; + color_g[i] = tcp_buffer[i + 10]; + color_b[i] = tcp_buffer[i + 14]; + } + result_bg |= strtoul(color_r, &endptr, 10) << 16; + result_bg |= strtoul(color_g, &endptr, 10) << 8; + result_bg |= strtoul(color_b, &endptr, 10); + + check = 1; + } else if (!strncmp(tcp_buffer, "textColor", 9)) { + for (size_t i = 0; i < 3; i++) { + text_color_r[i] = tcp_buffer[i + 10]; + text_color_g[i] = tcp_buffer[i + 14]; + text_color_b[i] = tcp_buffer[i + 18]; + } + result_txt |= strtoul(text_color_r, &endptr, 10) << 16; + result_txt |= strtoul(text_color_g, &endptr, 10) << 8; + result_txt |= strtoul(text_color_b, &endptr, 10); + + check = 1; + } else if (!strncmp(tcp_buffer, "listImages", 10)) { + number_of_files = llfs_file_count(); + + llfs_file_t file_list[number_of_files]; + + number_of_files = llfs_file_list(file_list, number_of_files, NULL); + + for (size_t i = 0; i < number_of_files; i++) { + tcp_write(pcb, file_list[i].name, strlen(file_list[i].name), TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + tcp_write(pcb, "\r\n", 2, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + } + + check = 1; + } else if (!strncmp(tcp_buffer, "setImage", 8)) { + char filename[len - 8]; + for (size_t i = 0; i < len - 9; i++) { + filename[i] = tcp_buffer[i + 9]; + } + for (size_t i = 0; i < 3; i++) { + extension[i] = tcp_buffer[i + len - 3]; + } + filename[sizeof(filename) - 1] = '\0'; + extension[3] = '\0'; + + number_of_files = llfs_file_count(); + + llfs_file_t file_list[number_of_files]; + + number_of_files = llfs_file_list(file_list, number_of_files, NULL); + + file_in_fs = 0; + for (size_t i = 0; i < number_of_files; i++) { + if (!strcmp(filename, file_list[i].name)) { + file_in_fs = 1; + } + } + + // Check which file extension is used and call right function + if (!strncmp(extension, "bmp", 3) && file_in_fs) { + lcd_clear_images(); + lcd_draw_img_from_fs(filename, 10, 10); + } else if (!strncmp(extension, "gif", 3) && file_in_fs) { + lcd_clear_images(); + lcd_draw_gif_from_fs(filename, 10, 10); + } else if (!file_in_fs) { + tcp_write(pcb, "File NOT in filesystem\n\r", 24, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + } else { + tcp_write(pcb, "Extension NOT supported\n\r", 25, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + } + + check = 1; + } else if (!strncmp(tcp_buffer, "exit", 4)) { + lcd_clear_images(); + lcd_clear_text(); + tcp_cmd_close(pcb); + check = 1; + } + + if (!check && (strncmp(tcp_buffer, "\r\n", 2) != 0)) { + tcp_write(pcb, "Onbestaand commando: help voor lijst van commando's\r\n", 53, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + } + + pbuf_free(p); + + if (len > tcp_sndbuf(pcb)) { + len = tcp_sndbuf(pcb); + } + tcp_sent(pcb, NULL); + } else { + pbuf_free(p); + } + + if (err == ERR_OK && p == NULL) { + tcp_cmd_close(pcb); + } + if (strncmp(tcp_buffer, "\r\n", 2) != 0) { + tcp_write(pcb, "User: ", 6, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + } + + return ERR_OK; +} + +static err_t tcp_cmd_accept(void* arg, struct tcp_pcb* pcb, err_t err) { + LWIP_UNUSED_ARG(arg); + LWIP_UNUSED_ARG(err); + tcp_setprio(pcb, TCP_PRIO_MIN); + tcp_recv(pcb, tcp_cmd_recv); + tcp_err(pcb, NULL); + tcp_poll(pcb, NULL, 4); + tcp_write(pcb, " Welcom bij de TCP CMD Interface\r\n" + "(Typ help voor een lijst van de commando's! X om te sluiten)\r\n" + "============================================================\r\n" + "User: ", 168, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + tcp_sent(pcb, NULL); + return ERR_OK; +} + +void tcp_cmd_init(void) { + struct tcp_pcb* tcp_pcb; + tcp_pcb = tcp_new(); + tcp_bind(tcp_pcb, IP_ADDR_ANY, 23); + + tcp_pcb = tcp_listen(tcp_pcb); + tcp_accept(tcp_pcb, tcp_cmd_accept); +} + From 4b75f21a7da8139690345cca3fee3aad1b71b33f Mon Sep 17 00:00:00 2001 From: Roelandts_Gert Date: Mon, 11 Dec 2023 12:10:46 +0100 Subject: [PATCH 2/3] Most changes okay, code works --- project/Core/Inc/tcp_cmd.h | 11 +++-- project/Core/Src/main.c | 4 ++ project/Core/Src/tcp_cmd.c | 84 ++++++++++++++++++++------------------ 3 files changed, 53 insertions(+), 46 deletions(-) diff --git a/project/Core/Inc/tcp_cmd.h b/project/Core/Inc/tcp_cmd.h index 4134085..8466a38 100644 --- a/project/Core/Inc/tcp_cmd.h +++ b/project/Core/Inc/tcp_cmd.h @@ -1,9 +1,8 @@ -/* - * cmd.h - * - * Created on: 13 Nov 2023 - * Author: gertr - */ +/** +* @file tcp_cmd.h +* @brief TCP CMD interface +* @author Gert R. +*/ #ifndef INC_TCP_CMD_H_ #define INC_TCP_CMD_H_ diff --git a/project/Core/Src/main.c b/project/Core/Src/main.c index b5f6500..0bcb11d 100644 --- a/project/Core/Src/main.c +++ b/project/Core/Src/main.c @@ -32,6 +32,7 @@ #include "tftp.h" #include "modbus_tcp.h" #include "UDP_broadcast.h" +#include "tcp_cmd.h" /* USER CODE END Includes */ @@ -136,6 +137,9 @@ int main(void) /* Initialize the tftp server */ tftp_server_init(); + /* Initialize tcp command interface*/ + tcp_cmd_init(); + /* Initialize Modbus*/ modbus_init(); diff --git a/project/Core/Src/tcp_cmd.c b/project/Core/Src/tcp_cmd.c index 1e21d90..2d32a56 100644 --- a/project/Core/Src/tcp_cmd.c +++ b/project/Core/Src/tcp_cmd.c @@ -1,13 +1,12 @@ -/* - * cmd.c - * - * Created on: 13 Nov 2023 - * Author: Gert Roelandts +/** + * @file tcp_cmd.c + * @brief TCP CMD interface + * @author Gert R. */ -#include +#include "tcp_cmd.h" -uint32_t result_txt = 0xff000000; // Store text color -uint32_t result_bg = 0xff000000; // Store background color +static uint32_t result_txt = 0xff000000; // Store text color +static uint32_t result_bg = 0xff000000; // Store background color static void tcp_cmd_close(struct tcp_pcb* pcb) { tcp_arg(pcb, NULL); @@ -17,7 +16,6 @@ static void tcp_cmd_close(struct tcp_pcb* pcb) { } static err_t tcp_cmd_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err) { - size_t i; size_t len; size_t number_of_files; uint8_t file_in_fs; @@ -51,14 +49,14 @@ static err_t tcp_cmd_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t if (!strncmp(tcp_buffer, "help", 4)) { check = 1; tcp_write(pcb, "help : laat lijst zien met alle commando's\r\n" - "text : geeft tekst mee die op LCD komt (uw_text)\r\n" - "color : kleur achtergrond van scherm (255 255 255)\r\n" - "textColor : kleur van tekst (255 255 255)\r\n" - "listImages: laat een lijst zien van de mogelijke afbeeldingen\r\n" - "setImage : veranderd te afbeelding (naam_afbeelding)\r\n" - "exit : sluit de verbinding\r\n", 354, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); - tcp_output(pcb); + "text : geeft tekst mee die op LCD komt (uw_text)\r\n" + "color : kleur achtergrond van scherm (255 255 255)\r\n" + "textColor : kleur van tekst (255 255 255)\r\n" + "listImages: laat een lijst zien van de mogelijke afbeeldingen\r\n" + "setImage : veranderd te afbeelding (naam_afbeelding)\r\n" + "exit : sluit de verbinding\r\n", 354, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); } else if (!strncmp(tcp_buffer, "text ", 5)) { + size_t i; for (i = 0; i < len - 4; i++) { text[i] = tcp_buffer[i + 5]; } @@ -93,13 +91,16 @@ static err_t tcp_cmd_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t } else if (!strncmp(tcp_buffer, "listImages", 10)) { number_of_files = llfs_file_count(); - llfs_file_t file_list[number_of_files]; + if (number_of_files > 0) { + llfs_file_t file_list[number_of_files]; + number_of_files = llfs_file_list(file_list, number_of_files, NULL); - number_of_files = llfs_file_list(file_list, number_of_files, NULL); - - for (size_t i = 0; i < number_of_files; i++) { - tcp_write(pcb, file_list[i].name, strlen(file_list[i].name), TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); - tcp_write(pcb, "\r\n", 2, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + for (size_t i = 0; i < number_of_files; i++) { + tcp_write(pcb, file_list[i].name, strlen(file_list[i].name), TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + tcp_write(pcb, "\r\n", 2, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + } + } else { + tcp_write(pcb, "NO files in filesystem\r\n", 24, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); } check = 1; @@ -116,28 +117,32 @@ static err_t tcp_cmd_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t number_of_files = llfs_file_count(); - llfs_file_t file_list[number_of_files]; + if(number_of_files > 0) { + llfs_file_t file_list[number_of_files]; - number_of_files = llfs_file_list(file_list, number_of_files, NULL); + number_of_files = llfs_file_list(file_list, number_of_files, NULL); - file_in_fs = 0; - for (size_t i = 0; i < number_of_files; i++) { - if (!strcmp(filename, file_list[i].name)) { - file_in_fs = 1; + file_in_fs = 0; + for (size_t i = 0; i < number_of_files; i++) { + if (!strcmp(filename, file_list[i].name)) { + file_in_fs = 1; + } } - } - // Check which file extension is used and call right function - if (!strncmp(extension, "bmp", 3) && file_in_fs) { - lcd_clear_images(); - lcd_draw_img_from_fs(filename, 10, 10); - } else if (!strncmp(extension, "gif", 3) && file_in_fs) { - lcd_clear_images(); - lcd_draw_gif_from_fs(filename, 10, 10); - } else if (!file_in_fs) { - tcp_write(pcb, "File NOT in filesystem\n\r", 24, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + // Check which file extension is used and call right function + if (!strncmp(extension, "bmp", 3) && file_in_fs) { + lcd_clear_images(); + lcd_draw_img_from_fs(filename, 10, 10); + } else if (!strncmp(extension, "gif", 3) && file_in_fs) { + lcd_clear_images(); + lcd_draw_gif_from_fs(filename, 10, 10); + } else if (!file_in_fs) { + tcp_write(pcb, "File NOT in filesystem\n\r", 24, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + } else { + tcp_write(pcb, "Extension NOT supported\n\r", 25, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + } } else { - tcp_write(pcb, "Extension NOT supported\n\r", 25, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); + tcp_write(pcb, "NO files in filesystem\r\n", 24, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE); } check = 1; @@ -189,7 +194,6 @@ static err_t tcp_cmd_accept(void* arg, struct tcp_pcb* pcb, err_t err) { void tcp_cmd_init(void) { struct tcp_pcb* tcp_pcb; - tcp_pcb = tcp_new(); tcp_bind(tcp_pcb, IP_ADDR_ANY, 23); tcp_pcb = tcp_listen(tcp_pcb); From 8707038be02c22826b728885699797baf888ec18 Mon Sep 17 00:00:00 2001 From: Roelandts_Gert Date: Mon, 11 Dec 2023 12:19:13 +0100 Subject: [PATCH 3/3] added md --- docs/img/IPv4_computer.png | Bin 0 -> 7198 bytes docs/img/Putty.png | Bin 0 -> 7794 bytes docs/tcp_cmd.md | 18 ++++++++++++++++++ 3 files changed, 18 insertions(+) create mode 100644 docs/img/IPv4_computer.png create mode 100644 docs/img/Putty.png create mode 100644 docs/tcp_cmd.md diff --git a/docs/img/IPv4_computer.png b/docs/img/IPv4_computer.png new file mode 100644 index 0000000000000000000000000000000000000000..30d5ffb6c48a008ea68ddd51ceca18609d79ebfe GIT binary patch literal 7198 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 PJ9V0Bk5o(G7NP$KJjemB literal 0 HcmV?d00001 diff --git a/docs/img/Putty.png b/docs/img/Putty.png new file mode 100644 index 0000000000000000000000000000000000000000..69addf535ef4bcfbe426a3dcf74c6152af7dfe3f GIT binary patch literal 7794 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 literal 0 HcmV?d00001 diff --git a/docs/tcp_cmd.md b/docs/tcp_cmd.md new file mode 100644 index 0000000..b002640 --- /dev/null +++ b/docs/tcp_cmd.md @@ -0,0 +1,18 @@ +# TCP Command Interface +This is the documentation of the TCP Command Interface task + +## Table of contents +- [Table of contents](#table-of-contents) +- [Initialization](#initialization) +- [Usage](#usage) + +## Initialization +The TCP Command Interface task is initialized in the main function. +```c +// Initialize Modbus task +tcp_cmd_init(); +``` +## Usage + +![putty](./img/Putty.png) +![IPv4](./img/IPv4_computer.png)