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

📄 dispinfo.c

📁 车载DVD osdIC TW8816原厂代码
💻 C
字号:
//
#include "Config.h"

#include "typedefs.h"
#include "main.h"

#include "osdbasic.h"
#include "printf.h"

#include "osdmenu.h"
#include "dispinfo.h"
#include "tw88.h"
#include "i2c.h"
#include "etc_eep.h"
#include "audio.h"
#include "measure.h"
#include "pc_eep.h"
#include "RegMap.h"
#include "panel.h"
#ifdef SUPPORT_TV
#include "tuner.h"
#endif

//----------------------------------------------------------------------
//extern  CODE  BYTE InputSelectionString[][16];
extern  CODE  struct struct_IdName struct_InputSelection[];
extern  CODE  struct struct_IdName struct_VInputStd[];

static	DATA WORD  OSDDisplayedTime;		//in ms
static  IDATA BYTE  DisplayedOSD = 0;
//	    DATA BYTE  DisplayedOSD = 0;
//extern	IDATA struct BarInfo BarInfo;
extern  bit   TVChManual;
extern  bit		DisplayInputHold;

extern	BYTE	DummyChannel;
#ifdef SUPPORT_COMPONENT
extern IDATA BYTE  ComponentMode;
#endif
extern CODE BYTE Init_Osd_DisplayLogo[];
extern CODE BYTE Init_Osd_DisplayInput[];
#ifdef ADD_ANALOGPANEL
extern CODE BYTE Init_Osd_DisplayLogo_A[];
extern CODE BYTE Init_Osd_DisplayInput_A[];
#endif

#if defined( PAL_TV )
CODE BYTE Init_Osd_BarWindow_pal[];
#endif
extern CODE BYTE Init_Osd_BarWindow[];
extern CODE BYTE Init_Osd_DisplayPCInfo[];
extern CODE BYTE *StrVolume[];

#ifdef PAL_TV
extern	bit	        ChannelEdit_Flag;
extern 	bit			ChannelEdit_on;
#endif

#ifdef TW9908
CODE BYTE TW9908String[]=	{ "   TW9908   "};
CODE BYTE TW9905String[]=	{ "   TW9905   "};
#endif

CODE BYTE TW8806String[]=	{ "   TW88X6   "};

CODE BYTE TechwellString[]=	{ "Techwell,Inc" };

CODE BYTE COMPONENT_STR[][15] = {
    "YPbPr 480i",	// 0
    "YPbPr 576i",	// 1
    "YPbPr 480p",	// 2
    "YPbPr 576p",	// 3
    "YPbPr 1080i",	// 4
    "YPbPr 720p",	// 5
	"YPbPr 720p50",	
    "YPbPr 1080i50",
};
//================================================================
//					Display information
//================================================================
void DisplayLogo(void)
{
	BYTE CODE *str;
	//ClearOSDInfo();

	#ifdef TW9908
	if( (ReadDecoder(0) & 0xf8) == 0x28 ) str = TW9905String;
	else                                  str = TW9908String;
	#else
	str = TW8806String;
	#endif

	InitOSDWindow(Init_Osd_DisplayLogo);
	#ifdef ADD_ANALOGPANEL
	if(IsAnalogOn())
		InitOSDWindow(Init_Osd_DisplayLogo_A);
	#endif
	
	ClearDataCnt(LOGO_ADDR, 12*2); // Total 12*2 Char.

	DrawAttrCnt(LOGO_ADDR, CH_COLOR_WHITE, 12 );	 
	DrawAttrCnt(LOGO_ADDR+12, CH_COLOR_RED, 12 );

	WriteStringToAddr(LOGO_ADDR, str, 12);
	WriteStringToAddr(LOGO_ADDR+12*1, TechwellString,12);

	ShowOSDWindow(TECHWELLOGO_OSDWIN,TRUE);
	
}

void ClearLogo(void)
{
	ShowOSDWindow(TECHWELLOGO_OSDWIN,FALSE);
	#ifdef DEBUG_OSD
	dPrintf("\r\n++(ClearLogo)");
	#endif
}


void ClearDisplayedOSD( BYTE newd )
{
	DisplayedOSD &= (~(newd));
}

void SetDisplayedOSD( BYTE newd )
{
	DisplayedOSD |= newd;
}

