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

📄 flmenu.c

📁 MTK1389 SOURCE CODE
💻 C
📖 第 1 页 / 共 5 页
字号:
  }
*/
  
  // - 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);

  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;
      }
      if (_bFlIpState == IP_STATE_PANEL_1)
      {
        _wStartX = FS_EQ_X;
        _wStartY = 32;
        vOsdClearPos(FL_INFO_WB, 200, 32); 
      }

#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 > 30)
    {
      dwAddr += (bLen - 30);
      bLen = 30;
    }
    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 = '_';
        }
  #endif
        WriteDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr), bTmp);
        dwSrcAddr++;
        dwDesAddr++;
        i++;
      }
      WriteDRAMTbl(bLoByte(wHiWord(dwDesAddr)), wLoWord(dwDesAddr), '\\');
    }
  }

  return;
}

////////////////////////////////////////////////////////////////////////////////
// Info Panel

static void vFlMnDrawInfoPanel(BYTE bPanel) large
{
  switch(bPanel)
  {
    case IP_STATE_PANEL_1:
      vFlIpShowInfo(IP_INFO_EQ, 0, 0);
      vFlIpClearInfoArea(IP_INFO_PANEL_2);
      vFlIpShowInfo(IP_INFO_VOLUME, bAdspCurrVol(), 
                    (fgIsMute() ? FLIP_VOLUME_MUTE_ON : FLIP_VOLUME_REDRAW));
      vFlIpShowInfo(IP_INFO_PBC, 0, 0);
      vFlIpShowInfo(IP_INFO_USR_AUX_CTRL, bSharedInfo(SI_USR_AUX_CTRL), 0);
      break;
    case IP_STATE_PANEL_2:
    #ifdef SPTM_SUPPORT
      vHideEqBar();
    #endif

      vFlIpClearInfoArea(IP_INFO_PANEL_1);
      vFlIpShowInfo(IP_INFO_RPT_TYPE, _bFlPbMode, 0);
      vFlIpShowInfo(IP_INFO_LIST_TYPE, bSharedInfo(FL_LIST_FIELD(_bFlMnListId)), 0);
//      vFlIpShowInfo(IP_INFO_KEY_SHIFT, 0, 0);
//      vFlIpShowInfo(IP_INFO_KEY_SHIFT, 0, 0);
    #ifdef PLAYER_SURROUND
      vFlIpShowInfo(IP_INFO_REVERB, bEepromReadByte(REVERB_MD_POS), 0);
    #endif
      
      break;
  }
  if (bSharedInfo(SI_MP3_STT) == MP3STT_PB_STRT)
  {
    // - display run-time info
    vFlIpShowInfo(IP_INFO_PLAYTIME, bSharedInfo(SI_TIME_MM), bSharedInfo(SI_TIME_SS));
    vFlIpShowInfo(IP_INFO_TOTALTIME, bSharedInfo(SI_MP3_TOTAL_TIME_MM), 
                                     bSharedInfo(SI_MP3_TOTAL_TIME_SS));
    vFlIpShowInfo(IP_INFO_BITRATE, 0, 
                  bSharedInfo(SI_MP3_BITRATE_LO) + bSharedInfo(SI_MP3_BITRATE_HI) * 256);
    //vFlIpShowInfo(IP_INFO_EQ, 0, 0);      
  }
  else
  {
    // - clear the run-time info
    vFlIpShowInfo(IP_INFO_PLAYTIME, 0, 0);
    vFlIpShowInfo(IP_INFO_TOTALTIME, 0, 0);
    vFlIpShowInfo(IP_INFO_BITRATE, 0, 0);
    //#ifdef SPTM_SUPPORT
    //  vHideEqBar();
    //#endif
  }
  vFlIpShowInfo(IP_INFO_DISC_TYPE, 0, 0); 
}

static BOOL fgIsParentDir(void) large
{
#if 1
  BYTE  bLen, bChar;
  WORD  wIdx;
  DWRD  dwAddr;
   
  bLen = bSharedInfo(FL_ITEM_FIELD(_bFlMnCurItemIdx) + 4);

⌨️ 快捷键说明

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