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

📄 flmenu.c

📁 手机8032的完整代码。吐血推荐。小做改动就可以生产。
💻 C
📖 第 1 页 / 共 5 页
字号:
}
#endif

/**
 * Return the icon index of the given type.
 */
BYTE bFlMnGetIconIdx(BYTE bFType) large
{
  switch (bFType)
  {
  case FTYPE_MP3:
  case FTYPE_MP2:
  case FTYPE_MP1:
    return BMP_MP3;

  case FTYPE_JPG:
    return BMP_PIC;

  case FTYPE_WMA:
    return BMP_WMA;

  case FTYPE_DIR:
    return BMP_FOLDER;

  case FTYPE_MPG:
  case FTYPE_DAT:
  case FTYPE_VOB:
  case FTYPE_AVI:
    return BMP_MPG;

  case FTYPE_CDA:
  case FTYPE_UNKNOWN:
  default:
    return BMP_INVALID;
  }
}

static BOOL fgFlMnIsCurrPlayItem(BYTE bIdx) large
{
  if ((_wFlCurAdoDir == wFlMnGetListBaseDir(_bFlMnListId)) &&
      (_wFlCurAdoIdx == wFlGetItemIdx(bIdx)) &&
      // PL00003187, because disclist and playlist both has same dir index(0xFFFF), need to check if same list type
      (_bFlPlayListType == bSharedInfo(FL_LIST_FIELD(_bFlMnListId))))
    return TRUE;

  return FALSE;
}

static void vFlMnHiliOn(BYTE bItemIdx, BYTE bHiliIdx, BYTE bColor1, BYTE bColor2) large
{
  _wStartX = _prFlMnItemTbl[bItemIdx].wLeft + FL_ICON_W;
  _wEndX = _prFlMnItemTbl[bItemIdx].wRight;
  _wStartY = _prFlMnItemTbl[bItemIdx].wTop;
  _wEndY = _prFlMnItemTbl[bItemIdx].wBottom;

  switch (bHiliIdx)
  {
    case FLMN_HILI_SEL:
//      if (_bFlMnHiliPos1 != 0x0F)
//        return;
      _bFlMnHiliClrSrc1 = bColor1;
      _bFlMnHiliClrDes1 = bColor2;
      _bFlMnHiliPos1 = bItemIdx;
      break;
    case FLMN_HILI_PLAY:
//      if (_bFlMnHiliPos2 != 0x0F)
//        return;
      _bFlMnHiliClrSrc2 = bColor1;
      _bFlMnHiliClrDes2 = bColor2;
      _bFlMnHiliPos2 = bItemIdx;
      break;
  }
#ifdef CDG_SUPPORT
  // 20050527, if CDG changed track, don't show hilight again
  if (bSharedInfo(SI_CDG_DISC) == SV_ON && bSharedInfo(SI_PBC_STATE) != SV_STOP)
    return ;
#endif

  vChgColRep(FL_MENU_WB, bColor1, bColor2);
}

static void vFlMnHiliOff(BYTE bHiliIdx) large
{
  switch (bHiliIdx)
  {
    case FLMN_HILI_SEL:
      if (_bFlMnHiliPos1 == 0x0F)
        return;

      _wStartX = _prFlMnItemTbl[_bFlMnHiliPos1].wLeft + FL_ICON_W;
      _wEndX = _prFlMnItemTbl[_bFlMnHiliPos1].wRight;
      _wStartY = _prFlMnItemTbl[_bFlMnHiliPos1].wTop;
      _wEndY = _prFlMnItemTbl[_bFlMnHiliPos1].wBottom;
      //vChgColRep(FL_MENU_WB, _bFlMnHiliClrDes1, _bFlMnHiliClrSrc1);
      vChgColRep(FL_MENU_WB, _bFlMnHiliClrDes1, FLMN_CLR_BG);

      _bFlMnHiliClrSrc1 = 0x0F;
      _bFlMnHiliClrDes1 = 0x0F;
      _bFlMnHiliPos1 = 0x0F;
      break;
    case FLMN_HILI_PLAY:
      if (_bFlMnHiliPos2 == 0x0F)
        return;

      _wStartX = _prFlMnItemTbl[_bFlMnHiliPos2].wLeft + FL_ICON_W;
      _wEndX = _prFlMnItemTbl[_bFlMnHiliPos2].wRight;
      _wStartY = _prFlMnItemTbl[_bFlMnHiliPos2].wTop;
      _wEndY = _prFlMnItemTbl[_bFlMnHiliPos2].wBottom;
      //vChgColRep(FL_MENU_WB, _bFlMnHiliClrDes2, _bFlMnHiliClrSrc2);
      vChgColRep(FL_MENU_WB, _bFlMnHiliClrDes2, FLMN_CLR_BG);

      _bFlMnHiliClrSrc2 = 0x0F;
      _bFlMnHiliClrDes2 = 0x0F;
      _bFlMnHiliPos2 = 0x0F;
      break;
  }
}

/**
 * The turn on/off the given item.
 *
 * DES: Use change color to implement this function.
 */
static void vFlMnHiliItem(BYTE bItemIdx, BOOL fgOn) large
{
  WORD wYOfst, wXOfst;
  BOOL fgIsCurrPlay;

  if ((bItemIdx >= _bFlMnItemNs) || (bItemIdx >= FLMN_PAGE_SZ))
    return;

  _wStartX = _prFlMnItemTbl[bItemIdx].wLeft + FL_ICON_W;
  _wEndX = _prFlMnItemTbl[bItemIdx].wRight;
  _wStartY = _prFlMnItemTbl[bItemIdx].wTop;
  _wEndY = _prFlMnItemTbl[bItemIdx].wBottom;

  fgIsCurrPlay = fgFlMnIsCurrPlayItem(bItemIdx);

  if (fgOn)
  {
#ifdef CDG_SUPPORT
    // 20050505, PL00000334, if CD-G is playing, don't display hilight
    if((bSharedInfo(SI_CDG_DISC) == SV_ON) && (bSharedInfo(SI_PBC_STATE) != SV_STOP) && (bSharedInfo(SI_PBC_STATE) != SV_PBC_INIT))
      return ;
#endif
    if (fgIsCurrPlay)
    {
      //vFlMnHiliOff(FLMN_HILI_PLAY);
      vFlMnHiliOff(FLMN_HILI_PLAY);
      vFlMnHiliOn(bItemIdx, FLMN_HILI_SEL, FLMN_CLR_BG, FLMN_CLR_SEL);
      //vFlMnHiliOn(bItemIdx, FLMN_HILI_PLAY, FLMN_CLR_BG, FLMN_CLR_PLAY);
    }
    else
    {
      vFlMnHiliOn(bItemIdx, FLMN_HILI_SEL, FLMN_CLR_BG, FLMN_CLR_SEL);
    }
  }
  else
  {
    if (fgIsCurrPlay)
    {
      vFlMnHiliOff(FLMN_HILI_PLAY);//for VBR issue
      vFlMnHiliOn(bItemIdx, FLMN_HILI_PLAY, FLMN_CLR_SEL, FLMN_CLR_PLAY);
    }
    else
    {
      vFlMnHiliOff(FLMN_HILI_SEL);
    }
  }

  return;
}

/**
 * Perform the operation to the given item when the hover cursor leave it.
 */
static BOOL fgFlMnLeavItem(BYTE bItemIdx) large
{
  if ((bItemIdx >= _bFlMnItemNs) || (bItemIdx >= FLMN_PAGE_SZ))
    return FALSE;

  vFlMnHiliItem(bItemIdx, FALSE);

#ifdef ENABLE_ID3
  if ((_bFlMnItemType == FTYPE_AUDIO) && fgFlMnIsCurrPlayItem(bItemIdx))
  {
    _wStartX = (WORD) FLMN_PREVIEW_X - FSMENU_BASIC_WB_LEFT;
    _wStartY = (WORD) FLMN_PREVIEW_Y - FSMENU_BASIC_WB_TOP + 15;
    vOsdClearPos(FL_MENU_WB, 200, 180);
  }
#endif

#ifdef SHOW_FS_SLIDER
  vMoveSlider(wFlGetItemIdx(bItemIdx), _wFlMnListLen, FALSE);
#endif

#ifdef JPG_PREVIEW_SUPPORT
  // - terminate the JPEG preview timing
  _bPreview = PREVIEW_STATE_IDLE;
#endif

  return TRUE;
}

/**
 * Perform the operation to the given item when the hover cursor enter it.
 */
static BOOL fgFlMnEntItem(BYTE bItemIdx) large
{
  WORD  wNum;

  if ((bItemIdx >= _bFlMnItemNs) || (bItemIdx >= FLMN_PAGE_SZ))
    return FALSE;

  wNum = wFlGetItemIdx(bItemIdx);
  vFlMnHiliItem(bItemIdx, TRUE);
#ifdef SHOW_FS_SLIDER
  vMoveSlider(wNum, _wFlMnListLen, TRUE);
#endif

  _bFlMnItemType = bFlGetItemType(bItemIdx);

  vFlIpShowInfo(IP_INFO_FILE_INDEX, 0, wNum);

#ifdef JPG_PREVIEW_SUPPORT
  // - restart the JPEG preview timing if we enter a JPEG file
  if (_bFlMnItemType == FTYPE_STILL)
  {
    _bPreview = PREVIEW_STATE_START;
  }
#endif

  // - move current item to the given one
  _bFlMnCurItemIdx = bItemIdx;

#ifdef ENABLE_ID3
  if ((_bFlMnItemType == FTYPE_AUDIO) && fgFlMnIsCurrPlayItem(_bFlMnCurItemIdx))
  {
    vFlGetId3Info();
  }
#endif

  vFlUpdateVfd(FALSE);

  return TRUE;
}

/**
 * Read in the list info from proper shared info group.
 */
void vFlMnRdListInfo(BYTE bId) large
{
  BYTE bType, bIncItemType;
  WORD wBsDir, wPos;

  if (bId >= FL_MAX_LIST_NS)
    return;

  wPos = FL_LIST_FIELD(bId);
  bType = bSharedInfo(wPos);
  bIncItemType = bSharedInfo(wPos + 1);
  bLoByte(wBsDir) = bSharedInfo(wPos + 2);
  bHiByte(wBsDir) = bSharedInfo(wPos + 3);

  bLoByte(_wFlMnListLen) = bSharedInfo(wPos + 4);
  bHiByte(_wFlMnListLen) = bSharedInfo(wPos + 5);

  return;
}

/**
 * Leave the current dir to its parent.
 */

// 20040809 by RC. Roll back to version 36 due to issue CR00000187
static BOOL fgFlMnLeavDir(void) large
{
  WORD wPos, wBsDir;

  // - 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) &&
        // PL00003187, because disclist and playlist both has same dir index(0xFFFF), need to check if same list type
        (_bFlPlayListType == bSharedInfo(FL_LIST_FIELD(_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);
        }
      }

        // PL00003187, because disclist and playlist both has same dir index(0xFFFF), need to check if same list type
      if (_bFlPlayListType == bSharedInfo(FL_LIST_FIELD(_bFlMnListId)))
        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:
      vFlMnR

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -