view src/g23m-aci/aci/cmh_mms.c @ 516:1ed9de6c90bd

src/g23m-gsm/sms/sms_for.c: bogus malloc removed The new error handling code that was not present in TCS211 blob version contains a malloc call that is bogus for 3 reasons: 1) The memory allocation in question is not needed in the first place; 2) libc malloc is used instead of one of the firmware's proper ways; 3) The memory allocation is made inside a function and then never freed, i.e., a memory leak. This bug was caught in gcc-built FreeCalypso fw projects (Citrine and Selenite) because our gcc environment does not allow any use of libc malloc (any reference to malloc produces a link failure), but this code from TCS3.2 is wrong even for Magnetite: if this code path is executed repeatedly over a long time, the many small allocations made by this malloc call without a subsequent free will eventually exhaust the malloc heap provided by the TMS470 environment, malloc will start returning NULL, and the bogus code will treat it as an error. Because the memory allocation in question is not needed at all, the fix entails simply removing it.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 22 Jul 2018 06:04:49 +0000
parents 53929b40109c
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  Project :  GSM-PS (6147)
|  Modul   :  CMH_MMS
+----------------------------------------------------------------------------- 
|  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 :  This module provides the set functions related to the
|             protocol stack adapter for mobility management.
+----------------------------------------------------------------------------- 
*/ 

#ifndef CMH_MMS_C
#define CMH_MMS_C
#endif

#include "aci_all.h"

/*==== INCLUDES ===================================================*/
#include "aci_cmh.h"

#include "rtc.h"

#ifdef DTI
#include "dti.h"      /* functionality of the dti library */
#include "dti_conn_mng.h"
#endif

#include "aci_mem.h"

#ifdef FAX_AND_DATA
/* #include "aci_fd.h" */
#endif    /* of #ifdef FAX_AND_DATA */

#include "psa.h"
#include "psa_sim.h"
#include "psa_mm.h"
#include "cmh.h"
#include "cmh_sim.h"
#include "cmh_mm.h"

#include "psa_cc.h"
#include "cmh_cc.h"

#ifdef GPRS
  #include "gaci.h"
  #include "gaci_cmh.h"
  #include "psa_gmm.h"
  #include "cmh_gmm.h"
#endif

#ifndef _SIMULATION_
/***************************/
/* TEMPORARY until NVM     */
/* just to get FFs !!!! */
#ifndef GPRS
#define DONT_LET_FFSH_DEF_GPRS
#endif

#include "ffs/ffs.h"

#include "rx.h"

#include "rtc.h"

#ifdef FF_TIMEZONE
#include "rv/rv_general.h"
#include "rtc/rtc_tz.h"
#endif

/* check whether latter has defined GPRS !!! */
#ifdef DONT_LET_FFSH_DEF_GPRS
#undef GPRS
#endif

#undef DONT_LET_FFSH_DEF_GPRS
/***************************/
#endif /* _SIMULATION_ */


/*==== CONSTANTS ==================================================*/

/*==== EXPORT =====================================================*/

/*==== VARIABLES ==================================================*/

/*==== FUNCTIONS ==================================================*/
EXTERN void wake_up_rr (void);

#ifdef TI_PS_FF_AT_P_CMD_CTREG
EXTERN BOOL cl_shrd_set_treg_val(T_TREG *treg);
#endif /* TI_PS_FF_AT_P_CMD_CTREG */

#ifndef _SIMULATION_
LOCAL void rx_Cb (drv_SignalID_Type *signal_params);
LOCAL UCHAR rx_sequence_Cb (void* arg);
#endif /* _SIMULATION_ */


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

  PURPOSE : This is the functional counterpart to the %BAND AT command
            which is responsible for configuring the way the mobile
            deals with multiband.

            <bandMode>: band switch mode.
            <bandType>: band selection by user: coded in bitfield as following.            
            Bit set to 1 if band is set, 0 otherwise...
       
     BITS:  |    5   |   4   |    3    |    2    |    1   |      
            | GSM850 | E_GSM | GSM1900 | GSM1800 | GSM900 |
*/

GLOBAL T_ACI_RETURN sAT_PercentBAND(T_ACI_CMD_SRC   srcId,
                                    T_ACI_BAND_MODE bandMode,
                                    UBYTE           bandType)
{
  UBYTE ManufacturerBands;
  UBYTE ubyte_dummy;

  TRACE_FUNCTION("sAT_PercentBAND()");

  /* check command source */
  if(!cmh_IsVldCmdSrc (srcId))
  {
    return( AT_FAIL );
  }

  /* Check Parameter bandMode */
  switch( bandMode )
  {
  case( BAND_MODE_Auto ):
    bandType = 0x00;    /* scan all */
    break;

  case( BAND_MODE_Manual ):
    /* Check Parameter bandType */
    if(cmhMM_getBandSettings(&ubyte_dummy, &ManufacturerBands))
    {
      TRACE_FUNCTION("cmhMM_getBandSettings: data reading from FFS successful");
    }
    else
    {
      TRACE_FUNCTION("cmhMM_getBandSettings: data reading from FFS failed");
    }


    if( !cmhMM_isBandAllowed(bandType, ManufacturerBands) )
    {
      TRACE_EVENT_P1("Band combination %d is not supported by this hardware", bandType);
      ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
      return( AT_FAIL );
    }
    break;
  
  default:
    ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
    return( AT_FAIL );
  }

  if( !cmhMM_writeSetBand(bandType) )
    return(AT_FAIL);

  /* switch off radio */
  if( CFUNfun EQ CFUN_FUN_Full )
  {
    /* if mobile is on, proceed a soft switch off
     and then switch back on */
    mmEntStat.curCmd = AT_CMD_BAND;

    return( sAT_PlusCFUN( srcId,
                          CFUN_FUN_Disable_TX_RX_RF,
                          CFUN_RST_NotPresent) );
  }
  else
  {
    /* new configuration has been written to Flash and that's it ! */
    return( AT_CMPL);
  }
}

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

  PURPOSE : This is the functional counterpart to the +COPS AT command
            which is responsible for selection and deselection of an
            network operator.

            <mode>:   registration mode.
            <format>: format of operator selection
            <oper>:   operator string
*/

GLOBAL T_ACI_RETURN sAT_PlusCOPS ( T_ACI_CMD_SRC srcId,
                                   T_ACI_COPS_MOD mode,
                                   T_ACI_COPS_FRMT format,
                                   CHAR * oper )
{
  return(sat_Plus_Percent_COPS(srcId,
                               mode,
                               format,
                               oper,
                               AT_CMD_COPS));
}


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

  PURPOSE : This is the functional counterpart to the %COPS AT command
            which is responsible for selection and deselection of an
            network operator. %COPS will add, in principle, 
            the following functionality to the standard AT command +COPS: 
           
            -Possibility to query the "service status" in which the phone is currently registered; 
              the possible values will be "full service", "limited service" or  "no service".
            -Possibility to select the "last registered" operator using  %COPS=1. 


            <mode>:   registration mode.
            <format>: format of operator selection
            <oper>:   operator string
*/

GLOBAL T_ACI_RETURN sAT_PercentCOPS ( T_ACI_CMD_SRC srcId,
                                   T_ACI_COPS_MOD mode,
                                   T_ACI_COPS_FRMT format,
                                   CHAR * oper )
{
  return(sat_Plus_Percent_COPS(srcId,
                               mode,
                               format,
                               oper,
                               AT_CMD_P_COPS));
}

#ifdef TI_PS_FF_AT_CMD_WS46
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)         MODULE  : CMH_MMS                  |
| STATE   : code                  ROUTINE : sAT_PlusWS46             |
+--------------------------------------------------------------------+

  PURPOSE : This is the functional counterpart to the +WS46 AT
            command which is responsible to select wireless network.

            <mode>: network mode.
*/

GLOBAL T_ACI_RETURN sAT_PlusWS46   (T_ACI_CMD_SRC srcId,
                                    T_ACI_WS46_MOD mode )
{

  TRACE_FUNCTION ("sAT_PlusWS46()");

/*
 *-------------------------------------------------------------------
 * process the value parameter
 *-------------------------------------------------------------------
 */
  if( mode NEQ ACI_NumParmNotPresent )
  {
    if( mode NEQ WS46_MOD_Gsm )
    {
      ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
      return( AT_FAIL );
    }
  }

  return( AT_CMPL );
}
#endif /* TI_PS_FF_AT_CMD_WS46 */


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

  PURPOSE : This is the functional counterpart to the %ALS AT command
            which is responsible for testing if ALS mode is present.
            (always if an E-Plus Sim-card is detected or the if the CSP
            field is present on the inserted Sim-card and enables
            ALS mode).

            
*/
GLOBAL T_ACI_RETURN tAT_PercentALS  ( T_ACI_CMD_SRC srcId, T_ACI_ALS_MOD *ALSmode )

{ 
  TRACE_FUNCTION ("tAT_PercentALS()");

  if( !cmh_IsVldCmdSrc( srcId ) )
  {
    return( AT_FAIL );
  }

#if defined(FF_BAT) && defined(_SIMULATION_)
  /* test command %ALS is not used anymore by BAT.lib, change CMD MODE only for host tests */
  if(aci_cmd_src_mode_get(srcId) EQ CMD_MODE_BAT)
  {
    aci_cmd_src_mode_set((UBYTE)srcId, CMD_MODE_ATI);
  }
#endif /* FF_BAT && _SIMULATION_ */  

  /* E-Plus SIM-Card inserted (mcc=0x262, mnc=0x03) ? */
  if (cmhSIM_plmn_is_hplmn(0x262, 0x03F))
  {
    *ALSmode = (T_ACI_ALS_MOD)(ALS_MOD_SPEECH | ALS_MOD_AUX_SPEECH);
    return (AT_CMPL);
  }

  simEntStat.curCmd = AT_CMD_ALS;
  simShrdPrm.owner = (T_OWN)srcId; 
  simEntStat.entOwn =  srcId;

  ccShrdPrm.als_cmd = ALS_CMD_TEST;
  *ALSmode = ALS_MOD_NOTPRESENT;

  cmhCC_checkALS_Support();
  return (AT_EXCT);
}



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

  PURPOSE : This is the functional counterpart to the %NRG AT command
            which is responsible for the setting of registration mode
            and service mode.

            <regMode>: registration mode.
            <srvMode>: service mode.
*/

