📄 flmenu.c
字号:
// - check current dir
wPos = FL_LIST_FIELD(_bFlMnListId);
bLoByte(wBsDir) = bSharedInfo(wPos + 2);
bHiByte(wBsDir) = bSharedInfo(wPos + 3);
if (!wBsDir)
return FALSE;
if (fgFlCmdIsOOC()) // 20040810 by RC. Prevent doing fgFlMnEntDir() when other command is not return.
return FALSE;
#ifdef SUPPORT_PCD
if (fgIsPcdPlay())
return FALSE;
#endif
// - get in parent dir
fgFlMnLeavItem(_bFlMnCurItemIdx); // - leave current item
if ((wFlGetItemIdx(0) == 0) && (bFlGetItemType(0) == FTYPE_FOLDER))
{
if (fgFlClLock(FL_CMDPATH_DIR_UP_1))
{
fgFlMnEntDir(0, TRUE);
}
}
else
{
//_bFlMnCurItemIdx = 0; // this should be ".."
//fgFlCmdGetItems(_bFlMnListId, 0x0, FLCMD_RET_OP_ENTDIR);
if (fgFlClLock(FL_CMDPATH_DIR_UP_0))
fgFlCmdGetItems(_bFlMnListId, 0x0);
}
return TRUE;
}
/**
* Enter the dir given by item index.
*/
static BOOL fgFlMnEntDir(BYTE bItemIdx, BOOL fgMoveUp) large
{
WORD wPos, wBsDir, wIdx;
BYTE bFType;
if (bItemIdx >= FL_MIN(_bFlMnItemNs, FLMN_PAGE_SZ))
{
return FALSE;
}
// - check the type of the given item
wPos = FL_ITEM_FIELD(bItemIdx);
// - parse the full path
_bFlMnMemLock = TRUE;
vParseFolderName(bItemIdx, fgMoveUp);
/*
if (bFlClPath() == FL_CMDPATH_CHG_DIR)
{
bLoByte(wIdx) = bSharedInfo(FL_ITEM_FIELD(0) + 12);
bHiByte(wIdx) = bSharedInfo(FL_ITEM_FIELD(0) + 13);
_bFlMnCurItemIdx = (BYTE) (wIdx % FLMN_ITEM_N);
}
*/
// - get the base dir index and set the list to it
bLoByte(wBsDir) = bSharedInfo(wPos + 12);
bHiByte(wBsDir) = bSharedInfo(wPos + 13);
wPos = FL_LIST_FIELD(_bFlMnListId);
// tmp solution
// if (fgFlClIsLock() || fgFlClLock(FL_CMDLOCK_SMN, FL_CMDPATH_CHG_DIR, 0))
// vFlCmdSet(_bFlMnListId, bSharedInfo(wPos),
// bSharedInfo(wPos + 1), wBsDir, 0xFFFF, FLPARM_SO_GDIR);
vFlCmdClickItem(_bFlMnListId, wFlGetItemIdx(bItemIdx));
return TRUE;
}
/**
* Handle the notification of MP3 playback status change.
*
* NOTE: In order to avoid the racing condition, check the parameters
* of notification instead of shared info slot.
*/
static void vFlMnChgMp3State(BYTE bStt) large
{
BYTE bIdx;
WORD wItemIdx, wIdx;
// - the current item of MP3 module
bLoByte(wItemIdx) = bSharedInfo(SI_MP3_ITEM_IDX_LO);
bHiByte(wItemIdx) = bSharedInfo(SI_MP3_ITEM_IDX_HI);
bStt = bSharedInfo(SI_MP3_STT);
switch (bStt)
{
case MP3STT_PB_ENB:
// - playback enabled
break;
case MP3STT_PB_STRT:
// - playback starts
_wFlCurAdoIdx = wItemIdx;
vFlUpdateVfd(FALSE);
// - temp solution
#ifdef SPTM_SUPPORT
if (_bFlIpState == IP_STATE_PANEL_1)
vFlIpShowInfo(IP_INFO_EQ, 0, 0);
else
vHideEqBar();
#endif
if (_wFlCurAdoDir == wFlMnGetListBaseDir(_bFlMnListId))
{
vFlMnHiliOff(FLMN_HILI_PLAY);
_wFlCurAdoIdx = wItemIdx;
wIdx = wFlGetItemIdx(0);
if ((_wFlCurAdoIdx != wFlGetItemIdx(_bFlMnCurItemIdx)) &&
(wItemIdx >= wIdx) && (wItemIdx < wIdx + FLMN_ITEM_N))
{
bIdx = _wFlCurAdoIdx % FLMN_ITEM_N;
vFlMnHiliOn(bIdx, FLMN_HILI_PLAY, FLMN_CLR_BG, FLMN_CLR_PLAY);
}
}
vFlIpShowInfo(IP_INFO_FILE_INDEX, 0, wItemIdx);
vFlIpShowInfo(IP_INFO_TOTALTIME, bSharedInfo(SI_MP3_TOTAL_TIME_MM),
bSharedInfo(SI_MP3_TOTAL_TIME_SS));
vFlIpShowInfo(IP_INFO_PBC, 0, 0);
#ifdef ENABLE_ID3
vFlGetId3Info();
#endif
break;
case MP3STT_PB_FSH:
// - playback finishes
// break;
case MP3STT_PB_ABT:
// - playback is aborted
// break;
case MP3STT_PB_ERR:
// - temp solution
#ifdef SPTM_SUPPORT
vHideEqBar();
#endif
// - some playback erro occurs
vFlIpShowInfo(IP_INFO_PLAYTIME, 0, 0);
vFlIpShowInfo(IP_INFO_TOTALTIME, 0, 0);
if (_wFlCurAdoDir == wFlMnGetListBaseDir(_bFlMnListId))
{
vFlMnHiliOff(FLMN_HILI_PLAY);
_wFlCurAdoIdx = 0xFFFF;
}
#ifdef SPTM_SUPPORT // 20050324, IS00001866, this will clear 'HD'CD's HD. Since RISC didn't support SPTM, remark it.
if (_bFlIpState == IP_STATE_PANEL_1)
{
_wStartX = FS_EQ_X;
_wStartY = 32;
vOsdClearPos(FL_INFO_WB, 200, 32);
}
#endif
vFlIpShowInfo(IP_INFO_BITRATE, 0, 0xFFFF);
#ifdef ISO_AUTO_PLAY
fgFlAutoPlayNext();
/*
if (_fgFlIsAutoPlay)
{
_wFlAtplyIdx++;
if (fgFlClLock(FL_CMDPATH_ATPLY_0))
{
bLoByte(wIdx) = bSharedInfo(FL_LIST_FIELD(_bFlRefListId) + 4);
bHiByte(wIdx) = bSharedInfo(FL_LIST_FIELD(_bFlRefListId) + 5);
if ((_wFlAtplyIdx >= wIdx) || (!fgFlCmdGetItems(_bFlRefListId, _wFlAtplyIdx)))
{
_fgFlIsAutoPlay = FALSE;
vFlClRls();
}
}
}
*/
#endif
break;
default:
// - error occurs
break;
}
return;
}
/**
* Handle IR_CMD_DONE.
*/
BOOL fgFlMnIrCmdDoneHdr(void) large
{
if (FL_ACK(_dwIrDoneParm) == FL_CMD_ASSERT)
{
// - "FS LIST" command done, get return command
BYTE bCmd;
bCmd = bSharedInfo(FL_CMD_BLK_SA);
switch (bCmd)
{
case FLCMD_CREATE:
vFlMnRetCreate();
break;
case FLCMD_SET:
vFlMnRetSet();
break;
case FLCMD_GET_ITEMS:
vFlMnRetGetItems();
break;
case FLCMD_CLICK_ITEM:
vFlMnRetClickItem();
break;
#ifdef DATA_DISC_SUPPORT_PLAY_LIST
case FLCMD_ADD_TO_PL:
vFlMnRetAddToPl();
break;
case FLCMD_RM_FROM_PL:
vFlMnRetRmFromPl();
break;
case FLCMD_CLEAN:
vFlMnRetRmAllFromPl();
break;
#endif
case FLCMD_QUERY_ITEM:
vFlMnRetQueryItem();
break;
default:
// - TODO: exception handling
break;
}
}
else
{
switch(FL_ACK(_dwIrDoneParm))
{
case SI_MP3_STT:
vFlMnChgMp3State(FL_PARM1(_dwIrDoneParm));
break;
case SI_DDISC_PB_MODULE:
break;
case SI_MP3_MOD:
vFlIpShowInfo(IP_INFO_PBC, 0, 0);
break;
// tmp solution
case SI_JPG_STT:
switch(FL_PARM1(_dwIrDoneParm))
{
case JPEGSTT_DEC_FSH:
#if 1//def JPG_INFO
//vShowJpegInfo();
//mark this line because playing mp3 after jpg,it will display resolution
//JPEGSTT_DEC_FSH timing has something strange,so CL Wang will check it.
#endif
break;
case JPEGSTT_DEC_ABT:
case JPEGSTT_DEC_ERR:
#if 1//def JPG_INFO
vOsdPosClear(OSD_POS_FS_INFO_BAR);
#endif
break;
}
}
}
// - always grab in this case
return TRUE;
}
/**
* Clear the working area barrowed from DRAM.
*/
static void vWorkAreaClear(void) large
{
BYTE bLen, i;
DWRD dwAddr;
bLen = bSharedInfo(SI_FS_WA_SZ);
bLoByte(wLoWord(dwAddr)) = bSharedInfo(SI_FS_WA_SA_B1);
bHiByte(wLoWord(dwAddr)) = bSharedInfo(SI_FS_WA_SA_B2);
bLoByte(wHiWord(dwAddr)) = bSharedInfo(SI_FS_WA_SA_B3);
bHiByte(wHiWord(dwAddr)) = bSharedInfo(SI_FS_WA_SA_B4);
WriteDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr), 0);
dwAddr++;
WriteDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr), 0);
dwAddr++;
WriteDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr), 1);
dwAddr++;
WriteDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr), '\\');
dwAddr++;
for (i=4; i < bLen-4; i++)
{
WriteDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr), 0);
}
return;
}
#ifdef FLMN_RET_PLAY_DIR
static void vWorkAreaMove(BOOL fgToFront) large
{
BYTE bLen, bChar, i;
DWRD dwAddr, dwSrcAddr, dwDesAddr;
bLoByte(wLoWord(dwAddr)) = bSharedInfo(SI_FS_WA_SA_B1);
bHiByte(wLoWord(dwAddr)) = bSharedInfo(SI_FS_WA_SA_B2);
bLoByte(wHiWord(dwAddr)) = bSharedInfo(SI_FS_WA_SA_B3);
bHiByte(wHiWord(dwAddr)) = bSharedInfo(SI_FS_WA_SA_B4);
if (fgToFront)
{
dwDesAddr = dwAddr;
dwSrcAddr = dwAddr + FLMN_MAX_WA_SIZE;
}
else
{
dwSrcAddr = dwAddr;
dwDesAddr = dwAddr + FLMN_MAX_WA_SIZE;
}
bChar = bReadDRAMTbl(bLoByte(wHiWord(dwSrcAddr)), wLoWord(dwSrcAddr));
WriteDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr), bChar);
dwSrcAddr ++;
dwDesAddr ++;
bChar = bReadDRAMTbl(bLoByte(wHiWord(dwSrcAddr)), wLoWord(dwSrcAddr));
WriteDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr), bChar);
dwSrcAddr ++;
dwDesAddr ++;
bLen = bReadDRAMTbl(bLoByte(wHiWord(dwSrcAddr)), wLoWord(dwSrcAddr));
WriteDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr), bLen);
dwSrcAddr ++;
dwDesAddr ++;
while (bLen)
{
bChar = bReadDRAMTbl(bLoByte(wHiWord(dwSrcAddr)), wLoWord(dwSrcAddr));
WriteDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr), bChar);
dwSrcAddr ++;
dwDesAddr ++;
bLen--;
}
}
#endif
/**
* Draw the name string of the current folder.
*/
static void vDrawFolderName(BOOL fgDraw) large
{
BYTE bLen, i;
DWRD dwAddr;
if (fgDraw)
{
bLoByte(wLoWord(dwAddr)) = bSharedInfo(SI_FS_WA_SA_B1);
bHiByte(wLoWord(dwAddr)) = bSharedInfo(SI_FS_WA_SA_B2);
bLoByte(wHiWord(dwAddr)) = bSharedInfo(SI_FS_WA_SA_B3);
bHiByte(wHiWord(dwAddr)) = bSharedInfo(SI_FS_WA_SA_B4);
dwAddr += 2;
bLen = bReadDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr));
_wStartX = FLMN_BTN_1_X + FLMN_MENU_BORDER + 20;
_wStartY = FLMN_BTN_1_Y + FLMN_MENU_BORDER + 2;
vPasteBmp(FL_MENU_WB, BMP_FOLDER);
_wStartY = FLMN_BTN_1_Y + FLMN_MENU_BORDER;
_wStartX += 50;
_wEndY = _wStartY + 30;
_wEndX = FLMN_BTN_1_X + FLMN_BTN_2_W - FLMN_MENU_BORDER * 2;
vRectangle(FL_MENU_WB, 0, 0, 1, 0);
//vSetFsCodePage(0);
vSetMsgCol4(FL_MENU_WB, 0, 0, 3, 2);
if (bLen > FLMN_FOLDER_LEN)
{
dwAddr += (bLen - FLMN_FOLDER_LEN);
bLen = FLMN_FOLDER_LEN;
}
vPasteMsgAddrXY(_wStartX, _wStartY, FL_MENU_WB, bLen, dwAddr+1);
//vSetFsCodePage(CODE_PAGE_MENU);
}
else
{
_wStartX = FLMN_BTN_1_X + FLMN_MENU_BORDER + 20;
_wStartY = FLMN_BTN_1_Y + FLMN_MENU_BORDER + 2;
// _wEndY = _wStartY + 30;
// _wEndX = FLMN_BTN_1_X + FLMN_BTN_2_W - FLMN_MENU_BORDER * 2;
vOsdClearPos(FL_MENU_WB, FSMENU_BASIC_WB_WIDTH, 30);
}
return;
}
/**
* Calculate the name string of the folder.
*/
static void vParseFolderName(BYTE bItem, BOOL fgMoveUp) large
{
BYTE bSrcLen, bDesLen, bTmp, i;
WORD wPos, wBsDir;
DWRD dwSrcAddr, dwDesAddr, dwAddr;
BYTE bDepth, bDirLvl;
if (fgMoveUp == TRUE)
{
bLoByte(wLoWord(dwSrcAddr)) = bSharedInfo(SI_FS_WA_SA_B1);
bHiByte(wLoWord(dwSrcAddr)) = bSharedInfo(SI_FS_WA_SA_B2);
bLoByte(wHiWord(dwSrcAddr)) = bSharedInfo(SI_FS_WA_SA_B3);
bHiByte(wHiWord(dwSrcAddr)) = bSharedInfo(SI_FS_WA_SA_B4);
bDepth = bReadDRAMTbl(bLoByte(wHiWord(dwSrcAddr)), wLoWord(dwSrcAddr));
bDepth--;
WriteDRAMTbl(bLoByte(wHiWord(dwSrcAddr)), wLoWord(dwSrcAddr), bDepth);
dwSrcAddr++;
bDirLvl = bReadDRAMTbl(bLoByte(wHiWord(dwSrcAddr)), wLoWord(dwSrcAddr));
if (bDirLvl == bDepth + 1)
{
bDirLvl--;
WriteDRAMTbl(bLoByte(wHiWord(dwSrcAddr)), wLoWord(dwSrcAddr), bDirLvl);
}
dwSrcAddr++;
dwDesAddr = dwSrcAddr;
bSrcLen = bReadDRAMTbl(bLoByte(wHiWord(dwSrcAddr)), wLoWord(dwSrcAddr));
dwSrcAddr += bSrcLen;
dwSrcAddr--;
bSrcLen--;
while ((bReadDRAMTbl(bLoByte(wHiWord(dwSrcAddr)), wLoWord(dwSrcAddr)) != '\\') && (bSrcLen > 1))
{
bSrcLen--;
dwSrcAddr--;
}
WriteDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr), bSrcLen);
}
else
{
wPos = FL_ITEM_FIELD(bItem);
bLoByte(wLoWord(dwDesAddr)) = bSharedInfo(SI_FS_WA_SA_B1);
bHiByte(wLoWord(dwDesAddr)) = bSharedInfo(SI_FS_WA_SA_B2);
bLoByte(wHiWord(dwDesAddr)) = bSharedInfo(SI_FS_WA_SA_B3);
bHiByte(wHiWord(dwDesAddr)) = bSharedInfo(SI_FS_WA_SA_B4);
bLoByte(wLoWord(dwSrcAddr)) = bSharedInfo(wPos);
bHiByte(wLoWord(dwSrcAddr)) = bSharedInfo(wPos + 1);
bLoByte(wHiWord(dwSrcAddr)) = bSharedInfo(wPos + 2);
bHiByte(wHiWord(dwSrcAddr)) = bSharedInfo(wPos + 3);
bDepth = bReadDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr));
bDepth++;
WriteDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr), bDepth);
dwDesAddr++;
bDirLvl = bReadDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr));
dwAddr = dwDesAddr;
dwDesAddr++;
bSrcLen = bSharedInfo(FL_ITEM_FIELD(bItem) + 4);
bDesLen = bReadDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr));
if (bSrcLen + 1 + bDesLen < FLMN_MAX_WA_SIZE - 2)
{
bDirLvl++;
WriteDRAMTbl(bLoByte(wHiWord(dwAddr)), wLoWord(dwAddr), bDirLvl);
WriteDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr), bSrcLen + 1 + bDesLen);
dwDesAddr += (bDesLen + 1);
i=0;
while (i < bSrcLen)
{
bTmp = bReadDRAMTbl(bLoByte(wHiWord(dwSrcAddr)), wLoWord(dwSrcAddr));
#ifdef FLMN_DONT_SHOW_NONPRINTABLE_CHAR
if ((bTmp < 0x20) || (bTmp > 0x7E))
{
bTmp = '_';
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -