Hi Joseph,
I had some experience to use custom files in SD card with httpserver_raw.
My goal was to use httpserver_raw to serve some web pages in fsdata.c using the
"standard" way, and also to allow user to download, via httpserver_raw, some
log files in SD card.
I had some difficulties but at the end i've made it. So, i hope the following
guidelines will help you.
1) First of all, i implemented my own module defining the functions to open /
close / read files on SD
you have to implement 3 functions:
int fs_open_custom(struct fs_file *file, const char *name);
void fs_close_custom(struct fs_file *file);
int fs_read_custom(struct fs_file *file, char *buffer, int count);
In detail:
The fs_open_custom must open your custom file in SD having name "name".
Function must return 1 if file is opened successfully, 0 otherwise.
here a snippet from my application, in pseudo-C code:
int fs_open_custom(struct fs_file *file, const char *name) {
int resopen = <open file from SD>
if (resopen == -1) {
return 0;
}
file->data = NULL;
file->len = <your file size>
file->index = 0;
file->pextension = NULL;
return 1;
}
The following function must close the file:
fs_close_custom(struct fs_file *file);
Finally, the fs_read_custom function must read "at most" count bytes from file,
put them in buffer, and return the number of bytes read.
I say "at most", because you try to read N bytes, and the remaining bytes to
read are M, with N > M, the function will return M
Note that if you have reached the end of file, the function must return
FS_READ_EOF
int fs_read_custom(struct fs_file *file, char *buffer, int count);
here an example:
int fs_read_custom(struct fs_file *file, char *buffer, int count) {
int read = 0;
if (file->index < file->len) {
read = <call your function to read "count" bytes from SD, fill in
buffer, and return the amount of bytes read>
}
else {
read = FS_READ_EOF;
}
return read;
}
2) The second step: enable two defines in fs.h
LWIP_HTTPD_CUSTOM_FILES
LWIP_HTTPD_DYNAMIC_FILE_READ
another define, LWIP_HTTPD_FS_ASYNC_READ can be used if you read data
asynchronoysly from your device, i.e. if you use a DMA channel, which was not
my case. I didn't enabled it.
3) Third step, you have to modify the fs_read function in fs.c to call your
custom read.
int fs_read(struct fs_file *file, char *buffer, int count)
add these 3 instructions at the beginning of the function:
if (file->is_custom_file) {
return fs_read_custom( file, buffer, count);
}
4) Last step, you have to modify httpd.c in order to fix a (possible?) bug i've
found in httpd.c
In http_init_file remove line 2169 and substitute with 4 instructions as
follows (i include a snippet of my diff for your convenience).
hs->handle = file;
hs->file = (char*)file->data;
LWIP_ASSERT("File length must be positive!", (file->len >= 0));
- hs->left = file->len;
+ if (file->is_custom_file == 0)
+ hs->left = file->len;
+ else
+ hs->left = 0;
hs->retries = 0;
I hope i haven't forgotten something, please tell us if these hints works for
you.
Best regards!
_______________________________________________
lwip-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/lwip-users