osdmenu.c

来自「此程序为twell8806驱动程序」· C语言 代码 · 共 2,135 行 · 第 1/4 页

C
2,135
字号
								
		#endif
								default:
										DisplayCursor();
		
								//		DrawNum( (CODE_P struct NumType *)ptr, GetItemValue(MenuChild[cursor_item].Id) );
										break;
								}
								return;
				/*case TIME:
								val_index = HOUR;
								val = GetItemValue(MenuChild[cursor_item].Id);
								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);
								return; */
				//case ENUM_STRING:		
				//				OnChangingValue = 1;
								/*DrawYesNo( (CODE_P struct YesNoType *)ptr,cursor_item+1,val );*/
								//DrawAttrCnt( addr, ACTIVE_COLOR, MENU_WIDTH-MAX_DESC+ICON_CH_SZ );	
		
				//				return;
				#ifdef SUPPORT_CCD_VCHIP
				case NUMBER_STRING:
								OnChangingValue = 1;
								val_index = 0;
								Display_EnterPin();
								return;
				#endif //SUPPORT_CCD_VCHIP
		
				case OSDMENU:
				case CHOICEMENU:
								#ifdef SUPPORT_CCD_VCHIP						
								if( (MenuChild[cursor_item].Id ) == CHK_PASSWORD )
								{
									if( (ValidPassword(OSDNumberString, val_index) ) && (VchipCheckingOnPass_Flag == 1) )
										VchipCheckingOnPass_Flag = 0;
									else
									{
										BYTE len;
		
										ClearDataCnt(OSDMENU_SUBADDR, MenuFormat->width*(MENU_HEIGHT+1)); // Clear submenu Window all .
										len = strlen(Str_Vchip[OSDLang]);
										WriteStringToAddr(OSDMENU_SUBADDR, Str_Vchip[OSDLang], len); 
										Display_EnterPin();
										VchipCheckingOnPass_Flag = 1;
										val_index = 0;						
										return;
									}
								}
								#endif
								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 SUPPORT_CCD_VCHIP
void Display_EnterPin(void)
{
	extern CODE BYTE *Enter_Password_Str[];
	WORD addr;
	CODE_P BYTE *Str;
	BYTE len;

	Str=Enter_Password_Str[OSDLang];

	len=strlen(Str);
	DrawAttrCnt(OSDMENU_SUBADDR + MENU_WIDTH, DEFAULT_COLOR, MENU_WIDTH*(MENU_HEIGHT-1));
	addr = OSDMENU_SUBADDR + MENU_WIDTH*4;
	WriteStringToAddr(addr, Str, len); 

}

void OSDNumber( BYTE num )
{
	WORD addr;
	CODE BYTE Str_X[]={"X"};
	
	if(( OnChangingValue && MenuChild[ cursor_item ].Type == NUMBER_STRING ) ||
	   ( VchipCheckingOnPass_Flag == 1 )) 
	   {

		if( val_index < 4) { 
			OSDNumberString[val_index] = num;
			addr = OSDMENU_SUBADDR + 4*MENU_WIDTH + 16 + val_index ;
			WriteStringToAddr(addr, Str_X, 1); 
			val_index++;

			if(( val_index == 4 ) && ( (MenuChild[cursor_item].Id ) == CHK_PASSWORD) )
				OSDSelect();
			
		}
		else
		{
			val_index=0;
			Display_EnterPin();
		}
	}
}
#endif //SUPPORT_CCD_VCHIP

#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


#ifdef SUPPORT_CCD_VCHIP

CODE BYTE Cursorblock[]={7,11,14,17,20,23};
CODE BYTE Maskblock[]={0x00,0x80,0xc0,0x80,0xf8,0xf8,0xf0};

void Draw_Block_Unblock( BYTE level,BYTE value )
{
	BYTE j, mask;

	CODE BYTE BLOCK[]={RAMFONT,0x72,0x73};
	CODE BYTE UNBLOCK[]={RAMFONT,0x74,0x75};

	mask=Maskblock[level];

	for(j=0; j<6; j++,mask<<=1,value<<=1)
	{
		if( mask&0x80){
			if( value & 0x80 )
				WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(1+level) + Cursorblock[j] , BLOCK, 3 ); 
			else
				WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(1+level) + Cursorblock[j] , UNBLOCK, 3 ); 
		}

		if( level==2 && j==1) j++;
		else if( level!=2 && j==0) j++;
	}
}

void Display_VchipCursor(BYTE color)
{
	BYTE i, val;
	// XXXXX XXX: [7-3] [2-0]
	val = val_index&0xf8;
	for(i=0; i<6; i++, val<<=1)
	{
		if( val&0x80 ) break;
		if( (val_index&0x07)!=1	&& i==0) i++;
	}
	
	DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH*(2+(val_index&0x07))+Cursorblock[i], color, 2 );	

}

void Display_TVGuide_Window(void)
{
	BYTE i;
	CODE BYTE TVGuide_Menu_Str[][25]={
		{	"      ALL  FV  V  S  L  D" }, 
		{	"TV-Y                     "	},
		{	"TV-Y7                    "	},
		{	"TV-G                     "	},
		{	"TV-PG                    "	},
		{	"TV-14                    "	},
		{   "TV-MA                    " },
		{   "" }
	};

	DrawAttrCnt(OSDMENU_SUBADDR+MENU_WIDTH, DEFAULT_COLOR, MENU_HEIGHT*MENU_WIDTH );	// Clear color
	for (i=0;i<7 ;i++ )
		WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(1+i), TVGuide_Menu_Str[i], MENU_WIDTH ); 

	Display_TVGuide_Status();
}

void Display_TVGuide_Status(void)
{
	BYTE row, rate, content;

	rate = GetBlockedTVEE()&0xf8;
	for(row=1;row<7;row++)		
	{
		if( rate == 0 || rate >= row ) // Check content
			content = GetBlockedTV_FLDSLEE(row)&0xf8;
		else 
			content = Maskblock[row];

		Draw_Block_Unblock(row, content); 
	}

	Display_VchipCursor	(CURSOR_COLOR);

}

void ChangeVchip_LevelCursor(BYTE flag)
{
	BYTE row, col ;
	row = val_index & 0x07;
	col = val_index & 0xf8;

	Display_VchipCursor	(DEFAULT_COLOR);	// Clear Cursor
	
	if( flag == UP ) row = (row+1)%6;
	else row = (row+6-1)%6;
	
	if( (col & Maskblock[row+1]) == 0 ) col = 0x80;
	val_index = col | row;
	
	Display_VchipCursor	(CURSOR_COLOR);

}

void ChangeVchip_ContentCursor(BYTE flag)
{
	BYTE i,row,col;
	Display_VchipCursor	(DEFAULT_COLOR);	// Clear Cursor
	
	row = val_index&0x07;
	col = val_index&0xf8;

	if( flag == UP ) {
		for (i=0; i<5 ;i++ )
		{
			col>>=1;
			if(col & (Maskblock[row+1]&col)) break;		
		}
	}
	else // DN
	{
		for (i=0 ;i<5 ;i++ )
		{
			col<<=1;
			if(col & (Maskblock[row+1]&col)) break;		
		}
	}

	if((col&0xf8) == 0 ) val_index=row|0x80; // ALL
	else val_index=row|col;

	Display_VchipCursor	(CURSOR_COLOR);

}

void Select_VchipLevel(void)
{
	BYTE rate, content;
	BYTE i, row, col;

	row = (val_index&0x07) +1;
	col = val_index & 0xf8;

	// Get current status.
	rate = GetBlockedTVEE()&0x07;
	content = GetBlockedTV_FLDSLEE(row)&0xf8;

	// Toggle status
	content = content ^ col;

	if( col == 0x80 ){ // Change "ALL" 
		rate = row;
		if( content & 0x80) {	// "ALL": Block
			for(i=row; i<7; i++)
				SaveBlockedTV_FLDSLEE(i,Maskblock[i]);
		}
		else {		// "ALL" : Unblock

			for(i=1; i<=row; i++)
				SaveBlockedTV_FLDSLEE(i,0);

			row++;
			rate = row;
			if(rate>6) rate=0;
		}
	}
	else
	{
		Printf("\r\n content:%2x row:%2x", (WORD)content, (WORD)row);
		if( content & 0x80) { // Is ALL blocked?
			content &= 0x7f;	// "ALL" : Unblock
			rate = row+1;
			if( rate>6 ) rate=0;
			Printf("--> content:%2x row:%2x", (WORD)content, (WORD)rate);
		}

		SaveBlockedTV_FLDSLEE(row,content);

		if( content & col ){	// BLOCK
			for( i=row+1; i<7; i++){
				if( row < 4) break;
				SaveBlockedTV_FLDSLEE(i,  ((GetBlockedTV_FLDSLEE(i) & 0xf8) | col ) );
			}
		}
		else
		{		// UNBLOCK
			for( i=1; i<row; i++){
				SaveBlockedTV_FLDSLEE(i,  ((GetBlockedTV_FLDSLEE(i) & 0xf8) & (~col) & 0x7f) );
			}

		}

	}

	SaveBlockedTVEE(rate);

	Display_TVGuide_Status();
	ChangeVchipTV(rate);
}
#endif // SUPPORT_CCD_VCHIP

⌨️ 快捷键说明

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