📄 osdmenu.c
字号:
// 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 "etc_eep.h"
#include "pc_eep.h"
#include "audio.h"
#include "printf.h"
#include "udfont.h"
#include "panel.h"
#include "rgbmix.h" // for TW8801
#ifdef SUPPORT_TV
#include "Tuner.h"
#endif
static WORD OSDItemValue;
//static BYTE OSDDuration;
static BYTE title_item, cursor_item, /*cursor_y,*/ cur_osdwin, /*cur_osdaddr,*/ val_osdwin=0xff,
val_index=0;
static BYTE OSDMenuX, OSDMenuY;/*ljy100303..., OSDZoom*/
static BYTE OSDLang=0;
static BYTE OSDMenuLevel;
bit OnChangingValue = 0;
static BYTE OSDNumberString[5];
bit displayOnValueWindow = 0;
#ifdef PAL_TV
bit ChannelEdit_Flag = 0;
bit ChannelEdit_on = 0;
#endif
//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;
extern IDATA WORD IVF;
extern IDATA DWORD IHF;
#ifdef PAL_TV
extern PDATA BYTE TVChannel;
extern IDATA WORD TVFreq;
#endif
struct MenuType CODE *MenuFormat;
struct RegisterInfo CODE *BarRange;
struct DefineMenu CODE *MenuTitle;
struct DefineMenu CODE *MenuChild;
struct DefineMenu CODE *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)
{
#ifdef DEBUG_OSD
dPrintf("\r\n(pushMenu)-MenuSP:%d", (WORD)MenuSP);
#endif
if( MenuSP < sizeof( MenuIndexStack ) ) {
#ifdef DEBUG_OSD
{
BYTE **Desc;
BYTE i;
Desc = MenuTitle[title_item].Desc;
for(i=0; i<OSDLang; i++)
Desc += ( strlen(*Desc) + 1 );
dPrintf("...MenuStack[%d]:Desc(%s)",(WORD)MenuSP, Desc);
}
#endif
MenuStack[MenuSP] = MenuTitle;
MenuIndexStack[MenuSP++] = title_item;
return 1;
}
return 0;
}
BYTE popMenu(void)
{
#ifdef DEBUG_OSD
dPrintf("\r\n(popMenu)-MenuSP:%d", (WORD)MenuSP);
#endif
if( MenuSP ) {
MenuTitle = MenuStack[--MenuSP];
title_item = MenuIndexStack[MenuSP];
#ifdef DEBUG_OSD
{
BYTE **Desc;
BYTE i;
Desc = MenuTitle[title_item].Desc;
for(i=0; i<OSDLang; i++)
Desc += ( strlen(*Desc) + 1 );
dPrintf("...MenuStack[%d]:Desc(%s)",(WORD)MenuSP, Desc);
}
#endif
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==0 ||
if( itemno==NIL )
return NIL;
itemno--;
return itemno;
}
BYTE GetTargetChild( BYTE tid)
{
BYTE i;
if( MenuChild ) i = 0;
else i = NIL;
#ifdef DEBUG_OSD
dPrintf("\r\nTarget id:0x%x", (WORD)tid);
#endif
while( i != NIL ) {
#ifdef DEBUG_OSD
dPrintf("__ForActionId[%d]:0x%x", (WORD)i, (WORD)MenuChild[i].Id);
#endif
if ( ( MenuChild[i].Id & 0x0f ) == tid )
return i;//break;
i = GetLowerMenuItem(MenuChild, i );
}
return i;
}
/*
BYTE GetTargetChild1( BYTE tid)
{
BYTE i;
if( MenuChild ) i = 0;
else i = NIL;
#ifdef DEBUG_OSD
dPrintf("\r\nTarget id:0x%x", (WORD)tid);
#endif
while( i != NIL ) {
#ifdef DEBUG_OSD
dPrintf("__ForActionId[%d]:0x%x", (WORD)i, (WORD)MenuChild[i]. PreFnId);
#endif
if ( ( MenuChild[i]. PreFnId & 0x0f ) == tid )
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: new " },
{ "" }
};
#define OSD_INFO_SUB_X 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 );
}
#if defined( SUPPORT_PC ) || defined( SUPPORT_DTV )
//IHF
MeasureAndWait(3);
#endif
ltoa_K(IHF, mstr, 1);
len=strlen(mstr);
WriteStringToAddr(OSDMENU_SUBADDR+MENU_WIDTH*(2+title)+OSD_INFO_SUB_X, mstr, len );
utoa(IVF,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;
#ifdef DEBUG_OSD
dPrintf("\r\n++(Get_cursor_item) id:%d", (WORD)id);
#endif
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;
}
#ifdef DEBUG_OSD
dPrintf("___Cursor:%d\r\n__(GetDefaultForChoiceMenu)", (WORD)i);
#endif
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
#ifdef DEBUG_OSD
dPrintf("\r\n++(DisplayOSDMenuOneItem) ");
#endif
if( cur_osdwin == OSDMENU_TOPWIN) addr = OSDMENU_MAINADDR;
else addr = OSDMENU_SUBADDR;
addr = addr + x + y*MenuFormat->width;
#ifdef DEBUG_OSD
dPrintf("\r\nStartaddr:%d", addr);
#endif
if( DMp->IconColor !=NIL ) { // Draw Icon
//if(OnChangingValue) IconColor = BG_COLOR_BLACK|CH_COLOR_WHITE|EXTENDED_COLOR;
//else
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++;
#ifdef DEBUG_OSD
dPrintf("\r\naddr:%d x:%d y:%d MenuFormat->width:%d", addr, (WORD)x, (WORD)y, (WORD)MenuFormat->width );
#endif
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.
// Menu contents view
/*if( x < (MenuFormat->width) )
if( x < (MAX_DESC + ICON_CH_SZ) ){
//x+=2;
ClearDataCnt(addr, 2);
addr+=2;
}*/
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;
#ifdef DEBUG_OSD
dPrintf("\r\n++(GetItemValue) id:0x%x __", (WORD)id);
#endif
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 = GetPhaseCurrent(); 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; // changed wrong offset value // Hans
case VIDEO_BACKLIGHT:
val = GetVideoDatawithOffset(backlight); break; // changed wrong offset value // Hans
case AUDIO_VOLUME: val = GetAudioVol(); break;
#ifdef SUPPORT_MSP_AUDIO
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;
#endif
#ifdef SUPPORT_TV
#ifdef NTSC_TV
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -