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

📄 osdmenu.c

📁 此程序为twell8806驱动程序
💻 C
📖 第 1 页 / 共 4 页
字号:
			case CLOSED_CAPTION:	val = GetCCFlag() & 0x0f;			
									#ifdef DEBUG_OSD
									dPrintf("\r\n(CC)Target id:0x%x", (WORD)val);
									#endif
									break;
			#endif
		
			#ifdef SUPPORT_CCD_VCHIP
			case MPAA_RATING:		val = OSDItemValue = GetMPAARating();					break;
			//case TV_GUIDE:			val = OSDItemValue = GetTVRating();					break;
			#endif
	}

	return val;
}

#define MAX_VIDEOMODE	4
#define MAXVCHIPMOVIE	7 

WORD SetItemValue( BYTE id, BYTE flag )
{
	WORD val=0;
//	BYTE	i;

	switch( id ) 
	{
	//case SYSTEM_CLOCK_H:	
	//case WAKEUP_TIME_H:		
	//case OFF_TIME_H:
	//						val = SetClock_hour(flag);				break;

	//case SYSTEM_CLOCK:
	//case WAKEUP_TIME:
	//case OFF_TIME:
	//						val = SetClock_min(flag);				break;
	case SLEEP_TIMER:		val = ChangeSleepTimer( flag );			break;

#ifdef SUPPORT_OSDPOSITIONMOVE
	case OSDPOSITIONMODE:    val = SetOSDPositionMode( flag );		break;
	//case OSD_VPOS:			val = SetOSDMenuYValue(flag);			break;
	//case OSD_HPOS:			val = SetOSDMenuXValue(flag);			break;
#endif

//	case OSD_DURATION:		val = SetOSDDurationValue(flag);		break;
	case OSDLANG:			val = SetLanguage (flag);				break;

	#if defined(SUPPORT_PC) || defined(SUPPORT_DTV)
	case PANEL_CONTRAST:	val = SetPanelContrast(flag);			break;
	case PANEL_BRIGHTNESS:	val = SetPanelBrightness(flag);			break;
	#endif

	#ifdef SUPPORT_PC
	case PC_VPOS:			val = SetVPosition(flag);				break;
	case PC_HPOS:			val = SetHPosition(flag);				break;
	case PC_CLOCK:			val = SetPCCoarseValue(flag);			break;
	case PC_PHASE:			val = SetPhaseValue(flag);				break;
	#endif

	case PC_COLOR_TEMP:		val = SetPCColorTemp(flag);			break;

	case PC_COLOR_R:		val = SetPCColor(RED, flag);			break;	
	case PC_COLOR_G:		val = SetPCColor(GREEN, flag);			break;	
	case PC_COLOR_B:		val = SetPCColor(BLUE, flag);			break;	

	case VIDEO_MODE:		val = GetVideoModeEE();
							if(flag==UP) val ++;
							else val = val + MAX_VIDEOMODE -1;
							val %= MAX_VIDEOMODE ; 
							SetVideoMode(val);		
							
							if( GetVideoModeEE() != 3 )  // if not user mode, mask the control.
								DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH*2, BACK_COLOR, (MENU_HEIGHT-1)*MENU_WIDTH );	
							else
								DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH*2, DEFAULT_COLOR, (MENU_HEIGHT-1)*MENU_WIDTH );	
																	break;

	case VIDEO_CONTRAST:	
	case VIDEO_BRIGHTNESS:	
	case VIDEO_HUE:			
							val= ChangeVideoData(id-VIDEO_CONTRAST,flag);					break;
	case VIDEO_SATURATION:	val = ChangeVideoData(id-VIDEO_CONTRAST,flag);	
							ChangeVideoData(id+1-VIDEO_CONTRAST,flag);
																	break;
							//val = SetVideoSaturation(V_SAT, flag);	break;
	case VIDEO_SHARPNESS:	val = SetVideoSharpness(flag);			break;



	case AUDIO_VOLUME:		val = ChangeVol( (flag==UP ? 1 : -1) );	break;
	case AUDIO_BALANCE:		val = ChangeBalance( (flag==UP ? 1 : -1) );	break;
	case AUDIO_BASS:		val = ChangeBass( (flag==UP ? 1 : -1) );	break;
	case AUDIO_TREBLE:		val = ChangeTreble( (flag==UP ? 1 : -1) );	break;

	//case AUDIO_EFFECT:		val = ChangeAudioEffect((flag==UP ? 1 : -1));	break;
	//case AUDIO_MUTE:		ToggleAudioMute();	val = IsAudioMuteOn();			break;


/*	case INPUTSELECTION:	val = GetNextInputSelection();	
							ChangeInput(GetNextInputSelection());
							break;
*/
	#ifdef SUPPORT_TV
	case INPUTSTD:				val = VInputStdDetectMode;
								if(flag==UP) val++;
								else val = ( val+MAXINPUTSTD -1 );
								val %= MAXINPUTSTD;
								//Printf("\r\n++IPUTSTD:0x%x __", (WORD)val);
								
								//i = GetInputSelection();
								//if( i==TV ) 
									ChangeVInputStdDetectMode(val);
								break;
	
/*	case SYSTEM_CLOCK_H:	
	case WAKEUP_TIME_H:		
	case OFF_TIME_H:
							val = SetClock_hour(flag);				break;

	case SYSTEM_CLOCK:
	case WAKEUP_TIME:
	case OFF_TIME:
							val = SetClock_min(flag);			break;
*/
	#ifdef NTSC_TV
	case AIR_CABLE_TV:		val = ToggleTVType();					break;
	case STORE_CLEAR_TVCHN:	val = StoreClearCurChn(); 				break;
	#endif

	case MTS:				val = SetMTSType();						break;
	case FINE_TUNE_CHANNEL: val = ChangeFineChannel(flag);			break;
/*
	#ifdef PAL_TV
	case WAKEUP_PR:			
							//val = OSDItemValue = ( flag==UP ? OSDItemValue+1 : OSDItemValue+GetMaxTVChn()-1 ) % GetMaxTVChn();	break;
	#endif	// PAL_TV
	
*/
	#endif //SUPPORT_TV

	#ifdef WIDE_SCREEN
	case WIDESCREEN:			val = WideScreenMode;
								if(flag==UP) val++;
								else val = ( val+MAXWIDESCREEN -1 );	
								val %= MAXWIDESCREEN;
								Set4WideScreen( val );
								break;
	#endif	//WIDE_SCREEN

	#ifdef SUPPORT_CCD_VCHIP
	case CLOSED_CAPTION:	val = ChangeCC(flag);					break;
	#endif // SUPPORT_CCD_VCHIP

	#ifdef SUPPORT_CCD_VCHIP
	//case TV_GUIDE:				val = ChangeVchipTV( flag );		break;
	case MPAA_RATING:				val = GetMPAARating();
									if(flag==UP) val++;
									else val = ( val+MAXVCHIPMOVIE -1 );	
									val %= MAXVCHIPMOVIE;
									val = ChangeVchipMovie( val );		break;
	#endif

	}

	return val;
}
/*
void DrawTime(WORD val, BYTE Hcolor, BYTE Mcolor )
{
	BYTE mstr[5];
	WORD new_val;

	#ifdef DEBUG_OSD
	dPrintf("\r\n++(DrawTime) winno:%d, time:0x%x__", (WORD)val_osdwin, (WORD)val);
	#endif

	new_val = val >> 8;
	if( new_val < 10 )		mstr[0] = '0';
	else					mstr[0] = ( new_val / 10 ) + '0' ;
	mstr[1] = ( new_val % 10 ) + '0' ;
	mstr[2] = 0;
	CopyStrToOSDWindow(val_osdwin, 0, 0, 0, Hcolor, mstr);
	CopyCharToOSDWindow(val_osdwin, 2, 0,  ( (~CH_BLINK) & Hcolor ), ':');

	new_val = (BYTE)val;
	if( new_val < 10 )		mstr[0] = '0';
	else					mstr[0] = ( new_val / 10 ) + '0' ;
	mstr[1] = ( new_val % 10 ) + '0' ;
	mstr[2] = 0;
	CopyStrToOSDWindow(val_osdwin, 3, 0, 0, Mcolor, mstr);

	#ifdef DEBUG_OSD
	dPrintf("--- time:0x%x__", (WORD)val);
	#endif

}

*/

