TFTP
* Change form indexes to defines * add gif support
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user