GLOBAL T_ACI_RETURN sAT_PercentNRG( T_ACI_CMD_SRC  srcId,
                                    T_ACI_NRG_RGMD regMode,
                                    T_ACI_NRG_SVMD srvMode,
                                    T_ACI_NRG_FRMT oprFrmt,
                                    CHAR          *opr)
{
  T_MM_CMD_PRM * pMMCmdPrm;  /* points to MM command parameters */

 
  TRACE_FUNCTION ("sAT_PercentNRG()");


  pMMCmdPrm = &cmhPrm[srcId].mmCmdPrm;


/*
 *-------------------------------------------------------------------
 * check MM entity status
 *-------------------------------------------------------------------
 */
  if( mmEntStat.curCmd NEQ AT_CMD_NONE )

    return( AT_BUSY );




 /*
 *-------------------------------------------------------------------
 * process the oprFrmt,svrMode and regMode parameters
 *-------------------------------------------------------------------
 */
  switch( oprFrmt )
  {
    case( NRG_FRMT_NotPresent ):
      oprFrmt = pMMCmdPrm -> NRGoprFrmt;
      break;
    case( NRG_FRMT_Long  ):
    case( NRG_FRMT_Short ):
    case( NRG_FRMT_Numeric ):
      break;
    default:
      ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
      return( AT_FAIL );
  }   

  if( srvMode EQ NRG_SVMD_NotPresent ) 
    srvMode=(T_ACI_NRG_SVMD)pMMCmdPrm->NRGregMode;

  if( regMode EQ NRG_RGMD_NotPresent ) 
    regMode=pMMCmdPrm->NRGregMode;



/* Set the value of the current command executed */
  mmEntStat.curCmd  = AT_CMD_NRG;  


  return cmhMM_OperatorSelect(srcId,regMode,srvMode,oprFrmt,opr);
}

/*
+--------------------------------------------------------------------+
| PROJECT : ACI/MMI                 MODULE  : CMH_MMS                  |
| STATE   : code                    ROUTINE : sAT_PercentCSQ             |
+--------------------------------------------------------------------+

  PURPOSE : This is the function for Signal Quality 
  Param:
  srcId:    command ID;
  CSQmode:  enable(1) or disable(0) CSQ

  Shen,Chao
  Juni.13th, 2003
*/

GLOBAL T_ACI_RETURN sAT_PercentCSQ( T_ACI_CMD_SRC  srcId,
                                    T_ACI_CSQ_MODE CSQmode)
{

  T_MM_CMD_PRM  * pMMCmdPrm;  /* points to MM command parameters */

  if( !cmh_IsVldCmdSrc( srcId ) )
  {
    return( AT_FAIL );
  }

  pMMCmdPrm = &cmhPrm[srcId].mmCmdPrm;

  switch(CSQmode)
  {
    case( CSQ_Enable):
    {
      if ( pMMCmdPrm->CSQworkStat EQ CSQ_Enable )
      {
        TRACE_EVENT("CSQ is already enabled");
      }
      else
      {
        cmhPrm[srcId].mmCmdPrm.CSQworkStat = CSQ_Enable;
        if( (pMMCmdPrm->sIndicationParam.sMmCINDSettings.sCindSignalParam <= CIND_SIGNAL_INDICATOR_LVL0) AND
            (pMMCmdPrm->sIndicationParam.sMmCMERSettings.sCmerIndParam NEQ CMER_INDICATOR_2) )
        { /* rx_Init() not yet called from CIND service */
#ifndef _SIMULATION_
          rx_Init(rx_Cb);
#endif /* _SIMULATION_ */
        }
      }
      break;
    }

    case(CSQ_Disable):
    {
      if ( pMMCmdPrm->CSQworkStat EQ CSQ_Enable )
      {
        cmhPrm[srcId].mmCmdPrm.CSQworkStat = CSQ_Disable;
        if( (pMMCmdPrm->sIndicationParam.sMmCINDSettings.sCindSignalParam <= CIND_SIGNAL_INDICATOR_LVL0) &&
            (pMMCmdPrm->sIndicationParam.sMmCMERSettings.sCmerIndParam NEQ CMER_INDICATOR_2)  )
        { /* CIND service inactive -> no more reading the signal strength necessary */
#ifndef _SIMULATION_
        rx_Init(NULL);
#endif /* _SIMULATION_ */
        }
      }
      break;
    }
    default:
      return(AT_FAIL);
  }
  return( AT_CMPL);
}


/*
+--------------------------------------------------------------------+
| PROJECT : ACI/MMI                 MODULE  : CMH_MMS                |
| STATE   : code                    ROUTINE : sAT_Plus CIND          |
+--------------------------------------------------------------------+

  PURPOSE : This is the function to setup the indications toward
            terminal
*/

