diff --git a/esp-link/cgiwebserver.c b/esp-link/cgiwebserver.c index 8dbe042..de4f3f5 100644 --- a/esp-link/cgiwebserver.c +++ b/esp-link/cgiwebserver.c @@ -6,8 +6,9 @@ #include "cgioptiboot.h" #include "multipart.h" #include "espfsformat.h" +#include "config.h" -int webServerMultipartCallback(MultipartCmd cmd, char *data, int dataLen, int position) +int ICACHE_FLASH_ATTR webServerMultipartCallback(MultipartCmd cmd, char *data, int dataLen, int position) { switch(cmd) { @@ -27,10 +28,38 @@ int webServerMultipartCallback(MultipartCmd cmd, char *data, int dataLen, int po data[p - position] = 0xFF; // clean espfs magic to mark as invalid } } - // TODO: flash write + + int spi_flash_addr = getUserPageSectionStart() + position; + int spi_flash_end_addr = spi_flash_addr + dataLen; + if( spi_flash_end_addr + dataLen >= getUserPageSectionEnd() ) + { + os_printf("No more space in the flash!\n"); + return 1; + } + + int ptr = 0; + while( spi_flash_addr < spi_flash_end_addr ) + { + if (spi_flash_addr % SPI_FLASH_SEC_SIZE == 0){ + spi_flash_erase_sector(spi_flash_addr/SPI_FLASH_SEC_SIZE); + } + + int max = (spi_flash_addr | (SPI_FLASH_SEC_SIZE - 1)) + 1; + int len = spi_flash_end_addr - spi_flash_addr; + if( spi_flash_end_addr > max ) + len = max - spi_flash_addr; + + spi_flash_write( spi_flash_addr, (uint32_t *)(data + ptr), len ); + ptr += len; + spi_flash_addr += len; + } + break; case FILE_DONE: - // TODO: finalize changes, set back espfs magic + { + uint32_t magic = ESPFS_MAGIC; + spi_flash_write( (int)getUserPageSectionStart(), (uint32_t *)&magic, sizeof(uint32_t) ); + } break; } return 0; diff --git a/httpd/multipart.c b/httpd/multipart.c index 813ac82..1198579 100644 --- a/httpd/multipart.c +++ b/httpd/multipart.c @@ -6,14 +6,14 @@ #define BOUNDARY_SIZE 100 -void multipartAllocBoundaryBuffer(MultipartCtx * context) +void ICACHE_FLASH_ATTR multipartAllocBoundaryBuffer(MultipartCtx * context) { if( context->boundaryBuffer == NULL ) context->boundaryBuffer = (char *)os_malloc(3*BOUNDARY_SIZE + 1); context->boundaryBufferPtr = 0; } -void multipartFreeBoundaryBuffer(MultipartCtx * context) +void ICACHE_FLASH_ATTR multipartFreeBoundaryBuffer(MultipartCtx * context) { if( context->boundaryBuffer != NULL ) { @@ -22,7 +22,7 @@ void multipartFreeBoundaryBuffer(MultipartCtx * context) } } -int multipartProcessBoundaryBuffer(MultipartCtx * context, char * boundary, char * buff, int len, int last) +int ICACHE_FLASH_ATTR multipartProcessBoundaryBuffer(MultipartCtx * context, char * boundary, char * buff, int len, int last) { if( len != 0 ) {