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