📄 osdmenu.c
字号:
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 + -