📄 tidtv_avinput.c
字号:
*
* @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 + -