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

📄 fileselect.c

📁 Actions ucOS-II mp3方案源码,可以做参考
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************************
*                        SDK30F_D1
*                     music player main sub
*
*                (c) Copyright 2002, Actions Co,Ld.
*                        All Right Reserved
*
* File: FileSelect.c
* By  : wurui
* Version: 1> v1.00     first version     2005-11-23 9:30
*
*    $Id: FileSelect.c,v 1.7 2005/12/23 02:44:44 wurui Exp $
*******************************************************************************
*/
#include "FileSelect.h"   
 
OS_EVENT *FileSelect_In = 0;

bool FileSelectEngineDetect();
void FSel_Init(msg_t *msg_list);
void FSel_Exit(fselector_t *g_fselector_vars);

void FileSelectEngine();
int FSel_GetNextFile(fselector_t *g_fselector_vars);
void FSel_GetNextFile_Exceptions(fselector_t *g_fselector_vars);
int FSel_GetNextNFiles( fselector_t *g_fselector_vars );

int FSel_GetPrevFile(fselector_t *g_fselector_vars);
void FSel_GetPrevFile_Exceptions(fselector_t *g_fselector_vars);
int FSel_GetFileByNo(fselector_t *g_fselector_vars);
int FSel_GetNFilesByNo(fselector_t *g_fselector_vars);
int FSel_GetFileFullNameByNo(fselector_t *g_fselector_vars);

int FSel_ToNextDirEntry(fselector_t *g_fselector_vars);
int FSel_ToPrevDirEntry(fselector_t *g_fselector_vars);

int FSel_ToDirEntry(fselector_t *g_fselector_vars);
int __ToDirEntry(int Num, fselector_t *g_fselector_vars);

int FSel_Dir_GetNextFile(fselector_t *g_fselector_vars);
int FSel_PlayList_GetNextFile(fselector_t *g_fselector_vars);
int FSel_PlayListEnt(fselector_t *g_fselector_vars);
int FSel_SetLocation(fselector_t *g_fselector_vars);
int __SetLocationC(fselector_t *g_fselector_vars);
char *FSel_GetCurExt(fselector_t *g_fselector_vars);
char *FSel_ToNextExt(fselector_t *g_fselector_vars);
void FSel_SetLocation_Exceptions(fselector_t *g_fselector_vars);
void __FSel_Exceptions(fselector_t *g_fselector_vars,int errtype);
int __Dir_GetNextFile(fselector_t *g_fselector_vars);
bool __CheckFileType(fselector_t *g_fselector_vars);

int __GetCurDirMaxDepth(fselector_t *g_fselector_vars);


void FileSelectEngine()
{
    fselector_t *g_fselector_vars;
    msg_t   msg_list[10];
    msg_t msg;
    msg_t msg_send;
    int result;
    
    FSel_Init(msg_list);
    
    do
    {   
        MYOSQPend(FileSelect_In,&msg,0);

        g_fselector_vars = (fselector_t *)msg.msg.pointer;
        
        switch(msg.type)
        {
        case MSG_fsel_SetLocation:
            if((result = FSel_SetLocation(g_fselector_vars)) != 0)
            {
                __FSel_Exceptions(g_fselector_vars,result);
            }
            break;
        case MSG_fsel_GetNextFile:
            if((result = FSel_GetNextFile(g_fselector_vars)) != 0)
            {
                __FSel_Exceptions(g_fselector_vars,result);
                break;
            }
            strcpy(g_fselector_vars->fsel_FileLongName,g_fselector_vars->fsel_Dirent->d_name);
            msg_send.type = MS_FSEL;
            msg_send.msg.data[0] = MSG_fsel_GetNextFile;
            MYOSQPost(g_fselector_vars->FileSelect_Out,&msg_send);
            break;
        case MSG_fsel_GetPrevFile:
            if((result = FSel_GetPrevFile(g_fselector_vars)) != 0)
            {
                __FSel_Exceptions(g_fselector_vars,result);
                break;
            }
            msg_send.type = MS_FSEL;
            msg_send.msg.data[0] = MSG_fsel_GetPrevFile;
            MYOSQPost(g_fselector_vars->FileSelect_Out,&msg_send);
            break;
        case MSG_fsel_GetFileByNo:
            if( (result = FSel_GetFileByNo(g_fselector_vars)) != 0 )
            {
                __FSel_Exceptions(g_fselector_vars,result);
                break;
            }
            strcpy(g_fselector_vars->fsel_FileLongName, g_fselector_vars->fsel_Dirent->d_name);
            *g_fselector_vars->fileno = g_fselector_vars->fsel_FileNo;
            msg_send.type = MS_FSEL;
            msg_send.msg.data[0] = MSG_fsel_GetFileByNo;
            msg_send.msg.data[1] = g_fselector_vars->direction;
            MYOSQPost(g_fselector_vars->FileSelect_Out,&msg_send);
            break;
        case MSG_fsel_GetNFilesByNo:
            if( (result = FSel_GetNFilesByNo(g_fselector_vars)) != 0 )
            {
                __FSel_Exceptions(g_fselector_vars,result);
                break;
            }
            msg_send.type = MS_FSEL;
            msg_send.msg.data[0] = MSG_fsel_GetNFilesByNo;
            MYOSQPost(g_fselector_vars->FileSelect_Out,&msg_send);
            break;
        case MSG_fsel_GetFileFullNameByNo:
            if( (result = FSel_GetFileFullNameByNo(g_fselector_vars)) != 0 )
            {
                __FSel_Exceptions(g_fselector_vars,result);
                break;
            }
            msg_send.type = MS_FSEL;
            msg_send.msg.data[0] = MSG_fsel_GetFileFullNameByNo;
            MYOSQPost(g_fselector_vars->FileSelect_Out,&msg_send);
            break;
            
        case MSG_fsel_GetNextNFiles:
            if( (result = FSel_GetNextNFiles(g_fselector_vars)) != 0 )
            {
                __FSel_Exceptions(g_fselector_vars,result);
                break;
            }
            msg_send.type = MS_FSEL;
            msg_send.msg.data[0] = MSG_fsel_GetNextNFiles;
            MYOSQPost(g_fselector_vars->FileSelect_Out,&msg_send);
            break;
            
        case MSG_fsel_ToNextDir:
            if( (result = FSel_ToNextDirEntry(g_fselector_vars)) != 0 )
            {
                __FSel_Exceptions(g_fselector_vars,result);
                break;
            }
            msg_send.type = MS_FSEL;
            msg_send.msg.data[0] = MSG_fsel_ToNextDir;
            MYOSQPost(g_fselector_vars->FileSelect_Out,&msg_send);
            break;
        case MSG_fsel_ToPrevDir:
            if( (result = FSel_ToPrevDirEntry(g_fselector_vars)) != 0 )
            {
                __FSel_Exceptions(g_fselector_vars,result);
                break;
            }
            msg_send.type = MS_FSEL;
            msg_send.msg.data[0] = MSG_fsel_ToPrevDir;
            MYOSQPost(g_fselector_vars->FileSelect_Out,&msg_send);
            break;
/******************************************************************************
        case MSG_fsel_ReadNextDir:
            g_fselector_vars->fsel_Dirent = FS_ReadDir( g_fselector_vars->fsel_CurDir, "" );
            if(g_fselector_vars->fsel_Dirent == NULL)
            {
                msg_send.type = MS_FSEL;
                msg_send.msg.data[0] = MS_FSELErr;
                msg_send.msg.data[1] = MS_fsel_NoMoreDirErr;
                MYOSQPost(g_fselector_vars->FileSelect_Out,&msg_send);
                break;
            }
            msg_send.type = MS_FSEL;
            msg_send.msg.data[0] = MSG_fsel_ReadNextDir;
            MYOSQPost(g_fselector_vars->FileSelect_Out,&msg_send);
            break;

******************************************************************************/
        case MSG_fsel_Close:
            if(g_fselector_vars->fsel_CurDir != 0)
                FS_CloseDir(g_fselector_vars->fsel_CurDir);
            break;
        }  
    }while(msg.type != MS_END);
    
    FSel_Exit(g_fselector_vars);
    FileSelect_In = 0;
    
    for(;;)
    {
        output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
        OSTaskDel(OS_PRIO_SELF);
    }
}                                    

/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
                        GetNextFile
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
int FSel_GetNextNFiles( fselector_t *g_fselector_vars )
{
    int result,i;
    for( i = 0; g_fselector_vars->fsel_NFileNames[i] != NULL ; )
    {
        if( (result = FSel_GetNextFile(g_fselector_vars)) == MS_fsel_NoErr)
        {
            g_fselector_vars->fileno[i] = g_fselector_vars->fsel_FileNo;
            strcpy(g_fselector_vars->fsel_NFileNames[i++], g_fselector_vars->fsel_Dirent->d_name);
        }
        else if(result == MS_fsel_NoMoreFileErr)
        {
            g_fselector_vars->fsel_NFileNames[i] = NULL;
            break;
        }
        else
            return result;
    }
    return MS_fsel_NoErr;
}
int FSel_GetNextFile(fselector_t *g_fselector_vars)
{
    int result;
    if(g_fselector_vars->fsel_Playlist_Dir_mode == FSEL_TYPE_COMMONDIR)
    {
        if( (result = FSel_Dir_GetNextFile(g_fselector_vars)) != MS_fsel_NoErr)
        {
            return result;
        }
    }
    else if(g_fselector_vars->fsel_Playlist_Dir_mode == FSEL_TYPE_PLAYLIST)
    {
        return FSel_PlayList_GetNextFile(g_fselector_vars);
    }
    else
        return MS_fsel_UndefineErr;
    return MS_fsel_NoErr;
}

int FSel_Dir_GetNextFile(fselector_t *g_fselector_vars)
{
    char *Ext;
    int result;
    
    while(1)
    {
        if( __Dir_GetNextFile(g_fselector_vars) == MS_fsel_FileSearchEnd)
        {
            if((result = FSel_ToNextDirEntry(g_fselector_vars)) != MS_fsel_NoErr)
            {
                if( result == MS_fsel_RechRootEndErr )
                {
                    if(g_fselector_vars->fsel_FileNo == 0)
                        return MS_fsel_NoFileErr;
                    return MS_fsel_NoMoreFileErr;
                }
                return result;
            }
        }
        else
        {
            break;
        }
    }
    return MS_fsel_NoErr;
}
int __Dir_GetNextFile(fselector_t *g_fselector_vars)
{
    int result;
    char threeblank[4];
    
    threeblank[0] = ' ';
    threeblank[1] = ' ';
    threeblank[2] = ' ';
    threeblank[3] = 0;
    
    while(1)
    {
        g_fselector_vars->fsel_Dirent = FS_ReadDir( g_fselector_vars->fsel_CurDir, threeblank );
        if(g_fselector_vars->fsel_Dirent != NULL)
        {
            if( __CheckFileType(g_fselector_vars) )
            {
                g_fselector_vars->fsel_FileNo ++;
                break;
            }
        }
        else
            return MS_fsel_FileSearchEnd;
    }
    return MS_fsel_NoErr;
}
bool __CheckFileType(fselector_t *g_fselector_vars)
{
    int i;
    for(i=0; g_fselector_vars->fsel_Exts[i] != NULL; i++)
    {
        if( memcmp(g_fselector_vars->fsel_Dirent->d_name + 9, g_fselector_vars->fsel_Exts[i], 3) == 0)
            return TRUE;
    }
    return FALSE;
}
int FSel_PlayList_GetNextFile(fselector_t *g_fselector_vars)
{
    return MS_fsel_UndefineErr;
}
char *FSel_GetCurExt(fselector_t *g_fselector_vars)
{
    return g_fselector_vars->fsel_Exts[g_fselector_vars->fsel_ExtNo];
}

⌨️ 快捷键说明

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