void DisplayViewBar(WORD addr, BYTE val)
{
	CODE BYTE BAR_ROM_TABLE[] = 
	{
		0x01,0x01,0x01,0x01, // ...
		0x02,0x02,0x02,0x02,0x02, // |..
		0x05,0x05,0x05,0x05,0x05,// ||.
		0x03, // |
		0x04, // |||
	};

	BYTE i;
	BYTE Bar_str[]={ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, ' ', ' ', ' ',0 };

	// Bar
	if(val < 98)
	{
		Bar_str[val/14] = BAR_ROM_TABLE[val%14];
		for(i = val/14 + 1; i < 7; i++)
			Bar_str[i] = BAR_ROM_TABLE[0];
	}

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

	// Number
    Bar_str[10] = val % 10 + '0';    val /= 10;
    Bar_str[9] =  val % 10 + '0';    val /= 10;
    Bar_str[8] = val + '0';
	if( Bar_str[8] == '0' ) Bar_str[8] = ' ';

	WriteStringToAddr(addr, Bar_str, BARNUM_LENGTH); 

}

void DrawNum(WORD addr,CODE_P struct NumType *nptr, WORD val)
{
	BYTE x,i, j,k, len, mstr[5];//,color;
	BYTE Num_str[]={ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',0 };
	CODE_P BYTE *str;
	
	x=  MAX_DESC;//+ICON_CH_SZ;
	i =  nptr->PrePostCharLen >> 4 ;
	j =  nptr->PrePostCharLen & 0x0f ;
	str = nptr->PrePostChar;

	// Draw char on front of number. 
	if( i ) 
		for(k=0; k<i; k++)
			Num_str[k] = *str++;
	// Draw number.
	utoa(val,mstr,BAR_NUM_RADIX);
	len = strlen(mstr);
	str=mstr;
	for(k=0; k<len; k++)
		Num_str[k+i] = *str++;

	// Draw char on back of number
	if( j ) 
		for(k=0; k<j; k++)
			Num_str[k+i+len] = *str++;
	WriteStringToAddr(addr, Num_str, BARNUM_LENGTH); 
	
}

void DrawStringByLang( WORD addr, CODE_P struct EnumType *yptr, WORD val )
{

	BYTE j,l,Size_val;
	BYTE Buf[]={' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',0 };
	CODE_P BYTE *Str;

	Size_val = yptr->Sz;
	Str = yptr->Str;

	if ( yptr->ByLang)
	{
		for(j=0; j<OSDLang*Size_val; j++)			
		Str += ( strlen(Str) + 1 );
	}

	if( val )
	{ 
		for(j=0; j<val; j++)			
		Str += ( strlen(Str) + 1 );	
	}

	WriteStringToAddr(addr, Buf, BARNUM_LENGTH); 

	l = CStrlen(Str);

	WriteStringToAddr(addr, Str, l); 

}
/*
#ifdef PAL_TV
void DrawFraction( CODE_P struct NumType *nptr, DWORD val, BYTE fp )
{
	BYTE mstr[6], len;

	ltoa_K( val, mstr, fp );
	len = strlen(mstr);
	CopyStrToOSDWindow(cur_osdwin, 0, 0, len, nptr->NumColor, mstr);
	ClearOSDLine(cur_osdwin, len, 0, nptr->width-len, nptr->NumColor);
}
#endif

BYTE OnChangingValue(void)
{
	return ( (val_osdwin==0xff  ) ? 0 : 1 );	//OSDItemValue==0xffff: password error
}
// Not used yet *******************************************
BYTE OnChangingTime(void)
{
	if ( val_osdwin==0xff )						return 0 ;
	if ( MenuChild[cursor_item].Type==TIME )	return 1;
	else										return 0;

}
*/

void DrawMenulist(BYTE NOTViewflag)
{
	BYTE  i,j,k, x=0, y=0;
	CODE_P struct DefineMenu *DMp;
	CODE_P BYTE *Desc;
	BYTE  Max_y;
	WORD addr;

	// Draw Title line
	if( MenuFormat->TitleColor!=NIL ) 
	{
 
		DMp = &MenuTitle[title_item];
		Desc = DMp->Desc[OSDLang];
		j=strlen(Desc);

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

		//ClearDataCnt(OSDMENU_SUBADDR, MenuFormat->width);	// Clear the counter of OSD RAM Data from addr with space(' ').
		DrawAttrCnt(OSDMENU_SUBADDR, MenuFormat->TitleColor, MenuFormat->width );	 
		WriteStringToAddr(OSDMENU_SUBADDR, Desc, j);

		if( (j-k ) < TITLE_MAX_DESC ) 
			ClearDataCnt(OSDMENU_SUBADDR+j-k, TITLE_MAX_DESC-j+k);

		y++;
	}
	
	if( MenuChild )	i = 0;
	else			i = NIL;

	// Draw 
	 Max_y = (cur_osdwin == OSDMENU_TOPWIN ? TOTAL_TOP_HEIGHT: MENU_HEIGHT+1);
	 addr = (cur_osdwin == OSDMENU_TOPWIN ? OSDMENU_MAINADDR: OSDMENU_SUBADDR);
	 addr += y*MenuFormat->width;

	 if( NOTViewflag==0 ) 
	 {
		 I2CAutoIncFlagOn = 1;	// speedy submenu drawing 
		 WriteDecoder(TW88_ENABLERAM, 0x04); // OSD RAM Auto Access Enable
	 }

	 for(  ; y < Max_y; y++)	
	 {

		if(i != NIL)
	    {
			DisplayOSDMenuOneItem( cur_osdwin, &MenuChild[i], x, y, NOTViewflag);
			i = GetLowerMenuItem( MenuChild, i );
		}
		else 
		{
		   ClearDataCnt(addr, MenuFormat->width);	// Clear the counter of OSD RAM Data from addr with space(' ').
		 }
		addr += MenuFormat->width;

	 }

 	 if( NOTViewflag==0 ) 
	 {
		 I2CAutoIncFlagOn = 0;	// Recover  
		 WriteDecoder(TW88_ENABLERAM, 0x00); // OSD RAM Auto Access Enable
	 }

}
//
// Here, Main Menu will display Only Icon at leftside.
//
#define ALLDATA  175 //25*7  MENU_WIDTH*MENU_HEIGT
void DisplayOSDMenu(void)
{
	CODE_P BYTE *Str;
	BYTE i;


	// Clear all MENU Window Ram data
	DrawAttrCnt(OSDMENU_MAINADDR, DEFAULT_COLOR, 5*2 );	 // All Line Attr clear by default color.
	DrawAttrCnt(OSDMENU_SUBADDR, TITLE_COLOR, TITLE_MAX_DESC );	 // All Line Attr clear by default color.
	if( MenuChild[ cursor_item ].Id == TVINSTALL && GetInputSelection()!= TV )
		DrawAttrCnt(OSDMENU_SUBADDR+TITLE_MAX_DESC, CH_COLOR_MAGENTA|BACK_COLOR, MENU_HEIGHT*MENU_WIDTH );	
	else
	{
		if( (MenuChild[ cursor_item ].Id == PC_COLOR_MODE && GetPCColorTempModeEE() != 3 )  // User
		||( MenuChild[ cursor_item ].Id == VIDEOPICTURE && GetVideoModeEE() != 3 ) ) // User
		{
			DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH, DEFAULT_COLOR, MENU_WIDTH );	
			DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH*2, BACK_COLOR, (MENU_HEIGHT-1)*MENU_WIDTH );	
		}
		else
		DrawAttrCnt(OSDMENU_SUBADDR+TITLE_MAX_DESC, DEFAULT_COLOR, MENU_HEIGHT*MENU_WIDTH );	

	}

	DrawAttrCnt(OSDMENU_SUBADDR+TITLE_MAX_DESC*8, COMMENT_COLOR, TITLE_MAX_DESC );	 // All Line Attr clear by default color.

	DrawMenulist(1);

	// Draw Child
	if( OSDMenuLevel == 1 ) // 
	{
		pushMenu();	// Store ManuTile, tile_item.
		MenuTitle = MenuChild;
		title_item = cursor_item;
		
		MenuFormat = ( CODE_P struct MenuType *) MenuTitle[title_item].TypeData;
		MenuChild = MenuTitle[title_item].Child;
		cur_osdwin--; 

		DrawMenulist(0);	// draw total Submemu.
		
		popMenu(); // Restore ManuTile, tile_item.
		MenuFormat = ( CODE_P struct MenuType *) MenuTitle[title_item].TypeData;
		MenuChild = MenuTitle[title_item].Child;
		cur_osdwin++;
	}

	Str = Str_Comments[OSDLang];
	i=strlen(Str);
	WriteStringToAddr(OSDMENU_SUBADDR+TITLE_MAX_DESC*8, Str, i);

	DisplayCursor();
}

void OSDHighMenu_sub(void)
{
	BYTE temp_cursor;


	temp_cursor = cursor_item ;
	MenuChild = MenuTitle;
	cursor_item = title_item;

	if( !popMenu() ) 
	{
		CloseOSDMenu();

		MenuTitle = MenuChild;	//  Restore the Menu status.
		title_item = cursor_item;
		MenuChild = MenuTitle[title_item].Child;
		cursor_item = temp_cursor;
	
		//DoAction(EXITMENU);
		
		if( DisplayInputHold )     DisplayInput();
		else if( IsAudioMuteOn() ) DisplayMuteInfo();

		#ifdef SUPPORT_CCD_VCHIP
		else if( IsBlock_On() ) DisplayBlockedTVRating();
		else InitClosedCaption();

		#endif
		return;
	}


	MenuFormat = ( CODE_P struct MenuType *) MenuTitle[title_item].TypeData;

	OSDMenuLevel--; // Up Menu tree

	if(OSDMenuLevel == 1)
	{	// Top Menu Level
		cur_osdwin = OSDMENU_TOPWIN;//Window #4
		DisplayOSDMenu();
	}
	else
	{
		DrawMenulist(0); // Redraw List and contents.
		DisplayCursor();
	}
	
	// 3D Effect Cursor Top
	if(OSDMenuLevel == 1)
	 {
		WriteDecoder(TW88_WINNUM, OSDCURSORWINDOW-1);
		WriteDecoder(TW88_WINATTR, OSD_Window_Attr(WINDOW_3D_TOP,BG_COLOR_BLACK|EXTENDED_COLOR,0,WINDOW_3D_ENABLE,WINDOW_ENABLE));	
	}

	return;
}


BYTE DoAction(BYTE id)
{
	BYTE ret = 1;


	switch( id ) 
	{

		case CHANGE_TO_COMPOSITE:
		case CHANGE_TO_SVIDEO:
		case CHANGE_TO_COMPONENT:
	
		#ifdef SUPPORT_TV
		case CHANGE_TO_TV:
		#endif
	
		#ifdef SUPPORT_PC
		case CHANGE_TO_PC:
		case CHANGE_TO_DIGITALVGA:
		#endif
	
		#ifdef SUPPORT_DTV
		case CHANGE_TO_DTV:
		#endif
	
									ChangeInput( id & 0x0f );			
									break;
								
		#ifdef SUPPORT_PC
		case AUTOADJUST:			
									AutoAdjust();
									/*ClearOSDInfo();
									DisplayAutoAdjust();
									ret = DetectAndSetForVGAInput(0);	

⌨️ 快捷键说明

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