www.pudn.com > 6027_HD65.rar > selmenu.c


/**********************************************************************/ 
/***************    MTK CONFIDENTIAL & COPYRIGHTED     ****************/ 
/***************                                       ****************/ 
/***************  $Modtime:: 04/07/28 1:19p    $       ****************/ 
/***************  $Revision:: 9                $       ****************/ 
/***************                                       ****************/ 
/***************   Description : Program State         ****************/ 
/***************                 Machine               ****************/ 
/***************                                       ****************/ 
/***************       Company : MediaTek Inc.         ****************/ 
/***************    Programmer : Sung-Ching Lin        ****************/ 
/**********************************************************************/ 
 
#include "general.h" 
 
#pragma NOAREGS 
 
#if (defined(PLAYER_PROGRAM) || defined(PLAYER_DIGEST)) 
 
#define PROGRAM_KEY_EXIT 
#define PROGRAM_STOP_CLEAR 
 
// ********************************************************************* 
// Local Define 
// ********************************************************************* 
/* for program state */ 
enum { 
  PROG_STATE_EXIT, 
  PROG_STATE_SELECT, 
  PROG_STATE_PREV, 
  PROG_STATE_NEXT, 
  PROG_STATE_START_STOP, 
  PROG_STATE_INPUT, 
  PROG_STATE_INPUT_1 
}; 
 
#define PROG_ITEM_TYPE_TIME     0 
#define PROG_ITEM_TYPE_TT_CH    1 
 
typedef struct structSelMenu 
{ 
  /* BYTE 1 */ 
  BYTE bState:3; 
  BYTE bHili:4; 
  BYTE bPage:1; 
  /* BYTE 2 */ 
  BYTE bSelNoValid:4; 
  BYTE fgPrevValid:1; 
  BYTE fgNextValid:1; 
  BYTE fgExitValid:1; 
  BYTE fgStartStopValid:1; 
  /* BYTE 3 */ 
  BYTE bItemType:1; 
  BYTE fgWaitProgStop:1; 
  BYTE fgListValid:1; 
  BYTE bReserve:5; 
  /* BYTE 4 */ 
  BYTE bSelNoMax; 
} strucSelMenu; 
 
static xdata strucSelMenu _rSelMenu; 
 
static code BYTE pbSelMenuHiliState[14] = { 
  PROG_STATE_SELECT,      /*  0 */ 
  PROG_STATE_SELECT,      /*  1 */ 
  PROG_STATE_SELECT,      /*  2 */ 
  PROG_STATE_SELECT,      /*  3 */ 
  PROG_STATE_SELECT,      /*  4 */ 
  PROG_STATE_SELECT,      /*  5 */ 
  PROG_STATE_SELECT,      /*  6 */ 
  PROG_STATE_SELECT,      /*  7 */ 
  PROG_STATE_SELECT,      /*  8 */ 
  PROG_STATE_SELECT,      /*  9 */ 
  PROG_STATE_PREV,        /* 10 */ 
  PROG_STATE_EXIT,        /* 11 */ 
  PROG_STATE_START_STOP,  /* 12 */ 
  PROG_STATE_NEXT         /* 13 */ 
}; 
 
#define bSelMenuHiliState(bHili) (pbSelMenuHiliState[bHili]) 
 
// ********************************************************************* 
// Macros 
// ********************************************************************* 
BYTE bSelMenuHiliItemNo(BYTE bPage, BYTE bHili) large 
{ 
  BYTE bSelNo; 
 
  bSelNo = bPage * SELMENU_PAGE_SIZE; 
 
  if (bHili >= SELMENU_PAGE_SIZE) 
  { 
    bSelNo += (SELMENU_PAGE_SIZE - 1); 
  } 
  else 
  { 
    bSelNo += bHili; 
  } 
   
  return (bSelNo); 
} 
 
#ifdef PLAYER_PROGRAM 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vSelMenuReset(void) large 
{ 
  vSetSharedInfo(SI_USR_PROGRAM_TYPE, SV_PROGRAM_NONE_ITEM); 
  /* vSetSharedInfo(SI_USR_PROGRAM_NO, 0); */ 
  vSetSharedInfo(SI_USR_PROGRAM_NS, 0); 
} 
#endif 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BYTE bSelMenuReadItem(BYTE bItemIdx, BYTE *pbTime) large 
{ 
  if (bItemIdx >= SV_PROGRAM_MAX_ITEM) 
  { 
    return (0); 
  } 
 
  if (pbTime != 0) 
  { 
    pbTime[0] = bSharedInfo(SI_USR_PROGRAM_ITEM_1 + bItemIdx * SV_PROGRAM_ITEM_SIZE + 1); 
    pbTime[1] = bSharedInfo(SI_USR_PROGRAM_ITEM_1 + bItemIdx * SV_PROGRAM_ITEM_SIZE + 2); 
    pbTime[2] = bSharedInfo(SI_USR_PROGRAM_ITEM_1 + bItemIdx * SV_PROGRAM_ITEM_SIZE + 3); 
  } 
 
  return (bSharedInfo(SI_USR_PROGRAM_ITEM_1 + bItemIdx * SV_PROGRAM_ITEM_SIZE)); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
static void vSelMenuSetItem(BYTE bItemIdx, BYTE bSelNo, BYTE *pbTime) large 
{ 
  if (bItemIdx >= SV_PROGRAM_MAX_ITEM) 
  { 
    return; 
  } 
 
  vSetSharedInfo(SI_USR_PROGRAM_ITEM_1 + bItemIdx * SV_PROGRAM_ITEM_SIZE, bSelNo); 
 
  if (pbTime != 0) 
  { 
    vSetSharedInfo(SI_USR_PROGRAM_ITEM_1 + bItemIdx * SV_PROGRAM_ITEM_SIZE + 1, pbTime[0]); 
    vSetSharedInfo(SI_USR_PROGRAM_ITEM_1 + bItemIdx * SV_PROGRAM_ITEM_SIZE + 2, pbTime[1]); 
    vSetSharedInfo(SI_USR_PROGRAM_ITEM_1 + bItemIdx * SV_PROGRAM_ITEM_SIZE + 3, pbTime[2]); 
  } 
  else 
  { 
    vSetSharedInfo(SI_USR_PROGRAM_ITEM_1 + bItemIdx * SV_PROGRAM_ITEM_SIZE + 1, 0); 
    vSetSharedInfo(SI_USR_PROGRAM_ITEM_1 + bItemIdx * SV_PROGRAM_ITEM_SIZE + 2, 0); 
    vSetSharedInfo(SI_USR_PROGRAM_ITEM_1 + bItemIdx * SV_PROGRAM_ITEM_SIZE + 3, 0); 
  } 
 
   
  /* notify here ? */ 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
static void vSelMenuResetItem(void) large 
{ 
  BYTE i; 
 
  vSetSharedInfo(SI_USR_PROGRAM_NS, 0); 
  vSetSharedInfo(SI_USR_PROGRAM_NO, 0); 
 
  for (i = 0; i < SV_PROGRAM_MAX_ITEM; i++) 
  { 
    /* clear all item's slected number to 0 */ 
    vSetSharedInfo(SI_USR_PROGRAM_ITEM_1 + i * SV_PROGRAM_ITEM_SIZE, 0); 
  } 
 
  _rSelMenu.fgListValid = FALSE; 
} 
 
// ********************************************************************* 
// Function : void vSelMenuShowBar(void) large 
// Description : 
// Parameter :  
// Return    : None 
// Note      :  
// ********************************************************************* 
static void vSelMenuShowBar(void) large 
{ 
  BYTE bStartStop; 
 
  if (bSharedInfo(SI_USR_PBC_CTRL) == SV_PROGRAM) 
  { 
    bStartStop = SV_PROGRAM_STOP; 
  } 
  else 
  { 
    bStartStop = SV_PROGRAM_START; 
  } 
 
  vOsdPosPaste(OSD_POS_PROG_BAR_2, OSD_MSG_EXIT); 
  _rSelMenu.fgExitValid = TRUE; /* always valid */ 
   
  if (_rSelMenu.bPage > 0) 
  { 
    vOsdPosPaste(OSD_POS_PROG_BAR_1, OSD_MSG_PREV_PAGE); 
    _rSelMenu.fgPrevValid = TRUE; 
  } 
  else 
  { 
    vOsdPosClear(OSD_POS_PROG_BAR_1); 
    _rSelMenu.fgPrevValid = FALSE; 
  } 
 
  if (_rSelMenu.bPage < SELMENU_PAGE_NS - 1) 
  { 
    vOsdPosPaste(OSD_POS_PROG_BAR_4, OSD_MSG_NEXT_PAGE); 
    _rSelMenu.fgNextValid = TRUE; 
  } 
  else 
  { 
    vOsdPosClear(OSD_POS_PROG_BAR_4); 
    _rSelMenu.fgNextValid = FALSE; 
  } 
 
  vOsdPosClear(OSD_POS_PROG_BAR_3); 
  if ((bSharedInfo(SI_USR_PROGRAM_NS) > 0) && 
      (bSharedInfo(SI_USR_PROGRAM_TYPE) != SV_PROGRAM_NONE_ITEM)) 
  { 
    if (bStartStop == SV_PROGRAM_START) 
    { 
      vOsdPosPaste(OSD_POS_PROG_BAR_3, OSD_MSG_START); 
    } 
    else /* if (bStartStop == SV_PROGRAM_STOP) */ 
    { 
      vOsdPosPaste(OSD_POS_PROG_BAR_3, OSD_MSG_STOP); 
    } 
    _rSelMenu.fgStartStopValid = TRUE; 
  } 
  else 
  { 
    _rSelMenu.fgStartStopValid = FALSE; 
  } 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BYTE bSelMenuGetBarNextValid(BYTE bCurrState) large 
{ 
  BYTE bState; 
   
  switch (bCurrState) 
  { 
    case PROG_STATE_SELECT: 
      if (_rSelMenu.fgPrevValid) 
      { 
        bState = PROG_STATE_PREV; 
        break; 
      } 
    case PROG_STATE_PREV: 
      if (_rSelMenu.fgExitValid) 
      { 
        bState = PROG_STATE_EXIT; 
        break; 
      } 
    case PROG_STATE_EXIT: 
      if (_rSelMenu.fgStartStopValid) 
      { 
        bState = PROG_STATE_START_STOP; 
        break; 
      } 
    case PROG_STATE_START_STOP: 
      if (_rSelMenu.fgNextValid) 
      { 
        bState = PROG_STATE_NEXT; 
        break; 
      }       
    case PROG_STATE_NEXT: 
    default: 
      bState = PROG_STATE_SELECT; 
      break; 
  } 
 
  return (bState); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BYTE bSelMenuGetBarPrevValid(BYTE bCurrState) large 
{ 
  BYTE bState; 
   
  switch (bCurrState) 
  { 
    case PROG_STATE_SELECT: 
      if (_rSelMenu.fgNextValid) 
      { 
        bState = PROG_STATE_NEXT; 
        break; 
      } 
    case PROG_STATE_NEXT: 
      if (_rSelMenu.fgStartStopValid) 
      { 
        bState = PROG_STATE_START_STOP; 
        break; 
      } 
    case PROG_STATE_START_STOP: 
      if (_rSelMenu.fgExitValid) 
      { 
        bState = PROG_STATE_EXIT; 
        break; 
      } 
    case PROG_STATE_EXIT: 
      if (_rSelMenu.fgPrevValid) 
      { 
        bState = PROG_STATE_PREV; 
        break; 
      } 
    case PROG_STATE_PREV: 
    default: 
      bState = PROG_STATE_SELECT; 
      break; 
  } 
 
  return (bState); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
static void vSelMenuShowPage(BYTE bPageIdx, BYTE bHeader) large 
{ 
  BYTE i; 
  BYTE bTmp = bSharedInfo(SI_USR_PROGRAM_TYPE); 
  BYTE pbTime[3]; 
 
  if (bPageIdx >= SELMENU_PAGE_NS) 
  { 
    return; 
  } 
 
  if (bHeader) 
  { 
    bHeader = OSD_PROG_ITEM_HEADER; 
  } 
  else 
  { 
    bHeader = OSD_PROG_ITEM_NORMAL; 
  } 
 
  if (bTmp == SV_PROGRAM_NONE_ITEM) 
  { 
    for(i = bPageIdx * SELMENU_PAGE_SIZE; i < (bPageIdx + 1) * SELMENU_PAGE_SIZE; i++) 
    { 
      if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TT_CH) 
      { 
         vOsdShowProgItemTtCh(i, bHeader, 0, 0); 
      } 
      else /* if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TIME) */ 
      { 
        vOsdShowProgItemTime(i, bHeader, 0, 0); 
      } 
    } 
  } 
  else 
  { 
    for(i = bPageIdx * SELMENU_PAGE_SIZE; i < (bPageIdx + 1) * SELMENU_PAGE_SIZE; i++) 
    { 
      bTmp = bSelMenuReadItem(i, pbTime); 
       
      if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TT_CH) 
      { 
        if ((bTmp > 0) && (bTmp <= _rSelMenu.bSelNoMax) && 
            (pbTime[0] <= bSharedInfo(SI_DVD_TT_CH + bTmp - 1))) 
        { 
          vOsdShowProgItemTtCh(i, bHeader, bTmp, pbTime[0]); 
        } 
        else 
        { 
          vOsdShowProgItemTtCh(i, bHeader, 0, 0); 
        } 
      } 
      else /* if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TIME) */ 
      { 
        if ((bTmp > 0) && (bTmp <= _rSelMenu.bSelNoMax)) 
        { 
          if ((pbTime[0] <= 9) && (bBCDToHEX(pbTime[1]) <= 59) && 
                                  (bBCDToHEX(pbTime[2]) <= 59)) 
          { 
            vOsdShowProgItemTime(i, bHeader, bTmp, pbTime); 
          } 
          else 
          { 
            vOsdShowProgItemTime(i, bHeader, bTmp, 0); 
          } 
        } 
        else 
        { 
          vOsdShowProgItemTime(i, bHeader, 0, 0); 
        } 
      } /* _rSelMenu.bItemType */ 
    } 
  } 
 
  vSelMenuShowBar(); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
static void vSelMenuGotoBar(BYTE bState) large 
{  
  switch (bState) 
  { 
    case PROG_STATE_EXIT: 
      vOsdPosHili(OSD_POS_HILI_SHOW, OSD_POS_PROG_BAR_2, 0); 
      break; 
     
    case PROG_STATE_PREV: 
      vOsdPosHili(OSD_POS_HILI_SHOW, OSD_POS_PROG_BAR_1, 0); 
      break; 
 
    case PROG_STATE_NEXT: 
      vOsdPosHili(OSD_POS_HILI_SHOW, OSD_POS_PROG_BAR_4, 0); 
      break; 
 
    case PROG_STATE_START_STOP: 
      vOsdPosHili(OSD_POS_HILI_SHOW, OSD_POS_PROG_BAR_3, 0); 
      break; 
           
    case PROG_STATE_SELECT: 
    case PROG_STATE_INPUT: 
    case PROG_STATE_INPUT_1: 
    default: 
      break; 
  } 
 
  _rSelMenu.bState = bState; 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
static void vSelMenuGotoItem(BYTE bItemIdx) large 
{ 
  BYTE bPage; 
   
  if (bItemIdx >= (SELMENU_PAGE_SIZE * SELMENU_PAGE_NS)) 
  { 
    return; 
  } 
 
  bPage = 0; 
 
  while (bItemIdx >= SELMENU_PAGE_SIZE) 
  { 
    bItemIdx -= SELMENU_PAGE_SIZE; 
    bPage++; 
  } 
 
  if (bPage != _rSelMenu.bPage) 
  { 
    _rSelMenu.bPage = bPage; 
    vSelMenuShowPage(bPage, OSD_PROG_ITEM_HEADER);  
  } 
 
  _rSelMenu.bHili = bItemIdx; 
  vOsdPosHili(OSD_POS_HILI_SHOW, OSD_POS_PROG_ITEM_1 + bItemIdx, 0); 
 
  _rSelMenu.bState = bSelMenuHiliState(_rSelMenu.bHili); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
static void vSelMenuBarActive(BYTE bState) large 
{  
  BYTE bType = bSharedInfo(SI_USR_PROGRAM_TYPE); 
  BYTE bRepeatType = bSharedInfo(SI_REPEAT_MODE); 
 
  switch (bState) 
  { 
    case PROG_STATE_EXIT: 
      if (_rSelMenu.fgExitValid) 
      { 
        vSetExitInputState(); 
      } 
      break; 
     
    case PROG_STATE_PREV: 
      if (_rSelMenu.fgPrevValid) 
      { 
        if (bType == SV_PROGRAM_NONE_ITEM) 
        { 
          _rSelMenu.bPage--; 
          vSelMenuShowPage(_rSelMenu.bPage, OSD_PROG_ITEM_HEADER); 
          vSelMenuGotoBar(PROG_STATE_NEXT); 
        } 
        else 
        { 
          vSelMenuGotoItem(bSelMenuHiliItemNo(_rSelMenu.bPage - 1, SELMENU_PAGE_SIZE - 1)); 
        } 
      } 
      break; 
 
    case PROG_STATE_NEXT: 
      if (_rSelMenu.fgNextValid) 
      { 
        if (bType == SV_PROGRAM_NONE_ITEM) 
        { 
          _rSelMenu.bPage++; 
          vSelMenuShowPage(_rSelMenu.bPage, OSD_PROG_ITEM_HEADER); 
          vSelMenuGotoBar(PROG_STATE_PREV); 
        } 
        else 
        { 
          vSelMenuGotoItem(bSelMenuHiliItemNo(_rSelMenu.bPage + 1, 0)); 
        } 
      } 
      break; 
 
    case PROG_STATE_START_STOP: 
      if (_rSelMenu.fgStartStopValid) 
      { 
        // FIXME: race condition 
        // risc state isn't equal to state in shared memory 
        // Wait UOP_PROGRAM notify to confirm state consistency 
        if (bSharedInfo(SI_USR_PBC_CTRL) == SV_PROGRAM) 
        { 
          _rSelMenu.fgWaitProgStop = TRUE; 
          vSendUopCmd(UOP_PROGRAM, SV_PROGRAM_STOP, 0, 0); 
           
          _rSelMenu.fgListValid = TRUE; 
        } 
        else 
        { 
          _rSelMenu.fgWaitProgStop = FALSE; 
 
#ifdef USR_CTRL_CANCEL_REPEAT 
          if ((bRepeatType != SV_REPEAT_NONE) &&  
              (bRepeatType != SV_REPEAT_ABNONE)) 
          { 
            vSendUopCmd(UOP_REPEAT, SV_REPEAT_NONE, 0, 0); 
          } 
#endif /* USR_CTRL_CANCEL_REPEAT */ 
           
          if (bSharedInfo(SI_PBC_SWITCH) == SV_PBC_ON) 
          { 
            /* switch to PBC off first */ 
            vSendUopCmd(UOP_PBC_SWITCH, 0, 0, 0); 
          } 
 
          vSendUopCmd(UOP_PROGRAM, SV_PROGRAM_START, 0, 0); 
          vSetSharedInfo(SH_PROGRAM_START,SV_PROGRAM_START); 
           
          _rSelMenu.fgListValid = TRUE; 
           
          /* escape program menu immediately */ 
          vSetExitInputState(); 
        } 
        _rSelMenu.fgStartStopValid = FALSE; /* this is turned on by shared info update */ 
        vSelMenuGotoBar(PROG_STATE_EXIT); 
      } 
      break; 
           
    case PROG_STATE_SELECT: 
    case PROG_STATE_INPUT: 
    case PROG_STATE_INPUT_1: 
    default: 
      break; 
  } 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vSelMenuTimeInputStart(void) large 
{ 
  BYTE bItem = bSelMenuHiliItemNo(_rSelMenu.bPage, _rSelMenu.bHili); 
 
  if ((bItem > bSharedInfo(SI_USR_PROGRAM_NS)) ||  /* include add new one */ 
      (_rSelMenu.bState != PROG_STATE_SELECT) || 
      (bSharedInfo(SI_USR_PBC_CTRL) == SV_PROGRAM)) 
  { 
    return; 
  } 
 
#ifdef NO_ADD10_KEY 
  vNumInInitState(NUM_IN_SEQ_WAIT, 2); 
#else 
  vNumInInitState(NUM_IN_TYPE_1, 1); 
#endif 
 
  _rSelMenu.bState = PROG_STATE_INPUT; 
  vOsdPosHili(OSD_POS_HILI_CLEAR, 0, 0); 
 
  vOsdShowProgItemTime(bItem, OSD_PROG_ITEM_HILI_TIME | 0, 0, 0); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vSelMenuTimeInputEnd(BYTE bSelNo1) large 
{ 
  BYTE bItem = bSelMenuHiliItemNo(_rSelMenu.bPage, _rSelMenu.bHili); 
  BYTE bNs = bSharedInfo(SI_USR_PROGRAM_NS); 
  BYTE pbTime[3]; 
  BOOL fgItemValid = FALSE; 
 
  if (bSelNo1 != bSelMenuReadItem(bItem, 0)) 
  { 
    vSelMenuSetItem(bItem, bSelNo1, 0); 
  } 
 
  if ((bSelNo1 > 0) && (bItem == bNs)) 
  { 
    vSetSharedInfo(SI_USR_PROGRAM_NS, bItem + 1); 
    if (bNs == 0) 
    { 
      /* to show START */ 
      vSelMenuShowBar(); 
    } 
    fgItemValid = TRUE; 
  } 
 
  bSelMenuReadItem(bItem, pbTime); 
  if ((pbTime[0] <= 9) && (bBCDToHEX(pbTime[1]) <= 59) && (bBCDToHEX(pbTime[2]) <= 59) && (bSelNo1 > 0)) 
  { 
    vOsdShowProgItemTime(bItem, OSD_PROG_ITEM_NORMAL, bSelNo1, pbTime); 
  } 
  else 
  { 
    vOsdShowProgItemTime(bItem, OSD_PROG_ITEM_NORMAL, bSelNo1, 0); 
  } 
 
  _rSelMenu.bState = PROG_STATE_SELECT; 
 
  if (((bItem + 1) % SELMENU_PAGE_SIZE) && (fgItemValid)) 
  { 
    vSelMenuGotoItem(bItem + 1); 
  } 
  else 
  { 
    vShowHL(HL_1); 
  } 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BOOL fgSelMenuTimeInputState(void) large 
{ 
  BOOL fgRetValue = TRUE; 
  BYTE bItem = bSelMenuHiliItemNo(_rSelMenu.bPage, _rSelMenu.bHili); 
   
  if (_bIRKey <= IR_ADD10 || _bIRKey == IR_ADD5)  // megaa ADD5 
  { 
    fgNumInState(); 
 
    if (_rNumInStateCtx.rState.fgComplete) 
    { 
      if ((_rNumInStateCtx.wNum > 0) && 
          (_rNumInStateCtx.wNum <= _rSelMenu.bSelNoMax) && 
          (_rNumInStateCtx.rState.fgCancel == FALSE)) 
      { 
        vSelMenuTimeInputEnd(_rNumInStateCtx.wNum); 
      } 
      else 
      { 
        vSelMenuTimeInputEnd(bSelMenuReadItem(bItem, 0)); 
      } 
    } 
    else /* _rNumInStateCtx.rState.fgComplete */ 
    { 
      /* update OSD only */ 
      vOsdShowProgItemTime(bItem, OSD_PROG_ITEM_HILI_TIME | _rNumInStateCtx.rState.bDigNum, 
                           _rNumInStateCtx.wNum, 0); 
    } 
  } 
  else /* > IR_ADD10 and not IR_ADD5 */ 
  { 
    vSelMenuTimeInputEnd(bSelMenuReadItem(bItem, 0)); 
    fgRetValue = FALSE; 
  } 
 
  return (fgRetValue); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vSelMenuTtChInputStart(void) large 
{ 
  BYTE bItem = bSelMenuHiliItemNo(_rSelMenu.bPage, _rSelMenu.bHili); 
 
  if ((bItem > bSharedInfo(SI_USR_PROGRAM_NS)) ||  /* include add new one */ 
      (_rSelMenu.bState != PROG_STATE_SELECT) || 
      (bSharedInfo(SI_USR_PBC_CTRL) == SV_PROGRAM)) 
  { 
    return; 
  } 
 
#ifdef NO_ADD10_KEY 
  vNumInInitState(NUM_IN_SEQ_WAIT, 2); 
#else 
  vNumInInitState(NUM_IN_TYPE_1, 1); 
#endif 
 
  _rSelMenu.bState = PROG_STATE_INPUT; 
  vOsdPosHili(OSD_POS_HILI_CLEAR, 0, 0); 
 
  vOsdShowProgItemTtCh(bItem, OSD_PROG_ITEM_HILI_TT | 0, 0, 0); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vSelMenuTtChInputEnd(BYTE bSelNo1, BYTE bSelNo2) large 
{ 
  BYTE bItem = bSelMenuHiliItemNo(_rSelMenu.bPage, _rSelMenu.bHili); 
  BYTE bNs = bSharedInfo(SI_USR_PROGRAM_NS); 
  BYTE pbTime[3]; 
  BOOL fgItemValid = FALSE; 
 
  if (bSelNo1 != bSelMenuReadItem(bItem, pbTime)) 
  { 
    pbTime[0] = bSelNo2; 
    vSelMenuSetItem(bItem, bSelNo1, pbTime); 
  } 
  else if (pbTime[0] != bSelNo2) 
  { 
    pbTime[0] = bSelNo2; 
    vSelMenuSetItem(bItem, bSelNo1, pbTime); 
  } 
 
  if ((bSelNo1 > 0) && (bSelNo2 > 0) && (bItem == bNs)) 
  { 
    vSetSharedInfo(SI_USR_PROGRAM_NS, bItem + 1); 
    if (bNs == 0) 
    { 
      /* to show START */ 
      vSelMenuShowBar(); 
    } 
    fgItemValid = TRUE; 
  } 
 
  bSelMenuReadItem(bItem, pbTime); 
  if (pbTime[0] <= bSharedInfo(SI_DVD_TT_CH + bSelNo1 - 1)) 
  { 
    vOsdShowProgItemTtCh(bItem, OSD_PROG_ITEM_NORMAL, bSelNo1, pbTime[0]); 
  } 
  else 
  { 
    vOsdShowProgItemTtCh(bItem, OSD_PROG_ITEM_NORMAL, 0, 0); 
  } 
 
  _rSelMenu.bState = PROG_STATE_SELECT; 
 
  /* update chapter input range */ 
  vOsdShowProgType(SV_PROGRAM_TT_CH_ITEM, _rSelMenu.bSelNoMax, 0); 
 
  if (((bItem + 1) % SELMENU_PAGE_SIZE) && (fgItemValid)) 
  { 
    vSelMenuGotoItem(bItem + 1); 
  } 
  else 
  { 
    vShowHL(HL_1); 
  } 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BOOL fgSelMenuTtChInputState(void) large 
{ 
  BOOL fgRetValue; 
  BYTE bItem = bSelMenuHiliItemNo(_rSelMenu.bPage, _rSelMenu.bHili); 
  BYTE pbTmp[3]; 
   
  fgRetValue = fgNumInState(); 
   
  if (fgRetValue == TRUE) 
  { 
    if (_rSelMenu.bState == PROG_STATE_INPUT) /* title input state */ 
    { 
      if (_rNumInStateCtx.rState.fgComplete) 
      { 
        if ((_rNumInStateCtx.wNum > 0) && 
            (_rNumInStateCtx.wNum <= _rSelMenu.bSelNoMax) && 
            (_rNumInStateCtx.rState.fgCancel == FALSE)) 
        { 
          pbTmp[0] = _rNumInStateCtx.wNum; 
   
          /* reset number input state */ 
#ifdef NO_ADD10_KEY 
          vNumInInitState(NUM_IN_SEQ_WAIT, 2); 
#else 
          vNumInInitState(NUM_IN_TYPE_1, 1); 
#endif 
           
          /* save title number, note here is some trick, assume bDig[5] is not used */ 
          _rNumInStateCtx.bDig[5] = pbTmp[0]; 
           
          /* update OSD only */ 
          vOsdShowProgItemTtCh(bItem, OSD_PROG_ITEM_HILI_CH | _rNumInStateCtx.rState.bDigNum, 
                               _rNumInStateCtx.bDig[5], 0); 
 
          /* update chapter input range */ 
          vOsdShowProgType(SV_PROGRAM_TT_CH_ITEM, _rNumInStateCtx.bDig[5], 
                           bSharedInfo(SI_DVD_TT_CH + _rNumInStateCtx.bDig[5] - 1)); 
 
          /* switch to chapter input state */ 
          _rSelMenu.bState = PROG_STATE_INPUT_1; 
        } 
        else 
        { 
          /* reset to default value */ 
          _rNumInStateCtx.wNum = bSelMenuReadItem(bItem, pbTmp); 
          vSelMenuTtChInputEnd(_rNumInStateCtx.wNum, pbTmp[0]); 
        } 
      } 
      else /* not complete */ 
      { 
        if (_rNumInStateCtx.rState.fgCancel == FALSE) 
        { 
          /* update OSD only */ 
          vOsdShowProgItemTtCh(bItem, OSD_PROG_ITEM_HILI_TT | _rNumInStateCtx.rState.bDigNum, 
                               _rNumInStateCtx.wNum, 0); 
        } 
        else 
        { 
          /* reset to default value */ 
          _rNumInStateCtx.wNum = bSelMenuReadItem(bItem, pbTmp); 
          vSelMenuTtChInputEnd(_rNumInStateCtx.wNum, pbTmp[0]); 
        } 
      } 
    } 
    else if (_rSelMenu.bState == PROG_STATE_INPUT_1) /* chapter input state */ 
    { 
      if (_rNumInStateCtx.rState.fgComplete) 
      { 
        if ((_rNumInStateCtx.wNum > 0) && 
            (_rNumInStateCtx.wNum <= bSharedInfo(SI_DVD_TT_CH + _rNumInStateCtx.bDig[5] - 1)) && 
            (_rNumInStateCtx.rState.fgCancel == FALSE)) 
        { 
          vSelMenuTtChInputEnd(_rNumInStateCtx.bDig[5], _rNumInStateCtx.wNum); 
        } 
        else 
        { 
          /* reset to default value */ 
          _rNumInStateCtx.wNum = bSelMenuReadItem(bItem, pbTmp); 
          vSelMenuTtChInputEnd(_rNumInStateCtx.wNum, pbTmp[0]); 
        } 
      } 
      else /* not complete */ 
      { 
        /* check title number when chapter not inputed yet */ 
        if (_rNumInStateCtx.rState.fgCancel == FALSE) 
        { 
          /* update OSD only */ 
          vOsdShowProgItemTtCh(bItem, OSD_PROG_ITEM_HILI_CH | _rNumInStateCtx.rState.bDigNum, 
                               _rNumInStateCtx.bDig[5], _rNumInStateCtx.wNum); 
        } 
        else 
        { 
          /* reset to default value */ 
          _rNumInStateCtx.wNum = bSelMenuReadItem(bItem, pbTmp); 
          vSelMenuTtChInputEnd(_rNumInStateCtx.wNum, pbTmp[0]); 
        } 
      } 
    } /* chapter input state */ 
  } 
  else /* if (fgRetValue == FALSE) */ 
  { 
    _rNumInStateCtx.wNum = bSelMenuReadItem(bItem, pbTmp); 
    vSelMenuTtChInputEnd(_rNumInStateCtx.wNum, pbTmp[0]); 
    return (FALSE); 
  } 
 
  return (TRUE); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
static BOOL fgSelMenuSelectState(void) large 
{ 
  BYTE bItem = bSelMenuHiliItemNo(_rSelMenu.bPage, _rSelMenu.bHili); 
  BYTE bTmp; 
  BYTE bIdx; 
  BYTE pbTime[3]; 
 
  switch (_bIRKey) 
  { 
    case IR_UP: 
      if (bItem > 0) 
      { 
        bItem--; 
      } 
      break; 
 
    case IR_LEFT: 
      if (bItem - SELMENU_COL_SIZE >= 0) 
      { 
        bItem -= SELMENU_COL_SIZE; 
      } 
      break; 
 
    case IR_RIGHT: 
      if (bItem + SELMENU_COL_SIZE < (SELMENU_PAGE_SIZE * SELMENU_PAGE_NS)) 
      { 
        bItem += SELMENU_COL_SIZE; 
      } 
      break; 
 
    case IR_DOWN: 
      if (((bItem + 1) % SELMENU_COL_SIZE) == 0) 
      { 
        _rSelMenu.bState = bSelMenuGetBarNextValid(_rSelMenu.bState); 
        if (_rSelMenu.bState == PROG_STATE_SELECT) 
        { 
          if (bItem < (SELMENU_PAGE_SIZE * SELMENU_PAGE_NS - 1)) 
          { 
            bItem++; 
          } 
        } 
        else 
        { 
          vSelMenuGotoBar(_rSelMenu.bState); 
        } 
      } 
      else if (bItem < (SELMENU_PAGE_SIZE * SELMENU_PAGE_NS)) 
      { 
        bItem++; 
      } 
      break; 
 
    case IR_CLEAR: 
      if (bSharedInfo(SI_USR_PBC_CTRL) == SV_PROGRAM) 
      { 
        break; 
      } 
 
      bTmp = bSharedInfo(SI_USR_PROGRAM_NS); 
      if ((bItem < bTmp) && (bTmp > 0)) 
      { 
        if (bItem == (bTmp - 1)) 
        { 
          vSelMenuSetItem(bItem, 0, 0); 
        } 
        else 
        { 
          for (bIdx = bItem; bIdx < (bTmp - 1); bIdx ++) 
          { 
            bItem = bSelMenuReadItem(bIdx + 1, pbTime); 
            vSelMenuSetItem(bIdx, bItem, pbTime); 
          } 
          vSelMenuSetItem(bTmp - 1, 0, 0); 
        } 
        vSetSharedInfo(SI_USR_PROGRAM_NS, bTmp - 1); 
        vSelMenuShowPage(_rSelMenu.bPage, OSD_PROG_ITEM_NORMAL); 
      } 
      return (TRUE); 
 
    case IR_ENTER: 
    case IR_PLAY: 
    case IR_PLAY_ENTER: 
    case IR_PLAY_PAUSE: 
      if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TT_CH) 
      { 
        vSelMenuTtChInputStart(); 
      } 
      else /* if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TIME) */ 
      { 
        vSelMenuTimeInputStart(); 
      } 
      return (TRUE); 
 
    default: 
      return (TRUE); 
  } 
 
  if (bItem != bSelMenuHiliItemNo(_rSelMenu.bPage, _rSelMenu.bHili)) 
  { 
    vSelMenuGotoItem(bItem); 
  } 
 
  return (TRUE); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
static BOOL fgSelMenuBarState(void) large 
{ 
  BYTE bState; 
  BYTE pbTime[3]; 
  BYTE bType = bSharedInfo(SI_USR_PROGRAM_TYPE); 
 
  switch (_bIRKey) 
  { 
    case IR_UP: 
      if (bType != SV_PROGRAM_NONE_ITEM) 
      { 
        vSelMenuGotoItem(bSelMenuHiliItemNo(_rSelMenu.bPage, SELMENU_PAGE_SIZE - 1)); 
      } 
      return (TRUE); 
 
    case IR_LEFT: 
      bState = bSelMenuGetBarPrevValid(_rSelMenu.bState); 
      if (bState == PROG_STATE_SELECT) 
      { 
        /* goto last item of current page */ 
        if (bType != SV_PROGRAM_NONE_ITEM) 
        { 
          vSelMenuGotoItem(bSelMenuHiliItemNo(_rSelMenu.bPage, SELMENU_PAGE_SIZE - 1)); 
        } 
        return (TRUE); 
      } 
      else 
      { 
        vSelMenuGotoBar(bState); 
      } 
      break; 
 
    case IR_RIGHT: 
    case IR_DOWN: 
      bState = bSelMenuGetBarNextValid(_rSelMenu.bState); 
      if (bState == PROG_STATE_SELECT) 
      { 
        return (TRUE); /* not goto next page */ 
      } 
      else 
      { 
        vSelMenuGotoBar(bState); 
      } 
      break; 
 
    case IR_ENTER: 
    case IR_PLAY: 
    case IR_PLAY_ENTER: 
    case IR_PLAY_PAUSE: 
      vSelMenuBarActive(_rSelMenu.bState); 
      return (TRUE); 
 
    default: 
      return (TRUE); 
  } 
 
  if (_rSelMenu.bState != bState) 
  { 
    vSelMenuGotoBar(_rSelMenu.bState); 
  } 
 
  return (TRUE); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
static void vSelMenuProgTypeChange(BYTE bType) large 
{ 
  switch (bType) 
  { 
    case SV_PROGRAM_TRACK_ITEM: 
      _rSelMenu.bSelNoMax = bSharedInfo(SI_TRACK_NS); 
      _rSelMenu.bItemType = PROG_ITEM_TYPE_TIME; 
      break; 
 
    case SV_PROGRAM_CHAPTER_ITEM: 
      /* chapter program mode is only valid for one title only DVD */ 
      _rSelMenu.bSelNoMax = bSharedInfo(SI_DVD_TT_CH); /* assume offset 0 is title 1 */ 
      _rSelMenu.bItemType = PROG_ITEM_TYPE_TIME; 
      break; 
 
    case SV_PROGRAM_TT_ITEM: 
      _rSelMenu.bSelNoMax = bSharedInfo(SI_TT_NS); 
      _rSelMenu.bItemType = PROG_ITEM_TYPE_TIME; 
      break; 
 
    case SV_PROGRAM_TT_CH_ITEM: 
      _rSelMenu.bSelNoMax = bSharedInfo(SI_TT_NS); 
      _rSelMenu.bItemType = PROG_ITEM_TYPE_TT_CH; 
      break; 
 
    case SV_PROGRAM_NONE_ITEM: 
    default: 
      _rSelMenu.bSelNoMax = 0; 
      bType = SV_PROGRAM_NONE_ITEM; 
      if (fgIsDvdPlay()) 
      { 
        _rSelMenu.bItemType = PROG_ITEM_TYPE_TT_CH; 
      } 
      else 
      { 
        _rSelMenu.bItemType = PROG_ITEM_TYPE_TIME; 
      } 
      break; 
  } /* switch (bType) */ 
 
 
  if (bType != bSharedInfo(SI_USR_PROGRAM_TYPE)) 
  { 
    vSetSharedInfo(SI_USR_PROGRAM_TYPE, bType); 
    vSelMenuResetItem(); 
  } 
#ifdef PROGRAM_STOP_CLEAR 
  else if (bSharedInfo(SI_USR_PBC_CTRL) != SV_PROGRAM) 
  { 
    vSelMenuResetItem(); 
  } 
#endif 
 
  /* show program type */ 
  vOsdShowProgType(OSD_PROG_TYPE_CLEAR, 0, 0); // we need to clear it manually 
 
  if (bType == SV_PROGRAM_TT_CH_ITEM) 
  { 
    vOsdShowProgType(bType, _rSelMenu.bSelNoMax, 0); 
  } 
  else 
  { 
    vOsdShowProgType(bType, 1, _rSelMenu.bSelNoMax); 
  } 
 
  /* clear command sync flag */ 
  _rSelMenu.fgWaitProgStop = FALSE; 
 
  /* default is page 0, item 0 */ 
  _rSelMenu.bPage = 0; 
  _rSelMenu.bHili = 0; 
 
  /* Page refresh */ 
  vSelMenuShowPage(0, OSD_PROG_ITEM_HEADER); 
 
  /* default hili position */ 
  if (bType == SV_PROGRAM_NONE_ITEM) 
  { 
    vSelMenuGotoBar(PROG_STATE_EXIT); 
  } 
  else if (bSharedInfo(SI_USR_PBC_CTRL) == SV_PROGRAM) 
  { 
    vSelMenuGotoBar(PROG_STATE_START_STOP); 
  } 
  else 
  { 
    vSelMenuGotoItem(0); 
  } 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BYTE bSelMenuNextType(BYTE bCurrType) large 
{ 
  BYTE bType = SV_PROGRAM_NONE_ITEM; 
   
  /* switch program type */ 
  if (fgIsDvdPlay()) 
  { 
    if (bCurrType == SV_PROGRAM_NONE_ITEM) 
    { 
      if (bSharedInfo(SI_TT_NS) > 1) 
      { 
        bType = SV_PROGRAM_TT_CH_ITEM; 
         
      } 
      else /* if (bSharedInfo(SI_TT_NS) == 1) */ 
      { 
        /* chapter program mode is only valid for one title only DVD */ 
        bType = SV_PROGRAM_CHAPTER_ITEM; 
      } 
    } 
#ifndef PROGRAM_KEY_EXIT 
    else if (bCurrType == SV_PROGRAM_TT_CH_ITEM) 
    { 
      bType = SV_PROGRAM_TT_ITEM; 
    } 
#endif 
    else /* if ((bCurrType == SV_PROGRAM_TT_ITEM) || (bCurrType == SV_PROGRAM_CHAPTER_ITEM)) */ 
    { 
      bType = SV_PROGRAM_NONE_ITEM; 
    } 
  } 
#ifdef VCD_SUPPORT   
  else if (fgIsVcdPlay() || fgIsCddaPlay()) 
  { 
    if (bCurrType == SV_PROGRAM_NONE_ITEM) 
    { 
      bType = SV_PROGRAM_TRACK_ITEM; 
    } 
    else /* if (bCurrType == SV_PROGRAM_TRACK_ITEM) */ 
    { 
      bType = SV_PROGRAM_NONE_ITEM; 
    } 
  } 
#endif   
  else if (fgIsIsoPlay()) 
  { 
    /* not supported */ 
    bType = SV_PROGRAM_NONE_ITEM; 
  } 
 
  return (bType); 
} 
 
#ifdef PLAYER_PROGRAM 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vSelectInit(BYTE fgInit) large 
{ 
  BYTE bType; 
   
  /* chnage OSD mode to user mode */ 
  vOsdShowWb(OSD_WB_USER); 
 
#if (DRAM_SZ == DRAM_2M) 
  vOsdSetMemBlk(OSD_MEM_BLK_DYNAMIC); 
#endif   
 
//  vSetSharedInfo(SH_PAUSE_SHOW_WB,0);//init 
  vSetSharedInfo(SH_PROGRAM_START,0);//init 
 
  bType = bSharedInfo(SI_USR_PROGRAM_TYPE); 
 
#ifdef ALL_WB_USE_TRUECOLOR 
  vCreateWB(WB_SELMENU, TRUE); 
  vSetWBTcColor(WB_SELMENU); 
#else 
  vCreateWB(WB_SELMENU, FALSE); 
#endif 
#ifdef FONT_NO_BORDER 
  vSetMsgCol4(WB_SELMENU, 0, 1, 1, 3); 
#else 
  vSetMsgCol4(WB_SELMENU, 0, 1, 2, 3); 
#endif 
  vEnableWB(WB_SELMENU); 
 
  /* set hilight color */ 
  vSetHLCol(HL_1, 0x0000); /* green */ 
 
  if (fgIsIsoPlay()) 
  { 
    /* not supported */ 
    vSetExitInputState(); 
    return; 
  } 
  else if (bType == SV_PROGRAM_NONE_ITEM) 
  { 
    bType = bSelMenuNextType(bType); 
  } 
 
  vSelMenuProgTypeChange(bType); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
BOOL fgSelectState(void) large 
{ 
  BOOL fgRet = TRUE; 
  BYTE bType = bSharedInfo(SI_USR_PROGRAM_TYPE); 
 
  if (_bIRKey <= IR_ADD10 || _bIRKey == IR_ADD5)  // megaa ADD5 
  { 
    if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TT_CH) 
    { 
      vSelMenuTtChInputStart(); 
    } 
    else /* if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TIME) */ 
    { 
      vSelMenuTimeInputStart(); 
    } 
  } 
 
  if ((_rSelMenu.bState == PROG_STATE_INPUT) || 
      (_rSelMenu.bState == PROG_STATE_INPUT_1)) 
  { 
    if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TT_CH) 
    { 
      if (fgSelMenuTtChInputState() == TRUE) 
      { 
        return (TRUE); 
      } 
    } 
    else /* if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TIME) */ 
    { 
      if (fgSelMenuTimeInputState() == TRUE) 
      { 
        return (TRUE); 
      } 
    } 
  } 
 
  // FIXME: use global to get current disc type 
  switch (_bIRKey) 
  { 
    case IR_PROGRAM: 
    { 
#ifdef PROGRAM_KEY_EXIT 
      vSetExitInputState(); 
#else /* PROGRAM key switch type */ 
      if (bSharedInfo(SI_USR_PBC_CTRL) == SV_PROGRAM) 
      { 
        /* program off first then change program type */ 
        vSendUopCmd(UOP_PROGRAM, SV_PROGRAM_STOP, 0, 0); 
      } 
 
      bType = bSelMenuNextType(bType); 
      vSelMenuProgTypeChange(bType); 
#endif 
      break; 
    } /* case IR_PROGRAM: */ 
 
    case IR_TITLE_MENU: 
      /* switch title no when play DVD */ 
      /* vOsdPosShow(OSD_POS_NORMAL, ); */ 
      break; 
 
    case IR_NEXT: 
      if (_rSelMenu.fgNextValid) 
      { 
        vSelMenuBarActive(PROG_STATE_NEXT); 
      } 
      break; 
 
    case IR_PREV: 
      if (_rSelMenu.fgPrevValid) 
      { 
        vSelMenuBarActive(PROG_STATE_PREV); 
      } 
      break; 
 
    default: 
    { 
      if (fgIsAVContrlKey(_bIRKey)) 
      { 
        /* pass the A/V control key */ 
        fgRet = FALSE; 
      } 
      else if (_rSelMenu.bState == PROG_STATE_SELECT) 
      { 
        fgRet = fgSelMenuSelectState(); 
      } 
      else if ((_rSelMenu.bState == PROG_STATE_INPUT) || 
               (_rSelMenu.bState == PROG_STATE_INPUT_1)) 
      { 
        /* error handle: force input end */ 
        if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TT_CH) 
        { 
          _rNumInStateCtx.wNum = bSelMenuReadItem(bSelMenuHiliItemNo(_rSelMenu.bPage, _rSelMenu.bHili), 
                                                  _rNumInStateCtx.bDig); 
          vSelMenuTtChInputEnd(_rNumInStateCtx.wNum, _rNumInStateCtx.bDig); 
        } 
        else /* if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TIME) */ 
        { 
          vSelMenuTimeInputEnd(bSelMenuReadItem(bSelMenuHiliItemNo(_rSelMenu.bPage, _rSelMenu.bHili),0)); 
        } 
      } 
      else /* default is in BAR state */ 
      { 
        fgRet = fgSelMenuBarState(); 
      } 
      break; 
    } /* default */ 
  } /* switch (_bIRKey) */ 
 
  return (fgRet); 
} 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vSelectExit(void) large 
{ 
  if ((_rSelMenu.bState == PROG_STATE_INPUT) || 
      (_rSelMenu.bState == PROG_STATE_INPUT_1)) 
  { 
    /* force input end */ 
    if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TT_CH) 
    { 
      _rNumInStateCtx.wNum = bSelMenuReadItem(bSelMenuHiliItemNo(_rSelMenu.bPage, _rSelMenu.bHili), 
                                              _rNumInStateCtx.bDig); 
      vSelMenuTtChInputEnd(_rNumInStateCtx.wNum, _rNumInStateCtx.bDig); 
    } 
    else /* if (_rSelMenu.bItemType == PROG_ITEM_TYPE_TIME) */ 
    { 
      vSelMenuTimeInputEnd(bSelMenuReadItem(bSelMenuHiliItemNo(_rSelMenu.bPage, _rSelMenu.bHili),0)); 
    } 
  } 
 
  vDeleteWB(WB_SELMENU); 
  vOsdShowProgType(OSD_PROG_TYPE_CLEAR, 0, 0); 
  vOsdPosHili(OSD_POS_HILI_CLEAR, 0, 0); 
 
#if (DRAM_SZ == DRAM_2M) 
  vOsdSetMemBlk(OSD_MEM_BLK_STATIC); 
#endif   
 
  /* restore OSD mode */ 
  vOsdShowWb(OSD_WB_RESTORE); 
   
  //pause before show WB 
  if(bSharedInfo(SH_PAUSE_SHOW_WB) == SV_SHOW_PROGRAM) 
  { 
    vSetSharedInfo(SH_PAUSE_SHOW_WB,0);//init 
  } 
  if(bSharedInfo(SH_PROGRAM_START) != SV_PROGRAM_START) 
  { 
    vSendUopCmd(UOP_PLAY, 0, 0, 0); 
  } 
  vSetSharedInfo(SH_PROGRAM_START,0);//init   
} 
#endif /* #ifdef PLAYER_PROGRAM */ 
 
// ********************************************************************* 
// Function : 
// Description : 
// Parameter : 
// Return    : 
// ********************************************************************* 
void vSelMenuUsrPbcChange(void) large 
{ 
  if ((bSharedInfo(SI_USR_PBC_CTRL) != SV_PROGRAM) &&  
      (_rSelMenu.fgWaitProgStop == TRUE)) 
  { 
    _rSelMenu.fgWaitProgStop = FALSE; 
     
#ifdef PROGRAM_STOP_CLEAR 
    vSelMenuResetItem(); 
#endif 
  } 
 
  vSelMenuShowPage(_rSelMenu.bPage, OSD_PROG_ITEM_NORMAL); /* update current page */ 
} 
 
#else /* PLAYER_PROGRAM dummy function */ 
 
static code BYTE pbSelMenuCodeSegment[1] = { FALSE }; /* for code segment */ 
 
#if (defined(PLAYER_PROGRAM) || defined(PLAYER_DIGEST)) 
void vSelectInit(BYTE fgInit) large { return; } 
BOOL fgSelectState(void) large 
{ 
  vOsdShowProgType(0, 0, 0); 
   
  return (pbSelMenuCodeSegment[0]); 
} 
void vSelectExit(void) large { return; } 
#endif 
//void vSelMenuReset(void) large { return; } 
//void vSelMenuUsrPbcChange(void) large { return; } 
 
#endif /* PLAYER_PROGRAM */