📄 stpmain.c
字号:
}
}
// *********************************************************************
// Function : void vShowMenu(void) large
// Description : show a Menu
// 1. clear setup screen
// 2. get valid item
// 3. run the page special function
// 4. show head and message wb message
// 5. show item wb
// Parameter : None
// Return : None
// *********************************************************************
static void vShowMenu(sMenu *prMenu) large
{
if (prMenu->bType == PAGE_TYPE_V_DIALOG)
{
vDrawDialog(prMenu);
// vOsdPasteBmpXY(0, 0, WB_SETUP_HEAD, BMP_LT_CORNER);
// vOsdPasteBmpXY(0, SETUP_MSG_END_Y-SETUP_MSG_START_Y-15, WB_SETUP_MSG, BMP_LB_CORNER);
// vOsdPasteBmpXY(SETUP_HEAD_END_X - SETUP_HEAD_START_X - 15, 0, WB_SETUP_HEAD, BMP_RT_CORNER);
// vOsdPasteBmpXY(SETUP_MSG_END_X - SETUP_MSG_START_X - 15, SETUP_MSG_END_Y-SETUP_MSG_START_Y-15, WB_SETUP_MSG, BMP_RB_CORNER);
}
else
{
vDrawMenu(prMenu);
}
}
static void vDrawMenu(sMenu *prMenu) large
{
BYTE (code *bDeal)(WORD wEEPos, BYTE bValue) large;
BYTE bTemp;
BYTE bTempItem;
BYTE bStart;
BYTE pbStr[10];
// 1. clear setup screen
vClearItemRng();
vClearMsgRng();
// vOsdPasteBmpXY(0, 0, WB_SETUP_HEAD, BMP_LT_CORNER);
// vOsdPasteBmpXY(0, SETUP_MSG_END_Y-SETUP_MSG_START_Y-15, WB_SETUP_MSG, BMP_LB_CORNER);
// vOsdPasteBmpXY(SETUP_HEAD_END_X - SETUP_HEAD_START_X - 15, 0, WB_SETUP_HEAD, BMP_RT_CORNER);
// vOsdPasteBmpXY(SETUP_MSG_END_X - SETUP_MSG_START_X - 15, SETUP_MSG_END_Y-SETUP_MSG_START_Y-15, WB_SETUP_MSG, BMP_RB_CORNER);
bTempItem = _bEntry;
// 2. get valid item
_wInvalid = 0xFFFF;
vChkValid(prMenu->bInvType);
// find first valid item
if (_wInvalid == 0)
return;
while (!(_wInvalid & (0x01<<_bEntry-1)))
{
_bEntry ++;
}
if (!(_wInvalid & (0x01<<_bPrevItem-1)))
{
_bPrevItem = INVALID_ENTRY;
}
// 3. run the page special function
vDrawSpecificPage(prMenu->bMenuType);
bTempItem = _bEntry;
_bPrevMenu = _bMenu;
if ((prMenu->bType == PAGE_TYPE_MAINMENU) ||
(prMenu->bType == PAGE_NML))
{
bStart = bCalMaxMinShow(prMenu->bType, prMenu->bTotalEntry, _rMenuRoot.bEntryNo);
#ifdef CHK_PASSWD_VCD_EN
if ((_bMenu == THREED_PAGE) && (bEepromReadByte(VCD_PASSWRD_POSITION) == FALSE))
{
bStart = 1;
_bMinShowData = 2;
}
#endif
//Show page title. [runma] add block
if((prMenu->bType == PAGE_NML)||(_bOsdState == STPSTT_MAINMENU)) //r
{
_wStartX = 0;
_wStartY = 0; //STP_MENU_START_Y - NML_SPACE;
_wEndX = SETUP_ITEM_END_X - SETUP_ITEM_START_X-1;
_wEndY = _wStartY + STP_MENU_ENTRY_H;
vRectangle(WB_SETUP_ITEM, 0, 0, TRUE, ENTRY_COL_DARKGRAY);
vSetItemPos(1,1); //set page title position. 0,1 is not good .
_wStartY = 0;
vSetMsgCol4(WB_SETUP_ITEM, ENTRY_COL_DARKGRAY, ENTRY_COL_DARKGRAY, ENTRY_COL_BLACK, ENTRY_COL_PINK); //[runma], modify for pro design.
vOsdPasteMsgXY(_wStartX,_wStartY, WB_SETUP_ITEM,prMenu->wHdrMsg);
}
//[runma] end of block
for(bTemp = _bMinShowData - 1; bTemp < _bMaxShowData; bTemp++)
{
if (prMenu->prEntry[bTemp]->wType == ENTRY_TYPE_NULL)
{
continue;
}
_bEntry = bTemp;
vSetItemPos(bTemp+1, _bMinShowData);
if (_wInvalid & (1<<bTemp))
vSetMsgCol4(WB_SETUP_ITEM, ENTRY_COL_BG, ENTRY_COL_BG, ENTRY_COL_BLACK, ENTRY_COL_WHITE); //[runma], _bg -> _black
else
vSetMsgCol4(WB_SETUP_ITEM, ENTRY_COL_BG, ENTRY_COL_BG, ENTRY_COL_BG /*ENTRY_COL_BLACK*/, ENTRY_COL_DARKGRAY); //[runma], _bg -> _black, yellow->green
vSetupEntryShow(prMenu->prEntry[bTemp]->wEntryMsg, WB_SETUP_ITEM);
vShowEntryValue(prMenu->prEntry[bTemp],TRUE);
#ifdef ITEM_SHOW_BMP
_wStartX = 10;
if (prMenu->prEntry[bTemp]->wBmpIdx != 0xFFFF)
{
vPasteBmp(WB_SETUP_ITEM, prMenu->prEntry[bTemp]->wBmpIdx);
}
#endif
}
}
_bEntry = bTempItem;
if(_bOsdState != STPSTT_MAINMENU)
{
vEntryAct();
vShowRelatedMsg(prMenu);
}
else
{
vShowRelatedMsg(_rMenuRoot.prMenu[0]);
}
#if (SETUP_MENU_DATA_STYLE == STP_STICK_DATA)
#if 0 //r add 1 -> 0
_bDataCur = prMenu->prEntry[_bEntry-1]->wMaxOpt+1;
_bDataSel = bGetOptFromEeprom(prMenu->prEntry[_bEntry-1]);
if(_bOsdState != STPSTT_MAINMENU) //r
vCtrlDraw(prMenu->prEntry[_bEntry-1]->wType, _bEntry);
_bDataCur=_bDataSel;
#else
if(_bOsdState != STPSTT_MAINMENU) //r
{
_bDataCur = prMenu->prEntry[_bEntry-1]->wMaxOpt+1;
_bDataSel = bGetOptFromEeprom(prMenu->prEntry[_bEntry-1]);
vCtrlDraw(prMenu->prEntry[_bEntry-1]->wType, _bEntry);
_bDataCur=_bDataSel;
}
#endif
#endif
}
static void vEnVerMenu(void) large
{
if ((_bMenu == GENERAL_PAGE) && (_bEnVerIdx != 0x0F))
{
if ((_bEnVerIdx < sizeof(_pbEnVerMenu)/sizeof(BYTE)) && (_bIRKey == _pbEnVerMenu[_bEnVerIdx]))
{
_bEnVerIdx++;
}
else
{
_bEnVerIdx = 0;
}
if (_bEnVerIdx == sizeof(_pbEnVerMenu)/sizeof(BYTE))
{
_bEnVerIdx = 0x0F;
_bDlgId = DLG_VERSION;
_bOsdState = STPSTT_DIALOG;
_bMenu = VER_PAGE;
vRedrawMenu(ENTRY_FUN_REDRAW);
}
}
}
#ifdef ENABLE_USER_LANG_CODE
BYTE bCheckLangCode(WORD wEEPos, BYTE bValue) large
{
BYTE bTmp1, bTmp2;
bTmp1 = bSharedInfo(SH_DLG_VAL_0) * 10 + bSharedInfo(SH_DLG_VAL_1);
bTmp2 = bSharedInfo(SH_DLG_VAL_2) * 10 + bSharedInfo(SH_DLG_VAL_3);
switch(_bDlgId)
{
case DLG_AUDIO_LANG_CODE:
fgEepromWriteByte(AUDIO_LCD_POSITION_0, bTmp1);
fgEepromWriteByte(AUDIO_LCD_POSITION_1, bTmp2);
vSystemPrefAuLang('a'-'A' + bTmp1, 'a'-'A' + bTmp2);
break;
case DLG_MENU_LANG_CODE:
fgEepromWriteByte(MENU_LCD_POSITION_0, bTmp1);
fgEepromWriteByte(MENU_LCD_POSITION_1, bTmp2);
vSystemPrefMenuLang('a'-'A' + bTmp1, 'a'-'A' + bTmp2);
break;
case DLG_SP_LANG_CODE:
fgEepromWriteByte(SP_LCD_POSITION_0, bTmp1);
fgEepromWriteByte(SP_LCD_POSITION_1, bTmp2);
vSystemPrefSpLang('a'-'A' + bTmp1, 'a'-'A' + bTmp2);
break;
}
return RESULT_SUCCESS;
}
#endif
static BOOL fgMainMenuPrev(sMenu *prMenu) large
{
BYTE bPrevPage = _bMenuCur;
BYTE bPrevMenu = _bMainMenu;
vDrawMenuBtn(prMenu, _bMainMenu, FALSE);
do {
_bMainMenu--;
if (_bMainMenu < 1 )
{
#ifdef SETUP_CIRCULAR_ITEM
_bMainMenu = prMenu->bTotalEntry;
#else
_bMainMenu = bPrevMenu;
return (FALSE);
#endif
}
} while(((_wMenuInvalid & (1<<(_bMainMenu-1))) == 0)
||(prMenu->prEntry[_bMainMenu-1]->wType == ENTRY_TYPE_NULL));
#if 0
#ifndef SETUP_CIRCULAR_ITEM
if(_bMainMenu == 1)
{
return(FALSE);
}
#endif
#ifdef SETUP_CIRCULAR_ITEM
if (_bMainMenu == 1)
{
_bMainMenu = prMenu->bTotalEntry;
}
else
#endif
{
_bMainMenu--;
}
while (!(_wMenuInvalid & (0x01<<_bMainMenu-1)) ||
(prMenu->prEntry[_bMainMenu-1]->wType == ENTRY_TYPE_NULL))
{
if(_bMainMenu == 0)
{
break;
}
_bMainMenu --;
}
if ((_bMainMenu == 0) && (bPrevPage == prMenu->bTotalEntry))
{
_bMainMenu = prMenu->bTotalEntry;
}
else if (_bMainMenu == 0)
{
while (!(_wMenuInvalid & (0x01<<_bMainMenu-1)) || (prMenu->prEntry[_bMainMenu-1]->wType == ENTRY_TYPE_NULL))
{
_bMainMenu++;
}
}
#endif
vDrawMenuBtn(prMenu, _bMainMenu, TRUE);
_bMenu = prMenu->prEntry[_bMainMenu-1]->wEEPos;
_bEntry = 1;
_bOsdState = STPSTT_MAINMENU; //r
return (TRUE);
}
static BOOL fgMainMenuNext(sMenu *prMenu) large
{
BYTE bPrevMenu;
bPrevMenu = _bMainMenu;
vDrawMenuBtn(prMenu, _bMainMenu, FALSE);
//[runma] modify block
do {
_bMainMenu++;
if (_bMainMenu > prMenu->bTotalEntry)
{
#ifdef SETUP_CIRCULAR_ITEM
_bMainMenu = 1;
#else
_bMainMenu = bPrevMenu;
return (FALSE);
#endif
}
} while(((_wMenuInvalid & (1<<(_bMainMenu-1))) == 0)
||(prMenu->prEntry[_bMainMenu-1]->wType == ENTRY_TYPE_NULL));
vDrawMenuBtn(prMenu, _bMainMenu, TRUE);
_bMenu = prMenu->prEntry[_bMainMenu-1]->wEEPos;
_bEntry = 1;
_bOsdState = STPSTT_MAINMENU;
return TRUE;
}
static void vSetItemPos(BYTE bIndex, BYTE bOffset) large
{
switch(_rMenuRoot.prMenu[_bMenu]->bType)
{
case PAGE_TYPE_V_DIALOG:
_wStartX = DIALOG_X + DIALOG_START_X;
_wEndX = DIALOG_X + DIALOG_W - DIALOG_START_X;
_wStartY = (SETUP_ITEM_H - (bOffset + 2) * DIALOG_LINE_H) / 2 + (bIndex * DIALOG_LINE_H);
_wEndY = _wStartY + DIALOG_LINE_H;
break;
default:
_wStartX = STP_ENTRY_START_X;
_wStartY = STP_MENU_START_Y + (WORD) STP_MENU_ENTRY_H * (bIndex - bOffset) + bIndex;
_wEndX = STP_ENTRY_START_X + STP_ENTRY_END_X;
_wEndY = _wStartY + STP_MENU_ENTRY_H - 1;
break;
}
}
static void vEntryAct(void) large
{
sMenu *prMenu = _rMenuRoot.prMenu[_bMenu];
if (_bOsdState == STPSTT_DIALOG)
{
vSetItemPos(_bEntry, prMenu->bTotalEntry);
if ((_bEntry == prMenu->bTotalEntry) && (prMenu->prEntry[_bEntry-1]->wType == ENTRY_TYPE_RETURN))
{
vSetBtnCol(WB_SETUP_ITEM, ENTRY_COL_DARKGRAY, ENTRY_COL_YELLOW, ENTRY_COL_BLACK, ENTRY_COL_WHITE);
vSetMsgCol4(WB_SETUP_ITEM, ENTRY_COL_DARKGRAY, ENTRY_COL_DARKGRAY, ENTRY_COL_DARKGRAY, ENTRY_COL_YELLOW);
vSelButton(WB_SETUP_ITEM, 10);
return;
}
else
{
vSetMsgCol4(WB_SETUP_ITEM, ENTRY_COL_DARKGRAY, ENTRY_COL_DARKGRAY, ENTRY_COL_DARKGRAY, ENTRY_COL_YELLOW);
vSetBtnCol(WB_SETUP_ITEM, ENTRY_COL_YELLOW, ENTRY_COL_DARKGRAY, ENTRY_COL_BLACK, ENTRY_COL_WHITE);
vUnselButton(WB_SETUP_ITEM, 10);
}
}
else
{
vSetItemPos(_bEntry, _bMinShowData);
}
_wStartX -= 4; //[runma] add line
vChgColRep(WB_SETUP_ITEM, 0, ENTRY_COL_GREEN); //[runma] add line
}
// return true : need redraw
static BOOL fgEntryPrev(sMenu *prMenu) large
{
BYTE bPrevItem;
if(prMenu->bTotalEntry == 1)
return(FALSE);
#ifndef SETUP_CIRCULAR_ITEM
if(_bEntry == 1)
{
return(FALSE);
}
#else
if (prMenu->bType != PAGE_TYPE_V_DIALOG)
_bDataPrev = INVALID_DATA;
if (_bEntry == 1)
{
bPrevItem = 1;
_bEntry = prMenu->bTotalEntry;
}
else
#endif
{
bPrevItem = _bEntry;
_bEntry--;
}
#if 0
while ((_bEntry != 1) &&
((prMenu->prEntry[_bEntry-1]->wType == ENTRY_TYPE_EDITBOX_ORDERED) ||
(prMenu->prEntry[_bEntry-1]->wType == ENTRY_TYPE_NULL)) )
{
_bEntry--;
}
#endif
while (!(_wInvalid & (0x01<<_bEntry-1)) ||
(prMenu->prEntry[_bEntry-1]->wType == ENTRY_TYPE_NULL))
{
//[runma] modify the block.
#ifdef SETUP_CIRCULAR_ITEM
if(_bEntry == bPrevItem) //[runma] 0 -> bPrevItem
{
break;
}
else if (_bEntry==1)
{
_bEntry=prMenu->bTotalEntry;
}
#else
if(_bEntry==1)
{
_bEntry=bPrevItem; //not circular item and not found a suitable item.
break;
}
#endif
else
{
_bEntry --;
}
//[runma] end of block.
}
#if 0 //[runma] add line
if (_bEntry == 0)
{
if (bPrevItem == _rMenuRoot.prMenu[_bMenu]->bTotalEntry)
{
_bEntry = prMenu->bTotalEntry;
}
else
{
while (!(_wInvalid & (0x01<<_bEntry-1)) || (prMenu->prEntry[_bEntry-1]->wType == ENTRY_TYPE_NULL))
{
_bEntry ++;
}
}
}
#endif //[runma] add line
//_bDataCur = _bDataSel = bGetOptFromEeprom(prMenu->prEntry[_bEntry-1]);
if (fgCalEntryShowRange(prMenu->bTotalEntry, _rMenuRoot.bEntryNo))
{
vShowMenu(_rMenuRoot.prMenu[_bMenu]);
}
vSetItemPos(bPrevItem, _bMinShowData);
_wStartX -=4;
vChgColRep(WB_SETUP_ITEM,ENTRY_COL_GREEN,0);
vEntryAct();
if (_bOsdState == STPSTT_DIALOG)
{
_bDataCur = 0;
#ifdef IR_SUPPORT_SHIFT_KEY
if ((prMenu->prEntry[_bEntry-1]->wType == ENTRY_TYPE_EDITBOX) ||
(prMenu->prEntry[_bEntry-1]->wType == ENTRY_TYPE_EDITBOX_ORDERED))
{
vSetShiftKeyMode(FALSE);
}
#endif
}
else
{
vCtrlClear(prMenu->prEntry[bPrevItem-1]->wType, bPrevItem);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -