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

📄 osdmenu.c

📁 车载DVD osdIC TW8816原厂代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	case AIR_CABLE_TV:		val = OSDItemValue = GetTVType();		break;
	case STORE_CLEAR_TVCHN:	val = OSDItemValue = IsSavedCurChn();	break;
	#endif
	
	case FINE_TUNE_CHANNEL:	val = OSDItemValue = GetFineTune();		break;
#endif // SUPPORT_TV

	case INPUTSTD:			val = OSDItemValue = VInputStdDetectMode;			
							break;

	#ifdef WIDE_SCREEN		//.................................................
	case WIDESCREEN:
							val = WideScreenMode;					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 VIDEO_BACKLIGHT:	val = ChangeVideoData(backlight,flag);			break; // changed wrong offset value // Hans



	case AUDIO_VOLUME:		val = ChangeVol( (flag==UP ? 1 : -1) );	break;
#ifdef SUPPORT_MSP_AUDIO
	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;
#endif

#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;
	#ifdef NTSC_TV
	case AIR_CABLE_TV:		val = ToggleTVType();					break;
	case STORE_CLEAR_TVCHN:	val = StoreClearCurChn(); 				break;
	#endif

	case FINE_TUNE_CHANNEL: val = ChangeFineChannel(flag);			break;
#endif							
	


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

	}

	return val;
}


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=0;
	BYTE Bar_str[]={ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, ' ', ' ', ' ',0 };

	// Bar
	if( BAR_LENGTH != 0 ) {
		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   // Hans
    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] = ' ';
/* // Hans
	for(;i<7;i++)
		Bar_str[i+3] = ' ';
*/
	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 ) {

		#ifdef DEBUG_OSD
		dPrintf("\r\nTitle color:0x%x", (WORD)MenuFormat->TitleColor);
		#endif
 
		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;
	#ifdef DEBUG_OSD
	dPrintf("\r\n++(DisplayOSDMenu)");
	#endif

	// 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;

	#ifdef DEBUG_OSD
	dPuts("\r\n(OSDHighMenu_sub)");
	#endif
	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();
		return;
	}

	#ifdef DEBUG_OSD
	dPrintf("\r\n++(OSDHighMenu_sub) OSDMenuLevel:%d", (WORD)OSDMenuLevel );
	#endif
	
	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;

	#ifdef DEBUG_OSD
	dPrintf("\r\n++(DoAction) id:0x%x", (WORD)id );
	#endif
	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();
								break;
	/*case AUTOADJUST2:			ret = DetectAndSetForVGAInput(2);
								LCDPowerON(0);	//HHY 1.63
								SetOSDLastKeyInTime();
								ClearCursor();
								cursor_item = 0;
								DisplayCursor();		
								break;*/
	case RESET_PCVALUE:			ClearOSDInfo();
								ResetPanelAttributeValue();
								ResetPCValue();
								ResetOSDValue();
								ResetAudioValue();
								break;

	case PCCOLORADJUST:			
								break;
	#endif
	
	
	case RESET_VIDEOVALUE:		ClearOSDInfo();
								ResetVideoValue();
								ResetOSDValue();
								ResetAudioValue();
								break;

	#ifdef SUPPORT_TV
	case SCAN_CHANNEL:			ClearOSDInfo();
								DisplayScanTV();		
								delay(50);				//protect for repeat key
								ScanTVChannel();
								ClearScanTV();			
								break;

	#ifdef PAL_TV
	case EDIT_CHANNEL:			ChannelEdit_Window();
								ChannelEdit_Flag = 1;
								break;
	#endif // PAL_TV
	#endif // SUPPORT_TV

//----
	case DISP_INFO:				DisplayInfo_OSD();	
								displayOnValueWindow = 1;
								break;

	case TOHIGHMENU:			OSDHighMenu_sub();						
								break;

	case EXITMENU:				CloseOSDMenu();	
								if( DisplayInputHold ) DisplayInput();
								else if( IsAudioMuteOn() ) DisplayMuteInfo();
								break;
	}
	return ret;
}


BYTE GetNextCursorMenuItem( CODE_P struct DefineMenu *DMp, BYTE itemno, BYTE flag)
{
	BYTE new_cursor;

	switch( flag ) {
	case UP:	new_cursor = GetUpperMenuItem( /*DMp,*/ itemno );		break;
	case DN:	new_cursor = GetLowerMenuItem( DMp, itemno );		break;
	}
	return new_cursor;
}

//============== Public functions =================================================
//CODE BYTE TryAgainMsg[]={ "Try again."};

BYTE SaveValue1(void)
{
//	BYTE          /*ret=0,*/ addroff;

	switch( MenuChild[cursor_item].Type )	{
	
	case NUMBER:
	       	switch ( MenuChild[cursor_item].Id ) {

			case SLEEP_TIMER:		SetSleepTimer( OSDItemValue );	
									return 1;	//break;
			}
			//ret = 1;
			break;
	
	default:	break;
	}

	return 0;	
}

void ClearValueWin(void)
{
	SaveValue1();
	//ShowOSDWindow(OSDBARWINDOW, FALSE);
	val_osdwin = 0xff;
	OnChangingValue = 0;
}

void OSDCursorMove(BYTE flag )
{
	BYTE new_cursor, old_cursor;
	WORD dat;

	#ifdef DEBUG_OSD
	dPrintf("\r\n++(OSDCursorMove)cursor_item:%d __", (WORD)cursor_item);
	#endif

              if (displayOnValueWindow) return;
		#ifdef PAL_TV
		if( ChannelEdit_Flag ) return;
		#endif
		
		if( MenuChild[ cursor_item ].Id == PC_COLOR_TEMP && GetPCColorTempModeEE() != 3 ) return; // User

⌨️ 快捷键说明

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