diff --git a/docs/img/IPv4_computer.png b/docs/img/IPv4_computer.png new file mode 100644 index 0000000..30d5ffb Binary files /dev/null and b/docs/img/IPv4_computer.png differ diff --git a/docs/img/Putty.png b/docs/img/Putty.png new file mode 100644 index 0000000..69addf5 Binary files /dev/null and b/docs/img/Putty.png differ 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) diff --git a/project/Core/Inc/tcp_cmd.h b/project/Core/Inc/tcp_cmd.h new file mode 100644 index 0000000..8466a38 --- /dev/null +++ b/project/Core/Inc/tcp_cmd.h @@ -0,0 +1,21 @@ +/** +* @file tcp_cmd.h +* @brief TCP CMD interface +* @author Gert R. +*/ + +#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/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 new file mode 100644 index 0000000..2d32a56 --- /dev/null +++ b/project/Core/Src/tcp_cmd.c @@ -0,0 +1,202 @@ +/** + * @file tcp_cmd.c + * @brief TCP CMD interface + * @author Gert R. + */ +#include "tcp_cmd.h" + +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); + 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 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); + } else if (!strncmp(tcp_buffer, "text ", 5)) { + size_t i; + 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(); + + 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); + + 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; + } 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(); + + 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); + + 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); + } + } else { + tcp_write(pcb, "NO files in filesystem\r\n", 24, 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_bind(tcp_pcb, IP_ADDR_ANY, 23); + + tcp_pcb = tcp_listen(tcp_pcb); + tcp_accept(tcp_pcb, tcp_cmd_accept); +} +