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

📄 scan_s.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************

        (C)Copyright Cheertek Inc. 2002-2004,
           D700, all right reserved.

        Product : STB Firmware

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


#include "ap_scan.h"
#include "dvb_nim.h"
#include "dvb_av.h"
#include "dvb_sys.h"
#include "dvb_fp.h"
#include "dvb_scan.h"
#include "db_defs.h"
#include "dvb_msg.h"
#include "ap_si.h"
/*******************************************************************************************/
#if 1
#define SCAN_MSG(p)
#else
#define SCAN_MSG(p)			printf p
#endif

#if 1
#define SCAN_DBG(p)
#else
#define SCAN_DBG(p) 		printf p
#endif

/*******************************************************************************************/          

/****************************************************************************/
DVB_AutoScanParameter   stAutoScanParameter;
DB_SatDetail             stSatItem;
DB_SatRel       stSatRel;

u16 u16SatIdxOfAutoScan;
u16 u16TotalTpCount;
u16 u16TotalVideoCount;
u16 u16TotalRadioCount;
u16 u16video_insert_idx, u16radio_insert_idx;
u8  u8NumOfVideoInTp,u8NumOfRadioInTp;

#ifdef NIM_PERFORMANCE_TEST_1
bool8 test_nim_Scan_mode(void);
void test_nim_Scan_update(u16 u16Srv);

bool8 b8NIM_Test_Mode=FALSE;
u16 u16Srv_counter=0;
/*******************************************************************************************/          

void test_nim_Scan(bool8 b8Enable)
{	
	if(b8Enable == 0 )
	{
		b8NIM_Test_Mode=FALSE;
		SCAN_DBG(("@#@ scan total service number = %d\n",u16Srv_counter));
	}
	else
	{
		SCAN_DBG(("@#@ tuner scan test...\n"));
		b8NIM_Test_Mode=TRUE;
		u16Srv_counter=0;
	}	
}
/*******************************************************************************************/          

bool8 test_nim_Scan_mode(void)
{
	return b8NIM_Test_Mode;
}
/*******************************************************************************************/          

void test_nim_Scan_update(u16 u16Srv)
{
	u16Srv_counter+=u16Srv;
}
#endif
/*******************************************************************************************/          


EN_SCAN_ERROR _ParsingTp(u16* pu16TpIdx, DB_TpDetail *pstTP, EN_SCAN_EDIT_TYPE enScanEditType, bool8 b8FreeMode)
{
	DB_SrvDetail    stSrvItem, stSrvTempItem;
	DB_SrvRel       stSrvRelTemp;

	DB_TpDetail     stTpTempItem;
	DB_TpRel        stTpRelTemp;

	u16	u16SrvIdx, j;
	bool8 b8SrvDbFree;
	u8 u8idx, u8numOfSrvInTp;
	EN_SERVICE_TYPE enSrvType;
	u16 u16Service_start_idx, u16Service_end_idx;
	u16 u16OriginalNID = 0xffff, u16TransportStreamID = 0xffff;
	bool8 b8SetTPID = FALSE;

#if defined(CT216U)||defined(CT956)
	if (CT_DEMUX_SetPreScan (TRUE) != DRV_OK)
	{
		return EN_SCAN_ERROR_ABORT;
	}
#endif

	switch(DVB_SI_ParserTP(FALSE) )
	{
		case EN_PARSER_USER_ABORT:
		    //SCAN_DBG(("\n>> EN_PARSER_USER_ABORT"));
			return EN_SCAN_ERROR_ABORT;
		case EN_PARSER_TIMEOUT:
		    //SCAN_DBG(("\n>> EN_PARSER_TIMEOUT"));
			return EN_SCAN_ERROR_NO_SERVICES;
		case EN_PARSER_NO_ERROR:
		    //SCAN_DBG(("\n>> EN_PARSER_NO_ERROR"));
		    break;
		default:
		    //SCAN_DBG(("\n>> EN_PARSER_Default"));
			return EN_SCAN_ERROR_ABORT;
	}
	
DVB_SI_GetTPInfo (&u16OriginalNID, &u16TransportStreamID);

   		
    	#ifdef NIM_PERFORMANCE_TEST_1
    	#define TEST_COUNTER 5
    	
		if(test_nim_Scan_mode() == TRUE)
		{
			u16 u16Strength, u16Quality;
			
			u8numOfSrvInTp = DVB_SI_GetTotalService();
			
			SCAN_DBG(("@#@ LF=%d, F=%d, Sym=%d, ",pstTP->u16LocalFrequency,pstTP->u16TPFrequency, pstTP->u16SymbolRate));
			
			if(pstTP->b8Polar_H == TRUE)
			{
				SCAN_DBG(("H, "));
			}	
			else
			{
				SCAN_DBG(("V, "));
			}
			if(pstTP->b8Tone22K == TRUE)
			{
				SCAN_DBG(("DiS%hx 22On\n",pstTP->u8DiSEqC));
			}	
			else
			{
				SCAN_DBG(("DiS%hx 22OFF\n",pstTP->u8DiSEqC));	
			}
			u16Strength = 0;
			u16Quality = 0;
						
			for(j=0;j<TEST_COUNTER;j++)
			{
				u16Strength += DVB_TunerGetStrength();
				u16Quality += DVB_TunerGetQuality();
				DVB_TimerPollWait(10);
			}
			u16Strength/=TEST_COUNTER;
			u16Quality/=TEST_COUNTER;
				
			SCAN_DBG(("@#@ Strength = %d\n",u16Strength));
			SCAN_DBG(("@#@ Quality = %d\n",u16Quality));
					
			SCAN_DBG(("@#@ Pareser service number = %d\n",u8numOfSrvInTp));
			test_nim_Scan_update(u8numOfSrvInTp);
			DVB_SI_EndOfParserTP();
			return EN_SCAN_NO_ERROR;
		}
		#endif
		

	// select ADD_ALL or ADD_NEW for auto scan
	// decide tp idx for ADD_NEW
    if(enScanEditType==EN_SCAN_AUTO)
    {
        *pu16TpIdx = 0xffff;

    	u8numOfSrvInTp = DVB_SI_GetTotalService();   	
    	
    	for(u8idx=0; u8idx<u8numOfSrvInTp; u8idx++)
    	{
    		if( DVB_SI_GetServiceItem(u8idx, &enSrvType, &stSrvItem)==FALSE )
    		{
    		    continue;
    		}
    		if( (stSrvItem.u8Type&0x40)!=0 && b8FreeMode )
    		{
    			continue;
    		}	
		    DVB_SatReadDetail(u16SatIdxOfAutoScan,&stSatItem, &stSatRel);
		    
			u16Service_start_idx = stSatRel.as16SrvStartIdx[enSrvType];
			u16Service_end_idx = stSatRel.as16SrvEndIdx[enSrvType];
			
            if((u16Service_start_idx != 0xFFFF)&&(u16Service_end_idx != 0xFFFF))
			{
				for(j=u16Service_start_idx; j<=u16Service_end_idx; j++)
				{
					DVB_ServiceReadDetail(enSrvType,j, &stSrvTempItem, &stSrvRelTemp);

    				if(memcmp(stSrvTempItem.acServiceName,stSrvItem.acServiceName, MAX_SERVICE_NAME_LENGTH)==0)
//  don't check sid, order by manual key in database
//					if(stSrvTempItem.u16ServiceId== stSrvItem.u16ServiceId)
					if(stSrvTempItem.u16VideoPid == stSrvItem.u16VideoPid)
    				//if(stSrvTempItem.au16AudioPid[0] == stSrvItem.au16AudioPid[0])  // audio pid may be changed by user
    				//if(stSrvTempItem.au16AudioPid[1] == stSrvItem.au16AudioPid[1])
					{
   					    // same service found!!
    					DVB_TPReadDetail(stSrvRelTemp.u16TpIdx, &stTpTempItem, &stTpRelTemp);
    					if(stTpTempItem.u16TPFrequency>(pstTP->u16TPFrequency-5))
    					if(stTpTempItem.u16TPFrequency<(pstTP->u16TPFrequency+5))
    					{
       					    // same tp found!!
    						if((stTpTempItem.b8Tone22K != pstTP->b8Tone22K)||(stTpTempItem.u8DiSEqC != pstTP->u8DiSEqC))
    						{
    							stTpTempItem.b8Tone22K = pstTP->b8Tone22K;
    							stTpTempItem.u8DiSEqC = pstTP->u8DiSEqC;
    							//SetItemOfTpListInDram(pgmItemOfDram.u8TransponderIndex,&stTpTempItem);
    						}
    
                    	    *pu16TpIdx = stSrvRelTemp.u16TpIdx;
                        	DVB_TPUpdateDetail(*pu16TpIdx, &stTpTempItem);
                        	u8idx = u8numOfSrvInTp; // break next for loop
    						break;
    					}
					}
				}
			}
    	}

	    if( *pu16TpIdx==0xffff )
	    {
	        enScanEditType = EN_SCAN_ADD_ALL;
    	    SCAN_DBG(("New TP\n"));
	    }
	    else
	    {
           	enScanEditType = EN_SCAN_EDIT_ADD_NEW_ONLY;
    	    SCAN_DBG(("Update TP\n"));
    	}
	    
    }

    if(enScanEditType==EN_SCAN_ADD_ALL)
    {
    	u16TotalTpCount = DVB_TPGetTotal();
    	
	    if(u16TotalTpCount>=MAX_NUM_OF_TP)
	    {
            DVB_SI_EndOfParserTP();
    		return EN_SCAN_ERROR_TP_FULL;
    	}

    	DVB_TPAddDetail(pu16TpIdx, pstTP, u16SatIdxOfAutoScan);    // add TP even no service found.
    }
	else if(enScanEditType==EN_SCAN_EDIT_REPLACE_ALL)
	{
	    DVB_ServiceDelByTp( *pu16TpIdx);
	}
	
	b8SrvDbFree = TRUE;
	u16video_insert_idx = 0xffff;
	u16radio_insert_idx = 0xffff;
	u8NumOfVideoInTp = 0;
	u8NumOfRadioInTp = 0;
	u8numOfSrvInTp = DVB_SI_GetTotalService();
	for(u8idx=0; u8idx<u8numOfSrvInTp; u8idx++)
	{
		if( DVB_SI_GetServiceItem(u8idx, &enSrvType, &stSrvItem)==FALSE )
		{
		    continue;
		}
		if( (stSrvItem.u8Type&0x40)!=0 && b8FreeMode )
		{
			continue;

⌨️ 快捷键说明

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