EC600U_esp32_iap_uart/fs/ql_fs_demo.c

318 lines
5.9 KiB
C
Raw Permalink Normal View History

2024-02-05 17:39:56 +08:00
/** @file
ql_fs_demo.c
@brief
TODO
*/
/*================================================================
Copyright (c) 2021 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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "ql_api_osi.h"
#include "ql_log.h"
#include "ql_fs_demo.h"
#include "ql_fs.h"
#include "ql_api_dev.h"
#define QL_FS_DEMO_LOG_LEVEL QL_LOG_LEVEL_INFO
#define QL_FS_DEMO_LOG(msg, ...) QL_LOG(QL_FS_DEMO_LOG_LEVEL, "ql_fs_demo", msg, ##__VA_ARGS__)
ql_task_t ql_fs_task = NULL;
#define QL_FS_COPY_FILE_BUFF_SIZE (10240)
#define QL_FS_COPY_FILE_FEED_DOG_SIZE (1024*110) /* 写110K数据喂一次看门狗避免写大文件看门狗复位 */
int ql_fs_copy_file(const char * sour_file_name, const char * dest_file_name)
{
int sour_fd = 0, dest_fd = 0;
int64 err = QL_FILE_OK;
void * data_buff = NULL;
sour_fd = ql_fopen(sour_file_name, "r");
if(sour_fd < 0)
{
QL_FS_DEMO_LOG("open sour file failed");
err = sour_fd;
goto exit;
}
dest_fd = ql_fopen(dest_file_name, "w+");
if(dest_fd < 0)
{
QL_FS_DEMO_LOG("open dest file failed");
err = dest_fd;
goto exit;
}
data_buff = malloc(QL_FS_COPY_FILE_BUFF_SIZE);
while(TRUE)
{
err = ql_fread(data_buff, QL_FS_COPY_FILE_BUFF_SIZE, 1, sour_fd);
if(err > 0)
{
static int i = 1;
err = ql_fwrite(data_buff, err, 1, dest_fd);
if(err < 0)
{
QL_FS_DEMO_LOG("write file failed");
goto exit;
}
if(i * QL_FS_COPY_FILE_BUFF_SIZE >= QL_FS_COPY_FILE_FEED_DOG_SIZE)
{
ql_dev_feed_wdt();
i = 0;
}
i++;
}
else if(err == 0)
{
goto exit;
}
else if(err < 0)
{
if(QL_FILE_READ_ZERO == err)
{
err = QL_FILE_OK;
}
else
{
QL_FS_DEMO_LOG("read file failed");
}
goto exit;
}
}
exit:
if(sour_fd > 0)
{
ql_fclose(sour_fd);
}
if(dest_fd > 0)
{
ql_fclose(dest_fd);
}
if(NULL != data_buff)
{
free(data_buff);
}
return err;
}
void ql_fs_callback(void *ctx)
{
int fd = 0;
int err = QL_FILE_OK;
char buffer[100] = {0};
char *str = TEST_STR;
ql_rtos_task_sleep_s(15);
err = ql_mkdir(DIR_PATH, 0);
if(err < 0)
{
if(err == QL_DIR_DIR_ALREADY_EXIST)
{
QL_FS_DEMO_LOG("exist");
}
else
{
QL_FS_DEMO_LOG("failed");
goto exit;
}
}
/* open encrypted file to write*/
fd = ql_fopen(FILE_PATH, "ew");
if(fd < 0)
{
QL_FS_DEMO_LOG("failed");
err = fd;
goto exit;
}
/* write encrypted file */
err = ql_fwrite(str, strlen(str) + 1, 1, fd); //strlen not include '\0'
if(err < 0)
{
QL_FS_DEMO_LOG("failed");
ql_fclose(fd);
goto exit;
}
ql_fclose(fd);
/* open encrypted file to read*/
fd = ql_fopen(FILE_PATH, "er");
if(fd < 0)
{
QL_FS_DEMO_LOG("failed");
ql_fclose(fd);
goto exit;
}
/* read encrypted file */
memset(buffer, 0, 100);
err = ql_fread(buffer, ql_fsize(fd), 1, fd);
if(err < 0)
{
QL_FS_DEMO_LOG("failed");
ql_fclose(fd);
goto exit;
}
QL_FS_DEMO_LOG("encrypted:%s", buffer);
ql_fclose(fd);
/* write common file */
fd = ql_fopen(FILE_PATH, "wb+");
if(fd < 0)
{
QL_FS_DEMO_LOG("failed");
err = fd;
goto exit;
}
err = ql_fwrite(str, strlen(str) + 1, 1, fd); //strlen not include '\0'
if(err < 0)
{
QL_FS_DEMO_LOG("failed");
ql_fclose(fd);
goto exit;
}
/* read common file */
err = ql_frewind(fd);
if(err < 0)
{
QL_FS_DEMO_LOG("failed");
ql_fclose(fd);
goto exit;
}
memset(buffer, 0, 100);
err = ql_fread(buffer, ql_fsize(fd), 1, fd);
if(err < 0)
{
QL_FS_DEMO_LOG("failed");
ql_fclose(fd);
goto exit;
}
QL_FS_DEMO_LOG("common:%s", buffer);
ql_fclose(fd);
err = ql_nvm_fwrite(TEST_NVM, str, strlen(str) + 1, 1); //nvm 配置文件不需要输入路径
if(err < 0)
{
QL_FS_DEMO_LOG("failed");
goto exit;
}
memset(buffer, 0, 100);
err = ql_nvm_fread(TEST_NVM, buffer, strlen(str) + 1, 1);
if(err < 0)
{
QL_FS_DEMO_LOG("failed");
goto exit;
}
QL_FS_DEMO_LOG("nvm:%s", buffer);
err = ql_cust_nvm_fwrite(str, strlen(str) + 1, 1); //客户nvm 配置文件不需要输入文件名使用空间不大于1KB
if(err < 0)
{
QL_FS_DEMO_LOG("failed");
goto exit;
}
memset(buffer, 0, 100);
err = ql_cust_nvm_fread(buffer, strlen(str) + 1, 1);
if(err < 0)
{
QL_FS_DEMO_LOG("failed");
goto exit;
}
QL_FS_DEMO_LOG("cust nvm:%s", buffer);
memset(buffer, 0, 100);
err = ql_fac_cust_nvm_fread(0, buffer, 100, 1);
if(err < 0)
{
QL_FS_DEMO_LOG("failed");
goto exit;
}
QL_FS_DEMO_LOG("fac cust nvm:%s", buffer);
err = ql_fs_copy_file(FILE_PATH, DEST_FILE_PATH);
if(err < 0)
{
QL_FS_DEMO_LOG("failed");
goto exit;
}
fd = ql_fopen(DEST_FILE_PATH, "r");
if(fd < 0)
{
QL_FS_DEMO_LOG("failed");
err = fd;
goto exit;
}
memset(buffer, 0, 100);
err = ql_fread(buffer, ql_fsize(fd), 1, fd);
if(err < 0)
{
QL_FS_DEMO_LOG("failed");
ql_fclose(fd);
goto exit;
}
QL_FS_DEMO_LOG("copyed:%s", buffer);
ql_fclose(fd);
ql_rmdir_ex(DIR_PATH); //删除DIR_PATH目录和目录里面的文件
exit:
if(err < 0)
{
QL_FS_DEMO_LOG("errcode is %x", err);
}
QL_FS_DEMO_LOG("exit file demo");
ql_rtos_task_delete(NULL);
}
int ql_fs_demo_init(void)
{
QlOSStatus err = QL_OSI_SUCCESS;
err = ql_rtos_task_create(&ql_fs_task, QL_FS_TASK_STACK_SIZE, QL_FS_TASK_PRIO, "ql_fs_task", ql_fs_callback, NULL, QL_FS_TASK_EVENT_CNT);
if(err != QL_OSI_SUCCESS)
{
QL_FS_DEMO_LOG("file_task created failed");
}
return err;
}