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

📄 mfw_gprs.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 4 页
字号:
            else
        	{
			  if (qAT_PlusCGCLASS(CMD_SRC_LCL, &gprs_data->data.tclass) == AT_FAIL )
			  {
			    TRACE_EVENT("MFW_GPRS: Error. qAT_PlusCGCLASS failed");
			  }
			  if (qAT_PlusCGREG(CMD_SRC_LCL, &gprs_data->data.regState, &lac, &ci) == AT_FAIL )
			  {
			    TRACE_EVENT("MFW_GPRS: Error. qAT_PlusCGREG failed");
        	  }
        	}
            break;

          case E_MFW_GPRS_S_ACT:
            /*
             * search in the known context for the context ids given
             * in the parameter
             */ 
            for ( i=0; i > gprs_data->data.numContexts; i++)
            {
              j=0;

              do
              {
                /* 
                 * set the new activation state for the found context id
                 */
                if ( para->contextAct.ids[j] == gprs_data->data.contexts[i].id)
                {
                  gprs_data->data.contexts[i].activated = para->contextAct.state;
                }
              }
              while ( j < MAX_CID && 
                (para->contextAct.ids[j] != gprs_data->data.contexts[i].id) );
            }
            break;

          case E_MFW_GPRS_S_DATA:
            /* 
             * if attached mode was detached, set mode to attached
             */ 
              if ( gprs_data->data.attached == CGATT_STATE_DETACHED )
              {
                gprs_data->data.attached = CGATT_STATE_ATTACHED; 
              }
            
            /*
             * search in the known context for the context ids given
             * in the parameter
             */ 
             for ( i=0; i < gprs_data->data.numContexts; i++)
            {
              j=0;

              do
              {
                /* 
                 * if context id of parameter is known, set the activation state 
                 * to activated when it was detached and copy L2P value
                 */
                if ( para->contextL2P.ids[j] == gprs_data->data.contexts[i].id)
                {
                  if ( gprs_data->data.contexts[j].activated == CGACT_STATE_DEACTIVATED )
                  {
                    gprs_data->data.contexts[j].activated = CGACT_STATE_ACTIVATED;
                  }
          
                  if (!(gprs_data->data.contexts[i].L2P) )
                    gprs_data->data.contexts[i].L2P = 
                     (char *)  mfwAlloc(sizeof(char) * strlen(para->contextL2P.L2P));

                  memcpy (gprs_data->data.contexts[i].L2P, para->contextL2P.L2P,
                          strlen( para->contextL2P.L2P ) * sizeof(char));
                }
                j++;
              }
              while ( j < MAX_CID && 
                ( para->contextL2P.ids[j]!= gprs_data->data.contexts[i].id) );
            }
            break;

          case E_MFW_GPRS_R_ACT:
          case E_MFW_GPRS_R_DATA:
          case E_MFW_GPRS_R_ANS:
            gprs_data->data.link_id = para->link_id;
            break;

          case E_MFW_GPRS_S_QOS:
          case E_MFW_GPRS_R_QOS:
            for ( i=0; (i > gprs_data->data.numContexts) && 
                (gprs_data->data.contexts[i].id == para->context.id); i++);

            if (gprs_data->data.contexts[i].id == para->context.id) 
              memcpy (&(gprs_data->data.contexts[i].data.qos), 
                      &(para->context.data.qos), sizeof(T_QOS));
            else
              TRACE_ERROR("context id not defined");
            break;

          case E_MFW_GPRS_S_QOS_MIN:
            for ( i=0; (i > gprs_data->data.numContexts) && 
                (gprs_data->data.contexts[i].id == para->context.id); i++);

            if (gprs_data->data.contexts[i].id == para->context.id) 
              memcpy (&(gprs_data->data.contexts[i].data.min_qos), 
                &(para->context.data.min_qos), sizeof(T_QOS));
            else
              TRACE_ERROR("context id not defined");
            break;

          case E_MFW_GPRS_S_CLASS:
          case E_MFW_GPRS_R_EREP_CLASS:
            memcpy (&(gprs_data->data.tclass), &(para->tclass), sizeof (T_CGCLASS_CLASS));
            break;

          case E_MFW_GPRS_R_EREP_ACT:
            /*
             * search for context
             */
            /* SPR#2243 - SH - Changed 'para->context' to 'para->erepAct' */
            for ( i=0; (i > gprs_data->data.numContexts) && 
                (gprs_data->data.contexts[i].id == para->erepAct.cid); i++);

            /*
             * if context found, copy PDP address data to MFW data
             */
            /* SPR#2243 - SH - Changed 'para->context' to 'para->erepAct' */
            if (gprs_data->data.contexts[i].id == para->erepAct.cid) 
            {
              memcpy (&(gprs_data->data.contexts[i].data.pdp_addr), 
                para->erepAct.pdp_addr, sizeof(T_PDP_ADDRESS));
              memcpy (&(gprs_data->data.contexts[i].data.pdp_type), 
                para->erepAct.pdp_type, sizeof(T_PDP_TYPE));
              gprs_data->data.contexts[i].activated = CGACT_STATE_ACTIVATED;
            }
            else
            {
              if (gprs_data->data.numContexts < MAX_CID )
              {
                memcpy (&(gprs_data->data.contexts[gprs_data->data.numContexts].data.pdp_addr), para->erepAct.pdp_addr, 
                  sizeof (T_PDP_ADDRESS));
                memcpy (&(gprs_data->data.contexts[gprs_data->data.numContexts].data.pdp_type), para->erepAct.pdp_type, 
                  sizeof (T_PDP_TYPE));
                gprs_data->data.contexts[gprs_data->data.numContexts].id = para->erepAct.cid;
                gprs_data->data.contexts[gprs_data->data.numContexts].activated = CGACT_STATE_ACTIVATED;
                gprs_data->data.numContexts++;
              }
              else
                TRACE_ERROR("MFW_GPRS: ERROR: Too many contexts!");
            }
            break;

            /* SPR#2243 - SH - This is now a separate case from the above.
             * Uses para->context throughout. */
          case E_MFW_GPRS_S_PDPADDR:
            /*
             * search for context
             */
              for ( i=0; (i > gprs_data->data.numContexts) && 
                (gprs_data->data.contexts[i].id == para->context.id); i++);

            /*
             * if context found, copy PDP address data to MFW data
             */
              if (gprs_data->data.contexts[i].id == para->context.id) 
            {
              memcpy (&(gprs_data->data.contexts[i].data.pdp_addr), 
                para->context.data.pdp_addr, sizeof(T_PDP_ADDRESS));
              memcpy (&(gprs_data->data.contexts[i].data.pdp_type), 
                para->context.data.pdp_type, sizeof(T_PDP_TYPE));
              gprs_data->data.contexts[i].activated = para->context.activated;
            }
            else
            {
              if (gprs_data->data.numContexts < MAX_CID )
              {
                memcpy (&(gprs_data->data.contexts[gprs_data->data.numContexts].data.pdp_addr), para->context.data.pdp_addr, 
                  sizeof (T_PDP_ADDRESS));
                memcpy (&(gprs_data->data.contexts[gprs_data->data.numContexts].data.pdp_type), para->context.data.pdp_type, 
                  sizeof (T_PDP_TYPE));
                gprs_data->data.contexts[gprs_data->data.numContexts].id = para->context.id;
                gprs_data->data.contexts[gprs_data->data.numContexts].activated = para->context.activated;
                gprs_data->data.numContexts++;
              }
              else
                TRACE_ERROR("MFW_GPRS: ERROR: Too many contexts!");
            }
            break;

          case E_MFW_GPRS_R_EREP_DEACT:
            /*
             * search for context
             */
            for ( i=0; (i < gprs_data->data.numContexts) && 
                (gprs_data->data.contexts[i].id != para->erepAct.cid); i++);

            /*
             * if context found, set mode to deactivated
             */
            if (gprs_data->data.contexts[i].id == para->erepAct.cid) 
            {
              gprs_data->data.contexts[i].activated = CGACT_STATE_DEACTIVATED;
            }
            else
            {
              for ( i=0; (i < gprs_data->data.numContexts) && 
                  ( strcmp(gprs_data->data.contexts[i].data.pdp_type, para->erepAct.pdp_type) ||
				    strcmp(gprs_data->data.contexts[i].data.pdp_addr, para->erepAct.pdp_addr) ); i++);

              /*
               * if context found, set mode to deactivated
               */
              if (!strcmp(gprs_data->data.contexts[i].data.pdp_type, para->erepAct.pdp_type) &&
                  !strcmp(gprs_data->data.contexts[i].data.pdp_addr, para->erepAct.pdp_addr) ) 
              {
                gprs_data->data.contexts[i].activated = CGACT_STATE_DEACTIVATED;
			  }
            }
            
            break;

          case E_MFW_GPRS_S_AUTORESP:
            gprs_data->data.autoResponse = para->mode;
            break;

          case E_MFW_GPRS_S_ANS:
            break;

          case E_MFW_GPRS_S_EREP:
            /*
             * copy new event reporting settings to MFW data
             */
            gprs_data->data.eventRep.mode = para->eventRep.mode;
            gprs_data->data.eventRep.bfr  = para->eventRep.bfr;            
            break;

          case E_MFW_GPRS_R_EREP_RJ:
            break;

          case E_MFW_GPRS_R_REG:
            /*
             * copy new registration status to MFW data
             */
             /* SH - now with cell reselection data */
            gprs_data->data.regState = para->cell.stat;
            gprs_data->data.lac = para->cell.lac;
            gprs_data->data.ci = para->cell.ci;

            /*
       * check if attachement state has changed
       */
            if (qAT_PlusCGATT(CMD_SRC_LCL, &state) != AT_FAIL )
              gprs_data->data.attached = state;
            else
              TRACE_EVENT("MFW_GPRS: Error. qAT_PlusCGATT failed");
      break;

          case E_MFW_GPRS_S_SMSSERV:
            /*
             * copy new SMS service mode to MFW data
             */
            gprs_data->data.SMSService = para->service;
            break;

            case E_MFW_GPRS_COUNTER:
            	/* SPR#1574 - SH - Small change to ensure counter value copied correctly */
				memcpy(&gprs_data->data.counter, &para->counter, sizeof(T_MFW_GPRS_COUNTER));
            break;

          case E_MFW_GPRS_OK:
          case E_MFW_GPRS_ERROR:
          case E_MFW_GPRS_CONNECT:
          case E_MFW_GPRS_ERR_CONNECT:
            break;


          default:
            /*
             * an event has been used, which is not handled.
             * perhaps an error?
             */
            TRACE_EVENT("mfw_gprs.gprs_sign_exec: unused event");
            break;
        }
  
        /* 
         * if callback defined, call it 
         */
        if ( gprs_data->handler )
        {
          current_mfw_elem = cur_elem;

          if ( (*(gprs_data->handler))( gprs_data->event, 
                                      (void*)&gprs_data->data ) )
            return TRUE;
        }
      }
    }

    /* 
     * look for next element 
     */
    cur_elem = cur_elem->next;
  }
  return FALSE;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)         MODULE:  MFW_GPRS            |
