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