GLOBAL T_ACI_RETURN sAT_PlusCIND( T_ACI_CMD_SRC  srcId,
                                       T_ACI_CIND_SIGNAL_TYPE  sCindSgnalSettings,
                                       T_ACI_CIND_SMSFULL_TYPE sCindSmsFullSettings )
{
  T_ACI_MM_CIND_VAL_TYPE  *pMMCindPrm;
  T_ACI_MM_CMER_VAL_TYPE  *pMMCmerPrm;
  T_ACI_CIND_SIGNAL_TYPE   sOldSignalSetting;

  TRACE_EVENT( "sAT_PlusCIND()" );

  if( !cmh_IsVldCmdSrc( srcId ) )
  {
    return( AT_FAIL );
  }

  pMMCindPrm = &(cmhPrm[srcId].mmCmdPrm.sIndicationParam.sMmCINDSettings);
  pMMCmerPrm = &(cmhPrm[srcId].mmCmdPrm.sIndicationParam.sMmCMERSettings);

  if( sCindSgnalSettings   EQ CIND_SIGNAL_INDICATOR_INVALID OR 
      sCindSmsFullSettings EQ CIND_SMSFULL_INDICATOR_INVALID )
  {
    ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
    return( AT_FAIL );
  }

  sOldSignalSetting = pMMCindPrm->sCindSignalParam;
  pMMCindPrm->sCindSignalParam  = sCindSgnalSettings;
  pMMCindPrm->sCindSmsFullParam = sCindSmsFullSettings;

  /* ----------------- signal strength setting part ------------------------ */
  if( sOldSignalSetting <= CIND_SIGNAL_INDICATOR_LVL0 )
  { /* the old (previews) signal setting is off */
    if( (sCindSgnalSettings > CIND_SIGNAL_INDICATOR_LVL0) AND 
        (cmhPrm[srcId].mmCmdPrm.CSQworkStat EQ CSQ_Disable) AND 
        (pMMCmerPrm->sCmerIndParam NEQ CMER_INDICATOR_2) )
    { /* greather LVL0 --> rx_Init must be initialize... */
#ifndef _SIMULATION_
      rx_Init(rx_Cb);
#endif /* _SIMULATION_ */
    }
  }
  else
  { /* the old (previews) signal setting is on */
    if( (sCindSgnalSettings EQ CIND_SIGNAL_INDICATOR_LVL0) AND
        (cmhPrm[srcId].mmCmdPrm.CSQworkStat EQ CSQ_Disable) AND
        (pMMCmerPrm->sCmerIndParam NEQ CMER_INDICATOR_2) )
    { /* LVL0 --> rx_Init must be reset... */
#ifndef _SIMULATION_
        rx_Init(NULL);
#endif /* _SIMULATION_ */
    }
  }
  return(AT_CMPL);
}

/* 
+--------------------------------------------------------------------+
| PROJECT : ACI/MMI                 MODULE  : CMH_MMS                |
| STATE   : code                    ROUTINE : sAT_Plus CMER          |
+--------------------------------------------------------------------+

  PURPOSE : This is the function to setup the buffer control for the 
            indications toward terminal equipment
*/

GLOBAL T_ACI_RETURN sAT_PlusCMER( T_ACI_CMD_SRC  srcId,
                                       T_ACI_CMER_MODE_TYPE sCmerModeSettings,
                                       T_ACI_CMER_IND_TYPE sCmerIndicationSettings,
                                       T_ACI_CMER_BFR_TYPE sCmerBfrSettings )
{
  T_ACI_MM_CMER_VAL_TYPE  *pMMCmerPrm;
  T_ACI_MM_CIND_VAL_TYPE  *pMMCindPrm;
  T_ACI_CMER_IND_TYPE      sOldCmerIndSetting;

  TRACE_EVENT( "sAT_PlusCMER()" );

  if( !cmh_IsVldCmdSrc( srcId ) )
  {
    return( AT_FAIL );
  }

  pMMCmerPrm = &(cmhPrm[srcId].mmCmdPrm.sIndicationParam.sMmCMERSettings);
  pMMCindPrm = &(cmhPrm[srcId].mmCmdPrm.sIndicationParam.sMmCINDSettings);

  sOldCmerIndSetting        = pMMCmerPrm->sCmerIndParam;
  if( sCmerModeSettings NEQ CMER_MODE_INVALID )
  {
    pMMCmerPrm->sCmerModeParam = sCmerModeSettings;
  }
  if( sCmerIndicationSettings NEQ CMER_INDICATOR_INVALID )
  {
    pMMCmerPrm->sCmerIndParam  = sCmerIndicationSettings;
  }
  if( sCmerBfrSettings NEQ CMER_BFR_INVALID )
  {
    pMMCmerPrm->sCmerBfrParam  = sCmerBfrSettings;
  }

  /* ---------------- maybe switch on all indication settings ------------- */
  if( sOldCmerIndSetting NEQ CMER_INDICATOR_2 )
  { /* the old (previews) indicator setting is 'off' */
    if( (sCmerIndicationSettings EQ CMER_INDICATOR_2) AND
        (cmhPrm[srcId].mmCmdPrm.CSQworkStat EQ CSQ_Disable) AND 
        (pMMCindPrm->sCindSignalParam <= CIND_SIGNAL_INDICATOR_LVL0) )
    { /* all indications must be show --> rx_Init must be initialize... */
#ifndef _SIMULATION_
      rx_Init(rx_Cb);
#endif /* _SIMULATION_ */
    }
  }
  else
  { /* the old (previews) signal setting is on */
    if( (sCmerIndicationSettings NEQ CMER_INDICATOR_2) AND
        (cmhPrm[srcId].mmCmdPrm.CSQworkStat EQ CSQ_Disable) AND
        (pMMCindPrm->sCindSignalParam <= CIND_SIGNAL_INDICATOR_LVL0) )
    { /* LVL0 --> rx_Init must be reset... */
#ifndef _SIMULATION_
        rx_Init(NULL);
#endif /* _SIMULATION_ */
    }
  }

  return(AT_CMPL);
}


/*
+--------------------------------------------------------------------+
| PROJECT : ACI/MMI                 MODULE  : CMH_MMS                  |
| STATE   : code                    ROUTINE : sAT_PercentCSQ             |
+--------------------------------------------------------------------+

  PURPOSE : This is the callback function for Signal Quality 
  Param:
  signal_params   callback function name

  Shen,Chao
  Juni.13th, 2003
*/

#ifndef _SIMULATION_
LOCAL void rx_Cb (drv_SignalID_Type *signal_params)
{
    rx_Status_Type *para = NULL;

    TRACE_EVENT("rx_Cb()");

    ACI_MALLOC(para,sizeof(rx_Status_Type));

    para->actLevel = ((rx_Status_Type *) signal_params->UserData)->actLevel;
    para->gsmLevel = ((rx_Status_Type *) signal_params->UserData)->gsmLevel;
    para->rxQuality = ((rx_Status_Type *) signal_params->UserData)->rxQuality;
#ifdef FF_PS_RSSI
    para->min_access_level = ((rx_Status_Type *) signal_params->UserData)->min_access_level;
#endif
        
    if (!cmh_set_delayed_call (rx_sequence_Cb, (void *)para))
    {
      /* Implements Measure#32: Row 990  */
      TRACE_EVENT("Error, can not set the delayed resequence callback for AT_CMD_CSQ");
      ACI_MFREE(para);
      return ;
    }

    TRACE_EVENT("delayed requence call back requested: 100 ms");
    cmh_start_delayed_call (20);

    return;   
    
}
#endif /* _SIMULATION_ */

/*
+--------------------------------------------------------------------+
| PROJECT : ACI/MMI          MODULE  : CMH_MMS                  |
| STATE   : code                  ROUTINE : sAT_PercentCSQ             |
+--------------------------------------------------------------------+

  PURPOSE : This is the delayed callback function for Signal Quality 
  Shen,Chao
  Juni.13th, 2003
*/
#ifndef _SIMULATION_
LOCAL UCHAR rx_sequence_Cb (void* arg)
{
  int  i;
  UBYTE rssi;
  UBYTE ber;
#ifdef FF_PS_RSSI
  UBYTE min_access_level;
#endif
  T_ACI_CIND_SIGNAL_TYPE sSignalStrength;
  T_ACI_MM_CIND_VAL_TYPE sIndValues;

  struct rx_Status_Type* tmp_p = (struct rx_Status_Type*) arg;
  
  TRACE_EVENT("rx_sequence_Cb()");

  sIndValues.sCindSmsFullParam = CIND_SMSFULL_INDICATOR_INVALID;

  if ( tmp_p->gsmLevel EQ 0xFF OR tmp_p->gsmLevel EQ 0 )
  {
    rssi = ACI_RSSI_FAULT;
    sSignalStrength = CIND_SIGNAL_INDICATOR_LVL0;
  }
  else if ( tmp_p->gsmLevel > 59 )
  {
    rssi = 31;
  }
  else
  {
    rssi = ( tmp_p->gsmLevel / 2 ) + 2;
  }

  if ( tmp_p->rxQuality EQ RX_QUAL_UNAVAILABLE )
  {
    ber = ACI_BER_FAULT;
  }
  else
  {
    ber = tmp_p->rxQuality;
  }  

#ifdef FF_PS_RSSI
  if ( tmp_p->min_access_level EQ RX_ACCE_UNAVAILABLE)
  {
    min_access_level = ACI_MIN_RXLEV_FAULT;
  }
  else
  {
    min_access_level = tmp_p->min_access_level;
  }
#endif

  for( i = CMD_SRC_LCL; i < CMD_SRC_MAX; i++)
  {
    if (cmhPrm[i].mmCmdPrm.CSQworkStat EQ CSQ_Enable)
    {
#ifdef FF_PS_RSSI
      R_AT (RAT_CSQ, (T_ACI_CMD_SRC)i) (rssi, ber, tmp_p->actLevel, min_access_level);
#else
      R_AT (RAT_CSQ, (T_ACI_CMD_SRC)i) (rssi,ber,tmp_p->actLevel);
#endif
    }
    /* ==================== process the service of +CIEV ========================== */
    sSignalStrength = CIND_SIGNAL_INDICATOR_LVL0;
    if( tmp_p->gsmLevel >= 11 ) { sSignalStrength = CIND_SIGNAL_INDICATOR_LVL1; };
    if( tmp_p->gsmLevel >= 21 ) { sSignalStrength = CIND_SIGNAL_INDICATOR_LVL2; };
    if( tmp_p->gsmLevel >= 32 ) { sSignalStrength = CIND_SIGNAL_INDICATOR_LVL3; };
    if( tmp_p->gsmLevel >= 42 ) { sSignalStrength = CIND_SIGNAL_INDICATOR_LVL4; };
    if( tmp_p->gsmLevel >= 52 ) { sSignalStrength = CIND_SIGNAL_INDICATOR_LVL5; };
    sIndValues.sCindSignalParam = sSignalStrength;
    sIndValues.sCindSmsFullParam = CIND_SMSFULL_INDICATOR_INVALID;
    if( ((cmhPrm[i].mmCmdPrm.sIndicationParam.sMmCINDSettings.sCindSignalParam > CIND_SIGNAL_INDICATOR_LVL0) AND
         (cmhPrm[i].mmCmdPrm.sIndicationParam.sMmCINDSettings.sCindSignalParam >= sIndValues.sCindSignalParam) AND
          (cmhPrm[i].mmCmdPrm.sIndicationParam.sMmCMERSettings.sCmerIndParam EQ CMER_INDICATOR_2)) OR 
        ((cmhPrm[i].mmCmdPrm.sIndicationParam.sMmCINDSettings.sCindSignalParam < sIndValues.sCindSignalParam) AND
          (cmhPrm[i].mmCmdPrm.sIndicationParam.sMmCMERSettings.sCmerIndParam EQ CMER_INDICATOR_1)) )
    {
      TRACE_EVENT("send +CIEV");
      R_AT (RAT_CIEV, (T_ACI_CMD_SRC)i) ( sIndValues, cmhPrm[i].mmCmdPrm.sIndicationParam.sMmCMERSettings );
    }
  }

  if (!cmh_set_delayed_call (NULL, NULL))
  { /* reset this callback pointer -> will be set again via rx_Cb */
    /* Implements Measure#32: Row 991  */
    TRACE_EVENT("Can not reset the delayed resequence callback for AT_CMD_CSQ");
    return FALSE;
  }
  ACI_MFREE(tmp_p);

  return TRUE;    
}
#endif /* _SIMULATION_ */

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

  PURPOSE : This is the functional counterpart to the %CHPL AT command
            which will return the list of entries in EF_HPLMNwAcT.

            <mode>:   registration mode.
            <format>: format of operator selection
            <oper>:   operator string
*/

GLOBAL T_ACI_RETURN sAT_PercentCHPL ( T_ACI_CMD_SRC srcId,
                                      T_ACI_OPER_NTRY *oper )
{
  T_OPER_ENTRY   plmnDesc;
  BOOL           found;
  SHORT          mccBuf;
  SHORT          mncBuf;

  TRACE_FUNCTION ("sAT_PercentCHPL()");

/*
 *-------------------------------------------------------------------
 * check whether SIM is ready 
 *-------------------------------------------------------------------
 */
  if (!cmhSIM_CheckSimStatus ())
  {
    return AT_FAIL;
  }

/*
 *-------------------------------------------------------------------
 * check command source
 *-------------------------------------------------------------------
 */
  if(!cmh_IsVldCmdSrc (srcId))
  {
    TRACE_EVENT_P1("sAT_PercentCHPL(): Invalid source: %d", srcId);
    return( AT_FAIL );
  }
  if(!cmhMM_GetActingHPLMN(&mccBuf, &mncBuf))/* Enhancement Acting HPLMN*/
  {
    cmhSIM_GetHomePLMN (&mccBuf, &mncBuf);
  }

  found = cmhMM_FindPLMN (&plmnDesc, mccBuf, mncBuf, NOT_PRESENT_16BIT, FALSE);
  if (!found)
  {
    TRACE_EVENT_P2("sAT_PercentCHPL(): MCC/MN not found in database (0x%X, 0x%X", mccBuf, mncBuf);
    ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal);
    return( AT_FAIL );
  }

  strcpy (oper->longName, plmnDesc.longName);
  strcpy (oper->shrtName, plmnDesc.shrtName);
  oper->mcc = plmnDesc.mcc;
  oper->mnc = plmnDesc.mnc;
  oper->pnn = plmnDesc.pnn;
  oper->long_len = plmnDesc.long_len;
  oper->shrt_len = plmnDesc.shrt_len;

  return (AT_CMPL);
}

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

  PURPOSE : This is the functional counterpart to the +CTZR AT command
            which will set the status of CTZRmode, indicating whether time
            zone change rep[orting is enabled or disabled.

            <on/off>:   Indicates whether time zone reporting is enabled or disabled.
*/

GLOBAL T_ACI_RETURN sAT_PlusCTZR ( T_ACI_CMD_SRC srcId,
                                   T_ACI_CTZR_MODE mode)
{
  TRACE_FUNCTION ("sAT_PlusCTZR()");

/*
 *-------------------------------------------------------------------
 * check command source
 *-------------------------------------------------------------------
 */
  if(!cmh_IsVldCmdSrc (srcId))
  {
    TRACE_EVENT_P1("sAT_PlusCTZR(): Invalid source: %d", srcId);
    return( AT_FAIL );
  }

/*
 *-------------------------------------------------------------------
 * process the mode parameter
 *-------------------------------------------------------------------
 */
  switch (mode)
  {
    case CTZR_MODE_OFF:
    case CTZR_MODE_ON:
       cmhPrm[srcId].mmCmdPrm.CTZRMode = mode;
       break;

    default:
       TRACE_EVENT_P1("sAT_PlusCTZR(): Invalid mode: %d", mode);
       ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
       return( AT_FAIL );
  }
  
  return( AT_CMPL );
}


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

  PURPOSE : This is the functional counterpart to the +CTZU AT command
            which will set the status of CTZUmode, indicating whether automatic time
            zone update is enabled or disabled.

            <on/off>:   Indicates whether automatic time zone update is enabled or disabled.
*/

GLOBAL T_ACI_RETURN sAT_PlusCTZU ( T_ACI_CMD_SRC srcId,
                                   T_ACI_CTZU_MODE mode)
{
  TRACE_FUNCTION ("sAT_PlusCTZU()");

/*
 *-------------------------------------------------------------------
 * check command source
 *-------------------------------------------------------------------
 */
  if(!cmh_IsVldCmdSrc (srcId))
  {
    TRACE_EVENT_P1("sAT_PlusCTZU(): Invalid source: %d", srcId);
    return( AT_FAIL );
  }

/*
 *-------------------------------------------------------------------
 * process the mode parameter
 *-------------------------------------------------------------------
 */
  switch (mode)
  {
    case CTZU_MODE_OFF:
    case CTZU_MODE_ON:
       cmhPrm[srcId].mmCmdPrm.CTZUMode = mode;
       break;

    default:
       TRACE_EVENT_P1("sAT_PlusCTZU(): Invalid mode: %d", mode);
       ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
       return( AT_FAIL );
  }
  
  return( AT_CMPL );
}


/*
+--------------------------------------------------------------------+
| PROJECT :                       MODULE  : CMH_MMS                  |
| STATE   : code                  ROUTINE : sAT_PlusCCLK             |
+--------------------------------------------------------------------+

  PURPOSE : This is the functional counterpart to the +CCLK AT command
            which will set the real time clock of the ME
*/

GLOBAL T_ACI_RETURN sAT_PlusCCLK ( T_ACI_CMD_SRC srcId,
                                   T_ACI_RTC_DATE *date_s,
                                   T_ACI_RTC_TIME *time_s,
                                   int timeZone
                                 )
{
#ifndef _SIMULATION_
  UBYTE  ret;
#endif /* _SIMULATION_ */

  TRACE_FUNCTION ("sAT_PlusCCLK()");

/*
 *-------------------------------------------------------------------
 * check command source
 *-------------------------------------------------------------------
 */
  if(!cmh_IsVldCmdSrc (srcId))
  {
    TRACE_EVENT_P1("sAT_PlusCCLK(): Invalid source: %d", srcId);
    return( AT_FAIL );
  }

/*
 *-------------------------------------------------------------------
 * Set the time in the RTC 
 *-------------------------------------------------------------------
 */
#ifndef _SIMULATION_
  ret = rtc_set_time_date( (T_RTC_DATE *) date_s, (T_RTC_TIME *) time_s);

  switch (ret)
  {
    case 0:                     /* RVF_OK. Date and time set ok*/
#ifndef FF_TIMEZONE
      return( AT_CMPL );
#else  /* FF_TIMEZONE */
      ret = RTC_SetCurrentTZ((T_RTC_TZ)timeZone); /* Set current timezone now time and date are set.*/
      switch (ret)
      {
        case 0:                /* RVF_OK. RTC current TZ set ok*/
          return( AT_CMPL );

        default:
          TRACE_EVENT_P1("sAT_PlusCCLK(): ERROR1: %d", ret);  /* RTC setting failed */
          return( AT_FAIL );
      }
#endif /* FF_TIMEZONE */

    default:     /* RVF_NOT_READY or RVF_INTERNAL ERROR or RVF_INVALID_PARAMETER */
      TRACE_EVENT_P1("sAT_PlusCCLK(): ERROR2: %d", ret);  /* Date and time setting failed */
      return( AT_FAIL );
  }
#else /* _SIMULATION_ */
  return( AT_CMPL );
#endif /* _SIMULATION_ */

}

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

  PURPOSE : This is the functional counterpart to the %CTZV AT command
            which will set the status of PCTZVmode, indicating whether time and date report
            is enabled or disabled.

            <on/off>:   Indicates whether time and date report is enabled or disabled.
*/

GLOBAL T_ACI_RETURN sAT_PercentCTZV ( T_ACI_CMD_SRC srcId,
                                   T_ACI_PCTZV_MODE mode)
{
  TRACE_FUNCTION ("sAT_PercentCTZV()");

/*
 *-------------------------------------------------------------------
 * check command source
 *-------------------------------------------------------------------
 */
  if(!cmh_IsVldCmdSrc (srcId))
  {
    TRACE_EVENT_P1("sAT_PercentCTZV(): Invalid source: %d", srcId);
    return( AT_FAIL );
  }

/*
 *-------------------------------------------------------------------
 * process the mode parameter
 *-------------------------------------------------------------------
 */
  switch (mode)
  {
    case PCTZV_MODE_OFF:
    case PCTZV_MODE_ON:
       cmhPrm[srcId].mmCmdPrm.PCTZVMode = mode;
       break;

    default:
       TRACE_EVENT_P1("sAT_PercentCTZV(): Invalid mode: %d", mode);
       ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
       return( AT_FAIL );
  }
  
  return( AT_CMPL );
}


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

  PURPOSE : This is the functional counterpart to the %CNIV AT command
            which will set the status of CNIVmode, indicating whether time and date report
            is enabled or disabled.

            <on/off>:   Indicates whether time and date report is enabled or disabled.
*/

GLOBAL T_ACI_RETURN sAT_PercentCNIV ( T_ACI_CMD_SRC srcId,
                                   T_ACI_CNIV_MODE mode)
{
  TRACE_FUNCTION ("sAT_PercentCNIV()");

/*
 *-------------------------------------------------------------------
 * check command source
 *-------------------------------------------------------------------
 */
  if(!cmh_IsVldCmdSrc (srcId))
  {
    TRACE_EVENT_P1("sAT_PercentCNIV(): Invalid source: %d", srcId);
    return( AT_FAIL );
  }

/*
 *-------------------------------------------------------------------
 * process the mode parameter
 *-------------------------------------------------------------------
 */
  switch (mode)
  {
    case CNIV_MODE_OFF:
    case CNIV_MODE_ON:
       cmhPrm[srcId].mmCmdPrm.CNIVMode = mode;
       break;

    default:
       TRACE_EVENT_P1("sAT_PercentCNIV(): Invalid mode: %d", mode);
       ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
       return( AT_FAIL );
  }
  
  return( AT_CMPL );
}

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

  PURPOSE : This is the functional counterpart to the +CWUP AT command
                   which will force RR to trigger a power campaign.

*/

GLOBAL T_ACI_RETURN sAT_PercentCWUP ( T_ACI_CMD_SRC srcId, T_ACI_CWUP_TYPE type )
{
  TRACE_FUNCTION ("sAT_PercentCWUP()");

/*
 *-------------------------------------------------------------------
 * check command source
 *-------------------------------------------------------------------
 */
  if(!cmh_IsVldCmdSrc (srcId))
  {
    TRACE_EVENT_P1("sAT_PercentCWUP(): Invalid source: %d", srcId);
    return( AT_FAIL );
  }

/*
 *-------------------------------------------------------------------
 * check entity status
 *-------------------------------------------------------------------
 */
  if( mmEntStat.curCmd NEQ AT_CMD_NONE )
  {
    TRACE_EVENT("sAT_PercentCWUP(): MM is busy");    
    return( AT_BUSY );
  }

  wake_up_rr();
  
  return( AT_CMPL );
}

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

  PURPOSE : This function encapsulates the functionality of +COPS and %COPS command
             
            <srcId>:  Source Id
            <mode>:   registration mode.
            <format>: format of operator selection
            <oper>:   operator string
            <cmd>:    command
*/

GLOBAL T_ACI_RETURN sat_Plus_Percent_COPS ( T_ACI_CMD_SRC srcId,
                                   T_ACI_COPS_MOD mode,
                                   T_ACI_COPS_FRMT format,
                                   CHAR * oper,
                                   T_ACI_AT_CMD cmd)
{
  T_MM_CMD_PRM * pMMCmdPrm;  /* points to MM command parameters */


  T_ACI_NRG_RGMD regMode; /*NRG Registration mode */
  T_ACI_NRG_FRMT regFormat; 
  T_ACI_NRG_SVMD  svrMode;


  TRACE_FUNCTION ("sat_Plus_Percent_COPS()");


  pMMCmdPrm = &cmhPrm[srcId].mmCmdPrm;
  mmShrdPrm.COPSmodeBeforeAbort = mmShrdPrm.COPSmode;
  
/*
  *  check MM entity status
  */
  if( mmEntStat.curCmd NEQ AT_CMD_NONE )

    return( AT_BUSY );


/*
  *convert  format to NRG type and set the COPS format value.
  */


if( format EQ COPS_FRMT_NotPresent ) format = pMMCmdPrm -> COPSfrmt;

  
  switch( format )
  {
    case(    COPS_FRMT_NotPresent): 
    regFormat = NRG_FRMT_NotPresent; 
    break;
    case(   COPS_FRMT_Numeric ): 
    regFormat =NRG_FRMT_Numeric ; 
    break;
    case( COPS_FRMT_Short):
    regFormat = NRG_FRMT_Short; 
    break;
    case( COPS_FRMT_Long):
    regFormat = NRG_FRMT_Long; 
    break;
    default:
      ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
      return( AT_FAIL );
  }

pMMCmdPrm -> COPSfrmt = format;



/*
  * The function cmhMM_OperatorSelect() is using the NRG types. Therefore the following conversion is required.
  * Also the appropiate value for Service Mode, required by cmhMM_OperatorSelect(),  is set. 
  */


if( mode EQ COPS_MOD_NotPresent ) mode = mmShrdPrm.COPSmode;

switch( mode )
  {
    case( COPS_MOD_NotPresent   ): 
    regMode = NRG_RGMD_NotPresent; 
    svrMode = NRG_SVMD_NotPresent;
    break;
    case(  COPS_MOD_Auto  ): 
    regMode =NRG_RGMD_Auto ; 
    svrMode = NRG_SVMD_Full;    /* Only Full Service makes sense for Automatic Mode */
    break;
    case(  COPS_MOD_Man):
    regMode = NRG_RGMD_Manual; 
    svrMode = NRG_SVMD_Full;   /* Only Full Service makes sense for Manual Mode */ 
    break;
    case(  COPS_MOD_Dereg):
    regMode = NRG_RGMD_Dereg; 
    svrMode = NRG_SVMD_Limited;    
    break;
    case(   COPS_MOD_Both ): 
    regMode = NRG_RGMD_Both; 
    svrMode = NRG_SVMD_Full;  /* Only Full Service makes sense for the Both Mode */
    break;
    case(COPS_MOD_SetOnly):  /*This mode can be fully handled in this function */
       /* DO NOT SET mmShrdPrm.COPSmode !!! */
      pMMCmdPrm -> COPSfrmt = format;
      return AT_CMPL;
    default:
      ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
      return( AT_FAIL );
  }

mmShrdPrm.COPSmode = mode;



/*Set the value of the current command executed */
mmEntStat.curCmd  = cmd;  

return cmhMM_OperatorSelect(srcId,regMode,svrMode,regFormat,oper);
 
}
#ifdef TI_PS_FF_AT_P_CMD_CTREG
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147)         MODULE  : CMH_MMS                  |
| STATE   : code                  ROUTINE : sAT_PercentCTREG         |
+--------------------------------------------------------------------+

  PURPOSE : This is the functional counterpart to the %CTREG AT command
            which will update the two tables present in common shared
            location.

*/

GLOBAL T_ACI_RETURN sAT_PercentCTREG ( T_ACI_CMD_SRC srcId, T_TREG *treg )
{
  BOOL ret;

  TRACE_FUNCTION ("sAT_PercentCTREG()");

/*
 *-------------------------------------------------------------------
 * check command source
 *-------------------------------------------------------------------
 */
  if(!cmh_IsVldCmdSrc (srcId))
  {
    TRACE_EVENT_P1("sAT_PercentCTREG(): Invalid source: %d", srcId);
    ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
    return( AT_FAIL );
  }

  ret = cl_shrd_set_treg_val(treg);

  if(ret EQ TRUE)
  {
    return( AT_CMPL );
  }
  return(AT_FAIL);
}
#endif /* TI_PS_FF_AT_P_CMD_CTREG */

/*==== EOF ========================================================*/