/*********************************************************************
*
*       _FillNode
*
* Function description
*   Recursive filling of node
*
* Parameters:
*   hTree     - obvious
*   NumNodes  - Number of child nodes to be created at each node
*   NumLeaves - Number of leaves to be created at each node
*   MaxDepth  - Maximum depth (1.1.1.1.1.....)
*   CurDepth  - Current depth
*   acBuffer  - String to be used for TREEVIEW items
*   p         - Pointer into to string to be used for numbering
*
* Return value:
*  0 on success, 1 on error
*/
static int _FillNode(WM_HWIN hTree, TREEVIEW_ITEM_Handle hNode, int NumNodes, int NumLeaves, int MaxDepth, int CurDepth, char * acBuffer, char * p) {
  TREEVIEW_ITEM_Handle hItem;
  int                  i;
  int                  Position;

  hItem    = 0;
  *(p + 1) = 0;
  *p       = '0' - 1;
  if (--CurDepth) {
    //
    // Create nodes
    //
    for (i = 0; i < NumNodes; i++) {
      (*p)++;
      Position = hItem ? TREEVIEW_INSERT_BELOW : TREEVIEW_INSERT_FIRST_CHILD;
      hItem    = TREEVIEW_ITEM_Create(1, acBuffer, 0);
      if (hItem == 0) {
        return 1; // Error
      }
      _NumNodes++;
      TREEVIEW_AttachItem(hTree, hItem, hNode, Position);
      hNode    = hItem;
      *(p + 1) = '.';
      p += 2;
      //
      // Recursive call of 'this' function for each node
      //
      _FillNode(hTree, hNode, NumNodes, NumLeaves, MaxDepth, CurDepth, acBuffer, p);
      p -= 2;
      *(p + 1) = 0;
    }
  }
  //
  // Create leaves
  //
  for (i = 0; i < NumLeaves; i++) {
    (*p)++;
    Position = hItem ? TREEVIEW_INSERT_BELOW : TREEVIEW_INSERT_FIRST_CHILD;
    hItem = TREEVIEW_ITEM_Create(0, acBuffer, 0);
    if (hItem == 0) {
      return 1; // Error
    }
    _NumLeaves++;
    TREEVIEW_AttachItem(hTree, hItem, hNode, Position);
    hNode = hItem;
  }
  return 0;
}
/*********************************************************************
*
*       _FillNode
*
* Purpose:
*   Recursive filling of node
*
* Parameters:
*   hTree     - obvious
*   NumNodes  - Number of child nodes to be created at each node
*   NumLeaves - Number of leaves to be created at each node
*   MaxDepth  - Maximum depth (1.1.1.1.1.....)
*   CurDepth  - Current depth
*   acBuffer  - String to be used for TREEVIEW items
*   p         - Pointer into to string to be used for numbering
*
* Return value:
*  0 on success, 1 on error
*/
static int _FillNode(WM_HWIN hTree, TREEVIEW_ITEM_Handle hNode, int NumChildNodes, int NumChildItems, int MaxDepth, int Depth, char * p) {
  static char acBuffer[(TREEVIEW_DEPTH << 1) + 1];
  TREEVIEW_ITEM_Handle hItem = 0;
  int i, j, Position;

  if (p == NULL) {
    p = acBuffer;
  }
  *(p + 1) = 0;
  *p = '0' - 1;
  if (--Depth) {
    //
    // Create nodes
    //
    for (i = 0; i < NumChildNodes; i++) {
      (*p)++;
      Position = hItem ? TREEVIEW_INSERT_BELOW : TREEVIEW_INSERT_FIRST_CHILD;
      hItem = TREEVIEW_ITEM_Create(1, acBuffer, 0);
      if (hItem == 0) {
        return 1; // Error
      }
      TREEVIEW_AttachItem(hTree, hItem, hNode, Position);
      hNode = hItem;
      *(p + 1) = '.';
      p += 2;
      _FillNode(hTree, hNode, NumChildNodes, NumChildItems, MaxDepth, Depth, p);
      p -= 2;
      *(p + 1) = 0;
    }
  }
  //
  // Create leaves
  //
  for (j = 0; j < NumChildItems; j++) {
    (*p)++;
    Position = hItem ? TREEVIEW_INSERT_BELOW : TREEVIEW_INSERT_FIRST_CHILD;
    hItem = TREEVIEW_ITEM_Create(0, acBuffer, 0);
    if (hItem == 0) {
      return 1; // Error
    }
    TREEVIEW_AttachItem(hTree, hItem, hNode, Position);
    hNode = hItem;
  }
  return 0;
}
/**
  * @brief  scan_files 递归扫描sd卡内的文件
  * @param  path:初始扫描路径 file_name:指向用来存储文件名的一段空间 hFile:用于记录文件路径的文件指针 hTree 目录树 hNode 目录结点
	*					hTree == NULL &&	hNode == NULL 的话,不创建目录树			
  * @retval result:文件系统的返回值
  */
