diff --git a/Marlin/src/module/mks_wifi/mks_wifi.cpp b/Marlin/src/module/mks_wifi/mks_wifi.cpp index 158e8e4a31..6b58ca0c96 100644 --- a/Marlin/src/module/mks_wifi/mks_wifi.cpp +++ b/Marlin/src/module/mks_wifi/mks_wifi.cpp @@ -15,8 +15,6 @@ void mks_wifi_init(void){ SERIAL_ECHO_MSG("Init MKS WIFI"); DEBUG("Init MKS WIFI"); - mks_wifi_sd_init(); - SET_OUTPUT(MKS_WIFI_IO0); WRITE(MKS_WIFI_IO0, HIGH); @@ -195,7 +193,7 @@ void mks_wifi_parse_packet(ESP_PROTOC_FRAME *packet){ break; case ESP_TYPE_FILE_FIRST: DEBUG("[FILE_FIRST]"); - WRITE(MKS_WIFI_IO4, HIGH); + //WRITE(MKS_WIFI_IO4, HIGH); mks_wifi_start_file_upload(packet); break; case ESP_TYPE_FILE_FRAGMENT: diff --git a/Marlin/src/module/mks_wifi/mks_wifi_sd.cpp b/Marlin/src/module/mks_wifi/mks_wifi_sd.cpp index 31b18121fb..f9820c8a60 100644 --- a/Marlin/src/module/mks_wifi/mks_wifi_sd.cpp +++ b/Marlin/src/module/mks_wifi/mks_wifi_sd.cpp @@ -1,5 +1,6 @@ #include "mks_wifi_sd.h" +#include "../../lcd/ultralcd.h" #include "../../libs/fatfs/ff.h" FRESULT result; @@ -40,12 +41,14 @@ void sd_delete_file(char *filename){ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ char str[100]; UINT bytes_writen=0; - uint32_t file_size, file_inc_size; + uint32_t file_size, file_inc_size, file_size_writen; uint32_t dma_count; uint32_t usart1_brr; FRESULT res; + mks_wifi_sd_init(); + //Установить имя файла. Смещение на 3 байта, чтобы добавить путь к диску str[0]='0'; str[1]=':'; @@ -68,8 +71,7 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ //Выключить прием по UART RX, включить через DMA, изменить скорость, Выставить флаг приема по DMA USART1->CR1 = 0; - WRITE(MKS_WIFI_IO4, LOW); - safe_delay(200); + safe_delay(100); usart1_brr = USART1->BRR; USART1->CR1 = USART_CR1_UE; @@ -78,14 +80,15 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ USART1->CR3 = USART_CR3_DMAR; USART1->CR1 |= USART_CR1_RE; - - (void)USART1->DR; - dma_buff_ptr=(uint8_t*)&dma_buff1; dma_buff_index=0; + /* + Прием пакета начинается примерно через 2 секунды + Без этой тупой задержки, UART успевает принять + мусор, до пакета с данными и все ломается + */ safe_delay(200); - USART1->SR &= ~USART_SR_RXNE; DMA1_Channel5->CCR = DMA_CCR_PL|DMA_CCR_MINC; DMA1_Channel5->CPAR = (uint32_t)&USART1->DR; @@ -95,8 +98,11 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ DMA1_Channel5->CCR |= DMA_CCR_EN; - dma_count=0; - dma_timeout = DMA_TIMEOUT; + dma_count = 0; //Счетчик принятых пакетов через DMA. Для отладки + file_inc_size=0; //Счетчик принятых данных, для записи в файл + file_size_writen = 0; //Счетчик записанных в файл данных + + dma_timeout = DMA_TIMEOUT; //Тайм-аут, на случай если передача зависла. while(dma_timeout > 0){ if(DMA1->ISR & DMA_ISR_TCIF5){ @@ -120,20 +126,31 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ WRITE(MKS_WIFI_IO4, HIGH); data_size = (*(save+3) << 8) | *(save+2); - DEBUG("[%d]Save %d bytes",dma_count,data_size); - + file_inc_size += (data_size - 4); + DEBUG("[%d]Save %d bytes (%d of %d) ",dma_count,data_size,file_inc_size,file_size); + res=f_write((FIL *)&upload_file,(uint8_t*)(save+8),(data_size-4),&bytes_writen); if(res){ ERROR("Write err %d",res); break; } - + + sprintf(str,"%ld/%ld",file_inc_size,file_size); + ui.set_status((const char *)str,false); + + file_size_writen+=bytes_writen; + f_sync((FIL *)&upload_file); WRITE(MKS_WIFI_IO4, LOW); + + if(*(save+7) == 0x80){ + DEBUG("Last packet"); + break; + } + memset((uint8_t*)save,0,1024); dma_count++; dma_timeout = DMA_TIMEOUT; - } if(DMA1->ISR & DMA_ISR_TEIF5){ @@ -145,6 +162,15 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ f_close((FIL *)&upload_file); + if( (file_size == file_inc_size) && (file_size == file_size_writen) ){ + ui.set_status((const char *)"Upload done",false); + DEBUG("Upload ok"); + }else{ + ui.set_status((const char *)"Upload failed",false); + DEBUG("Upload failed: %d; Recieve %d; SD write %d",file_size,file_inc_size,file_size_writen); + } + + USART1->CR1 = 0; USART1->CR1 = (USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE); USART1->CR3 = 0;