This repository has been archived on 2023-07-17. You can view files and clone it, but cannot push or open issues or pull requests.
bl_mcu_sdk/components/shell/shell_fs.c

198 lines
5.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#if defined(SHELL_USING_FS)
#include "shell.h"
#include "ff.h"
#include "fatfs_posix_api.h"
/*
static void *(*shell_malloc)(size_t size) = mmheap_alloc;
static void (*shell_free)(void *ptr) = mmheap_free;
*/
#ifndef MIN
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif
const char *fatfs_table[] = {
"FR_OK成功", /* (0) Succeeded */
"FR_DISK_ERR底层硬件错误", /* (1) A hard error occurred in the low level disk I/O layer */
"FR_INT_ERR断言失败", /* (2) Assertion failed */
"FR_NOT_READY物理驱动没有工作", /* (3) The physical drive cannot work */
"FR_NO_FILE文件不存在", /* (4) Could not find the file */
"FR_NO_PATH路径不存在", /* (5) Could not find the path */
"FR_INVALID_NAME无效文件名", /* (6) The path name format is invalid */
"FR_DENIED由于禁止访问或者目录已满访问被拒绝", /* (7) Access denied due to prohibited access or directory full */
"FR_EXIST文件已经存在", /* (8) Access denied due to prohibited access */
"FR_INVALID_OBJECT文件或者目录对象无效", /* (9) The file/directory object is invalid */
"FR_WRITE_PROTECTED物理驱动被写保护", /* (10) The physical drive is write protected */
"FR_INVALID_DRIVE逻辑驱动号无效", /* (11) The logical drive number is invalid */
"FR_NOT_ENABLED卷中无工作区", /* (12) The volume has no work area */
"FR_NO_FILESYSTEM没有有效的FAT卷", /* (13) There is no valid FAT volume */
"FR_MKFS_ABORTED由于参数错误f_mkfs()被终止", /* (14) The f_mkfs() aborted due to any parameter error */
"FR_TIMEOUT在规定的时间内无法获得访问卷的许可", /* (15) Could not get a grant to access the volume within defined period */
"FR_LOCKED由于文件共享策略操作被拒绝", /* (16) The operation is rejected according to the file sharing policy */
"FR_NOT_ENOUGH_CORE无法分配长文件名工作区", /* (17) LFN working buffer could not be allocated */
"FR_TOO_MANY_OPEN_FILES当前打开的文件数大于_FS_SHARE", /* (18) Number of open files > _FS_SHARE */
"FR_INVALID_PARAMETER参数无效" /* (19) Given parameter is invalid */
};
static char path[SHELL_CONSOLEBUF_SIZE] = { 0 };
#ifdef DFS_USING_WORKDIR
extern char working_directory[];
#endif
int cmd_ls(int argc, char **argv)
{
FILINFO entry = { 0 };
DIR dir;
int err;
uint8_t flag = 0;
for (uint8_t i = 1; i < argc; i++) {
//cmd
if (argv[i][0] == '-') {
if (strcmp(argv[i], "-a") == 0) {
flag |= 0x01;
} else {
MSG("参数错误 %s\r\n", argv[i]);
return -1;
}
}
//path
else {
if ((flag & 0x80) == 0) {
strcpy(path, argv[i]);
flag |= 0x80;
} else {
MSG("参数错误 %s\r\n", argv[i]);
return -1;
}
}
}
if ((flag & 0x80) == 0) {
strcpy(path, ".");
}
err = f_opendir(&dir, path);
if (err) {
MSG("%s %s\r\n", fatfs_table[err], path);
return -1;
}
while (1) {
err = f_readdir(&dir, &entry);
if (err) {
MSG("%s %s\r\n", fatfs_table[err], path);
break;
}
/* Check for end of directory listing */
if (entry.fname[0] == '\0') {
break;
}
if ((entry.fattrib & AM_HID) && !(flag & 0x01)) {
continue;
}
MSG("%s%s%s\r\n", entry.fname, (entry.fattrib & AM_DIR) ? "/" : "", (entry.fattrib & AM_HID) ? "(Hidden)" : "");
}
f_closedir(&dir);
return 0;
}
SHELL_CMD_EXPORT_ALIAS(cmd_ls, ls, List information about the FILEs.);
int cmd_rm(int argc, char **argv)
{
int err;
if (argc < 2) {
MSG("缺少参数\r\n");
MSG("rm <path> \r\n");
return -1;
} else {
strcpy(path, argv[1]);
}
err = f_unlink(path);
if (err) {
MSG("%s %s\r\n", fatfs_table[err], path);
err = -1;
}
return err;
}
SHELL_CMD_EXPORT_ALIAS(cmd_rm, rm, Remove(unlink) the FILE(s).);
int cmd_cd(int argc, char **argv)
{
int err;
if (argc < 2) {
strcpy(path, ".");
} else {
strcpy(path, argv[1]);
}
for (uint16_t i = strlen(path) - 1; i > 0; i--) {
if (path[i] == '/')
path[i] = '\0';
else
break;
}
err = f_chdir(path);
if (err) {
MSG("%s %s\r\n", fatfs_table[err], path);
return -1;
}
return 0;
}
SHELL_CMD_EXPORT_ALIAS(cmd_cd, cd, Change the shell working directory.);
int cmd_pwd(int argc, char **argv)
{
int err;
err = f_getcwd(path, SHELL_CONSOLEBUF_SIZE);
if (err) {
MSG("%s\r\n", fatfs_table[err]);
return -1;
}
MSG("%s\r\n", path);
return 0;
}
SHELL_CMD_EXPORT_ALIAS(cmd_pwd, pwd, Print the name of the current working directory.);
int cmd_mkdir(int argc, char **argv)
{
int err;
if (argc < 2) {
strcpy(path, "new_dir");
} else {
strcpy(path, argv[1]);
}
err = f_mkdir(path);
if (err) {
MSG("%s %s\r\n", fatfs_table[err], path);
err = -1;
}
return err;
}
SHELL_CMD_EXPORT_ALIAS(cmd_mkdir, mkdir, Create the DIRECTORY.);
#endif