static FRESULT scan_files (char* path,char* file_name,FIL *hFile,WM_HWIN hTree, TREEVIEW_ITEM_Handle hNode,int *fileNum) 
{ 
		
	FRESULT res; 		          //部分在递归过程被修改的变量,不用全局变量	
	FILINFO fno; 
	static uint32_t rw_num = 0;			//已读或已写的字节数
	//char showname[60]={0};
	DIR dir; 
	int i; 
	char *fn; 	
	TREEVIEW_ITEM_Handle hItem=0;

	
#if _USE_LFN 
	static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1]; 	//长文件名支持
	fno.lfname = lfn; 
	fno.lfsize = sizeof(lfn); 
#endif 

	res = f_opendir(&dir, path);                            //打开目录
	if (res == FR_OK) 
	{ 
		i = strlen(path); 
		for (;;) 
		{ 
			res = f_readdir(&dir, &fno); 										//读取目录下的内容
			if (res != FR_OK || fno.fname[0] == 0) break; 	//为空时表示所有项目读取完毕,跳出
#if _USE_LFN 
			fn = *fno.lfname ? fno.lfname : fno.fname; 
#else 
			fn = fno.fname; 
#endif 
			if (*fn == '.') continue; 											//点表示当前目录,跳过			
			if (fno.fattrib & AM_DIR) 
			{ 																							//目录,递归读取
							
				if(hTree != NULL &&	hNode != NULL)
				{
					//hItem = TREEVIEW_ITEM_Create(TREEVIEW_ITEM_TYPE_NODE,showname,0);
					hItem = TREEVIEW_ITEM_Create(TREEVIEW_ITEM_TYPE_NODE,fn,0);						//目录,创建结点
					TREEVIEW_AttachItem(hTree,hItem,hNode,TREEVIEW_INSERT_FIRST_CHILD);		//把结点加入到目录树中
				}
								
				sprintf(&path[i], "/%s", fn); 							//合成完整目录名
				res = scan_files(path,file_name,hFile,hTree,hItem,fileNum);		//递归遍历 
				if (res != FR_OK) 
					break; 																		//打开失败,跳出循环
				path[i] = 0; 
			} 
			else 																														//是文件
			{ 				
				/* 根据要求是否创建目录树 */
				if(hTree != NULL &&	hNode != NULL)																			//创建目录树
				{
					//hItem = TREEVIEW_ITEM_Create(TREEVIEW_ITEM_TYPE_LEAF,showname,0);
					hItem = TREEVIEW_ITEM_Create(TREEVIEW_ITEM_TYPE_LEAF,fn,0);						//文件,创建树叶
					TREEVIEW_AttachItem(hTree,hItem,hNode,TREEVIEW_INSERT_FIRST_CHILD);		//把树叶添加到目录树
			
				
					if (strlen(path)+strlen(fn)<BROWSER_FILE_NAME_LEN)
					{
						sprintf(file_name, "%s/%s", path,fn); 	
						
						//存储文件名到filelist(含路径)										
						res = f_lseek (hFile, hItem*BROWSER_FILE_NAME_LEN);  
						res = f_write (hFile, file_name, BROWSER_FILE_NAME_LEN, &rw_num);	
						//printf("\nfileItem=%ld:%s",hItem,file_name);
					}			
				}
		   }//else
		} //for
	} 
	return res; 
    
}