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

📄 num_proc.c

📁 是MTK公司新出来的DVD方案
💻 C
字号:
/***************     MTK CONFIDENTIAL & COPYRIGHTED    ****************/
/***************                                       ****************/
/***************  $Modtime:: 04/05/03 2:57p    $       ****************/
/***************  $Revision:: 2                $       ****************/
/***************                                       ****************/
/*************** Description : common routines for     ****************/
/***************               number key processing   ****************/
/***************                                       ****************/
/***************     Company : MediaTek Inc.           ****************/
/***************  Programmer :                         ****************/
/**********************************************************************/

#define _NUM_PROC_C_

#pragma NOAREGS
#include "general.h"

/************************************************************************
     Function : WORD wWRDToBCD(WORD wVal)
  Description : convert HEX WORD to 2 BCD
    Parameter : wVal - HEX number
    Return    : BCD number 0 and 1
************************************************************************/
WORD wWRDToBCD(WORD wVal) large
{
  WORD wBcd = 0;

  if (wVal > 9999)
  {
    wVal = 9999;
  }

  while (wVal >= 100)
  {
    wBcd++;
    wVal -= 100;
  }

  /* note this method is only valid for little endian */
  wVal = (WORD)bHEXToBCD((BYTE)wVal);
  wBcd = 256 * (WORD)bHEXToBCD((BYTE)wBcd) + wVal;

  return (wBcd);
}

// *********************************************************************
// Convert Digit to real number
// *********************************************************************
static code const WORD pwDig2Hex[5] = { 1, 10, 100, 1000, 10000 };

WORD wDigToNum(BYTE bCnt, BYTE *pbDig) large
{
  BYTE bIdx;
  WORD wNum = 0;
  
  for (bIdx = 0; bIdx < bCnt; bIdx++)
  {
    wNum += pbDig[bIdx] * pwDig2Hex[bCnt - bIdx - 1];
  }

  return (wNum);
}

// *********************************************************************
// General number input process function
// *********************************************************************
void vNumInInitState(BYTE bType, BYTE bCnt) large
{
  _rNumInStateCtx.rState.bInputType = bType;
  _rNumInStateCtx.rState.bTotalDigNum = bCnt;

  for (bCnt = 0; bCnt < 5; bCnt++)
  {
    _rNumInStateCtx.bDig[bCnt] = 0;
  }

  _rNumInStateCtx.wNum = 0;
  _rNumInStateCtx.rState.bDigNum = 0;
  _rNumInStateCtx.rState.fgComplete = FALSE;
  _rNumInStateCtx.rState.fgCancel = FALSE;
}

// *********************************************************************
// 
// *********************************************************************
BOOL fgNumInState1(void) large
{
  _rNumInStateCtx.rState.fgComplete = FALSE;

  if (_bIRKey == IR_CLEAR)
  {
    _rNumInStateCtx.rState.bDigNum = 0;
    _rNumInStateCtx.wNum = 0;
  }
  else if (_bIRKey > IR_ADD10 && _bIRKey != IR_ADD5)  // megaa ADD5
  {
    return (FALSE);
  }
#ifndef NO_ADD10_KEY
  else if (_bIRKey == IR_ADD10)
  {
    if (_rNumInStateCtx.rState.bInputType == NUM_IN_TYPE_4)
    {
      if ((_rNumInStateCtx.wNum + 10) <= 999)
      {
        _rNumInStateCtx.wNum += 10;
      }
    }
    else
    {
      if ((_rNumInStateCtx.wNum + 10) <= 99)
      {
        _rNumInStateCtx.wNum += 10;
      }
    }

    if (_rNumInStateCtx.rState.bDigNum == 0)
    {
      _rNumInStateCtx.rState.bDigNum = 1;
    }
  }
#endif
  // megaa ADD5 begin
#ifndef NO_ADD5_KEY
  else if (_bIRKey == IR_ADD5)
  {
    if (_rNumInStateCtx.rState.bInputType == NUM_IN_TYPE_4)
    {
      if ((_rNumInStateCtx.wNum + 5) <= 999)
      {
        _rNumInStateCtx.wNum += 5;
      }
    }
    else
    {
      if ((_rNumInStateCtx.wNum + 5) <= 99)
      {
        _rNumInStateCtx.wNum += 5;
      }
    }

    if (_rNumInStateCtx.rState.bDigNum == 0/* && _rNumInStateCtx.wNum >= 10*/)  // Is this right???!!!
    {
      _rNumInStateCtx.rState.bDigNum = 1;
    }
  }
#endif
  // megaa ADD5 end
  else /* if (_bIRKey >= IR_NUM0) */
  {
#ifdef USE_NUM0_AS_NUM10
    if ((_rNumInStateCtx.wNum == 0) && (_bIRKey == IR_NUM0))
    {
      _rNumInStateCtx.wNum = 10;
    }
    else
#endif
    {
      _rNumInStateCtx.wNum += _bIRKey;
    }

    if (_rNumInStateCtx.wNum > 0)
    {
      _rNumInStateCtx.rState.bDigNum = 2;
      _rNumInStateCtx.rState.fgComplete = TRUE;
    }
  }

  return (TRUE);
}

// *********************************************************************
// 
// *********************************************************************
BOOL fgNumInState2(void) large
{
  BYTE bDigNum = _rNumInStateCtx.rState.bDigNum;

  if (_bIRKey <= IR_ADD10)
  {
#ifndef NO_ADD10_KEY
    if (_bIRKey == IR_ADD10)
    {
      return (TRUE); /* don't care +10 key */
    }
#endif

    _rNumInStateCtx.bDig[bDigNum] = _bIRKey;

    _rNumInStateCtx.rState.bDigNum++;

    if (_rNumInStateCtx.rState.bDigNum == _rNumInStateCtx.rState.bTotalDigNum)
    {
      _rNumInStateCtx.rState.fgComplete = TRUE;
    }
    else
    {
      _rNumInStateCtx.rState.fgComplete = FALSE;
    }
  }
  // megaa ADD5 begin
#ifndef NO_ADD5_KEY
  else if (_bIRKey == IR_ADD5)
  {
    return (TRUE); /* don't care +5 key ????!!! */
  }
#endif
  // megaa ADD5 end
  else if ((_bIRKey == IR_CLEAR) && (bDigNum > 0))
  {
    _rNumInStateCtx.bDig[bDigNum - 1] = 0;
    _rNumInStateCtx.rState.bDigNum--;
    _rNumInStateCtx.rState.fgComplete = FALSE;
  }
  else
  {
    return(FALSE);
  }

  return(TRUE);
}

// *********************************************************************
// for DVD PTT search and VCD/CDDA track search, only input 1 number
// *********************************************************************
BOOL fgNumInState3(void) large
{
  if (_bIRKey == IR_CLEAR)
  {
    _rNumInStateCtx.wNum = 0;
    _rNumInStateCtx.rState.bDigNum = 0;
    _rNumInStateCtx.rState.fgComplete = FALSE;
    _rNumInStateCtx.rState.fgCancel = FALSE;
  }
#ifdef PTT_TRK_SEARCH_CONFIRM
  else if (fgIsPlayEnterKey(_bIRKey))
  {
    if (_rNumInStateCtx.rState.bDigNum > 0)
    {
      _rNumInStateCtx.rState.bDigNum = 1;
      _rNumInStateCtx.rState.fgComplete = TRUE;
    }
  }
#endif
  else if (_bIRKey > IR_ADD10 && _bIRKey != IR_ADD5)  // megaa ADD5
  {
    return (FALSE);
  }
#ifndef NO_ADD10_KEY
  else if (_bIRKey == IR_ADD10)
  {
    if ((_rNumInStateCtx.wNum + 10) <= 99)
    {
      _rNumInStateCtx.wNum += 10;
    }
  }
#endif
#ifndef NO_ADD5_KEY
  // megaa ADD5 begin
  else if (_bIRKey == IR_ADD5)
  {
    if ((_rNumInStateCtx.wNum + 5) <= 99)
    {
      _rNumInStateCtx.wNum += 5;
    }
  }
#endif
  // megaa ADD5 end
  else /* if (_bIRKey >= IR_NUM0) */
  {
    if (_rNumInStateCtx.rState.bDigNum > 0)
    {
      /* if press number key again, clean current number buffer */
      _rNumInStateCtx.wNum = 0;
    }
    
#ifdef USE_NUM0_AS_NUM10
    if ((_rNumInStateCtx.wNum == 0) && (_bIRKey == IR_NUM0))
    {
      _rNumInStateCtx.wNum = 10;
    }
    else
#endif
    {
      _rNumInStateCtx.wNum += _bIRKey;
    }

    if (_rNumInStateCtx.wNum > 0)
    {
      _rNumInStateCtx.rState.bDigNum = 1;
#ifndef PTT_TRK_SEARCH_CONFIRM
     _rNumInStateCtx.rState.fgComplete = TRUE; 
#endif
    }
  }

  return (TRUE);
}

// *********************************************************************
// for VCD/CDDA time search
// *********************************************************************
BOOL fgVCDTimeSearchNumInState(void) large
{
  BYTE bDigNum = _rNumInStateCtx.rState.bDigNum;

  if (_bIRKey < IR_ADD10)
  {
    if (bDigNum == 2) /* check ten second field */
    {
      if (_bIRKey >= IR_NUM6)
      {
        return (TRUE);
      }
    }

    _rNumInStateCtx.bDig[bDigNum] = _bIRKey;

    _rNumInStateCtx.rState.bDigNum++;
  
    if (_rNumInStateCtx.rState.bDigNum == _rNumInStateCtx.rState.bTotalDigNum)
    {
      _rNumInStateCtx.rState.fgComplete = TRUE;
    }
  }
  else if ((_bIRKey == IR_CLEAR) && (bDigNum > 0))
  {
    _rNumInStateCtx.bDig[bDigNum - 1] = 0;
    _rNumInStateCtx.rState.bDigNum = bDigNum - 1;
    _rNumInStateCtx.rState.fgComplete = FALSE;
  }
  else
  {
    return (FALSE);
  }

  return (TRUE);
}

// *********************************************************************
// for DVD time search
// *********************************************************************
BOOL fgDVDTimeSearchNumInState(void) large
{
  BYTE bDigNum = _rNumInStateCtx.rState.bDigNum;

  if (_bIRKey < IR_ADD10)
  {
    if ((bDigNum == 1) || (bDigNum == 3))
    {
      if (_bIRKey >= IR_NUM6)
      {
        return(TRUE);
      }
    }

    _rNumInStateCtx.bDig[bDigNum] = _bIRKey;

    _rNumInStateCtx.rState.bDigNum++;

    if (_rNumInStateCtx.rState.bDigNum == _rNumInStateCtx.rState.bTotalDigNum)
    {
      _rNumInStateCtx.rState.fgComplete = TRUE;
    }
  }
  else if ((_bIRKey == IR_CLEAR) && (bDigNum > 0))
  {
    _rNumInStateCtx.bDig[bDigNum - 1] = 0;
    _rNumInStateCtx.rState.bDigNum = bDigNum - 1;
    _rNumInStateCtx.rState.fgComplete = FALSE;
  }
  else
  {
    return(FALSE);
  }

  return(TRUE);
}

// *********************************************************************
// For number key sequence input, no time limit
// *********************************************************************
BOOL fgKeySeqWaitNumInState(void) large
{
  if (_bIRKey <= IR_ADD10)
  {
#ifndef NO_ADD10_KEY
    if (_bIRKey == IR_ADD10)
    {
      return (TRUE); /* don't care +10 key */
    }
#endif

    _rNumInStateCtx.bDig[_rNumInStateCtx.rState.bDigNum] = _bIRKey;
    _rNumInStateCtx.rState.bDigNum++;
    _rNumInStateCtx.wNum = wDigToNum(_rNumInStateCtx.rState.bDigNum, _rNumInStateCtx.bDig);

    if (_rNumInStateCtx.rState.bDigNum == _rNumInStateCtx.rState.bTotalDigNum)
    {
      _rNumInStateCtx.rState.fgComplete = TRUE;
    }
  }
#ifndef NO_ADD5_KEY
  // megaa ADD5 begin
  else if (_bIRKey == IR_ADD5)
  {
    return (TRUE);  // don't care +5 key 
  }
#endif
  // megaa ADD5 end
  else if ((_bIRKey == IR_CLEAR) && (_rNumInStateCtx.rState.bDigNum > 0))
  {
    _rNumInStateCtx.rState.bDigNum--;
    _rNumInStateCtx.bDig[_rNumInStateCtx.rState.bDigNum] = 0;
    _rNumInStateCtx.wNum = wDigToNum(_rNumInStateCtx.rState.bDigNum, _rNumInStateCtx.bDig);
    _rNumInStateCtx.rState.fgComplete = FALSE;
  }
  else /* other keys */
  {
    return (FALSE);
  }

  return (TRUE);
}

// *********************************************************************
// For number key sequence input, time limited
// *********************************************************************
BOOL fgKeySeqLimitNumInState(void) large
{
  BYTE bIdx, bTmp;
  
  if (_bIRKey <= IR_ADD10)
  {
#ifndef NO_ADD10_KEY
    if (_bIRKey == IR_ADD10)
    {
      return (TRUE); /* don't care +10 key */
    }
#endif
    _rNumInStateCtx.bDig[_rNumInStateCtx.rState.bDigNum] = _bIRKey;
    _rNumInStateCtx.rState.bDigNum++;
    _rNumInStateCtx.wNum = wDigToNum(_rNumInStateCtx.rState.bDigNum, _rNumInStateCtx.bDig);

    if (_rNumInStateCtx.rState.bDigNum == _rNumInStateCtx.rState.bTotalDigNum)
    {
      _rNumInStateCtx.rState.fgComplete = TRUE;
    }
  }
#ifndef NO_ADD5_KEY
  // megaa ADD5 begin
  else if (_bIRKey == IR_ADD5)
  {
    return (TRUE);  // don't care +5 key
  }
#endif
  // megaa ADD5 end
  else if ((_bIRKey == IR_CLEAR) && (_rNumInStateCtx.rState.bDigNum > 0))
  {
    _rNumInStateCtx.rState.bDigNum--;
    _rNumInStateCtx.bDig[_rNumInStateCtx.rState.bDigNum] = 0;
    _rNumInStateCtx.wNum = wDigToNum(_rNumInStateCtx.rState.bDigNum, _rNumInStateCtx.bDig);
    _rNumInStateCtx.rState.fgComplete = FALSE;
  }
  else if (((_bIRKey == IR_TIME_OUT) || (fgIsPlayEnterKey(_bIRKey))) &&
           (_rNumInStateCtx.rState.bDigNum > 0))
  {
    bTmp = _rNumInStateCtx.rState.bTotalDigNum - _rNumInStateCtx.rState.bDigNum;

    if (bTmp > 0)
    {
      for (bIdx = (_rNumInStateCtx.rState.bTotalDigNum - 1); bIdx > 0; bIdx--)
      {
        _rNumInStateCtx.bDig[bIdx] = _rNumInStateCtx.bDig[bIdx - bTmp];
      }
           
      for (bIdx = 0; bIdx < bTmp; bIdx++)
      {
        _rNumInStateCtx.bDig[bIdx] = 0;
      }

      _rNumInStateCtx.rState.bDigNum = _rNumInStateCtx.rState.bTotalDigNum;

      _rNumInStateCtx.wNum = wDigToNum(_rNumInStateCtx.rState.bDigNum, _rNumInStateCtx.bDig);
    }
    
    _rNumInStateCtx.rState.fgComplete = TRUE;
  }
  else /* other keys */
  {
    return (FALSE);
  }

  return (TRUE);
}

// *********************************************************************
// Number input state
// *********************************************************************
BOOL fgNumInState(void) large
{
  BOOL fgRet = TRUE;
  
  switch (_rNumInStateCtx.rState.bInputType)
  {
    case NUM_IN_TYPE_1:
    case NUM_IN_TYPE_4:
      fgRet = fgNumInState1();
      break;

    case NUM_IN_TYPE_2:
      fgRet = fgNumInState2();
      break;

    case NUM_IN_TYPE_3:
      fgRet = fgNumInState3();
      break;

    case NUM_IN_VCD_TIME:
      fgRet = fgVCDTimeSearchNumInState();
      break;

    case NUM_IN_DVD_TIME:
      fgRet = fgDVDTimeSearchNumInState();
      break;

    case NUM_IN_SEQ_WAIT:
      fgRet = fgKeySeqWaitNumInState();
      break;

    case NUM_IN_SEQ_LIMIT:
      fgRet = fgKeySeqLimitNumInState();
      break;

    case NUM_IN_NONE:
    default:
      break;
  } /* switch () */

  return (fgRet);
}

⌨️ 快捷键说明

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