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

📄 fileselect.c

📁 Actions ucOS-II mp3方案源码,可以做参考
💻 C
📖 第 1 页 / 共 2 页
字号:
char *FSel_ToNextExt(fselector_t *g_fselector_vars)
{
    return g_fselector_vars->fsel_Exts[++g_fselector_vars->fsel_ExtNo];
}

/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
                        GetPrevFile
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
int FSel_GetPrevFile(fselector_t *g_fselector_vars)
{
    if(g_fselector_vars->fsel_FileNo <= 1)
    {
        g_fselector_vars->fsel_FileNo = g_fselector_vars->fsel_TotalNo;
    }
    else
    {
        g_fselector_vars->fsel_FileNo --;
    }
    return FSel_GetFileByNo(g_fselector_vars);
}
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
                        GetFileByNo
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
int FSel_GetFileByNo(fselector_t *g_fselector_vars)
{
    int result;
    WORD fileNo = g_fselector_vars->fsel_FileNo;
    
    g_fselector_vars->fsel_FileNo = 0;
    g_fselector_vars->fsel_ExtNo = 0;
    __SetLocationC(g_fselector_vars);
    
    while(g_fselector_vars->fsel_FileNo < fileNo)
    {
        if( (result = FSel_GetNextFile(g_fselector_vars)) != MS_fsel_NoErr)
        {
            return result;
        }
    }
    return MS_fsel_NoErr;
}
int FSel_GetNFilesByNo(fselector_t *g_fselector_vars)
{
    int result;

    if(g_fselector_vars->fsel_FileNo>0)
        g_fselector_vars->fsel_FileNo --;
    if( (result = FSel_GetFileByNo(g_fselector_vars)) != MS_fsel_NoErr)
        return result;
        
    return FSel_GetNextNFiles( g_fselector_vars );
}
int FSel_GetFileFullNameByNo(fselector_t *g_fselector_vars)
{
    int result;
    //FS_u8 length = (FS_u8)g_fselector_vars->fsel_FileLongName[0];
    WORD fsel_FileNo_sav = g_fselector_vars->fsel_FileNo;
    
    g_fselector_vars->fsel_FileNo = g_fselector_vars->fsel_SeekFileNo;
    if( (result = FSel_GetFileByNo(g_fselector_vars)) != MS_fsel_NoErr)
        return result;
    strcpy(g_fselector_vars->fsel_FileLocationName , g_fselector_vars->fsel_CurDirName);
    strcat(g_fselector_vars->fsel_FileLocationName , g_fselector_vars->fsel_Dirent->d_name);
    
    strcpy(g_fselector_vars->fsel_FileLongName , g_fselector_vars->fsel_Dirent->d_name);
    
    //result = FS_ConvertName( g_fselector_vars->fsel_Dirent->d_name, length, g_fselector_vars->fsel_CurDir );
      //if(result >= 0)
    //    memcpy(g_fselector_vars->fsel_FileLongName , g_fselector_vars->fsel_Dirent->d_name , length<<1);

    g_fselector_vars->fsel_FileNo = fsel_FileNo_sav;
    
    return FSel_GetFileByNo(g_fselector_vars);
}
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
                        SetLocation
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
int FSel_SetLocation(fselector_t *g_fselector_vars)
{
    if(g_fselector_vars->fsel_Playlist_Dir_mode == FSEL_TYPE_COMMONDIR)  //common file system
        return __SetLocationC(g_fselector_vars);
    return FSel_PlayListEnt(g_fselector_vars);
}

