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

📄 flmenu.c

📁 MTK 1389E SOURCE CODE
💻 C
📖 第 1 页 / 共 5 页
字号:
  // - 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 + -