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

📄 osdmenu.c

📁 车载DVD osdIC TW8816原厂代码
💻 C
📖 第 1 页 / 共 3 页
字号:
// osdmenu.c

#include "Config.h"
#include "typedefs.h"
#include "main.h"
#include "i2c.h"
#include "Tw88.h"
#include "measure.h"
#include "dispinfo.h"
#include "osdbasic.h"
#include "osdmenu.h"
#include "adc.h"
#include "etc_eep.h"
#include "pc_eep.h"
#include "audio.h"
#include "printf.h"
#include "udfont.h"
#include "panel.h"
#include "rgbmix.h"		// for TW8801
#ifdef SUPPORT_TV
#include "Tuner.h"
#endif

static  WORD	OSDItemValue;
//static  BYTE	OSDDuration;

static  BYTE	title_item, cursor_item, /*cursor_y,*/  cur_osdwin, /*cur_osdaddr,*/ val_osdwin=0xff, 
						val_index=0;

static	BYTE	OSDMenuX, OSDMenuY;/*ljy100303..., OSDZoom*/
static  BYTE	OSDLang=0;

static  BYTE    OSDMenuLevel;
	    bit     OnChangingValue = 0;
static  BYTE    OSDNumberString[5];

	    bit     displayOnValueWindow = 0;
#ifdef PAL_TV
		bit		ChannelEdit_Flag = 0;
		bit	    ChannelEdit_on = 0;
#endif

//extern  IDATA struct BarInfo BarInfo;
extern  CODE  struct struct_IdName struct_VInputStd[];
extern  CODE  struct struct_IdName struct_InputSelection[];
//extern  IDATA BYTE InputSelectionInx;
//extern	bit	  PowerMode ;
extern	bit   I2CAutoIncFlagOn ;
extern	BYTE  VInputStdDetectMode;
extern CODE BYTE Init_Osd_MainMenu[];
#ifdef ADD_ANALOGPANEL
extern CODE BYTE Init_Osd_MainMenu_A[];
#endif
extern  bit		DisplayInputHold;
extern	IDATA WORD  IVF;
extern	IDATA DWORD	IHF;
#ifdef PAL_TV
extern PDATA BYTE TVChannel;
extern IDATA WORD TVFreq;
#endif


struct MenuType   	CODE *MenuFormat;
struct RegisterInfo CODE *BarRange;
struct DefineMenu 	CODE *MenuTitle;
struct DefineMenu 	CODE *MenuChild;
struct DefineMenu	CODE *MenuStack[4];
static IDATA  BYTE MenuSP=0, MenuIndexStack[4];

#include "OSDString.h"
#include "menu.h"
#include "OSDOper.c"

//---------------------------------------------------------------------
// Push MenuTile, title_item in stack 
//      MenuTile[title_item][]...  
//
BYTE pushMenu(void)
{
	#ifdef DEBUG_OSD
	dPrintf("\r\n(pushMenu)-MenuSP:%d", (WORD)MenuSP);
	#endif
	if( MenuSP < sizeof( MenuIndexStack ) ) {
		#ifdef DEBUG_OSD
		{
			BYTE  **Desc;
			BYTE i;

			Desc = MenuTitle[title_item].Desc;
			for(i=0; i<OSDLang; i++)
				Desc += ( strlen(*Desc) + 1 );

			dPrintf("...MenuStack[%d]:Desc(%s)",(WORD)MenuSP, Desc);
		}
		#endif
		MenuStack[MenuSP] = MenuTitle;
		MenuIndexStack[MenuSP++] = title_item;
		return 1;
	}
	return 0;
}

BYTE popMenu(void)
{
	#ifdef DEBUG_OSD
	dPrintf("\r\n(popMenu)-MenuSP:%d", (WORD)MenuSP);
	#endif
	if( MenuSP ) {
		MenuTitle = MenuStack[--MenuSP];
		title_item = MenuIndexStack[MenuSP];
		#ifdef DEBUG_OSD
		{
			BYTE  **Desc;
			BYTE i;

			Desc = MenuTitle[title_item].Desc;
			for(i=0; i<OSDLang; i++)
				Desc += ( strlen(*Desc) + 1 );


			dPrintf("...MenuStack[%d]:Desc(%s)",(WORD)MenuSP, Desc);
		}
		#endif
		return 1;
	}
	return 0;
}		

BYTE GetLowerMenuItem( CODE_P struct DefineMenu *DMp, BYTE itemno )
{
	if( itemno==NIL )
		return NIL;
	itemno++;
	if( (DMp[itemno].IconColor==NIL) && (DMp[itemno].DescColor==NIL) )		// end
		return NIL;
	return itemno;

}

BYTE GetUpperMenuItem(  BYTE itemno )
{
	//if( itemno==0 || 
	if(	itemno==NIL )
		return NIL;
	itemno--;
	return itemno;
}

BYTE GetTargetChild( BYTE tid)
{
	BYTE i;


	if( MenuChild )		i = 0;
	else				i = NIL;

	
	#ifdef DEBUG_OSD
	dPrintf("\r\nTarget id:0x%x", (WORD)tid);
	#endif

	while( i != NIL ) {
		
		#ifdef DEBUG_OSD
		dPrintf("__ForActionId[%d]:0x%x", (WORD)i, (WORD)MenuChild[i].Id);
		#endif
		
		if ( ( MenuChild[i].Id & 0x0f ) == tid )
			return i;//break;
		i = GetLowerMenuItem(MenuChild, i );
	}

	return i;
}
/*
BYTE GetTargetChild1( BYTE tid)
{
	BYTE i;


	if( MenuChild )		i = 0;
	else				i = NIL;

	
	#ifdef DEBUG_OSD
	dPrintf("\r\nTarget id:0x%x", (WORD)tid);
	#endif

	while( i != NIL ) {
		
		#ifdef DEBUG_OSD
		dPrintf("__ForActionId[%d]:0x%x", (WORD)i, (WORD)MenuChild[i]. PreFnId);
		#endif
		
		if ( ( MenuChild[i]. PreFnId & 0x0f ) == tid )
			return i;//break;
		i = GetLowerMenuItem( MenuChild, i );
	}
	return i;
}
*/
//===============================================================================
//
//  Display Information of the menu
//
//===============================================================================
CODE BYTE OSDInfoStr[][26]={
	{ "Input  :                 " },
	{ "System :                 " },
	{ "H Freq :      kHz        " },	
	{ "V Freq :    Hz           " },
	{ "F/W Rev:       new       " }, 	
	{ "" }	
};
#define OSD_INFO_SUB_X	9

void DisplayInfo_OSD(void)
{
	BYTE i, title=1, len, inputs;
	BYTE mstr[5];

	pushMenu();
	MenuTitle = MenuChild;
	title_item = cursor_item;

	OSDMenuLevel++; 
	
	MenuChild = 0;
	cursor_item = NIL;

	DrawMenulist(1); // Display Title

	DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH, OSD_INFO_COLOR, 5*MENU_WIDTH );	 // Line 1 ~ Line 5
	for(i=0; OSDInfoStr[i][0]; i++) 
		WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(i+title), OSDInfoStr[i], MENU_WIDTH ); 

	// Display Input
	inputs = GetInputSelection();
	for (i=1; ;i++)
		if( struct_InputSelection[i].Id==inputs )  break;
	len=strlen(struct_InputSelection[i].Name);
	WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(0+title)+OSD_INFO_SUB_X, struct_InputSelection[i].Name, len ); 

	// Display ColorSystem
	#if defined( SUPPORT_PC ) || defined( SUPPORT_DTV )
	i = GetInputSelection();
	if( i==PC || i==DTV ){
		len=strlen(GetPCInputSourceName());
		WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(1+title)+OSD_INFO_SUB_X, GetPCInputSourceName(), len ); 
	}
	else
	#endif
	{
		len=strlen(struct_VInputStd[GetVInputStdInx()].Name);
		WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(1+title)+OSD_INFO_SUB_X, struct_VInputStd[GetVInputStdInx()].Name, len ); 
	}

	#if defined( SUPPORT_PC ) || defined( SUPPORT_DTV )
	//IHF
	MeasureAndWait(3);
	#endif

	ltoa_K(IHF, mstr, 1);
	len=strlen(mstr);
	WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(2+title)+OSD_INFO_SUB_X, mstr, len ); 

	utoa(IVF,mstr,10);
	len=strlen(mstr);
	WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(3+title)+OSD_INFO_SUB_X, mstr, len ); 

	//FWRev
	i = ReadEEP(EEP_FWREV_MAJOR);
	mstr[0] = i + '0';
	mstr[1] = '.';
	i = ReadEEP(EEP_FWREV_MINOR);
	mstr[2] = (i/0x10) + '0';
	mstr[3] = (i%0x10) + '0';
	mstr[4] = '\0';
	
	WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(4+title)+OSD_INFO_SUB_X, mstr, 4 ); 

}


//********************************************************************
//
//	Functions for BAR.
//
//********************************************************************
#define VOLBAR_LENGTH 21+3
void DisplayVolumebar(BYTE val)
{
	CODE BYTE BAR_ROM_TABLE[] = {
		0x01, // ...
		0x02,0x02, // |..
		0x05,0x05, // ||.
		0x03, // |
		0x04, // |||
	};

	BYTE i;
	BYTE Bar_str[VOLBAR_LENGTH]={ 0x04, 0x04, 0x04, 0x04, 0x04,
							   0x04, 0x04, 0x04, 0x04, 0x04,
							   0x04, 0x04, 0x04, 0x04, 0x04,
							   0x04, 0x04, 0x04, 0x04, 0x04, 0x03,' ',' ',' ' };
	WORD addr;
	
	if(val < 100)
	{
		Bar_str[val/5] = BAR_ROM_TABLE[val%5];
		for(i = val/5 + 1; i < 20; i++)
			Bar_str[i] = BAR_ROM_TABLE[0];
	}

	if( Bar_str[0] == 0x01 ) Bar_str[0] = 0x02;	// |..

	// Number
    Bar_str[23] = val % 10 + '0';    val /= 10;
    Bar_str[22] =  val % 10 + '0';    val /= 10;
    Bar_str[21] = val + '0';
	if( Bar_str[21] == '0' ) Bar_str[21] = ' ';

	addr = OSDMENU_BARADDR + 1 + VOLBAR_LENGTH;	// 

	WriteStringToAddr(addr, Bar_str, VOLBAR_LENGTH ); 

}

BYTE Get_cursor_item(BYTE id)
{
	BYTE i=NIL, tid;

	#ifdef DEBUG_OSD
	dPrintf("\r\n++(Get_cursor_item) id:%d", (WORD)id);
	#endif

	
	switch ( id ) {
	case INPUTSELECTION:	tid = GetInputSelection(); 
							break;

	default:				return 0;// The first one
	}

	i = GetTargetChild( tid );

	if( i==NIL ) {	//couldn't find
		dPuts("___Couldn't find cursor!!");
		i=0;
	}

	#ifdef DEBUG_OSD
	dPrintf("___Cursor:%d\r\n__(GetDefaultForChoiceMenu)", (WORD)i);
	#endif

	return i;
}

//==================================================================================================
// Func: DisplayOSDMenuOneItem
//
//
void DisplayOSDMenuOneItem( winno, CODE_P struct DefineMenu *DMp, BYTE x, BYTE y, BYTE NOTViewflag )
{
	BYTE i,j,k,IconColor;
	WORD addr;
	CODE_P BYTE *Str;
	CODE BYTE RightSign_str[]=	{ 0x1c,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',0 };// RIGHT mark

	#ifdef DEBUG_OSD
	dPrintf("\r\n++(DisplayOSDMenuOneItem) ");
	#endif

	if( cur_osdwin == OSDMENU_TOPWIN) addr = OSDMENU_MAINADDR;
	else addr = OSDMENU_SUBADDR;

	addr = addr + x + y*MenuFormat->width;

	#ifdef DEBUG_OSD
	dPrintf("\r\nStartaddr:%d", addr);
	#endif

	if( DMp->IconColor !=NIL ) {		// Draw Icon
		//if(OnChangingValue) IconColor = BG_COLOR_BLACK|CH_COLOR_WHITE|EXTENDED_COLOR; 
		//else
			IconColor =  DMp->IconColor;

		Str = DMp->Icon;
		j=strlen(Str);
		WriteStringToAddr(addr, Str, j);

		x += ICON_CH_SZ;
	}

	if( DMp->DescColor !=NIL ) {		// Draw Desc.

		Str = DMp->Desc[OSDLang];
		j=strlen(Str);

		for( i=0,k=0; i<j; i++ )
			if( *(Str+i) == ROMFONT || *(Str+i) == RAMFONT ) k++;

		#ifdef DEBUG_OSD
		dPrintf("\r\naddr:%d x:%d y:%d MenuFormat->width:%d", addr, (WORD)x, (WORD)y, (WORD)MenuFormat->width );
		#endif

		WriteStringToAddr(addr, Str, j);

		if( (j-k ) < MAX_DESC ) 
			ClearDataCnt(addr+j-k, MAX_DESC-j+k);
	
		addr+=MAX_DESC;

	}

	if( OSDMenuLevel < 3) // Main Menu Item.
	 if ( NOTViewflag==1 )	return;	// In case of not need diplay contents. ex, BAR windows, top menu display.
	
	// Menu contents view
	/*if( x < (MenuFormat->width) )
		if( x <  (MAX_DESC + ICON_CH_SZ) ){
		//x+=2;
		ClearDataCnt(addr, 2);
		addr+=2;
	}*/

	switch (DMp->Type ) {
	case BAR:	// Draw Bar and Number value
		DisplayViewBar( addr, GetItemValue(DMp->Id));
		break;

	case NUMBER: // Draw Number value
		{
			CODE_P BYTE *ptr;
			ptr = DMp->TypeData;
			switch ( DMp->Id ) {
			#if defined( PAL_TV )
			case MANUAL_TUNE_CHANNEL:
				WriteStringToAddr(addr, RightSign_str, BARNUM_LENGTH); 
				break;
			#endif
			default:
				DrawNum( addr, (CODE_P struct NumType *)ptr, GetItemValue(DMp->Id) );
				break;
			}
		}
		break;
	case ENUM_STRING:		
		{
			CODE_P BYTE *ptr;

			ptr = DMp->TypeData;
			DrawStringByLang( addr, (CODE_P struct EnumType *)ptr, GetItemValue(DMp->Id) );

		}
		break;

	case NUMBER_STRING:
	case CHOICEMENU:
	case OSDMENU:
	case ACTION:
			WriteStringToAddr(addr, RightSign_str, BARNUM_LENGTH); 
			break;

	}
  
}

void ClearCursor(void)
{
	//BYTE cursor_x;
	BYTE cursor_y;
	WORD addr;

	if( cursor_item==NIL )
		return;

	//cursor_x = MenuFormat->CursorStart;
	cursor_y = cursor_item + ( MenuFormat->TitleColor ==NIL ? 0 : 1 );
	if( cur_osdwin == 4 ) addr = 0;
	else addr = 10;
	addr += cursor_y*MenuFormat->width;
	DrawAttrCnt(addr, DEFAULT_COLOR, MenuFormat->width );	

}

void DisplayCursor(void)
{
	BYTE cursor_y=0 ;
	WORD addr;

	if( cursor_item==NIL )
		return;
	
	cursor_y = cursor_item + ( MenuFormat->TitleColor ==NIL ? 0 : 1 );

	if( OSDMenuLevel == 1 ) addr = OSDMENU_MAINADDR;
	else addr = OSDMENU_SUBADDR;

	addr += cursor_y*MenuFormat->width;

	if( OSDMenuLevel == 1)
		DrawAttrCnt(addr, MenuFormat->CursorColor, MenuFormat->width );	
	else
	{
		if(OnChangingValue)
		{
			GetItemValue(GetItemValue(MenuChild[cursor_item].Id));
			DrawAttrCnt(addr, MenuFormat->CursorColor, MenuFormat->width );	
		}
		else
		{
			DrawAttrCnt(addr, MenuFormat->CursorColor, MenuFormat->width-BARNUM_LENGTH );	
			DrawAttrCnt(addr+MAX_DESC, DEFAULT_COLOR, BARNUM_LENGTH );	
		}
	}	

}


//===============================================================================
//  OSD Menu Operation funtion moved to "OSDoper.c" by RYU.
// 
//===============================================================================

WORD GetItemValue( BYTE id)
{
	WORD val=0;

	#ifdef DEBUG_OSD
	dPrintf("\r\n++(GetItemValue) id:0x%x __", (WORD)id);
	#endif

	switch( id ) {
	//case SYSTEM_CLOCK:	val = GetSystemClock_HM();			break;
	//case WAKEUP_TIME:		val = OSDItemValue = GetWakeupTime();	break;
	//case OFF_TIME:		val = OSDItemValue = GetOffTime();		break;
	case SLEEP_TIMER:		val = OSDItemValue = GetSleepTimer();	break;

#ifdef SUPPORT_OSDPOSITIONMOVE
	case OSDPOSITIONMODE:   val = GetOSDPositionMode();				break;
	//case OSD_VPOS:			val = GetOSDMenuYValue();				break;
	//case OSD_HPOS:			val = GetOSDMenuXValue();				break;
#endif
//	case OSD_DURATION:		val = GetOSDDurationValue();			break;
	case OSDLANG:			val = OSDLang & 0x0f;					break;

	#ifdef SUPPORT_PC
	case PANEL_CONTRAST:	val = OSDItemValue = GetPanelContrastEE();				break;
	case PANEL_BRIGHTNESS:	val = OSDItemValue = GetPanelBrightnessEE();			break;

	case PC_VPOS:			val = GetVPosition();					break;
	case PC_HPOS:			val = GetHPosition();					break;
	case PC_CLOCK:			val = GetCoarseValue();					break;
	case PC_PHASE:			val = GetPhaseCurrent();				break;

	case PC_COLOR_TEMP:		val = GetPCColorTempModeEE();			break;
	case PC_COLOR_R:		val = GetPCColorTemp(RED);				break;	
	case PC_COLOR_G:		val = GetPCColorTemp(GREEN);			break;	
	case PC_COLOR_B:		val = GetPCColorTemp(BLUE);				break;	
	#endif


	case VIDEO_MODE:		val = GetVideoModeEE();					break;

	case VIDEO_CONTRAST:	
	case VIDEO_BRIGHTNESS:	
	case VIDEO_SATURATION:	
	case VIDEO_HUE:			
	case VIDEO_SHARPNESS:	
							val = GetVideoDatawithOffset(id -VIDEO_CONTRAST);	break; // changed wrong offset value // Hans
	case VIDEO_BACKLIGHT:	
							val = GetVideoDatawithOffset(backlight);	break; // changed wrong offset value // Hans

	case AUDIO_VOLUME:		val = GetAudioVol();					break;
#ifdef SUPPORT_MSP_AUDIO
	case AUDIO_BALANCE:		val = GetAudioBalance();				break;
	case AUDIO_BASS:		val = GetAudioBass();					break;
	case AUDIO_TREBLE:		val = GetAudioTreble();					break;
	//case AUDIO_EFFECT:		val = GetAudioEffect();					break;
	//case AUDIO_MUTE:		val = IsAudioMuteOn();					break;
#endif

#ifdef SUPPORT_TV
	#ifdef NTSC_TV

⌨️ 快捷键说明

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