diff src/aci2/aci/ati_mm.c @ 3:93999a60b835

src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Sep 2016 00:29:36 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/aci2/aci/ati_mm.c	Mon Sep 26 00:29:36 2016 +0000
@@ -0,0 +1,1837 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GSM-F&D (8411)
+|  Modul   :  ATI
++----------------------------------------------------------------------------- 
+|  Copyright 2002 Texas Instruments Berlin, AG 
+|                 All rights reserved. 
+| 
+|                 This file is confidential and a trade secret of Texas 
+|                 Instruments Berlin, AG 
+|                 The receipt of or possession of this file does not convey 
+|                 any rights to reproduce or disclose its contents or to 
+|                 manufacture, use, or sell anything it may describe, in 
+|                 whole, or in part, without the specific written consent of 
+|                 Texas Instruments Berlin, AG. 
++----------------------------------------------------------------------------- 
+|  Purpose :  AT Command Interpreter: Mobility Management related functions.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef ATI_MM_C
+#define ATI_MM_C
+
+#undef DUMMY_ATI_STRINGS
+
+#include "aci_all.h"
+
+#include "aci_lst.h"
+#include "aci_cmh.h"
+#include "ati_cmd.h"
+#include "aci_io.h"
+#include "aci_cmd.h"
+#include "l4_tim.h"
+
+#include "aci_mem.h"
+#include "aci_prs.h"
+
+#include "ati_int.h"
+
+#ifdef UART
+#include "dti.h"
+#include "dti_conn_mng.h"
+#endif
+
+#include "psa.h"
+#include "cmh.h"
+#include "psa_sim.h"
+#include "cmh_sim.h"
+#include "psa_mm.h"
+
+#ifdef  FF_ATI_BAT
+
+#include "typedefs.h"
+#include "gdd.h"
+#include "bat.h"
+
+#include "ati_bat.h"
+
+#endif /* FF_ATI_BAT */
+
+EXTERN T_ACI_CFUN_FUN CFUNfun;
+EXTERN T_CIEV_SIGNAL_BUFFER   asCievSignalBuf;
+EXTERN T_CIEV_SMSFULL_BUFFER  asCievSmsFullBuf;
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : atPlusCops         |
++--------------------------------------------------------------------+
+
+  PURPOSE : +COPS command (operator selection)
+*/
+
+GLOBAL T_ATI_RSLT setatPlusCOPS (char *cl, UBYTE srcId)
+{
+  CHAR            op[MAX_ALPHA_OPER_LEN] = {0};
+  T_ACI_RETURN    ret = AT_FAIL;
+  T_ACI_COPS_MOD  mode = COPS_MOD_NotPresent;
+  T_ACI_COPS_FRMT format = COPS_FRMT_NotPresent;
+  SHORT           startIdx = 0,
+                  lastIdx = 0;
+  SHORT           pos=0;
+  T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+
+  TRACE_FUNCTION("setatPlusCops()");
+
+  if (CFUNfun NEQ CFUN_FUN_Full)
+  {
+    TRACE_EVENT_P1("+COPS error: cannot proceed Mobile has no Full CFUN: %d", CFUNfun);
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+
+  cl = parse (cl,"dds",&mode,&format,(LONG)(MAX_ALPHA_OPER_LEN-1),op);     /*split parameter string in int,int,str*/
+  if (!cl OR ((mode EQ COPS_MOD_Man OR mode EQ COPS_MOD_Both)
+                   AND op[0] EQ 0))
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+
+#ifdef FF_ATI_BAT
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_cmd_set_plus_cops cops;
+    UBYTE len;
+
+    len=strlen(op);
+
+    /*
+    *   If the operator name is too long we can't really do anything
+    *   meaningful, so generate an error and give up.
+    */
+    if (len>BAT_MAX_COPS_OPER_LEN)
+    {
+      cmdCmeError(CME_ERR_Unknown);
+      return(ATI_FAIL);
+    }
+
+    cmd.ctrl_params = BAT_CMD_SET_PLUS_COPS;
+    cmd.params.ptr_set_plus_cops=&cops;
+
+    /*
+    *   This relies on T_ACI_COPS_MOD and T_BAT_plus_cops_mode being
+    *   equivalent.
+    */
+    cops.mode=(T_BAT_plus_cops_mode)mode;
+
+    /*
+    *   This relies on T_ACI_COPS_FRMT and T_BAT_plus_cops_format being
+    *   equivalent.
+    */
+    cops.format=(T_BAT_plus_cops_format)format;
+    
+    cops.c_oper=(U8)len;
+
+    if (len)
+    {
+      memcpy(cops.oper,op,BAT_MAX_COPS_OPER_LEN);
+      cops.v_oper=TRUE;
+    }
+    else
+    {
+      cops.v_oper=FALSE;
+    }
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    src_params->curAtCmd = AT_CMD_COPS;
+    return ATI_EXCT;
+  }
+#else
+
+  ret = sAT_PlusCOPS (srcId,mode,format,op);
+  switch (ret)
+  {
+  case (AT_CMPL):                         /*operation completed*/
+    break;
+  case (AT_EXCT):
+    src_params->curAtCmd = AT_CMD_COPS;
+    break;
+  default:
+    cmdCmeError(CME_ERR_Unknown);         /*Command failed*/
+    break;
+  }
+  return (map_aci_2_ati_rslt(ret));
+
+#endif /*FF_ATI_BAT*/
+}
+
+#ifdef FF_ATI_BAT
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)      MODULE  : ACI_BAT                    |
+| STATE   : code                ROUTINE : aci_bat_HandleTestCOPS     |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+T_ATI_RSLT atiHandleTestCOPS(UBYTE srcId)
+{
+  T_BAT_cmd_send cmd;
+  T_BAT_no_parameter dummy;
+
+  cmd.ctrl_params = BAT_CMD_TST_PERCENT_COPS;
+  dummy.bat_dummy = 0xFF;
+  cmd.params.ptr_que_plus_cops = &dummy;
+  
+  TRACE_FUNCTION("aci_bat_HandleTestCOPS() calls bat_send() <=== as APPLICATION");
+
+#ifndef FF_DUAL_SIM
+  if (CFUNfun NEQ CFUN_FUN_Full)
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+#endif /*FF_DUAL_SIM*/
+
+  bat_send(ati_bat_get_client(srcId), &cmd);
+  return ATI_EXCT; /* executing, because response is passed by callback function */
+}
+
+#else /* no FF_ATI_BAT */
+
+GLOBAL T_ATI_RSLT atiHandleTestCOPS(char *cl, UBYTE srcId)
+{
+  T_ACI_RETURN    ret      = AT_FAIL;
+  T_ACI_COPS_MOD  mode     = COPS_MOD_NotPresent;
+  T_ACI_COPS_FRMT format   = COPS_FRMT_NotPresent;
+  SHORT           startIdx = 0,
+                  lastIdx  = 0,
+                  length1,
+                  length2;
+  T_ACI_COPS_LST  operLst;
+  BOOL            END_OF_LIST = FALSE;
+  SHORT           i,
+                  pos=0;
+  T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+  char* outputCommand;
+  
+
+  TRACE_FUNCTION("atiHandleTestCOPS()");
+
+#ifndef FF_DUAL_SIM
+  if (CFUNfun NEQ CFUN_FUN_Full)
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+#endif /*FF_DUAL_SIM*/
+  do
+  {
+    startIdx += lastIdx;
+    switch (src_params->curAtCmd)
+    {
+        case AT_CMD_COPS:
+           ret = tAT_PlusCOPS(srcId,startIdx,&lastIdx,&operLst[0]);
+        break;
+        case AT_CMD_P_COPS:
+           ret = tAT_PercentCOPS(srcId,startIdx,&lastIdx,&operLst[0]);
+        break;
+        default:
+           cmdCmeError(CME_ERR_Unknown);
+        return ATI_FAIL;
+    }
+    if (ret EQ AT_CMPL)
+    {
+      for(i=0;i<lastIdx;i++)
+      {
+        if ((operLst[i].status < 0) AND (*operLst[i].numOper EQ 0))
+        {
+          END_OF_LIST = TRUE;
+          break;
+        }
+
+
+        length1 = strlen(operLst[i].longOper);
+        length2 = strlen(operLst[i].shortOper);
+
+        /* What COPS command is active? */
+        switch (src_params->curAtCmd)
+        {
+        case AT_CMD_COPS:
+           outputCommand = "+COPS";
+        break;
+        case AT_CMD_P_COPS:
+           outputCommand ="%COPS";
+        break;
+        default:
+           cmdCmeError(CME_ERR_Unknown);
+        return ATI_FAIL;
+        }
+             
+        sprintf(g_sa,"%s: %d,\"%s\",\"%s\",%s",outputCommand,
+                operLst[i].status,operLst[i].longOper,
+                operLst[i].shortOper,operLst[i].numOper);
+        io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
+
+      }
+    }
+
+    switch(ret)
+    {
+      case AT_EXCT:
+        return ATI_EXCT;
+        
+      case AT_FAIL:
+        cmdCmeError(CME_ERR_Unknown);
+        return ATI_FAIL;
+        
+      case AT_BUSY:
+        return ATI_BUSY;
+
+      default:
+        break;/* Does nothing in this case */
+    }
+
+  }
+  while(!END_OF_LIST);
+
+  return ATI_CMPL;
+}
+
+#endif /* no FF_ATI_BAT */
+
+
+GLOBAL T_ATI_RSLT tesatPlusCOPS (char *cl, UBYTE srcId)
+{
+  T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+
+#ifdef FF_ATI_BAT
+  TRACE_FUNCTION("tesatPlusCOPS() calls bat_send() <=== as APPLICATION");
+  return atiHandleTestCOPS(srcId);
+
+#else /* FF_ATI_BAT */
+  TRACE_FUNCTION("tesatPlusCOPS()");
+  return atiHandleTestCOPS(cl,srcId);
+#endif /* FF_ATI_BAT */
+
+}
+
+GLOBAL T_ATI_RSLT queatPlusCOPS (char *cl, UBYTE srcId)
+{
+  CHAR            op[MAX_ALPHA_OPER_LEN] = {0};
+  T_ACI_RETURN    ret = AT_FAIL;
+  T_ACI_COPS_MOD  mode = COPS_MOD_NotPresent;
+  T_ACI_COPS_FRMT format = COPS_FRMT_NotPresent;
+  SHORT           startIdx = 0,
+                  lastIdx = 0;
+  SHORT           pos = 0;
+
+  TRACE_FUNCTION("queatPlusCops()");
+
+#ifdef FF_ATI_BAT
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_no_parameter dummy;
+
+    cmd.ctrl_params = BAT_CMD_QUE_PLUS_COPS;
+    dummy.bat_dummy = 0xFF;
+    cmd.params.ptr_que_plus_cops = &dummy;
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return(ATI_EXCT);
+  } 
+#else /* no FF_ATI_BAT */
+
+  ret = qAT_PlusCOPS(srcId,&mode,&format,op);
+  if (ret EQ AT_CMPL)
+  {
+    if (*op)
+      sprintf(g_sa,"+COPS: %d,%d,\"%s\"",mode,format,op);
+    else
+      sprintf(g_sa,"+COPS: %d",mode);
+    
+    io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
+  }
+  else
+  {
+    cmdCmeError(CME_ERR_Unknown);
+  }
+  return (map_aci_2_ati_rslt(ret));
+
+#endif /* no FF_ATI_BAT */
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : setatPercentCOPS         |
++--------------------------------------------------------------------+
+
+  PURPOSE : %COPS command (operator selection)
+*/
+
+GLOBAL T_ATI_RSLT setatPercentCOPS (char *cl, UBYTE srcId)
+{
+  CHAR            op[MAX_ALPHA_OPER_LEN] = {0};
+  T_ACI_RETURN    ret = AT_FAIL;
+  T_ACI_COPS_MOD  mode = COPS_MOD_NotPresent;
+  T_ACI_COPS_FRMT format = COPS_FRMT_NotPresent;
+  SHORT           startIdx = 0,
+                  lastIdx = 0;
+  SHORT           pos=0;
+  T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+
+  if (CFUNfun NEQ CFUN_FUN_Full)
+  {
+    TRACE_EVENT_P1("%COPS error: cannot proceed Mobile has no Full CFUN: %d", CFUNfun);
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+  cl =  parse (cl,"dds",&mode,&format,(LONG)(MAX_ALPHA_OPER_LEN-1),op);    /*split parameter string in int,int,str*/
+  if (!cl) /*For %COPS, Manual selection without Operator parameter is allowed */
+  {    
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+  
+#ifdef FF_ATI_BAT
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_cmd_set_percent_cops my_bat_set_percent_cops;
+    UBYTE OperLength = strlen(op);
+    
+    TRACE_FUNCTION("setatPercentCOPS() calls bat_send() <=== as APPLICATION");
+
+    memset(&my_bat_set_percent_cops, sizeof(my_bat_set_percent_cops), FALSE);
+    cmd.ctrl_params = BAT_CMD_SET_PERCENT_COPS;
+    cmd.params.ptr_set_percent_cops = &my_bat_set_percent_cops;
+
+      my_bat_set_percent_cops.mode = (T_BAT_VAL_percent_cops_mode)mode;
+      my_bat_set_percent_cops.format = (T_BAT_VAL_percent_cops_format)format;
+    
+    if (OperLength NEQ 0 &&
+        OperLength <= BAT_MAX_COPS_LONG_OPER_LEN)
+    {
+      memcpy(&my_bat_set_percent_cops.oper, op, BAT_MAX_COPS_LONG_OPER_LEN);
+    }
+
+     src_params->curAtCmd = AT_CMD_P_COPS;
+
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return ATI_EXCT; /* executing, because response is passed by callback function */
+  }
+  
+#else /* no FF_ATI_BAT */
+
+  TRACE_FUNCTION("setatPercentCOPS()");
+  ret = sAT_PercentCOPS (srcId,mode,format,op);
+  switch (ret)
+  {
+  case (AT_CMPL):                         /*operation completed*/
+    break;
+  case (AT_EXCT):
+    src_params->curAtCmd = AT_CMD_P_COPS;
+    break;
+  default:
+    cmdCmeError(CME_ERR_Unknown);         /*Command failed*/
+    break;
+  }
+  return (map_aci_2_ati_rslt(ret));
+
+#endif /* no FF_ATI_BAT */
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : tesatPercentCOPS         |
++--------------------------------------------------------------------+
+
+  PURPOSE : %COPS command (operator test)
+*/
+
+
+GLOBAL T_ATI_RSLT tesatPercentCOPS (char *cl, UBYTE srcId)
+{
+  T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+
+#ifdef FF_ATI_BAT
+  TRACE_FUNCTION("tesatPercentCOPS() calls bat_send() <=== as APPLICATION");
+  return atiHandleTestCOPS(srcId);
+
+#else /* FF_ATI_BAT */
+  TRACE_FUNCTION("tesatPercentCOPS()");
+  return atiHandleTestCOPS(cl,srcId);
+#endif /* FF_ATI_BAT */
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : queatPercentCOPS         |
++--------------------------------------------------------------------+
+
+  PURPOSE : %COPS command (operator query)
+*/
+
+
+GLOBAL T_ATI_RSLT queatPercentCOPS (char *cl, UBYTE srcId)
+{
+  CHAR            op[MAX_ALPHA_OPER_LEN] = {0};
+  T_ACI_RETURN    ret = AT_FAIL;
+  T_ACI_COPS_MOD  mode = COPS_MOD_NotPresent;
+  T_ACI_COPS_FRMT format = COPS_FRMT_NotPresent;
+  T_ACI_COPS_SVST svrStatus = COPS_SVST_NotPresent;
+  SHORT           startIdx = 0,
+                  lastIdx = 0;
+  SHORT           pos = 0;
+
+#ifdef  FF_ATI_BAT
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_no_parameter dummy;
+
+    TRACE_FUNCTION("queatPercentCOPS() calls bat_send() <=== as APPLICATION");
+    cmd.ctrl_params = BAT_CMD_QUE_PERCENT_COPS;
+    dummy.bat_dummy = 0xFF;
+    cmd.params.ptr_que_percent_cops = &dummy;
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return ATI_EXCT; /* executing, because response is passed by callback function */
+  }
+#else /* no FF_ATI_BAT */
+
+  TRACE_FUNCTION("queatPercentCOPS()");
+
+  ret = qAT_PercentCOPS(srcId,&mode,&format,&svrStatus,op);
+  if (ret EQ AT_CMPL)
+  {
+    /* Added an empty comma and the service Status parameter */
+    sprintf(g_sa,"%s: %d,%d,\"%s\",,%d","%COPS",mode,format,op,svrStatus);
+    io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
+
+  }
+  else
+  {
+    cmdCmeError(CME_ERR_Unknown);         /*command failed*/
+  }
+  return (map_aci_2_ati_rslt(ret));
+
+#endif /* no FF_ATI_BAT */
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : setatPercentCREG   |
++--------------------------------------------------------------------+
+
+  PURPOSE : %CREG command (Network registration)
+*/
+
+GLOBAL T_ATI_RSLT setatPercentCREG (char *cl, UBYTE srcId)
+{
+  T_ATI_CREG_MOD mode=CREG_MOD_OFF;
+
+  TRACE_FUNCTION("setatPercentCREG()");
+
+  cl=parse(cl,"d",&mode);
+
+  switch(mode)
+  {
+    case CREG_MOD_OFF:
+    case CREG_MOD_ON:
+    case CREG_MOD_LOC_INF_ON:
+      /* user wants to set mode: reset CREG related ATI parameters */
+      ati_creg_init(srcId, PercentCREG_CMD);
+      ati_user_output_cfg[srcId].percent_creg.mod_lac_cid.pres_mode = mode;
+      return ATI_CMPL;
+
+    default:
+      cmdCmeError(CME_ERR_OpNotAllow);
+      return ATI_FAIL;
+  }
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GPRS (8441)                 MODULE  : GACI_CMD           |
+| STATE   : code                        ROUTINE : queatPercentCREG   |
++--------------------------------------------------------------------+
+
+  PURPOSE : %CREG command
+*/
+GLOBAL T_ATI_RSLT queatPercentCREG (char *cl, UBYTE srcId)
+{
+
+#ifndef FF_ATI_BAT
+  T_ACI_CREG_STAT       stat;
+  USHORT                lac, cid;
+  T_ATI_CREG_MOD        mode;
+  T_ACI_P_CREG_GPRS_IND gprs_ind;
+  short                 pos;
+#endif
+
+  TRACE_FUNCTION("queatPercentCREG()");
+
+#ifdef FF_ATI_BAT
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_no_parameter dummy;
+
+    cmd.ctrl_params = BAT_CMD_QUE_PERCENT_CREG;
+    dummy.bat_dummy = 0xFF;
+    cmd.params.ptr_que_percent_creg = &dummy;
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return(ATI_EXCT);
+  } 
+#else /* no FF_ATI_BAT */
+  
+  mode = ati_user_output_cfg[srcId].percent_creg.mod_lac_cid.pres_mode;
+  
+  if (qAT_PercentCREG(srcId, &stat, &lac, &cid, &gprs_ind) NEQ AT_CMPL)
+  {
+    cmdCmeError(CME_ERR_Unknown);
+    return ATI_FAIL;
+  }
+
+  pos = sprintf(g_sa, "%s: %d,%d", "%CREG", mode, stat);
+  
+  if ( (mode EQ CREG_MOD_LOC_INF_ON)  AND
+      (stat EQ CREG_STAT_Reg  OR  stat EQ CREG_STAT_Roam) )
+    pos += sprintf(g_sa+pos, ",\"%04X\",\"%04X\"", lac, cid);
+  else
+    pos += sprintf(g_sa+pos, ",,");
+  
+  sprintf(g_sa+pos,",%d", gprs_ind);
+
+  io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
+  return ATI_CMPL;
+
+#endif /* no FF_ATI_BAT */
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : setatPlusCREG      |
++--------------------------------------------------------------------+
+
+  PURPOSE : +CREG command (Network registration)
+*/
+
+GLOBAL T_ATI_RSLT setatPlusCREG (char *cl, UBYTE srcId)
+{
+  T_ATI_CREG_MOD mode=CREG_MOD_OFF;
+
+  TRACE_FUNCTION("setatPlusCREG()");
+
+  cl=parse(cl,"d",&mode);
+  
+  switch(mode)
+  {
+    case CREG_MOD_OFF:
+    case CREG_MOD_ON:
+    case CREG_MOD_LOC_INF_ON:
+      /* user wants to set mode: reset CREG related ATI parameters */
+      ati_creg_init(srcId, CREG_CMD);
+      ati_user_output_cfg[srcId].creg.mod_lac_cid.pres_mode = mode;
+      return ATI_CMPL;
+
+    default:
+      cmdCmeError(CME_ERR_OpNotAllow);
+      return ATI_FAIL;
+  }
+}
+
+GLOBAL T_ATI_RSLT queatPlusCREG (char *cl, UBYTE srcId)
+{
+  T_ACI_CREG_STAT stat;
+  USHORT          lac, cid;
+  T_ATI_CREG_MOD  mode;
+  short           pos;
+
+  TRACE_FUNCTION("queatPlusCREG()");
+
+  mode = ati_user_output_cfg[srcId].creg.mod_lac_cid.pres_mode;
+
+  if (qAT_PlusCREG(srcId, &stat, &lac, &cid) NEQ AT_CMPL)
+  {
+    cmdCmeError(CME_ERR_Unknown);
+    return ATI_FAIL;
+  }
+
+  pos = sprintf(g_sa, "+CREG: %d,%d", mode, stat);
+
+  if (mode EQ CREG_MOD_LOC_INF_ON)
+  {
+    if (stat EQ CREG_STAT_Reg  OR  stat EQ CREG_STAT_Roam)
+      sprintf(g_sa+pos, ",\"%04X\",\"%04X\"", lac, cid);
+  }
+
+  io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
+  return ATI_CMPL;
+}
+
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : atPlusCopn         |
++--------------------------------------------------------------------+
+
+  PURPOSE : +COPN command (read operator names)
+*/
+
+GLOBAL T_ATI_RSLT setatPlusCOPN (char *cl, UBYTE srcId)
+{
+  SHORT startIdx, lastIdx;
+  T_ACI_COPN_LST operLst;
+  T_COPN_VAR *COPN_Var;
+  UBYTE idx;
+  BOOL  loop;
+  BOOL ret;
+  COPN_Var = &mmShrdPrm.COPN_VAR[srcId];
+
+  TRACE_FUNCTION("setatPlusCOPN()");
+
+  /* read out the PCM list */
+  startIdx = 0;
+  loop     = TRUE;
+
+  do
+  {
+    if ( qAT_PlusCOPN(srcId, COPN_LID_Pcm, startIdx,
+                     &lastIdx, operLst) EQ AT_FAIL )
+      break;
+
+    for( idx=0; idx < MAX_OPER; idx++ )
+    {
+      if ( operLst[idx].numOper[0] EQ 0x0 )
+      {
+        loop = FALSE;
+        break;
+      }
+
+      sprintf(g_sa,"+COPN: \"%s\",\"%s\"",operLst[idx].numOper,
+                                        operLst[idx].alphaOper );
+      io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
+    }
+    startIdx = lastIdx+1;
+  }
+  while( loop );
+
+  /* read out the constant list */
+  startIdx = 0;
+
+  ret = cmd_readCOPNBlock(startIdx,srcId);
+ 
+  if (ret EQ TRUE)
+   return ATI_CMPL;
+  else 
+   return ATI_EXCT;
+ 
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : setatPercentCOPN         |
++--------------------------------------------------------------------+
+
+  PURPOSE : %COPN command (get  MCC and MNC, long name or short name given one of the them)
+*/
+
+GLOBAL T_ATI_RSLT setatPercentCOPN (char *cl, UBYTE srcId)
+{
+  T_ACI_COPS_FRMT format = COPS_FRMT_NotPresent;
+  CHAR            op[MAX_ALPHA_OPER_LEN] = {0};
+  T_ACI_OPER_NTRY * oper_ntry;
+  USHORT i;
+
+  TRACE_FUNCTION ("setatPercentCOPN()");
+
+  cl = parse (cl,"ds", &format, (LONG)MAX_ALPHA_OPER_LEN, op); 
+
+  if ((!cl) OR (format < COPS_FRMT_Long) OR (format > COPS_FRMT_Numeric) OR *op EQ '\0')
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+
+  if (format EQ COPS_FRMT_Numeric)
+  {
+    if ((strlen(op) NEQ (SIZE_MNC + SIZE_MCC -1)) AND 
+        (strlen(op) NEQ (SIZE_MNC + SIZE_MCC)))
+    {
+      cmdCmeError(CME_ERR_OpNotAllow);
+      return ATI_FAIL;
+    }
+
+    for (i = 0; *(op+i) NEQ '\0'; i ++)
+    {
+      if (!((*(op+i) >= '0')AND(*(op+i) <= '9')))
+      {
+        cmdCmeError(CME_ERR_OpNotAllow);
+        return ATI_FAIL;
+      }
+    }
+  }
+
+  ACI_MALLOC (oper_ntry, sizeof (T_ACI_OPER_NTRY));
+
+  if (qAT_PercentCOPN( srcId, format, op, oper_ntry) EQ AT_FAIL)
+  {
+    sprintf (g_sa, "%s", "%COPN: ");
+    io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
+    ACI_MFREE (oper_ntry);
+    return ATI_CMPL; 
+  } 
+
+  if ((oper_ntry->mnc & 0x00F) EQ 0xF)
+  {
+    sprintf (g_sa, "%s\"%s\",\"%s\",\"%03X%02X\",%d", "%COPN: ", oper_ntry->longName, oper_ntry->shrtName,
+             oper_ntry->mcc, oper_ntry->mnc >> 4, oper_ntry->source);
+  }
+  else
+  {
+    sprintf (g_sa, "%s\"%s\",\"%s\",\"%03X%03X\",%d", "%COPN: ", oper_ntry->longName, oper_ntry->shrtName,
+             oper_ntry->mcc, oper_ntry->mnc, oper_ntry->source);
+  }
+  io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
+
+  ACI_MFREE (oper_ntry);
+  return ATI_CMPL;
+
+ 
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : atPlusWS46         |
++--------------------------------------------------------------------+
+
+  PURPOSE : +WS46 command (select wireless network)
+*/
+
+GLOBAL T_ATI_RSLT setatPlusWS46 (char *cl, UBYTE srcId)
+{
+  T_ACI_RETURN ret = AT_FAIL;
+  T_ACI_WS46_MOD mode=WS46_MOD_NotPresent;
+
+  TRACE_FUNCTION("setatPLusWS46()");
+
+  cl = parse(cl,"d",&mode);
+  if (!cl)
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+
+#ifdef FF_ATI_BAT
+
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_cmd_set_plus_ws46 ws46;
+
+    cmd.ctrl_params = BAT_CMD_SET_PLUS_WS46;
+    cmd.params.ptr_set_plus_ws46=&ws46;
+
+    ws46.n=(T_BAT_plus_ws46_n)mode;
+
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return(ATI_EXCT);
+  } 
+
+#else /* no FF_ATI_BAT */
+ 
+  ret=sAT_PlusWS46(srcId,mode);
+
+  if (ret EQ AT_CMPL)
+  {
+    return ATI_CMPL;
+  }
+  else
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+
+#endif /* no FF_ATI_BAT */
+}
+
+GLOBAL T_ATI_RSLT queatPlusWS46 (char *cl, UBYTE srcId)
+{
+  T_ACI_RETURN ret = AT_FAIL;
+  T_ACI_WS46_MOD mode=WS46_MOD_NotPresent;
+
+  TRACE_FUNCTION("queatPLusWS46()");
+
+#ifdef FF_ATI_BAT
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_no_parameter dummy;
+
+    cmd.ctrl_params = BAT_CMD_QUE_PLUS_WS46;
+    dummy.bat_dummy = 0xFF;
+    cmd.params.ptr_que_plus_ws46 = &dummy;
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return(ATI_EXCT);
+  } 
+#else /* no FF_ATI_BAT */
+ 
+  ret = qAT_PlusWS46(srcId,&mode);
+
+  if (ret EQ AT_CMPL)
+  {
+    resp_disp(srcId, cl,"e",&mode);
+    return ATI_CMPL;
+  }
+  else if (ret EQ AT_FAIL)
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+  return (map_aci_2_ati_rslt(ret));
+
+#endif /* no FF_ATI_BAT */
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)             MODULE  :                     |
+| STATE   : code                       ROUTINE :  setatPercentCHPL   |
++--------------------------------------------------------------------+
+
+  PURPOSE : show list of all available entries in the SIM field EF_HPLMNwAcT.
+            
+            Command            Possible Response
+		        %CHPL=oprFrmt      %CHPL: <opr>
+		        %CHPL=?            %CHPL: (list of supported <oprFrmt>s)
+
+            <oprFrmt>:
+              0    long format alphanumeric <opr>
+	            1    short format alphanumeric <opr>
+	            2    numeric <opr>
+
+            <opr>: string type; <oprFrmt> indicates if the format is
+              alphanumeric or numeric.
+              Long alphanumeric can be up to 16 characters.
+	            Short alphanumeric can be up to 8 characters.
+		        Numeric format is the GSM LAI number, which consists of:
+			        3 BCD country code.
+			        2 BCD network code.
+		The returned <opr> string shall not be in BCD format, but
+		in IRA characters converted from BCD. Hence the number
+		will have the structure (CC digit 3)(CC digit 2)(CC digit 1)
+		(NW digit 2)(NW digit 1).
+
+*/
+
+GLOBAL T_ATI_RSLT setatPercentCHPL( char *cl, UBYTE srcId )
+{
+  T_ACI_CHPL_FRMT   format          = CHPL_FRMT_NotPresent;
+
+#ifndef FF_ATI_BAT
+  T_ACI_OPER_NTRY   oper;
+#endif
+
+  T_ACI_RETURN      ret             = AT_FAIL;
+  
+  TRACE_FUNCTION( "setatPercentCHPL()" );
+
+  if (CFUNfun NEQ CFUN_FUN_Full)
+  {
+    TRACE_EVENT_P1("+COPS error: cannot proceed Mobile has no Full CFUN: %d", CFUNfun);
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+
+  /* parse mode */
+  cl = parse (cl, "d", &format);
+  if ((!cl) OR (format > CHPL_FRMT_Numeric) OR (format < CHPL_FRMT_NotPresent))
+  {
+    cmdCmeError (CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+
+#ifdef FF_ATI_BAT
+
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_cmd_set_percent_chpl chpl;
+
+    cmd.ctrl_params = BAT_CMD_SET_PERCENT_CHPL;
+    cmd.params.ptr_set_percent_chpl=&chpl;
+
+    /*
+    *   This relies on T_ACI_CHPL_FRMT and T_BAT_percent_chpl_oprfrmt being
+    *   identical.
+    */
+    chpl.oprfrmt=(T_BAT_percent_chpl_oprfrmt)format;
+
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return(ATI_EXCT);
+  } 
+
+#else /* no FF_ATI_BAT */
+
+  ret = sAT_PercentCHPL (srcId, &oper);
+  if (ret NEQ AT_CMPL)
+  {
+    cmdCmeError(CME_ERR_Unknown);
+    return (ATI_FAIL);
+  }
+
+  switch (format)
+  {
+    case CHPL_FRMT_Long :
+      sprintf(g_sa, "%s: %s", "%CHPL", oper.longName);
+      break;
+  
+    case CHPL_FRMT_Short :
+      sprintf(g_sa, "%s: %s", "%CHPL", oper.shrtName);
+      break;
+      
+    case CHPL_FRMT_Numeric :
+      if ((oper.mnc & 0x00F) EQ 0xF)
+        /*lint -e{702} */
+        sprintf(g_sa, "%s: %03x,%02x", "%CHPL", oper.mcc, oper.mnc >> 4);
+      else
+        sprintf(g_sa, "%s: %03x,%03x", "%CHPL", oper.mcc, oper.mnc);
+      break;
+    
+    default :
+      cmdCmeError(CME_ERR_Unknown);
+      return (ATI_FAIL);
+  }
+  io_sendMessage (srcId, g_sa, ATI_NORMAL_OUTPUT);
+
+  return(ATI_CMPL);
+
+#endif /* no FF_ATI_BAT */
+}
+  
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : setatPlusCTZR      |
++--------------------------------------------------------------------+
+
+  PURPOSE : %CTZR command (Timezone Mode)
+*/
+GLOBAL T_ATI_RSLT setatPlusCTZR (char *cl, UBYTE srcId)
+{
+  T_ACI_CTZR_MODE mode         = CTZR_MODE_OFF;    /* CTZR  */
+  T_ACI_RETURN    ret          = AT_FAIL;
+  
+  TRACE_FUNCTION( "setatPlusCTZR()" );
+
+  /* parse mode */
+  cl = parse (cl, "d", &mode);
+  if ((!cl) OR (mode > CTZR_MODE_ON) OR (mode < CTZR_MODE_OFF))
+  {
+    cmdCmeError (CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+
+  ret = sAT_PlusCTZR (srcId, mode);
+
+  switch (ret)
+  {
+    case (AT_CMPL):                         /*operation completed*/
+      break;
+
+    default:
+      cmdCmeError(CME_ERR_Unknown);         /*Command failed*/
+      break;
+  }
+  return (map_aci_2_ati_rslt(ret));
+
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : queatPlusCTZR      |
++--------------------------------------------------------------------+
+
+  PURPOSE : %CTZR command (Timezone Mode)
+*/
+GLOBAL T_ATI_RSLT queatPlusCTZR (char *cl, UBYTE srcId)
+{
+  T_ACI_CTZR_MODE mode;
+  T_ACI_RETURN      ret = AT_FAIL;
+
+  TRACE_FUNCTION("queatPlusCTZR()");
+
+  ret = qAT_PlusCTZR(srcId, &mode);
+  if (ret NEQ AT_CMPL)
+  {
+    cmdCmeError(CME_ERR_Unknown);
+    return (ATI_FAIL);
+  }
+
+  sprintf(g_sa,"+CTZR: %d", mode);
+  io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
+
+  return ATI_CMPL;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : setatPlusCTZU      |
++--------------------------------------------------------------------+
+
+  PURPOSE : +CTZU command (Timezone Update)
+*/
+GLOBAL T_ATI_RSLT setatPlusCTZU (char *cl, UBYTE srcId)
+{
+  T_ACI_CTZU_MODE mode         = CTZU_MODE_OFF;    /* CTZU  */
+  T_ACI_RETURN    ret          = AT_FAIL;
+  
+  TRACE_FUNCTION( "setatPlusCTZU()" );
+
+  /* parse mode */
+  cl = parse (cl, "d", &mode);
+  if ((!cl) OR (mode > CTZU_MODE_ON) OR (mode < CTZU_MODE_OFF))
+  {
+    cmdCmeError (CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+
+#ifdef FF_ATI_BAT
+
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_cmd_set_plus_ctzu ctzu;
+
+    cmd.ctrl_params = BAT_CMD_SET_PLUS_CTZU;
+    cmd.params.ptr_set_plus_ctzu=&ctzu;
+
+    /*
+    *   This relies on T_ACI_CTZU_MODE and T_BAT_plus_ctzu_onoff being
+    *   identical.
+    */
+    ctzu.onoff=(T_BAT_plus_ctzu_onoff)mode;
+
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return(ATI_EXCT);
+  } 
+
+#else /* no FF_ATI_BAT */
+
+  ret = sAT_PlusCTZU (srcId, mode);
+
+  switch (ret)
+  {
+    case (AT_CMPL):                         /*operation completed*/
+      break;
+
+    default:
+      cmdCmeError(CME_ERR_Unknown);         /*Command failed*/
+      break;
+  }
+  return (map_aci_2_ati_rslt(ret));
+
+#endif /* no FF_ATI_BAT */
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : setatPercentCTZV   |
++--------------------------------------------------------------------+
+
+  PURPOSE : %CTZV command (time and date report)
+*/
+GLOBAL T_ATI_RSLT setatPercentCTZV (char *cl, UBYTE srcId)
+{
+  T_ACI_PCTZV_MODE mode         = PCTZV_MODE_OFF;    /* %CTZV  */
+  T_ACI_RETURN    ret           = AT_FAIL;
+  
+  TRACE_FUNCTION( "setatPercentCTZV()" );
+
+  /* parse mode */
+  cl = parse (cl, "d", &mode);
+  if ((!cl) OR (mode > PCTZV_MODE_ON) OR (mode < PCTZV_MODE_OFF))
+  {
+    cmdCmeError (CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+
+  ret = sAT_PercentCTZV (srcId, mode);
+
+  switch (ret)
+  {
+    case (AT_CMPL):                         /*operation completed*/
+      break;
+
+    default:
+      cmdCmeError(CME_ERR_Unknown);         /*Command failed*/
+      break;
+  }
+  return (map_aci_2_ati_rslt(ret));
+
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : setatPercentCNIV   |
++--------------------------------------------------------------------+
+
+  PURPOSE : %CNIV command (network identity report)
+*/
+GLOBAL T_ATI_RSLT setatPercentCNIV (char *cl, UBYTE srcId)
+{
+  T_ACI_CNIV_MODE mode         = CNIV_MODE_OFF;    /* CNIV  */
+  T_ACI_RETURN    ret          = AT_FAIL;
+  
+  TRACE_FUNCTION( "setatPercentCNIV()" );
+
+  /* parse mode */
+  cl = parse (cl, "d", &mode);
+  if ((!cl) OR (mode > CNIV_MODE_ON) OR (mode < CNIV_MODE_OFF))
+  {
+    cmdCmeError (CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+
+  ret = sAT_PercentCNIV (srcId, mode);
+
+  switch (ret)
+  {
+    case (AT_CMPL):                         /*operation completed*/
+      break;
+
+    default:
+      cmdCmeError(CME_ERR_Unknown);         /*Command failed*/
+      break;
+  }
+  return (map_aci_2_ati_rslt(ret));
+
+}
+
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : queatPlusCTZU      |
++--------------------------------------------------------------------+
+
+  PURPOSE : +CTZU query command (Timezone update)
+*/
+GLOBAL T_ATI_RSLT queatPlusCTZU (char *cl, UBYTE srcId)
+{
+#ifndef FF_ATI_BAT
+  T_ACI_CTZU_MODE mode;
+  T_ACI_RETURN      ret = AT_FAIL;
+#endif
+
+  TRACE_FUNCTION("queatPlusCTZU()");
+
+#ifdef FF_ATI_BAT
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_no_parameter dummy;
+
+    cmd.ctrl_params = BAT_CMD_QUE_PLUS_CTZU;
+    dummy.bat_dummy = 0xFF;
+    cmd.params.ptr_que_plus_ctzu = &dummy;
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return(ATI_EXCT);
+  } 
+#else /* no FF_ATI_BAT */
+
+  ret = qAT_PlusCTZU(srcId, &mode);
+  if (ret NEQ AT_CMPL)
+  {
+    cmdCmeError(CME_ERR_Unknown);
+    return (ATI_FAIL);
+  }
+
+  sprintf(g_sa,"+CTZU: %d", mode);
+  io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
+
+  return ATI_CMPL;
+
+#endif /* no FF_ATI_BAT */
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : queatPercentCTZV   |
++--------------------------------------------------------------------+
+
+  PURPOSE : %CTZV command (time and date report)
+*/
+GLOBAL T_ATI_RSLT queatPercentCTZV (char *cl, UBYTE srcId)
+{
+  T_ACI_PCTZV_MODE mode;
+  T_ACI_RETURN      ret = AT_FAIL;
+
+  TRACE_FUNCTION("queatPercentCTZV()");
+
+  ret = qAT_PercentCTZV(srcId, &mode);
+  if (ret NEQ AT_CMPL)
+  {
+    cmdCmeError(CME_ERR_Unknown);
+    return (ATI_FAIL);
+  }
+
+  sprintf(g_sa,"%s: %d","%CTZV", mode);
+  io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
+
+  return ATI_CMPL;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : queatPercentCNIV   |
++--------------------------------------------------------------------+
+
+  PURPOSE : %CNIV command (time and date report)
+*/
+GLOBAL T_ATI_RSLT queatPercentCNIV (char *cl, UBYTE srcId)
+{
+  T_ACI_CNIV_MODE mode;
+  T_ACI_RETURN      ret = AT_FAIL;
+
+  TRACE_FUNCTION("queatPercentCNIV()");
+
+  ret = qAT_PercentCNIV(srcId, &mode);
+  if (ret NEQ AT_CMPL)
+  {
+    cmdCmeError(CME_ERR_Unknown);
+    return (ATI_FAIL);
+  }
+  sprintf(g_sa,"%s: %d","%CNIV", mode);
+  io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
+
+  return ATI_CMPL;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : setatPercentTREG   |
++--------------------------------------------------------------------+
+
+  PURPOSE : %CWUP command (force power campaign)
+*/
+
+GLOBAL T_ATI_RSLT setatPercentCWUP (char *cl, UBYTE srcId)
+{
+  T_ACI_RETURN    ret          = AT_FAIL;
+  T_ACI_CWUP_TYPE type;
+  
+  TRACE_FUNCTION( "setatPercentCWUP()" );
+
+  /* parse mode */
+  cl = parse (cl, "d", &type);
+  if ((!cl) OR (type NEQ CWUP_TYPE_RR))
+  {
+    cmdCmeError (CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+
+#ifdef FF_ATI_BAT
+
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_cmd_set_percent_cwup cwup;
+
+    cmd.ctrl_params = BAT_CMD_SET_PERCENT_CWUP;
+    cmd.params.ptr_set_percent_cwup=&cwup;
+
+    /*
+    *   This relies on T_ACI_CWUP_TYPE and T_BAT_percent_cwup_type being
+    *   identical.
+    */
+    cwup.type=(T_BAT_percent_cwup_type)type;
+
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return(ATI_EXCT);
+  } 
+
+#else /* no FF_ATI_BAT */
+
+  ret = sAT_PercentCWUP (srcId, type);
+
+  switch (ret)
+  {
+    case (AT_CMPL):                         /*operation completed*/
+      break;
+
+    default:
+      cmdCmeError(CME_ERR_Unknown);         /*Command failed*/
+      break;
+  }
+  return (map_aci_2_ati_rslt(ret));
+
+#endif /* no FF_ATI_BAT */
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : atPlusCIND         |
++--------------------------------------------------------------------+
+
+  PURPOSE : +CIND command
+            (configures the signal strength and SMS full indication)
+*/
+GLOBAL T_ATI_RSLT setatPlusCIND (char *cl, UBYTE srcId)
+{
+  T_ACI_RETURN tRet = AT_FAIL;
+  T_ACI_MM_CIND_VAL_TYPE sCindSettings;
+
+  TRACE_FUNCTION("setatPLusCIND()");
+
+  if (!cl)
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+
+  sCindSettings.sCindSignalParam  = 0;
+  sCindSettings.sCindSmsFullParam = 0;
+
+  cl = parse(cl,"dd", &sCindSettings.sCindSignalParam,
+                      &sCindSettings.sCindSmsFullParam);
+
+  if ((sCindSettings.sCindSignalParam < CIND_SIGNAL_INDICATOR_LVL0 ||
+      sCindSettings.sCindSignalParam > CIND_SIGNAL_INDICATOR_LVL5) ||
+     (sCindSettings.sCindSmsFullParam < CIND_SMSFULL_INDICATOR_MEMAVAIL ||
+      sCindSettings.sCindSmsFullParam > CIND_SMSFULL_INDICATOR_MEMFULL))
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+
+#ifdef FF_ATI_BAT
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_cmd_set_plus_cind cind;
+
+    /*
+    *   Without this we will lose track of the source ID by the time the
+    *   response arrives.
+    */
+    srcId_cb=srcId;
+
+    cmd.ctrl_params = BAT_CMD_SET_PLUS_CIND;
+    cmd.params.ptr_set_plus_cind=&cind;
+
+    /*
+    *   This relies on T_ACI_CIND_SIGNAL_TYPE being identical to
+    *   T_BAT_plus_cind_signal_ctrl and T_ACI_CIND_SMSFULL_TYPE being
+    *   identical to T_BAT_plus_cind_smsfull_ctrl.
+    */
+    cind.signal_ctrl=(T_BAT_plus_cind_signal_ctrl)sCindSettings.sCindSignalParam;
+    cind.smsfull_ctrl=(T_BAT_plus_cind_smsfull_ctrl)sCindSettings.sCindSmsFullParam;
+
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return(ATI_EXCT);
+  } 
+#else /* no FF_ATI_BAT */
+
+  tRet = sAT_PlusCIND( srcId, sCindSettings.sCindSignalParam,
+                              sCindSettings.sCindSmsFullParam );
+
+  if (tRet EQ AT_FAIL)
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+  return ATI_CMPL;
+
+#endif /* no FF_ATI_BAT */
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : queatPlusCIND      |
++--------------------------------------------------------------------+
+
+  PURPOSE : +CIND query command
+            (query the configured unsolicited signal strength 
+             and SMS full indication settings)
+*/
+GLOBAL T_ATI_RSLT queatPlusCIND ( char *cl, UBYTE srcId )
+{
+#ifndef FF_ATI_BAT
+  T_ACI_RETURN           sRet = AT_FAIL;
+  T_ACI_MM_CIND_VAL_TYPE sCindSettings;
+#endif
+
+  TRACE_FUNCTION("queatPlusCIND()");
+
+#ifdef FF_ATI_BAT
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_no_parameter dummy;
+
+    cmd.ctrl_params = BAT_CMD_QUE_PLUS_CIND;
+    dummy.bat_dummy = 0xFF;
+    cmd.params.ptr_que_plus_cind = &dummy;
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return(ATI_EXCT);
+  } 
+#else /* no FF_ATI_BAT */
+
+  sRet = qAT_PlusCIND( srcId, &sCindSettings.sCindSignalParam,
+                              &sCindSettings.sCindSmsFullParam );
+
+  if ( sCindSettings.sCindSignalParam  == CIND_SIGNAL_INDICATOR_INVALID )  { sCindSettings.sCindSignalParam  = CIND_SIGNAL_INDICATOR_LVL0; }
+  if ( sCindSettings.sCindSmsFullParam == CIND_SMSFULL_INDICATOR_INVALID ) { sCindSettings.sCindSmsFullParam = CIND_SMSFULL_INDICATOR_MEMAVAIL; }
+
+  if (sRet EQ AT_CMPL)
+  {
+    resp_disp( srcId, cl,"ee", &sCindSettings.sCindSignalParam,
+                               &sCindSettings.sCindSmsFullParam );
+    return ATI_CMPL;
+  }
+  else
+  { /* error case */
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+
+#endif /* no FF_ATI_BAT */
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : atPlusCMER         |
++--------------------------------------------------------------------+
+
+  PURPOSE : +CMER command
+            (configures the kind of indication handling toward terminal)
+*/
+GLOBAL T_ATI_RSLT setatPlusCMER ( char *cl, UBYTE srcId )
+{
+//  UINT                   uiBufferCounter;
+  T_ACI_RETURN           tRet = AT_FAIL;
+  T_ACI_MM_CMER_VAL_TYPE sCmerSettings;
+  T_ACI_MM_CMER_VAL_TYPE sOldCmerSettings;
+  T_ACI_MM_CMER_VAL_TYPE sEnteredCmerSettings;
+  UINT                   uiDummy1 = 0u;
+  UINT                   uiDummy2 = 0u;
+
+  TRACE_FUNCTION("setatPLusCMER()");
+
+  if (!cl)
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+
+  sCmerSettings.sCmerModeParam = CMER_MODE_INVALID;
+  sCmerSettings.sCmerIndParam  = CMER_INDICATOR_INVALID;
+  sCmerSettings.sCmerBfrParam  = CMER_BFR_INVALID;
+
+  cl = parse(cl,"ddddd", &sCmerSettings.sCmerModeParam,
+                       &uiDummy1,
+                       &uiDummy2,
+                       &sCmerSettings.sCmerIndParam,
+                       &sCmerSettings.sCmerBfrParam );
+
+  if ((sCmerSettings.sCmerModeParam < CMER_MODE_INVALID||
+      sCmerSettings.sCmerModeParam > CMER_MODE_2) ||
+     (sCmerSettings.sCmerIndParam < CMER_INDICATOR_INVALID||
+      sCmerSettings.sCmerIndParam > CMER_INDICATOR_2) ||
+     (sCmerSettings.sCmerBfrParam < CMER_BFR_INVALID||
+      sCmerSettings.sCmerBfrParam > CMER_BFR_1) ||
+     (uiDummy1 != 0u) || ((uiDummy2 != 0u)))
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+
+  cmhMM_GetCmerSettings( srcId, &sOldCmerSettings );
+
+  sEnteredCmerSettings.sCmerModeParam = sCmerSettings.sCmerModeParam;
+
+#ifdef FF_ATI_BAT
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_cmd_set_plus_cmer cmer;
+
+    /*
+    *   Without this we will lose track of the source ID by the time the
+    *   response arrives.
+    */
+    srcId_cb=srcId;
+
+    cmd.ctrl_params = BAT_CMD_SET_PLUS_CMER;
+    cmd.params.ptr_set_plus_cmer=&cmer;
+
+    cmer.ind_option=BAT_CMER_IND_OPTION_NOT_PRESENT;
+
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return(ATI_EXCT);
+  } 
+#else /* no FF_ATI_BAT */
+
+  tRet = sAT_PlusCMER( srcId, sCmerSettings.sCmerModeParam,
+                              sCmerSettings.sCmerIndParam,
+                              sCmerSettings.sCmerBfrParam );
+  if (tRet EQ AT_FAIL)
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+
+  if ( sCmerSettings.sCmerModeParam == CMER_MODE_INVALID )      { sCmerSettings.sCmerModeParam = sOldCmerSettings.sCmerModeParam; }
+  if ( sCmerSettings.sCmerIndParam  == CMER_INDICATOR_INVALID ) { sCmerSettings.sCmerIndParam  = sOldCmerSettings.sCmerIndParam; }
+  if ( sCmerSettings.sCmerBfrParam  == CMER_BFR_INVALID )       { sCmerSettings.sCmerBfrParam  = sOldCmerSettings.sCmerBfrParam; }
+  if ( sCmerSettings.sCmerIndParam  == CMER_INDICATOR_INVALID ) { sCmerSettings.sCmerIndParam  = 0; }
+  if ( sCmerSettings.sCmerBfrParam  == CMER_BFR_INVALID )       { sCmerSettings.sCmerBfrParam  = 0; }
+
+  switch( sCmerSettings.sCmerModeParam )
+  {
+    case CMER_MODE_INVALID :
+    case CMER_MODE_0 :
+    { /* always buffer --> do nothing */
+      break;
+    }
+    case CMER_MODE_1 :
+    case CMER_MODE_2 :
+    { /* flush and/or clear buffer */
+      if ( (sEnteredCmerSettings.sCmerModeParam == CMER_MODE_1) ||
+          (sEnteredCmerSettings.sCmerModeParam == CMER_MODE_2) )
+      {
+        if ( sCmerSettings.sCmerBfrParam == CMER_BFR_0 )
+        {
+          cmd_clearCievBuf( srcId );
+        }
+        else
+        { /* BFR == '2' */
+          cmd_flushCievBuf( srcId );
+        }
+        
+      }
+      break;
+    }
+    default :
+    { /* error case */
+      cmdCmeError(CME_ERR_OpNotAllow);
+      return ATI_FAIL;
+    }
+  }
+  return ATI_CMPL;
+
+#endif /* no FF_ATI_BAT */
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : queatPlusCMER      |
++--------------------------------------------------------------------+
+
+  PURPOSE : +CMER query command
+            (query the configured indication handling settings 
+             toward terminal )
+*/
+GLOBAL T_ATI_RSLT queatPlusCMER ( char *cl, UBYTE srcId )
+{
+#ifndef FF_ATI_BAT
+  T_ACI_RETURN           sRet = AT_FAIL;
+  T_ACI_MM_CMER_VAL_TYPE sCmerSettings;
+  UINT                   uiDummy = 0u;
+#endif
+
+  TRACE_FUNCTION("queatPLusCMER()");
+
+#ifdef FF_ATI_BAT
+  {
+    T_BAT_cmd_send cmd;
+    T_BAT_no_parameter dummy;
+
+    cmd.ctrl_params = BAT_CMD_QUE_PLUS_CMER;
+    dummy.bat_dummy = 0xFF;
+    cmd.params.ptr_que_plus_cmer = &dummy;
+    bat_send(ati_bat_get_client(srcId), &cmd);
+    return(ATI_EXCT);
+  } 
+#else /* no FF_ATI_BAT */
+
+  sRet = qAT_PlusCMER( srcId, &sCmerSettings.sCmerModeParam,
+                              &sCmerSettings.sCmerIndParam,
+                              &sCmerSettings.sCmerBfrParam );
+
+  if (sRet NEQ AT_CMPL)
+  { 
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return ATI_FAIL;
+  }
+
+  if ( sCmerSettings.sCmerModeParam == CMER_MODE_INVALID ) { sCmerSettings.sCmerModeParam = CMER_MODE_0; };
+  if ( sCmerSettings.sCmerIndParam  == CMER_MODE_INVALID ) { sCmerSettings.sCmerIndParam  = CMER_INDICATOR_0; };
+  if ( sCmerSettings.sCmerBfrParam  == CMER_MODE_INVALID ) { sCmerSettings.sCmerBfrParam  = CMER_BFR_0; };
+
+  resp_disp( srcId, cl,"eeeee",&sCmerSettings.sCmerModeParam,
+                             &uiDummy,
+                             &uiDummy,
+                             &sCmerSettings.sCmerIndParam,
+                             &sCmerSettings.sCmerBfrParam );
+  return ATI_CMPL;
+
+#endif /* no FF_ATI_BAT */
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : cmd_flushCievBuf   |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function flushes the buffer for storing new signal-
+            and/or SMS-full indications while the serial interface is
+            released from data transmission.
+*/
+GLOBAL void cmd_flushCievBuf ( UBYTE srcId )
+{
+  UINT                   uiBufferCounter;
+  UINT                   uiTempLastIndex;
+  T_ACI_MM_CIND_VAL_TYPE sCindValues;
+  T_ACI_MM_CMER_VAL_TYPE sCmerSettings;
+
+  TRACE_FUNCTION("cmd_flushCievBuf");
+
+  /* Signal buffer */
+  uiTempLastIndex = asCievSignalBuf.uiLastIndex;
+  cmhMM_GetCmerSettings(srcId, &sCmerSettings);
+  for( uiBufferCounter=0; uiBufferCounter < uiTempLastIndex; uiBufferCounter++ )
+  {
+    sCindValues.sCindSignalParam = asCievSignalBuf.asBufferValues[uiBufferCounter];
+    sCindValues.sCindSmsFullParam = CIND_SMSFULL_INDICATOR_INVALID;
+    rCI_PlusCIEV( sCindValues, sCmerSettings );
+    asCievSignalBuf.asBufferValues[uiBufferCounter] = CIND_SIGNAL_INDICATOR_INVALID;
+    asCievSignalBuf.uiLastIndex--;
+  }
+
+  /* SMS Full buffer */
+  uiTempLastIndex = asCievSmsFullBuf.uiLastIndex;
+  for( uiBufferCounter=0; uiBufferCounter < uiTempLastIndex; uiBufferCounter++ )
+  {
+    sCindValues.sCindSmsFullParam = asCievSmsFullBuf.asBufferValues[uiBufferCounter];
+    sCindValues.sCindSignalParam  = CIND_SIGNAL_INDICATOR_INVALID;
+    rCI_PlusCIEV( sCindValues, sCmerSettings );
+    asCievSmsFullBuf.asBufferValues[uiBufferCounter] = CIND_SMSFULL_INDICATOR_INVALID;
+    asCievSmsFullBuf.uiLastIndex--;
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : cmd_clearCievBuf   |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function clear the buffer for storing new signal-
+            and/or SMS-full indications
+*/
+GLOBAL void cmd_clearCievBuf ( UBYTE srcId )
+{
+    UBYTE tSrc;
+ 
+    for( tSrc=0; tSrc < CIEV_BUF_SIZE; tSrc++ )
+    {
+      asCievSignalBuf.asBufferValues[tSrc]  = CIND_SIGNAL_INDICATOR_INVALID;
+      asCievSmsFullBuf.asBufferValues[tSrc] = CIND_SMSFULL_INDICATOR_INVALID;
+    }
+    asCievSignalBuf.uiLastIndex  = 0u;
+    asCievSmsFullBuf.uiLastIndex = 0u;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : cmd_PlusCOPN_CB   |
++--------------------------------------------------------------------+
+
+  PURPOSE : Call back function for cmd_PlusCOPN_CB
+*/
+
+GLOBAL void cmd_PlusCOPN_CB ( UBYTE src_id )
+{
+  SHORT startIdx;
+  UBYTE curCmd;
+  T_ATI_SRC_PARAMS *src_params;
+  T_COPN_VAR *COPN_Var;
+  BOOL ret;
+
+
+  COPN_Var = &mmShrdPrm.COPN_VAR[src_id];
+
+
+  startIdx = COPN_Var->Start_Count;
+
+   
+  TRACE_FUNCTION("cmd_PlusCOPN_CB()");
+
+  ret = cmd_readCOPNBlock(startIdx,src_id);
+
+  if (ret EQ TRUE)
+  {
+    src_params = find_element (ati_src_list, src_id, search_ati_src_id);
+    curCmd = src_params->curAtCmd;
+    R_AT( RAT_OK, src_id )
+     ( curCmd );
+  }
+}
+
+GLOBAL BOOL cmd_readCOPNBlock( SHORT startIdx, UBYTE src_id )
+{
+  SHORT lastIdx;
+  UBYTE idx;
+  T_ACI_COPN_LST operLst;
+  T_COPN_VAR *COPN_Var;
+  
+  COPN_Var = &mmShrdPrm.COPN_VAR[src_id];
+  
+  TRACE_FUNCTION("cmd_readCOPNBlock()");
+
+  if( qAT_PlusCOPN(src_id, COPN_LID_Cnst, startIdx,
+                     &lastIdx, operLst) EQ AT_FAIL )
+     return TRUE;
+  
+  for( idx=0; idx < MAX_OPER; idx++ )
+  {
+   if( operLst[idx].numOper[0] EQ 0x0 )
+     return TRUE;
+   
+  sprintf(g_sa,"+COPN: \"%s\",\"%s\"",operLst[idx].numOper,
+                                        operLst[idx].alphaOper );
+  io_sendMessage(src_id, g_sa, ATI_NORMAL_OUTPUT);
+  }
+  startIdx = lastIdx+1;
+  COPN_Var->Start_Count = startIdx;
+  return FALSE;
+}
+
+
+#endif /* ATI_MM_C */