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

📄 tidtv_avinput.c

📁 ti的数字电视芯片 tvp9000的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
*
*	@Return		:: none
*******************************************************************************/
static void TiDTV_AutoChanScanATV(void)
{
	TI_DTV_CHAN_STATUS *pTvChanStatus = TiDTV_SysCtrl.ChanStatus;
	INT8U i;
	char  WorkChar[5];
	
	TiDTV_AudioAmpCtrl(0);	// Turn Off the Audio
	
	TiDTV_SysCtrl.TotalNumPhyChanATV = TiDTV_SysCtrl.CurPhyChanATV = 0;
	
	//------------------------------------------------------
	TiDTV_SysCtrl.AvInput = TI_DTV_AV_INPUT_A_VIDEO1;
	TiDTV_SwitchAvInput();	// Switch AV Input to Analog TV
	
	// Scan all ATV Physical Channels
	TiDTV_KeyBuf.CurKeyCode = 0;	// clear the Key Code
	for (i = TI_DTV_MIN_PHY_CHANNEL_NO; i <= TI_DTV_MAX_PHY_CHANNEL_NO; i++, pTvChanStatus++) {
		// use Top Window
		TiDTV_OsdSetDrawWindow(&TiDTV_OsdScreenAux, &TiDTV_OsdScreenAux.pOsdWindows[0]);
		TiDTV_OsdSetCharColor(&TiDTV_OsdScreenAux, TI_DTV_COLOR_BRIGHT_GREEN, 0);
		TiDTV_OsdSolidRect(&TiDTV_OsdScreenAux, 30, 0, 60, 30, 0);
		TiDTV_MyInt2Str(i, WorkChar, 2, ' ');
		TiDTV_OsdMove(&TiDTV_OsdScreenAux, 30, 0);
		TiDTV_OsdDrawAsciiStr(&TiDTV_OsdScreenAux, WorkChar);
		
		// Display the Progress Bar
		TiDTV_OsdMove(&TiDTV_OsdScreenAux, 30 + 60 + (i - TI_DTV_MIN_PHY_CHANNEL_NO) * 12, 0);
		TiDTV_OsdDrawChar(&TiDTV_OsdScreenAux, 0x1E);
		
		TiDTV_SetTunerPhyChan(i);	// change the RF Channel
		OSTimeDly(30);	// wait for a while
		if (TiDTV_VideoDecGetLockStatus()) {
			pTvChanStatus->Bits.Locked =		// Locked/Not-locked flag
			pTvChanStatus->Bits.Analog = 1;		// DTV (=0) /Analog TV (=1) channel flag
			TiDTV_SysCtrl.TotalNumPhyChanATV++;	// Total number of Locked Physical Channels (A-TV)
			
			// use Top Window
			TiDTV_OsdSetDrawWindow(&TiDTV_OsdScreenAux, &TiDTV_OsdScreenAux.pOsdWindows[0]);
			TiDTV_OsdSetCharColor(&TiDTV_OsdScreenAux, TI_DTV_COLOR_BRIGHT_BLUE, 0);
			TiDTV_OsdSolidRect(&TiDTV_OsdScreenAux, 30, TI_DTV_AUDIO_CTRL_Y, 60, 30, 0);
			TiDTV_OsdMove(&TiDTV_OsdScreenAux, 30, TI_DTV_AUDIO_CTRL_Y);
			TiDTV_OsdDrawAsciiStr(&TiDTV_OsdScreenAux, WorkChar);
			
			// Show the ATV program for a while
			OSTimeDly(2 * OS_TICKS_PER_SEC);
			
			// Save Current ATV Physical Channel Number (6MHz)
			if (TiDTV_SysCtrl.CurPhyChanATV == 0)
				TiDTV_SysCtrl.CurPhyChanATV = i;
		}
		
		// if EXIT or MENU key pressed, then exit the Auto Scan
 		if (TiDTV_KeyBuf.CurKeyCode == TI_DTV_IR_KEY_EXIT ||
			TiDTV_KeyBuf.CurKeyCode == TI_DTV_IR_KEY_MENU)
 			break;
	}
	
	// Erase the AUX OSD Display windows
	TiDTV_OsdClearWindow(&TiDTV_OsdScreenAux, &TiDTV_OsdScreenAux.pOsdWindows[0], 0);
	
	if (TiDTV_SysCtrl.TotalNumPhyChanATV > 0) {
		TiDTV_SetTunerPhyChan(TiDTV_SysCtrl.CurPhyChanATV);	// change the RF Channel
		TiDTV_DispCurTvChannel();	// Display current TV Channel
	}
	
	TiDTV_AudioAmpCtrl(1);	// Turn On the Audio
}