BYTE GetDisplayedOSD(void)
{
	return DisplayedOSD;
}

void ClearOSDInfo(void)
{
	BYTE dt;

	dt = GetDisplayedOSD(); 
	#ifdef DEBUG_OSD
	dPrintf("\r\n++(ClearOSDInfo): DisplayedOSD:%2x",(WORD) GetDisplayedOSD());
	#endif
	#ifdef SUPPORT_PC
	if( dt & PCINFO)		ClearPCInfo();
	#endif

	if( (dt & TVVOL) || ( dt & TVCHN) )	ClearTVInfo();

	if( dt & MUTE )			ClearMuteInfo();
	if( dt & INPUTINFO )	ClearInput();
	if( dt & MENU )			CloseOSDMenu();
}

void DisplayInput(void)
{
	BYTE	inputs, len1, len2,i, SystemAddr;
	#ifdef SUPPORT_COMPONENT
	BYTE CODE 	*Str;
	#endif
	
	#ifdef ADD_ANALOGPANEL
	if(IsAnalogOn())
		SystemAddr=INPUTINFO_ADDR+17;
	else
	#endif
	SystemAddr=INPUTINFO1_ADDR;

	if( (DisplayedOSD & INPUTINFO ) && DisplayInputHold ) return;
	#ifdef DEBUG_OSD
 	dPrintf("\r\n++(DisplayInput)");
	#endif

	ClearOSDInfo();

	inputs = GetInputSelection();

	#if defined( SUPPORT_PC ) || defined( SUPPORT_DTV )
	if( inputs==PC || inputs==DTV )
		len2 = strlen( GetPCInputSourceName() );
	else
	#endif
	#ifdef SUPPORT_COMPONENT
	if( inputs==COMPONENT ){
		Str = COMPONENT_STR[((ReadDecoder(CVFMT)&0x70)>>4)];
		len2 = strlen(Str);
	}
	else
	#endif
		len2 = strlen( struct_VInputStd[GetVInputStdInx()].Name );


	for (i=1; ;i++)
		if( struct_InputSelection[i].Id==inputs )  break;

	len1 = strlen(struct_InputSelection[i].Name);

	InitOSDWindow(Init_Osd_DisplayInput);
	#ifdef ADD_ANALOGPANEL
	if(IsAnalogOn())
		InitOSDWindow(Init_Osd_DisplayInput_A);
	#endif
	ClearDataCnt(INPUTINFO_ADDR, 51); // Total 42 Char.
	DrawAttrCnt(INPUTINFO_ADDR, DEFAULT_COLOR, 51 );	
	WriteStringToAddr(INPUTINFO_ADDR, struct_InputSelection[i].Name, len1); 

	#if defined( SUPPORT_PC ) || defined( SUPPORT_DTV )
	if( inputs==PC || inputs==DTV )
		WriteStringToAddr(SystemAddr, GetPCInputSourceName(), len2); 
	else
	#endif
	#ifdef SUPPORT_COMPONENT
	if( inputs==COMPONENT ){
		//i = IsNoInput();
		//Printf("\r\n Display Info==> Component Noinutcheck: %d ", (WORD)i );
		if( IsNoInput() == 0 ) WriteStringToAddr(SystemAddr, Str, len2); 
	}
	else
	#endif
	{
		if( IsNoInput() == 0 ) 
		WriteStringToAddr(SystemAddr, struct_VInputStd[GetVInputStdInx()].Name, len2); 
	}

	ShowOSDWindow(INPUTINFO_OSDWIN-1,TRUE);
	ShowOSDWindow(INPUTINFO_OSDWIN,TRUE);
	ShowOSDWindowAll(1);

	DisplayedOSD |= INPUTINFO;
	OSDDisplayedTime = GetTime_ms();	
}

BYTE ClearInput(void)
{
		
	ShowOSDWindowAll(0);
	ShowOSDWindow(INPUTINFO_OSDWIN-1,FALSE);
	ShowOSDWindow(INPUTINFO_OSDWIN,FALSE);

	DisplayedOSD &= (~(INPUTINFO));
	#ifdef DEBUG_OSD
	dPrintf("\r\n++(ClearInput)");
	#endif

	return 1;
//	ClearBlending();
}

void DisplayVol(void)
{
	BYTE CODE *Str ;
	BYTE len;

	#ifdef DEBUG_OSD
	dPuts("\r\n++(DisplayVol)");
	#endif
	
	if(( DisplayedOSD & TVVOL ) == 0 ) 
	{

	ClearOSDInfo();
	Change_OSDColorLookup();
	delay(10);


	InitOSDWindow(Init_Osd_BarWindow);

	ClearDataCnt(OSDMENU_BARADDR, 50); // Total 25*2 Char.
	DrawAttrCnt(OSDMENU_BARADDR, BG_COLOR_CYAN | CH_COLOR_WHITE, 25 );	 
	DrawAttrCnt(OSDMENU_BARADDR+25, BG_COLOR_WHITE | CH_COLOR_CYAN, 25 );

	Str = StrVolume[GetOSDLang()];
	len=CStrlen(Str);
	WriteStringToAddr(OSDMENU_BARADDR, Str, len);  

	ShowOSDWindow(OSDBARWINDOW,TRUE);
	ShowOSDWindowAll(1);

	}
	DisplayVolumebar(GetAudioVol());

	DisplayedOSD |= TVVOL;
	OSDDisplayedTime = GetTime_ms();

}

void DisplayMuteInfo(void)
{
	BYTE CODE	*Str ;
	BYTE len;
	extern CODE BYTE Init_Osd_DisplayMuteInfo[];
	extern CODE BYTE *MuteOnStr[];

	ClearOSDInfo();
	InitOSDWindow(Init_Osd_DisplayMuteInfo);

	Str = MuteOnStr[GetOSDLang()];
	len = strlen(Str);
	WriteStringToAddr(MUTEINFO_ADDR, Str, len);  
	DrawAttrCnt(MUTEINFO_ADDR, BACK_COLOR|CH_COLOR_RED, len );	 

	ShowOSDWindow(TVINFO_OSDWIN,TRUE);
	ShowOSDWindowAll(1);
	DisplayedOSD |= MUTE;
}

void ClearMuteInfo(void)
{
	ShowOSDWindow(TVINFO_OSDWIN,FALSE);
	DisplayedOSD &= (~(MUTE));
}

BYTE CheckAndClearOSD(void)
{
	WORD	ctime,  stime, diff;
	BYTE	dt;
	BYTE	Result=0;

	//return 1;
	dt = GetDisplayedOSD();
	if ( dt & ( MENU | INPUTINFO | TVCHN | TVVOL /*| LOGO*/ ) ) {

		if( dt & MENU )	{ 
			stime = GetOSDLastKeyInTime();	
			diff =  20 * 100; //GetOSDDuration()
		}
		else { 
			stime = OSDDisplayedTime;	
			diff = 2 * 100;	
			#ifdef SUPPORT_TV
			if( TVChManual ) diff = 150; //100		
			#endif
		}
	
		ctime = GetTime_ms();			

		if( DiffTime_ms( stime, ctime ) >= diff ) {

			#ifdef DEBUG_OSD
			if( !(dt & MENU) ) {
				dPrintf("\r\n(CheckAndClearOSD)DisplayedOSD:0x%x, ", (WORD)dt);
				dPrintf("starttime:%d, currtime:%d", stime, ctime);
			}
			#endif

			//if( dt & LOGO )			ClearLogo();
			if( !DisplayInputHold )
				if( dt & INPUTINFO )	Result = ClearInput();
			if( dt & TVVOL )		Result = ClearTVInfo();

			if( dt & MENU )			Result = CloseOSDMenu();  

			#ifdef SUPPORT_TV
			ChannelEdit_Flag = 0;
			ChannelEdit_on = 0;	
			
			if( dt & TVCHN ){ 
				if(TVChManual)
				ChangeTVChannel( DummyChannel );
				else
				Result = ClearTVInfo();
			}
			#endif

			if( Result == 1){
				if( DisplayInputHold ) DisplayInput();
				else {

					if( IsAudioMuteOn() )	DisplayMuteInfo();
				}
			}
			return 1;
		}
	}

	return 0;
}

#if defined( SUPPORT_PC ) || defined (SUPPORT_TV)

void SetWindowStart(WORD x, WORD y)
{
	WriteDecoder(TW88_WINSTART_HI, (x>>8) | ((y>>8)<<4));
	WriteDecoder(TW88_WINXSTART, (BYTE)x);
	WriteDecoder(TW88_WINYSTART, (BYTE)y);
}
#endif

