diff g23m/condat/ms/src/aci/ati_ss.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/ms/src/aci/ati_ss.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,1083 @@
+/* 
++----------------------------------------------------------------------------- 
+|  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: Supplementary Service related commands.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef ATI_SS_C
+#define ATI_SS_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 FF_ATI_BAT
+
+#include "typedefs.h"
+#include "gdd.h"
+#include "bat.h"
+
+#include "ati_bat.h"
+
+#endif /*FF_ATI_BAT*/
+
+typedef struct
+{
+  char *name;
+  T_ACI_CPWD_FAC fac;
+} net_fac;
+
+const net_fac fac[] =
+{
+  {"SC",  CPWD_FAC_Sc},
+  {"AO",  CPWD_FAC_Ao},
+  {"OI",  CPWD_FAC_Oi},
+  {"OX",  CPWD_FAC_Ox},
+  {"AI",  CPWD_FAC_Ai},
+  {"IR",  CPWD_FAC_Ir},
+  {"AB",  CPWD_FAC_Ab},
+  {"AG",  CPWD_FAC_Ag},
+  {"AC",  CPWD_FAC_Ac},
+  {"FD",  CPWD_FAC_Fd},
+  {"PN",  CPWD_FAC_Pn},  /* Network personalisation of the ME */
+  {"PU",  CPWD_FAC_Pu},  /* Network subset personalisation of the ME */
+  {"PP",  CPWD_FAC_Pp},  /* Service provider personalisation of the ME */
+  {"PC",  CPWD_FAC_Pc},  /* Corporate personalisation of the ME */
+  {"PS",  CPWD_FAC_Ps},     /* SIM personalisation */
+  {"PF",  CPWD_FAC_Pf},      /* Personalisation on first inserted SIM */
+  {"AL",  CPWD_FAC_Al}, /* ALS settings locked by CHV2 */
+  {"P2",  CPWD_FAC_P2},
+  #ifdef SIM_PERS
+  {"FC",  CLCK_FAC_Fc},
+  {"FM",  CLCK_FAC_Fcm},
+  #endif
+  {0,     CPWD_FAC_NotPresent}
+};
+
+#ifdef SIM_PERS
+
+typedef struct
+{
+  char *name;
+  T_SUP_INFO_TYPE sup_info;
+} net_mepd_sup_info;
+
+const net_mepd_sup_info mepd_sup_info[] =
+{
+  {"MAX",  FCMAX},
+  {"ALE",   FCATTEMPTSLEFT},
+  {"RFM",   FCRESETFAILMAX},
+  {"RFA",   FCRESETFAILATTEMPTSLEFT},
+  {"RSM",  FCRESETSUCCESSMAX},
+  {"RSA",  FCRESETSUCCESSATTEMPTSLEFT},
+  {"TMF",  TIMERFLAG},
+  {"ETF",   ETSIFLAG},
+  {"AIF",   AIRTELINDFLAG},
+  {0,         CMEPD_SUP_INFO_NotPresent}
+};
+
+#endif
+GLOBAL char           dialBuf[MAX_DIAL_LEN];
+GLOBAL char           subBuf[MAX_SUBADDR_LEN];
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : setatPlusCTFR      |
++--------------------------------------------------------------------+
+
+  PURPOSE : +CTFR command (Call TRansfer, Call Deflection)
+*/
+GLOBAL T_ATI_RSLT setatPlusCTFR (char * cl, UBYTE srcId)
+{
+  T_ACI_RETURN  ret = AT_FAIL;
+  T_ACI_TOA     type;
+  T_ACI_TOA    *p_type;
+  T_ACI_TOS     satype;
+  T_ACI_TOS    *p_satype;
+  CHAR         *subadr = subBuf;
+  SHORT         toa_oct = 0;
+  SHORT         tos_oct = 0;
+  CHAR          numBuf[MAX_B_SUBSCR_NUM_LEN];
+
+  T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+
+  src_params->curAtCmd = AT_CMD_CTFR;
+
+  /* init */
+  p_type   = &type;
+  p_satype = &satype;
+  memset( numBuf, 0, sizeof(numBuf));
+  memset( subadr, 0, MAX_SUBADDR_LEN);
+
+  cl = parse(cl,"srsr",(LONG)MAX_B_SUBSCR_NUM_LEN, numBuf, &toa_oct,
+                     (LONG)MAX_SUBADDR_LEN, subadr, &tos_oct);
+
+  /* Process number parameter (mandatory) */
+  if(!cl OR numBuf[0] EQ '\0')
+  {
+    /* Number is mandatory. No number parameter => error */
+    cmdCmeError (CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+
+  /* Process Type Of Address (optional) */
+  if(toa_oct EQ 0)
+  {
+    /* Type Of Address not present */
+    p_type = NULL;
+  }
+  else
+  {
+    /* Type Of Address present */
+    type = toa_demerge (toa_oct);
+    if (type.ton < 0 OR type.npi < 0)
+    {
+      cmdCmeError (CME_ERR_OpNotAllow);
+      return (ATI_FAIL);
+    }
+  }
+
+  /* Process subadr (optional) */
+  if( subadr[0] EQ 0 )
+  {
+    /* subadr not present */
+    subadr = NULL;
+  }
+
+  /* Process Type Of Subaddress (optional) */
+  if(tos_oct EQ 0)
+  {
+    /* Type Of Subaddress not present */
+    p_satype = NULL;
+  }
+  else
+  {
+    satype = tos_demerge (tos_oct);
+    if (satype.tos < 0 OR satype.oe < 0)
+    {
+      cmdCmeError (CME_ERR_OpNotAllow);
+      return (ATI_FAIL);
+    }
+  }    
+
+#ifdef FF_ATI_BAT
+  {
+  T_BAT_cmd_send cmd;
+  T_BAT_cmd_set_plus_ctfr my_bat_set_plus_ctfr;
+
+  TRACE_FUNCTION("setatPlusCTFR() calls bat_send() <=== as APPLICATION");
+
+  memset(&my_bat_set_plus_ctfr, 0, sizeof(my_bat_set_plus_ctfr));
+  cmd.ctrl_params = BAT_CMD_SET_PLUS_CTFR;
+  cmd.params.ptr_set_plus_ctfr = &my_bat_set_plus_ctfr;
+
+  my_bat_set_plus_ctfr.c_number = strlen(numBuf);
+  memcpy(my_bat_set_plus_ctfr.number, numBuf, my_bat_set_plus_ctfr.c_number);
+  my_bat_set_plus_ctfr.type = (S16)p_type;
+  my_bat_set_plus_ctfr.v_subaddr = 0; //???
+  my_bat_set_plus_ctfr.c_subaddr = strlen(subadr);
+  memcpy(my_bat_set_plus_ctfr.subaddr, subadr, my_bat_set_plus_ctfr.c_subaddr);
+  my_bat_set_plus_ctfr.satype = (S16)p_satype;
+
+  bat_send(ati_bat_get_client(srcId), &cmd);
+
+  return ATI_EXCT; /* executing, because response is passed by callback function */
+  }
+#else /* OLD FUNCTION BODY */
+
+  TRACE_FUNCTION("setatPlusCTFR()");
+
+  ret = sAT_PlusCTFR (srcId, numBuf, p_type, subadr, p_satype);
+
+  if (ret NEQ AT_EXCT)
+  {
+    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 : atiSShandleCSSN         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Handles the +CSSN and %CSSN set commands.*/
+
+GLOBAL T_ATI_RSLT atiSShandleCSSN (char* cl, UBYTE srcId)
+{
+int cssiMode = ati_user_output_cfg[srcId].CSSI_stat, cssuMode = ati_user_output_cfg[srcId].CSSU_stat;
+
+  TRACE_FUNCTION("atiSShandleCSSN()");
+
+  if (*cl EQ 0 OR *cl EQ ';')
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+  cl = parse(cl,"dd",&cssiMode,&cssuMode);
+  /* A value of 2 for cssiMode is now accepted. This value will only be set by %CSSN */
+  if(!cl OR cssiMode > 2 OR cssiMode < 0 OR 
+            cssuMode > 1 OR cssuMode < 0    )
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+  ati_user_output_cfg[srcId].CSSI_stat=(UBYTE)cssiMode;
+  ati_user_output_cfg[srcId].CSSU_stat=(UBYTE)cssuMode;
+
+  if (*cl NEQ '\0' AND *cl NEQ ';')
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+  return (ATI_CMPL);
+
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : atPlusCSSN         |
++--------------------------------------------------------------------+
+
+  PURPOSE : +CSSN command (supplementary service notifications)
+*/
+GLOBAL T_ATI_RSLT setatPlusCSSN (char* cl, UBYTE srcId)
+{
+  TRACE_FUNCTION("setatPLusCSSN()");
+
+  /*Check that the range of the first parameter "CSSI mode" is valid (0 or 1).Further parameters are
+  checked in the function atiSShandleCSSN()*/
+  if ((*cl EQ '0') || (*cl EQ '1') || (*cl EQ ','))
+      return atiSShandleCSSN(cl,srcId);
+  else
+ {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+  }
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : atPercentCSSN         |
++--------------------------------------------------------------------+
+
+  PURPOSE : %CSSN command (supplementary service notifications extension)
+*/
+GLOBAL T_ATI_RSLT setatPercentCSSN (char* cl, UBYTE srcId)
+{
+  TRACE_FUNCTION("setatPercentCSSN()");
+
+      return atiSShandleCSSN(cl,srcId);
+}
+
+
+
+GLOBAL T_ATI_RSLT queatPlusCSSN (char* cl, UBYTE srcId)
+{
+  TRACE_FUNCTION("queatPLusCSSN()");
+
+  resp_disp(srcId, cl,"bb",&ati_user_output_cfg[srcId].CSSI_stat,&ati_user_output_cfg[srcId].CSSU_stat);
+  return (ATI_CMPL);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : queatPercentCSSN         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Handles the %CSSN query command.*/
+
+
+GLOBAL T_ATI_RSLT queatPercentCSSN (char* cl, UBYTE srcId)
+{
+  TRACE_FUNCTION("queatPercentCSSN()");
+
+  resp_disp(srcId, cl,"bb",&ati_user_output_cfg[srcId].CSSI_stat,&ati_user_output_cfg[srcId].CSSU_stat);
+  return (ATI_CMPL);
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : atPlusCCFC         |
++--------------------------------------------------------------------+
+
+  PURPOSE : +CCFC call forwarding
+*/
+
+GLOBAL T_ATI_RSLT setatPlusCCFC(char *cl, UBYTE srcId)
+{
+  T_ACI_RETURN        ret = AT_FAIL;
+  T_ACI_CCFC_RSN      reason=CCFC_RSN_NotPresent;
+  T_ACI_CCFC_MOD      mode=CCFC_MOD_NotPresent;
+  T_ACI_TOA           type;
+  T_ACI_TOA          *p_type;
+  T_ACI_TOS           satype;
+  T_ACI_TOS          *p_satype;
+  T_ACI_CLASS         class_type=CLASS_NotPresent;
+  CHAR               *subadr = subBuf;
+  SHORT               time=-1;
+  SHORT               toa_oct=0;
+  SHORT               tos_oct=0;
+  CHAR                numBuf[MAX_B_SUBSCR_NUM_LEN];
+  T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+  
+  /* init */
+  memset( numBuf, 0, sizeof(numBuf));
+  memset( subadr, 0, MAX_SUBADDR_LEN);
+
+  TRACE_FUNCTION("setatPLusCCFC()");
+
+  p_type=&type;
+  p_satype=&satype;
+
+  cl = parse(cl,"ddsrdsrr",&reason,&mode,
+           (LONG)MAX_B_SUBSCR_NUM_LEN,numBuf,&toa_oct,&class_type,
+           (LONG)MAX_SUBADDR_LEN,subadr,&tos_oct,&time);
+
+  if(!cl)
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+  if (mode EQ 2)                                                             /*query mode*/
+  {
+#ifdef  FF_ATI_BAT
+    {
+      T_BAT_cmd_send cmd;
+      T_BAT_cmd_set_plus_ccfc my_bat_set_plus_ccfc = {0};
+
+      TRACE_FUNCTION("setatPlusCCFC() {Query mode=2} calls bat_send() <=== as APPLICATION");
+
+      cmd.ctrl_params = BAT_CMD_SET_PLUS_CCFC;
+      cmd.params.ptr_set_plus_ccfc = &my_bat_set_plus_ccfc;
+
+      my_bat_set_plus_ccfc.reason = (T_BAT_plus_ccfc_reason)reason;
+      my_bat_set_plus_ccfc.mode = (T_BAT_plus_ccfc_mode)mode;
+      my_bat_set_plus_ccfc.bearer_class = (T_BAT_plus_ccfc_bearer_class)class_type;
+      src_params->curAtCmd = AT_CMD_CCFC;
+
+      bat_send(ati_bat_get_client(srcId), &cmd);
+      return ATI_EXCT; /* executing, because response is passed by callback function */
+    }
+#else /* no FF_ATI_BAT */
+    ret = qAT_PlusCCFC(srcId,reason,class_type);
+    switch (ret)
+    {
+      case AT_EXCT:
+      {
+        src_params->curAtCmd    = AT_CMD_CCFC;
+        return (ATI_EXCT);
+      }
+      case AT_BUSY:
+      {
+        TRACE_EVENT("setatPLusCCFC(): qAT_PlusCCFC returns BUSY");
+        return (ATI_BUSY);
+      }
+      case AT_FAIL:
+      {
+        TRACE_EVENT("setatPLusCCFC(): qAT_PlusCCFC returns FAIL");
+        cmdCmeError(CME_ERR_Unknown); /* Extended error returned by qAT_PlusCCFC */
+        return (ATI_FAIL);
+      }
+      default:
+      {
+        cmdCmeError(CME_ERR_Unknown);
+        return (ATI_FAIL);
+      }
+    }
+#endif /* no FF_ATI_BAT */
+  }
+  else                                                                    /*set mode*/
+  {
+    if( subadr[0] EQ 0 )
+    {
+      /* subadr has been omitted in command */
+      subadr = NULL;
+    }
+
+    if(toa_oct EQ 0)
+      p_type=NULL;
+    else
+    {
+      type=toa_demerge(toa_oct);
+      if (type.ton < 0 OR type.npi < 0)
+      {
+        cmdCmeError(CME_ERR_OpNotAllow);
+        return (ATI_FAIL);
+      }
+    }
+    if(tos_oct EQ 0)
+      p_satype=NULL;
+    else
+    {
+      satype=tos_demerge(tos_oct);
+      if(satype.tos < 0 OR satype.oe < 0)
+      {
+        cmdCmeError(CME_ERR_OpNotAllow);
+        return (ATI_FAIL);
+      }
+    }
+#ifdef  FF_ATI_BAT
+    {
+       T_BAT_cmd_send cmd;
+       T_BAT_cmd_set_plus_ccfc my_bat_set_plus_ccfc = {0};
+
+      TRACE_FUNCTION("setatPlusCCFC() calls bat_send() <=== as APPLICATION");
+
+      cmd.ctrl_params = BAT_CMD_SET_PLUS_CCFC;
+      cmd.params.ptr_set_plus_ccfc = &my_bat_set_plus_ccfc;
+
+      my_bat_set_plus_ccfc.reason = (T_BAT_plus_ccfc_reason)reason;
+      my_bat_set_plus_ccfc.mode = (T_BAT_plus_ccfc_mode)mode;
+
+      /* check for number string and store for BAT send */
+      if (my_bat_set_plus_ccfc.c_number = strlen(numBuf))
+      {
+        my_bat_set_plus_ccfc.v_number = TRUE;
+        memcpy(my_bat_set_plus_ccfc.number, numBuf, my_bat_set_plus_ccfc.c_number);
+      }
+
+      my_bat_set_plus_ccfc.type = (S16)toa_oct;
+
+      /* check for subaddr string and store for BAT send */
+      if (subadr NEQ NULL &&
+          (my_bat_set_plus_ccfc.c_subaddr = strlen(subadr)))
+      {
+        my_bat_set_plus_ccfc.v_subaddr = TRUE;
+        memcpy(my_bat_set_plus_ccfc.subaddr, subadr, my_bat_set_plus_ccfc.c_subaddr);
+      }
+
+      my_bat_set_plus_ccfc.satype = (S16)tos_oct;
+      my_bat_set_plus_ccfc.bearer_class = (T_BAT_plus_ccfc_bearer_class)class_type;
+      my_bat_set_plus_ccfc.time = (T_BAT_plus_ccfc_time)time;
+
+      src_params->curAtCmd = AT_CMD_CCFC;
+
+      bat_send(ati_bat_get_client(srcId), &cmd);
+      return ATI_EXCT; /* executing, because response is passed by callback function */
+    }
+#else /* no FF_ATI_BAT */
+    if( numBuf[0] EQ '\0' )
+    {
+      /* number has been omitted in command */
+      ret = sAT_PlusCCFC(srcId,reason,mode,NULL,p_type,class_type,subadr,p_satype,time);
+    }
+    else
+    {
+      ret = sAT_PlusCCFC(srcId,reason,mode,numBuf,p_type,class_type,subadr,p_satype,time);
+    }
+    if (ret EQ AT_EXCT)
+    {
+      src_params->curAtCmd    = AT_CMD_CCFC;
+    }
+    else
+    {
+      cmdCmeError(CME_ERR_Unknown);
+    }
+#endif /* no FF_ATI_BAT */
+  }
+  return (map_aci_2_ati_rslt(ret));
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : atPlusCLCK         |
++--------------------------------------------------------------------+
+
+  PURPOSE : +CLCK command (Select facility lock settings)
+*/
+
+GLOBAL T_ATI_RSLT setatPlusCLCK(char *cl, UBYTE srcId)
+{
+  T_ACI_RETURN   ret = AT_FAIL;
+  T_ACI_CLCK_FAC fac_num = CLCK_FAC_NotPresent;
+  T_ACI_CLCK_MOD mod = CLCK_MOD_NotPresent;
+  T_ACI_CLASS    class_type = CLASS_NotPresent;
+  char           passwd[MAX_PWD_LENGTH] = {0};
+  char           fac_str[3] = {0,0,0};
+  USHORT         i;
+  
+  T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+
+  src_params->curAtCmd = AT_CMD_CLCK;
+  TRACE_FUNCTION("setatPLusCLCK() ");
+
+  cl = parse(cl, "sdnd", (LONG)3, fac_str, &mod, (LONG)MAX_PWD_LENGTH, passwd, &class_type);
+  
+  if (!cl OR *fac_str EQ 0)
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+  strcpy(fac_str, strupper(fac_str));
+  for (i=0;fac[i].name != 0; i++)
+  {
+    if (strcmp(fac[i].name, fac_str) EQ 0 )
+    {
+      fac_num = fac[i].fac;           /*translates facility string in facility number */
+      break;
+    }
+  }
+  if (fac_num EQ CLCK_FAC_NotPresent) /* facility non existent*/
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+
+#ifdef FF_ATI_BAT
+  {
+  T_BAT_cmd_send cmd;
+  T_BAT_cmd_set_plus_clck my_bat_set_plus_clck;
+
+  TRACE_FUNCTION("setatPLusCLCK() calls bat_send() <=== as APPLICATION");
+
+  memset(&my_bat_set_plus_clck, 0, sizeof(my_bat_set_plus_clck));
+  cmd.ctrl_params = BAT_CMD_SET_PLUS_CLCK;
+  cmd.params.ptr_set_plus_clck = &my_bat_set_plus_clck;
+
+  my_bat_set_plus_clck.fac = fac_num;                     
+ my_bat_set_plus_clck.mode = mod;
+  if(mod NEQ CLCK_MODE_QUERY) /*query mode*/
+  {
+    my_bat_set_plus_clck.v_passwd = 1;                
+    my_bat_set_plus_clck.c_passwd = strlen(passwd);                
+    memcpy(my_bat_set_plus_clck.passwd, passwd, my_bat_set_plus_clck.c_passwd);
+  }
+
+  my_bat_set_plus_clck.bearer_class = class_type;             
+
+  bat_send(ati_bat_get_client(srcId), &cmd);
+
+  return ATI_EXCT; /* executing, because response is passed by callback function */
+  }
+#else /* OLD FUNCTION BODY */
+  {
+  T_ACI_CLSSTAT  clsStat;
+  SHORT          pos;
+
+  TRACE_FUNCTION("setatPLusCLCK()");
+  
+  if (mod EQ CLCK_MOD_NotPresent) /* mode non existent*/
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return(ATI_FAIL);
+  }
+
+  if (mod EQ CLCK_MODE_QUERY) /*query mode*/
+  {
+    ret = qAT_PlusCLCK(srcId, fac_num, class_type, &clsStat);
+    if(ret EQ AT_CMPL)
+    {
+
+      pos = sprintf(g_sa,"+CLCK: ");
+
+      if (clsStat.status NEQ STATUS_NotPresent) 
+      {
+        pos += sprintf(g_sa+pos,"%d,",clsStat.status);
+      }
+      else
+      {
+        pos += sprintf(g_sa+pos,",");
+      }
+      if (clsStat.class_type NEQ CLASS_NotPresent)
+      {
+        pos += sprintf(g_sa+pos,"%d,",clsStat.class_type);
+      }
+
+      ci_remTrailCom(g_sa, pos);
+      io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
+      return (ATI_CMPL);
+    }
+  }
+  else /*set mode*/
+  {
+    ret = sAT_PlusCLCK(srcId, fac_num, mod, passwd, class_type);
+  }
+
+  switch(ret)
+  {
+  case(AT_EXCT):
+    break;
+
+  case(AT_BUSY):
+    cmdCmeError(CME_ERR_Unknown);
+    TRACE_EVENT("ME is busy");
+    break;
+
+  case(AT_FAIL):
+    cmdCmeError(CME_ERR_Unknown);
+    break;
+  }
+  return (map_aci_2_ati_rslt(ret));
+  }
+#endif /* no FF_ATI_BAT*/
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : atPlusCPWD         |
++--------------------------------------------------------------------+
+
+  PURPOSE : +CPWD command (changes password)
+*/
+
+GLOBAL T_ATI_RSLT setatPlusCPWD(char *cl, UBYTE srcId)
+{
+  T_ACI_RETURN        ret = AT_FAIL;
+  T_ACI_CPWD_FAC      fac_num = CPWD_FAC_NotPresent;
+  CHAR                oldpwd[MAX_PWD_LENGTH]={0};
+  CHAR                newpwd[MAX_PWD_LENGTH]={0};
+  CHAR                fac_str[3]={0};
+  T_ACI_CPWD_LST      cpwdLst={0};
+  USHORT              i;
+
+  T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+
+  src_params->curAtCmd = AT_CMD_CPWD;
+
+  cl = parse(cl, "snn", (LONG)3, fac_str, (LONG)MAX_PWD_LENGTH, oldpwd, (LONG)MAX_PWD_LENGTH, newpwd);
+  strcpy(fac_str, (char *)strupper(fac_str));
+  if(!cl OR *fac_str EQ 0 OR *oldpwd EQ 0 OR *newpwd EQ 0)
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+  for (i = 0; fac[i].name NEQ 0; i++)
+  {
+    if (strcmp(fac[i].name,fac_str) EQ 0 )
+    {
+      fac_num=fac[i].fac;           /*translates facility string in facility number */
+      break;
+    }
+  }
+  if (fac[i].name EQ 0)                   /* facility non existent*/
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+#ifdef FF_ATI_BAT
+  {
+  T_BAT_cmd_send cmd;
+  T_BAT_cmd_set_plus_cpwd my_bat_set_plus_cpwd;
+
+  TRACE_FUNCTION("setatPLusCPWD() calls bat_send() <=== as APPLICATION");
+
+  memset(&my_bat_set_plus_cpwd, 0, sizeof(my_bat_set_plus_cpwd));
+  cmd.ctrl_params = BAT_CMD_SET_PLUS_CPWD;
+  cmd.params.ptr_set_plus_cpwd = &my_bat_set_plus_cpwd;
+
+  my_bat_set_plus_cpwd.fac = fac_num;       
+  my_bat_set_plus_cpwd.c_oldpwd = strlen(oldpwd);  
+  memcpy(my_bat_set_plus_cpwd.oldpwd, oldpwd, my_bat_set_plus_cpwd.c_oldpwd); 
+  my_bat_set_plus_cpwd.c_newpwd = strlen(newpwd); 
+  memcpy(my_bat_set_plus_cpwd.newpwd, newpwd, my_bat_set_plus_cpwd.c_newpwd); 
+
+  bat_send(ati_bat_get_client(srcId), &cmd);
+
+  return ATI_EXCT; /* executing, because response is passed by callback function */
+  }
+#else /* OLD FUNCTION BODY */
+
+  TRACE_FUNCTION("setatPLusCPWD()");
+
+  ret = sAT_PlusCPWD(srcId, fac_num, oldpwd, newpwd);
+  if (ret EQ AT_CMPL)
+  {
+    return (ATI_CMPL);
+  }
+  else if (ret EQ AT_EXCT)
+  {
+    src_params->curAtCmd = AT_CMD_CPWD;
+  }
+  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 : atPlusCUSD         |
++--------------------------------------------------------------------+
+
+  PURPOSE : +CUSD Unstructured supplementary data
+*/
+GLOBAL T_ATI_RSLT setatPlusCUSD(char *cl, UBYTE srcId)
+{
+  T_ACI_RETURN     ret                     = AT_FAIL;
+  T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+  CHAR             ussd    [MAX_USSD_LEN]  = {0x00};
+  USHORT           lenUssd                 = 0;
+
+#ifndef FF_ATI_BAT
+  T_ACI_USSD_DATA  cvtdUssd;
+  T_ACI_USSD_DATA* p_cvtdUssd              = NULL;
+  USHORT           lenCvtdUssd             = 0;
+#endif
+
+  SHORT            dcs                     = ACI_NumParmNotPresent,
+                   stat                    = ACI_NumParmNotPresent;
+  BOOL             status_changed          = FALSE;
+
+  TRACE_FUNCTION("setatPlusCUSD()");
+
+  cl = parse(cl,"rzr",
+           &stat,
+           (LONG)MAX_USSD_LEN,
+           strlen(cl),
+           cl,
+           &lenUssd,
+           ussd,
+           &dcs);
+
+  if(cl EQ NULL OR 
+     stat > 2)
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+
+  if(stat EQ 2)
+  {
+    /* CANCEL ONGOING USSD OPERATION */
+    ret = sAT_end_ussd(srcId);
+  }
+  else
+  {
+    if (dcs EQ 17 AND ati_user_output_cfg[srcId].cscsChset NEQ CSCS_CHSET_Ucs2)
+    {
+      cmdCmeError(CME_ERR_OpNotAllow);    /* it makes no sense if TE<->MS is GSM7 but we talk to the Network
+                                             in UCS2 since afterwards we need to convert it back to GSM7 and
+                                             we will loose some characters */
+      return (ATI_FAIL);
+    }
+
+    if (stat NEQ ACI_NumParmNotPresent )
+    {
+      /* SET CUSD Presentation Flag only for values stat 0 and 1 */
+      ati_user_output_cfg[srcId].CUSD_stat = (UBYTE)stat;
+      status_changed = TRUE;
+    }
+
+    if (dcs EQ ACI_NumParmNotPresent )
+    {
+      /* GSM 03.38 [25] Cell Broadcast Data Coding Scheme in integer format (default 0) */
+      dcs = 0;
+    }
+
+    srcId_cb = srcId;
+
+#ifdef FF_ATI_BAT
+
+    {
+      T_BAT_cmd_send cmd;
+      T_BAT_cmd_set_plus_cusd cusd;
+
+      cmd.ctrl_params=BAT_CMD_SET_PLUS_CUSD;
+      cmd.params.ptr_set_plus_cusd=&cusd;
+
+      /*
+      *   This is the only possible value for 'n', as the other is
+      *   dealt with further up this function.
+      */
+      cusd.n=BAT_CUSD_N_NOT_PRESENT;
+
+      /*
+      *   Simplest thing to do is copy in as much data as the BAT
+      *   structure can handle. If there is too much we won't
+      *   overwrite memory.
+      */
+      memcpy(cusd.str,ussd,BAT_MAX_USSD_LEN);
+
+      /*
+      *   Set the length. If there is too much data it will
+      *   effectively be truncated.
+      */
+      cusd.c_str=(U8)((lenUssd>BAT_MAX_USSD_LEN) ? BAT_MAX_USSD_LEN:lenUssd);
+      cusd.v_str=TRUE;
+
+      cusd.dcs=(S16)dcs;
+
+      bat_send(ati_bat_get_client(srcId), &cmd);
+
+      src_params->curAtCmd=AT_CMD_CUSD;
+
+      return(ATI_EXCT);
+    }
+
+#else /* no FF_ATI_BAT */
+
+    utl_ussdDtaFromTe ((UBYTE*)ussd,
+                       lenUssd,
+                       (UBYTE*)cvtdUssd.data,
+                       &lenCvtdUssd, 
+                       (UBYTE)dcs);
+  
+    cvtdUssd.len = (UBYTE)lenCvtdUssd;
+  
+    if (cvtdUssd.len NEQ 0)
+    {
+      p_cvtdUssd=&cvtdUssd;
+    }
+
+    if( p_cvtdUssd NEQ NULL ) 
+    {
+      ret = sAT_PlusCUSD(srcId, p_cvtdUssd, dcs);
+    }
+    else
+    {
+      if (lenUssd NEQ 0)
+      {
+        cmdCmeError(CME_ERR_Unknown);
+        return (ATI_FAIL);
+      }
+    }
+#endif /* no FF_ATI_BAT */
+    
+  }
+
+  if (ret EQ AT_CMPL)
+  {
+    return (ATI_CMPL);
+  }
+  else if (ret EQ AT_EXCT)
+  {
+    src_params->curAtCmd    = AT_CMD_CUSD;
+    return (ATI_EXCT);
+  }
+  else if(status_changed)
+  {
+    return (ATI_CMPL);
+  }
+
+  cmdCmeError(CME_ERR_Unknown);
+  return (ATI_FAIL);
+}
+
+GLOBAL T_ATI_RSLT queatPlusCUSD(char *cl, UBYTE srcId)
+{
+  TRACE_FUNCTION("queatPlusCUSD()");
+
+  resp_disp(srcId, cl,"b",&ati_user_output_cfg[srcId].CUSD_stat);
+  return (ATI_CMPL);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : atPercentCSCN      |
++--------------------------------------------------------------------+
+
+  PURPOSE : %CSCN - network service change notifications
+*/
+GLOBAL T_ATI_RSLT setatPercentCSCN (char *cl, UBYTE srcId)
+{
+  T_ACI_SS_CSCN_MOD_STATE     ss_switch    = SS_CSCN_MOD_STATE_INVALID;
+  T_ACI_SS_CSCN_MOD_DIRECTION ss_direction = SS_CSCN_MOD_DIR_INVALID;
+  T_ACI_CC_CSCN_MOD_STATE     cc_switch    = CC_CSCN_MOD_STATE_INVALID;
+  T_ACI_CC_CSCN_MOD_DIRECTION cc_direction = CC_CSCN_MOD_DIR_INVALID;
+
+  TRACE_FUNCTION("setatPercentCSCN()");
+
+  if((cl EQ NULL) OR (*cl EQ '\0'))  /* No parameter passed ?? */
+  {
+      cmdCmeError(CME_ERR_OpNotAllow);
+      return (ATI_FAIL);
+  }
+
+  cl = parse(cl,"dddd", &ss_switch, &ss_direction, &cc_switch, &cc_direction);
+
+   /* valid parameter ?? */
+  if( (ss_switch    >= SS_CSCN_MOD_STATE_MAX)       OR
+      (ss_direction >= SS_CSCN_MOD_DIR_MAX) OR
+      (cc_switch    >= CC_CSCN_MOD_STATE_MAX)       OR
+      (cc_direction >= CC_CSCN_MOD_DIR_MAX)    )
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+
+  if (sAT_PercentCSCN( srcId, ss_switch, ss_direction, cc_switch, cc_direction ) NEQ AT_CMPL)
+    return (ATI_FAIL);
+
+  return (ATI_CMPL);
+}
+
+/* ------------------------------------------------------------------------- */
+GLOBAL T_ATI_RSLT queatPercentCSCN (char* cl, UBYTE srcId)
+/* ------------------------------------------------------------------------- */
+{
+  T_ACI_SS_CSCN_MOD_STATE     ss_switch;
+  T_ACI_SS_CSCN_MOD_DIRECTION ss_direction;
+  T_ACI_CC_CSCN_MOD_STATE     cc_switch;
+  T_ACI_CC_CSCN_MOD_DIRECTION cc_direction;
+
+  TRACE_FUNCTION("queatPercentCSCN()");
+
+  if (qAT_PercentCSCN( srcId, &ss_switch, &ss_direction, &cc_switch, &cc_direction ) NEQ AT_CMPL)
+    return (ATI_FAIL);
+
+  if( ss_switch    EQ SS_CSCN_MOD_STATE_INVALID )  ss_switch    = SS_CSCN_MOD_STATE_OFF;
+  if( ss_direction EQ SS_CSCN_MOD_DIR_INVALID )    ss_direction = SS_CSCN_MOD_DIR_IN;
+  if( cc_switch    EQ CC_CSCN_MOD_STATE_INVALID )  cc_switch    = CC_CSCN_MOD_STATE_OFF;
+  if( cc_direction EQ CC_CSCN_MOD_DIR_INVALID )    cc_direction = CC_CSCN_MOD_DIR_IN;
+
+  resp_disp(srcId, cl, "ssss", &ss_switch, &ss_direction, &cc_switch, &cc_direction);
+  return (ATI_CMPL);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : ACI_CMD            |
+| STATE   : code                        ROUTINE : setatPercentCUSDR  |
++--------------------------------------------------------------------+
+
+  PURPOSE : %CUSDR - Extended response for n/w initiated USSD.
+*/
+GLOBAL T_ATI_RSLT setatPercentCUSDR(char* cl, UBYTE srcId)
+{
+  T_ACI_CUSDR_RES response;
+  T_ACI_RETURN ret   = AT_FAIL;
+
+  T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+
+  TRACE_FUNCTION("setatPercentCUSDR()");
+
+  cl = parse(cl,"d",&response);
+  
+  if(!cl)
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+
+  ret = sAT_PercentCUSDR(srcId, response);
+
+  return (map_aci_2_ati_rslt(ret));
+
+}
+
+
+
+#ifdef SIM_PERS
+
+/* ----------Added on 11/03/2005--------------------*/
+/*-------------For %MEPD AT comand----------------- */
+/* ------------------------------------------------------------------------- */
+/*
++------------------------------------------------------------------------------
+|  Function    : setatPercentMEPD
++------------------------------------------------------------------------------
+|  Description : For %MEPD= AT comand
+|
+|  Parameters  :char* cl        
+|         UBYTE srcId   
+|
+|  Return      :     ATI_FAIL            -  at command failed
+|                    ATI_FAIL_NO_OUTPUT  -  at command failed with no output
+|                    ATI_BUSY            -  ATI busy
+|                    ATI_EXCT            -  ATI is executing the command
+|                    ATI_CMPL            -  at command successfully executed
+|                    ATI_CMPL_NO_OUTPUT  -  at command successfully executed with no output
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL T_ATI_RSLT setatPercentMEPD (char* cl, UBYTE srcId)
+/* ------------------------------------------------------------------------- */
+{
+  T_ACI_RETURN  ret = AT_FAIL; 
+  char           sup_info_str[4] = {0,0,0,0};
+  T_SUP_INFO_TYPE sup_info_num = CMEPD_SUP_INFO_NotPresent;
+  T_SUP_INFO sup_info;  /*return Value of MEPD CFG Data */
+  USHORT         i;
+ T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
+
+  src_params->curAtCmd = AT_CMD_MEPD;
+  TRACE_FUNCTION("setatPercentMEPD()");
+    
+  /*input functionality*/
+  cl = parse (cl,"s",(LONG)4, sup_info_str);
+  
+  if ( !cl OR (sup_info_str[0] EQ 0))
+  {
+    cmdCmeError (CME_ERR_OpNotAllow);
+    return  (ATI_FAIL);
+  }
+  
+  strcpy(sup_info_str, strupper(sup_info_str));
+  for (i=0;mepd_sup_info[i].name != 0; i++)
+  {
+    if (strcmp(mepd_sup_info[i].name, sup_info_str) EQ 0 )
+    {
+      sup_info_num = mepd_sup_info[i].sup_info;           /*translates facility string in facility number */
+      break;
+    }
+  }
+  if (sup_info_num EQ CMEPD_SUP_INFO_NotPresent) /* facility non existent*/
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return (ATI_FAIL);
+  }
+
+  sup_info.infoType=sup_info_num;
+  ret = qAT_PercentMEPD(srcId, &sup_info);
+  if (ret EQ AT_CMPL)
+  {
+    resp_disp(srcId,cl,"b", &sup_info.datavalue);
+    return (ATI_CMPL);
+  }
+  else
+  {
+    cmdCmeError(CME_ERR_OpNotAllow);
+    return  (ATI_FAIL);
+  }
+
+}
+
+#endif //SIM_PERS
+#endif /* ATI_SS_C */
\ No newline at end of file