/*******************************************************************************
*	@RoutineName:: TiDTV_CheckAutoTvChanScanTaskStatus
*
*	@Description:: check the status of the Event Flag of TV Channel scan Done
*
*	@Input		:: none
*
*	@Output		:: none
*
*	@Return		::
*		int	: status
*******************************************************************************/
int TiDTV_CheckAutoTvChanScanTaskStatus(void)
{
	OS_TCB WorkTCB;		// work Task Control Block
	
	return OSTaskQuery(TI_DTV_AUTO_TV_CHAN_SCAN_TASK_PRIORITY, &WorkTCB);
}

/*******************************************************************************
*	@RoutineName:: TiDTV_TvChanUp
*
*	@Description:: TV Channel up (++)
*
*	@Input		:: none
*
*	@Output		:: none
*
*	@Return		:: none
*******************************************************************************/
void TiDTV_TvChanUp(void)
{
	switch (TiDTV_SysCtrl.AvInput) {
		case TI_DTV_AV_INPUT_DTV:		// Digital TV Channels
			TiDTV_DtvChanUp();
			break;
			
		case TI_DTV_AV_INPUT_A_VIDEO1:	// Analog TV Channels
			TiDTV_AtvChanUp();
			break;
			
		default:
			break;
	}
}

/*******************************************************************************
*	@RoutineName:: TiDTV_TvChanDown
*
*	@Description:: TV Channel down (--)
*
*	@Input		:: none
*
*	@Output		:: none
*
*	@Return		:: none
*******************************************************************************/
void TiDTV_TvChanDown(void)
{
	switch (TiDTV_SysCtrl.AvInput) {
		case TI_DTV_AV_INPUT_DTV:		// Digital TV Channels
			TiDTV_DtvChanDown();
			break;
			
		case TI_DTV_AV_INPUT_A_VIDEO1:	// Analog TV Channels
			TiDTV_AtvChanDown();
			break;
			
		default:
			break;
	}
}

/*******************************************************************************
*	@RoutineName:: TiDTV_DtvChanUp
*
*	@Description:: Digital TV Channel up (++)
*
*	@Input		:: none
*
*	@Output		:: none
*
*	@Return		:: none
*******************************************************************************/
static void TiDTV_DtvChanUp(void)
{
	TI_DTV_PROGRAM_TABLE *pTiDTV_ProgTable;
	TI_DTV_PROGRAM_DEF	 *pProgDef;
	
	if (TiDTV_SysCtrl.TotalNumPhyChanDTV <= 0)
		return;		// there is no any DTV Channel
	
	TiDTV_SysCtrl.PreviousProgTableIdx = TiDTV_SysCtrl.CurProgTableIdx;	// Previous DTV Channel Index in Program Table
	TiDTV_SysCtrl.PreviousProgramIdx = TiDTV_SysCtrl.CurProgramIdx;		// Previous Program Index Number within a 6MHz Band
	
	// check Current Program Index Number in a 6MHz Band
	pTiDTV_ProgTable = &(TiDTV_ProgTable[TiDTV_SysCtrl.CurProgTableIdx]);
	if (++TiDTV_SysCtrl.CurProgramIdx < pTiDTV_ProgTable->TotalNumProg) {
		pProgDef = &(pTiDTV_ProgTable->ProgDef[TiDTV_SysCtrl.CurProgramIdx]);
		TiDTV_EnableVideoAudio(pProgDef->VideoPID, pProgDef->AudioDef[0].PID, pProgDef->PcrPID);
	} else {
		// Out of the Range of the number of Programs within current 6MHz Band
		// Change the TV PHY Channel (frequency)
		if (++TiDTV_SysCtrl.CurProgTableIdx == TiDTV_SysCtrl.TotalNumPhyChanDTV)
			TiDTV_SysCtrl.CurProgTableIdx = 0;	// Current DTV Channel Index in Program Table
		
		pTiDTV_ProgTable = &(TiDTV_ProgTable[TiDTV_SysCtrl.CurProgTableIdx]);
		TiDTV_SysCtrl.CurPhyChanDTV = pTiDTV_ProgTable->RfChanNo;
		TiDTV_SysCtrl.CurProgramIdx = 0;
		
		// Change DTV RF Channel
		TiDTV_ChangeDtvRfChan(TiDTV_SysCtrl.CurPhyChanDTV, 0);
	}
}