#if defined( SUPPORT_PC ) || defined( SUPPORT_DTV )

void SetWindowWidth(BYTE width)
{
	WriteDecoder(TW88_WINWIDTH, width);
}

void DisplayPCInfo(BYTE CODE *ptr)
{
	WORD xstart, ystart;
	BYTE len;

	#ifdef DEBUG_PC
	dPrintf("\r\n==== DisplayPCInfo (%s) ====", ptr);
	#endif

	Clear_bypass();								// HHY 1.52

	AutoPHPCalDisable();
	SetPHP( GetPHR() + 0x100 ); // for Sharp-NoTicon by RYU-101205	// Set PHP

	PanelFreeRun(1);							// FreeRun
	WriteDecoder(0x06, 0x80);		// Soft Reset

	ClearOSDInfo();

	len  = strlen(ptr);

	xstart = ( PHR_ - len*PCINFO_ZOOM*FONT_WIDTH ) / 2;
	ystart =  PVR_ / 3;
	
	InitOSDWindow(Init_Osd_DisplayPCInfo);
	SetWindowStart(xstart, ystart);
	SetWindowWidth(len);

	ClearDataCnt(PCMEASUREINFO_ADDR, len);
	DrawAttrCnt(PCMEASUREINFO_ADDR, CH_COLOR_RED,len);	 

	WriteStringToAddr(PCMEASUREINFO_ADDR, (BYTE CODE *)ptr, len);
	ShowOSDWindow(PCINFO_OSDWIN,TRUE);
	ShowOSDWindowAll(1);
	
	DisplayedOSD |=PCINFO;

}

void ClearPCInfo(void)
{
	if( !(DisplayedOSD & PCINFO) )		return;			//ljy070803

	DisplayedOSD &= (~(PCINFO));
	ShowOSDWindow(PCINFO_OSDWIN,FALSE);
	dPuts("\r\n== ClearPCInfo ==");

//	PanelMute(0);								// HHY 1.63
}

extern CODE BYTE AutoAdjustInfo[]; 

void DisplayAutoAdjust(void)
{
	InitOSDWindow(Init_Osd_BarWindow);
	ClearDataCnt(OSDMENU_BARADDR, 50); // Total 25*2 Char.
	DrawAttrCnt(OSDMENU_BARADDR, BG_COLOR_CYAN | CH_COLOR_WHITE, 50 );	 
	WriteStringToAddr(OSDMENU_BARADDR, AutoAdjustInfo, 25);

	ShowOSDWindow(OSDBARWINDOW,TRUE);
	ShowOSDWindowAll(1);
}
void ClearAutoAdjust(void)
{
	ShowOSDWindow(OSDBARWINDOW,FALSE);
}

#endif	// SUPPORT_PC

//==================================================================
//						TV Info
//==================================================================
#ifdef SUPPORT_TV

#define TVCHN_WIDTH	3

void DisplayTVChannel(BYTE chn, BYTE Chcolorflag )
{
	extern CODE BYTE Init_Osd_DisplayTVChannel[];

	BYTE len, str[5];
	BYTE Char_Color = CH_COLOR_GREEN;
	WORD xstart, ystart;

	DisplayedOSD &= ~TVCHN;
	ClearOSDInfo();

	if     ( chn <10 )   len = 1;
	else if( chn <100 )  len = 2;
	else                 len = 3;

	if( (IsSavedCurChn()==0) && (Chcolorflag)) Char_Color = CH_COLOR_RED;  // Not Saved Channel

	utoa( (WORD)chn, str, 10);
	len = strlen(str);

	xstart = PHR_ - len*TVCHN_ZOOM*FONT_WIDTH-10;
	ystart =  0;
	
	InitOSDWindow(Init_Osd_DisplayTVChannel);
	ClearDataCnt(TVCHINFO_ADDR, TVCHN_WIDTH);
	DrawAttrCnt(TVCHINFO_ADDR, BACK_COLOR|Char_Color, TVCHN_WIDTH );	 
	
	SetWindowStart(xstart, ystart);

	WriteStringToAddr(TVCHINFO_ADDR, str, len);  

	ShowOSDWindow(TVINFO_OSDWIN,TRUE);
	ShowOSDWindowAll(1);

	DisplayedOSD |= TVCHN;
	OSDDisplayedTime = GetTime_ms();			//GetTic();
}

#if defined( PAL_TV )
							//012345678901234
CODE BYTE ScanTVInfo1[]=	{"Auto Scanning ...        "};
CODE BYTE ScanTVInfo2[]=	{"Freq:             CH:       "};
CODE BYTE ScanTVInfo3[]=	{"Press MENU button to stop"};

#define SCANTV_CHN_FREQ_POS		 30
#define SCANTV_CHN_POS		 46

void DisplayScanTV(void)
{
	InitOSDWindow(Init_Osd_BarWindow_pal);

	DrawAttrCnt(OSDMENU_BARADDR, BG_COLOR_CYAN | CH_COLOR_WHITE, 25 );	 // All Line Attr clear by default color.
	DrawAttrCnt(OSDMENU_BARADDR+25, BG_COLOR_WHITE | CH_COLOR_CYAN, 25 );	 // All Line Attr clear by default color.
	DrawAttrCnt(OSDMENU_BARADDR+50, BG_COLOR_CYAN | CH_COLOR_WHITE, 25 );	 // All Line Attr clear by default color.

	WriteStringToAddr(OSDMENU_BARADDR, ScanTVInfo1, 25);  // 25: width
	WriteStringToAddr(OSDMENU_BARADDR+25, ScanTVInfo2, 25);  // 25: width
	WriteStringToAddr(OSDMENU_BARADDR+50, ScanTVInfo3, 25);  // 25: width

	ShowOSDWindow(OSDBARWINDOW,TRUE);
	ShowOSDWindowAll(1);
}
void DisplayChannelFreq(BYTE *ptr)
{
	BYTE len;
	len = strlen(ptr);
	WriteStringToAddr(OSDMENU_BARADDR+SCANTV_CHN_FREQ_POS, ptr, len);
}

#else // PAL_TV else
							//012345678901234
CODE BYTE ScanTVInfo1[]=	{"Auto Scanning ...        "};
CODE BYTE ScanTVInfo2[]=	{"Press MENU button to stop"};

#define SCANTV_CHN_POS		 21

void DisplayScanTV(void)
{
	InitOSDWindow(Init_Osd_BarWindow);

	DrawAttrCnt(OSDMENU_BARADDR, BG_COLOR_CYAN | CH_COLOR_WHITE, 25 );	 // All Line Attr clear by default color.
	DrawAttrCnt(OSDMENU_BARADDR+25, BG_COLOR_WHITE | CH_COLOR_CYAN, 25 );	 // All Line Attr clear by default color.

	WriteStringToAddr(OSDMENU_BARADDR, ScanTVInfo1, 25);  // 25: width
	WriteStringToAddr(OSDMENU_BARADDR+25, ScanTVInfo2, 25);  // 25: width

	ShowOSDWindow(OSDBARWINDOW,TRUE);
	ShowOSDWindowAll(1);
	SetDisplayedOSD( MENU ); // hans
}
#endif

void DisplayScanTVChannel(BYTE *ptr)
{
	BYTE len;
	len = strlen(ptr);
	WriteStringToAddr(OSDMENU_BARADDR+SCANTV_CHN_POS, ptr, len);
}

#ifdef PAL_TV
void DisplayManualScanTVProg(BYTE flag)
{
	CODE BYTE PlusDirection[] = { 0x1c, 0x1c, 0x1c, 0 };
	CODE BYTE MinusDirection[] = { 0x1b, 0x1b, 0x1b, 0 };

	WriteStringToAddr(OSDMENU_BARADDR+21, (flag==UP? PlusDirection:MinusDirection), 3);
}
#endif

void ClearScanTV(void)
{
	ShowOSDWindow(OSDBARWINDOW,FALSE);
}

#endif

BYTE ClearTVInfo(void)
{
	
	if( DisplayedOSD & TVVOL )
	{	ShowOSDWindow(OSDBARWINDOW, FALSE);
		DisplayedOSD &= (~(TVVOL));
	}
	else
	{
		ShowOSDWindow(TVINFO_OSDWIN, FALSE);
		DisplayedOSD &= (~(TVCHN));
	}
	return 1;
}

⌨️ 快捷键说明

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