⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stpmain.c

📁 MTK 1389E SOURCE CODE
💻 C
📖 第 1 页 / 共 5 页
字号:
  }
}

// *********************************************************************
// 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 + -