📄 flmenu.c
字号:
wIdx = FL_ITEM_FIELD(_bFlMnCurItemIdx);
bLoByte(wLoWord(dwAddr)) = bSharedInfo(wIdx);
bHiByte(wLoWord(dwAddr)) = bSharedInfo(wIdx + 1);
bLoByte(wHiWord(dwAddr)) = bSharedInfo(wIdx + 2);
bHiByte(wHiWord(dwAddr)) = bSharedInfo(wIdx + 3);
bChar = bReadDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr));
if ((bLen == 0x1) && (bChar == 0x1))
return TRUE;
#else
WORD wBsseDir, wIdx;
wBaseDir = wFlMnGetListBaseDir(_bFlMnListId);
wIdx = wFlGetItemIdx(_bFlMnCurItemIdx);
if ((wBaseDir != 0) && (wIdx == 0) && (_bFlMnItemType == FTYPE_FOLDER))
return TRUE;
#endif
}
////////////////////////////////////////////////////////////////////////////////
// IR Handler
/**
* Handle IR_PLAY, IR_ENTER, IR_RIGHT_ENTER. It acts like "clicking" or
* "selecting" actually.
*/
static BOOL fgFlMnOnIrPlay(void) large
{
DWRD dwAddr;
WORD wBaseDir, wIdx;
BYTE bLen, bChar;
// - check the type of the clicked item
switch(_bFlMnItemType)
{
case FTYPE_FOLDER:
if (_bFlMnMemLock || fgFlClIsLock())
return TRUE;
if (!fgFlClLock(FL_CMDPATH_CHG_DIR))
return TRUE;
fgFlMnLeavItem(_bFlMnCurItemIdx);
if (fgIsParentDir())
fgFlMnEntDir(_bFlMnCurItemIdx, TRUE);
else
fgFlMnEntDir(_bFlMnCurItemIdx, FALSE);
break;
case FTYPE_AV:
// - click the item and change the playback module to MPEG player
vFlCmdClickItem(_bFlMnListId, wFlGetItemIdx(_bFlMnCurItemIdx));
break;
case FTYPE_STILL:
// - turn off the preview mode and terminate the preview timing
#ifdef JPG_PREVIEW_SUPPORT
vSetSharedInfo(SI_PREVIEW_MODE, FALSE);
_bPreview = PREVIEW_STATE_IDLE;
#endif
#if (DRAM_SZ == DRAM_2M)
vDeleteWB(FL_MENU_WB);
vDeleteWB(FL_INFO_WB);
#endif
if (fgFlClLock(FL_CMDPATH_CLICK))
vFlCmdClickItem(_bFlMnListId, wFlGetItemIdx(_bFlMnCurItemIdx));
break;
case FTYPE_AUDIO:
// - for all audio files
wBaseDir = wFlMnGetListBaseDir(_bFlMnListId);
wIdx = wFlGetItemIdx(_bFlMnCurItemIdx);
if ((wBaseDir == _wFlCurAdoDir) && (wIdx == _wFlCurAdoIdx) && (bSharedInfo(SI_MP3_MOD) != SV_STOP))
{
vSendUopCmd(UOP_PLAY, 0, 0, 0);
}
else
{
_wFlCurAdoDir = wBaseDir;
vWorkAreaMove(FALSE);
vFlCmdClickItem(_bFlMnListId, wFlGetItemIdx(_bFlMnCurItemIdx));
}
default:
break;
}
return TRUE;
}
static BOOL fgFlMnOnIrPause(void) large
{
if (bSharedInfo(SI_MP3_MOD) == SV_PAUSE)
{
vSendUopCmd(UOP_PLAY, 0, 0, 0);
}
else
{
vSendUopCmd(UOP_PAUSE, 0, 0, 0);
}
return TRUE;
}
#ifdef FL_USE_LOGO
/**
* Operations for showing the basic visual components of the
* file browser menu.
*/
static void vFlMnShowPage(void) large
{
// - display the menu logo
vPlayerShowLogo(ISO_STOP_LOGO, ISO_LOGO_COLOR);
// - enable the whiteboard
#if 0//(DRAM_SZ != DRAM_2M) //cl 0512
#ifdef FSMENU_INFO_PANEL
vCreateWB(FL_INFO_WB, TRUE);
#endif
vCreateWB(FL_MENU_WB, TRUE);
#else
#ifdef FSMENU_INFO_PANEL
vEnableWB(FL_INFO_WB);
#endif
vEnableWB(FL_MENU_WB);
#endif
vSetSharedInfo(SI_HLI_STATE, SV_ON); // - turn on hili select mode
return;
}
#else
static void vFlMnShowPage(void) large
{
_wStartX = FLMN_BTN_0_X;
_wEndX = FLMN_BTN_0_X + FLMN_BTN_0_W;
_wStartY = FLMN_BTN_0_Y;
_wEndY = FLMN_BTN_0_Y + FLMN_BTN_0_H;
vCreateButton(FL_MENU_WB, 30, 4);
//vSetBtnCol(FL_MENU_WB, 0, 0, 2, 3);
vSetBtnCol(FL_MENU_WB, 0, 0, 3, 2);
vUnselButton(FL_MENU_WB, 30);
_wStartX = FLMN_BTN_1_X;
_wEndX = FLMN_BTN_1_X + FLMN_BTN_1_W;
_wStartY = FLMN_BTN_1_Y;
_wEndY = FLMN_BTN_1_Y + FLMN_BTN_1_H;
vCreateButton(FL_MENU_WB, 30, 4);
//vSetBtnCol(FL_MENU_WB, 0, 0, 2, 3);
vSetBtnCol(FL_MENU_WB, 0, 0, 3, 2);
vSelButton(FL_MENU_WB, 30);
_wStartX = FLMN_BTN_2_X;
_wEndX = FLMN_BTN_2_X + FLMN_BTN_2_W;
_wStartY = FLMN_BTN_2_Y;
_wEndY = FLMN_BTN_2_Y + FLMN_BTN_2_H;
vCreateButton(FL_MENU_WB, 30, 4);
//vSetBtnCol(FL_MENU_WB, 0, 0, 2, 3);
vSetBtnCol(FL_MENU_WB, 0, 0, 3, 2);
vSelButton(FL_MENU_WB, 30);
_wStartX = FLMN_BTN_3_X;
_wEndX = FLMN_BTN_3_X + FLMN_BTN_3_W;
_wStartY = FLMN_BTN_3_Y;
_wEndY = FLMN_BTN_3_Y + FLMN_BTN_3_H;
vCreateButton(FL_MENU_WB, 30, 4);
//vSetBtnCol(FL_MENU_WB, 0, 0, 2, 3);
vSetBtnCol(FL_MENU_WB, 0, 0, 3, 2);
vSelButton(FL_MENU_WB, 30);
vDrawSpin();
}
#endif
// INTER-MODULE INTERFACE
/**
* Init the object "file list menu".
*/
BOOL fgFlMnInit(void) large
{
WORD wTmp;
// - perform init operations of module "fs list menu"
// 1. init the command as done
vFlCmdDone();
// 2. init control flags & variables
_bFlMnListId = 0xFF;
_bFlMnItemNs = 0x0;
_bFlMnCurItemIdx = 0x0;
_wFlMnListLen = 0x0;
_bFlMnTimeType = OSD_SHOW_SINGLE_ELAPSED;
_wFlMnLstFirst = 0xFFFF;
_wFlMnPlFirst = 0xFFFF;
_wFlCurAdoDir = 0xFFFF;
_wFlCurAdoIdx = 0xFFFF;
_bFlId3Field = 0x0000;
_bFlMnHiliClrSrc1 = 0x0F;
_bFlMnHiliClrDes1 = 0x0F;
_bFlMnHiliClrSrc2 = 0x0F;
_bFlMnHiliClrDes2 = 0x0F;
_bFlMnHiliPos1 = 0x0F;
_bFlMnHiliPos2 = 0x0F;
_wFlPlIdx = 0xFFFF;
_wFlFlIdx = 0xFFFF;
_wFlFdIdx = 0xFFFF;
_bFlMnItemType = FTYPE_NONE;
_bFlIpState = IP_STATE_PANEL_1; //IP_STATE_NORMAL;
#ifdef JPG_PREVIEW_SUPPORT
_bPreview = PREVIEW_STATE_IDLE; // - jpeg preview
#endif
_bFlMnTimer = FLMN_TIMER_PERIOD; // - timer
_wFlAtplyIdx = 0;
_fgFlIsAutoPlay = FALSE;
// 3. white board usage
//vDisableUnusedWB();
// - create whiteboard and set up related OSD properties
#ifdef FSMENU_INFO_PANEL
vCreateWB(FL_INFO_WB, TRUE);
vSetWBTcColor(FL_INFO_WB);
vSetMsgCol4(FL_INFO_WB, 0, 0, 3, 2);
vSetInputMsgCol4(FL_INFO_WB, 0, 4, 4, 2);
#endif
vCreateWB(FL_MENU_WB, TRUE);
vSetWBTcColor(FL_MENU_WB);
vSetMsgCol4(FL_MENU_WB, 0, 0, 3, 2);
// 4. set size and range of jpeg preview mode
#ifdef JPG_PREVIEW_SUPPORT
vSetSharedInfo(SI_PREVIEW_MODE, TRUE);
vSetSharedInfo(SI_PREVIEW_START_X, FLMN_PREVIEW_X / 4);
vSetSharedInfo(SI_PREVIEW_START_Y, FLMN_PREVIEW_Y / 5);
vSetSharedInfo(SI_PREVIEW_WIDTH, FLMN_PREVIEW_W / 4);
vSetSharedInfo(SI_PREVIEW_HEIGHT, FLMN_PREVIEW_H / 5);
#endif
// 5. init run-time info display
vFlIpShowInfo(IP_INFO_VOLUME, bAdspCurrVol(), FLIP_VOLUME_REDRAW);
vFlIpShowInfo(IP_INFO_TOTALTIME, 0, 0);
vFlIpShowInfo(IP_INFO_TOTALTIME, 0, 0);
vFlIpShowInfo(IP_INFO_BITRATE, 0, 0);
vWorkAreaClear();
// tmp solution
vSetSharedInfo(SI_MP3_TOTAL_TIME_MM, 0);
vSetSharedInfo(SI_MP3_TOTAL_TIME_SS, 0);
#ifdef ISO_LAST_MEM
vFlMnGetLastMemItem();
#endif
// 6. create the list of the menu (the latest operation of init procedure)
if (!fgFlClLock(FL_CMDPATH_INIT_0))
{
return FALSE;
}
#ifdef ISO_LAST_MEM
if (_wFlCurAdoIdx != 0xFFFF)
{
vFlCmdCreate(FLPARM_LIST_FOLDER,
FLPARM_INC_FILE|FLPARM_INC_FOLDER|FLPARM_INC_PARENT,
_wFlCurAdoDir, FLMN_DEF_FFAC, FLPARM_SO_GDIR);
}
else
#endif
{
#ifdef SUPPORT_PCD
if (fgIsPcdPlay())
{
bLoByte(wTmp) = bSharedInfo(SI_FS_PCD_BASEDIR_LO);
bHiByte(wTmp) = bSharedInfo(SI_FS_PCD_BASEDIR_HI);
vFlCmdCreate(FLPARM_LIST_FOLDER,
0x0, wTmp, FLMN_DEF_FFAC, FLPARM_SO_GDIR);
}
else
#endif
{
vFlCmdCreate(FLPARM_LIST_FOLDER,
FLPARM_INC_PARENT, 0x0, FLPARM_FF_DIR|FLMN_DEF_FFAC, FLPARM_SO_GDIR);
}
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////
// Command Target State Transition
static void vFlMnSyncState(void) large
{
bLoByte(_wFlCurAdoIdx) = bSharedInfo(SI_MP3_ITEM_IDX_LO);
bHiByte(_wFlCurAdoIdx) = bSharedInfo(SI_MP3_ITEM_IDX_HI);
return;
}
//
// Enter this object (called when we try to move in the focus).
//
/**
* Operation to make the focus enter the object "file list menu".
*
* DES:
* 1. Show the basic visial component
* 2. Set shared info config for "file list menu" control
* 3. Display the run-time infor of MP3 (audio files) playback if necessary
* 4. Get item for redraw or enter the current item
* 5. Set the current module as the foreground module
*/
void vFlMnEnter(WORD wItem) large
{
WORD wTmp;
BYTE bTmp;
_bFlMnMemLock = FALSE;
if (_fgFlMdChg)
{
vFlMnSyncState();
}
#if 1//(DRAM_SZ != DRAM_2M)
vOsdShowWb(OSD_WB_FULL_SCR);
#endif
#if 0
if (_wCurrItem != 0xFFFF)
{
wItem = _wCurrItem;
}
else
#endif
if (wItem == 0xFFFF)
{
wItem = wFlGetItemIdx(_bFlMnCurItemIdx);
}
_bFlMnCurItemIdx = wItem % FLMN_ITEM_N;
// - show the basic visual components
vFlMnShowPage();
if (_fgFlMdChg)
{
vFlMnDrawPage();
_fgFlMdChg = FALSE;
}
_rOsdStateCtx.bTimeType = _bFlMnTimeType;
// - set shared info to config RISC
#ifdef JPG_PREVIEW_SUPPORT
_bPreview = PREVIEW_STATE_IDLE;
#endif
#if 1//def JPG_INFO
vOsdPosClear(OSD_POS_FS_INFO_BAR);
#endif
#ifdef JPG_PREVIEW_SUPPORT
vSetSharedInfo(SI_PREVIEW_MODE, TRUE);
#endif
vSetSharedInfo(SI_JPG_ROTATE_AUTO_SLIDE, FL_JPEG_SLIDESHOW_INTERVAL);
//vSetSharedInfo(SI_JPG_DIGEST_BG, 0x2);
// - display the run-time info if necessary
vFlMnDrawInfoPanel(_bFlIpState);
// - set the MP3 player as the foreground module
vFlCtrlSetFg(FLMD_MP3_PLAYER);
while(bSharedInfo(SI_DDISC_PB_MODULE) != SV_DDISC_MODULE_MP3);
if (_rFlCmdLock.bPath != FL_CMDPATH_SEL_1)
{
vFlClRls();
}
// - redraw page if necessary or get into the current item
if (!_bFlMnItemNs || // - list don't ready yet
(wItem <= wFlGetItemIdx(0x0)) ||
(wItem >= wFlGetItemIdx(FLMN_PAGE_SZ)) ||
(wItem >= wFlGetItemIdx(_bFlMnItemNs - 1)))
{
// - out boundary redraw
_bFlMnCurItemIdx = wItem % FLMN_PAGE_SZ;
if (fgFlClLock(FL_CMDPATH_REDRAW))
fgFlCmdGetItems(_bFlMnListId, wItem - (WORD)_bFlMnCurItemIdx);
}
else
{
// - in boundary, enter current item
fgFlMnEntItem((BYTE)(wItem - wFlGetItemIdx(0x0)));
for (bTmp = 0; (bTmp < _bFlMnItemNs) && (bTmp < FLMN_PAGE_SZ); bTmp++)
{
if (fgFlMnIsCurrPlayItem(bTmp))
{
vFlMnHiliOn(bTmp, FLMN_HILI_PLAY, FLMN_CLR_BG, FLMN_CLR_PLAY);
}
}
}
vFlUpdateVfd(TRUE);
return;
}
//
// Leave this object (called when we try to move away the focus).
//
WORD wFlMnLeave(BOOL bSuicide) large
{
// - snuff out hilight, and turn off the hili select mode
vFlMnHiliItem(_bFlMnCurItemIdx, FALSE);
vSetSharedInfo(SI_HLI_STATE, SV_OFF);
vFlMnHiliOff(FLMN_HILI_SEL);
vFlMnHiliOff(FLMN_HILI_PLAY);
#ifdef SHOW_FS_SLIDER
vMoveSlider(wFlGetItemIdx(_bFlMnCurItemIdx), _wFlMnListLen, FALSE);
#endif
#ifdef SPTM_SUPPORT
vHideEqBar();
#endif
#ifdef JPG_PREVIEW_SUPPORT
_bPreview = PREVIEW_STATE_IDLE;
#endif
#if (DRAM_SZ != DRAM_2M)
// - disable the whiteboard
vDisableWB(FL_MENU_WB);
vDisableWB(FL_INFO_WB);
#else
vDeleteWB(FL_MENU_WB);
vDeleteWB(FL_INFO_WB);
#endif
return (bSharedInfo(SI_MP3_ITEM_IDX_HI)*256 +
bSharedInfo(SI_MP3_ITEM_IDX_LO));
}
////////////////////////////////////////////////////////////////////////////////
// IR Key Handlers
/**
* Handle IR_DIR.
* IR_DOWN, move hover item down or move to next page
* IR_UP, move hover item up or move to previous page
* IR_RIGHT, enter the dir if it is on a dir
* IR_LEFT, move the parent dir
*/
/**
* Handle IR_UP.
*/
static BOOL fgFlMnOnIrUp(void) large
{
if (fgFlClIsLock())
return TRUE;
if (wFlGetItemIdx(_bFlMnCurItemIdx) &&
(wFlGetItemIdx(_bFlMnCurItemIdx) != 0xFFFF))
{
// - IR_UP is still available
vMoveSpin(TRUE);
fgFlMnLeavItem(_bFlMnCurItemIdx);
if (!fgFlMnEntItem(_bFlMnCurItemIdx - 1))
{
// - out boundary, change to previous page
WORD wBIdx;
wBIdx = wFlGetItemIdx(0x0);
wBIdx -= (wBIdx >= FLMN_PAGE_SZ) ? (WORD)FLMN_PAGE_SZ : wBIdx;
if (!fgFlClLock(FL_CMDPATH_UP))
return TRUE;
if (fgFlCmdGetItems(_bFlMnListId, wBIdx))
{
_bFlMnCurItemIdx = FLMN_PAGE_SZ - 1;
}
else
{
// - no more previous page
//vOsdShowError(SV_ERR_GENERAL, FL_MSG_TIMEOUT);
}
}
else
{
}
}
else
{
// - reach the first item
//vOsdShowError(SV_ERR_GENERAL, FL_MSG_TIMEOUT);
}
return TRUE;
}
/**
* Handle IR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -