/*================================================================ Copyright (c) 2020 Quectel Wireless Solution, Co., Ltd. All Rights Reserved. Quectel Wireless Solution Proprietary and Confidential. =================================================================*/ /*================================================================= EDIT HISTORY FOR MODULE This section contains comments describing changes made to the module. Notice that changes are listed in reverse chronological order. WHEN WHO WHAT, WHERE, WHY ------------ ------- ------------------------------------------------------------------------------- =================================================================*/ /*=========================================================================== * include files ===========================================================================*/ #include #include #include #include "ql_application.h" #include "ql_zip.h" #include "ql_fs.h" #include "ql_log.h" #include "ql_rtos.h" #include "ql_uart.h" #include "ql_type.h" #include "ql_func.h" /*=========================================================================== * Macro Definition ===========================================================================*/ #define QL_ZIPDEMO_LOG(fmt, args...) printf("[%s %d]" fmt, __func__, __LINE__, ##args) #define FILE_NAME1 "testFile1.txt" #define FILE_NAME2 "testFile2.txt" #define FILE_ZIP_NAME "test.zip" #define FILE_NAME_ZIP1 "test01.txt" #define FILE_NAME_ZIP2 "test02.txt" #define U_DISK "U:" #define U_FILE_UNDER_ROOT1 "" U_DISK "/" FILE_NAME1 "" #define U_FILE_UNDER_ROOT2 "" U_DISK "/" FILE_NAME2 "" #define U_FILE_UNDER_ZIP1 "" U_DISK "/" FILE_NAME_ZIP1 "" #define U_FILE_UNDER_ZIP2 "" U_DISK "/" FILE_NAME_ZIP2 "" #define U_FILE_UNDER_ZIP "" U_DISK "/" FILE_ZIP_NAME "" #define DIR_NAME "testDir" #define U_DIR_PATH "" U_DISK "/" DIR_NAME "" #define ZIP_FILE_LEN (1024) /*=========================================================================== * Variate ===========================================================================*/ const char *unZipFilePath = U_FILE_UNDER_ZIP; char *unZip_path = NULL; const char *TestFilePath[2] = {U_FILE_UNDER_ROOT1, U_FILE_UNDER_ROOT2}; const char *TestFilezipname[2] = {U_FILE_UNDER_ZIP1, U_FILE_UNDER_ZIP2}; enum { QL_SPI_DEV0 = 0, QL_SPI_DEV2 = 2 }; enum { QL_PIN_16_19, QL_PIN_33_36 }; enum { SPI_CLOCK_13M = 0x0, SPI_CLOCK_26M = 0x1, SPI_CLOCK_52M = 0x2, }; typedef struct file { unsigned int cnt; unsigned char buf[1024]; } file_contex; /*=========================================================================== * Functions ===========================================================================*/ static void ql_zip_demo_thread(void *param) { int ret = 0; int run_num = 0; HZIP hz = 0; QFILE *fp1 = NULL; QFILE *fp2 = NULL; unsigned char *zip_fs_space = calloc(10, ZIP_FILE_LEN); if (NULL == zip_fs_space) { QL_ZIPDEMO_LOG("malloc err\r\n"); return; } ql_rtos_task_sleep_s(5); QL_ZIPDEMO_LOG("========== zip demo start ==========\r\n"); QL_ZIPDEMO_LOG("========== start create Test Files:[%s][%s]==========\r\n", TestFilePath[0], TestFilePath[1]); fp1 = ql_fopen(TestFilePath[0], "w+"); fp2 = ql_fopen(TestFilePath[1], "w+"); if ((fp1 == NULL) || (fp2 == NULL)) { QL_ZIPDEMO_LOG("open file failed ! %p-%p\r\n", fp1, fp2); QL_ZIPDEMO_LOG("========== Create Test Files:[%s][%s] fail==========\r\n", TestFilePath[0], TestFilePath[1]); goto main_exit; } else { QL_ZIPDEMO_LOG("open file:[%x][%x] success!\r\n", fp1, fp2); } memset(zip_fs_space, 'a', 10 * ZIP_FILE_LEN); ret = ql_fwrite(zip_fs_space, 10 * ZIP_FILE_LEN, 1, fp1); if (ret > 0) { QL_ZIPDEMO_LOG("file:test01.txt write :%d bytes data\r\n", ret); } else { ql_fclose(fp1); ql_fclose(fp2); QL_ZIPDEMO_LOG("file:test01.txt write Failed\r\n"); QL_ZIPDEMO_LOG("========== Create Test Files:[%s][%s] Failed==========\r\n", TestFilePath[0], TestFilePath[1]); goto main_exit; } memset(zip_fs_space, 'b', 5 * ZIP_FILE_LEN); ret = ql_fwrite(zip_fs_space, 5 * ZIP_FILE_LEN, 1, fp2); if (ret > 0) { QL_ZIPDEMO_LOG("file:test02.txt write :%d bytes data\r\n", ret); } else { ql_fclose(fp1); ql_fclose(fp2); QL_ZIPDEMO_LOG("file:test02.txt write Failed\r\n"); QL_ZIPDEMO_LOG("========== Create Test Files:[%s][%s] Failed==========\r\n", TestFilePath[0], TestFilePath[1]); goto main_exit; } ql_fclose(fp1); ql_fclose(fp2); QL_ZIPDEMO_LOG("========== Create Test Files:[%s][%s] success==========\r\n", TestFilePath[0], TestFilePath[1]); ql_rtos_task_sleep_s(5); for (run_num = 0; run_num < 1; run_num++) { QL_ZIPDEMO_LOG("========== loop_test[%d] start==========\r\n", run_num + 1); QL_ZIPDEMO_LOG("========== start zip file[%d]==========\r\n", run_num + 1); hz = ql_fs_zip_create(unZipFilePath, 0, &ret); if (ret < 0) { QL_ZIPDEMO_LOG("create empty.zip:[%s] Failed,errcode=%d\r\n", unZipFilePath, ret); goto main_exit; } else { QL_ZIPDEMO_LOG("create empty.zip:[%s] Success\r\n", unZipFilePath); } ret = ql_fs_zip_add_file(hz, TestFilezipname[0], TestFilePath[0]); if (ret != QL_FILE_OK) { QL_ZIPDEMO_LOG("add [%s] to zip Failed\r\n", TestFilePath[0]); goto main_exit; } QL_ZIPDEMO_LOG("add [%s] to zip Success\r\n", TestFilePath[0]); ret = ql_fs_zip_add_file(hz, TestFilezipname[1], TestFilePath[1]); if (ret != QL_FILE_OK) { QL_ZIPDEMO_LOG("add [%s] to zip Failed\r\n", TestFilePath[1]); goto main_exit; } QL_ZIPDEMO_LOG("add [%s] to zip Success\r\n", TestFilePath[1]); ql_fs_zip_close(hz); #if 0 //????? ql_rtos_task_sleep_s(5); ql_unzip_mem_data_s *ql_unzip_tmp = (ql_unzip_mem_data_s *)calloc(1, sizeof(ql_unzip_mem_data_s)); if (ql_unzip_tmp == NULL) { QL_ZIPDEMO_LOG("malloc err"); goto main_exit; } ql_unzip_tmp->data = (void *)calloc(1, 15*ZIP_FILE_LEN); if (ql_unzip_tmp->data == NULL) { QL_ZIPDEMO_LOG("malloc err"); free(ql_unzip_tmp); goto main_exit; } ql_unzip_tmp->total_len = 15*ZIP_FILE_LEN; ret = ql_fs_unzip_ex(unZipFilePath, QL_UNZIP_TO_MEMERY, ql_unzip_tmp); if(ret!=QL_FILE_OK) { QL_ZIPDEMO_LOG("unzip file:[%s] Failed",unZipFilePath); free(ql_unzip_tmp->data); free(ql_unzip_tmp); goto main_exit; } QL_ZIPDEMO_LOG("used_len=%d,item_num=%d\n",ql_unzip_tmp->used_len, ql_unzip_tmp->item_num); int j=0; int i = 0; char *tmep = NULL; for (j=0; jitem_num; j++) { QL_ZIPDEMO_LOG("file path=%s\n", ql_unzip_tmp->item[j].file_path); QL_ZIPDEMO_LOG("file len=%d,type=%d\n", ql_unzip_tmp->item[j].item_len, ql_unzip_tmp->item[j].file_type); tmep = (char *)ql_unzip_tmp->item[j].item_data; if (tmep && ql_unzip_tmp->item[j].file_type == QL_UNZIP_FILE) { if (0 == strcmp(ql_unzip_tmp->item[j].file_path, TestFilePath[0])) { for (i=0; iitem[j].item_len; i++) { if (tmep[i] != 'a') { QL_ZIPDEMO_LOG("not match -----------"); break; } } } if (0 == strcmp(ql_unzip_tmp->item[j].file_path, TestFilePath[1])) { for (i=0; iitem[j].item_len; i++) { if (tmep[i] != 'b') { QL_ZIPDEMO_LOG("not match -----------"); break; } } } } } free(ql_unzip_tmp->data); free(ql_unzip_tmp); QL_ZIPDEMO_LOG("unzip file:[%s] Success\r\n",unZipFilePath); #else //??????? QL_ZIPDEMO_LOG("========== zip file[%d] success==========\r\n", run_num + 1); ql_rtos_task_sleep_s(5); QL_ZIPDEMO_LOG("========== start unzip file[%d]==========\r\n", run_num + 1); ret = ql_fs_unzip(unZipFilePath, unZip_path, 1); if (ret != QL_FILE_OK) { QL_ZIPDEMO_LOG("unzip file:[%s] Failed\r\n", unZipFilePath); goto main_exit; } QL_ZIPDEMO_LOG("unzip file:[%s] Success\r\n", unZipFilePath); #endif QL_ZIPDEMO_LOG("========== unzip file[%d] success==========\r\n", run_num + 1); ql_rtos_task_sleep_s(5); } main_exit: QL_ZIPDEMO_LOG("========== zip demo end ==========\r\n"); ql_remove(TestFilePath[0]); ql_remove(TestFilePath[1]); if (zip_fs_space != NULL) { free(zip_fs_space); zip_fs_space = NULL; } ql_rtos_task_delete(NULL); return; } // application_init(ql_zip_demo_thread, "ql_zipdemo", 32, 0); static void ql_unzip_demo_test(void *param) { ql_rtos_task_sleep_s(5); QL_ZIPDEMO_LOG("========== start unzip file==========\r\n"); int ret = ql_fs_unzip(unZipFilePath, unZip_path, 1); if (ret != QL_FILE_OK) { QL_ZIPDEMO_LOG("unzip file:[%s] Failed\r\n", unZipFilePath); goto main_exit; } QL_ZIPDEMO_LOG("unzip file:[%s] Success\r\n", unZipFilePath); main_exit: QL_ZIPDEMO_LOG("========== zip demo end ==========\r\n"); ql_rtos_task_delete(NULL); return; } #define NAND_DEV "NAND:/" #define U_DEV "U:" #define TEST_TXT_NAME "test.txt" #define TEST_ZIP_NAME "test.zip" #define LITFS_ZIP_PATH "" U_DEV "/" TEST_ZIP_NAME "" typedef unsigned int File_Handle; typedef unsigned int size_t; void nand_zip_test(void *argv) { int ret = 0; File_Handle filep; size_t status = 0; HZIP hzs; ql_rtos_task_sleep_s(5); ql_spi_nand_init(QL_SPI_DEV0, QL_PIN_33_36, SPI_CLOCK_26M); //写入文件1 filep = ql_nand_fopen("mount_temp.txt", "w+"); if (filep < 0) { printf("nand mount Failed\r\n"); return; } char mount_buf[50]="mount_temp_the_test_file"; status = ql_nand_fwrite(mount_buf, 1, strlen(mount_buf), filep); if (status != strlen(mount_buf)) { printf("fx_file_write is failede.!!\n"); return; } status = ql_nand_fsync(filep); if (status != 0) { printf("ql_nand_fsync is failede.!!\n"); return; } printf("ql_nand_fwrite is ok.!!\r\n"); ql_nand_fclose(filep); //写入文件2 char bufs_test[50] = "quec_zips2_test_in_windows"; char reads_buf[56] = {0}; filep = ql_nand_fopen(TEST_TXT_NAME, "w+"); status = ql_nand_fwrite(bufs_test, 1, strlen(bufs_test), filep); if (status != strlen(bufs_test)) { printf("fx_file_write is failede.!!\n"); return; } status = ql_nand_fsync(filep); if (status != 0) { printf("ql_nand_fsync is failede.!!\n"); return; } printf("ql_nand_fwrite is ok.!!\r\n"); ql_nand_fclose(filep); // 构建nand文件路径,用于压缩解压 char unZipFilePath[50] = {0}; sprintf(unZipFilePath, "%s%s", NAND_DEV, TEST_TXT_NAME); char zipFilePath[50] = {0}; sprintf(zipFilePath, "%s%s", NAND_DEV, TEST_ZIP_NAME); // 创建一个zip文件头 hzs = ql_fs_zip_create(zipFilePath, 0, &ret); if (ret < 0) { printf("create empty.zip:[%s] Failed,errcode=%d\r\n", zipFilePath, ret); ql_fs_zip_close(hzs); return; } else { printf(("create empty.zip:[%s] Success\r\n", zipFilePath)); } //添加文件1 ret = ql_fs_zip_add_file(hzs, TEST_TXT_NAME, unZipFilePath); if (ret != QL_FILE_OK) { printf("add [%s] to zip Failed\r\n", TEST_TXT_NAME); ql_fs_zip_close(hzs); return; } ///添加文件2 char unZipFilePath2[50] = {0}; sprintf(unZipFilePath2, "%s%s", NAND_DEV, "mount_temp.txt"); ret = ql_fs_zip_add_file(hzs, "mount_temp.txt", unZipFilePath2); if (ret != QL_FILE_OK) { printf("add [mount_temp.txt] to zip Failed\r\n"); ql_fs_zip_close(hzs); return; } printf("add to zip Success\r\n"); ql_fs_zip_close(hzs); // printf("add to zip Success\r\n"); printf("zip_size_file:[%d]\r\n", sizeof(zipFilePath)); //先移除文件 ret = ql_nand_fremove(TEST_TXT_NAME); ret = ql_nand_fremove("mount_temp.txt"); printf("ql_nand_fsize :ret=%d\r\n", ql_nand_fsize(TEST_ZIP_NAME)); //开始解压数据 #if 1 ql_rtos_task_sleep_s(5); printf("========== start unzip file[%d]==========\r\n"); char *unZip_path = "NAND:/"; ret = ql_fs_unzip(zipFilePath, NULL, 1); if (ret != QL_FILE_OK) { printf("unzip file:[%s] Failed\r\n", zipFilePath); return; } printf("unzip file:[%s] Success\r\n", zipFilePath); #endif //读取解压的文件 #if 1 printf("========== start read file1==========\r\n"); filep = ql_nand_fopen(TEST_TXT_NAME, "r"); if (filep < 0) { printf("nand mount Failed:%d\r\n",__LINE__); return; } status = ql_nand_fread(reads_buf, 1, sizeof(reads_buf), filep); printf("status:%d\r\n",status); ql_nand_fclose(filep); printf("reads_buf1:%s\r\n", reads_buf); printf("========== read file2_start==========\r\n"); memset(reads_buf, 0, sizeof(reads_buf)); filep = ql_nand_fopen("mount_temp.txt", "r"); if (filep < 0) { printf("nand mount Failed:%d\r\n",__LINE__); return; } status = ql_nand_fread(reads_buf, 1, sizeof(reads_buf), filep); printf("status:%d\r\n", status); ql_nand_fclose(filep); printf("reads_buf2:%s\r\n", reads_buf); printf("read from zip Success\r\n"); printf("========== end read file==========\r\n"); #endif //把压缩包数据写到littfs系统中,方便导入到windows中进行解压 #if 0 printf("========== start read test_zip==========\r\n"); char zip_buf[169]={0}; filep=ql_nand_fopen("test.zip", "rb"); if(filep == NULL){ printf("fx_file_open is failede.!!\r\n"); return; } status = ql_nand_fread(zip_buf,1,sizeof(zip_buf),filep); if(status != 168){ printf("fx_file_read is failede.!!\n"); ql_nand_fclose(filep); return; } printf("read from zip Success\r\n"); printf("status:%d\r\n",status); ql_nand_fclose(filep); // printf("zip_data:"); // for(int i=0;i0){ printf("ql_fwrite is ok.!!\r\n"); ql_fclose(littfs_filep); }else{ printf("ql_fwrite is failede.!!\r\n"); ql_fclose(littfs_filep); return; } ql_fclose(littfs_filep); #endif } //解压从windows接受的压缩包 ql_sem_t semaRef; int read_len = 0; char r_data[1024] = {0}; void quec_uart_rx_callback(QL_UART_PORT_NUMBER_E port, void *para) { read_len = ql_uart_read(port, r_data, sizeof(r_data)); ql_rtos_semaphore_release(semaRef); } void quec_main_uart_rx(void) { int ret = -1; ql_uart_config_t dcb; ql_log_mask_set(QL_LOG_APP_MASK, QL_LOG_PORT_UART); ret = ql_uart_open(QL_MAIN_UART_PORT, QL_UART_BAUD_115200, QL_FC_NONE); ql_uart_get_dcbconfig(QL_MAIN_UART_PORT, &dcb); dcb.baudrate = QL_UART_BAUD_115200; ql_uart_set_dcbconfig(QL_MAIN_UART_PORT, &dcb); ql_uart_register_cb(QL_MAIN_UART_PORT, quec_uart_rx_callback); // use callback to read uart data // 清除可能已存在的信号量计数 while(ql_rtos_semaphore_wait(semaRef, 0) == 0); ql_rtos_semaphore_wait(semaRef, QL_WAIT_FOREVER); printf("data_len:%d\r\n", read_len); // printf("data:\r\n"); // for (int i = 0; i < read_len; i++) // { // printf("%x", r_data[i]); // } // printf("\r\n"); } static void nand_unzip_test(void *argv) { printf("======nand_unzip_test_start=======\r\n"); int ret = 0; File_Handle filep,filep1; size_t status = 0; HZIP hzs; char from_win_buf[50]={0}; ql_rtos_semaphore_create(&semaRef, 0); quec_main_uart_rx();//接受从windows下压缩包的数据 ql_spi_nand_init(QL_SPI_DEV0, QL_PIN_33_36, SPI_CLOCK_26M); filep = ql_nand_fopen("zip_test2.zip", "wb"); if (filep < 0) { printf("ql_nand_fopen is failede.!!\r\n"); return; } status = ql_nand_fwrite(r_data, 1, sizeof(r_data), filep); if (status > 0) { printf("ql_nand_fwrite is ok.!!\r\n"); ql_nand_fclose(filep); } else { printf("ql_nand_fwrite is failede.!!\r\n"); ql_nand_fclose(filep); return; } char zipFilePath[128] = {0}; sprintf(zipFilePath, "%s%s", NAND_DEV,"zip_test2.zip" ); ret = ql_fs_unzip(zipFilePath, NULL, 1); if (ret != QL_FILE_OK) { printf("unzip file:[%s] Failed\r\n", zipFilePath); return; } printf("unzip file:[%s] Success\r\n", zipFilePath); filep = ql_nand_fopen("zip_test.txt", "r"); if(filep < 0){ printf("ql_nand_fopen is failede.!!\r\n"); ql_nand_fclose(filep); return; } //读文件1 status = ql_nand_fread(from_win_buf, 1, sizeof(from_win_buf), filep); if (status > 0) { printf("ql_nand_fread is ok.!! %d\r\n",__LINE__); ql_nand_fclose(filep); } else { printf("ql_nand_fread is failede.!!\r\n"); ql_nand_fclose(filep); return; } printf("status:%d\r\n",status); printf("from_win_buf:%s\r\n", from_win_buf); //读文件2 memset(from_win_buf, 0, sizeof(from_win_buf)); filep1 = ql_nand_fopen("zip_test2.txt", "r"); if(filep1 < 0){ printf("ql_nand_fopen is failede.!!\r\n"); ql_nand_fclose(filep1); return; } status = ql_nand_fread(from_win_buf, 1, sizeof(from_win_buf), filep1); if (status > 0) { printf("ql_nand_fread is ok.!!\r\n"); ql_nand_fclose(filep1); } else { printf("ql_nand_fread is failede.!!\r\n"); ql_nand_fclose(filep1); return; } printf("from_win_buf:%s\r\n", from_win_buf); printf("======nand_unzip_test_end=======\r\n"); } #define FILE_ZIP_NAME1 "test3.zip" #define FILE_NAME1 "ZIPTEST.TXT" #define U_DISK1 "U:" #define FILE_NAME_ZIP1 "ZIPTEST1.txt" #define FILE_ZIP_DIR_FILE1 "" U_DISK1 "/" FILE_NAME_ZIP1 "" #define FILE_ZIP_DS_FILE1 "" U_DISK1 "/" FILE_NAME1 "" #define FILE_ZIP_PATH1 "" U_DISK1 "/" FILE_ZIP_NAME1 "" const char *unZipFilePaths1 = FILE_ZIP_PATH1; const char *zipFilePath1 = FILE_ZIP_DS_FILE1; const char *zipNAME1 = FILE_ZIP_DIR_FILE1; char *unZip_paths1 = NULL; void littfs_zip_test(void *argv) { int ret = 0; QFILE *filep = NULL; HZIP hzs; // ql_rtos_task_sleep_s(5); // ql_spi_nand_init(QL_SPI_DEV0, QL_PIN_33_36,SPI_CLOCK_26M); // ret = ql_nand_mkdir("quec_zips1"); // printf("ql_nand_mkdir %d\n",ret); char bufs_test[50] = "quec_zips2_test_in_windows"; char read_buf[50] = {0}; filep = ql_fopen(FILE_ZIP_DS_FILE1, "wb+"); if (filep == NULL) { printf("fx_file_open is failede.!!\n"); return; } ret = ql_fwrite(bufs_test, strlen(bufs_test), 1, filep); if (ret > 0) { printf("fx_file_write is success.!!\n"); } else { printf("fx_file_write is failede.!!\n"); ql_fclose(filep); return; } ql_fclose(filep); ql_rtos_task_sleep_s(5); // 创建一个zip文件头 hzs = ql_fs_zip_create(unZipFilePaths1, 0, &ret); if (ret < 0) { printf("create empty.zip:[%s] Failed,errcode=%d\r\n", unZipFilePaths1, ret); printf("------------------\n"); ql_fs_zip_close(hzs); return; } else { printf(("create empty.zip:[%s] Success\r\n", unZipFilePaths1)); } ret = ql_fs_zip_add_file(hzs, zipNAME1, zipFilePath1); if (ret != QL_FILE_OK) { printf("add [%s] to zip Failed\r\n", zipFilePath1); ql_fs_zip_close(hzs); return; } else { printf("add [%s] to zip Success\r\n", zipFilePath1); } ql_fs_zip_close(hzs); // printf("add to zip Success\r\n"); ql_rtos_task_sleep_s(5); printf("========== start unzip file[%d]==========\r\n"); ret = ql_fs_unzip(unZipFilePaths1, unZip_paths1, 1); if (ret != QL_FILE_OK) { printf("unzip file:[%s] Failed\r\n", unZipFilePaths1); return; } printf("unzip file:[%s] Success\r\n", unZipFilePaths1); #if 0 printf("========== start read zip file==========\r\n"); filep =ql_fopen(unZipFilePaths1, "rb"); if(filep==NULL){ printf("littfss_fx_file_open is failede.!!\n"); return; } ret=ql_fread(read_buf, sizeof(read_buf), 1, filep); ql_fclose(filep); printf("read file size is %d\r\n",ret); printf("data:"); for(int i=0;i