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

📄 osdmenu.c

📁 车载DVD osdIC TW8816原厂代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		if( MenuChild[ cursor_item ].Id == VIDEO_MODE && GetVideoModeEE() != 3 ) return; // User

		new_cursor = GetNextCursorMenuItem( MenuChild, cursor_item, flag );	// Get item to move
		
		if( new_cursor ==NIL ) {		
			BYTE i;
			if( flag == UP )
				for(i=0; i<8; ){
					new_cursor=i;
					if( (i=GetLowerMenuItem(MenuChild, i) ) == NIL) break;
					
				}
				//new_cursor = MenuFormat->height - 1;
			else
				new_cursor = 0;
		}

		if( OnChangingValue )	{
			ClearValueWin();
		}
		if( OSDMenuLevel != 1) ClearCursor();

		old_cursor = cursor_item;
		cursor_item = new_cursor;
		if(OSDMenuLevel == 1)
		{ 
			WaitEndofDisplayArea();	
			dat = GetOSDWindowY(OSDCURSORWINDOW);
			dat += (cursor_item-old_cursor)*(0x0a);
			SetOSDWindowY_TW88(OSDCURSORWINDOW,dat);
			WriteDecoder(TW88_WINNUM, OSDCURSORWINDOW-1);
			WriteDecoder(TW88_WINSADDRLO, cursor_item*2);	

			DisplayOSDMenu();

		}
		else 	{
	
		if( MenuChild[ old_cursor ].Id == OSDLANG)
				DrawMenulist(0); //		Recover Attr. and menu Data list
			DisplayCursor();
		}
}

void OSDValueUpDn(BYTE flag)
{
	CODE_P BYTE *ptr;
	WORD val;
	WORD addr;
//	BYTE len1;

	addr = OSDMENU_SUBADDR;
	addr = addr + MAX_DESC + (cursor_item+1)*MenuFormat->width;

	switch ( MenuChild[cursor_item].Type ) {
	
	case BAR:	
				val = SetItemValue(MenuChild[cursor_item].Id, flag );
				DisplayViewBar( addr, val);
				break;
	
	case NUMBER:
				ptr = MenuChild[cursor_item].TypeData;
				switch ( MenuChild[cursor_item].Id ) {

				#ifdef PAL_TV	//-----------------------------------------------
				case MANUAL_TUNE_CHANNEL:
						ManualTune(flag);
						break;
				#endif					//-----------------------------------------------
				default:
						val = SetItemValue(MenuChild[cursor_item].Id, flag);
						DrawNum( addr, (CODE_P struct NumType *)ptr, val );
						break;
				}
				
				break;
	/*case TIME:
				//tptr = (CODE_P struct TimeType *)MenuChild[cursor_item].TypeData;
				//val = SetItemValue( (val_index==HOUR ? MenuChild[cursor_item].Id + 1 : MenuChild[cursor_item].Id ) , flag);
				//if( val_index == HOUR )
				//	DrawTime( val, tptr->CursorColor, tptr->TimeColor);
				//else
				//	DrawTime( val, tptr->TimeColor,   tptr->CursorColor);

				
				ptr = MenuChild[cursor_item].TypeData;
				val = SetItemValue( (val_index==HOUR ? MenuChild[cursor_item].Id + 1 : MenuChild[cursor_item].Id ) , flag);
				if( val_index == HOUR )
					DrawTime( val, 
					((CODE_P struct TimeType *)ptr)->CursorColor, 
					((CODE_P struct TimeType *)ptr)->TimeColor);
				else
					DrawTime( val, 
					((CODE_P struct TimeType *)ptr)->TimeColor,   
					((CODE_P struct TimeType *)ptr)->CursorColor);
				break;
	*/
	case ENUM_STRING:
				ptr = MenuChild[cursor_item].TypeData;
				val = SetItemValue( MenuChild[cursor_item].Id , flag);
				DrawStringByLang( addr, (CODE_P struct EnumType *)ptr, val );
				break;
	
	default:	break;
	}
}