int __SetLocationC(fselector_t *g_fselector_vars)
{
    if(g_fselector_vars->fsel_CurDir != 0)
        FS_CloseDir(g_fselector_vars->fsel_CurDir);
    
    g_fselector_vars->fsel_DirLayer = 0 ;
    memset(g_fselector_vars->fsel_DirNo , 0 ,sizeof(BYTE)*FSEL_TotalDirLayer);
    
    if((g_fselector_vars->fsel_CurDir = FS_OpenDir( g_fselector_vars->fsel_LocationDir )) == NULL)
    {
        g_fselector_vars->fsel_CurDir = FS_OpenDir( "\\" );
        return MS_fsel_LocationErr;
    }
    strcpy(g_fselector_vars->fsel_CurDirName,g_fselector_vars->fsel_LocationDir);
    return MS_fsel_NoErr;
}
int FSel_PlayListEnt(fselector_t *g_fselector_vars)
{
    return MS_fsel_UndefineErr;
}

/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
                        ToDirEntry
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
int FSel_ToNextDirEntry(fselector_t *g_fselector_vars)
{
    int result;
    
    if(g_fselector_vars->fsel_CurDir != 0)
        FS_CloseDir(g_fselector_vars->fsel_CurDir);
    
    if(g_fselector_vars->fsel_DirLayer == FSEL_TotalDirLayer-1 || (g_fselector_vars->fsel_DirLayer == 0 && g_fselector_vars->fsel_DirNo[0] == 0))
        g_fselector_vars->fsel_DirNo[g_fselector_vars->fsel_DirLayer]++;
    else
        g_fselector_vars->fsel_DirNo[++g_fselector_vars->fsel_DirLayer]++;

    while(1)
    {
        if( (result = FSel_ToDirEntry(g_fselector_vars)) != 0 )
        {
            if(result == MS_fsel_NoMoreDirErr)
            {
                if(g_fselector_vars->fsel_DirLayer>0)
                {
                    g_fselector_vars->fsel_DirNo[g_fselector_vars->fsel_DirLayer] = 0;
                    g_fselector_vars->fsel_DirNo[--g_fselector_vars->fsel_DirLayer]++;
                }
                else
                {
                    g_fselector_vars->fsel_DirNo[0]=0;
                    break;
                }
            }
            else
                return result;
        }
        else
            break;
    }
    if( (g_fselector_vars->fsel_CurDir = FS_OpenDir( g_fselector_vars->fsel_CurDirName )) == NULL )
        return MS_fsel_DirNotExistErr;
    if( g_fselector_vars->fsel_DirLayer == 0 && g_fselector_vars->fsel_DirNo[0] == 0 )
        return MS_fsel_RechRootEndErr;
    return MS_fsel_NoErr;
}

int FSel_ToPrevDirEntry(fselector_t *g_fselector_vars)
{
    int result;

    if(g_fselector_vars->fsel_CurDir != 0)
        FS_CloseDir(g_fselector_vars->fsel_CurDir);
        
    if(--g_fselector_vars->fsel_DirNo[g_fselector_vars->fsel_DirLayer] == 0)
    {
        g_fselector_vars->fsel_DirLayer--;
    }
    else
    {
        result = __GetCurDirMaxDepth(g_fselector_vars);
        if( result != MS_fsel_NoErr && result != MS_fsel_NoSubDirErr)
            return result;
    }
    if( (result = FSel_ToDirEntry(g_fselector_vars)) != 0 )
        return result;
        
    if( (g_fselector_vars->fsel_CurDir = FS_OpenDir( g_fselector_vars->fsel_CurDirName )) == NULL )
        return MS_fsel_DirNotExistErr;
    
    if(g_fselector_vars->fsel_DirLayer == 0xFF && g_fselector_vars->fsel_DirNo[0] == 0)
        return MS_fsel_RechRootHeadErr;
    return MS_fsel_NoErr;
}

