📄 tv_2in1.c
字号:
#define _TV_2IN1_C_
#include "board.h"
#define _TV_C_
#include <math.h>
#include "types.h"
#include "Global.h"
#if TV_ENABLE
#include "Reg52.h"
#include "TV.h"
#include "devtuner.h"
#include "misc.h"
#include "nvram.h"
#include "DevVD.h"
#include "msosd.h"
#include "DEBUG.h"
#include "ms_reg.h"
#include "ms_rwreg.h"
#include "panel.h"
#include "mstar.h"
//#include "menudef.h"
#include "menu.h"
#include "UserPref.h"
#include "Tda7052.h"
#include "nvram.h"
#include "M2_vd_agc_lib.h"
#if(ENABLE_VD_DSP)
#include "Maria2_dsp_lib.h"
#endif
BYTE XDATA g_ucTryTimes;
extern BYTE code strProgramText[LANG_Nums][12];
extern void devSetSWF(BYTE ColorSoundSystem);
extern void NVRam_WriteWord(WORD addr, WORD value);
extern void Osd_SetTextColor(BYTE foreColor, BYTE backColor);
extern BOOL ExecuteKeyEvent(MenuItemActionType menuAction);
//extern BYTE g_ucMenuPageIndex;
//extern BYTE g_ucMenuItemIndex;
BYTE GetAFCValue(BYTE ucLoopCount)
{
BYTE value;
BYTE code AUTOAFCMappingValue[16]=
{
0x08,// 0
0x09,// 1
0x0A,// 2
0x0B,// 3
0x0C,// 4
0x0D,// 5
0x0E,// 6
0x0F,// 7
0x00,// 8
0x01,// 9
0x02,// A
0x03,// B
0x04,// C
0x05,// D
0x06,// E
0x07,// F
};
value= devTunerGetStatus(ucLoopCount);
value &= 0x1e;
value >>= 1;
value &= 0x0f;//16 counts
// printf("AUTOAFC==%d", AUTOAFCMappingValue[value]);
// printf("value===%d", value);
return AUTOAFCMappingValue[value];//abs(value-7);//alue;//
}
/*
void TurnerAFCHandler(void)
{
BYTE AFCValue;
if(!PowerOnFlag) // Nelson added 2006-01-24
return; // Nelson added 2006-01-24
if(!IsTVInUse())
return;
else if(AFCDisableFlag)
return;
else if(!(chData.ucChannelMisc&DoAFCFlag))
return;
else if(!(g_VdInfo.wVideoStatus&VD_HSYNC_LOCKED))
return;
else if(g_ucAFCTuneCounter<AFCTUNEMINCOUNT||g_ucAFCTuneCounter>AFCTUNEMAXCOUNT)
Set_AFCDisableFlag();
AFCValue = GetAFCValue(5);
if(AFCValue>9)
{
chData.wFreq++;
g_ucAFCTuneCounter++;
}
else if(AFCValue<6)
{
chData.wFreq--;
g_ucAFCTuneCounter--;
}
else
return;
ResetTuner();
}
*/
BOOL CheckTunerVsIsValid(WORD Vs)
{
if((Vs>=TN_FREQMIN)&&(Vs<=TN_FREQMAX))
return TRUE;
else
return FALSE;
}
void ReadTVChannelInfo(BYTE ch, BOOL ReallyAddr)
{
ReallyAddr=ReallyAddr;
NVRam_ReadTbl(nvrChanneAddr(ch), (BYTE*)&chData,SIZE_TV_CHANNEL_INFO);
if(!CheckTunerVsIsValid(chData.wFreq))
chData.wFreq=TN_FREQ_INVILIDDEF;
}
void SaveTVChannelInfo(BYTE ch, BOOL ReallyAddr)
{
ReallyAddr=ReallyAddr;
if(!CheckTunerVsIsValid(chData.wFreq))
chData.wFreq=TN_FREQ_INVILIDDEF;
NVRam_WriteTbl(nvrChanneAddr(ch), (BYTE*)&chData,SIZE_TV_CHANNEL_INFO);
}
void TV_SelectChannel( BYTE ucChannel )
{
g_TVChSetting.ucPreChannelNO = g_TVChSetting.ucCurChannelNO;
g_TVChSetting.ucCurChannelNO = ucChannel;
TV_SetCh();
}
void TV_SelectPreChannel(void)
{
BYTE temp;
temp=g_TVChSetting.ucCurChannelNO;
g_TVChSetting.ucCurChannelNO=g_TVChSetting.ucPreChannelNO;
g_TVChSetting.ucPreChannelNO=temp;
TV_SetCh();
}
void TV_SetCh(void)
{
VD_AGC_ResetGain( g_uwVideoAGC );
ReadTVChannelInfo(g_TVChSetting.ucCurChannelNO,FALSE);
g_TVChSetting.TvCurChannelMisc=chData.ucChannelMisc;
//printf("chData.wFreq==%x", chData.wFreq);
devTunerWrite(chData.wFreq);
//SetColorSystem(chData);
devSetSWF(chData.ucChannelMisc);
devTunerSetAGCValue(g_VideoSetting.TunerAGC);
msVDReset();
//if( g_ucmsVDCtl&MSVD_CTL_FLAG_NOISE_HANDLER )
msVDNoiseHandlerReset();
SaveChannelNumberSetting();
Set_InputTimingChangeFlag();
Set_AFCDisableFlag();
msVDColorBurstHandler( VD_COLOR_BURST_HANDLER_RESET );
}
BYTE TV_GetIncValidChannel( BYTE ucCurChannel )
{
if(ucCurChannel>(MAX_CHANNEL_NUM-2))//g_TVChSetting.ucMaxValidChNum)
ucCurChannel=0;
else
ucCurChannel++;
return ucCurChannel;
}
BYTE TV_GetDecValidChannel( BYTE ucCurChannel )
{
if(ucCurChannel==0)
ucCurChannel=(MAX_CHANNEL_NUM-2);//g_TVChSetting.ucMaxValidChNum;
else
ucCurChannel--;
return ucCurChannel;
}
BYTE SearchTVNoSkipChannel(BYTE channel,BOOL Inc)
{
BYTE BkChannel=channel;
BYTE temp;
do
{
if(Inc)
channel=TV_GetIncValidChannel(channel);
else
channel=TV_GetDecValidChannel(channel);
NVRam_ReadByte((nvrChanneAddr(channel)+MISCOFFSETADDR),&temp);
if((temp&NotSkipThisNum)||channel==g_TVChSetting.ucCurChannelNO)
break;
}while(BkChannel!=channel);
return channel;
}
void SaveChannelData( BYTE chIdx, StuChannelData* pChData )
{
//printf("nvrChanneAddr(chIdx)====%x", nvrChanneAddr(chIdx));
//printf("SIZE_TV_CHANNEL_INFO===%x", SIZE_TV_CHANNEL_INFO);
rmBurstWriteBytes( nvrChanneAddr(chIdx), (BYTE *)pChData, SIZE_TV_CHANNEL_INFO);
}
void InitChannelData( BYTE ucChIdx, StuChannelData* pChData)
{
pChData->wFreq = ((WORD)55.25*TN_FREQ_UNIT)+((WORD)(ucChIdx%100)*8*TN_FREQ_UNIT);
pChData->ucChannelMisc=0;//default color sys auto
pChData->ucChannelMisc =TV_SOUND_I|DoAFCFlag;
}
void ResetChannels(BYTE ucMinCh, BYTE ucMaxCh)
{
BYTE i;
StuChannelData ChannelBff;
i = ucMinCh;
Delay1ms(100);
do
{
WatchDogClear();
//Delay1ms(100);
InitChannelData( i, &ChannelBff);
SaveChannelData( i, &ChannelBff );
} while((i++) != ucMaxCh); // while
}
void ChannelScanInit(void)
{
devAudioWrite(0);
//msFPLLCtl( FPLL_TUNE_LINE_ONLY );
g_ucOsdCounter = 0;
Set_AFCDisableFlag();
}
void InitVDBeforeSearchStart(void)
{
g_VdInfo.ucVideoSystem = SIG_NONE;
g_InOutCtl.bInterlace = 1;
if( IsVideoPortInUse())
{
// For TV snow
#if( TV_SYSTEM == TV_NTSC )
msVDSetupMode( VD_FSC_3579, SIG_NTSC );
#else
msVDSetupMode( VD_FSC_4433|VD_VSYNC_50HZ, SIG_PAL );
#endif
}
SetOutputTimingAndWindow( OUTPUT_SNOW );
msSetBlueScreen( _DISABLE, FR_BLACK);
}
WORD g_wTVAutoScan_LastVTotal;
void TV_ChannelAutoScanInit(void)
{
BYTE uctemp;
ChannelScanInit(); //for auto scan
devSetSWF(TV_SOUND_I);
g_ucTVChannelAutoScanCount = 0; // select start channel
chData.wFreq = TN_FREQMIN;//TN_FREQMIN;
g_bTVAutoScanChannelEnable=TRUE;
uctemp=((chData.ucChannelMisc&SoundSysMask)%TV_SOUND_NUMS);
//printf("uctemp===%d", uctemp);
//chData.ucChannelMisc=0;//default color sys auto
chData.ucChannelMisc =NotSkipThisNum|DoAFCFlag|uctemp;
g_bSaveChannel=FALSE;
devTunerWrite(chData.wFreq);
InitVDBeforeSearchStart();
g_wTVAutoScan_LastVTotal = 0;
#if(ENABLE_CHECK_AUTO_H_TOTAL)
g_bEnableAutoHTotal = 1;
#endif
SystemDelay_translate_To_Dsp_Processor(5);
}
void TV_ChannelAutoScan(void)
{
if( g_bTVAutoScanChannelBreak )
{
// Reset the value of the channel without signal
ResetChannels(g_TVChSetting.ucMaxValidChNum+1, MAX_CHANNEL_NUM-1);
TV_SelectChannel( 0 );
devAudioSetVolume(g_VideoSetting.volume);
g_bTVAutoScanChannelEnable=FALSE;
g_bTVAutoScanChannelBreak = FALSE;
#if(ENABLE_CHECK_AUTO_H_TOTAL)
g_bEnableAutoHTotal = 0;
#endif
//Set_InputTimingChangeFlag();
printMsg("auto stop");
g_ucOsdCounter=g_VideoSetting.OsdTime; // Reset OSD time
Clr_AFCDisableFlag();
}
else // Continue doing auto scan ...
{
WORD wFreqResult;
WORD wVTotal;
DrawScanProgress(chData.wFreq);
wVTotal = msVDGetVTotal();
if(abs(wVTotal -g_wTVAutoScan_LastVTotal)>10)
{
ResetupMode();
g_wTVAutoScan_LastVTotal = wVTotal;
if( msVDGetVTotal() > 575 ) // 50Hz
{
g_VdInfo.ucVideoSystem = SIG_PAL;
g_ucSrcModeIndex = MD_720x576_50I;
msVDSetupMode( VD_VSYNC_50HZ|VD_FSC_4433, SIG_PAL );
}
else // 60Hz
{
g_VdInfo.ucVideoSystem = SIG_NTSC;
g_ucSrcModeIndex = MD_720x480_60I;
msVDSetupMode( VD_FSC_3579, SIG_NTSC );
}
g_InOutCtl.bInterlace = 1;
SetOutputTimingAndWindow( OUTPUT_SNOW );
}
if (!(msVDGetSyncStable(25, 30)))
{
chData.wFreq += TN_SCAN_STEP;//14;//
devTunerWrite(chData.wFreq);
}
else
{
msVDColorBurstHandler( VD_COLOR_BURST_HANDLER_RESET );
ResetupMode();
if(devTunerAutoTuneFreq(chData.wFreq , &wFreqResult) == TN_SCAN_ERR)
chData.wFreq += 6;
}
if(g_bSaveChannel)
{
g_wTVAutoScan_LastVTotal = 0;
chData.wFreq = wFreqResult;
SaveChannelData(g_ucTVChannelAutoScanCount, &chData);
g_TVChSetting.ucMaxValidChNum=g_ucTVChannelAutoScanCount;
if (g_ucTVChannelAutoScanCount == MAX_CHANNEL_NUM)
g_bTVAutoScanChannelBreak = TRUE;
else
g_ucTVChannelAutoScanCount++;
chData.wFreq += TN_SCAN_NEXT_CH; // set next channel
devTunerWrite(chData.wFreq);
//Delay1ms(20);
SystemDelay_translate_To_Dsp_Processor(2);
g_bSaveChannel = FALSE;
}
if( chData.wFreq> TN_FREQMAX )
g_bTVAutoScanChannelBreak = TRUE;
}
}
void TV_ChannelManualScanInit(void)
{
ChannelScanInit(); //for manual scan
if(g_bManualScanDirection)
chData.wFreq +=TN_SCAN_NEXT_CH;//STEP_200K; //
else
chData.wFreq -=TN_SCAN_NEXT_CH;//STEP_200K; //
g_bTVManualSearchEnable=TRUE;
#if(ENABLE_CHECK_AUTO_H_TOTAL)
g_bEnableAutoHTotal = 1;
#endif
}
void TV_ChannelManualScan(void)
{
WORD wFineTuneFreq;
BYTE Tmp;
if(chData.wFreq>TN_FREQMAX&&g_bManualScanDirection)
chData.wFreq=TN_FREQMIN;
else if(chData.wFreq<TN_FREQMIN&&!g_bManualScanDirection)
chData.wFreq=TN_FREQMAX; // check stop condition
if(g_bTVManualScanChannelBreak)
{
g_bTVManualStore = TRUE;
g_bSaveChannel = FALSE;
g_bTVManualSearchEnable = FALSE;
g_bTVManualScanChannelBreak = FALSE;
g_ucOsdCounter=g_VideoSetting.OsdTime; // Reset OSD time
#if(ENABLE_CHECK_AUTO_H_TOTAL)
g_bEnableAutoHTotal = 0;
#endif
Clr_AFCDisableFlag();
return;
}
DrawScanProgress(chData.wFreq);
devTunerWrite( chData.wFreq );
if (!(msVDGetSyncStable(25, 30)))
{
if ( g_bManualScanDirection )
chData.wFreq += TN_SCAN_STEP; // next
else // if (cStep < 0)
chData.wFreq -= TN_SCAN_STEP; // next
devTunerWrite(chData.wFreq);
}
else
{
Tmp = devTunerAutoTuneFreq(chData.wFreq , &wFineTuneFreq);
if(Tmp == TN_SCAN_ERR)
{
if ( g_bManualScanDirection )
chData.wFreq += 5; // next
else // if (cStep < 0)
chData.wFreq -= 5; // next
}
else
{
chData.wFreq = wFineTuneFreq;
g_bTVManualScanChannelBreak = TRUE;
devTunerWrite(chData.wFreq);
Set_InputTimingChangeFlag();
}
}
}
void ResetTuner(void)
{
devTunerWrite(chData.wFreq);
}
WORD GetTVScale100Value(WORD value, WORD minValue, WORD maxValue)
{
maxValue=maxValue-minValue;
value=value-minValue;
if (value>650)
{
value/=2;
maxValue/=2;
}
value=((DWORD)value*100+maxValue/2)/maxValue;//modify word---->dword for tv search ,tzw
return value;
}
void DrawChannelFreqGuage( WORD wFreq ,BYTE foreColor)
{
BYTE *str;
WORD MinValue,MaxValue,TEMPVALUE;
TEMPVALUE=(WORD) wFreq;
if(TEMPVALUE < TN_LOWBAND_END)
{
MinValue=TN_FREQMIN;
MaxValue=TN_LOWBAND_END;
str="VHFL";
}
else if(TEMPVALUE < TN_MIDBAND_END)
{
MinValue=TN_LOWBAND_END;
MaxValue=TN_MIDBAND_END;
str="VHFH";
}
else
{
MinValue=TN_MIDBAND_END;
MaxValue=TN_FREQMAX;
str=" UHF";
}
Osd_SetTextColor(CP_WhiteColor,CP_GrayColor);
Osd_DrawStr(13,6, str);
Osd_SetTextColor(foreColor,CP_GrayColor);
Osd_DrawGuage(0, 9, 15, GetTVScale100Value(TEMPVALUE,MinValue,MaxValue));
}
void DrawScanProgress( WORD wFreq )
{
Osd_SetTextColor(CP_BlueColor,CP_TransparenceColor);
DrawNum(7, 0, 3, wFreq/STEPS_1M);
DrawNum(11, 0, 2, wFreq%STEPS_1M*5);
if(wFreq%STEPS_1M>1)
Osd_DrawChar(11,0,'.');
else
Osd_DrawStr(11,0, ".0");
DrawChannelFreqGuage( wFreq ,CP_RedColor);
}
void TV_ChannelInit(void)
{
g_TVChSetting.ucPreChannelNO=g_TVChSetting.ucCurChannelNO;
//g_TVChSearchStartData=TN_FREQMIN;
if (IsTVInUse())
Set_ChannelChangFlag();
Set_ShowSourceFlag();
}
void ChannelSwap(BYTE sourcechannel ,BYTE goalchannel)
{
StuChannelData chDatatemp;
ReadTVChannelInfo(sourcechannel,TRUE);
chDatatemp=chData;
ReadTVChannelInfo(goalchannel,TRUE);
SaveTVChannelInfo(sourcechannel, TRUE);
chData=chDatatemp;
SaveTVChannelInfo(goalchannel, TRUE);
ResetTuner();
Set_InputTimingChangeFlag();
}
void ReDrawProgram(BOOL flag)
{
if(flag)
{
Osd_SetTextColor(CP_GrayColor,CP_GrayColor);
Osd_DrawStr(2,7, strProgramText[g_VideoSetting.Language]);
Osd_DrawNum(13, 7, g_ucTVChannelAutoScanCount);
g_bProgramFlash=FALSE;
}
else
{
Osd_SetTextColor(CP_WhiteColor,CP_GrayColor);
Osd_DrawStr(2,7, strProgramText[g_VideoSetting.Language]);
Osd_DrawNum(13, 7, g_ucTVChannelAutoScanCount);
g_bProgramFlash=TRUE;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -