?? fatfs_cmds.c[2010-03-16-09-02-44].sfb
字號:
/*
* commands.c
* the genie shell command part for ucosII
* under skyeye
*
* Bugs report: ganganwen@163.com
* Last modified: 2005-04-25
* changed by: wenjia
*/
#include "config.h"
FIL myfile_fat;
char mybuffer_fat[0x200];
char CurDir_fat[400]=""; //show current dir
//char CurDir_fat[400]="0:"; //show current dir 先用于DataFlash中查看,以后補充
char TargetVal_fat[400] = "";
//TargetVal數組第一功能功能:用于組合當前目錄與輸入數據如
//CurDir_fat = "\mydir" cat 1.txt 時組合成cat \mydir\1.txt
//第二功能:保留CurDir目錄,因為如果cd參數第一個字符為\時就從&CurDir_fat[0]
//開始復制,但若輸入目錄出錯則將原來的CurDir目錄還原。
UCHAR DirExist_fat(const char *DirName);
void RewindRoot_fat(void);
void CreateTargetVal_fat(const char *arg);
void shellClose(void)
{
shellEnable=FALSE;
f_chdrive(0); //打開DATAFLASH
_log_Fat("close shell function!!");
}
//判斷目錄名是否存在
//1:目錄存在 0:目錄不存在
UCHAR DirExist_fat(const char *DirName)
{
DIR dirp;
if (FR_OK == f_opendir(&dirp,DirName))
{
return 1;
}
else
{
_error_Fat("unable to open dir: %s\r\n",DirName);
return 0;
}
}
//--------------------------------------------
void _write_file_Fat(const char *name, const char *txt)
{
UINT x;
/* create file */
if (FR_OK == f_open(&myfile_fat,name,FA_CREATE_NEW|FA_WRITE))
{
/* write to file */
if (FR_OK != f_write(&myfile_fat,txt,(UINT)strlen(txt),&x))
{
_error_Fat("Not all bytes written , the written data len is %d bytes.\r\n",x);
}
/* close file */
f_close(&myfile_fat);
_log_Fat("\r\n");
}
else
{
_error_Fat("Unable to create file %s\r\n",name);
}
}
void _dump_file_Fat(const char *name)
{
UINT x;
/* open file */
if (FR_OK == f_open(&myfile_fat,name,FA_READ))
{
/* read until EOF has been reached */
do
{
if(FR_OK == f_read(&myfile_fat,mybuffer_fat,sizeof(mybuffer_fat), &x))
{
mybuffer_fat[x]=0;
_log_Fat(mybuffer_fat);
}
} while (x);
/* close file */
f_close(&myfile_fat);
_log_Fat("\r\n");
}
else
{
_error_Fat("Unable to open file %s.\r\n",name);
}
}
void _show_directory_Fat(const char* path)
{
FILINFO finfo;
DIR dirs;
int i;
_log_Fat("ls %s\r\n",path);
if (f_opendir(&dirs, path) == FR_OK)
{
i = strlen(path);
while ((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0])
{
// _log_Fat(" %s %s Attributes: %s%s%s%s ", &finfo.fname[0],
_log_Fat(" %s %s \tAttr: %s%s%s%s ", &finfo.fname[0],
(finfo.fattrib & AM_DIR) ? "\t(Dir)" : " ",
(finfo.fattrib & AM_ARC) ? "A" : "-",
(finfo.fattrib & AM_RDO) ? "R" : "-",
(finfo.fattrib & AM_HID) ? "H" : "-",
(finfo.fattrib & AM_SYS) ? "S" : "-"
);
if(finfo.fattrib & AM_DIR)
{
// _log_Fat("Size: %lu\r\n",0);
}
else
{
if(finfo.fsize<1024) // < 1KB
_log_Fat(" %lu bytes",finfo.fsize);
else if(finfo.fsize<1024*1024) // < 1Mb
_log_Fat(" %.2f KB",(finfo.fsize/1024.0));
else //
_log_Fat(" %.2f MB",(finfo.fsize/1024.0/1024.0));
}
_log_Fat("\r\n");
#if 0 // 遞歸調用,遍歷文件夾
if (finfo.fattrib & AM_DIR)
{
sprintf(&path[i], "/%s", &finfo.fname[0]);
scan_files(path);
path[i] = 0;
}
else
{
printf("%s/%s\r\n", path, &finfo.fname[0]);
}
#endif
}
}
}
void _show_free_Fat()
{
FATFS *fs;
DWORD clust;
// Get free clusters
if (f_getfree("1:", &clust, &fs)== FR_OK)
{
// Get free space
_log_Fat("\r\n%lu KB total disk space.\r\n"
"%lu KB available on the disk.\r\n",
(DWORD)(fs->max_clust - 2) * fs->csize / 2,
clust * fs->csize / 2);
}
else
{
_error_Fat("\r\nInvalid drive specified\r\n");
}
}
long ShowFunc_Fat(int argc,char **argv)
{
_log_Fat("\r\n========= TargetVal_fat = ");
_log_Fat(TargetVal_fat);
_log_Fat("========\r\n");
return 0;
}
long pwdFunc_Fat(int argc,char **argv)
{
if (argc != 0)
{
_error_Fat("PWD is single arg\r\n");
return 1;
}
_log_Fat(CurDir_fat);
_log_Fat("\r\n");
return 0;
}
//功能:設置成根目錄
void RewindRoot_fat(void)
{
CurDir_fat[0] = '\0';
CurDir_fat[1] = '\0';
}
//更改當前目錄命令
long cdFunc_Fat(int argc,char **argv)
{
UCHAR DirCurPos = 0;
UCHAR CmdLen = 0;
UCHAR TmpVal = 0;
UCHAR IsRoot = 0;
UCHAR IsBackup = 0;
UCHAR BackupLen = 0;
DirCurPos = strlen(CurDir_fat); //取得當前目錄的字符長度
if (argc < 1)
{
_error_Fat("please input command as:cd directoryname ");
_error_Fat("\r\n cd \\ change to root\r\n cd .. \r\n cd \\MyDir\\Dir1\r\n");
_error_Fat("\r\n");
return 1;
}
if (strcmp(argv[0], "..") == 0) //回到上一級
{
if (1 == DirCurPos) //設定長度為1的為根目錄
{
_error_Fat("This is root dir\r\n");
return 1;
}
else
{
TmpVal = DirCurPos; //取得當前目錄的長度并從最后開始查找
//從最后開始查找將該級目錄清除
//例:\my\dir1 從1開始找到r最后找到\dir的\清除
while (TmpVal--)
{
if (CurDir_fat[TmpVal] == '/') //是否找到上一級目錄
{
if (TmpVal == 0) //根目錄
{
RewindRoot_fat();
} else {
CurDir_fat[TmpVal] = '\0'; //將最后的\換成結束符
}
_log_Fat("\r\n CurDir_fat Len = %d\r\n", strlen(CurDir_fat));
break; //退出循環
} else {
CurDir_fat[TmpVal] = '\0'; //清除字符
}
}
}
}
else if (strcmp(argv[0], "/") == 0)
{ //
RewindRoot_fat(); //回到根目錄
_log_Fat("回到根目錄 argc = %d\r\n",argc);
}
else
{
if (strcmp(CurDir_fat, "/") == 0) //比較方法用于比較是否是當前目錄
{
IsRoot = 1;
if ('/' == argv[0][0]) //如果當輸入參數是帶\開始的,如cd \dir\dir1
{
DirCurPos = 0;
}
_log_Fat("\r\ncd start at root! DirCurPos = %d\r\n", DirCurPos);
}
else
{
if ('/' == argv[0][0]) //如果當輸入參數是帶\開始的,如cd \dir\dir1
{
//因為當前目錄不是根目錄,所以為了防止出錯保留原目錄
IsBackup = 1;
BackupLen = DirCurPos + 1;
strncpy(&TargetVal_fat[0], &CurDir_fat[0], BackupLen);
DirCurPos = 0; //從頭開始復制命令
}
else
{
CurDir_fat[DirCurPos] = '/';
DirCurPos++;
}
}
CmdLen = strlen(argv[0]);
strncpy(&CurDir_fat[DirCurPos], argv[0], CmdLen + 1); //確保字符是以'\0'結束請看FS_STRNCPY源碼
// _log_Fat("\r\nafter strncpy() CurDir_fat= %s DirCurPos = %d CmdLen = %d\r\n", CurDir_fat, DirCurPos, CmdLen);
if (DirExist_fat(CurDir_fat) == 0) //目錄不存在
{
_log_Fat(argv[0]);
_log_Fat(" Dir is not exist!\r\n" );
if (1 == IsRoot) //是否是根目錄
{
RewindRoot_fat();
}
else
{
if (1 == IsBackup)
{
strncpy(&CurDir_fat[0], &TargetVal_fat[0], BackupLen);
}
else
{
CurDir_fat[DirCurPos - 1] = '\0'; //將加入的目錄清除
}
}
}
else
{
// _log_Fat("Open %s Exist!\r\n", CurDir_fat); //目錄存在
}
}
_log_Fat("\r\nCurDir = %s \r\n", CurDir_fat);
return 0;
}
long lsFunc_Fat(int argc,char **argv)
{
if(argc == 0)
{
_show_directory_Fat(CurDir_fat);
}
else
{
_show_directory_Fat(argv[0]);
}
return 0;
}
long rmFunc_Fat(int argc,char **argv)
{
if(argc != 1)
{
_error_Fat("please input command as:rm filename");
_error_Fat("\r\n\r\n");
return 1;
}
CreateTargetVal_fat(argv[0]);
if(FR_OK == f_unlink(TargetVal_fat))
{
_log_Fat("remove ");
_log_Fat(argv[0]);
_log_Fat(" successful\r\n\r\n");
}
else
{
_error_Fat("remove failure!\r\n\r\n");
}
return 0;
}
long writeFunc_Fat(int argc,char **argv)
{
if(argc != 2)
{
_error_Fat("please input command as:create filename data");
_error_Fat("\r\n\r\n");
return 1;
}
CreateTargetVal_fat(argv[0]);
_write_file_Fat(TargetVal_fat, argv[1]);
return 0;
}
//用于將arg參數構造成CurDir + arg = TargetParam
void CreateTargetVal_fat(const char *arg)
{
UCHAR CurDirLen = 0;
CurDirLen = strlen(CurDir_fat);
if ('/' == arg[0])
{
strncpy(&TargetVal_fat[0], arg, strlen(arg) + 1);
}
else
{
if (1 == CurDirLen) //判斷是否當前目錄
{
strncpy(&TargetVal_fat[CurDirLen], arg, strlen(arg) + 1);
}
else
{
strncpy(TargetVal_fat, CurDir_fat, CurDirLen + 1);
TargetVal_fat[CurDirLen++] = '/';
_log_Fat("\r\n %s\r\n", TargetVal_fat);
strncpy(&TargetVal_fat[CurDirLen], arg, strlen(arg) + 1);
}
}
_log_Fat("\r\nTargetVal = %s\r\n", TargetVal_fat);
}
long catFunc_Fat(int argc,char **argv)
{
if(argc != 1)
{
_error_Fat("please input command as:cat filename");
_error_Fat("\r\n\r\n");
return 1;
}
CreateTargetVal_fat(argv[0]);
_dump_file_Fat(TargetVal_fat);
return 0;
}
long mkdirFunc_Fat(int argc,char **argv)
{
if(argc != 1)
{
_error_Fat("please input command as:mkdir filename");
_error_Fat("\r\n\r\n");
return 1;
}
CreateTargetVal_fat(argv[0]);
if(FR_OK == f_mkdir(TargetVal_fat))
{
_log_Fat("make directory ");
_log_Fat(argv[0]);
_log_Fat(" successful\r\n\r\n");
}
else
{
_error_Fat("mkdir failure! please check disk full or unformated\r\n");
}
return 0;
}
long freeFunc_Fat(int argc,char **argv)
{
_show_free_Fat();
_log_Fat("\r\n");
return 0;
}
FATFS mySDHandle;
long RegisterFunc_Fat(int argc,char **argv)
{
f_mount(0,&mySDHandle);
_log_Fat("f_mount(0,&mySDHandle)\r\n");
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -