⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fatfs_cmds.c[2010-03-16-09-02-44].sfb

📁 STM32_fatfs_shell_SDHC.rar
💻 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 + -