📄 fllrc.c
字号:
#define __FLLRC_C_
#include "../general.h"
#include "../osdshow.h"
#include "flmenu.h"
#include "flspec.h"
#include "flcomm.h"
#include "flipshow.h"
#include "flconfig.h"
/* for module Tester */
//#include "../tst/tst.h"
#pragma NOAREGS
#ifdef MP3_LYRICS_V2_SUPPORT
//#define LRC_DEBUG
extern void DRS232LogB(BYTE bV1, BYTE bV2, BYTE bV3, BYTE bV4);
extern void DRS232LogS(char *pcStr);
extern WORD wFlMnGetListBaseDir(BYTE bListId) large;
#ifdef LRC_DEBUG
#define LRC_DBGLogB(b1, b2, b3, b4) DRS232LogB(b1, b2, b3, b4)
#define LRC_DBGLogW(wTemp) DRS232LogB(0, 0, bHiByte(wTemp), bLoByte(wTemp))
#define LRC_DBGLogDW(dwTemp) DRS232LogB(bHiByte(wHiWord(dwTemp)), bLoByte(wHiWord(dwTemp)), bHiByte(wLoWord(dwTemp)), bLoByte(wLoWord(dwTemp)))
#define LRC_DBGLogS(s) DRS232LogS(s)
#else
#define LRC_DBGLogB(b1, b2, b3, b4)
#define LRC_DBGLogW(wTemp)
#define LRC_DBGLogDW(dwTemp)
#define LRC_DBGLogS(s)
#endif
/**
* Macro defnitions
*/
extern void vI2CDelay2us(BYTE bValue) large;
// Stack Function
static void vCreatStack(void) large;
static BOOL fgStackEmpty(void) large;
static BOOL fgStackFull(void) large;
static BYTE bGetStackTop(void) large;
static BOOL fgPushStack(WORD wBaseDir, WORD wItemIdx) large;
static BOOL fgPopStack(WORD *pwBaseDir, WORD *pwItemIdx) large;
// "FS LIST" command return handler
static void vFlLrcRetCreate(void) large;
static void vFlLrcRetSet(void) large;
static void vFlLrcRetGetItems(void) large;
static void vFlLrcRetClickItem(void) large;
static void vFlLrcRetAddToPl(void) large;
static void vFlLrcRetRmFromPl(void) large;
static void vFlLrcRetRmAllFromPl(void) large;
static void vFlLrcRetQueryItem(void) large;
// full path display manipulation
static void vLrcWorkAreaClear(void) large;
static void vFlLrcPProcName(DWRD *pdwAddr, BYTE *pbLen) large;
static void vLrcParseFolderName(BYTE bItem, BYTE bDepth) large;
// UI
static void vLrcDrawFolderName(BYTE bDepth) large;
static void vFlLrcDrawItem(BYTE bItemIdx) large;
static void vFlLrcDrawPage(void) large;
static void vFlLrcClrPage(void) large;
static void vFlLrcDrawPLItem(BYTE bItemIdx) large;
static void vFlLrcDrawPlList(void) large;
static void vFlLrcClrPlList(void) large;
static BOOL fgFlLrcPlMark(void) large;
#ifdef MP3_LYRICS_PL_15_SONGS
static BOOL fgFlLrcPlRemove(void) large;
#endif
static BOOL fgFlLrcPlClear(void) large;
static BOOL fgFlLrcTimeShow(void) large;
static void vFlLrcRdListInfo(BYTE bId) large;
#if 0
static BOOL fgFlLrcChgListType(void) large;
#endif
static void vFlLrcChgMp3State(BYTE bStt) large;
static void vFlLrcSyncState(void) large;
static BOOL fgFlMp3LrcRedrawPlList(void) large;
static void vFlLrcHiliOnIdx(BYTE bItemIdx) large;
static void vFlLrcHiliOffIdx(BYTE bItemIdx) large;
static void vFlMp3LrcDrawInitPage(void) large;
static void vFlLrcDrawMp3Intro(void) large;
// Utilities
static BOOL fgFlLrcIsCurrPlayItem(BYTE bIdx) large;
static void vFlLrcHiliItem(BYTE bItemIdx, BOOL fgOn) large;
static BOOL fgFlLrcLeavItem(BYTE bItemIdx) large;
static BOOL fgFlLrcEntItem(BYTE bItemIdx) large;
static BOOL fgFlLrcLeavDir(void) large;
static BOOL fgFlLrcEntDir(BYTE bItemIdx, BOOL fgMoveUp) large;
// IR Key Handlers
static BOOL fgFlMp3LrcKeyFilter(BYTE bIsMp3LrcMnOn, BYTE bIrKey) large;
static BOOL fgFlLrcIrCmdDoneHdr(void) large;
static BOOL fgFlLrcOnIrMenu(void) large;
static BOOL fgFlLrcOnIrPlay(void) large;
static BOOL fgFlLrcOnIrStop(void) large;
static BOOL fgFlLrcOnIrPause(void) large;
static BOOL fgFlLrcOnIrUp(void) large;
static BOOL fgFlLrcOnIrDown(void) large;
static BOOL fgFlLrcOnIrLeft(void) large;
static BOOL fgFlLrcOnIrRight(void) large;
static BOOL fgFlLrcOnIrNext(void) large;
static BOOL fgFlLrcOnIrPrev(void) large;
////////////////////////////////////////////////////////////////////////////////
//
// Event Handler Map
//
static code void (*_prFlCmdProc[]) (void) =
{
0,
vFlLrcRetCreate,
vFlLrcRetSet,
vFlLrcRetGetItems,
vFlLrcRetClickItem,
vFlLrcRetAddToPl,
vFlLrcRetRmFromPl,
vFlLrcRetRmAllFromPl,
vFlLrcRetQueryItem
};
static code sFlIrHandler _rFlMp3LrcIrHandler[] =
{
{ IR_ROOT_MENU, fgFlLrcOnIrMenu },
{ IR_PLAY_ENTER, fgFlLrcOnIrPlay },
{ IR_PLAY, fgFlLrcOnIrPlay },
{ IR_ENTER, fgFlLrcOnIrPlay },
{ IR_PLAY_PAUSE, fgFlLrcOnIrPlay },
{ IR_STOP, fgFlLrcOnIrStop },
{ IR_CMD_DONE, fgFlLrcIrCmdDoneHdr },
{ IR_PAUSE, fgFlLrcOnIrPause },
{ IR_UP, fgFlLrcOnIrUp },
{ IR_DOWN, fgFlLrcOnIrDown },
{ IR_LEFT, fgFlLrcOnIrLeft },
{ IR_RIGHT, fgFlLrcOnIrRight },
{ IR_NEXT, fgFlLrcOnIrNext },
{ IR_PREV, fgFlLrcOnIrPrev },
{ IR_PLAYLIST_CLEAN, fgFlLrcPlClear },
{ IR_DISPLAY, fgFlLrcTimeShow },
#ifdef MP3_LYRICS_PL_15_SONGS
{ IR_ANGLE, fgFlLrcPlRemove },
#endif
};
// Global Variables
typedef struct
{
BYTE fgIsMp3LrcMnOn:1;
BYTE fgFlRedrawPlPlay:1; // Need Play after Redraw playlist
BYTE fgIsTimeShowOn:1;
#ifdef MP3_LYRICS_PL_15_SONGS
BYTE fgIsInPlayList:1;
BYTE bReserve:4;
#else
BYTE bReserve:5;
#endif
}S_FL_MP3_LRC_FLAG;
xdata S_FL_MP3_LRC_FLAG _sFlMp3LrcFlag;
#define _fgIsMp3LrcMnOn _sFlMp3LrcFlag.fgIsMp3LrcMnOn
#define _fgFlRedrawPlPlay _sFlMp3LrcFlag.fgFlRedrawPlPlay
#define _fgIsTimeShowOn _sFlMp3LrcFlag.fgIsTimeShowOn
xdata BYTE _bFlMnPLNs;
#ifdef MP3_LYRICS_PL_15_SONGS
#define _fgIsInPlayList _sFlMp3LrcFlag.fgIsInPlayList
xdata BYTE _bFlMnMemIdx;
#endif
/* The Follow Stack is used for store the folder index.*/
#define LRC_FOLDER_STACK_MAX 4
typedef struct
{
WORD wStackBaseDir[LRC_FOLDER_STACK_MAX];
WORD wStackItemIdx[LRC_FOLDER_STACK_MAX];
BYTE bStackTop;
}S_LRC_STACK;
xdata S_LRC_STACK _sLrcStack;
// Added by Hiker Hauk, September 28, 2007, for CR(PL00108440)
static code BYTE pbFastTbl[] = { 0, 2, 4, 8, 16, 32 };
static code BYTE pbSlowTbl[] = { 0, 2, 4, 8, 16, 32 };
BOOL fgFllrcMenuOn(void) large
{
if(bSharedInfo(SI_MP3_KARA_DISC_TYPE) == SV_ID_MATCH)
{
return _fgIsMp3LrcMnOn;
}
else
{
return FALSE;
}
}
BOOL fgFllrcTimeShowOn(void) large
{
if(bSharedInfo(SI_MP3_KARA_DISC_TYPE) == SV_ID_MATCH)
{
return _fgIsTimeShowOn;
}
else
{
return FALSE;
}
}
BYTE bFllrcPlNs(void) large
{
if(bSharedInfo(SI_MP3_KARA_DISC_TYPE) == SV_ID_MATCH)
{
return _bFlMnPLNs;
}
else
{
return 0;
}
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
static void vCreatStack(void) large
{
_sLrcStack.bStackTop = 0;
}
static BOOL fgStackEmpty(void) large
{
return (_sLrcStack.bStackTop <= 0);
}
static BOOL fgStackFull(void) large
{
return (_sLrcStack.bStackTop >= LRC_FOLDER_STACK_MAX);
}
static BYTE bGetStackTop(void) large
{
return _sLrcStack.bStackTop;
}
static BOOL fgPushStack(WORD wBaseDir, WORD wItemIdx) large
{
if (fgStackFull())
{
return FALSE;
}
_sLrcStack.wStackBaseDir[_sLrcStack.bStackTop] = wBaseDir;
_sLrcStack.wStackItemIdx[_sLrcStack.bStackTop] = wItemIdx;
_sLrcStack.bStackTop++;
return TRUE;
}
static BOOL fgPopStack(WORD *pwBaseDir, WORD *pwItemIdx) large
{
if (fgStackEmpty())
{
return FALSE;
}
_sLrcStack.bStackTop--;
*pwBaseDir = _sLrcStack.wStackBaseDir[_sLrcStack.bStackTop];
*pwItemIdx = _sLrcStack.wStackItemIdx[_sLrcStack.bStackTop];
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////
//
// Fslist Command Handler
//
/**
* Check the return value of command "FLCMD_CREATE".
*/
static void vFlLrcRetCreate(void) large
{
WORD wBlkPtr;
BYTE bRCode;
wBlkPtr = FL_CMD_BLK_SA + 1; // - shift to the parameter block
bRCode = bSharedInfo(wBlkPtr++);
// - mark the command is done
vFlCmdDone();
if (bRCode == FLRET_S_OK)
{
// - read in the newly created list info
if (fgFlClIsLock())
{
switch(bFlClPath())
{
case FL_CMDPATH_INIT_0:
_bFlMnListId = bSharedInfo(wBlkPtr ++);
vFlLrcRdListInfo(_bFlMnListId);
vFlClNext();
#if 1
vFlCmdCreate(FLPARM_LIST_PLAYLIST, 0, 0x0,FLPARM_FF_MP3,FLPARM_SO_GDIR);
break;
case FL_CMDPATH_INIT_1:
_bFlPlListId = bSharedInfo(wBlkPtr ++);
#endif
if (_wFlMnListLen)
{
if (_wFlCurAdoIdx == 0xFFFF)
{
_wFlFirstIdx = 0;
fgFlCmdGetItems(_bFlMnListId, _wFlFirstIdx);
}
else
{
_bFlMnCurItemIdx = _wFlCurAdoIdx % FLMP3LRCMN_ITEM_N;
_wFlFirstIdx = _wFlCurAdoIdx - _bFlMnCurItemIdx;
fgFlCmdGetItems(_bFlMnListId, _wFlFirstIdx);
}
}
else
{
}
break;
default:
break;
}
}
}
else
{
// - error occurs
_bFlMnListId = 0xFF;
_bFlRefListId = 0xFF;
}
return;
}
/**
* Check the return value of command "FLCMD_SET".
*/
static void vFlLrcRetSet(void) large
{
WORD wBlkPtr;
BYTE bRCode;
wBlkPtr = FL_CMD_BLK_SA + 1; // - shift to the parameter block
bRCode = bSharedInfo(wBlkPtr++);
// - mark the command is done
vFlCmdDone();
if (bRCode == FLRET_S_OK)
{
// - successful
vFlLrcRdListInfo(_bFlMnListId);
if (fgFlClIsLock())
{
switch(bFlClPath())
{
case FL_CMDPATH_RETURN:
_bFlMnCurItemIdx = _wFlCurAdoIdx % FLMP3LRCMN_ITEM_N;
_wFlFirstIdx = _wFlCurAdoIdx - _bFlMnCurItemIdx;
fgFlCmdGetItems(_bFlMnListId, _wFlFirstIdx);
break;
case FL_CMDPATH_CHG_DIR:
case FL_CMDPATH_DIR_UP_0:
case FL_CMDPATH_DIR_UP_1:
_bFlMnCurItemIdx = 0x0;
_wFlFirstIdx = 0;
fgFlCmdGetItems(_bFlMnListId, _wFlFirstIdx);
break;
case FL_CMDPATH_DIR_UP_2:
_bFlMnCurItemIdx = _wCurrItem % FLMP3LRCMN_ITEM_N;
_wFlFirstIdx = _wCurrItem - _bFlMnCurItemIdx;
fgFlCmdGetItems(_bFlMnListId, _wFlFirstIdx);
break;
case FL_CMDPATH_CHG_LIST:
_wFlFirstIdx = 0;
fgFlCmdGetItems(_bFlMnListId, _wFlFirstIdx);
break;
case FL_CMDPATH_REDRAW_PLAYLIST:
fgFlCmdGetItems(_bFlPlListId,0);
break;
case FL_CMDPATH_ATPLY_1:
_wFlCurAdoIdx += wFlGetSubFldrNs(_bFlMnListId);
_wFlFirstIdx = _wFlCurAdoIdx - (_wFlCurAdoIdx % FLMP3LRCMN_ITEM_N);
fgFlCmdGetItems(_bFlMnListId, _wFlFirstIdx);
break;
default:
break;
}
}
else
{
_wFlFirstIdx = 0;
fgFlCmdGetItems(_bFlMnListId, _wFlFirstIdx);
_bFlMnCurItemIdx = 0x0;
}
}
else
{
if(bFlClPath() == FL_CMDPATH_DIR_UP_2) //panwei modify
{
vFlLrcDrawPage();
fgFlLrcEntItem(_bFlMnCurItemIdx);
fgPushStack(_wBaseDir, _wCurrItem);
vFlClRls();
}
// - error occurs
}
return;
}
/**
* Check the return value of command "FLCMD_GET_ITEMS".
*/
#pragma disable // Added by Hiker Hauk on 20071018
static void vFlLrcRetGetItems(void) large
{
WORD wBlkPtr;
WORD wNum;
BYTE bType;
BYTE bRCode;
wBlkPtr = FL_CMD_BLK_SA + 1; // - shift to the parameter block
bRCode = bSharedInfo(wBlkPtr ++);
if (bRCode == FLRET_S_OK)
{
// - successful, update the item number, redraw the page
_bFlMnItemNs = bSharedInfo(wBlkPtr ++);
vFlCmdDone();
switch(bFlClPath())
{
case FL_CMDPATH_INIT_1:
vFlSetCmdTarget(FL_CMD_TARGET_MENU);
break;
case FL_CMDPATH_REDRAW_PLAYLIST:
LRC_DBGLogS("vFlLrcRetGetItems: REDRAW_PLAYLIST");
if (fgFllrcMenuOn())
{
LRC_DBGLogS("Test Point 1");
vFlLrcSyncState();
vOsdSetSt(OSD_ST_BURST);
vI2CDelay2us(250);
vI2CDelay2us(250);
vFlLrcDrawPlList();
vOsdSetSt(OSD_ST_NML);
while (bSharedInfo(SI_CMD_CNT));
vI2CDelay2us(250);
vI2CDelay2us(250);
}
#ifdef MP3_LYRICS_PL_15_SONGS
if (!_fgIsInPlayList)
{
LRC_DBGLogS("Test Point 2");
vFlClNext();
LRC_DBGLogB(_bFlMnListId, 0, (_wFlFirstIdx & 0xFF00) >> 8, (_wFlFirstIdx & 0xFF));
fgFlCmdGetItems(_bFlMnListId, _wFlFirstIdx);
}
else
{
LRC_DBGLogS("Test Point 3");
bLoByte(_wFlMnListLen) = bSharedInfo(FL_LIST_FIELD(_bFlPlListId) + 4);
bHiByte(_wFlMnListLen) = bSharedInfo(FL_LIST_FIELD(_bFlPlListId) + 5);
if (_fgFlRedrawPlPlay)
{
vFlCmdClickItem(_bFlPlListId, 0);
}
vFlClRls();
}
#else
fgFlCmdGetItems(_bFlMnListId, _wFlFirstIdx);
#endif
break;
case FL_CMDPATH_REDRAW_RETURN:
vFlLrcSyncState();
if(_fgFlRedrawPlPlay && (bSharedInfo(SI_MP3_MOD) == SV_STOP) && (bFllrcPlNs() > 0))
{
LRC_DBGLogS("REDRAW_RETURN 1");
vFlCmdClickItem(_bFlPlListId, 0);
// Added by Hiker Hauk on 20071018 for CR(PL00108764)
vFlClRls(); // Temp Solution?
// Hiker Hauk for CR(PL00108764) : Added End
}
else
{
LRC_DBGLogS("REDRAW_RETURN 2");
vFlClRls();
}
break;
#ifdef MP3_LYRICS_PL_15_SONGS
case FL_CMDPATH_RETURN_MENU:
bLoByte(_wFlMnListLen) = bSharedInfo(FL_LIST_FIELD(_bFlMnListId) + 4);
bHiByte(_wFlMnListLen) = bSharedInfo(FL_LIST_FIELD(_bFlMnListId) + 5);
vFlLrcHiliItem(_bFlMnCurItemIdx, TRUE);
vFlClRls();
break;
#endif
case FL_CMDPATH_CHG_LIST:
case FL_CMDPATH_CHG_DIR:
case FL_CMDPATH_REDRAW:
case FL_CMDPATH_DIR_UP_1:
case FL_CMDPATH_DIR_UP_2:
case FL_CMDPATH_UP:
case FL_CMDPATH_DOWN:
case FL_CMDPATH_RETURN:
vFlLrcSyncState();
vFlLrcDrawPage();
fgFlLrcEntItem(_bFlMnCurItemIdx);
vFlClRls();
break;
case FL_CMDPATH_SEL_2:
vFlLrcDrawPage();
fgFlLrcEntItem(_bFlMnCurItemIdx);
vFlClRls();
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -