www.pudn.com > 6027_HD65.rar > digest.c
/**********************************************************************/
/*************** MTK CONFIDENTIAL & COPYRIGHTED ****************/
/*************** ****************/
/*************** $Modtime:: 04/07/19 2:58p $ ****************/
/*************** $Revision:: 10 $ ****************/
/*************** ****************/
/*************** Description : Digest function ****************/
/*************** module ****************/
/*************** ****************/
/*************** Company : MediaTek Inc. ****************/
/*************** Programmer : ****************/
/**********************************************************************/
#include "general.h"
#ifdef PLAYER_DIGEST
#pragma NOAREGS
enum {
DGST_STATE_TYPE,
DGST_STATE_MENU,
DGST_STATE_DISP,
DGST_STATE_INIT,
DGST_STATE_RESUME,
DGST_STATE_EXIT,
DGST_STATE_NUM,
DGST_STATE_MAX
};
enum {
DGST_TYPE_NONE,
DGST_TYPE_TRACK,
DGST_TYPE_TITLE,
DGST_TYPE_CHAPTER,
DGST_TYPE_TIME_DISC,
DGST_TYPE_TIME_TRK,
DGST_TYPE_TIME_TTL,
DGST_TYPE_TIME_PTT,
DGST_TYPE_BOOKMARK,
DGST_TYPE_PROGRAM,
DGST_TYPE_STROBE,
#ifdef SUPPORT_DVD_AUDIO
DA_DGST_TYPE_NONE,
DA_DGST_TYPE_GROUP,
DA_DGST_TYPE_TRACK,
DA_DGST_TYPE_TIME_GRP,
DA_DGST_TYPE_TIME_TRK,
DA_DGST_TYPE_INDEX,
DA_DGST_TYPE_SPOTLIGHT,
DA_DGST_TYPE_BOOKMARK,
#endif
DGST_TYPE_MAX
};
enum {
DGST_TYPE_MENU_DVD,
DGST_TYPE_MENU_VCD
};
enum {
DGST_MENU_BTN_PREV,
DGST_MENU_BTN_EXIT,
DGST_MENU_BTN_MENU,
DGST_MENU_BTN_NEXT,
DGST_MENU_BTN_MAX
};
//static xdata strucDigest _rDigest;
xdata strucDigest _rDigest; // megaa dgst time mark number
#define DGST_DEFAULT_SHOW_TIME 3
#define DGST_DEFAULT_INTERVAL 120 /* 120 * 5sec = 600sec = 10min */
#define IR_TIMEOUT_DGST_INIT 8
#define IR_TIMEOUT_DGST_RESUME 8
// *********************************************************************
// Local Function Prototype: Type Select Sub-state Functions
// *********************************************************************
void vDgstShowTypePage(BYTE bPage) large;
void vDgstShowDispMark(BYTE bItem) large;
BOOL fgDgstTypeSelect(BYTE bType) large;
BOOL fgDgstPlayControl(BYTE bCmd, bParm) large;
void vDgstGotoTypeItem(BYTE bItem) large;
void vDgstTypeInit(BYTE fgInit) large;
void vDgstTypeExit(void) large;
BOOL fgDgstTypeState(void) large;
void vDgstShowMenuPageType(void) large;
void vDgstShowMenuPageButton(void) large;
void vDgstMenuGotoItem(BYTE bItem) large;
void vDgstMenuBtnActive(void) large;
void vDgstMenuInit(BYTE fgInit) large;
void vDgstMenuExit(BYTE fgResume) large;
BOOL fgDgstMenuState(void) large;
void vDgstDispGotoItem(BYTE bItem);
void vDgstDispInit(BYTE fgInit) large;
void vDgstDispExit(void) large;
BOOL fgDgstDispState(void) large;
void vDgstInitInit(BYTE fgInit) large;
void vDgstInitExit(void) large;
BOOL fgDgstInitState(void) large;
void vDgstResumeInit(BYTE fgInit) large;
void vDgstResumeExit(void) large;
BOOL fgDgstResumeState(void) large;
void vDgstNumInit(BYTE fgInit) large;
void vDgstNumExit(BYTE bSelNo) large;
BOOL fgDgstNumState(void) large;
// *********************************************************************
// Type Select Menu Items
// *********************************************************************
typedef struct {
WORD wMsg;
BYTE bType;
} strucDgstType;
static code strucDgstType prDvdDgstTypePlay[] = {
{ OSD_MSG_DGST_TITLE, DGST_TYPE_TITLE },
{ OSD_MSG_DGST_CHAPTER, DGST_TYPE_CHAPTER },
{ OSD_MSG_DGST_TIME_TTL, DGST_TYPE_TIME_TTL },
{ OSD_MSG_DGST_TIME_PTT, DGST_TYPE_TIME_PTT },
#ifdef PLAYER_BOOKMARK
{ OSD_MSG_DGST_BOOKMARK, DGST_TYPE_BOOKMARK },
#endif
// { OSD_MSG_DGST_PROGRAM, DGST_TYPE_PROGRAM },
// { OSD_MSG_DGST_STROBE, DGST_TYPE_STROBE },
};
static code strucDgstType prDvdDgstTypeStop[] = {
{ OSD_MSG_DGST_TITLE, DGST_TYPE_TITLE },
#ifdef PLAYER_BOOKMARK
{ OSD_MSG_DGST_BOOKMARK, DGST_TYPE_BOOKMARK },
#endif
// { OSD_MSG_DGST_PROGRAM, DGST_TYPE_PROGRAM }
};
#ifdef SUPPORT_DVD_AUDIO
static code strucDgstType prDADgstTypePlay[] = {
{ OSD_MSG_DGST_GROUP, DA_DGST_TYPE_GROUP },
{ OSD_MSG_DGST_TRACK, DA_DGST_TYPE_TRACK },
{ OSD_MSG_DGST_TIME_GRP, DA_DGST_TYPE_TIME_GRP },
{ OSD_MSG_DGST_TIME_TRK, DA_DGST_TYPE_TIME_TRK },
// { OSD_MSG_DGST_INDEX, DA_DGST_TYPE_INDEX },
// { OSD_MSG_DGST_SPOTLIGHT, DA_DGST_TYPE_SPOTLIGHT },
#ifdef PLAYER_BOOKMARK
{ OSD_MSG_DGST_BOOKMARK, DA_DGST_TYPE_BOOKMARK },
#endif
};
static code strucDgstType prDADgstTypeStop[] = {
{ OSD_MSG_DGST_GROUP, DA_DGST_TYPE_GROUP },
#ifdef PLAYER_BOOKMARK
{ OSD_MSG_DGST_BOOKMARK, DA_DGST_TYPE_BOOKMARK },
#endif
// { OSD_MSG_DGST_PROGRAM, DGST_TYPE_PROGRAM }
};
#endif
static code strucDgstType prVcdDgstTypePlay[] = {
{ OSD_MSG_DGST_TRACK, DGST_TYPE_TRACK },
{ OSD_MSG_DGST_TIME_DISC, DGST_TYPE_TIME_DISC },
{ OSD_MSG_DGST_TIME_TRK, DGST_TYPE_TIME_TRK },
#ifdef PLAYER_BOOKMARK
{ OSD_MSG_DGST_BOOKMARK, DGST_TYPE_BOOKMARK },
#endif
// { OSD_MSG_DGST_PROGRAM, DGST_TYPE_PROGRAM },
// { OSD_MSG_DGST_STROBE, DGST_TYPE_STROBE }
};
static code strucDgstType prVcdDgstTypeStop[] = {
{ OSD_MSG_DGST_TRACK, DGST_TYPE_TRACK },
{ OSD_MSG_DGST_TIME_DISC, DGST_TYPE_TIME_DISC },
#ifdef PLAYER_BOOKMARK
{ OSD_MSG_DGST_BOOKMARK, DGST_TYPE_BOOKMARK },
#endif
// { OSD_MSG_DGST_PROGRAM, DGST_TYPE_PROGRAM }
};
typedef struct {
strucDgstType code *prList;
BYTE bNo;
} strucDgstTypeMenu;
static code strucDgstTypeMenu prDgstTypeMenu[] = {
{ prDvdDgstTypePlay, TBL_SIZE(prDvdDgstTypePlay) },
{ prDvdDgstTypeStop, TBL_SIZE(prDvdDgstTypeStop) },
#ifdef SUPPORT_DVD_AUDIO
{ prDADgstTypePlay, TBL_SIZE(prDADgstTypePlay) },
{ prDADgstTypeStop, TBL_SIZE(prDADgstTypeStop) },
#endif
{ prVcdDgstTypePlay, TBL_SIZE(prVcdDgstTypePlay) },
{ prVcdDgstTypeStop, TBL_SIZE(prVcdDgstTypeStop) }
};
enum {
DGST_TYPE_PAGE_DVD_PLAY,
DGST_TYPE_PAGE_DVD_STOP,
#ifdef SUPPORT_DVD_AUDIO
DGST_TYPE_PAGE_DVD_AUDIO_PLAY,
DGST_TYPE_PAGE_DVD_AUDIO_STOP,
#endif
DGST_TYPE_PAGE_VCD_PLAY,
DGST_TYPE_PAGE_VCD_STOP,
DGST_TYPE_PAGE_MAX
};
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
static void vDgstMenuBtnUnsel(BYTE bNewState) large
{
if ((_rDigest.bState == DGST_STATE_MENU) ||
(bNewState == DGST_STATE_MENU))
{
#ifdef NUI_OSD_STYLE
vSetMsgCol4(WB_DGST_MENU, 0, 0, 2, 3);
#else
vSetMsgCol4(WB_DGST_MENU, 0, 0, 0, 3);
#endif
vUnselButton(WB_DGST_MENU, _rDigest.bCurItem);
}
_rDigest.bState = bNewState;
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstShowTypePage(BYTE bPage) large
{
BYTE bIdx;
BYTE bDispIdx;
BYTE bTypeValid;
if (bPage >= DGST_TYPE_PAGE_MAX)
{
bPage = DGST_TYPE_PAGE_DVD_STOP;
}
_rDigest.bPageNo = bPage;
vOsdPosPaste(OSD_POS_DGST_TYPE_LINE_1, OSD_MSG_DGST_SEL_TYPE);
bDispIdx = 0;
bTypeValid = 0;
for (bIdx = 0; bIdx < prDgstTypeMenu[bPage].bNo; bIdx++)
{
if (
#ifdef SUPPORT_DVD_AUDIO
(((prDgstTypeMenu[bPage].prList)[bIdx].bType) == DA_DGST_TYPE_BOOKMARK) ||
#endif
(((prDgstTypeMenu[bPage].prList)[bIdx].bType) == DGST_TYPE_BOOKMARK))
{
if (fgIsBookmarkItemValid(BOOKMARK_ITEM_NO) == FALSE)
{
continue;
}
}
else if ((((prDgstTypeMenu[bPage].prList)[bIdx].bType) == DGST_TYPE_NONE) ||
#ifdef SUPPORT_DVD_AUDIO
(((prDgstTypeMenu[bPage].prList)[bIdx].bType) == DA_DGST_TYPE_NONE) ||
#endif
(((prDgstTypeMenu[bPage].prList)[bIdx].bType) >= DGST_TYPE_MAX))
{
/* not valid entry, array end */
break;
}
vOsdPosPaste(OSD_POS_DGST_TYPE_LINE_1 + 1 + bDispIdx,
(prDgstTypeMenu[bPage].prList)[bIdx].wMsg);
bTypeValid |= (1 << bIdx);
bDispIdx++;
}
_rDigest.bSelNoMax = bDispIdx;
_rDigest.bTypeParm = bTypeValid;
}
// *********************************************************************
// Function :
// Description : Currently we only support 2x3 window
// Parameter :
// Return :
// *********************************************************************
void vDgstShowDispMark(BYTE bItem) large
{
BYTE pbTmp[3];
BYTE bType;
WORD wTmp;
bItem = bItem % DGST_VIEW_NS;
switch(_rDigest.bType)
{
case DGST_TYPE_TRACK:
case DGST_TYPE_TITLE:
case DGST_TYPE_CHAPTER:
case DGST_TYPE_BOOKMARK:
case DGST_TYPE_PROGRAM:
#ifdef SUPPORT_DVD_AUDIO
case DA_DGST_TYPE_GROUP:
case DA_DGST_TYPE_TRACK:
#endif
bType = OSD_DGST_MARK_NO;
break;
case DGST_TYPE_TIME_DISC:
case DGST_TYPE_TIME_TRK:
bType = OSD_DGST_MARK_TIME2;
break;
case DGST_TYPE_TIME_TTL:
case DGST_TYPE_TIME_PTT:
#ifdef SUPPORT_DVD_AUDIO
case DA_DGST_TYPE_TIME_GRP:
case DA_DGST_TYPE_TIME_TRK:
#endif
bType = OSD_DGST_MARK_TIME3;
break;
#if 0
case DA_DGST_TYPE_INDEX:
break;
case DA_DGST_TYPE_SPOTLIGHT:
break;
case DA_DGST_TYPE_BOOKMARK:
break;
#endif
case DGST_TYPE_STROBE:
default:
bType = OSD_DGST_MARK_NONE;
break;
}
switch (bType)
{
case OSD_DGST_MARK_NO:
pbTmp[0] = _rDigest.bPageNo * DGST_VIEW_NS + bItem + 1;
break;
case OSD_DGST_MARK_TIME2:
wTmp = ((WORD)_rDigest.bTypeParm * DGST_SLICE_TIME) * (_rDigest.bPageNo * DGST_VIEW_NS + bItem);
pbTmp[0] = (BYTE)(wTmp / 60); /* minute */
wTmp -= 60 * pbTmp[0];
pbTmp[0] = bHEXToBCD(pbTmp[0]);
pbTmp[1] = bHEXToBCD(wTmp); /* seconds */
break;
case OSD_DGST_MARK_TIME3:
wTmp = ((WORD)_rDigest.bTypeParm * DGST_SLICE_TIME) * ((WORD)_rDigest.bPageNo * DGST_VIEW_NS + bItem);
pbTmp[0] = (BYTE)(wTmp / 3600); /* hour */
wTmp -= 3600 * pbTmp[0];
pbTmp[0] = bHEXToBCD(pbTmp[0]);
pbTmp[1] = (BYTE)(wTmp / 60); /* minute */
wTmp -= 60 * pbTmp[1];
pbTmp[1] = bHEXToBCD(pbTmp[1]);
pbTmp[2] = bHEXToBCD(wTmp); /* second */
break;
case OSD_DGST_MARK_NONE:
default:
vOsdShowDgstMark(bItem, bType, 0);
return;
}
vOsdShowDgstMark(bItem, bType, pbTmp);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
BOOL fgDgstTypeSelect(BYTE bType) large
{
#if 0
WORD wTotalSec;
#endif
BYTE bDom = bSharedInfo(SI_DVD_DOM);
BYTE bParm1 = 0;
BYTE bParm2 = 0;
BYTE bParm3 = DGST_DEFAULT_SHOW_TIME;
BOOL fgRet = TRUE;
_rDigest.bType = bType;
switch (bType)
{
case DGST_TYPE_TRACK:
bParm1 = (SV_DGST_TRACK << 4) | DGST_VIEW_NS;
break;
case DGST_TYPE_TITLE:
bParm1 = (SV_DGST_TITLE << 4) | DGST_VIEW_NS;
break;
case DGST_TYPE_CHAPTER: /* play state only */
bParm1 = (SV_DGST_CHAPTER << 4) | DGST_VIEW_NS;
/* default is current title */
break;
case DGST_TYPE_TIME_DISC:
bParm1 = (SV_DGST_TIME_DISK << 4) | DGST_VIEW_NS;
bParm2 = DGST_DEFAULT_INTERVAL;
break;
case DGST_TYPE_TIME_TRK: /* play state only */
bParm1 = (SV_DGST_TIME_TRK << 4) | DGST_VIEW_NS;
#if 1
bParm2 = DGST_DEFAULT_INTERVAL;
/* default is current track */
#else
wTotalSec = bSharedInfo(SI_TIME_TOTAL_TRACK_HH) * 60; //min
wTotalSec += bSharedInfo(SI_TIME_TOTAL_TRACK_MM); //min
wTotalSec *= 60; //sec
wTotalSec += bSharedInfo(SI_TIME_TOTAL_TRACK_SS); //sec
wTotalSec /= 5; //n 5sec
bParm2 = wTotalSec/(DGST_VIEW_NS-1); // DGST_DEFAULT_INTERVAL;
#endif
break;
case DGST_TYPE_TIME_TTL:
bParm1 = (SV_DGST_TIME_TTL << 4) | DGST_VIEW_NS;
bParm2 = DGST_DEFAULT_INTERVAL;
/* default is current title */
break;
case DGST_TYPE_TIME_PTT:
bParm1 = (SV_DGST_TIME_PTT << 4) | DGST_VIEW_NS;
bParm2 = DGST_DEFAULT_INTERVAL;
/* default is current chapter */
break;
case DGST_TYPE_BOOKMARK:
if (fgIsBookmarkItemValid(BOOKMARK_ITEM_NO) == TRUE)
{
bParm1 = (SV_DGST_BOOKMARK << 4) | DGST_VIEW_NS;
}
else
{
fgRet = FALSE;
}
break;
case DGST_TYPE_PROGRAM:
bParm1 = (SV_DGST_PROGRAM << 4) | DGST_VIEW_NS;
break;
case DGST_TYPE_STROBE:
bParm1 = (SV_DGST_STROBE << 4) | DGST_VIEW_NS;
bParm3 = 0;
break;
#ifdef SUPPORT_DVD_AUDIO
case DA_DGST_TYPE_GROUP:
if ((bDom == SV_VTSTT_DOM) || (bDom == SV_ATSTT_DOM))
{
bParm1 = (SV_DGST_GROUP << 4) | DGST_VIEW_NS;
}
else
{
fgRet = FALSE;
}
break;
case DA_DGST_TYPE_TRACK:
if ((bDom == SV_VTSTT_DOM) || (bDom == SV_ATSTT_DOM))
{
bParm1 = (SV_DGST_TRACK << 4) | DGST_VIEW_NS;
}
else
{
fgRet = FALSE;
}
break;
#endif
#ifdef SUPPORT_DVD_AUDIO
case DA_DGST_TYPE_TIME_GRP:
if ((bDom == SV_VTSTT_DOM) || (bDom == SV_ATSTT_DOM))
{
bParm1 = (SV_DGST_TIME_GRP << 4) | DGST_VIEW_NS;
bParm2 = 1;
}
else
{
fgRet = FALSE;
}
break;
case DA_DGST_TYPE_TIME_TRK:
if ((bDom == SV_VTSTT_DOM) || (bDom == SV_ATSTT_DOM))
{
bParm1 = (SV_DGST_TIME_TRK << 4) | DGST_VIEW_NS;
bParm2 = 1;
}
else
{
fgRet = FALSE;
}
break;
case DA_DGST_TYPE_INDEX:
if (bDom == SV_ATSTT_DOM)
{
bParm1 = (SV_DGST_INDEX << 4) | DGST_VIEW_NS;
}
else
{
fgRet = FALSE;
}
break;
case DA_DGST_TYPE_SPOTLIGHT:
if (bDom == SV_ATSTT_DOM)
{
bParm1 = (SV_DGST_SPOTLIGHT << 4) | DGST_VIEW_NS;
}
else
{
fgRet = FALSE;
}
break;
case DA_DGST_TYPE_BOOKMARK:
if ((bDom == SV_VTSTT_DOM) || (bDom == SV_ATSTT_DOM))
{
bParm1 = (SV_DGST_BOOKMARK << 4) | DGST_VIEW_NS;
}
else
{
fgRet = FALSE;
}
break;
#endif
default:
_rDigest.bType = DGST_TYPE_NONE;
break;
}
if (fgRet == TRUE)
{
_rDigest.bTypeParm = bParm2;
if (_rDigest.bType == DGST_TYPE_NONE)
{
/* error condition! */
vSetExitInputState();
}
else
{
vSendUopCmd(UOP_DIGEST, bParm1, bParm2, bParm3);
}
}
return (fgRet);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
BOOL fgDgstPlayControl(BYTE bCmd, bParm) large
{
BOOL fgRet = TRUE;
switch (bCmd)
{
case SV_DGST_RESUME:
/* send resume play */
#if 0
if (_rDigest.fgResume == TRUE)
{
vSendUopCmd(UOP_RESUME_PLAY, 0, 0, 0);
}
else
{
/* TODO: show logo or ? */
vSendUopCmd(UOP_STOP, 0, 0, 0);
}
#else
vSendUopCmd(UOP_DIGEST, 0, 0, 0);
#endif
break;
case SV_DGST_PLAY:
{
if (bParm < 1)
{
bParm = 1;
}
else if (bParm > _rDigest.bSelNoMax)
{
bParm = _rDigest.bSelNoMax;
}
if (_rDigest.bType == DGST_TYPE_BOOKMARK)
{
if (fgIsBookmarkItemValid(bParm - 1) == FALSE)
{
fgRet = FALSE;
break;
}
}
vSendUopCmd(UOP_DIGITAL_BTN, bParm, 0, 0);
break;
} /* SV_DGST_PLAY */
case SV_DGST_NEXT:
vSendUopCmd(UOP_NEXT, 0, 0, 0);
_rDigest.bPageNo += 1;
break;
case SV_DGST_PREV:
vSendUopCmd(UOP_PREVIOUS, 0, 0, 0);
_rDigest.bPageNo -= 1;
break;
default:
break;
} /* switch (bCmd) */
return (fgRet);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstGotoTypeItem(BYTE bItem) large
{
if (bItem >= _rDigest.bSelNoMax)
{
return;
}
vOsdPosHili(OSD_POS_HILI_SHOW, OSD_POS_DGST_TYPE_LINE_1 + 1 + bItem, 0);
_rDigest.bCurItem = bItem;
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstTypeInit(BYTE fgInit) large
{
BYTE bPbcState = bSharedInfo(SI_PBC_STATE);
/* chnage OSD mode to user mode */
vOsdShowWb(OSD_WB_USER);
_rDigest.bState = DGST_STATE_TYPE;
_rDigest.bType = DGST_TYPE_NONE;
//#ifdef ALL_WB_USE_TRUECOLOR
// vCreateWB(WB_DGST_TYPE, TRUE);
// vSetWBTcColor(WB_DGST_TYPE);
//#else
// vCreateWB(WB_DGST_TYPE, FALSE);
//#endif
vCreateWBEx(WB_DGST_TYPE);
#ifdef FONT_NO_BORDER
vSetMsgCol4(WB_DGST_TYPE, 0, 1, 1, 3);
#else
vSetMsgCol4(WB_DGST_TYPE, 0, 1, 2, 3);
#endif
vEnableWB(WB_DGST_TYPE);
if (fgIsDvdPlay())
{
#ifdef SUPPORT_DVD_AUDIO
if (bSharedInfo(SI_DISC_TYPE) == SV_DVD_AUDIO)
{
if (_rDigest.fgResume == TRUE)
{
vDgstShowTypePage(DGST_TYPE_PAGE_DVD_AUDIO_PLAY);
}
else
{
vDgstShowTypePage(DGST_TYPE_PAGE_DVD_AUDIO_STOP);
}
}
else
#endif
{
if (_rDigest.fgResume == TRUE)
{
vDgstShowTypePage(DGST_TYPE_PAGE_DVD_PLAY);
}
else
{
vDgstShowTypePage(DGST_TYPE_PAGE_DVD_STOP);
}
}
}
#ifdef VCD_SUPPORT
else if (fgIsVcdPlay())
{
if (_rDigest.fgResume == TRUE)
{
vDgstShowTypePage(DGST_TYPE_PAGE_VCD_PLAY);
}
else
{
vDgstShowTypePage(DGST_TYPE_PAGE_VCD_STOP);
}
}
#endif
vDgstGotoTypeItem(0);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstTypeExit(void) large
{
vDeleteWB(WB_DGST_TYPE);
/* restore OSD mode */
vOsdShowWb(OSD_WB_RESTORE);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
BOOL fgDgstTypeState(void) large
{
BOOL fgRet = TRUE;
BYTE bIdx, bDispIdx, bTypeValid;
switch (_bIRKey)
{
case IR_UP:
if (_rDigest.bCurItem > 0)
{
vDgstGotoTypeItem(_rDigest.bCurItem - 1);
}
break;
case IR_DOWN:
if (_rDigest.bCurItem + 1 < _rDigest.bSelNoMax)
{
vDgstGotoTypeItem(_rDigest.bCurItem + 1);
}
break;
case IR_ENTER:
case IR_PLAY:
case IR_PLAY_ENTER:
case IR_PLAY_PAUSE:
{
bDispIdx = 0;
bTypeValid = _rDigest.bTypeParm;
for (bIdx = 0; bIdx < prDgstTypeMenu[_rDigest.bPageNo].bNo; bIdx++)
{
if (bTypeValid & (1 << bIdx))
{
bDispIdx++;
if (bDispIdx == (_rDigest.bCurItem + 1))
{
break;
}
}
}
if ((bDispIdx > 0) && (bDispIdx <= _rDigest.bSelNoMax))
{
/* send UOP command first */
if (fgDgstTypeSelect((prDgstTypeMenu[_rDigest.bPageNo].prList)[bIdx].bType) == TRUE)
{
/* wait it return */
vDgstTypeExit();
/* wait UOP return */
vDgstInitInit(TRUE);
break;
}
}
/* range check invalid, force escape input state */
vSetExitInputState();
break;
}
case IR_TIME_OUT:
vSetExitInputState();
break;
default:
{
fgRet = FALSE;
break;
}
} /* switch (_bIRKey) */
return (fgRet);
}
// *********************************************************************
// Button Select Sub-state Functions
// *********************************************************************
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
static code WORD pwDgstMenuPageType[DGST_TYPE_MAX] = {
0xffff, /* DGST_TYPE_NONE */
OSD_MSG_TYPE_TRK, /* DGST_TYPE_TRACK */
OSD_MSG_TYPE_TTL, /* DGST_TYPE_TITLE */
OSD_MSG_TYPE_PTT, /* DGST_TYPE_CHAPTER */
OSD_MSG_TYPE_TIME_DISC, /* DGST_TYPE_TIME_DISC */
OSD_MSG_TYPE_TIME_TRK, /* DGST_TYPE_TIME_TRK */
OSD_MSG_TYPE_TIME_TTL, /* DGST_TYPE_TIME_TTL */
OSD_MSG_TYPE_TIME_PTT, /* DGST_TYPE_TIME_PTT */
OSD_MSG_TYPE_BOOKMARK, /* DGST_TYPE_BOOKMARK */
OSD_MSG_TYPE_PROGRAM, /* DGST_TYPE_PROGRAM */
OSD_MSG_TYPE_STROBE, /* DGST_TYPE_STROBE */
#ifdef SUPPORT_DVD_AUDIO
0xffff, /* DA_DGST_TYPE_NONE */
OSD_MSG_DGST_GROUP, /* DA_DGST_TYPE_GROUP */
OSD_MSG_DGST_TRACK, /* DA_DGST_TYPE_TRAC */
OSD_MSG_DGST_TIME_GRP, /* DA_DGST_TYPE_TIME_GRP */
OSD_MSG_DGST_TIME_TRK, /* DA_DGST_TYPE_TIME_TRK */
OSD_MSG_DGST_INDEX, /* DA_DGST_TYPE_INDEX */
OSD_MSG_DGST_SPOTLIGHT, /* DA_DGST_TYPE_SPOTLIGHT */
OSD_MSG_TYPE_PROGRAM /* DA_DGST_TYPE_BOOKMARK */
#endif
};
void vDgstShowMenuPageType(void) large
{
BYTE bParm = 0;
WORD wMsg = 0xffff;
if (_rDigest.bType < DGST_TYPE_MAX)
{
wMsg = pwDgstMenuPageType[_rDigest.bType];
}
switch (_rDigest.bType)
{
case DGST_TYPE_CHAPTER:
case DGST_TYPE_TIME_TTL:
bParm = bSharedInfo(SI_TT_NO);
break;
case DGST_TYPE_TIME_PTT:
bParm = bSharedInfo(SI_CHAP_NO);
break;
case DGST_TYPE_TIME_TRK:
bParm = bSharedInfo(SI_TRACK_NO);
break;
#ifdef SUPPORT_DVD_AUDIO
case DA_DGST_TYPE_GROUP:
case DA_DGST_TYPE_TIME_GRP:
bParm = bSharedInfo(SI_GRP_NO);
break;
case DA_DGST_TYPE_TRACK:
case DA_DGST_TYPE_TIME_TRK:
bParm = bSharedInfo(SI_TRACK_NO);
break;
#endif
#if 0
case DA_DGST_TYPE_INDEX:
case DA_DGST_TYPE_SPOTLIGHT:
case DA_DGST_TYPE_BOOKMARK:
#endif
default:
break;
}
vSetMsgCol4(WB_DGST_MENU, 0, 0, 0, 3);
vOsdShowDgstMenuType(wMsg, bParm);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstShowMenuPageButton(void) large
{
vSetBtnCol(WB_DGST_MENU, 15, 0, 2, 3);
#ifdef NUI_OSD_STYLE
vSetMsgCol4(WB_DGST_MENU, 15, 0, 2, 3);
#else
vSetMsgCol4(WB_DGST_MENU, 15, 0, 0, 3);
#endif
_wStartY = 2 * LINE_HEIGHT ;
_wEndY = 3 * LINE_HEIGHT-1;
/* PREV button */
_wStartX = 0.5 * EFONT_WIDTH;
_wEndX = 7 * EFONT_WIDTH;
if (_rDigest.bPageNo > 0)
{
//vOsdPosPaste(OSD_POS_DGST_BTN_1, OSD_MSG_PREV_PAGE);
vCreateMsgButton(WB_DGST_MENU, DGST_MENU_BTN_PREV, 0, OSD_MSG_PREV_PAGE, 10, 0);
vUnselButton(WB_DGST_MENU, DGST_MENU_BTN_PREV);
_rDigest.fgPrevValid = TRUE;
}
else
{
//vOsdPosClear(OSD_POS_DGST_BTN_1);
vRectangle(WB_DGST_MENU, 0, 0, 1, 0);
_rDigest.fgPrevValid = FALSE;
}
/* EXIT button */
//vOsdPosPaste(OSD_POS_DGST_BTN_2, OSD_MSG_EXIT);
_wStartX = 7.5 * EFONT_WIDTH;
_wEndX = _wStartX + 6 * EFONT_WIDTH;
vCreateMsgButton(WB_DGST_MENU, DGST_MENU_BTN_EXIT, 0, OSD_MSG_EXIT, 10, 0);
vUnselButton(WB_DGST_MENU, DGST_MENU_BTN_EXIT);
/* MENU button */
//vOsdPosPaste(OSD_POS_DGST_BTN_3, OSD_MSG_MENU);
_wStartX = 14.5 * EFONT_WIDTH;
_wEndX = _wStartX + 6 * EFONT_WIDTH;
vCreateMsgButton(WB_DGST_MENU, DGST_MENU_BTN_MENU, 0, OSD_MSG_MENU, 10, 0);
vUnselButton(WB_DGST_MENU, DGST_MENU_BTN_MENU);
/* NEXT button */
#ifdef NUI_OSD_STYLE
_wStartX = 20.5 * EFONT_WIDTH;
#else
_wStartX = 21.5 * EFONT_WIDTH;
#endif
_wEndX = _wStartX + 6.5 * EFONT_WIDTH;
if ((_rDigest.bPageNo + 1) * DGST_VIEW_NS < _rDigest.bSelNoMax)
{
//vOsdPosPaste(OSD_POS_DGST_BTN_4, OSD_MSG_NEXT_PAGE);
vCreateMsgButton(WB_DGST_MENU, DGST_MENU_BTN_NEXT, 0, OSD_MSG_NEXT_PAGE, 10, 0);
vUnselButton(WB_DGST_MENU, DGST_MENU_BTN_NEXT);
_rDigest.fgNextValid = TRUE;
}
else
{
//vOsdPosClear(OSD_POS_DGST_BTN_4);
vRectangle(WB_DGST_MENU, 0, 0, 1, 0);
_rDigest.fgNextValid = FALSE;
}
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstMenuGotoItem(BYTE bItem) large
{
#ifdef NUI_OSD_STYLE
vSetMsgCol4(WB_DGST_MENU, 0, 0, 2, 3);
#else
vSetMsgCol4(WB_DGST_MENU, 0, 0, 0, 3);
#endif
switch(_rDigest.bCurItem)
{
case DGST_MENU_BTN_PREV:
if (_rDigest.fgPrevValid != FALSE)
{
vUnselButton(WB_DGST_MENU, _rDigest.bCurItem);
}
break;
case DGST_MENU_BTN_NEXT:
if (_rDigest.fgNextValid != FALSE)
{
vUnselButton(WB_DGST_MENU, _rDigest.bCurItem);
}
break;
case DGST_MENU_BTN_EXIT:
case DGST_MENU_BTN_MENU:
default:
vUnselButton(WB_DGST_MENU, _rDigest.bCurItem);
}
if (bItem == DGST_MENU_BTN_PREV)
{
if (_rDigest.fgPrevValid == TRUE)
{
_rDigest.bCurItem = DGST_MENU_BTN_PREV;
}
else
{
_rDigest.bCurItem = DGST_MENU_BTN_PREV + 1;
}
}
else if (bItem >= DGST_MENU_BTN_NEXT)
{
if (_rDigest.fgNextValid == TRUE)
{
_rDigest.bCurItem = DGST_MENU_BTN_NEXT;
}
else
{
_rDigest.bCurItem = DGST_MENU_BTN_NEXT - 1;
}
}
else
{
_rDigest.bCurItem = bItem;
}
/* change state */
_rDigest.bState = DGST_STATE_MENU;
//vOsdPosHili(OSD_POS_HILI_SHOW, OSD_POS_DGST_BTN_1 + _rDigest.bCurItem, 0);
vOsdPosHili(OSD_POS_HILI_CLEAR, 0, 0);
#ifdef NUI_OSD_STYLE
vSetMsgCol4(WB_DGST_MENU, 15, 15, 2, 3);
#else
vSetMsgCol4(WB_DGST_MENU, 15, 15, 15, 3);
#endif
vSelButton(WB_DGST_MENU, _rDigest.bCurItem);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstNextPage(void) large
{
if (_rDigest.fgNextValid == TRUE)
{
_rDigest.fgDispValid = FALSE;
fgDgstPlayControl(SV_DGST_NEXT, 0);
vOsdShowDgstMark(0, OSD_DGST_MARK_CLEAR, 0);
vDgstShowMenuPageButton();
vDgstDispInit(FALSE);
if ((_rDigest.bState == DGST_STATE_MENU) && (_rDigest.bCurItem == DGST_MENU_BTN_NEXT))
{
vDgstMenuGotoItem(DGST_MENU_BTN_NEXT);
}
else
{
vDgstMenuGotoItem(DGST_MENU_BTN_EXIT);
}
}
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstPrevPage(void) large
{
if (_rDigest.fgPrevValid == TRUE)
{
_rDigest.fgDispValid = FALSE;
fgDgstPlayControl(SV_DGST_PREV, 0);
vOsdShowDgstMark(0, OSD_DGST_MARK_CLEAR, 0);
vDgstShowMenuPageButton();
vDgstDispInit(FALSE);
if ((_rDigest.bState == DGST_STATE_MENU) && (_rDigest.bCurItem == DGST_MENU_BTN_PREV))
{
vDgstMenuGotoItem(DGST_MENU_BTN_PREV);
}
else
{
vDgstMenuGotoItem(DGST_MENU_BTN_EXIT);
}
}
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstMenuBtnActive(void) large
{
switch (_rDigest.bCurItem)
{
case DGST_MENU_BTN_PREV:
vDgstPrevPage();
break;
case DGST_MENU_BTN_EXIT:
vDgstMenuExit(TRUE);
_rDigest.bState = DGST_STATE_EXIT;
/* escape in fgDigestState() */
break;
case DGST_MENU_BTN_MENU:
vDgstDispExit();
vDgstMenuExit(TRUE);
if (_rDigest.fgResume == TRUE)
{
_rDigest.bState = DGST_STATE_RESUME;
vDgstResumeInit(TRUE);
}
else
{
vDgstTypeInit(TRUE);
}
break;
case DGST_MENU_BTN_NEXT:
vDgstNextPage();
break;
}
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstMenuInit(BYTE fgInit) large
{
#if (DRAM_SZ == DRAM_2M)
vOsdSetMemBlk(OSD_MEM_BLK_DYNAMIC);
#endif
if (fgInit == TRUE)
{
/* initial variables */
_rDigest.fgDispValid = FALSE;
_rDigest.bSelNoMax = bSharedInfo(SI_USR_DIGEST_NS);
_rDigest.bPageNo = 0;
#ifdef ALL_WB_USE_TRUECOLOR
vCreateWB(WB_DGST_MENU, TRUE);
vSetWBTcColor(WB_DGST_MENU);
#else
vCreateWB(WB_DGST_MENU, FALSE);
#endif
#ifdef NUI_OSD_STYLE
vSetMsgCol4(WB_DGST_MENU,0,0,2,3); // 2 is the theme_fontoutline_color
#endif
vDgstShowMenuPageType();
vOsdShowDgstMenuSelect(1, _rDigest.bSelNoMax, 0, 0); /* show select range, no hili */
vDgstShowMenuPageButton();
#ifdef IR_SUPPORT_SHIFT_KEY
if (fgIsKeyTblShift())
{
vSetShiftKeyMode(TRUE);
}
else /* normal key table */
{
vSetShiftKeyMode(FALSE);
}
#endif /* IR_SUPPORT_SHIFT_KEY */
vDgstDispInit(TRUE);
/* chnage OSD mode to full screen mode */
vOsdShowWb(OSD_WB_FULL_SCR);
/* original enable WB in osdcore.c, now enable it here */
vEnableWB(WB_DGST_DISP1);
vEnableWB(WB_DGST_DISP1A);
vEnableWB(WB_DGST_DISP2);
vEnableWB(WB_DGST_DISP2A);
vEnableWB(WB_DGST_MENU);
}
vDgstMenuGotoItem(DGST_MENU_BTN_EXIT);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstMenuExit(BYTE fgResume) large
{
if (fgResume)
{
fgDgstPlayControl(SV_DGST_RESUME, 0);
}
vDeleteWB(WB_DGST_MENU);
#if (DRAM_SZ == DRAM_2M)
vOsdSetMemBlk(OSD_MEM_BLK_STATIC);
#endif
/* restore OSD mode */
vOsdShowWb(OSD_WB_RESTORE);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
BOOL fgDgstMenuState(void) large
{
BOOL fgRet = TRUE;
switch (_bIRKey)
{
case IR_UP:
{
vDgstNumInit(FALSE);
break;
}
case IR_DOWN:
if (_rDigest.fgDispValid)
{
/* change to display state */
vDgstMenuBtnUnsel(DGST_STATE_DISP);
vDgstDispGotoItem(0);
}
break;
case IR_LEFT:
if (_rDigest.bCurItem > 0)
{
vDgstMenuGotoItem(_rDigest.bCurItem - 1);
}
break;
case IR_RIGHT:
if (_rDigest.bCurItem < DGST_MENU_BTN_MAX - 1)
{
vDgstMenuGotoItem(_rDigest.bCurItem + 1);
}
break;
case IR_ENTER:
case IR_PLAY:
case IR_PLAY_ENTER:
case IR_PLAY_PAUSE:
{
vDgstMenuBtnActive();
break;
}
case IR_NEXT:
vDgstNextPage();
break;
case IR_PREV:
vDgstPrevPage();
break;
case IR_TIME_OUT:
vSetExitInputState();
break;
default:
{
if (_bIRKey <= IR_ADD10 || _bIRKey == IR_ADD5) // megaa ADD5
{
vDgstNumInit(TRUE);
fgRet = fgDgstNumState();
}
else
{
fgRet = FALSE;
}
break;
}
} /* switch (_bIRKey) */
return (fgRet);
}
// *********************************************************************
// Display Select Sub-state Functions
// *********************************************************************
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstDispGotoItem(BYTE bItem)
{
BYTE bType;
if (bItem >= _rDigest.bPageItemMax)
{
bItem = _rDigest.bPageItemMax - 1;
}
switch(_rDigest.bType)
{
case DGST_TYPE_TRACK:
case DGST_TYPE_TITLE:
case DGST_TYPE_CHAPTER:
case DGST_TYPE_BOOKMARK:
case DGST_TYPE_PROGRAM:
#ifdef SUPPORT_DVD_AUDIO
case DA_DGST_TYPE_GROUP:
case DA_DGST_TYPE_TRACK:
case DA_DGST_TYPE_BOOKMARK:
#endif
bType = OSD_DGST_MARK_NO;
break;
case DGST_TYPE_TIME_DISC:
case DGST_TYPE_TIME_TRK:
#ifdef SUPPORT_DVD_AUDIO
case DA_DGST_TYPE_TIME_GRP:
case DA_DGST_TYPE_TIME_TRK:
#endif
bType = OSD_DGST_MARK_TIME2;
break;
case DGST_TYPE_TIME_TTL:
case DGST_TYPE_TIME_PTT:
bType = OSD_DGST_MARK_TIME3;
break;
#if 0
case DA_DGST_TYPE_INDEX:
case DA_DGST_TYPE_SPOTLIGHT:
#endif
case DGST_TYPE_STROBE:
default:
bType = OSD_DGST_MARK_NONE;
break;
}
if (bType != OSD_DGST_MARK_NONE)
{
vOsdShowDgstMark(bItem, bType | OSD_DGST_MARK_HILI, 0);
}
/* change state */
_rDigest.bState = DGST_STATE_DISP;
_rDigest.bCurItem = bItem;
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstDispInit(BYTE fgInit) large
{
BYTE bIdx;
/* the white board has been created in vDgstMenuInit(), just show hili */
if (fgInit == TRUE)
{
#ifdef ALL_WB_USE_TRUECOLOR
vCreateWB(WB_DGST_DISP1, TRUE);
vSetWBTcColor(WB_DGST_DISP1);
vSetTcPal(WB_DGST_DISP1, 1, BLEND_2, TRUECOLOR_BLACK);
vCreateWB(WB_DGST_DISP1A, TRUE);
vSetWBTcColor(WB_DGST_DISP1A);
vSetTcPal(WB_DGST_DISP1A, 1, BLEND_2, TRUECOLOR_BLACK);
#else
vCreateWB(WB_DGST_DISP1, FALSE);
vSetPal(WB_DGST_DISP1, 1, BLEND_2, 0);
vCreateWB(WB_DGST_DISP1A, FALSE);
vSetPal(WB_DGST_DISP1A, 1, BLEND_2, 0);
#endif
#ifdef NUI_OSD_STYLE
vSetMsgCol4(WB_DGST_DISP1, 0, 1, 1, 3);
#else
vSetMsgCol4(WB_DGST_DISP1, 0, 0, 1, 3);
#endif
vSetTransEn(WB_DGST_DISP1, 0);
vClearWB(WB_DGST_DISP1);
vSetMsgCol4(WB_DGST_DISP1A, 0, 0, 1, 3);
vSetTransEn(WB_DGST_DISP1A, 0);
vClearWB(WB_DGST_DISP1A);
#ifdef ALL_WB_USE_TRUECOLOR
vCreateWB(WB_DGST_DISP2, TRUE);
vSetWBTcColor(WB_DGST_DISP2);
vSetTcPal(WB_DGST_DISP2, 1, BLEND_2, TRUECOLOR_BLACK);
vCreateWB(WB_DGST_DISP2A, TRUE);
vSetWBTcColor(WB_DGST_DISP2A);
vSetTcPal(WB_DGST_DISP2A, 1, BLEND_2, TRUECOLOR_BLACK);
#else
vCreateWB(WB_DGST_DISP2, FALSE);
vSetPal(WB_DGST_DISP2, 1, BLEND_2, 0);
vCreateWB(WB_DGST_DISP2A, FALSE);
vSetPal(WB_DGST_DISP2A, 1, BLEND_2, 0);
#endif
#ifdef NUI_OSD_STYLE
vSetMsgCol4(WB_DGST_DISP2, 0, 1, 1, 3);
#else
vSetMsgCol4(WB_DGST_DISP2, 0, 0, 1, 3);
#endif
vSetTransEn(WB_DGST_DISP2, 0);
vClearWB(WB_DGST_DISP2);
vSetMsgCol4(WB_DGST_DISP2A, 0, 0, 1, 3);
vSetTransEn(WB_DGST_DISP2A, 0);
vClearWB(WB_DGST_DISP2A);
/* enable WB in vDgstMenuInit() */
}
if (_rDigest.bSelNoMax >= (_rDigest.bPageNo + 1) * DGST_VIEW_NS)
{
_rDigest.bPageItemMax = DGST_VIEW_NS;
}
else
{
_rDigest.bPageItemMax = _rDigest.bSelNoMax - _rDigest.bPageNo * DGST_VIEW_NS;
}
// Hack code, show all mark at the same time
vOsdSetSt(OSD_ST_BURST);
for (bIdx = 0; bIdx < _rDigest.bPageItemMax; bIdx++)
{
vDgstShowDispMark(bIdx);
}
// Hack code
vOsdSetSt(OSD_ST_NML);
/* vDgstDispGotoItem(0); */
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstDispExit(void) large
{
vDeleteWB(WB_DGST_DISP1);
vDeleteWB(WB_DGST_DISP2);
vDeleteWB(WB_DGST_DISP1A);
vDeleteWB(WB_DGST_DISP2A);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
BOOL fgDgstDispState(void) large
{
BOOL fgRet = TRUE;
switch (_bIRKey)
{
case IR_UP:
if (_rDigest.bCurItem >= DGST_COL_NS)
{
vDgstDispGotoItem(_rDigest.bCurItem - DGST_COL_NS);
}
break;
case IR_LEFT:
if (_rDigest.bCurItem > 0)
{
vDgstDispGotoItem(_rDigest.bCurItem - 1);
}
break;
case IR_RIGHT:
if (_rDigest.bCurItem + 1 < _rDigest.bPageItemMax)
{
vDgstDispGotoItem(_rDigest.bCurItem + 1);
}
break;
case IR_DOWN:
if (_rDigest.bCurItem + DGST_COL_NS < _rDigest.bPageItemMax)
{
vDgstDispGotoItem(_rDigest.bCurItem + DGST_COL_NS);
}
else
{
vDgstNumInit(FALSE);
}
break;
case IR_NEXT:
vDgstNextPage();
break;
case IR_PREV:
vDgstPrevPage();
break;
case IR_ENTER:
case IR_PLAY:
case IR_PLAY_ENTER:
case IR_PLAY_PAUSE:
{
if (fgDgstPlayControl(SV_DGST_PLAY, _rDigest.bCurItem + _rDigest.bPageNo * DGST_VIEW_NS + 1) == TRUE)
{
vDgstDispExit();
vDgstMenuExit(FALSE);
_rDigest.bState = DGST_STATE_EXIT;
vSetExitInputState();
}
break;
}
case IR_TIME_OUT:
vSetExitInputState();
break;
default:
{
if (_bIRKey <= IR_ADD10 || _bIRKey == IR_ADD5) // megaa ADD5
{
vDgstNumInit(TRUE);
fgRet = fgDgstNumState();
}
else
{
fgRet = FALSE;
}
break;
}
} /* switch (_bIRKey) */
return (fgRet);
}
// *********************************************************************
// Wait Digest Initial Sub-state Functions
// *********************************************************************
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstInitInit(BYTE fgInit) large
{
_rDigest.bState = DGST_STATE_INIT;
/* set input timeout */
vIrSetTimeOut(IR_TIMEOUT_DGST_INIT);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstInitExit(void) large
{
vIrSetTimeOut(IR_TIMER_VOID);
/* if UOP return OK and not timeout, switch to menu state */
vDgstMenuInit(TRUE);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
BOOL fgDgstInitState(void) large
{
BOOL fgRet = TRUE;
switch (_bIRKey)
{
case IR_TIME_OUT:
vSetExitInputState();
break;
case IR_DONE:
vDgstInitExit();
break;
default:
break;
}
return (fgRet);
}
// *********************************************************************
// Wait Digest Resume Sub-state Functions
// *********************************************************************
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstResumeInit(BYTE fgInit) large
{
/* set input timeout */
vIrSetTimeOut(IR_TIMEOUT_DGST_RESUME);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstResumeExit(void) large
{
vIrSetTimeOut(IR_TIMER_VOID);
/* if UOP return OK and not timeout, switch to type state */
vDgstTypeInit(TRUE);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
BOOL fgDgstResumeState(void) large
{
BOOL fgRet = TRUE;
switch (_bIRKey)
{
case IR_TIME_OUT:
vSetExitInputState();
break;
case IR_DONE:
vDgstResumeExit();
break;
default:
break;
}
return (fgRet);
}
// *********************************************************************
// Number Select Input state
// *********************************************************************
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstNumInit(BYTE fgInit) large
{
vOsdPosHili(OSD_POS_HILI_CLEAR, 0, 0);
vDgstMenuBtnUnsel(DGST_STATE_NUM);
#ifdef NO_ADD10_KEY
vNumInInitState(NUM_IN_SEQ_WAIT, 2);
#else
vNumInInitState(NUM_IN_TYPE_1, 1);
#endif
vOsdShowDgstMenuSelect(1, _rDigest.bSelNoMax, 0, OSD_DGST_SEL_HILI | 0); /* with hi-li */
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDgstNumExit(BYTE bSelNo) large
{
vOsdShowDgstMenuSelect(1, _rDigest.bSelNoMax, 0, 0); /* without hi-li */
if ((bSelNo > 0) && (bSelNo <= _rDigest.bSelNoMax))
{
if (fgDgstPlayControl(SV_DGST_PLAY, bSelNo) == TRUE)
{
vDgstDispExit();
vDgstMenuExit(FALSE);
/* note still in the same state */
vSetExitInputState();
return;
}
}
/* select fail */
if ((_bIRKey == IR_UP) && (_rDigest.fgDispValid == TRUE))
{
vDgstDispGotoItem(0);
}
else
{
vDgstMenuGotoItem(DGST_MENU_BTN_EXIT);
}
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
BOOL fgDgstNumState(void) large
{
BOOL fgRetValue = TRUE;
switch (_bIRKey)
{
case IR_CLEAR:
#ifdef NO_ADD10_KEY
vNumInInitState(NUM_IN_SEQ_WAIT, 2);
#else
vNumInInitState(NUM_IN_TYPE_1, 1);
#endif
vOsdShowDgstMenuSelect(1, _rDigest.bSelNoMax, _rNumInStateCtx.wNum, OSD_DGST_SEL_HILI | 0); /* with hi-li */
break;
case IR_ENTER:
case IR_PLAY:
case IR_PLAY_ENTER:
case IR_PLAY_PAUSE:
{
if (_rNumInStateCtx.rState.fgComplete)
{
if ((_rNumInStateCtx.wNum > 0) &&
(_rNumInStateCtx.wNum <= _rDigest.bSelNoMax) &&
(_rNumInStateCtx.rState.fgCancel == FALSE))
{
vDgstNumExit(_rNumInStateCtx.wNum);
}
else
{
vDgstNumExit(0);
}
}
break;
} /* IR_ENTER */
case IR_DONE:
/* ignore it */
break;
default:
{
if (_bIRKey <= IR_ADD10 || _bIRKey == IR_ADD5) // megaa ADD5
{
if (_rNumInStateCtx.rState.fgComplete)
{
#ifdef NO_ADD10_KEY
vNumInInitState(NUM_IN_SEQ_WAIT, 2);
#else
vNumInInitState(NUM_IN_TYPE_1, 1);
#endif
}
fgNumInState();
vOsdShowDgstMenuSelect(1, _rDigest.bSelNoMax, _rNumInStateCtx.wNum,
OSD_DGST_SEL_HILI | _rNumInStateCtx.rState.bDigNum); /* with hi-li */
}
else /* > IR_ADD10 and not IR_ADD5 */
{
vDgstNumExit(0);
fgRetValue = FALSE;
}
break;
} /* default */
} /* switch (_bIRKey) */
return (fgRetValue);
}
// *********************************************************************
// Module Entry Functions
// *********************************************************************
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDigestInit(BYTE fgInit) large
{
BYTE bPbcState = bSharedInfo(SI_PBC_STATE);
BYTE bDom = bSharedInfo(SI_DVD_DOM);
#if (DRAM_SZ == DRAM_2M)
vOsdSetMemBlk(OSD_MEM_BLK_DYNAMIC);
#endif
/* TODO: need to check is play and in not menu */
if (fgIsDiscPlay(bPbcState) || (bPbcState == SV_STOP_RESUME))
{
if (fgIsDvdPlay())
{
if ((bDom == SV_VTSTT_DOM) || (bDom == SV_ATSTT_DOM))
{
_rDigest.fgResume = TRUE;
}
else
{
_rDigest.fgResume = FALSE;
}
}
#ifdef VCD_SUPPORT
else if (fgIsVcdPlay())
{
if ((bSharedInfo(SI_PBC_SWITCH) == SV_PBC_ON) &&
(bSharedInfo(SI_VCD_DOM) == SV_SELECT_LIST))
{
_rDigest.fgResume = FALSE;
}
else
{
_rDigest.fgResume = TRUE;
}
}
#endif
}
else
{
_rDigest.fgResume = FALSE;
}
/* set digest control mode */
vSetSharedInfo(SI_USR_DIGEST_CTRL, SV_DGST_ONCE);
/* set hilight color */
vSetHLCol(HL_1, 0x0000); /* green */
/* initial sub-state */
vDgstTypeInit(TRUE);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDigestExit(void) large
{
if (_rDigest.bState == DGST_STATE_TYPE)
{
vDgstTypeExit();
}
else if ((_rDigest.bState == DGST_STATE_MENU) || (_rDigest.bState == DGST_STATE_DISP))
{
/* let WB disappear quickly, disable is faster than delete */
vOsdSetSt(OSD_ST_BURST);
vDisableWB(WB_DGST_DISP1);
vDisableWB(WB_DGST_DISP2);
vDisableWB(WB_DGST_DISP1A);
vDisableWB(WB_DGST_DISP2A);
vDisableWB(WB_DGST_MENU);
vOsdSetSt(OSD_ST_NML);
/* let WB disappear quickly end*/
vDgstDispExit();
vDgstMenuExit(TRUE);
}
else if (_rDigest.bState == DGST_STATE_EXIT)
{
vDeleteWB(WB_DGST_DISP1);
vDeleteWB(WB_DGST_DISP2);
vDeleteWB(WB_DGST_DISP1A);
vDeleteWB(WB_DGST_DISP2A);
vDeleteWB(WB_DGST_MENU);
}
else if (_rDigest.bState == DGST_STATE_NUM)
{
/* let WB disappear quickly, disable is faster than delete */
vOsdSetSt(OSD_ST_BURST);
vDisableWB(WB_DGST_DISP1);
vDisableWB(WB_DGST_DISP2);
vDisableWB(WB_DGST_DISP1A);
vDisableWB(WB_DGST_DISP2A);
vDisableWB(WB_DGST_MENU);
vOsdSetSt(OSD_ST_NML);
/* let WB disappear quickly end*/
vDgstDispExit();
if (_rNumInStateCtx.rState.fgComplete)
{
/* number is selected OK */
vDgstMenuExit(FALSE);
}
else
{
vDgstMenuExit(TRUE);
}
}
/* assume change color is disabled */
vOsdPosHili(OSD_POS_HILI_CLEAR, 0, 0);
/* status recall, temp add */
if (_rDigest.fgResume == TRUE)
{
vStatusDispRecall();
}
#if (DRAM_SZ == DRAM_2M)
vOsdSetMemBlk(OSD_MEM_BLK_STATIC);
#endif
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
BOOL fgDigestState(void) large
{
BOOL fgRet = TRUE;
/* sub-state function */
switch (_rDigest.bState)
{
case DGST_STATE_TYPE:
fgRet = fgDgstTypeState();
break;
case DGST_STATE_MENU:
fgRet = fgDgstMenuState();
break;
case DGST_STATE_DISP:
fgRet = fgDgstDispState();
break;
case DGST_STATE_INIT:
fgRet = fgDgstInitState();
break;
case DGST_STATE_RESUME:
fgRet = fgDgstResumeState();
break;
case DGST_STATE_NUM:
fgRet = fgDgstNumState();
break;
default:
vSetExitInputState();
return (TRUE);
}
if (fgRet == FALSE)
{
switch (_bIRKey)
{
case IR_DIGEST:
{
vSetExitInputState();
fgRet = TRUE;
break;
}
default:
#if 0
if (fgIsAVContrlKey(_bIRKey))
{
/* pass the A/V control key */
fgRet = FALSE;
}
#else
fgRet = TRUE; /* not allow setup menu and A/V control key */
#endif
break;
}
}
return (fgRet);
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDigestHandleUpdate(BYTE bItem, BYTE bVal) large
{
switch (bItem)
{
case DGST_UPD_NO:
/* the page last item */
if (bVal == (_rDigest.bPageNo * DGST_VIEW_NS + _rDigest.bPageItemMax - 1))
{
_rDigest.fgDispValid = TRUE;
}
break;
default:
break;
}
}
// *********************************************************************
// Function :
// Description :
// Parameter :
// Return :
// *********************************************************************
void vDigestUsrPbcChange(void) large
{
if ((bSharedInfo(SI_USR_PBC_CTRL) != SV_USR_DIGEST) &&
(_rDigest.bState == DGST_STATE_EXIT))
{
fgSetPlayPostKey(IR_TIME_OUT);
}
}
#else /* PLAYER_DIGEST dummy function */
static code BYTE pbDigestCodeSegment[1] = { FALSE }; /* for code segment */
void vDigestInit(BYTE fgInit) large { return; }
BOOL fgDigestState(void) large { return (pbDigestCodeSegment[0]); }
void vDigestExit(void) large { return; }
void vDigestHandleUpdate(BYTE bItem, BYTE bVal) large { return; }
void vDigestUsrPbcChange(void) large { return; }
#endif /* PLAYER_DIGEST */