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

📄 osdmenu.c

📁 此程序为twell8806驱动程序
💻 C
📖 第 1 页 / 共 4 页
字号:
// 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 "debug.h"
#include "etc_eep.h"
#include "pc_eep.h"
#include "cc.h"
#include "eds.h"
#include "tuner.h"
#include "audio.h"
#include "printf.h"
#include "udfont.h"
#include "panel.h"
#include "rgbmix.h"		// for TW8801

static  PDATA	WORD	OSDItemValue;
//static  PDATA	BYTE	OSDDuration;

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

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

static  PDATA   BYTE    OSDMenuLevel;
	    bit     OnChangingValue = 0;
	    bit     displayOnValueWindow = 0;
#ifdef PAL_TV
		bit		ChannelEdit_Flag = 0;
		bit	    ChannelEdit_on = 0;
#endif
#ifdef SUPPORT_CCD_VCHIP
		bit		VchipWindow_On = 0;
static  bit     VchipCheckingOnPass_Flag = 0;
#endif
static  DATA    BYTE    OSDNumberString[5];

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

CODE_P struct MenuType   *MenuFormat;
CODE_P struct RegisterInfo *BarRange;
CODE_P struct DefineMenu *MenuTitle;
CODE_P struct DefineMenu *MenuChild;
CODE_P struct DefineMenu *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)
{

	if( MenuSP < sizeof( MenuIndexStack ) ) 
	{

		MenuStack[MenuSP] = MenuTitle;	       //  CODE_P struct DefineMenu *MenuStack[4];
		MenuIndexStack[MenuSP++] = title_item;	//static IDATA  BYTE MenuSP=0, MenuIndexStack[4];
		return 1;
	}
	return 0;
}

BYTE popMenu(void)
{

	if( MenuSP )
	{
		MenuTitle = MenuStack[--MenuSP];
		title_item = MenuIndexStack[MenuSP];

		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==NIL )
		return NIL;
	itemno--;
	return itemno;
}

BYTE GetTargetChild( BYTE tid)
{
	BYTE i;


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



	while( i != NIL ) 
	{
		
		if ( ( MenuChild[i].Id & 0x0f ) == tid )   //CODE_P struct DefineMenu *MenuChild;
			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:              " }, 	
	{ "" }	
};
#define OSD_INFO_SUB_X	12//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 ); 
	}
	//IHF
	MeasureAndWait(3);

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

	utoa(GetIVF(),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;


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



	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



	if( cur_osdwin == OSDMENU_TOPWIN)
	 addr = OSDMENU_MAINADDR;

	else 
	addr = OSDMENU_SUBADDR;

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



	if( DMp->IconColor !=NIL )
	 {	
		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++;

		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.
	

	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;



	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 = GetPhaseValue();					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;
		
			case AUDIO_VOLUME:		val = GetAudioVol();					break;
			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;
		
			#ifdef SUPPORT_TV
		/*	case SYSTEM_CLOCK:		val = GetSystemClock_HM();				break;
			case WAKEUP_TIME:		val = OSDItemValue = GetWakeupTime();	break;
			case OFF_TIME:			val = OSDItemValue = GetOffTime();		break;
		
			case WAKEUP_PR:			val = OSDItemValue = 1;					break;
		*/	//case STORE_PALCHANNEL:	val = OSDItemValue = 1;					break;
			#ifdef NTSC_TV
			case AIR_CABLE_TV:		val = OSDItemValue = GetTVType();		break;
			case STORE_CLEAR_TVCHN:	val = OSDItemValue = IsSavedCurChn();	break;
			#endif
		
			case MTS:				val = OSDItemValue = GetMTSType();		break;
			case FINE_TUNE_CHANNEL:	val = OSDItemValue = GetFineTune();		break;
			#endif
		
			case INPUTSTD:			val = OSDItemValue = VInputStdDetectMode;			
									break;
		
			#ifdef WIDE_SCREEN		//.................................................
			case WIDESCREEN:
									val = WideScreenMode;					break;
			#endif					//.................................................
		
			#ifdef SUPPORT_CCD_VCHIP

⌨️ 快捷键说明

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