BYTE CloseOSDMenu(void)
{
	BYTE i;
	extern IDATA BYTE PcMode;

	ShowOSDWindowAll(0);  // TW8806B

	//ClearOSD();
	WaitEndofDisplayArea();	
	for (i=OSDCURSORWINDOW; i<=OSDMENU_TITLEWIN ;i++ )
	{
		SetOSDWindowNum(i);
		WriteDecoder(TW88_WINATTR, 0x00);
	}

	ClearDisplayedOSD (MENU);
/*
#ifdef SUPPORT_PC
	// If PC mode is unknown, display outof range	// HHY 7/25/05
	if( GetInputSelection()==PC || GetInputSelection()==DTV ) {
		if( PcMode==EE_PC_UNKNOWN ) {
			//DisplayPCInfo(OutOfRangeStr[GetOSDLang()]);
			ShowOSDWindow(PCINFO_OSDWIN,TRUE);
			ShowOSDWindowAll(1);
			SetDisplayedOSD(PCINFO);
		}
	}
#endif //
*/
	return 1;
}
#ifdef SUPPORT_OSDPOSITIONMOVE
void InitOSDMenuXY(void)
{
	int val, addx, addy;
	BYTE winno;

	addx = OSDMenuX - OSDMenuXRange.Default;
	addy = OSDMenuY - OSDMenuYRange.Default;

	#ifdef DEBUG_OSD
	dPrintf("\r\nOSDMenuX:%d, OSDMenuY:%d", (WORD)OSDMenuX, (WORD)OSDMenuY);
	dPrintf("\r\nOSDMenuYRange.Min=%d", (WORD)OSDMenuXRange.Min);
	dPrintf("\r\nOSDMenuYRange.Max=%d", (WORD)OSDMenuXRange.Max);
	dPrintf("\r\nOSDMenuYRange.Default=%d", (WORD)OSDMenuXRange.Default);
	dPrintf("\r\nOSDMenuX - OSDMenuXRange.Default=%d", (WORD)addx);
	#endif

	for( winno=OSDCURSORWINDOW; winno<=OSDMENU_TITLEWIN; winno++) {

		val = GetOSDWindowX( winno );
		SetOSDWindowX(winno,val+addx);

		val = GetOSDWindowY( winno );
		SetOSDWindowY(winno,val+addy);
	}
}
#endif
void OpenOSDMenu(void)
{
	BYTE i;

	ClearOSDInfo();
	{ // TW8806 
		InitOSDMenu();		// reset OSD window and prepare menu
		Change_OSDColorLookup();
	}

	for(i=OSDCURSORWINDOW; i<=OSDMENU_TITLEWIN; i++) {
		ShowOSDWindow_TW88(i,TRUE);
	}

	ShowOSDWindowAll(1);
	SetDisplayedOSD( MENU );

}

void InitOSDMenu()
{
	extern CODE BYTE OSDPOSITIONMODE_TABLE[][2] ;
	BYTE i=0;

	OSDLang = GetOSDLangEE();

	switch( GetInputSelection() ) {

	#ifdef SUPPORT_TV
	case TV:	MenuTitle = DefaultMenu;	break;
	#endif

	#ifdef SUPPORT_PC
	case PC:	MenuTitle = PCMenu;			break;
	#endif

	//#ifdef SUPPORT_DTV
	//case DTV:	MenuTitle = DTVMenu;		break;
	//#endif 

	default:	MenuTitle = DefaultMenu;	break;
	}

	MenuSP = 0;								// Clear stack of menu.
	title_item = 0;
	MenuFormat = ( CODE_P struct MenuType *) MenuTitle[title_item].TypeData;

	OSDMenuLevel = 1; // OSD menu tree level
	cur_osdwin = OSDMENU_TOPWIN;

	MenuChild = MenuTitle[title_item].Child;
	cursor_item = 0;
	
	val_osdwin = 0xff;
	val_index = 0;
	OnChangingValue = 0;

	//--- OSD Window Initialization
	#ifdef ADD_ANALOGPANEL
	if(IsAnalogOn())
		InitOSDWindow(Init_Osd_MainMenu_A);
	else	
	#endif
	InitOSDWindow(Init_Osd_MainMenu);  // Define Window Top(4), Sub(3), Bar(2), Cursor(1) 

	//--- Positioning 
	#ifdef SUPPORT_OSDPOSITIONMOVE
	i = GetOSDPositionModeEE();

	OSDMenuX = OSDPOSITIONMODE_TABLE[i][0];
	OSDMenuY = OSDPOSITIONMODE_TABLE[i][1];

	InitOSDMenuXY();	 // Default + Saved OSD Position
	#endif

	//--- Display OSD Menu
	DisplayOSDMenu(); 
}


void OSDHighMenu(void)
{
	if( OnChangingValue )
	{
		#ifdef PAL_TV
//		Printf("\r\nItemId = 0x%02x @@@", (WORD)MenuChild[cursor_item].Id);
		// clear manual scan menu // Hans
		if (MenuChild[cursor_item].Id == MANUAL_TUNE_CHANNEL) 
		{
			DoAction(EXITMENU);
			return;
		}
		#endif

		//OnChangingValue = 0;
		ClearValueWin();
//		DisplayCursor();
		DrawMenulist(0); //		Recover Attr. and menu Data list
		DisplayCursor();

		return;
	}
              displayOnValueWindow = 0;
		#ifdef PAL_TV
		if( ChannelEdit_Flag == 1 )
		{	// Recover Menu from Channel Edit 
			BYTE i;
			CODE_P BYTE *Str ;

			DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH, DEFAULT_COLOR, MENU_HEIGHT*MENU_WIDTH );	// Clear color
			ChannelEdit_Flag = 0;
			ChannelEdit_on = 0;

			Str = Str_Comments[OSDLang];
			i=strlen(Str);
			WriteStringToAddr(OSDMENU_SUBADDR+TITLE_MAX_DESC*8, Str, i);
			DrawAttrCnt(OSDMENU_SUBADDR+TITLE_MAX_DESC*8, COMMENT_COLOR, MENU_HEIGHT );	// Clear color
		}
		#endif

	DoAction(MenuChild[cursor_item].PostFnId); // When exiting from the previous menu, Use to need some of action.

	if( OSDMenuLevel != 1) ClearCursor();
	OSDHighMenu_sub();
	
}


void OSDSelect(void)
{
	BYTE ret;
	WORD addr;

	if( cursor_item==NIL )			return;
	if( MenuChild[ cursor_item ].Id == TVINSTALL && GetInputSelection()!= TV )return;

	if( MenuChild[ cursor_item ].Id == VIDEO_HUE && ReadVInputSTD()!= NTSC && ReadVInputSTD()!= NTSC4 )  		return;
	//if( MenuChild[ cursor_item ].Id == VIDEO_SHARPNESS && GetInputSelection()== SCART )  		return;

	//do  {
		ret = DoAction(MenuChild[cursor_item].PreFnId);
		if(!ret) return;

		switch ( MenuChild[ cursor_item ].Type ) {
		case ACTION:
						DoAction(MenuChild[cursor_item].Id); // Action.
						return;

		case ENUM_STRING:		
		case BAR:
						OnChangingValue = 1; // Value changable label on 				
						DisplayCursor();	//Display Setect Item cursor
						GetItemValue(MenuChild[cursor_item].Id);
						return;
						
		case NUMBER:	
						OnChangingValue = 1;

						switch ( MenuChild[cursor_item].Id ) {
#ifdef SUPPORT_TV
						#if defined( PAL_TV )
						case MANUAL_TUNE_CHANNEL:
								ShowOSDWindow(OSDMENU_TOPWIN, FALSE); // Top(4)/Menu(3)/Top_Cursor(1) Window Off
								ShowOSDWindow(OSDMENUWINDOW, FALSE);
								ShowOSDWindow(OSDCURSORWINDOW, FALSE);
								ShowOSDWindow(OSDMENU_TITLEWIN, FALSE) ;
								DisplayScanTV();	
								DisplayTVFreq(TVFreq);
								DisplayScanChannel(TVChannel);		// Display Channel
						//delay(50);				
						break;
						#endif
						
#endif
						default:
								DisplayCursor();

						//		DrawNum( (CODE_P struct NumType *)ptr, GetItemValue(MenuChild[cursor_item].Id) );
								break;
						}
						return;

		case OSDMENU:
		case CHOICEMENU:
						if(OSDMenuLevel == 1) {
							addr = OSDMENU_MAINADDR + cursor_item*MenuFormat->width + 0;
							//DrawAttrCnt(addr, CURSOR_COLOR, 2);	// TOP Menu Icon Selected by color
							// 3D Effect Cursor Bottom
							WriteDecoder(TW88_WINNUM, OSDCURSORWINDOW-1);
							WriteDecoder(TW88_WINATTR, OSD_Window_Attr(WINDOW_3D_BOTTOM,BG_COLOR_BLACK|EXTENDED_COLOR,0,WINDOW_3D_ENABLE,WINDOW_ENABLE));	
						}

						OSDMenuLevel++;	// Down Menu tree.

						pushMenu();	// Push MenuTitle, title_item in stack.
						MenuTitle = MenuChild;
						title_item = cursor_item;

						MenuFormat = ( CODE_P struct MenuType *) MenuTitle[title_item].TypeData;				
						MenuChild = MenuTitle[title_item].Child;
						cursor_item = Get_cursor_item( MenuTitle[title_item].Id );

						if( cur_osdwin == OSDMENU_TOPWIN ) // Window #4
							cur_osdwin = OSDMENUWINDOW; // Window #3
						else
							DisplayOSDMenu();

						DisplayCursor();
						break;
		}
	//} while( cursor_item!=NIL && MenuChild[cursor_item].ActiveWithCursor==YES );

}