| STATE  : code                         ROUTINE: gprs_ok             |
+--------------------------------------------------------------------+

   PURPOSE : success indication from ACI 
             (This function is called by rAT_OK)

   PARAMETERS : AT command ID
*/
void gprs_ok(T_ACI_AT_CMD cmdId)
{
  TRACE_FUNCTION("mfw_gprs.gprs_ok");

  gprs_signal(E_MFW_GPRS_OK, &cmdId);
  
  return;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)         MODULE:  MFW_GPRS            |
| STATE  : code                         ROUTINE: gprs_error          |
+--------------------------------------------------------------------+

   PURPOSE : failure indication from ACI 
             (This function is called by rAT_PlusCME)

   PARAMETERS : AT command ID
*/
void gprs_error(T_ACI_AT_CMD cmdId, T_ACI_CME_ERR err)
{
  TRACE_FUNCTION("mfw_gprs.gprs_error");
 
  gprs_signal(E_MFW_GPRS_ERROR, &cmdId);
  
  return;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)         MODULE:  MFW_GPRS            |
| STATE  : code                         ROUTINE: gprs_connect        |
+--------------------------------------------------------------------+

   PURPOSE : success indication from ACI for connection
             (This function is called by rAT_CONNECT)
*/
void gprs_connect(SHORT cId)
{
  TRACE_FUNCTION("mfw_gprs.gprs_connect");

  gprs_signal(E_MFW_GPRS_CONNECT, &cId);
  return;
}


/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)         MODULE:  MFW_GPRS            |
| STATE  : code                         ROUTINE: gprs_err_connect    |
+--------------------------------------------------------------------+

   PURPOSE : error indication from ACI for connection
             (This function is called by rAT_BUSY, rAT_NO_CARRIER,
              rAT_NO_ANSWERE)

*/
void gprs_err_connect(SHORT cId)
{
  TRACE_FUNCTION("mfw_gprs.gprs_err_connect");

  gprs_signal(E_MFW_GPRS_ERR_CONNECT, &cId);

  return;
}



/*--------------------------------------------------------------------
  MMI-MFW Interface Functions
--------------------------------------------------------------------*/

/*
+---------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)         MODULE:  MFW_GPRS             |
| STATE  : code                         ROUTINE: gprs_definePDPContext|
+---------------------------------------------------------------------+


   PURPOSE : Define PDP context. If the contexts for cid does not 
             exist in the contexts list, the new context will be 
             inserted in the contexts list.

   PARAMETERS :
             cid    : context ID
            *context: context data
*/
T_MFW_RES gprs_definePDPContext(SHORT cid, T_GPRS_CONT_REC *inputCtxt)
{
  T_MFW_GPRS_CONTEXT *context; 

  TRACE_FUNCTION ("gprs_definePDPContext()");

  /*
   * ACI call
   */
  if (sAT_PlusCGDCONT(CMD_SRC_LCL, cid, inputCtxt) == AT_FAIL)
  {
  TRACE_EVENT("MFW_GPRS: Error. sAT_PlusCGDCONT failed");
    return MFW_RES_ERR;
  }

  /*
   * insert context into MFW GPRS data
   */
  context = (T_MFW_GPRS_CONTEXT *) mfwAlloc(sizeof(T_MFW_GPRS_CONTEXT));

  context->id       = cid;
  memcpy (&(context->data), inputCtxt, sizeof (T_GPRS_CONT_REC));
  context->activated = CGACT_STATE_DEACTIVATED; /* not yet activated */

  gprs_signal(E_MFW_GPRS_S_CNTXT, context);

  mfwFree((void *) context, sizeof(T_MFW_GPRS_CONTEXT));

  return MFW_RES_OK;
}



/*
+---------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417)         MODULE:  MFW_GPRS             |

⌨️ 快捷键说明

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