From 2aad741b564454409240912b15e04c730f5b96fb Mon Sep 17 00:00:00 2001 From: Sander Speetjens Date: Mon, 20 Nov 2023 14:46:26 +0100 Subject: [PATCH] TFTP * Change form indexes to defines * add gif support --- project/Core/Src/tftp.c | 93 +++++++++++++++++++++++++---------------- 1 file changed, 58 insertions(+), 35 deletions(-) diff --git a/project/Core/Src/tftp.c b/project/Core/Src/tftp.c index 0eb2689..fdff8ea 100644 --- a/project/Core/Src/tftp.c +++ b/project/Core/Src/tftp.c @@ -6,12 +6,20 @@ #include "tftp.h" +#define VIRT_INDEX_TXT 0 +#define VIRT_IMAGE_BMP 1 +#define VIRT_IMAGE_GIF 2 +#define VIRT_TEXT_TXT 3 + +#define IMAGE_BUFFER_SIZE 81920 + static const char* TAG = "tftp_server"; extern struct llfs_data_file* llfs_root; static tftp_custom_file_t virt_file[] = {{.name = "index.txt", .data = NULL, .len = 0, .ofset = 0}, {.name = "virtImage.bmp", .data = NULL, .len = 0, .ofset = 0}, + {.name = "virtImage.gif", .data = NULL, .len = 0, .ofset = 0}, {.name = "virtText.txt", .data = NULL, .len = 0, .ofset = 0}}; int str_cat_str(char* dest, size_t dest_size, const char* src) { @@ -24,6 +32,7 @@ int str_cat_str(char* dest, size_t dest_size, const char* src) { return 0; } + int str_cat(char* dest, size_t dest_size, char c) { size_t dest_len = strlen(dest); if (dest_len + 1 > dest_size) { @@ -118,16 +127,17 @@ void* tftp_open(const char* fname, const char* mode, uint8_t write) { UNUSED(mode); - if (strcmp(fname, virt_file[0].name) == 0 && write == TFTP_READ) { - tftp_custom_fseek(&virt_file[0], 0, SEEK_SET); + if (strcmp(fname, virt_file[VIRT_INDEX_TXT].name) == 0 && write == TFTP_READ) { + tftp_custom_fseek(&virt_file[VIRT_INDEX_TXT], 0, SEEK_SET); return &virt_file[0]; - } else if (strcmp(fname, virt_file[1].name) == 0 && write != TFTP_READ) { - return &virt_file[1]; - } else if (strcmp(fname, virt_file[2].name) == 0 && write != TFTP_READ) { - return &virt_file[2]; + } else if (strcmp(fname, virt_file[VIRT_IMAGE_BMP].name) == 0 && write != TFTP_READ) { + return &virt_file[VIRT_IMAGE_BMP]; + } else if (strcmp(fname, virt_file[VIRT_IMAGE_GIF].name) == 0 && write != TFTP_READ) { + return &virt_file[VIRT_IMAGE_GIF]; + } else if (strcmp(fname, virt_file[VIRT_TEXT_TXT].name) == 0 && write != TFTP_READ) { + return &virt_file[VIRT_TEXT_TXT]; } - // TODO: waiting on Lorentz to finish creating f* functions for LLFS return fopen(fname, write ? "wb" : "rb"); } @@ -143,24 +153,26 @@ void tftp_close(void* handle) { return; } - if (handle == &virt_file[1]) { - // TODO: waiting on pr of tim to merge so we can use the bmp lcd function + if (handle == &virt_file[VIRT_IMAGE_BMP]) { lcd_clear(LCD_COLOR_BLACK); - //lcd_display_text((uint8_t*)"show me what you got virtImage.raw", 0, 0, LCD_COLOR_BLACK, LCD_COLOR_WHITE, LCD_FONT16); - lcd_draw_bmp_img((uint8_t*)virt_file[1].data, 0, 0); + lcd_draw_bmp_img((uint8_t*)virt_file[VIRT_IMAGE_BMP].data, 0, 0); } - if (handle == &virt_file[2]) { + if (handle == &virt_file[VIRT_IMAGE_GIF]) { lcd_clear(LCD_COLOR_BLACK); - lcd_display_text((uint8_t*)virt_file[2].data, 0, 0, LCD_COLOR_BLACK, LCD_COLOR_WHITE, LCD_FONT16); + lcd_draw_gif((uint8_t*)virt_file[VIRT_IMAGE_GIF].data, virt_file[VIRT_IMAGE_GIF].ofset,0, 0); } - if (handle == &virt_file[0] || handle == &virt_file[1] || handle == &virt_file[2]) { + if (handle == &virt_file[VIRT_TEXT_TXT]) { + lcd_clear(LCD_COLOR_BLACK); + lcd_display_text((uint8_t*)virt_file[VIRT_TEXT_TXT].data, 0, 0, LCD_COLOR_BLACK, LCD_COLOR_WHITE, LCD_FONT16); + } + + if (handle == &virt_file[VIRT_INDEX_TXT] || handle == &virt_file[VIRT_IMAGE_BMP] || handle == &virt_file[VIRT_IMAGE_GIF] || handle == &virt_file[VIRT_TEXT_TXT]) { ((tftp_custom_file_t*)handle)->ofset = 0; return; } - // TODO: waiting on Lorentz to finish creating f* functions for LLFS fclose((FILE*)handle); } @@ -183,13 +195,16 @@ int tftp_read(void* handle, void* buf, int bytes) { } FILE* file = (FILE*)handle; - if ((tftp_custom_file_t*)file == &virt_file[0]) { + if ((tftp_custom_file_t*)file == &virt_file[VIRT_INDEX_TXT]) { ret = (int)tftp_custom_fread(buf, (size_t)bytes, (tftp_custom_file_t*)file); return ret; - } else if ((tftp_custom_file_t*)file == &virt_file[1]) { + } else if ((tftp_custom_file_t*)file == &virt_file[VIRT_IMAGE_BMP]) { LOG_CRIT(TAG, "Exception: Trying to read a write only file"); return -1; - } else if ((tftp_custom_file_t*)file == &virt_file[2]) { + } else if ((tftp_custom_file_t*)file == &virt_file[VIRT_IMAGE_GIF]) { + LOG_CRIT(TAG, "Exception: Trying to read a write only file"); + return -1; + } else if ((tftp_custom_file_t*)file == &virt_file[VIRT_TEXT_TXT]) { LOG_CRIT(TAG, "Exception: Trying to read a write only file"); return -1; } @@ -211,9 +226,8 @@ int tftp_read(void* handle, void* buf, int bytes) { */ int tftp_write(void* handle, struct pbuf* p) { LOG_INFO(TAG, "Writing file"); - LOG_DEBUG(TAG, "Not implemented yet"); tftp_custom_file_t* file = (tftp_custom_file_t*)handle; - if (file == &virt_file[1] || file == &virt_file[2]) { + if (file == &virt_file[VIRT_IMAGE_BMP] || file == &virt_file[VIRT_IMAGE_GIF] || file == &virt_file[VIRT_TEXT_TXT]) { return (int)tftp_custom_fwrite(p->payload, (size_t)(p->len), file); } return -1; @@ -234,17 +248,17 @@ void init_index(void) { root = root->next; } len++; // +1 for the \0 - virt_file[0].data = malloc(len); - virt_file[0].len = len; + virt_file[VIRT_INDEX_TXT].data = malloc(len); + virt_file[VIRT_INDEX_TXT].len = len; for (int i = 0; i < 2; i++) { - str_cat_str(virt_file[0].data, len, virt_file[i].name); - str_cat(virt_file[0].data, len, '\n'); + str_cat_str(virt_file[VIRT_INDEX_TXT].data, len, virt_file[i].name); + str_cat(virt_file[VIRT_INDEX_TXT].data, len, '\n'); } root = llfs_root; while (root != NULL) { - str_cat_str(virt_file[0].data, len, root->name); - str_cat(virt_file[0].data, len, '\n'); + str_cat_str(virt_file[VIRT_INDEX_TXT].data, len, root->name); + str_cat(virt_file[VIRT_INDEX_TXT].data, len, '\n'); root = root->next; } } @@ -259,8 +273,15 @@ void tftp_server_init(void) { // init the index.txt virt_file init_index(); // init the virtImage.raw virt_file with 80kb of ram - virt_file[2].data = malloc(81920 * sizeof(char)); - virt_file[2].len = 81920; + virt_file[VIRT_IMAGE_BMP].data = calloc(IMAGE_BUFFER_SIZE, sizeof(char)); + if (virt_file[VIRT_IMAGE_BMP].data == NULL) { + LOG_FATAL(TAG, "Could not allocate memory for virtImage.raw"); + return; + } + virt_file[VIRT_IMAGE_BMP].len = IMAGE_BUFFER_SIZE; + + virt_file[VIRT_IMAGE_GIF].data = virt_file[VIRT_IMAGE_BMP].data; + virt_file[VIRT_IMAGE_GIF].len = virt_file[VIRT_IMAGE_BMP].len; // Init the tftp server if (tftp_init(&tftpContext_s) != ERR_OK) { @@ -274,11 +295,13 @@ void tftp_server_deinit(void) { LOG_INFO(TAG, "Deinitializing tftp server"); tftp_cleanup(); LOG_INFO(TAG, "tftp server deinitialized successfully"); - free(virt_file[0].data); - virt_file[0].data = NULL; - virt_file[0].len = 0; - virt_file[0].ofset = 0; - free(virt_file[2].data); - virt_file[2].data = NULL; - virt_file[2].len = 0; + free(virt_file[VIRT_INDEX_TXT].data); + virt_file[VIRT_INDEX_TXT].data = NULL; + virt_file[VIRT_INDEX_TXT].len = 0; + virt_file[VIRT_INDEX_TXT].ofset = 0; + free(virt_file[VIRT_IMAGE_BMP].data); + virt_file[VIRT_IMAGE_BMP].data = NULL; + virt_file[VIRT_IMAGE_BMP].len = 0; + virt_file[VIRT_IMAGE_GIF].data = NULL; + virt_file[VIRT_IMAGE_GIF].len = 0; } \ No newline at end of file