📄 scan_s.c
字号:
/**************************************************************************
(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 + -