int __GetCurDirMaxDepth(fselector_t *g_fselector_vars )
{
    int result;
    BYTE fsel_DirLayer_sav = g_fselector_vars->fsel_DirLayer;
    
    if(g_fselector_vars->fsel_DirLayer != FSEL_TotalDirLayer-1)
        g_fselector_vars->fsel_DirLayer ++;
    while(1)
    {
        g_fselector_vars->fsel_DirNo[g_fselector_vars->fsel_DirLayer]++;
        
        if( (result = FSel_ToDirEntry(g_fselector_vars)) != 0 )
        {
            if(result == MS_fsel_NoMoreDirErr)
            {
                if(--g_fselector_vars->fsel_DirNo[g_fselector_vars->fsel_DirLayer] == 0)
                {
                    if(--g_fselector_vars->fsel_DirLayer == fsel_DirLayer_sav);
                        return MS_fsel_NoSubDirErr;
                    break;
                }
                else
                {
                    g_fselector_vars->fsel_DirLayer ++;
                }
            }
            else
                return result;
        }
    }
    return MS_fsel_NoErr;
}


int FSel_ToDirEntry(fselector_t *g_fselector_vars)
{
    int i=0,j=0,result;
    
    strcpy(g_fselector_vars->fsel_CurDirName, g_fselector_vars->fsel_LocationDir);
    for( ; i<=g_fselector_vars->fsel_DirLayer && g_fselector_vars->fsel_DirNo[i]!=0 ; i++)
    {
        if( (result = __ToDirEntry(g_fselector_vars->fsel_DirNo[i] ,g_fselector_vars)) != MS_fsel_NoErr)
        {
                return result;
        }
    }
    return MS_fsel_NoErr;
}
int __ToDirEntry(int Num, fselector_t *g_fselector_vars)
{
    int i=0;
    FS_DIR *CurDir;
    struct FS_DIRENT *Dirent;
    char *nameptr;
    
    if( (CurDir = FS_OpenDir( g_fselector_vars->fsel_CurDirName )) == NULL)
        return MS_fsel_DirNotExistErr;
    while( i < Num )
    {
        if( (Dirent = FS_ReadDir( CurDir, "" )) == NULL )
        {
            FS_CloseDir(CurDir);
            return MS_fsel_NoMoreDirErr;
        }
        if(Dirent->d_name[0] != 0x2E)
            i++;
    }
    
    nameptr = g_fselector_vars->fsel_CurDirName;
    for(;*nameptr!=0;nameptr++);
    for(i = 0;Dirent->d_name[i] != 0x20; i++,nameptr++)
    {
        *nameptr = Dirent->d_name[i];
    }
    *(nameptr++) = '\\';
    *nameptr = 0;
    FS_CloseDir(CurDir);
    return MS_fsel_NoErr;
}

/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
                        Generation
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/

void FileSelectEngineCreate()
{
    if(FileSelectEngineDetect() == FALSE)
    {
        OSTaskCreate((void(*)(void *))(long)FileSelectEngine,    (void *)0x0000,  
                        (void *)FILESEL_ENGINE_SPACE, FILESEL_ENGINE_PRIO, FILESEL_ENGINE_ID);
        OSTimeDly(1);
    }
}

bool FileSelectEngineDetect()
{   
    OS_ENTER_CRITICAL();
    if(OSTCBPrioTbl[FILESEL_ENGINE_PRIO] != (OS_TCB *)0)
    {
        OS_EXIT_CRITICAL();
        return TRUE;
    }
    OS_EXIT_CRITICAL();
    return FALSE;
}  


void __FSel_Exceptions(fselector_t *g_fselector_vars,int errtype)
{
    msg_t msg_send;
    msg_send.type = MS_FSEL;
    msg_send.msg.data[0] = MS_FSELErr;
    msg_send.msg.data[1] = (BYTE)errtype;
    MYOSQPost(g_fselector_vars->FileSelect_Out,&msg_send);
}

void FSel_Exit(fselector_t *g_fselector_vars)
{
    INT8U err;
    if(g_fselector_vars->fsel_CurDir != 0)
        FS_CloseDir(g_fselector_vars->fsel_CurDir);
    FileSelect_In = MYOSQDel(FileSelect_In,OS_DEL_NO_PEND,&err);
}

void FSel_Init(msg_t *msg_list)
{
    if(FileSelect_In == 0)
    {
        FileSelect_In  = MYOSQCreate(msg_list,10); 
    } 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -