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

📄 user.c

📁 Actions ucOS-II mp3方案源码,可以做参考
💻 C
📖 第 1 页 / 共 2 页
字号:
            }
            user->info.resetFlag = 1;
            user->info.length = lng;
            user->info.err = 0;
            api_putUserToWaitingQueue(user);
            result = api_files_seek(&user->files, SEEK_SET, lng);
        }
    }
    return result;
}


/*
Description : 写FIFO文件
Arguments   : handle:用户控制块号,open返回时的标号。
              buffer:数据区
              length:读数据的长度。
Returns     : 返回读数据的长度,正数:写入的Bypes数,负数:错误号。
Notes       : 
*/
int api_WriteFile(int UHandle, char *buffer, int length)
{
    user_head_t *user;
    int result;
    long space;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle -1];
    
    OS_ENTER_CRITICAL();
    if((int)buffer < 0x3fff)
    {
        memcpyDMA(buff, buffer, length-1);
        result = api_files_write(&user->files, buff, length);
    }else {
        result = api_files_write(&user->files, buffer, length);
    }
    
    if(result > 0)
    {
        space = api_fifo_testSpace(&user->files.fifo, 1,0);
        if( (space >= user->files.fifo.length - FIFO_RWPTR_SPACE) && (0 == user->info.appendFlag) )
        {
            user->info.appendFlag = 1;
            api_putUserToFifoQueue(user);
        }
    }else if(0 > result) {
        // 没有空间.
        if( ! user->info.appendFlag)
        {
            user->info.appendFlag = 1;
        }
        OS_EXIT_CRITICAL();
        api_putUserToWaitingQueue(user);
        OS_ENTER_CRITICAL();
        if((int)buffer < 0x3fff)
        {
            memcpyDMA(buff, buffer, length-1);
            result = api_files_write(&user->files, buff, length);
        }else {
            result = api_files_write(&user->files, buffer, length);
        }
    }
    user->files.offsetFileEnd += length;
    OS_EXIT_CRITICAL();
    return result;
}


/*
Description : 手动更新FIFO文件内容。
Arguments   : handle:用户控制块号,open返回时的标号。
Returns     : 正确返回: 1,负数:错误号。
Notes       : 
*/
int api_UpdateFifo(int UHandle)
{
    user_head_t *user;
    int result;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle -1];
    
    if( ! user->info.appendFlag)
    {
        user->info.appendFlag = 1;
    }
    api_putUserToWaitingQueue(user);
    
    return 1;
}


/*
Description : 获取当前文件选择的全路径
Arguments   : buffer: 路径结构指针。
Returns     : 正确返回: 1,负数:错误号。
Notes       : 
*/
int api_GetFullPath(int UHandle, int param)
{
    user_head_t *user;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    // 文件选择模块未初始化。
    if(0 == user->sel)
        return FIFO_SEL_ERR;
        
    return api_sel_SetFullPath(user->sel, param);
}


/*
Description : 设置当前文件选择的全路径
Arguments   : buffer: 路径结构指针。
Returns     : 正确返回: 1,负数:错误号。
Notes       : 一旦路径改变,FIFO缓冲区无效。
*/
int api_SetFullPath(int UHandle, int param)
{
    user_head_t *user;
    int fileNo;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    // 文件选择模块未初始化。
    if(0 == user->sel)
        return FIFO_SEL_ERR;
    
    fileNo = api_sel_SetFullPath(user->sel, param); 
    if(0 > fileNo)
        return fileNo;  // 路径错误.
    
    // 重新缓冲文件.
    api_files_reset(&user->files);    
    user->info.appendFlag = 0x04;
    user->info.resetFlag = 1;
    user->info.nextFileNo = api_sel_CurFileNo(user->sel);
    user->info.length = 0;
    user->info.err = 0;
    api_putUserToFifoQueue(user);
    
    return 1;
}


/*
Description : 设置当前文件选择的模式
Arguments   : mode: bit7,不需要文件选择器;bit6,不需要FIFO;其它的认为需要FIFO且表明文件选择的类型。
              param:  这是文件选择时附加的参数,由用户和文件选择器设计者协商。
Returns     : 正确返回: 1,负数:错误号。
Notes       : 一旦模式改变,FIFO缓冲区无效。
*/
int api_SetSelMode(int UHandle, unsigned char mode, int param)
{
    user_head_t *user;
    int result;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    
    if( !(mode & 0x80) && user->rflag )
    {   // 需要文件选择模块
        if(user->sel)
        {   // 已经打开过文件选择模块.
            result = api_sel_SetMode(user->sel, mode , param);
            if(0 > result)
            {
                api_sel_close(user->sel);
                user->sel = 0;
                return result;
            }
        }else { // 还没有打开文件选择模块.
            result = api_sel_open(mode, param);
            if(0 >= result)
            {
                return result;
            }
            user->sel = result;
        }
            
        // 重新缓冲文件.
        api_files_reset(&user->files);
        user->info.appendFlag = 0x04;
        user->info.resetFlag = 1;
        user->info.nextFileNo = 1;
        user->info.length = 0;
        user->info.err = 0;
        api_putUserToFifoQueue(user);
        
    }else {
        if(user->sel)
        {
            api_sel_close(user->sel);
        }
        user->sel = 0;
    }  
    
    api_putUserToWaitingQueue(user); 
    return 1;
}


/*
Description : 设置当前文件选择的模式
Arguments   : addr:FIFO 起始地址,length:FIFO的长度。
Returns     : 正确返回: 1,负数:错误号。
Notes       : 一旦模式改变,FIFO缓冲区无效。
*/
//int api_SetFIFO(int handle, long addr, long length);


/*
Description : 获取当前文件选择模式的文件全名
Arguments   : buffer: 文件长名。
              num:文件号.
Returns     : 正确返回: 序号,负数:错误号。
Notes       : 
*/
int api_GetFileNameByNo(int UHandle, char *buffer, int num)
{
    user_head_t *user;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    // 文件选择模块未初始化。
    if(0 == user->sel)
        return FIFO_SEL_ERR;
        
    return api_sel_GetFileNameByNo(user->sel, buffer, num);
}

/*
Description : 获取指定文件选序号的下一个文件全名,并且返回文件序号.
Arguments   : buffer: 文件长名。
              num:文件号.
Returns     : 正确返回: 序号,0:没有下一个文件; 负数:错误号。
Notes       : 
*/
int api_GetNextFileNameByNo(int UHandle, char *buffer, int fielNo)
{
    user_head_t *user;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    // 文件选择模块未初始化。
    if(0 == user->sel)
        return FIFO_SEL_ERR;
        
    return api_sel_GetNextFileNameByNo(user->sel, buffer, fielNo);
}

/*
Description : 获取当前文件选择模式的文件序号.
Arguments   : handle:用户控制块号,open返回时的标号。
Returns     : 正确返回: 序号,负数:错误号。
Notes       : 
*/
int api_GetCurFileNo(int UHandle)
{
    user_head_t *user;
    
    if(UHandle < 0 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    return api_files_getCurFileNo(&user->files);
        
}

/*
Description : 获取指定文件序号的下一个文件的序号.
Arguments   : handle:用户控制块号,open返回时的标号。
              fileNo:当前文件序号.
Returns     : 正确返回: 序号,0:没有下一个文件; 负数:错误号。
Notes       : 
*/
int api_GetNextFileNo(int UHandle, int fileNo)
{
    user_head_t *user;
    
    if(UHandle < 0 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    return api_fsel_getNextFileNo(user->sel, fileNo);
        
}

/*
Description : 获取当前文件选择模式的文件总数.
Arguments   : handle:用户控制块号,open返回时的标号。
Returns     : 正确返回: 序号,负数:错误号。
Notes       : 
*/
int api_GetTotalFileNum(int UHandle)
{
    user_head_t *user;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    // 文件选择模块未初始化。
    if(0 == user->sel)
        return FIFO_SEL_ERR;
        
    return api_sel_TotalFileNum(user->sel);
}


/*
Description : 获取当前文件选择模式的文件类型总数.
Arguments   : handle:用户控制块号,open返回时的标号。
Returns     : 正确返回: 序号,负数:错误号。
Notes       : 
*/
int api_GetTotalTypeNum(int UHandle)
{
    user_head_t *user;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    // 文件选择模块未初始化。
    if(0 == user->sel)
        return FIFO_SEL_ERR;
        
    return api_sel_TotalTypeNum(user->sel);
}


/*
Description : 获取当前文件选择模式的文件类型序号.
Arguments   : handle:用户控制块号,open返回时的标号。
Returns     : 正确返回: 序号,负数:错误号。
Notes       : 
*/
int api_GetCurTypeNo(int UHandle)
{
    user_head_t *user;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    // 文件选择模块未初始化。
    if(0 == user->sel)
        return FIFO_SEL_ERR;
    return api_sel_CurTypeNo(user->sel);
}


/*
Description : 获取当前文件选择模式下的文件类型全名
Arguments   : buffer: 文件类型长名。(可以是目录名,根据不同模式有不同含义)。
              num:文件号.
Returns     : 正确返回: 序号,负数:错误号。
Notes       : 
*/
int api_GetTypeNameByNo(int UHandle, char *buffer, int num)
{
    user_head_t *user;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    // 文件选择模块未初始化。
    if(0 == user->sel)
        return FIFO_SEL_ERR;
    return api_sel_GetTypeNameByNo(user->sel, buffer, num);
}


/*
Description : 获取指定文件序号文件的附加信息.
Arguments   : handle:用户控制块号,open返回时的标号。
              fileNo:文件序号,
              param:参数指针.
Returns     : 正确返回: 序号,负数:错误号。
Notes       : 
*/
int api_GetFileInfoByFileNo(int UHandle, int fileNo, int param)
{
    user_head_t *user;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    // 文件选择模块未初始化。
    if(0 == user->sel)
        return FIFO_SEL_ERR;
    return api_sel_GetFileInfoByFileNo(user->sel, fileNo, param);
}     

long api_GetFileTell(int UHandle)
{
    user_head_t *user;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    return api_files_getCurFileTell(&user->files);
}

long api_GetFileLength(int UHandle)
{
    user_head_t *user;
    
    if(UHandle < 1 && UHandle > MAX_FIFO)
        return FIFO_USER_ERR;
    user = &userfifo[UHandle - 1];
    
    return api_files_getCurFileLength(&user->files);
} 

⌨️ 快捷键说明

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