/*******************************************************************************
*	@RoutineName:: TiDTV_DtvChanDown
*
*	@Description:: Digital TV Channel down (--)
*
*	@Input		:: none
*
*	@Output		:: none
*
*	@Return		:: none
*******************************************************************************/
static void TiDTV_DtvChanDown(void)
{
	TI_DTV_PROGRAM_TABLE *pTiDTV_ProgTable;
	TI_DTV_PROGRAM_DEF	 *pProgDef;
	
	if (TiDTV_SysCtrl.TotalNumPhyChanDTV <= 0)
		return;		// there is no any DTV Channel
	
	TiDTV_SysCtrl.PreviousProgTableIdx = TiDTV_SysCtrl.CurProgTableIdx;	// Previous DTV Channel Index in Program Table
	TiDTV_SysCtrl.PreviousProgramIdx = TiDTV_SysCtrl.CurProgramIdx;		// Previous Program Index Number within a 6MHz Band
	
	// check Current Program Index Number in a 6MHz Band
	pTiDTV_ProgTable = &(TiDTV_ProgTable[TiDTV_SysCtrl.CurProgTableIdx]);
	if (--TiDTV_SysCtrl.CurProgramIdx >= 0) {
		pProgDef = &(pTiDTV_ProgTable->ProgDef[TiDTV_SysCtrl.CurProgramIdx]);
		TiDTV_EnableVideoAudio(pProgDef->VideoPID, pProgDef->AudioDef[0].PID, pProgDef->PcrPID);
	} else {
		// Out of the Range of the number of Programs within current 6MHz Band
		// Change the TV PHY Channel (frequency)
		if (TiDTV_SysCtrl.CurProgTableIdx == 0)
			TiDTV_SysCtrl.CurProgTableIdx = TiDTV_SysCtrl.TotalNumPhyChanDTV - 1;
		else
			TiDTV_SysCtrl.CurProgTableIdx--;
		
		pTiDTV_ProgTable = &(TiDTV_ProgTable[TiDTV_SysCtrl.CurProgTableIdx]);
		TiDTV_SysCtrl.CurPhyChanDTV = pTiDTV_ProgTable->RfChanNo;
		TiDTV_SysCtrl.CurProgramIdx = pTiDTV_ProgTable->TotalNumProg - 1;
		
		// Change DTV RF Channel
		TiDTV_ChangeDtvRfChan(TiDTV_SysCtrl.CurPhyChanDTV, 0);
	}
}

/*******************************************************************************
*	@RoutineName:: TiDTV_AtvChanUp
*
*	@Description:: Analog TV Channel up (++)
*
*	@Input		:: none
*
*	@Output		:: none
*
*	@Return		:: none
*******************************************************************************/
static void TiDTV_AtvChanUp(void)
{
	TI_DTV_CHAN_STATUS *pTvChanStatus;
	int i, j;
	
	if (TiDTV_SysCtrl.TotalNumPhyChanATV <= 1)
		return;		// there is no any ATV Channel
	
	TiDTV_SysCtrl.PreviousPhyChanATV = TiDTV_SysCtrl.CurPhyChanATV;		// Previous ATV Physical Channel Number (6MHz)
	
	// Change the TV PHY Channel (frequency)
	i = TiDTV_SysCtrl.CurPhyChanATV + 1;
	pTvChanStatus = &(TiDTV_SysCtrl.ChanStatus[i - TI_DTV_MIN_PHY_CHANNEL_NO]);
	for (j = 0; j < 2; j++) {
		for (; i <= TI_DTV_MAX_PHY_CHANNEL_NO; i++, pTvChanStatus++) {
			if (pTvChanStatus->Bits.Locked != 0 && pTvChanStatus->Bits.Analog != 0) {
				TiDTV_SysCtrl.CurPhyChanATV = i;
				TiDTV_SetTunerPhyChan(i);	// change the RF Channel
				
				return;
			}
		}
		
		i = TI_DTV_MIN_PHY_CHANNEL_NO;
		pTvChanStatus = TiDTV_SysCtrl.ChanStatus;
	}
}

/*******************************************************************************
*	@RoutineName:: TiDTV_AtvChanDown
*
*	@Description:: Analog TV Channel down (--)
*
*	@Input		:: none
*
*	@Output		:: none
*
*	@Return		:: none
*******************************************************************************/
static void TiDTV_AtvChanDown(void)
{
	TI_DTV_CHAN_STATUS *pTvChanStatus;
	int i, j;
	
	if (TiDTV_SysCtrl.TotalNumPhyChanATV <= 1)
		return;		// there is no any ATV Channel
	
	TiDTV_SysCtrl.PreviousPhyChanATV = TiDTV_SysCtrl.CurPhyChanATV;		// Previous ATV Physical Channel Number (6MHz)
	
	// check Current Program Index Number in a 6MHz Band
	i = TiDTV_SysCtrl.CurPhyChanATV - 1;
	pTvChanStatus = &(TiDTV_SysCtrl.ChanStatus[i - TI_DTV_MIN_PHY_CHANNEL_NO]);
	for (j = 0; j < 2; j++) {
		for (; i >= TI_DTV_MIN_PHY_CHANNEL_NO; i--, pTvChanStatus--) {
			if (pTvChanStatus->Bits.Locked != 0 && pTvChanStatus->Bits.Analog != 0) {
				TiDTV_SysCtrl.CurPhyChanATV = i;
				TiDTV_SetTunerPhyChan(i);	// change the RF Channel
				
				return;
			}
		}
		
		i = TI_DTV_MAX_PHY_CHANNEL_NO;
		pTvChanStatus = &(TiDTV_SysCtrl.ChanStatus[TI_DTV_MAX_PHY_CHANNEL_NO - TI_DTV_MIN_PHY_CHANNEL_NO]);
	}
}

/*******************************************************************************
*	@RoutineName:: TiDTV_GetProgIndexViaMajorChanNo
*
*	@Description:: get the Program Index in Program Table via Major Channel Number
*
*	@Input		::
*		UINT16 MajorChanNo : Major Channel Number: [1 - 99]
*
*	@Output		:: none
*
*	@Return		::
*		int		:	Program Index, -1 = not found
*******************************************************************************/
int TiDTV_GetProgIndexViaMajorChanNo(UINT16 MajorChanNo)
{
	TI_DTV_PROGRAM_TABLE *pDtvProgTable = (TI_DTV_PROGRAM_TABLE *) &TiDTV_ProgTable[0];
	int i, ProgIndex = -1;
	
	for (i = 0; i < TI_DTV_MAX_NUM_PHY_CHANNEL; i++, pDtvProgTable++) {
		if (pDtvProgTable->MajorChanNo == MajorChanNo) {
			ProgIndex = i;
			break;
		}
	}
	
	return ProgIndex;
}

⌨️ 快捷键说明

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