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

📄 dvb_job.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
字号:

/******************************************************************************
	(C)Copyright CHEERTEK Inc. 2007, K000 all rights reserved.

	Product	: CT216 Firmware
	Date	: 2007.09.12
	Purpose	: Provide dvb job api
******************************************************************************/

#include <stdio.h>
#include <string.h>

#include "ct_type.h"
#include "ct_os.h"
#include "dvb_job.h"
#include "dvb_sys.h"
#include "task_cfg.h"

/*******************************************************************************************/
//#define DVB_JOB_DEBUG
/*******************************************************************************************/
#define JOB_MSG(p) printf p

#ifdef DVB_JOB_DEBUG
#define JOB_DBG(p) printf p
#else //DVB_JOB_DEBUG
#define JOB_DBG(p) 
#endif //DVB_JOB_DEBUG
/*******************************************************************************************/
typedef struct _ST_DVB_JOB_HANDLE_T
{	
	DVB_JOB_FN  fpJobFunPtr;
	u32         u32Param0;
	u32         u32Param1;
	u32         u32Param2;
	u32         u32Param3;
	u32         u32Param4;
	u32         u32Param5;
}ST_DVB_JOB_HANDLE_T;
/*******************************************************************************************/
static bool8            b8DvbJobInit                = FALSE;
static bool8            b8DvbJobAccessSemaphoreInit = FALSE;
static bool8            b8DvbJobNotifySemaphoreInit = FALSE;
static bool8            b8DvbJobTaskInit            = FALSE;
static u32              u32DvbJobReadSlot           = 0;
static u32              u32DvbJobWriteSlot          = 0;
u8                      au8DvbJobTaskStack[DVB_JOB_TASK_STACK_SIZE];
ST_DVB_JOB_HANDLE_T     astDvbJobHandle[DVB_JOB_MAX_JOB_NUM];
CTOS_SEMAPHORE          stDvbJobAccessSemaphore;
CTOS_SEMAPHORE          stDvbJobNotifySemaphore;
CTOS_TASK	            stDvbJobTask;
/*******************************************************************************************/
void DVB_JOB_Task (u32 argc, void *argv)
{
    u32     u32HandleSlot   = 0;
    u32     u32Count        = 0;
    while(1)
    {
        if (CT_OS_WaitOnSemaphore(&stDvbJobNotifySemaphore, CTOS_WAIT) == EN_CTOS_SUCCESS)
        {                
            if (u32DvbJobReadSlot==u32DvbJobWriteSlot)
            {                
                // No Job
                continue;
            }
            
            if (u32DvbJobReadSlot>u32DvbJobWriteSlot)
            {
                // must u32DvbJobReadSlot <= u32DvbJobWriteSlot , 
                // this status is Fail,  reset all job
                CT_OS_WaitOnSemaphore(&stDvbJobAccessSemaphore, CTOS_WAIT);
                for (u32Count=0; u32Count< (u32)DVB_JOB_MAX_JOB_NUM; u32Count++)
                {
                    astDvbJobHandle[u32Count].fpJobFunPtr   = NULL;
                    astDvbJobHandle[u32Count].u32Param0     = 0;
                    astDvbJobHandle[u32Count].u32Param1     = 0;
                    astDvbJobHandle[u32Count].u32Param2     = 0;
                    astDvbJobHandle[u32Count].u32Param3     = 0;
                    astDvbJobHandle[u32Count].u32Param4     = 0;
                    astDvbJobHandle[u32Count].u32Param5     = 0;
                }
                u32DvbJobReadSlot   = 0;
                u32DvbJobWriteSlot  = 0;
                CT_OS_FreeSemaphore(&stDvbJobAccessSemaphore);    
                continue;
            }
            
            u32HandleSlot = u32DvbJobReadSlot%((u32)DVB_JOB_MAX_JOB_NUM);    
            if (astDvbJobHandle[u32HandleSlot].fpJobFunPtr != NULL)
            {
                astDvbJobHandle[u32HandleSlot].fpJobFunPtr( astDvbJobHandle[u32HandleSlot].u32Param0,
                                                            astDvbJobHandle[u32HandleSlot].u32Param1,
                                                            astDvbJobHandle[u32HandleSlot].u32Param2,
                                                            astDvbJobHandle[u32HandleSlot].u32Param3,
                                                            astDvbJobHandle[u32HandleSlot].u32Param4,
                                                            astDvbJobHandle[u32HandleSlot].u32Param5);
            }
            
            CT_OS_WaitOnSemaphore(&stDvbJobAccessSemaphore, CTOS_WAIT);
            astDvbJobHandle[u32HandleSlot].fpJobFunPtr   = NULL;
            astDvbJobHandle[u32HandleSlot].u32Param0     = 0;
            astDvbJobHandle[u32HandleSlot].u32Param1     = 0;
            astDvbJobHandle[u32HandleSlot].u32Param2     = 0;
            astDvbJobHandle[u32HandleSlot].u32Param3     = 0;
            astDvbJobHandle[u32HandleSlot].u32Param4     = 0;
            astDvbJobHandle[u32HandleSlot].u32Param5     = 0;
            u32DvbJobReadSlot++;            
            if (u32DvbJobReadSlot==u32DvbJobWriteSlot)
            {
                u32DvbJobReadSlot   = 0;
                u32DvbJobWriteSlot  = 0;
            }            
            CT_OS_FreeSemaphore(&stDvbJobAccessSemaphore);            
            //JOB_MSG(("J"));       
             
        }
    }
}
/*******************************************************************************************/
bool8 DVB_JOB_Init(void)
{
    EN_CTOS_STATUS  enStatus    = EN_CTOS_SUCCESS;
    u32             u32Count    = 0;
    
    if (b8DvbJobInit==FALSE)
    {
        if (b8DvbJobAccessSemaphoreInit==FALSE)
        {
            enStatus = CT_OS_CreateSemaphore (&stDvbJobAccessSemaphore, "DVBJOBA", 1, EN_CTOS_SUSPEND_FIFO);
        	if (enStatus != EN_CTOS_SUCCESS)
        	{
        		JOB_MSG(("Job Init Access Semaphore Fail [%ld]\n", (u32)enStatus));
        		return FALSE;
        	}
        	b8DvbJobAccessSemaphoreInit = TRUE;
        }
        
        if (b8DvbJobNotifySemaphoreInit==FALSE)
        {
            enStatus = CT_OS_CreateSemaphore (&stDvbJobNotifySemaphore, "DVBJOBN", 0, EN_CTOS_SUSPEND_FIFO);
        	if (enStatus != EN_CTOS_SUCCESS)
        	{
        		JOB_MSG(("Job Init Notify Semaphore Fail [%ld]\n", (u32)enStatus));
        		return FALSE;
        	}
        	b8DvbJobNotifySemaphoreInit = TRUE;
        }        
        
        
        if (b8DvbJobTaskInit==FALSE)
        {
            enStatus = CT_OS_CreateTask(&stDvbJobTask,
								        "DVBJOB",
								        DVB_JOB_Task,
								        &au8DvbJobTaskStack[0],
								        DVB_JOB_TASK_STACK_SIZE,
								        DVB_JOB_TASK_PRIORITY,
								        DVB_JOB_TASK_TIME_SLICE);

        	if (enStatus != EN_CTOS_SUCCESS)
        	{
        		JOB_MSG(("Job Create Task Fail [%ld]\n", (u32)enStatus));
        		return FALSE;
        	}
            
            
            b8DvbJobTaskInit = TRUE;
        }
        
        if (CT_OS_ResumeTask (&stDvbJobTask) != EN_CTOS_SUCCESS)
    	{
    		return FALSE;
    	}
        
        CT_OS_WaitOnSemaphore(&stDvbJobAccessSemaphore, CTOS_WAIT);
        for (u32Count=0; u32Count< (u32)DVB_JOB_MAX_JOB_NUM; u32Count++)
        {
            astDvbJobHandle[u32Count].fpJobFunPtr   = NULL;
            astDvbJobHandle[u32Count].u32Param0     = 0;
            astDvbJobHandle[u32Count].u32Param1     = 0;
            astDvbJobHandle[u32Count].u32Param2     = 0;
            astDvbJobHandle[u32Count].u32Param3     = 0;
            astDvbJobHandle[u32Count].u32Param4     = 0;
            astDvbJobHandle[u32Count].u32Param5     = 0;
        }
        u32DvbJobReadSlot   = 0;
        u32DvbJobWriteSlot  = 0;
        CT_OS_FreeSemaphore(&stDvbJobAccessSemaphore);
        
        b8DvbJobInit = TRUE;
    }
    return TRUE;
}
/*******************************************************************************************/
bool8 DVB_JOB_Add(DVB_JOB_FN fpJobFunPtr, u32* pu32JobID, u32 u32Param0, u32 u32Param1, u32 u32Param2, u32 u32Param3, u32 u32Param4, u32 u32Param5) 
{
    u32 u32HandleSlot = 0;
    if ((fpJobFunPtr==NULL)||
        (pu32JobID==NULL))
    {
        JOB_MSG(("\n>> DVB_JOB_Add() Fail, Job Function Pointer is NULL\n"));
        return FALSE;
    }
    
    if ((u32DvbJobWriteSlot-u32DvbJobReadSlot)>=(u32)DVB_JOB_MAX_JOB_NUM)
    {
        JOB_MSG(("\n>> DVB_JOB_Add() Fail, Job Queue Full\n"));
        return FALSE;
    }
    CT_OS_WaitOnSemaphore(&stDvbJobAccessSemaphore, CTOS_WAIT);    
    *pu32JobID = u32DvbJobWriteSlot;
    u32HandleSlot = u32DvbJobWriteSlot%((u32)DVB_JOB_MAX_JOB_NUM);    
    astDvbJobHandle[u32HandleSlot].fpJobFunPtr   = fpJobFunPtr;
    astDvbJobHandle[u32HandleSlot].u32Param0     = u32Param0;
    astDvbJobHandle[u32HandleSlot].u32Param1     = u32Param1;
    astDvbJobHandle[u32HandleSlot].u32Param2     = u32Param2;
    astDvbJobHandle[u32HandleSlot].u32Param3     = u32Param3;
    astDvbJobHandle[u32HandleSlot].u32Param4     = u32Param4;
    astDvbJobHandle[u32HandleSlot].u32Param5     = u32Param5;
    u32DvbJobWriteSlot++;    
    CT_OS_FreeSemaphore(&stDvbJobAccessSemaphore);
        
    CT_OS_FreeSemaphore(&stDvbJobNotifySemaphore);
    
    return TRUE;
}
/*******************************************************************************************/
bool8 DVB_JOB_CheckExist(u32 u32JobID) 
{
    u32 u32HandleSlot = 0;
    
    u32HandleSlot = u32JobID%((u32)DVB_JOB_MAX_JOB_NUM); 
    
    if (astDvbJobHandle[u32HandleSlot].fpJobFunPtr==NULL)
    {
        return FALSE;
    }
    return TRUE;
}
/*******************************************************************************************/
#ifdef DVB_JOB_DEBUG
void JOB_TestProcess(u32 u32Param0, u32 u32Param1, u32 u32Param2, u32 u32Param3, u32 u32Param4, u32 u32Param5)    
{
    u32 u32Count = 0;
    
    for (u32Count=0;  u32Count<10; u32Count++)
    {
        JOB_DBG(("\n>> JOB_TestProcess[%02ld:%02ld] : %ld\n", u32Param0, u32Param1, u32Count));
        CT_OS_MS_Delay(1000);
    }  
}
#endif //DVB_JOB_DEBUG
/*******************************************************************************************/
#ifdef DVB_JOB_DEBUG
void DVB_JOB_Test(u32 u32Mode, u32 u32Param1, u32 u32Param2)
{
    u32 u32Count = 0;
    u32 u32JobID = 0;
    JOB_DBG(("\n>> DVB_JOB Test Mode = %ld", u32Mode));
    switch(u32Mode)
    {
        default:
        case 0:
            break;
        case 1:
            if (DVB_JOB_Init()!=TRUE)
            {
                JOB_DBG(("\n>> DVB_JOB_Init() Fail\n"));
            }
            else
            {
                JOB_DBG(("\n>> DVB_JOB_Init() Success\n"));
            }
            break;            
        case 2:
            JOB_DBG(("\n>> u32DvbJobWriteSlot = %ld", u32DvbJobWriteSlot));
            JOB_DBG(("\n>> u32DvbJobReadSlot  = %ld\n", u32DvbJobReadSlot));
            break;
        case 3:
           if (DVB_JOB_Add( (DVB_JOB_FN)JOB_TestProcess,
                            &u32JobID,
                            u32Param1,
                            u32Param2,
                            0,
                            0,
                            0,
                            0)!=TRUE)
            {
                JOB_DBG(("\n>> DVB_JOB_Add() Fail\n"));
            }
            else
            {
                JOB_DBG(("\n>> DVB_JOB_Add() Success, u32JobID = 0x%08lX\n", u32JobID));
                while(1)
                {
                    if (DVB_JOB_CheckExist(u32JobID)==FALSE)
                    {
                        JOB_DBG(("\n>> JOB_TestProcess , Process Finish\n"));
                        break;
                    }
                    JOB_DBG(("\n>> JOB_TestProcess, Wait ...\n"));
                    CT_OS_MS_Delay(500);
                }
            }
            break;  
        case 4:
            for (u32Count=0; u32Count< (u32)DVB_JOB_MAX_JOB_NUM; u32Count++)            
            {
                if (DVB_JOB_Add( (DVB_JOB_FN)JOB_TestProcess,
                                &u32JobID,
                                u32Count,
                                u32Param2,
                                0,
                                0,
                                0,
                                0)!=TRUE)
                {
                    JOB_DBG(("\n>> DVB_JOB_Add() Fail, %ld\n", u32Count));
                }
                else
                {
                    JOB_DBG(("\n>> DVB_JOB_Add() Success, %ld\n", u32JobID));
                }
            }
            break;                                    
                            
                        
    }
}
#endif //DVB_JOB_DEBUG
/*******************************************************************************************/

⌨️ 快捷键说明

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