diff --git a/Marlin/src/module/mks_wifi/mks_wifi.cpp b/Marlin/src/module/mks_wifi/mks_wifi.cpp index c0cd267170..f09822a8cb 100644 --- a/Marlin/src/module/mks_wifi/mks_wifi.cpp +++ b/Marlin/src/module/mks_wifi/mks_wifi.cpp @@ -38,8 +38,8 @@ void mks_wifi_set_param(void){ ESP_PROTOC_FRAME esp_frame; - uint32_t ap_len = strlen((const char *)WIFI_SSID); - uint32_t key_len = strlen((const char *)WIFI_KEY); + uint32_t ap_len = strlen((const char *)MKS_WIFI_SSID); + uint32_t key_len = strlen((const char *)MKS_WIFI_KEY); memset(mks_out_buffer, 0, sizeof(ESP_PACKET_DATA_MAX_SIZE)); @@ -47,10 +47,10 @@ void mks_wifi_set_param(void){ mks_out_buffer[0] = WIFI_MODE_STA; mks_out_buffer[1] = ap_len; - strncpy((char *)&mks_out_buffer[2], (const char *)WIFI_SSID, ap_len); + strncpy((char *)&mks_out_buffer[2], (const char *)MKS_WIFI_SSID, ap_len); mks_out_buffer[2+ap_len] = key_len; - strncpy((char *)&mks_out_buffer[2 + ap_len + 1], (const char *)WIFI_KEY, key_len); + strncpy((char *)&mks_out_buffer[2 + ap_len + 1], (const char *)MKS_WIFI_KEY, key_len); esp_frame.type=ESP_TYPE_NET; esp_frame.dataLen= 2 + ap_len + key_len + 1; diff --git a/Marlin/src/module/mks_wifi/mks_wifi.h b/Marlin/src/module/mks_wifi/mks_wifi.h index 62d0f46021..de6d5fc818 100644 --- a/Marlin/src/module/mks_wifi/mks_wifi.h +++ b/Marlin/src/module/mks_wifi/mks_wifi.h @@ -4,24 +4,13 @@ #include "../../MarlinCore.h" #include "../../inc/MarlinConfig.h" #include "../../libs/Segger/log.h" +#include "mks_wifi_settings.h" #define MKS_WIFI_SERIAL_NUM (uint8_t)1 #define WIFI_MODE_STA (uint8_t)2 #define WIFI_MODE_AP (uint8_t)1 -#define WIFI_SSID "MikroTik2" -#define WIFI_KEY "vg3Apswqvg3Aps" - -/* -#define WIFI_SSID "MikroTik2" -#define WIFI_KEY "vg3Apswqvg3Aps" - -const char wifi_ap[]="bus_station"; -const char wifi_key[]="RAnRZj2JQbSMD5djh3"; -const uint8_t wifi_mode_sel=0; -*/ - typedef struct { diff --git a/Marlin/src/module/mks_wifi/mks_wifi_sd.cpp b/Marlin/src/module/mks_wifi/mks_wifi_sd.cpp index 357374fe72..98a8ba44f7 100644 --- a/Marlin/src/module/mks_wifi/mks_wifi_sd.cpp +++ b/Marlin/src/module/mks_wifi/mks_wifi_sd.cpp @@ -7,7 +7,10 @@ FRESULT result; FATFS FATFS_Obj; FIL upload_file; -volatile uint8_t __attribute__ ((aligned (4))) file_buff[ESP_PACKET_SIZE*DMA_BUFF_COUNT]; +volatile uint8_t __attribute__ ((aligned (4))) file_buff[ESP_PACKET_SIZE*ESP_FILE_BUFF_COUNT]; +volatile uint8_t *file_buff_pos; +volatile uint16_t file_data_size; + volatile uint8_t __attribute__ ((aligned (4))) dma_buff1[ESP_PACKET_SIZE]; volatile uint8_t __attribute__ ((aligned (4))) dma_buff2[ESP_PACKET_SIZE]; volatile uint8_t *dma_buff[] = {dma_buff1,dma_buff2}; @@ -45,6 +48,10 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ char str[100]; UINT bytes_writen=0; uint32_t file_size, file_inc_size, file_size_writen; + + uint16_t in_sector; + uint16_t last_sector; + uint32_t usart1_brr; uint32_t dma_timeout; uint16_t data_size; @@ -52,6 +59,8 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ uint32_t bytes_to_save; uint8_t last_packet_flag; + uint8_t percent_done; + //Установить имя файла. Смещение на 3 байта, чтобы добавить путь к диску str[0]='0'; str[1]=':'; @@ -60,9 +69,7 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ memcpy((uint8_t *)str+3,(uint8_t *)&packet->data[5],(packet->dataLen - 5)); str[packet->dataLen - 5 + 3] = 0; - //Установить размер файла file_size=(packet->data[4] << 24) | (packet->data[3] << 16) | (packet->data[2] << 8) | packet->data[1]; - DEBUG("Start file %s size %d",str,file_size); //Отмонтировать SD от Marlin, Монтировать FATFs @@ -108,14 +115,13 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ //nvic_irq_enable(NVIC_DMA_CH5); - dma_count = 0; //Счетчик принятых пакетов через DMA. Для отладки file_inc_size=0; //Счетчик принятых данных, для записи в файл file_size_writen = 0; //Счетчик записанных в файл данных - dma_error_flag = 0; - dma_recieve_flag = 0; - last_packet_flag = 0; + file_data_size = 0; dma_timeout = DMA_TIMEOUT; //Тайм-аут, на случай если передача зависла. - + last_sector = 0; + percent_done = 0; + while(dma_timeout-- > 0){ if(DMA1->ISR & DMA_ISR_TCIF5){ @@ -159,57 +165,105 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ last_packet_flag=1; } - } - - dma_buff_index=0; - dma_recieve_flag=0; - dma_timeout = DMA_TIMEOUT; - + //Запустить DMA на прием следующего пакета, пока обрабатывается этот DMA1_Channel5->CCR = DMA_CCR_PL|DMA_CCR_MINC; DMA1_Channel5->CPAR = (uint32_t)&USART1->DR; DMA1_Channel5->CMAR = (uint32_t)dma_buff[dma_buff_index]; DMA1_Channel5->CNDTR = ESP_PACKET_SIZE; DMA1_Channel5->CCR |= DMA_CCR_EN; - WRITE(MKS_WIFI_IO4, LOW); //Записано, сигнал ESP продолжать - - DEBUG("Save %d bytes (%d of %d) ",bytes_to_save,file_inc_size,file_size); - //res=f_write((FIL *)&upload_file,(uint8_t*)(buff+8),(data_size-4),&bytes_writen); - res=FR_OK; - if(res){ - ERROR("Write err %d",res); + if(*buff != ESP_PROTOC_HEAD){ + ERROR("Wrong packet head"); break; } - //file_size_writen+=bytes_writen; - //f_sync((FIL *)&upload_file); + in_sector = (*(buff+5) << 8) | *(buff+4); + if((in_sector - last_sector) > 1){ + ERROR("IN Sec: %d Prev sec: %d",in_sector,last_sector); + break; + }else{ + last_sector=in_sector; } - if(dma_error_flag){ - break; + data_size = (*(buff+3) << 8) | *(buff+2); + data_size -= 4; //4 байта с номером сегмента и флагами + + //Если буфер полон и писать некуда, запись в файл + if((data_size + file_data_size) > (ESP_FILE_BUFF_COUNT*ESP_PACKET_SIZE)){ + + WRITE(MKS_WIFI_IO4, HIGH); //Остановить передачу от ESP + + file_inc_size += file_data_size; + DEBUG("[%d]Save %d bytes (%d of %d) ",in_sector,file_data_size,file_inc_size,file_size); + + res=f_write((FIL *)&upload_file,(uint8_t*)file_buff,file_data_size,&bytes_writen); + if(res){ + ERROR("Write err %d",res); + break; + } + file_size_writen+=bytes_writen; + f_sync((FIL *)&upload_file); + + if((percent_done+5) == (uint8_t)(file_inc_size*100/file_size) ){ //Отображать прогресс только при изменении + percent_done = file_inc_size*100/file_size; + sprintf(str,"Upload %ld%%",file_inc_size*100/file_size); + ui.set_status((const char *)str,true); + ui.update(); + } + + memset((uint8_t *)file_buff,0,(ESP_FILE_BUFF_COUNT*ESP_PACKET_SIZE)); + file_data_size=0; + WRITE(MKS_WIFI_IO4, LOW); //Записано, сигнал ESP продолжать } + - if(last_packet_flag){ + if(*(buff+7) == 0x80){ //Последний пакет с данными + DEBUG("Last packet"); + if(file_data_size != 0){ //В буфере что-то есть + file_inc_size += file_data_size; + + res=f_write((FIL *)&upload_file,(uint8_t*)file_buff,file_data_size,&bytes_writen); + if(res){ + ERROR("Write err %d",res); + break; + } + file_size_writen+=bytes_writen; + + file_inc_size += data_size; + res=f_write((FIL *)&upload_file,(uint8_t*)(buff+8),data_size,&bytes_writen); + if(res){ + ERROR("Write err %d",res); + break; + } + file_size_writen+=bytes_writen; + + f_sync((FIL *)&upload_file); + } break; } -/* - sprintf(str,"Upload %ld%%",file_inc_size*100/file_size); - ui.set_status((const char *)str,true); - ui.update(); -*/ + + memcpy((uint8_t *)file_buff+file_data_size,(uint8_t*)(buff+8),data_size); + file_data_size+=data_size; + + memset((uint8_t*)buff,0,ESP_PACKET_SIZE); + dma_timeout = DMA_TIMEOUT; + } + + if(DMA1->ISR & DMA_ISR_TEIF5){ + ERROR("DMA Error"); + } + } f_close((FIL *)&upload_file); if( (file_size == file_inc_size) && (file_size == file_size_writen) ){ ui.set_status((const char *)"Upload done",true); - ui.update(); DEBUG("Upload ok"); }else{ ui.set_status((const char *)"Upload failed",true); - DEBUG("Upload failed: %d; Recieve %d; SD write %d",file_size,file_inc_size,file_size_writen); + DEBUG("Upload failed! File size: %d; Recieve %d; SD write %d",file_size,file_inc_size,file_size_writen); } - //Восстановить USART1 USART1->CR1 = 0; @@ -221,16 +275,12 @@ void mks_wifi_start_file_upload(ESP_PROTOC_FRAME *packet){ //Выключить DMA DMA1->IFCR = DMA_IFCR_CGIF5|DMA_IFCR_CTEIF5|DMA_IFCR_CHTIF5|DMA_IFCR_CTCIF5; DMA1_Channel5->CCR = 0; - DMA1_Channel5->CPAR = 0; - DMA1_Channel5->CMAR = 0; - DMA1_Channel5->CNDTR = 0; mks_wifi_sd_deinit(); WRITE(MKS_WIFI_IO4, LOW); //Включить передачу от ESP DEBUG("Settings restored"); - } void __irq_dma1_channel5(void) { diff --git a/Marlin/src/module/mks_wifi/mks_wifi_sd.h b/Marlin/src/module/mks_wifi/mks_wifi_sd.h index 613cc1975b..a6976dd6d2 100644 --- a/Marlin/src/module/mks_wifi/mks_wifi_sd.h +++ b/Marlin/src/module/mks_wifi/mks_wifi_sd.h @@ -11,6 +11,7 @@ #define DMA_BUFF_SIZE 1024 #define ESP_PACKET_SIZE 1024 +#define ESP_FILE_BUFF_COUNT 4 void mks_wifi_sd_init(void); void mks_wifi_sd_deinit(void); diff --git a/Marlin/src/module/mks_wifi/mks_wifi_settings.h b/Marlin/src/module/mks_wifi/mks_wifi_settings.h new file mode 100644 index 0000000000..4b9a90a9e9 --- /dev/null +++ b/Marlin/src/module/mks_wifi/mks_wifi_settings.h @@ -0,0 +1,7 @@ +#ifndef MKS_WIFI_SETTINGS_H +#define MKS_WIFI_SETTINGS_H + +#define MKS_WIFI_SSID "MikroTik2" +#define MKS_WIFI_KEY "vg3Apswqvg3Aps" + +#endif