#ifdef PAL_TV
void ChannelEdit_Window(void)
{
	pushMenu();
	MenuTitle = MenuChild;
	title_item = cursor_item;

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

	DrawMenulist(1); // Display Title

	ChannelEdit_display();
		
}

void ChannelEdit_display(void)
{
	
	BYTE i,j,row;
	WORD addr;
	BYTE mstr[5] = { "-----" };
	CODE BYTE NULL_Str[] = {"-----"};
	CODE BYTE ChannelEdit_Str[][25]={
		{	"  Ch.     Name     Skip  " }, 
		{	"  --      -----    Yes   "	},
		{   "                         " },
		{   "" }
	};
	extern PDATA BYTE	TVChannel;

	ChannelEdit_on = 0;

	DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH, DEFAULT_COLOR, MENU_HEIGHT*MENU_WIDTH );	// Clear color
	WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH, ChannelEdit_Str[0], MENU_WIDTH ); // Draw Head line
	
	i = (TVChannel-1)/6;	// Current page
	i = i*6;
	i++;
	for ( row=2; row<8; row++, i++ )
	{
		if(i>99) {
			WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*row, ChannelEdit_Str[2], MENU_WIDTH ); // Draw Head line
		}
		else {
		// Channel No
		mstr[0] = '0';
		if(i/10) { mstr[0] = i/10 + '0';  j=i/10*10; }
		else j=0;
		mstr[1] = i-j + '0';
		mstr[2] = 0;
		WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*row+2, mstr, 2 );
		//Printf("\r\n TVChannel:%d, i:%d, mstr:%s ",(WORD)TVChannel,(WORD)i,mstr);

		// Channel Name
		addr = FIRST_SAVEDPR+TVCHNAME + i*BYTEPERCHANNEL;
		if( ReadEEP( addr ) == 0xff )  
			WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*row+10, NULL_Str, 5 );
		else{
			for(j=0; j<5; j++, addr++)
				mstr[j] = ReadEEP( addr );
			WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*row+10, mstr, 5 );
		}	
		//Printf(" Name== mstr:%s ",(WORD)i,mstr);

		// Status of Skip
		{
			extern CODE BYTE StereoMomoYesNo[];
			DrawStringByLang( OSDMENU_SUBADDR+MENU_WIDTH*row+19, (CODE_P struct EnumType *)SkipYesNo,
				( GetTVPrSystem(i) & SKIPCHN_MASK ) ? CLEARED_CHN : SAVED_CHN );
		}

		if(i==TVChannel)
			DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH*row, CURSOR_COLOR, MENU_WIDTH );	// Clear color
		}
	}
	WriteStringToAddr( OSDMENU_SUBADDR+MENU_WIDTH*8, Str_Comments1, MENU_WIDTH ); // Comment
	DrawAttrString(OSDMENU_SUBADDR+MENU_WIDTH*8+5, Color_Comments1, 20 );	// Clear color
}


void ChannelEdit_Move(BYTE flag)
{
	BYTE buf, i;
	WORD addr;

	addr = FIRST_SAVEDPR + TVChannel*BYTEPERCHANNEL;

	if( flag == UP ) {
		if( TVChannel == 1 ) return;	// Min Channel

		for(i=0; i<9; i++) {
			buf = ReadEEP( addr+i );
			WriteEEP( addr+i, ReadEEP( addr-9+i ) );
			WriteEEP( addr-9+i, buf );
		}
		TVChannel--;
	}
	else {
		if( TVChannel == TOTAL_PR ) return;	// Max Channel

		for(i=0; i<9; i++){
			buf = ReadEEP( addr+i );
			WriteEEP( addr+i, ReadEEP( addr+9+i ) );
			WriteEEP( addr+9+i, buf );
		}
		TVChannel++;
	}
	SetTVPrEE();
	ChannelEdit_display();
}

void ChannelEdit_Skip(void)
{

	if( GetTVPrSystem(TVChannel) & SKIPCHN_MASK ) 		SetTVPrSystem(TVChannel, 0);	// Not skip	
	else			SetTVPrSystem(TVChannel, SKIPCHN_MASK);
		
	ChannelEdit_display();

}

CODE BYTE EDIT_CURSOR_ATTR[] = { CH_COLOR_YELLOW|BG_COLOR_BLUE, 0 };
CODE BYTE EDIT_NORMAL_ATTR[] = { CURSOR_COLOR, CURSOR_COLOR, CURSOR_COLOR, CURSOR_COLOR, CURSOR_COLOR, 0};

void ChannelEdit_Edit(void)
{
	BYTE i;

	i = (TVChannel-1)%6;	// Current Line
	i+=2;

	if( ChannelEdit_on ) {
		ChannelEdit_on = 0;
		DrawAttrString(OSDMENU_SUBADDR+MENU_WIDTH*i+10, EDIT_NORMAL_ATTR, 5 );	// Clear color
	}
	else 	{
		ChannelEdit_on = 1;
		val_index = 0;

		DrawAttrString(OSDMENU_SUBADDR+MENU_WIDTH*i+10+val_index, EDIT_CURSOR_ATTR, 1 );	// Set the first Cursor.
	}
}

void ChannelEdit_Cursor(BYTE flag)
{
	BYTE i;

	if(!ChannelEdit_on) return;

	i = (TVChannel-1)%6;	// Current Line
	i+=2;

	if( flag == UP ) val_index = (val_index+1)%5;
	else val_index = (val_index+5-1)%5;

	DrawAttrString(OSDMENU_SUBADDR+MENU_WIDTH*i+10, EDIT_NORMAL_ATTR, 5 );	// Clear color
	DrawAttrString(OSDMENU_SUBADDR+MENU_WIDTH*i+10+val_index, EDIT_CURSOR_ATTR, 1 );	// Move Cursor

}

void ChannelEdit_Char(BYTE flag)
{
	BYTE i, Str[2];
	WORD addr;

	if(!ChannelEdit_on) return;

	i = (TVChannel-1)%6;	// Current Line
	i+=2;

	addr = FIRST_SAVEDPR+TVCHNAME + TVChannel*BYTEPERCHANNEL+val_index;
	Str[0] = ReadEEP(addr);

	if( (Str[0] >= '0' && Str[0] <= 'Z' ) || Str[0]==' ' ){
		if( flag == UP ) {
			if( Str[0] == ' ' ) Str[0] = 'A';
			else {
				Str[0] = (Str[0]-'0'+1)%('Z'-'0'+1) + '0';
				if( Str[0] > '9' && Str[0] < 'A' ) Str[0] = ' ';
			}
		}
		else{
			if( Str[0] == ' ' ) Str[0] = '9';
			else {
				Str[0] = (Str[0]-'0'+('Z'-'0'+1)-1)%('Z'-'0'+1) + '0';
				if( Str[0] > '9' && Str[0] < 'A' ) Str[0] = ' ';
			}
		}

	}
	else Str[0] = ' ';
	
	WriteEEP(addr, Str[0]);
	WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*i+10+val_index, Str, 1 );	// Clear color

}


#endif //PAL_TV

⌨️ 快捷键说明

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