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

📄 smi_reg.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
        break;

      case (CME_ERR_SimPukReq):
        ui_signal (UI_SIG_ENTER_PUK);
        pinNeed         = TRUE;
        mmi_data->state = MMI_WAIT_FOR_PUK;
        break;
    
      case (CME_ERR_SimFail):
      case (CME_ERR_SimWrong):
        ui_signal (UI_SIG_SIM_WRONG);
        mmi_data->state = MMI_ON;
        break;

      case (CME_ERR_SimNotIns):
        ui_signal (UI_SIG_SIM_NOT_INSERT);
        mmi_data->state = MMI_ON;
        break;

      default:
        ui_signal (UI_SIG_UNHND_CME_ERR, err);
        mmi_data->state = MMI_ON;
        break;
    }
  
    reg_startReg ();
  }
  else
    ui_signal (UI_SIG_UNHND_CME_ERR, err);
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)         MODULE  : SMI_REG                  |
| STATE   : code                  ROUTINE : reg_startManReg          |
+--------------------------------------------------------------------+

  PURPOSE : This function is used to start a manual registration.

            returns: status information concerning the registration
                     progress
*/
LOCAL T_ACI_RETURN reg_startManReg (void)
{
  T_ACI_RETURN ret = AT_FAIL; /* holds the status information */

  /*
   *-----------------------------------------------------------------
   * call to ACI function when no answer on a further ACI function
   * call is expected
   *-----------------------------------------------------------------
   */
  if (currRegCmd EQ AT_CMD_NONE)
  {
    TRACE_FUNCTION ("reg_startManReg ()");

    if (COPSmode EQ  COPS_MOD_Man AND
        COPSoper NEQ NULL            )
    {
      /*
       *-------------------------------------------------------------
       * start registration with predefined registration mode
       *-------------------------------------------------------------
       */
      ret = sAT_PlusCOPS (CMD_SRC_LCL,
                          COPSmode,
                          COPSfrmt,
                          COPSoper);

      if (ui_isScrnWidthMin ())
        COPSfrmt = COPS_FRMT_Short;
      else
        COPSfrmt = COPS_FRMT_Long;

      COPSoper        = NULL;
      currRegCmd      = AT_CMD_COPS;
      mmi_data->state = MMI_WAIT_FOR_REG;

      /*
       *---------------------------------------------------------
       * process result code of ACI function call
       *---------------------------------------------------------
       */   
      switch (ret)
      {
        case (AT_CMPL):
          ui_signal (UI_SIG_REGISTERING);
          rAT_OK (currRegCmd);
          break;

        case (AT_EXCT):
          ui_signal (UI_SIG_REGISTERING);
          break;

        default:
          rAT_PlusCME (currRegCmd, CME_ERR_Unknown);
          break;
      }
    }
    else
    {
      switch (CREGstat)
      {
        case (CREG_STAT_NoSearch):
        case (CREG_STAT_Denied):
        case (CREG_STAT_Unknown):
          /*
           *---------------------------------------------------------
           * operator list is requested
           *---------------------------------------------------------
           */   
          ret = tAT_PlusCOPS (CMD_SRC_LCL, 
                              COPSstartidx,
                              &COPSlastidx,
                              &COPSlst[0]);

          /*
           *---------------------------------------------------------
           * process result code of ACI function call
           *---------------------------------------------------------
           */   
          switch (ret)
          {
            case (AT_CMPL):
              currRegCmd = AT_CMD_COPS;
              rAT_PlusCOPS (COPSlastidx, &COPSlst[0]);
              break;
        
            case (AT_EXCT):
              currRegCmd = AT_CMD_COPS;
              break;

            default:
              ui_signal (UI_SIG_UNHND_CME_ERR, CME_ERR_Unknown);
              break;
          }

        default:
          /*
           *---------------------------------------------------------
           * mobile equipment must be deregistered before trying to
           * register again
           *---------------------------------------------------------
           */
          ui_signal (UI_SIG_UNHND_CME_ERR, CME_ERR_Unknown);
          break;
      }
    }
  }
  else
  {
    /*
     *---------------------------------------------------------------
     * error handling while waiting for answer on further ACI
     * function call
     *---------------------------------------------------------------
     */
    ui_signal (UI_SIG_UNHND_CME_ERR, CME_ERR_Unknown);
  }

  return ret;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)         MODULE  : SMI_REG                  |
| STATE   : code                  ROUTINE : reg_CopsCnf              |
+--------------------------------------------------------------------+

  PURPOSE : This function is called to indicate that a former call to
            function sAT_PlusCOPS results in a success.
*/
GLOBAL void reg_CopsCnf (T_ACI_AT_CMD cmdId)
{
  CHAR            oper[MAX_ALPHA_OPER_LEN]; /* operator name */
  T_ACI_COPS_MOD  mode;                     /* COPS mode     */
  T_ACI_COPS_FRMT frmt;                     /* COPS format   */
  T_ACI_NRG_RGMD  regMode;
  T_ACI_NRG_SVMD  srvMode;
  T_ACI_NRG_FRMT  oprFrmt;
  T_ACI_NRG_SVMD  srvStat;

  TRACE_FUNCTION ("reg_CopsCnf ()");

  if (cmdId EQ currRegCmd)
    currRegCmd = AT_CMD_NONE;
  else 
    return;

  if (currAbrtCmd EQ AT_CMD_ABRT)
  {
    currAbrtCmd = AT_CMD_NONE;
    
    reg_powerOff();
    return;
  }

  if (mmi_data->state EQ MMI_WAIT_FOR_REG)
  {
    qAT_PercentNRG( CMD_SRC_LCL,
                    &regMode,
                    &srvMode,
                    &oprFrmt,
                    &srvStat,
                    oper);
    
    COPSqryrsn = RSN_NONE;

    if (srvStat EQ NRG_SVMD_Limited)
    {
      mmi_data->serviceType = SRV_LIMITED;
      ui_signal (UI_SIG_LIMITED_SERVICE);
      ui_signal (UI_SIG_REGISTERED);

      if (pinNeed AND pinCnf)
      {
        pinNeed = FALSE;
        reg_startReg ();
      }
    }
    else if (srvStat EQ NRG_SVMD_NoSrv)
    {
      mmi_data->serviceType = SRV_NONE;
      ui_signal (UI_SIG_NO_CELL);
      ui_signal (UI_SIG_REGISTERED);

      if (pinNeed AND pinCnf)
      {
        pinNeed = FALSE;
        reg_startReg ();
      }
    }
    else
    {
      /*
       *---------------------------------------------------------------
       * a registration request was successfull
       *---------------------------------------------------------------
       */
      sAT_PlusCOPS (CMD_SRC_LCL, 
                    COPS_MOD_SetOnly,
                    COPSfrmt,
                    NULL);

      /*
       *---------------------------------------------------------------
       * get the operator name and inform the user interface
       *---------------------------------------------------------------
       */
      if (qAT_PlusCOPS (CMD_SRC_LCL, &mode, &frmt, oper) NEQ AT_CMPL)
        oper[0] = NULL_TERM; 

      /*
       *---------------------------------------------------------------
       * if operator unknown show MCC MNC
       *---------------------------------------------------------------
       */
      if (strlen(oper) EQ 0)
      {
        sAT_PlusCOPS (CMD_SRC_LCL, 
                      COPS_MOD_SetOnly,
                      COPS_FRMT_Numeric,
                      NULL);

        if (qAT_PlusCOPS (CMD_SRC_LCL, &mode, &frmt, oper) NEQ AT_CMPL)
          oper[0] = NULL_TERM; 
      }

      mmi_data->serviceType = SRV_NORMAL;
      ui_signal (UI_SIG_PLMN, &oper[0]);
      ui_signal (UI_SIG_REGISTERED);

      mmi_data->state = MMI_ON;
    }
  }
  else if (mmi_data->state EQ MMI_WAIT_FOR_DEREG)
  {
    /*
     *---------------------------------------------------------------
     * a deregistration request was successfull
     *---------------------------------------------------------------
     */
    qAT_PercentNRG( CMD_SRC_LCL,
                    &regMode,
                    &srvMode,
                    &oprFrmt,
                    &srvStat,
                    oper);
    
    if (srvStat EQ NRG_SVMD_Limited)
    {
      mmi_data->serviceType = SRV_LIMITED;
      ui_signal (UI_SIG_LIMITED_SERVICE);
      ui_signal (UI_SIG_REGISTERED);
    }
    else if (srvStat EQ NRG_SVMD_NoSrv)
    {
      mmi_data->serviceType = SRV_NONE;
      ui_signal (UI_SIG_NO_CELL);
      ui_signal (UI_SIG_REGISTERED);
    }
    else
    {
      if (COPSqryrsn EQ RSN_CHANGE AND
          COPSmode   EQ COPS_MOD_Auto)
      {
        /*
         *-----------------------------------------------------------
         * start an automatic registration
         *-----------------------------------------------------------
         */
        COPSqryrsn      = RSN_NONE;
        mmi_data->state = MMI_ON;

        reg_startReg ();
      }
      else if (COPSqryrsn EQ RSN_CHANGE   AND
              (COPSmode   EQ COPS_MOD_Man OR
               COPSmode   EQ COPS_MOD_Both))
      {
        /*
         *-----------------------------------------------------------
         * start a manual registration
         *-----------------------------------------------------------
         */
        COPSqryrsn      = RSN_NONE; 
        mmi_data->state = MMI_ON;

        reg_startManReg ();
      }
      else
      {
        /*
         *-----------------------------------------------------------
         * start no registration once again
         *-----------------------------------------------------------
         */
        COPSqryrsn      = RSN_NONE;
        mmi_data->state = MMI_ON;
      }
    }
  } 
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)         MODULE  : SMI_REG                  |
| STATE   : code                  ROUTINE : reg_CopsRej              |
+--------------------------------------------------------------------+

  PURPOSE : This function is called when an registration or
            deregistration attempt failed.

            <err>: error code
*/
GLOBAL void reg_CopsRej (T_ACI_AT_CMD cmdId, T_ACI_CME_ERR err)
{
  CHAR            oper[MAX_ALPHA_OPER_LEN]; /* operator name */
  T_ACI_NRG_RGMD  regMode;
  T_ACI_NRG_SVMD  srvMode;
  T_ACI_NRG_FRMT  oprFrmt;
  T_ACI_NRG_SVMD  srvStat;

  TRACE_FUNCTION ("reg_CopsRej ()");

  if (cmdId EQ currRegCmd)
    currRegCmd = AT_CMD_NONE;

  if (currAbrtCmd EQ AT_CMD_ABRT)
  {
    currAbrtCmd = AT_CMD_NONE;
    
    ui_signal (UI_SIG_UNHND_CME_ERR, CME_ERR_FailedToAbort);
    return;
  }

  if (mmi_data->state EQ MMI_WAIT_FOR_REG)
  {
    /*
     *---------------------------------------------------------------
     * a registration request was unsuccessfull
     *---------------------------------------------------------------
     */
    qAT_PercentNRG( CMD_SRC_LCL,
                    &regMode,
                    &srvMode,
                    &oprFrmt,
                    &srvStat,
                    oper);
    
    if (srvStat EQ NRG_SVMD_Limited)
    {
      mmi_data->serviceType = SRV_LIMITED;
      ui_signal (UI_SIG_LIMITED_SERVICE);
      ui_signal (UI_SIG_REGISTERED);

      if (pinNeed AND pinCnf)
      {
        pinNeed = FALSE;
        reg_startReg ();
      }
    }
    else if (srvStat EQ NRG_SVMD_NoSrv)
    {
      mmi_data->serviceType = SRV_NONE;
      ui_signal (UI_SIG_NO_CELL);
      ui_signal (UI_SIG_REGISTERED);

      if (pinNeed AND pinCnf)
      {
        pinNeed = FALSE;
        reg_startReg ();
      }
    }
  }
  else if (mmi_data->state EQ MMI_WAIT_FOR_DEREG)
  {
    /*
     *---------------------------------------------------------------
     * a deregistration request was unsuccessfull
     *---------------------------------------------------------------
     */
    ui_signal (UI_SIG_UNHND_CME_ERR, err);
    mmi_data->state = MMI_ON;
  }

  COPSqryrsn = RSN_NONE;
}

/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)         MODULE  : SMI_REG                  |
| STATE   : code                  ROUTINE : reg_changeReg            |
+--------------------------------------------------------------------+

  PURPOSE : This function is called when a deregistration followed by
            a registration once again should be performed.

            returns: status information concerning the deregistration
                     progress

⌨️ 快捷键说明

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