回答

收藏

C5000音频电容式触摸扩展板 功能拆解之 文件操作函数分析1

FPGA/DSP FPGA/DSP 3198 人阅读 | 0 人回复 | 2013-01-06

在InitC55ABP() 函数中 关于文件系统的操作有

        Go_RootDir();
        UpdateFileSys_Dir();
        UpdateContext_Count();
        context.root_dir_count = context.curr_dir_count;



在 ACTBP_filesys.c 文件中 有 Go_RootDir(); 函数的定义, 在该函数中,用到了 CD` 命令 ,该命令将文件目录改为之前利用 sys_file命令设置的目录(调用函数 uif_writeArray 写入字符串)
使用方法如下
$sys_file=”<DirName>”
$operation=CD
而默认有三个目录:根目录,当前目录,录音目录
const struct StringsDirNav dirnavStrings = {
        "\\",         //dirnavStrings.ROOT_DIR
        ".",          //dirnavStrings.CURRENT_DIR
        "RecDir",     //dirnavStrings.RECORD_DIR
};


在 ACTBP_filesys.c文件中,有 void UpdateFileSys_Dir(void) 函数定义,该函数调用 DIR 命令,用于显示指定文件夹中的文件和子文件夹列表,类似于windows控制台命令 DIR

在ACTBP_filesys.c文件中,有 void UpdateContext_Count(void) 函数定义,该函数调用 file_count和dir_count 命令,用于显示指定文件夹中音频文件数目和子文件夹数目(通过调用uif_readScalar函数得到返回值),并利用这些得到的值,更新用于记录上下文的context结构体中的相关记录


该结构体的定义如下
struct ContextABP
{
  enum event current_event;
  enum event_hold last_event;
  enum state current_state;
  enum state last_state;
  int curr_dir_num;
  int curr_file_num;
  int curr_dir_count;
  int root_dir_count;
  int curr_file_count;
  unsigned char curr_volume;
  unsigned char curr_play_status;
  unsigned char curr_record_status;
  unsigned shuffle_status:1;
  unsigned cycle_status:1;
  unsigned USB_cableinsert:1;
  unsigned disable_command:1;
};







分析函数
Go_NextDir();
UpdateDisplay_Dir();
在 ACTBP_display.c  文件中UpdateDisplay_Dir() 函数定义,该函数用于实现更新显示文件目录DIR:……,在虚拟的第五行上
在 ACTBP_filesys.c文件中有 Go_NextDir()函数定义,该函数主要调用了NEXTD 命令,注意在使用该命令之前,要保证dir_info寄存器保存了正确的文件夹信息,也就是说之前已经调用了DIR命令
在进入当前文件夹的第一个子文件夹函数 void Go_FirstDir(void)中,调用了 FSTD命令。

本次实验目的是 利用液晶屏幕 显示文件信息 包括当前文件数目 和 子文件夹数目
  1. void MyShowInf()
  2. {
  3.         Status status = FAILURE;
  4.         char myStr[4][10]={"Dir  Num: ", "          ", "File Num: ", "          "};
  5.         unsigned long cursor[4] = {0x0000, 0x000b, 0x0100, 0x010b};
  6.         unsigned int num[2] = {0};
  7.         char i = 0;
  8.         Go_RootDir();
  9.         UpdateFileSys_Dir();
  10.         UpdateContext_Count();
  11.         // 将得到的数字换算成字符
  12.         num[0]= (unsigned int )context.curr_dir_count;
  13.         num[1] = (unsigned int )context.curr_file_count;
  14.         myStr[1][0] = num[0]/10 + '0';
  15.         myStr[1][1] = num[0]%10 + '0';
  16.         myStr[3][0] = num[1]/10 + '0';
  17.         myStr[3][1] = num[1]%10 + '0';

  18.         for(i=0; i<4; i++)
  19.         {
  20.                 // 1  分配字符串 及 ID
  21.                 RegAddr = UIF_CMD_STR;
  22.                 status = uif_writeArray( RegAddr, (unsigned int) 10, myStr[i]);
  23.                 RegAddr = UIF_CMD_OPERATION;
  24.                 OperationVal = SID_TMP; // 改为05
  25.                 status = uif_writeScalar( RegAddr, OperationVal, (unsigned int) ACK_EXPECT);

  26.                 // 2 设置坐标第一行  利用 SETCUR 命令
  27.                 RegAddr = UIF_CMD_PARAM;
  28.                 status = uif_writeScalar( RegAddr, cursor[i], (unsigned int) ACK_EXPECT);
  29.                 RegAddr = UIF_CMD_OPERATION;
  30.                 OperationVal = UIF_CMD_SETCUR;
  31.                 status = uif_writeScalar( RegAddr, OperationVal, (unsigned int) ACK_EXPECT);

  32.                 // 3 虚拟显示出来第一行 利用 PRTSxx  命令
  33.                 RegAddr = UIF_CMD_OPERATION;
  34.                 OperationVal = PRT_TMP;
  35.                 status = uif_writeScalar( RegAddr, OperationVal, (unsigned int) ACK_EXPECT);
  36.         }

  37.         // 实际显示出来
  38.         OperationVal = UIF_CMD_SETVP;
  39.         RegAddr = UIF_CMD_PARAM;
  40.         status = uif_writeScalar( RegAddr, (unsigned long) (0x0000), (unsigned int) ACK_EXPECT);
  41.         RegAddr = UIF_CMD_OPERATION;
  42.         status = uif_writeScalar( RegAddr, OperationVal, (unsigned int) ACK_EXPECT);
  43. }
复制代码
测试结果图


实际的SD卡中的文件








分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条