⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fllrc.c

📁 手机8032的完整代码。吐血推荐。小做改动就可以生产。
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -