Beispiel #1
0
/*
  Returns a pointer to the per-thread sys_timeouts structure. In lwIP,
  each thread has a list of timeouts which is represented as a linked
  list of sys_timeout structures. The sys_timeouts structure holds a
  pointer to a linked list of timeouts. This function is called by
  the lwIP timeout scheduler and must not return a NULL value. 

  In a single threaded sys_arch implementation, this function will
  simply return a pointer to a global sys_timeouts variable stored in
  the sys_arch module.
*/
struct sys_timeouts *
sys_arch_timeouts(void)
{
    u8_t curr_prio;
    s8_t ubldx;

    OS_TCB curr_task_pcb;
    
    null_timeouts.next = NULL;
    
    OSTaskQuery(OS_PRIO_SELF,&curr_task_pcb);
    curr_prio = curr_task_pcb.OSTCBPrio;

    ubldx = (u8_t)(curr_prio - LWIP_START_PRIO);
    
    if((ubldx>=0) && (ubldx<LWIP_TASK_MAX))
    {
    	/* printf("\nlwip_timeouts[%d],prio=%d!!! \n",ubldx,curr_prio); */
    	return &lwip_timeouts[ubldx];
    }
    else
    {
    	/* printf("\nnull_timeouts,prio=%d!!! \n",curr_prio); */
    	return &null_timeouts;
    }
}
Beispiel #2
0
void DccParseTask_Print(void)
{
	OS_TCB os_tdata;
	OSTaskQuery(g_pDccParseTask->m_task.tid, &os_tdata);

	DCC_TRACE(10, "%s : tid %03x msg %03x nSleep %2d bDelay %1d",
			os_tdata.OSTCBTaskName,
			g_pDccParseTask->m_task.tid,
			g_pDccParseTask->m_task.msgQ.pHead,
			g_pDccParseTask->m_task.nSleepCount,
			g_pDccParseTask->m_bDelay

			);
}
Beispiel #3
0
u_char TK_OSTaskQuery(void)
{
   OS_TCB task_data;
   INT8U err, task_prio;

   err = OSTaskQuery(OS_PRIO_SELF, &task_data);

   if (err == OS_NO_ERR)
   {
      task_prio = task_data.OSTCBPrio;
   }
   else
   {
      dprintf("ChronOS API call failure, unable to identify task!");
      panic("TK_OSTaskQuery");
      return 0;
   }
   
   return task_prio;
}
Beispiel #4
0
void GenericTask(void * pdata)
{
	auto OS_TCB data;

	OSTaskQuery(OS_PRIO_SELF, &data);

   if (data.OSTCBPrio < 20)
		DispStr((data.OSTCBPrio * 4) + 2, 7, "r");
	if (data.OSTCBPrio >= 20 && data.OSTCBPrio < 40)
		DispStr(((data.OSTCBPrio % 20) * 4)  + 2, 10, "r");
	if (data.OSTCBPrio >= 40 && data.OSTCBPrio < 60)
		DispStr(((data.OSTCBPrio % 20) * 4) + 2, 13, "r");

	while(1)
	{
      // check to see if deletion request registered, if so delete self
		if (OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ)
			OSTaskDel(OS_PRIO_SELF);
		OSTimeDly(2);
	}
}
Beispiel #5
0
static void KeyScan (void* pdata)
{	
	static INT32U backup_read = 0;
	static INT8U judge_flag = 0;
	static INT8U refresh_flag = 0;	
	static INT32U front_read = KEY_DEFAULT_STATE;
    static INT32U current_read = KEY_DEFAULT_STATE;
	INT32U new_read;

#if KEY_PUSH_EN == 1 || KEY_DOUBLE_EN == 1
	static OS_TCB task_data;
#endif
	
	while (1)
	{			
		new_read = key_phy_read () & 0x00ffffff;
			
		if (new_read == backup_read)
		{
			if (refresh_flag == 0)
			{
				front_read = current_read;
				current_read = new_read;				
				
				refresh_flag = 1;
				judge_flag = 1;
			}
		}	
		else
		{
			backup_read = new_read;
			refresh_flag = 0;
		}

		if (judge_flag == 1)
		{		    
			change = front_read ^ current_read;
						
			if (change)
           	{
            	if ((change & current_read) != 0)	
            	{
            	    key_hook (TYPE_KEY_UP<<24 | change);
            	    OSQPost (os_q_key_msg, (void*)(TYPE_KEY_UP<<24 | change));
            	    
            	    #if KEY_PUSH_EN == 1		
                		if (OSTaskQuery (KEY_PUSH_TASK_PRIO, &task_data) == OS_NO_ERR)
                		{
                			OSSemPost (os_sem_push);
                		}
            		#endif
            	}
            	else
            	{
            		key_hook (TYPE_KEY_DOWN<<24 | change);
            		OSQPost (os_q_key_msg, (void*)(TYPE_KEY_DOWN<<24 | change));
            		
            	    #if KEY_PUSH_EN == 1
                		OSTaskCreate (PushKeyTask, (void*)0, &key_push_task_stk[KEY_PUSH_TASK_STK_SIZE - 1], KEY_PUSH_TASK_PRIO);
            		#endif
            		
            		#if KEY_DOUBLE_EN == 1
                   		if (OSTaskQuery (KEY_DOUBLE_TASK_PRIO, &task_data) == OS_NO_ERR)
                		{
                			OSSemPost (os_sem_double);
                		}
                		else
                		{
                		    OSTaskCreate (DoubleKeyTask, (void*)0, &key_double_task_stk[KEY_DOUBLE_TASK_STK_SIZE - 1], KEY_DOUBLE_TASK_PRIO);	
                		}
            		#endif
            	}
		    }
		    		
			judge_flag = 0;
		}

		OSTimeDly (KEY_SCAN_INTERVAL);
	}
}
Beispiel #6
0
void TaskTwoRiscSystemMonitorRisc0(void *data)
{
    unsigned char err;
    unsigned int msg;   
    unsigned short ret = 0;
    OS_TCB tcb_data;    

    unsigned int temp;

    unsigned int vstd = 0;

    
    BspStartTicker(OS_TICKS_PER_SEC);          

    OSStatInit();

#ifdef PRINT_IN_TASK
    print_init_buffer();

    #ifdef CHIP_CFG_STACK_CHECK
    OSTaskCreateExt(TaskTwoRiscPrint, (void *)0, (void *)&StkTaskTwoRiscPrint[sizeof(StkTaskTwoRiscPrint) / sizeof(StkTaskTwoRiscPrint[0]) - 1], PRIOR_TASK_PRINT,\
               PRIOR_TASK_PRINT, (void *)&StkTaskTwoRiscPrint[0], sizeof(StkTaskTwoRiscPrint) / sizeof(StkTaskTwoRiscPrint[0]), (void *)0, OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR);
    #else                    
    OSTaskCreate(TaskTwoRiscPrint, (void *)0, (void *)&StkTaskTwoRiscPrint[STK_SIZE_TaskTwoRiscPrint - 1], PRIOR_TASK_PRINT);
    #endif

#endif
       
    printf("\r\n");
    printf("**********************************************************************\r\n");
    printf("*                  Risc%d: Two Risc System Monitor Task             *\r\n", RiscRdID());    
    printf("**********************************************************************\r\n");     
    printf("\r\n");

#ifdef AUDIO_MODULE_INCLUDE
    gptAudioTaskReady = 0;      
#endif

#ifdef VIDEO_MODULE_INCLUDE
    tVideoLinuxToUcos *pVideoPackage;
    unsigned int VideoStatusBak;
    unsigned int *pInt;
    Risc_Packet_t risc_packet;
    VideoStatusBak = 0;
    gVideoStatus = 0;
    
/*******************************************************************
the code below is to fix the audio input channel 0 queue underflow bug, 
details see bug number 5 in "avsyncbuglist.xls" in buglist.
*******************************************************************/
    McScMap(VSC_RD_Y0_M, VSC_RD_Y0_S);
    McScMap(VSC_RD_U0_M, VSC_RD_U0_S);
    McScMap(VSC_RD_V0_M, VSC_RD_V0_S);
    
    McScMap(VSC_RD_Y1_M, VSC_RD_Y1_S);
    McScMap(VSC_RD_U1_M, VSC_RD_U1_S);
    McScMap(VSC_RD_V1_M, VSC_RD_V1_S);
/*******************************************************************/

    gtVinFormat.yuv_format = YUV420;
    gtVinFormat.camera_format = NTSC; //0: NTSC mode, 1: PAL mode
    if(gtVinFormat.camera_format == PAL) {
        gtVinFormat.width = 704;
        gtVinFormat.height = 576;
    } else {
        gtVinFormat.width = 704;
        gtVinFormat.height = 480;
    }

    decode_flag = MPEG_ENCODE;  //20071129;indicate the encode mode of the bit stream default is MPEG mode

#ifdef DVR    
    gChecksumEnabled = TRUE;   // enable checksum
#else
    gChecksumEnabled = FALSE;   // please do not change the default value
#endif

#ifdef DVR    
    gImage_Mode = EVENODD_IMAGE;//MERGED_IMAGE;
#else
    gImage_Mode = EVENODD_IMAGE;
#endif

    gImgEncodeMode = ENCODEBOTH;
#endif

#ifdef DVR
    MM74HC595Init();
#endif

    gtPrintMsgControl.en_print_all_msg = 1;
    gtPrintMsgControl.en_print_periodical_msg = 1;

    memset((void *)&gtStatistics, 0, sizeof(gtStatistics));
    
    /* David's email on Dec 12 to improve performance for video & mpeg */
    *(volatile int *)0xa8040000 = 0x1680596;
    *(volatile int *)0xa8020000 = 0x11115;      
    *(volatile int *)0xa8020004 = 0x0a77;      
    
    RiscIntrInit();    
    RiscFlagIntrInit();  
    IICinit();
    TwoRiscCommInit();      
     
#ifdef DUAL_CPU_MODE
    RiscSemUnLock(7);    // tell risc1 ISR table has been created!
#endif

    gptQMsgTwoRiscSystemMonitor = OSQCreate(&ArrayQMsgSysMonitor[0], ArrayQMsgSysMonitor_MAX);   

#ifdef VIDEO_MODULE_INCLUDE

    gRvoDisplayMode = RVO_DISPLAY_BOTH;

    gFreqFromCrystal = TRUE;   //TRUE: external, FALSE:internal
    gVoutClkSet = FALSE;
    gCameraSelectDigital = TRUE;//TRUE:digital,FALSE:analog

extern unsigned int gVinOddEvenFrameSelect;
extern unsigned int gVscOddEvenFrameSelect; 

   gVinOddEvenFrameSelect = ODD_FRAME_FIRST;
#ifdef DVR
    gVscOddEvenFrameSelect = ODD_FRAME_FIRST;    
#else
    gVscOddEvenFrameSelect = EVEN_FRAME_FIRST;
#endif
#ifdef MOTION_DETECTION     //wy:motion detect init
    gMotionSensi = 0;          //default disable motion detection.
    gIsMDEnabled = FALSE;    //default disable motion detection.
    gMdType = mdtemporalDif;  //default motion detection method.
#endif

#ifdef BAND_WIDTH_CONTROL
    set_cbr_default();
#endif

#ifdef AV_SYNC
    set_avsync_default();
#endif

#ifdef DISPLAY_INCLUDE

#ifdef VIDEO_JITTER_BUFFER
    QEeventVodeoL2U = OSQCreate(pQVideoL2UPackage, VIDEO_L2U_PKG_NUMBER);
    if(QEeventVodeoL2U == NULL)
        _PRINTF("\r\nxxxxxxxx: Risc0: OSQCreate QEeventVodeoL2U error!\r\n");
#endif

#ifdef STARTUP_PICTURE
    err = OSQPost(gptQMsgTwoRiscSystemMonitor, (void *)TWO_RISC_SYSTEM_OPEN_VOUT);
    if(err != OS_NO_ERR)    		
        printf("\r\nRISC0: OSMboxPost error! err = %d!\r\n", err);      		
#endif

#endif
    
#endif  	

#ifdef TASK_STATISTIC_EN 
    if(
       #ifdef CHIP_CFG_STACK_CHECK
       OSTaskCreateExt(TaskStatistics, (void *)0, (void *)&StkTaskStatistics[sizeof(StkTaskStatistics) / sizeof(StkTaskStatistics[0]) - 1], PRIOR_TASK_STATISTICS,\
                PRIOR_TASK_STATISTICS, (void *)&StkTaskStatistics[0], sizeof(StkTaskStatistics) / sizeof(StkTaskStatistics[0]), (void *)0, OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR) != OS_NO_ERR	
       #else                    
       OSTaskCreate(TaskStatistics, (void *)0, (void *)&StkTaskStatistics[STK_SIZE_TaskStatistics - 1], PRIOR_TASK_STATISTICS) != OS_NO_ERR
       #endif    
    )
    {
        debug ("\r\nTaskCreate TaskCount1s error\r\n");
    }
#endif    

  //RiscTimerInit(1000000);
    while(1) {
#if 0        
//#ifdef VIDEO_JITTER_BUFFER
        pVideoPackage = (tVideoLinuxToUcos *)OSQPend(QEeventVodeoL2U, 200 * OS_TICKS_PER_SEC /1000, &err);
        if(err == OS_NO_ERR) {
            VideoFrameReceive.addr = pVideoPackage->addr;
            VideoFrameReceive.size = pVideoPackage->len;
            VideoFrameReceive.TimeStamp = pVideoPackage->tstamp;
            err = VBufSaveOneFrame(&VideoBuffer1, &VideoFrameReceive);
            if(err)
                printf("xxx save viedo frame to buffer error! err = %d\n", err);
            else
            {
                //printf("depth = %d, space = %d\n", VideoFrameReceive.CurrentDepth, VideoFrameReceive.CurrentSpace);
                //printf("w = 0x%8.8x, %d, %d\n", VideoFrameReceive.addr, VideoFrameReceive.size, VideoFrameReceive.TimeStamp);
            }
            RiscDecCNT(VIDEO_LINUX_TO_UCOS_CNT, 1);
            if(OSSemPost(gptVideoLinuxToUcosMbox) != OS_NO_ERR)
                printf("Risc0:OSMboxPost error!\r\n");  
        }
        else if(err == OS_TIMEOUT)
            ;//printf("ucos receive video package time out!\n");

        msg = (unsigned int)OSQAccept(gptQMsgTwoRiscSystemMonitor);
        if(msg)
#else
        msg = (unsigned int)OSQPend(gptQMsgTwoRiscSystemMonitor, 200 * OS_TICKS_PER_SEC /1000, &err);
        if(err == OS_NO_ERR)
#endif
        {
            switch(msg) {
                
                case TWO_RISC_SYSTEM_RECEIVE_LINUX_MSG:
                    while(1) {
                        if(TwoRiscCommRecPacket() != SUCCESSFUL) {
                            break;                
                        }
                    }                        
                    break;
                
#ifdef VIDEO_MODULE_INCLUDE
#ifdef DISPLAY_INCLUDE
                case TWO_RISC_SYSTEM_CLOSE_VOUT:       
                    gVoutEnable = 0;
                    break;  

                case TWO_RISC_SYSTEM_CLOSE_DISPLAY_TASK:     	
                    gVoutEnable = 0;

                    printf("Close Display Task!\n");

                    //del task
                    if(OSTaskDel(PRIOR_TASK_DISPLAY) != OS_NO_ERR )
                        printf("OSTaskDel failed!\n");
                    else
                        printf("OSTaskDel OK!\n");

                    OSSemDel_w(gptMpegDecodeReadyToStart, OS_DEL_ALWAYS, &err);
                    OSSemDel_w(gptVideoLinuxToUcosMbox, OS_DEL_ALWAYS, &err);

#ifdef AV_SYNC
                    OSSemDel_w(gptRiscTimerIntrOccur, OS_DEL_ALWAYS, &err);
#endif
                    OSQDel(gptMpeg4DecodeOutputReady, OS_DEL_ALWAYS, &err);
                    if(err != OS_NO_ERR)
                        printf("OSQDel failed!\n"); 
#ifdef PIP_ENABLE
                    OSQDel (gptMqueueVideoInFrame, OS_DEL_ALWAYS, &err);
                    if(err != OS_NO_ERR)
                        printf("OSQDel failed, err = %d!", err);
                    gVideoStatus &= ~tPipEn;
#endif
                    break;                    

                case TWO_RISC_SYSTEM_OPEN_VOUT:  
                    if(OSTaskQuery(PRIOR_TASK_DISPLAY, &tcb_data) == OS_NO_ERR) {   
                    //if(OSTaskCreate(TaskTwoRiscDisplay, (void *)0, (void *)&StkTaskTwoRiscDisplay[STK_SIZE_TaskTwoRiscDisplay - 1], PRIOR_TASK_DISPLAY) != OS_NO_ERR) {
                        if(gVoutEnable == 0) {
                            gVoutEnable = 1;    

                            GetVoutInterface();
                            VoutInterfaceIntialize(gtDisplayFormat.vout_format);
                            /*
                            printf("Init 7171 ");   
                            if(HwADV7171Initialize(gtDisplayFormat.vout_format) == SUCCESSFUL)    // 0: NTSC mode,1: pal mode           
                                printf("ok\n");
                            else 
                                printf("failed\n");
                            */
                            if(gtDisplayFormat.vout_format == LCD) {
                                gtDisplayFormat.vout_interlaced = FALSE;            
                            } else {  // NTSC or PAL
                                gtDisplayFormat.vout_interlaced = TRUE;    
                            }

#ifdef OSD_ENABLE
                            unsigned int task_rollstr_flag = 0;
                            if(gtOsdCurrent.osd_format!=gtDisplayFormat.vout_format){
                                if(OSTaskQuery(PRIOR_TASK_ROLLSTR, &tcb_data) == OS_NO_ERR){
                                    task_rollstr_flag = 1;
                                    if(OSTaskDel(PRIOR_TASK_ROLLSTR) != OS_NO_ERR )
                                        debug("OSTaskDel(PRIOR_TASK_ROLLSTR) failed!\n");
                                }
                                    

                                if(gtDisplayFormat.vout_format == NTSC){
                                    gtOsdCurrent.osd_format = NTSC;
                                    gtOsdCurrent.width = 704;
                                    gtOsdCurrent.height = 480;
                                } else if(gtDisplayFormat.vout_format == PAL){
                                    gtOsdCurrent.osd_format = PAL;
                                    gtOsdCurrent.width = 704;
                                    gtOsdCurrent.height = 576;
                                } else if(gtDisplayFormat.vout_format == LCD){
                                    gtOsdCurrent.osd_format = LCD;
                                    gtOsdCurrent.width = 480;
                                    gtOsdCurrent.height = 240;
                                }
                                //printf("\ngtOsdCurrent.width=%d,gtOsdCurrent.height=%d\n", gtOsdCurrent.width, gtOsdCurrent.height);
                                gtOsdCurrent.start_pixel = 0;
                                gtOsdCurrent.start_line = 0;
                                gtOsdCurrent.backgroundColor = 15;
                                gtOsdCurrent.OSD_T_Mask = 15;
                                gtOsdCurrent.fill_addr = (((unsigned int)OSD_memory_0)&0x1fffffff);
                                gtOsdCurrent.display_addr = (((unsigned int)OSD_memory_0)&0x1fffffff);
                                InitOsdMemory(gtOsdCurrent.start_pixel ,gtOsdCurrent.start_line, gtOsdCurrent.width, gtOsdCurrent.height , gtOsdCurrent.backgroundColor, gtOsdCurrent.fill_addr, gtOsdCurrent.OSD_T_Mask);


                                if(task_rollstr_flag == 1){
                                    if(
#ifdef CHIP_CFG_STACK_CHECK
                                        OSTaskCreateExt(TaskRollString, (void *)0, (void *)&StkTaskRollStr[sizeof(StkTaskRollStr) / sizeof(StkTaskRollStr[0]) - 1], PRIOR_TASK_ROLLSTR,\
                                        PRIOR_TASK_ROLLSTR, (void *)&StkTaskRollStr[0], sizeof(StkTaskRollStr) / sizeof(StkTaskRollStr[0]), (void *)0, OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR) != OS_NO_ERR	
#else                    
                                        OSTaskCreate(TaskRollString, (void *)0, (void *)&StkTaskRollStr[STK_SIZE_ROLLSTR - 1], PRIOR_TASK_ROLLSTR) != OS_NO_ERR
#endif
                                    )
                                    debug ("\r\nTaskCreate TaskRollString error!\r\n");
                                    else{
                                        debug("\r\nTaskCreate TaskRollString OK!\r\n");
                                    }
                                }
                            }                        
#endif

                            VscInit();                               
                            AppVscStart();              						   
                            gVideoStatus |= tVoutEn;
                        }
                    } else {    
                        TwoRiscDisplayRvoPipOsdInit();
                        if(
                           #ifdef CHIP_CFG_STACK_CHECK
                           OSTaskCreateExt(TaskTwoRiscDisplay, (void *)0, (void *)&StkTaskTwoRiscDisplay[sizeof(StkTaskTwoRiscDisplay) / sizeof(StkTaskTwoRiscDisplay[0]) - 1], PRIOR_TASK_DISPLAY,\
                                    PRIOR_TASK_DISPLAY, (void *)&StkTaskTwoRiscDisplay[0], sizeof(StkTaskTwoRiscDisplay) / sizeof(StkTaskTwoRiscDisplay[0]), (void *)0, OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR) != OS_NO_ERR	
                           #else                    
                            OSTaskCreate(TaskTwoRiscDisplay, (void *)0, (void *)&StkTaskTwoRiscDisplay[STK_SIZE_TaskTwoRiscDisplay - 1], PRIOR_TASK_DISPLAY) != OS_NO_ERR
                           #endif                        
                        )
                            printf("\r\nTaskTwoRiscDisplay create error!\r\n");    
                    }
                    break;

                case TWO_RISC_SYSTEM_CLOSE_PIP:     
                    gPipEnable = 0;
                    break;

                case TWO_RISC_SYSTEM_CLOSE_RVO:     
                    gRvoEnable = 0;
                    break;                    
                    
                case TWO_RISC_SYSTEM_CLOSE_OSD:     
                    gOsdEnable = 0;
                    break;

                case TWO_RISC_SYSTEM_OPEN_RVO:
                    if(gRvoEnable == 0) {
                        if(gVoutEnable == 1) {
                            gVoutReEnable = 1;
                        }
                        gRvoEnable = 1;
                    }
                    break;
                    
                case TWO_RISC_SYSTEM_OPEN_PIP:
                    if(gPipEnable == 0) {
                        if(gVoutEnable == 1) {
                            gVoutReEnable = 1;
                        }
                        gPipEnable = 1;
                    }
                    break;

#ifdef OSD_ENABLE                    
                case TWO_RISC_SYSTEM_OPEN_OSD:  	
                    if(gOsdEnable==0) {
                        if(gVoutEnable == 1)
                            gVoutReEnable = 1;
                            gOsdEnable =1;
                    }

                    /*if (OSTaskCreate(TaskRollString, (void *)0, (void *)&StkTaskRollStr[STK_SIZE_ROLLSTR - 1], PRIOR_TASK_ROLLSTR) != OS_NO_ERR)
                    {
                        debug ("\r\nTaskCreate TaskRollString error!\r\n");
                    } else
                        printf("\r\nTaskCreate TaskRollString succed!\r\n");*/
                    break;
#endif
                    
#endif                    
                case TWO_RISC_SYSTEM_OPEN_VIN:

                    #ifdef CHIP_CFG_STACK_CHECK
                    OSTaskCreateExt(TaskTwoRiscVinMpegEncode, (void *)0, (void *)&StkTaskTwoRisc0IPCamera[sizeof(StkTaskTwoRisc0IPCamera) / sizeof(StkTaskTwoRisc0IPCamera[0]) - 1], PRIOR_TASK_IPCAM,\
                            PRIOR_TASK_IPCAM, (void *)&StkTaskTwoRisc0IPCamera[0], sizeof(StkTaskTwoRisc0IPCamera) / sizeof(StkTaskTwoRisc0IPCamera[0]), (void *)0, OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR);	
                    #else
                    OSTaskCreate(TaskTwoRiscVinMpegEncode, (void *)0, (void *)&StkTaskTwoRisc0IPCamera[TaskTwoRiscMpegEncode_STK_SIZE - 1], PRIOR_TASK_IPCAM);
                    #endif
        
                    #ifdef CHIP_CFG_STACK_CHECK
                    OSTaskCreateExt(TaskTwoRiscSendMpegH263Encode, (void *)0, (void *)&StkTaskTwoRiscSendMpegH263Encode[sizeof(StkTaskTwoRiscSendMpegH263Encode) / sizeof(StkTaskTwoRiscSendMpegH263Encode[0]) - 1], PRIOR_TASK_TWO_RISC_SEND_MPEG_H263_ENCODE,\
                            PRIOR_TASK_TWO_RISC_SEND_MPEG_H263_ENCODE, (void *)&StkTaskTwoRiscSendMpegH263Encode[0], sizeof(StkTaskTwoRiscSendMpegH263Encode) / sizeof(StkTaskTwoRiscSendMpegH263Encode[0]), (void *)0, OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR);	
                    #else
                    OSTaskCreate(TaskTwoRiscSendMpegH263Encode, (void *)0, (void *)&StkTaskTwoRiscSendMpegH263Encode[TaskTwoRiscSendMpegh263Encode_STK_SIZE - 1], PRIOR_TASK_TWO_RISC_SEND_MPEG_H263_ENCODE);
                    #endif
                    
                    break;
                    
                case TWO_RISC_SYSTEM_REOPEN_VIN_TASK:
                {
                    INT8U dret = 0;
                    DIS_VIN_VIDEO();
                    debug("before OSTaskDel(PRIOR_TASK_IPCAM).\n");
                    OSTaskDel(PRIOR_TASK_TWO_RISC_SEND_MPEG_H263_ENCODE);
                    dret = OSTaskDel(PRIOR_TASK_IPCAM);
                    debug("after OSTaskDel(PRIOR_TASK_IPCAM).\n");
                    if (dret != OS_NO_ERR )
                        debug("OSTaskDel(PRIOR_TASK_IPCAM) failed.\n");
                    else
                        debug("OSTaskDel(PRIOR_TASK_IPCAM) success.\n");
                    OSSemDel_w(gptSemMpegEncodeReady, OS_DEL_ALWAYS, &err);
                    OSSemDel_w(gptSemMp4EncodeOutBufReady, OS_DEL_ALWAYS, &err);
                    OSMboxDel_w(gptMboxVideoInFrame, OS_DEL_ALWAYS, &err);
                    OSMboxDel_w(gptMboxMpegEncodeOutFrame, OS_DEL_ALWAYS, &err);
                    gVideoStatus &= ~tVinEn;
#if 0
#ifdef PIP_ENABLE        
                    OSQDel (gptMqueueVideoInFrame, OS_DEL_ALWAYS, &err);
                    if(err != OS_NO_ERR)
                    printf("OSQDel failed, err = %d!", err);
#endif
#endif

                    #ifdef CHIP_CFG_STACK_CHECK
                    OSTaskCreateExt(TaskTwoRiscVinMpegEncode, (void *)0, (void *)&StkTaskTwoRisc0IPCamera[sizeof(StkTaskTwoRisc0IPCamera) / sizeof(StkTaskTwoRisc0IPCamera[0]) - 1], PRIOR_TASK_IPCAM,\
                            PRIOR_TASK_IPCAM, (void *)&StkTaskTwoRisc0IPCamera[0], sizeof(StkTaskTwoRisc0IPCamera) / sizeof(StkTaskTwoRisc0IPCamera[0]), (void *)0, OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR);	
                    #else
                    OSTaskCreate(TaskTwoRiscVinMpegEncode, (void *)0, (void *)&StkTaskTwoRisc0IPCamera[TaskTwoRiscMpegEncode_STK_SIZE - 1], PRIOR_TASK_IPCAM);
                    #endif
        
                    #ifdef CHIP_CFG_STACK_CHECK
                    OSTaskCreateExt(TaskTwoRiscSendMpegH263Encode, (void *)0, (void *)&StkTaskTwoRiscSendMpegH263Encode[sizeof(StkTaskTwoRiscSendMpegH263Encode) / sizeof(StkTaskTwoRiscSendMpegH263Encode[0]) - 1], PRIOR_TASK_TWO_RISC_SEND_MPEG_H263_ENCODE,\
                            PRIOR_TASK_TWO_RISC_SEND_MPEG_H263_ENCODE, (void *)&StkTaskTwoRiscSendMpegH263Encode[0], sizeof(StkTaskTwoRiscSendMpegH263Encode) / sizeof(StkTaskTwoRiscSendMpegH263Encode[0]), (void *)0, OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR);	
                    #else
                    OSTaskCreate(TaskTwoRiscSendMpegH263Encode, (void *)0, (void *)&StkTaskTwoRiscSendMpegH263Encode[TaskTwoRiscSendMpegh263Encode_STK_SIZE - 1], PRIOR_TASK_TWO_RISC_SEND_MPEG_H263_ENCODE);
                    #endif
                }
                    break;
                    
                case TWO_RISC_SYSTEM_DEL_VIN_TASK:
                    DIS_VIN_VIDEO();
                    INT8U dret = 0;
                    debug("before OSTaskDel(PRIOR_TASK_IPCAM).\n");
                    OSTaskDel(PRIOR_TASK_TWO_RISC_SEND_MPEG_H263_ENCODE);                    
                    dret = OSTaskDel(PRIOR_TASK_IPCAM);
                    debug("after OSTaskDel(PRIOR_TASK_IPCAM).\n");
                    if (dret != OS_NO_ERR )
                        debug("OSTaskDel(PRIOR_TASK_IPCAM) failed.\n");
                    else
                        debug("OSTaskDel(PRIOR_TASK_IPCAM) success.\n"); 
                    OSSemDel_w(gptSemMpegEncodeReady, OS_DEL_ALWAYS, &err);
                    OSSemDel_w(gptSemMp4EncodeOutBufReady, OS_DEL_ALWAYS, &err);
                    OSMboxDel_w(gptMboxVideoInFrame, OS_DEL_ALWAYS, &err);
                    OSMboxDel_w(gptMboxMpegEncodeOutFrame, OS_DEL_ALWAYS, &err);
                    gVideoStatus &= ~tVinEn;
                    break;

#endif /*VIDEO_MODULE_INCLUDE*/

#ifdef DVR
/*  wg add for DVR 2007.08.16   */
                case TWO_RISC_SYSTEM_DVR_READ_MOTION_DETECTION:

                    Hw2835ReadMDRegister();
#endif                   
                    break;

#ifdef VIDEO_MODULE_INCLUDE
            case TWO_RISC_SYSTEM_SET_CLOCK:                
                if(gFreqFromCrystal == FALSE) {
                    printf("\nTaskTwoRiscVinMpegEncode: camera clock is created from Vout!\n");
                    CctlVoutClkSet();
                } else {
                    printf("\nTaskTwoRiscVinMpegEncode: camera clock is created from external crystal!\n");
                    CctlVoutClkSet();
                }

                gCameraSelectDigital = -1;   //initialize it to avoid default FALSE
                pcurrent_camera = GetDigitCamera();
                if(pcurrent_camera) {
                    gCameraSelectDigital = TRUE;
                }else {
                    pcurrent_camera = GetAnalogCamera();
                    if(pcurrent_camera) {
                        gCameraSelectDigital = FALSE;
                        
                        if(pcurrent_camera != NULL)                 //has found digital camera or 7181
                            pcurrent_camera->camera_init();
                        else {                                                      //
                            printf("\nTaskTwoRiscVinMpegEncode: no analog cameras found!\n");
                        }
                        
                        if(pcurrent_camera->GetCamVideoStd) {   //is the chip support video standard detection?
                            if(pcurrent_camera->GetCamVideoStd(&vstd) == SUCCESSFUL) {       //get analog camera and video standard
                                if((gtVinFormat.camera_format != vstd)) {
                                    gtVinFormat.camera_format = vstd;
                                }
                            }    
                        }
                    }
                }
                break;
#endif
                
                default:
                    printf("\nTaskTwoRiscSystemMonitorRisc0: type(%d) error!\n", msg);
                    break;             	

            }   	
        }
        
#ifdef VIDEO_MODULE_INCLUDE
#ifdef DISPLAY_INCLUDE      
        if(gVoutEnable == 0)
            gVideoStatus &= ~tVoutEn;
#endif
        
        if(VideoStatusBak != gVideoStatus)
        {
            debug("\n>>>>>>>>>>>>>>>>>>\n");
            VideoStatusBak = gVideoStatus;
            //don't send gVideoStatus, it will be change in other task while you send!
            pInt = (unsigned int *)&risc_packet;
            risc_packet.start = RISC_PKT_START;
            risc_packet.main_type = tVideo;
            risc_packet.sub_type = tCheckVideoStatus;
            risc_packet.length = 0x8;
            risc_packet.status = 0;     
            *(pInt + 2) = VideoStatusBak;                    
            risc_packet.end = RISC_PKT_END;     
            if(TwoRiscCommSendPacket((unsigned int *)&risc_packet, RPACKET_LEN) == SUCCESSFUL)
                RiscFlagSet();    // Set risc1 flag to interrupt risc1
            else 
                debug("\r\nSend Video Status error!\r\n");
        }
#endif /* VIDEO_MODULE_INCLUDE */
    }
}