FreeCalypso > hg > fc-magnetite
diff src/aci2/aci/cmh_f.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/cmh_f.c Mon Sep 26 00:29:36 2016 +0000 @@ -0,0 +1,2019 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-PS (6147) +| Modul : CMH_F ++----------------------------------------------------------------------------- +| 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 defines global functions of the command +| handler. ++----------------------------------------------------------------------------- +*/ + +#ifndef CMH_F_C +#define CMH_F_C +#endif + +#include "aci_all.h" + +/*==== INCLUDES ===================================================*/ + +#include "aci_cmh.h" +#include "cphs.h" +#include "aci_cphs.h" +#include "ati_cmd.h" +#include "aci_cmd.h" +#include "ksd.h" +#include "l4_tim.h" + +#include "aci_io.h" + +#ifdef FAX_AND_DATA +#include "aci_fd.h" +#endif + +#ifdef DTI +#include "dti.h" /* functionality of the dti library */ +#include "dti_conn_mng.h" +#endif +#include "psa.h" +#include "psa_mm.h" +#include "psa_sim.h" +#include "psa_cc.h" +#include "psa_sms.h" +#include "psa_ss.h" +#include "cmh.h" +#include "cmh_mm.h" +#include "cmh_sim.h" +#include "cmh_cc.h" +#include "cmh_sms.h" +#include "cmh_ss.h" + +#include "aci.h" +#include "phb.h" +#include "aci_lst.h" +#include "conc_sms.h" + + +#ifdef FAX_AND_DATA +#include "psa_ra.h" +#include "cmh_ra.h" +#include "psa_l2r.h" +#include "cmh_l2r.h" +#include "psa_tra.h" + +#ifdef FF_FAX +#include "psa_t30.h" +#include "cmh_t30.h" +#endif /* FF_FAX */ + +#endif /* FAX_AND_DATA */ + +#ifdef GPRS +#include "gaci.h" +#include "gaci_cmh.h" +#include "pcm.h" +#include "psa_gmm.h" +#include "cmh_gmm.h" +#include "psa_sm.h" +#include "cmh_sm.h" +#include "psa_gppp.h" +#include "cmh_gppp.h" + +#endif /* GPRS */ + +#ifdef _CONC_TESTING_ +#include "aci_mfw.h" +#endif + +#ifdef UART +#include "psa_uart.h" +#include "cmh_uart.h" +#endif + +#ifdef FF_PSI +#include "psa_psi.h" +#include "cmh_psi.h" +#endif /*FF_PSI*/ + + +#include "rx.h" + +#ifndef _SIMULATION_ +#include "ffs/ffs.h" +#include "ffs_coat.h" +#endif + +/*==== CONSTANTS ==================================================*/ + +/*==== GLOBALS ====================================================*/ +#ifdef FF_ATI +EXTERN T_CIEV_SIGNAL_BUFFER asCievSignalBuf; +EXTERN T_CIEV_SMSFULL_BUFFER asCievSmsFullBuf; +#endif /* FF_ATI */ + +/*==== TYPES ======================================================*/ + + +/*==== EXPORT =====================================================*/ +/* MACRO CB_VC() for call-backs used by the voice stack */ +#ifdef FF_BAT + +#ifdef FF_ATI + #if defined SMI OR defined MFW OR defined FF_MMI_RIV + #define CB_VC( cbNam ){rAT_##cbNam,rCI_##cbNam,rBAT_##cbNam} + #define CB_VC_EXT( cbNam ){rAT_##cbNam##_Ext,rCI_##cbNam,rBAT_##cbNam} + #else + #define CB_VC( cbNam ){0,rCI_##cbNam,rBAT_##cbNam} /* ACI only */ + #ifdef _CONC_TESTING_ /* for _CONC_TESTING for ACI-only */ + #define CB_VC_EXT( cbNam ){rAT_##cbNam##_Ext,rCI_##cbNam,rBAT_##cbNam} + #else + #define CB_VC_EXT( cbNam ){0,rCI_##cbNam,rBAT_##cbNam} + #endif + #endif +#else + #if defined SMI OR defined MFW OR defined FF_MMI_RIV + #define CB_VC( cbNam ){rAT_##cbNam,0,rBAT_##cbNam} + #define CB_VC_EXT( cbNam ){rAT_##cbNam##_Ext,0,rBAT_##cbNam} + #else + #define CB_VC( cbNam ){0,0,0} + #define CB_EXT( cbNam ){0,0,0} + #endif +#endif + +/* MACRO CB_FD() for call-backs used by the F&D stack */ +#ifdef FAX_AND_DATA + #define CB_FD( cbNam ){0,rCI_##cbNam,rBAT_##cbNam} +#else + #define CB_FD( cbNam ){0,0,0} +#endif + +/* MACRO CB_ST() for call-backs used by SIM toolkit */ +#ifdef SIM_TOOLKIT + #ifdef FF_ATI + #if defined SMI OR defined MFW OR defined FF_MMI_RIV + #define CB_ST( cbNam ){rAT_##cbNam,rCI_##cbNam,rBAT_##cbNam} + #else + #define CB_ST( cbNam ){0,rCI_##cbNam,rBAT_##cbNam} + #endif + #else + #if defined SMI OR defined MFW OR defined FF_MMI_RIV + #define CB_ST( cbNam ){rAT_##cbNam,0,rBAT_##cbNam} + #else + #define CB_ST( cbNam ){0,0,0} + #endif + #endif +#else + #define CB_ST( cbNam ){0,0,0} +#endif + +/* MACRO CB_GP() for call-backs used by GPRS */ +#ifdef GPRS + #ifdef FF_ATI + #if defined SMI OR defined MFW OR defined FF_MMI_RIV + #define CB_GP( cbNam ){rAT_##cbNam,rCI_##cbNam,rBAT_##cbNam} + #else + #define CB_GP( cbNam ){0,rCI_##cbNam,rBAT_##cbNam} + #endif + #else + #if defined SMI OR defined MFW OR defined FF_MMI_RIV + #define CB_GP( cbNam ){rAT_##cbNam,0,rBAT_##cbNam} + #else + #define CB_GP( cbNam ){0,0,0} + #endif + #endif +#else + #define CB_GP( cbNam ){0,0,0} +#endif /* GPRS */ + +#else + +#ifdef FF_ATI + #if defined SMI OR defined MFW OR defined FF_MMI_RIV + #define CB_VC( cbNam ){rAT_##cbNam,rCI_##cbNam} + #define CB_VC_EXT( cbNam ){rAT_##cbNam##_Ext,rCI_##cbNam} + #else + #define CB_VC( cbNam ){0,rCI_##cbNam} + #ifdef _CONC_TESTING_ /* for _CONC_TESTING for ACI-only */ + #define CB_VC_EXT( cbNam ){rAT_##cbNam##_Ext,rCI_##cbNam} + #else + #define CB_VC_EXT( cbNam ){0,rCI_##cbNam} + #endif + #endif +#else + #if defined SMI OR defined MFW OR defined FF_MMI_RIV + #define CB_VC( cbNam ){rAT_##cbNam,0} + #define CB_VC_EXT( cbNam ){rAT_##cbNam##_Ext,0} + #else + #define CB_VC( cbNam ){0,0} + #define CB_EXT( cbNam ){0,0} + #endif +#endif + +/* MACRO CB_FD() for call-backs used by the F&D stack */ +#ifdef FAX_AND_DATA + #define CB_FD( cbNam ){0,rCI_##cbNam} +#else + #define CB_FD( cbNam ){0,0} +#endif + +/* MACRO CB_ST() for call-backs used by SIM toolkit */ +#ifdef SIM_TOOLKIT + #ifdef FF_ATI + #if defined SMI OR defined MFW OR defined FF_MMI_RIV + #define CB_ST( cbNam ){rAT_##cbNam,rCI_##cbNam} + #else + #define CB_ST( cbNam ){0,rCI_##cbNam} + #endif + #else + #if defined SMI OR defined MFW OR defined FF_MMI_RIV + #define CB_ST( cbNam ){rAT_##cbNam,0} + #else + #define CB_ST( cbNam ){0,0} + #endif + #endif +#else + #define CB_ST( cbNam ){0,0} +#endif + +/* MACRO CB_GP() for call-backs used by GPRS */ +#ifdef GPRS + #ifdef FF_ATI + #if defined SMI OR defined MFW OR defined FF_MMI_RIV + #define CB_GP( cbNam ){rAT_##cbNam,rCI_##cbNam} + #else + #define CB_GP( cbNam ){0,rCI_##cbNam} + #endif + #else + #if defined SMI OR defined MFW OR defined FF_MMI_RIV + #define CB_GP( cbNam ){rAT_##cbNam,0} + #else + #define CB_GP( cbNam ){0,0} + #endif + #endif +#else + #define CB_GP( cbNam ) +#endif /* GPRS */ + +#endif /* FF_BAT */ + +/* call back jump table */ +GLOBAL const T_VOID_FUNC RATJmpTbl[RAT_MAX][CMD_MODE_MAX] = +{ + CB_VC( OK ), /* RAT_OK */ + CB_VC( CONNECT ), /* RAT_CONNECT */ + CB_VC( PlusCME ), /* RAT_CME */ + CB_VC( NO_CARRIER ), /* RAT_NO_CARRIER */ + CB_VC( PlusCRING ), /* RAT_CRING */ + CB_FD( PlusDR ), /* RAT_DR */ + CB_FD( PlusCR ), /* RAT_CR */ + CB_VC( PlusCPIN ), /* RAT_CPIN */ + CB_VC( PlusCOPS ), /* RAT_COPS */ + CB_VC( PlusCREG ), /* RAT_CREG */ + CB_VC( PlusCCWA ), /* RAT_CCWA */ + CB_VC( PlusCLIP ), /* RAT_CLIP */ + CB_VC( PlusCDIP ), /* RAT_CDIP */ + CB_VC( PlusCOLP ), /* RAT_COLP */ + CB_VC( PlusCRING_OFF ), /* RAT_CRING_OFF */ + +#if defined (FF_FAX) AND defined (DTI) + CB_FD( PlusFCO ), /* RAT_FCO */ + CB_FD( PlusFIS ), /* RAT_FIS */ + CB_FD( PlusFTI ), /* RAT_FTI */ + CB_FD( PlusFCS ), /* RAT_FCS */ + CB_FD( PlusFCI ), /* RAT_FCI */ +#endif /* FF_FAX */ + + CB_VC( PlusCMS ), /* RAT_CMS */ + CB_VC( PlusCSMS ), /* RAT_CSMS */ + CB_VC( PlusCMGS ), /* RAT_CMGS */ + CB_VC( PlusCMSS ), /* RAT_CMSS */ + CB_VC( PlusCMGW ), /* RAT_CMGW */ + CB_VC( PlusCDS ), /* RAT_CDS */ + CB_VC( PlusCMGC ), /* RAT_CMGC */ + CB_VC( PlusCMGD ), /* RAT_CMGD */ + CB_VC( PlusCMGR ), /* RAT_CMGR */ + CB_VC( PlusCMGL ), /* RAT_CMGL */ +#ifdef _CONC_TESTING_ + CB_VC_EXT( PlusCMTI ), /* RAT_CMTI */ + CB_VC_EXT( PlusCMT ), /* RAT_CMT */ +#else + CB_VC( PlusCMTI ), /* RAT_CMTI */ + CB_VC( PlusCMT ), /* RAT_CMT */ +#endif + CB_VC( PlusCBM ), /* RAT_CBM */ + CB_VC( PlusCPMS ), /* RAT_CPMS */ + +#if defined (FF_FAX) AND defined (DTI) + + CB_FD( PlusFHT ), /* RAT_FHT */ + CB_FD( PlusFHR ), /* RAT_FHR */ + CB_FD( PlusFSA ), /* RAT_FSA */ + CB_FD( PlusFPA ), /* RAT_FPA */ + CB_FD( PlusFPW ), /* RAT_FPW */ + CB_FD( PlusFET ), /* RAT_FET */ + CB_FD( PlusFVO ), /* RAT_FVO */ + CB_FD( PlusFPO ), /* RAT_FPO */ + CB_FD( PlusFPI ), /* RAT_FPI */ + CB_FD( PlusFNF ), /* RAT_FNF */ + CB_FD( PlusFNS ), /* RAT_FNS */ + CB_FD( PlusFNC ), /* RAT_FNC */ + CB_FD( PlusFHS ), /* RAT_FHS */ + CB_FD( PlusFPS ), /* RAT_FPS */ + CB_FD( PlusFTC ), /* RAT_FTC */ +#endif /* FF_FAX */ + + CB_FD( PlusILRR ), /* RAT_ILRR */ + CB_VC( BUSY ), /* RAT_BUSY */ + CB_VC( NO_ANSWER ), /* RAT_NO_ANSWER */ + CB_VC( PercentSIMREM ), /* RAT_SIMREM */ + CB_VC( PlusCLIR ), /* RAT_CLIR */ + CB_VC( PercentCOLR ), /* RAT_COLR */ + CB_VC( PlusCSSI ), /* RAT_CSSI */ + CB_VC( PlusCSSU ), /* RAT_CSSU */ + CB_VC( PlusCUSD ), /* RAT_CUSD */ + CB_VC( PlusCCFC ), /* RAT_CCFC */ + CB_VC( PlusCLCK ), /* RAT_CLCK */ + CB_VC( PlusCIMI ), /* RAT_CIMI */ + CB_ST( PercentSATI ), /* RAT_SATI */ + CB_ST( PercentSATE ), /* RAT_SATE */ + CB_VC( PercentKSIR ), /* RAT_KSIR */ + CB_VC( PercentCPI ), /* RAT_CPI */ + CB_VC( PercentCTYI ), /* RAT_CTYI */ + CB_VC( PlusCNUM ), /* RAT_CNUM */ + CB_VC( PlusCPOL ), /* RAT_CPOL */ + CB_VC( PlusCCCM ), /* RAT_CCCM */ + CB_VC( PercentCTV ), /* RAT_CTV */ + CB_ST( PercentSATN ), /* RAT_SATN */ + CB_ST( PercentSATA ), /* RAT_SATA */ + CB_VC( sms_ready), /* RAT_SMS_READY */ + CB_VC( phb_status), /* RAT_PHB_STATUS */ + CB_VC( PercentSIMINS ), /* RAT_SIMINS */ + CB_VC( PlusCRSM ), /* RAT_CRSM */ + CB_VC( PlusCSIM ), /* RAT_CSIM */ + CB_VC( PercentCCBS ), /* RAT_CCBS */ + CB_VC( PlusCCWV ), /* RAT_CCWV */ + CB_VC( PercentCNAP ), /* RAT_CNAP */ + CB_VC( SignalSMS ), /* RAT_SIG_SMS */ + CB_VC( PlusCLAN ), /* RAT_CLAN */ + CB_VC( PlusCLAE ), /* RAT_CLAE */ + CB_VC( PercentCSQ ), /* RAT_CSQ */ + CB_VC( PercentALS ), /* RAT_ALS */ + + CB_VC( PlusCTZV ), /* RAT_CTZR */ + CB_VC( PercentCREG ), /* RAT_P_CREG */ + + +#ifdef GPRS + + CB_GP( PlusCGACT ), /* RAT_CGACT */ + CB_GP( PlusCGDATA ), /* RAT_CGDATA */ + CB_GP( PlusCGANS ), /* RAT_CGANS */ + CB_GP( PlusCGEREP ), /* RAT_CGEREP */ + CB_GP( PlusCGREG ), /* RAT_CGREG */ + CB_GP( changedQOS ), /* RAT_QOS_MOD */ + CB_GP( PercentSNCNT ), /* RAT_SNCNT */ + CB_GP( PercentCGREG ), /* RAT_P_CGREG */ + CB_GP( PercentCGEV ), /* RAT_P_CGEV */ +#endif /* GPRS */ + +#ifdef FF_EM_MODE + CB_VC( PercentEM ), /* RAT_EM */ + CB_VC( PercentEMET ), /* RAT_EMET */ + CB_VC( PercentEMETS ), /* RAT_EMETS */ +#endif /* FF_EM_MODE */ + +#ifdef FF_CPHS + CB_VC( PercentCPNUMS ), /* RAT_CPNUMS */ + CB_VC( PercentCPVWI ), /* RAT_CPVWI */ + CB_VC( PercentCPROAM ), /* RAT_CPROAM */ +#endif /* FF_CPHS */ + CB_VC( PlusCIEV ), /* RAT_CIEV */ + CB_VC( PercentRDL ), /* RAT_RDL */ + CB_VC( PercentRDLB ), /* RAT_RDLB */ + CB_VC( PercentCCCN ), /* RAT_CCCN */ + CB_VC( PercentCSSN ), /* RAT_CSSN */ + + + CB_VC( PercentCSTAT ), /* RAT_CSTAT */ + + + + CB_VC( Z ), /* RAT_Z */ + + + CB_VC( PercentCPRSM ), /* RAT_CPRSM */ + + CB_VC( PercentCTZV ), /*RAT_P_CTZV*/ + CB_VC( PercentCPRI ), /*RAT_P_CPRI*/ + CB_VC( PercentSIMEF ), /*RAT_P_SIMEF*/ + + CB_VC( PercentCNIV ), /*RAT_P_CNIV*/ + + CB_VC( PercentCOPS ), /* RAT_P_COPS */ + CB_VC( PercentCMGR ), /* RAT_P_CMGR */ + CB_VC( PercentCMGL ) /* RAT_P_CMGL */ + +}; + +/*==== VARIABLES ==================================================*/ +/* needed for function percentCSTAT_indication() */ +static UBYTE percentCSTAT_stateField; + +LOCAL T_ACI_CMD_MODE aci_cmd_src_mode[CMD_SRC_MAX]; + +/*==== FUNCTIONS ==================================================*/ + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH | +| ROUTINE : cmh_Init | ++-------------------------------------------------------------------+ + + PURPOSE : initialize the command handler. + +*/ + + +GLOBAL void cmh_Init ( void ) +{ + T_ACI_CMD_SRC index; + + TRACE_FUNCTION ("cmh_Init()"); + + mmEntStat.curCmd = AT_CMD_NONE; + mmEntStat.entOwn = OWN_NONE; + simEntStat.curCmd = AT_CMD_NONE; + simEntStat.entOwn = OWN_NONE; + smsShrdPrm.smsEntStat.curCmd = AT_CMD_NONE; + smsShrdPrm.smsEntStat.entOwn = OWN_NONE; + +#ifdef UART + for (index=CMD_SRC_LCL; index<CMD_SRC_MAX; index++) + { + uartEntcurCmd[index] = AT_CMD_NONE; + } + + uartShrdPrm.dtr_behaviour = DTR_BEHAVIOUR_Ignore; + uartShrdPrm.dtr_clearcall = FALSE; + cmhUART_init_ipr_params(); +#endif + +#ifdef FF_PSI + psiShrdPrm.dtr_behaviour = DTR_BEHAVIOUR_Ignore; + psiShrdPrm.dtr_clearcall = FALSE; +#endif /*FF_PSI*/ + + +#ifdef FAX_AND_DATA +#ifdef FF_FAX + t30EntStat.curCmd = AT_CMD_NONE; + t30EntStat.entOwn = OWN_NONE; +#endif + + l2rEntStat.curCmd = AT_CMD_NONE; + l2rEntStat.entOwn = OWN_NONE; + raEntStat.curCmd = AT_CMD_NONE; + raEntStat.entOwn = OWN_NONE; +#endif + +#ifndef _SIMULATION_ + /* Read status of ALSlock */ + if (FFS_fread ("/gsm/com/ALSlock",&ALSlock,sizeof(ALSlock)) NEQ sizeof(ALSlock)) + /* if failed, reset to default */ + ALSlock = ALS_MOD_NOTPRESENT; + else if (ALSlock NEQ ALS_MOD_SPEECH AND ALSlock NEQ ALS_MOD_AUX_SPEECH) + /* if unknown value was stored */ + ALSlock = ALS_MOD_NOTPRESENT; +#else + ALSlock = ALS_MOD_NOTPRESENT; +#endif + +#ifdef GPRS + gaci_init(); +#endif + +#ifdef FF_ATI + for( index=0; index < CIEV_BUF_SIZE; index++ ) + { + + asCievSignalBuf.asBufferValues[index] = CIND_SIGNAL_INDICATOR_INVALID; + asCievSmsFullBuf.asBufferValues[index] = CIND_SMSFULL_INDICATOR_INVALID; + + } + + asCievSignalBuf.uiLastIndex = 0; + asCievSmsFullBuf.uiLastIndex = 0; +#endif /* FF_ATI */ + + rx_Init(NULL); /* reset the signal strength callback */ + + for(percentCSTAT_stateField = 0,index = 0; + index < STATE_MSG_MAX_ENTITIES; index++) + { + percentCSTAT_stateField |= 1U << index; + } + +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH | +| ROUTINE : cmh_Reset | ++-------------------------------------------------------------------+ + + PURPOSE : Reset the command handler to defaults. +*/ + +/* MACRO: initializer for command parameter */ +#define INIT_PARM( entity, dest, def )\ + {cmhPrm[srcId].entity##CmdPrm.dest = def;} + +#ifdef FAX_AND_DATA +#define INIT_PARM_FND( entity, dest, def )\ + {fnd_cmhPrm[srcId].entity##CmdPrm.dest = def;} +#endif /* FAX_AND_DATA */ + +GLOBAL void cmh_Reset ( T_ACI_CMD_SRC srcId, BOOL atz ) +{ + UINT uiCount; + + TRACE_EVENT_P1("Parameters reset for source: %d", srcId); + + /* set default parms for command parameters */ + + INIT_PARM( cc, CLIRmode, CLIR_MOD_Subscript ); + INIT_PARM( cc, DCDmode, DCD_DISABLE_AFTER_CALL ); + INIT_PARM( cc, CSTAtoa.ton, TON_Unknown ); + INIT_PARM( cc, CSTAtoa.npi, NPI_IsdnTelephony ); /* according to GSM 07.07 description of AT+CSTA */ + INIT_PARM( cc, CSTAdef, TRUE ); + INIT_PARM( cc, CHLDmode, CHLD_MOD_NotPresent ); + INIT_PARM( cc, CCUGidx, CCUG_IDX_0 ); + INIT_PARM( cc, CCUGinfo, CCUG_INFO_No ); + INIT_PARM( cc, CCUGmode, CCUG_MOD_DisableTmp ); + INIT_PARM( cc, mltyCncFlg, 0 ); + INIT_PARM( cc, mltyDscFlg, 0 ); + + /* Check if ALS is locked to a line */ + if (ALSlock EQ ALS_MOD_NOTPRESENT) + { + INIT_PARM( cc, ALSmode, ALS_MOD_SPEECH ); /* Use Default line */ + } + else + { + INIT_PARM( cc, ALSmode, ALSlock ); /* Lock to specific line */ + } + + INIT_PARM( cc, CTTYmode, CTTY_MOD_Disable ); + + INIT_PARM( cc, CSCNcc_mode.CcCSCNModeState, CC_CSCN_MOD_STATE_INVALID ); /* initialize the shared params for %CSCN */ + INIT_PARM( cc, CSCNcc_mode.CcCSCNModeDirection, CC_CSCN_MOD_DIR_INVALID ); + + + INIT_PARM( mm, COPSfrmt, COPS_FRMT_Long ); + INIT_PARM( mm, NRGsrvMode, NRG_SVMD_Full ); + INIT_PARM( mm, NRGregMode, NRG_RGMD_Auto ); + INIT_PARM( mm, NRGoprFrmt, NRG_FRMT_Long ); + INIT_PARM( mm, CTZRMode, CTZR_MODE_OFF ); + INIT_PARM( mm, CSQworkStat, CSQ_Disable ); + + INIT_PARM( mm, sIndicationParam.sMmCINDSettings.sCindSignalParam, CIND_SIGNAL_INDICATOR_INVALID ); /* initialize the shared params for %CIND */ + INIT_PARM( mm, sIndicationParam.sMmCINDSettings.sCindSmsFullParam, CIND_SMSFULL_INDICATOR_INVALID ); + INIT_PARM( mm, sIndicationParam.sMmCMERSettings.sCmerModeParam, CMER_MODE_INVALID ); + INIT_PARM( mm, sIndicationParam.sMmCMERSettings.sCmerIndParam, CMER_INDICATOR_INVALID ); + INIT_PARM( mm, sIndicationParam.sMmCMERSettings.sCmerBfrParam, CMER_BFR_INVALID ); + + + + /* initalize SS password */ +/* INIT_PARM( ss, CXXXpwd[0], 0x0 ); */ + strcpy((CHAR *)cmhPrm[srcId].ssCmdPrm.CXXXpwd,"FFFF"); + INIT_PARM( ss, CXXXnewPwd[0],0x0 ); + INIT_PARM( ss, mltyTrnFlg, 0 ); + + INIT_PARM( ss, CSCNss_mode.SsCSCNModeState, SS_CSCN_MOD_STATE_INVALID ); /* initialize the shared params for %CSCN */ + INIT_PARM( ss, CSCNss_mode.SsCSCNModeDirection, SS_CSCN_MOD_DIR_INVALID ); + + if (!atz) + INIT_PARM( sim, CNUMActRec, 1 ); + + INIT_PARM( sim, CPOLfrmt, CPOL_FRMT_Numeric ); + INIT_PARM( sim, CPOLact, CPOL_ACT_None ); + INIT_PARM( sim, CPOLidx, NOT_PRESENT_8BIT ); + INIT_PARM( sim, CPOLidx2, NOT_PRESENT_8BIT ); + INIT_PARM( sim, CPOLmode, CPOL_MOD_NotPresent ); + + INIT_PARM( phb, cmhStor, PB_STOR_Ad ); + INIT_PARM( phb, phbStor, ADN ); + INIT_PARM( phb, fndRec, 0 ); + INIT_PARM( phb, wrtRec, 0 ); + INIT_PARM( phb, curCmd, AT_CMD_NONE ); + +#ifdef FAX_AND_DATA + INIT_PARM_FND( l2r, CRLPiws, L2R_K_IWF_MS_DEF ); + INIT_PARM_FND( l2r, CRLPmws, L2R_K_MS_IWF_DEF ); + INIT_PARM_FND( l2r, CRLPt1, L2R_T1_DEF ); + INIT_PARM_FND( l2r, CRLPn2, L2R_N2_DEF ); + INIT_PARM_FND( l2r, DSdir, L2R_P0_DEF ); + INIT_PARM_FND( l2r, DScomp, DS_COMP_DoNotDisc ); + INIT_PARM_FND( l2r, DSmaxDict, L2R_P1_DEF ); + INIT_PARM_FND( l2r, DSmaxStr, L2R_P2_DEF ); + +#ifdef FF_FAX + cmhT30_InitFAXPrms( srcId ); + cmhT30_RstNgtPrms(); +#endif /* FF_FAX */ +#endif /* FAX_AND_DATA */ + + /* only if ATZ */ + if(atz) + { + psaCC_init_mtcbearer(); + } + +#ifdef FF_ATI + for( uiCount=0; uiCount < CIEV_BUF_SIZE; uiCount++ ) + { + asCievSignalBuf.asBufferValues[uiCount] = CIND_SIGNAL_INDICATOR_INVALID; + asCievSmsFullBuf.asBufferValues[uiCount] = CIND_SMSFULL_INDICATOR_INVALID; + } + asCievSignalBuf.uiLastIndex = 0; + asCievSmsFullBuf.uiLastIndex = 0; +#endif /* FF_ATI */ + rx_Init(NULL); /* reset the signal strength callback */ +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH | +| ROUTINE : cmh_IsVldCmdSrc | ++-------------------------------------------------------------------+ + + PURPOSE : check for a valid command source. + +*/ + +GLOBAL BOOL cmh_IsVldCmdSrc ( T_ACI_CMD_SRC srcId ) +{ + if( srcId > CMD_SRC_NONE AND srcId < CMD_SRC_MAX ) + + return TRUE; + + return( FALSE ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH | +| ROUTINE : qAT_ErrDesc | ++-------------------------------------------------------------------+ + + PURPOSE : query error description of last error. + +*/ + +GLOBAL T_ACI_ERR_DESC qAT_ErrDesc ( void ) +{ + return( aciErrDesc ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH | +| ROUTINE : sAT_end_ussd | ++-------------------------------------------------------------------+ + + PURPOSE : Give the user the opportunity to end at any time a USSD transaction. +*/ + +GLOBAL T_ACI_RETURN sAT_end_ussd ( T_ACI_CMD_SRC srcId ) +{ + UBYTE srcBuf; /* buffers current source of command */ + SHORT sId; + + TRACE_FUNCTION("sAT_end_ussd( )"); + + sId = psaSS_stbFindActSrv( NO_ENTRY ); + + if( sId NEQ NO_ENTRY ) + { + if(ssShrdPrm.stb[sId].ussd_operation) + { + psaSS_EndTrns(sId); + ssShrdPrm.stb[sId].ntryUsdFlg = FALSE; + ssShrdPrm.stb[sId].ussd_operation = FALSE; /* probably not really necessary */ + return(AT_CMPL); + } + if(ssShrdPrm.stb[sId].curCmd EQ KSD_CMD_USSD OR + ssShrdPrm.stb[sId].curCmd EQ AT_CMD_CUSD) + { + srcBuf = ssShrdPrm.stb[sId].srvOwn; + psaSS_EndTrns(sId); + ssShrdPrm.stb[sId].ntryUsdFlg = FALSE; + ssShrdPrm.stb[sId].ussd_operation = FALSE; /* probably not really necessary */ + ssShrdPrm.stb[sId].curCmd = AT_CMD_NONE; + if( srcBuf NEQ srcId ) + { + R_AT( RAT_CME, srcBuf ) + ( ssShrdPrm.stb[sId].curCmd, CME_ERR_Unknown ); + } + return( AT_CMPL ); + } + } + return( AT_FAIL ); + +} + + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH | +| ROUTINE : sAT_Abort | ++-------------------------------------------------------------------+ + + PURPOSE : abort command execution for passed command. + +*/ + +GLOBAL T_ACI_RETURN sAT_Abort ( T_ACI_CMD_SRC srcId, + T_ACI_AT_CMD cmd ) +{ + UBYTE idx; /* holds call table index */ + UBYTE srcBuf; /* buffers current source of command */ + BOOL doneFlg = FALSE; /* flags that an action was done */ + USHORT nsapi_set = 0; /* for deactivation of context if activation + command is aborted */ + SHORT ret_val = -1; /* Return value used when AT+COPS is aborted */ + TRACE_FUNCTION ("sAT_Abort()"); +/* + *------------------------------------------------------------------- + * determine if command is abortable + *------------------------------------------------------------------- + */ + switch( cmd ) + { + /* + *--------------------------------------------------------------- + * for SIM related commands + *--------------------------------------------------------------- + */ + case( AT_CMD_CFUN ): /* +CFUN command id */ + case( AT_CMD_BAND ): /* %BAND command id */ + case( AT_CMD_CPIN ): /* +CPIN command id */ + if( simEntStat.curCmd EQ cmd ) + { + TRACE_EVENT("Command abortion for CFUN/CPIN"); + if( simEntStat.entOwn NEQ srcId ) + { + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmd, CME_ERR_Unknown ); + } + simEntStat.entOwn = OWN_NONE; + simEntStat.curCmd = AT_CMD_NONE; + return( AT_CMPL ); + } + else if( mmEntStat.curCmd EQ cmd ) /* can happen with AT%band */ + { + TRACE_EVENT("Command abortion for %%BAND"); + if( mmEntStat.entOwn NEQ srcId ) + { + R_AT( RAT_CME, simEntStat.entOwn ) + ( cmd, CME_ERR_Unknown ); + } + mmEntStat.entOwn = OWN_NONE; + mmEntStat.curCmd = AT_CMD_NONE; + return( AT_CMPL ); + } + break; + + /* + *--------------------------------------------------------------- + * for phone book related commands + *--------------------------------------------------------------- + */ + case( AT_CMD_CPBW ): + if (cmhPrm[srcId].phbCmdPrm.curCmd EQ AT_CMD_CPBW) + { + cmhPrm[srcId].phbCmdPrm.curCmd = AT_CMD_NONE; + return (AT_CMPL); + } + break; + + /* + *--------------------------------------------------------------- + * for MM related commands + *--------------------------------------------------------------- + */ + case( AT_CMD_COPS ): /* +COPS command id */ + case( AT_CMD_P_COPS ): /* %COPS command id */ + case( AT_CMD_NRG ): /* %NRG command id */ + if( mmEntStat.curCmd EQ cmd ) + { + TRACE_EVENT("Command abortion for COPS/NRG"); + if( mmEntStat.entOwn NEQ srcId ) + { + R_AT( RAT_CME, mmEntStat.entOwn ) + ( cmd, CME_ERR_Unknown ); + } + if( (cmd EQ AT_CMD_COPS) OR (cmd EQ AT_CMD_P_COPS) ) + { + mmShrdPrm.regMode = mmShrdPrm.regModeBeforeAbort; /* AT_CMD_COPS aborted, restore regMode and COPSmode */ + mmShrdPrm.COPSmode = mmShrdPrm.COPSmodeBeforeAbort; + + switch (mmShrdPrm.COPSmode) + { + case COPS_MOD_Dereg: +#if defined (GPRS) AND defined (DTI) + mmShrdPrm.nrgCs = GMMREG_DT_COMB; + ret_val = psaG_MM_CMD_DEREG ( mmShrdPrm.nrgCs ); +#else + mmShrdPrm.nrgCs = CS_SIM_REM; + ret_val = psaMM_DeRegistrate(); +#endif + break; + + case COPS_MOD_Auto: +#if defined (GPRS) AND defined (DTI) + ret_val = psaG_MM_CMD_REG (); /* register to network */ +#else + ret_val = psaMM_Registrate(); /* register to network */ +#endif + break; + + case COPS_MOD_Man: + if( mmShrdPrm.usedPLMN.v_plmn EQ VLD_PLMN ) + { + mmShrdPrm.slctPLMN = mmShrdPrm.usedPLMN; + } + else + { + mmShrdPrm.slctPLMN.v_plmn = VLD_PLMN; + cmhMM_CnvrtINT2PLMN( 0xFFF, + 0xFFF, + mmShrdPrm.slctPLMN.mcc, + mmShrdPrm.slctPLMN.mnc ); + } + +#if defined (GPRS) AND defined (DTI) + ret_val = psaG_MM_CMD_NET_SEL(); /* register to network */ +#else + ret_val = psaMM_NetSel(); /* register to network */ +#endif + break; + + case COPS_MOD_Both: + if (mmShrdPrm.regMode EQ MODE_AUTO) + { + mmShrdPrm.regModeAutoBack = FALSE; +#if defined (GPRS) AND defined (DTI) + ret_val = psaG_MM_CMD_REG (); /* register to network */ +#else + ret_val = psaMM_Registrate(); /* register to network */ +#endif + } + else + { + mmShrdPrm.regModeAutoBack = TRUE; + if( mmShrdPrm.usedPLMN.v_plmn EQ VLD_PLMN ) + { + mmShrdPrm.slctPLMN = mmShrdPrm.usedPLMN; + } + else + { + mmShrdPrm.slctPLMN.v_plmn = VLD_PLMN; + cmhMM_CnvrtINT2PLMN( 0xFFF, + 0xFFF, + mmShrdPrm.slctPLMN.mcc, + mmShrdPrm.slctPLMN.mnc ); + } + } +#if defined (GPRS) AND defined (DTI) + ret_val = psaG_MM_CMD_NET_SEL(); /* register to network */ +#else + ret_val = psaMM_NetSel(); /* register to network */ +#endif + break; + } /* end of switch case */ + + if (ret_val < 0) + { + TRACE_EVENT( "FATAL RETURN in sAT_Abort()" ); + ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal ); + } + } /* end of AT_CMD_COPS */ + + mmEntStat.entOwn = OWN_NONE; + mmEntStat.curCmd = AT_CMD_NONE; + return( AT_CMPL ); + } + break; + + /* + *--------------------------------------------------------------- + * for CC related commands + *--------------------------------------------------------------- + */ + case( AT_CMD_D ): /* D command id */ + + for (idx = 0; idx < MAX_CALL_NR; idx++) + { + if (ccShrdPrm.ctb[idx] NEQ NULL) + { + if ((psaCC_ctb(idx)->curCmd EQ cmd AND + (psaCC_ctb(idx)->calStat EQ CS_ACT_REQ OR + psaCC_ctb(idx)->calStat EQ CS_DSC_REQ)) + OR + (psaCC_ctb(idx)->calStat EQ CS_ACT AND + (cmhCC_getcalltype(idx) NEQ VOICE_CALL))) + { + doneFlg = TRUE; + srcBuf = psaCC_ctb(idx)->curSrc; + + cmhCC_tstAndUnflagCall( idx, &cmhPrm[srcBuf].ccCmdPrm.mltyCncFlg ); + cmhCC_flagCall ( idx, &cmhPrm[srcId ].ccCmdPrm.mltyDscFlg ); + + psaCC_ctb(idx)->curCmd = AT_CMD_ABRT; + psaCC_ctb(idx)->curSrc = srcId; + psaCC_ctb(idx)->nrmCs = MNCC_CAUSE_CALL_CLEAR; + + psaCC_ClearCall (idx); + + if( srcBuf NEQ srcId ) + { + R_AT( RAT_NO_CARRIER, srcBuf ) ( AT_CMD_D, idx+1 ); + } + } + } + } + if( doneFlg EQ TRUE) + return( AT_EXCT ); + + for( idx = 0; idx < MAX_CALL_NR; idx++ ) + { + if (ccShrdPrm.ctb[idx] NEQ NULL AND + psaCC_ctb(idx)->curCmd EQ cmd AND + psaCC_ctb(idx)->calStat EQ CS_MDF_REQ) + { + srcBuf = psaCC_ctb(idx)->curSrc; + + cmhCC_tstAndUnflagCall( idx, &cmhPrm[srcBuf].ccCmdPrm.mltyCncFlg ); + + psaCC_ctb(idx)->curCmd = AT_CMD_NONE; + psaCC_ctb(idx)->curSrc = CMD_SRC_NONE; + doneFlg = TRUE; + } + } + if( doneFlg ) + { + if( /*lint -e(644)*/srcBuf NEQ srcId ) + { + R_AT( RAT_CME, srcBuf ) + ( AT_CMD_D, CME_ERR_Unknown ); + } + return( AT_CMPL ); + } + + for( idx = 0; idx < MAX_SS_NR; idx++ ) + { + if( (ssShrdPrm.stb[idx].curCmd EQ KSD_CMD_CB OR + ssShrdPrm.stb[idx].curCmd EQ KSD_CMD_CF OR + ssShrdPrm.stb[idx].curCmd EQ KSD_CMD_CW OR + ssShrdPrm.stb[idx].curCmd EQ KSD_CMD_CL OR + ssShrdPrm.stb[idx].curCmd EQ KSD_CMD_PWD OR + ssShrdPrm.stb[idx].curCmd EQ KSD_CMD_USSD )) + { + srcBuf = ssShrdPrm.stb[idx].srvOwn; + /* PATCH LE 26.06.00 */ + /* End transaction in SS */ + psaSS_EndTrns(idx); + /* END PATCH LE 26.06.00 */ + ssShrdPrm.stb[idx].ntryUsdFlg = FALSE; + ssShrdPrm.stb[idx].curCmd = AT_CMD_NONE; + doneFlg = TRUE; + } + } + if( doneFlg ) + { + if( srcBuf NEQ srcId ) + { + R_AT( RAT_CME, srcBuf ) + ( AT_CMD_D, CME_ERR_Unknown ); + } + return( AT_CMPL ); + } + break; + + case( AT_CMD_A ): /* A command id */ + + for( idx = 0; idx < MAX_CALL_NR; idx++ ) + { + if (ccShrdPrm.ctb[idx] NEQ NULL) + { + if (psaCC_ctb(idx)->curCmd EQ cmd AND + (psaCC_ctb(idx)->calStat EQ CS_ACT_REQ OR + psaCC_ctb(idx)->calStat EQ CS_CPL_REQ OR + psaCC_ctb(idx)->calStat EQ CS_DSC_REQ)) + { + doneFlg = TRUE; + srcBuf = psaCC_ctb(idx)->curSrc; + + cmhCC_tstAndUnflagCall( idx, &cmhPrm[srcBuf].ccCmdPrm.mltyCncFlg ); + cmhCC_flagCall ( idx, &cmhPrm[srcId ].ccCmdPrm.mltyDscFlg ); + + psaCC_ctb(idx)->curCmd = AT_CMD_ABRT; + psaCC_ctb(idx)->curSrc = srcId; + psaCC_ctb(idx)->nrmCs = MNCC_CAUSE_CALL_CLEAR; + + psaCC_ClearCall (idx); + + if( srcBuf NEQ srcId ) + { + R_AT( RAT_NO_CARRIER, srcBuf ) ( AT_CMD_A, idx+1 ); + } + } + } + } + if( doneFlg ) + return( AT_EXCT ); + + for( idx = 0; idx < MAX_CALL_NR; idx++ ) + { + if (ccShrdPrm.ctb[idx] NEQ NULL AND + psaCC_ctb(idx)->curCmd EQ cmd AND + psaCC_ctb(idx)->calStat EQ CS_MDF_REQ) + { + srcBuf = psaCC_ctb(idx)->curSrc; + + cmhCC_tstAndUnflagCall( idx, &cmhPrm[srcBuf].ccCmdPrm.mltyCncFlg ); + + psaCC_ctb(idx)->curCmd = AT_CMD_NONE; + psaCC_ctb(idx)->curSrc = CMD_SRC_NONE; + doneFlg = TRUE; + } + } + if( doneFlg ) + { + if( srcBuf NEQ srcId ) + { + R_AT( RAT_CME, srcBuf ) + ( AT_CMD_A, CME_ERR_Unknown ); + } + return( AT_CMPL ); + } + break; + + case( AT_CMD_Z ): /* Z command id */ + case( AT_CMD_CHUP ): /* +CHUP command id */ + case( AT_CMD_CHLD ): /* +CHLD command id */ + case( AT_CMD_CTFR ): /* +CTFR command id */ + + for( idx = 0; idx < MAX_CALL_NR; idx++ ) + { + if (ccShrdPrm.ctb[idx] NEQ NULL AND + psaCC_ctb(idx)->curCmd EQ cmd) + { + srcBuf = psaCC_ctb(idx)->curSrc; + + cmhCC_tstAndUnflagCall( idx, &cmhPrm[srcBuf].ccCmdPrm.mltyCncFlg ); + cmhCC_tstAndUnflagCall( idx, &cmhPrm[srcBuf].ccCmdPrm.mltyDscFlg ); + + psaCC_ctb(idx)->curCmd = AT_CMD_NONE; + psaCC_ctb(idx)->curSrc = CMD_SRC_NONE; + doneFlg = TRUE; + } + } + if( doneFlg ) + { + if( srcBuf NEQ srcId ) + { + R_AT( RAT_CME, srcBuf ) + ( cmd, CME_ERR_Unknown ); + } + return( AT_CMPL ); + } + break; + + case( AT_CMD_VTS ): /* +VTS command id */ + + for( idx = 0; idx < MAX_CALL_NR; idx++ ) + { + if (ccShrdPrm.ctb[idx] NEQ NULL AND + psaCC_ctb(idx)->dtmfCmd EQ cmd) + { + if (psaCC_ctb(idx)->dtmfMode NEQ DTMF_MOD_AUTO) /* DTMF in Auto Mode is not abortable + since the tone is always immediately stopped + after the network confirmed the tone to CC. So + it makes absolut no sense to abort the VTS nor + does this have any effect on the length of the tone. */ + { + srcBuf = psaCC_ctb(idx)->dtmfSrc; + psaCC_ctb(idx)->dtmfCmd = AT_CMD_NONE; + psaCC_ctb(idx)->dtmfSrc = CMD_SRC_NONE; + sAT_PlusVTS( srcId, ccShrdPrm.dtmf.dig[0], VTS_MOD_ManStop ); + doneFlg = TRUE; + } + } + } + if( doneFlg ) + { + if( srcBuf NEQ srcId ) + { + R_AT( RAT_CME, srcBuf ) + ( AT_CMD_VTS, CME_ERR_Unknown ); + } + return( AT_CMPL ); + } + + break; + + /* + *--------------------------------------------------------------- + * for SS related commands + *--------------------------------------------------------------- + */ + case( AT_CMD_CLIR ): /* +CLIR command id */ + case( AT_CMD_CLIP ): /* +CLIP command id */ + case( AT_CMD_COLP ): /* +COLP command id */ + case( AT_CMD_CCFC ): /* +CCFC command id */ + case( AT_CMD_CLCK ): /* +CLCK command id */ + case( AT_CMD_CCWA ): /* +CCWA command id */ + case( AT_CMD_CPWD ): /* +CPWD command id */ + case( AT_CMD_CUSD ): /* +CUSD command id */ + + for( idx = 0; idx < MAX_SS_NR; idx++ ) + { + if( ssShrdPrm.stb[idx].curCmd EQ cmd ) + { + srcBuf = ssShrdPrm.stb[idx].srvOwn; + psaSS_EndTrns(idx); + cmhPrm[srcId].ssCmdPrm.mltyTrnFlg = 0; + ssShrdPrm.stb[idx].ntryUsdFlg = FALSE; + ssShrdPrm.stb[idx].curCmd = AT_CMD_NONE; + doneFlg = TRUE; + } + } + if( simEntStat.curCmd EQ AT_CMD_CLCK ) + { + simEntStat.curCmd = AT_CMD_NONE; + doneFlg = TRUE; + } + if( doneFlg ) + { + if( srcBuf NEQ srcId ) + { + R_AT( RAT_CME, srcBuf ) + ( cmd, CME_ERR_Unknown ); + } + return( AT_CMPL ); + } + break; /* SS not implemented */ + + /* + *--------------------------------------------------------------- + * for SMS related commands + *--------------------------------------------------------------- + */ + case( AT_CMD_CMGD ): /* +CMGD command id */ + case( AT_CMD_CMGW ): /* +CMGW command id */ + case( AT_CMD_CMGS ): /* +CMGS command id */ + case( AT_CMD_CMSS ): /* +CMSS command id */ + case( AT_CMD_CSMP ): /* +CSMP command id */ + case( AT_CMD_CSCA ): /* +CSCA command id */ + + if( smsShrdPrm.smsEntStat.curCmd EQ cmd ) + { + if( smsShrdPrm.smsEntStat.entOwn NEQ srcId ) + { + R_AT( RAT_CMS, smsShrdPrm.smsEntStat.entOwn ) + ( cmd, CMS_ERR_UnknownErr, NULL ); + } + + smsShrdPrm.smsEntStat.entOwn = OWN_NONE; + smsShrdPrm.smsEntStat.curCmd = AT_CMD_NONE; + return( AT_CMPL ); + } + + break; + +#ifdef GPRS + /* brz:to check + /* + *--------------------------------------------------------------- + * for GMM related commands + *--------------------------------------------------------------- + */ + case( AT_CMD_CGATT ): /* +CGATT command id */ + case( AT_CMD_CGCLASS ): /* +CGCLASS command id */ + if( gmmEntStat.curCmd EQ cmd ) + { + TRACE_EVENT("Command abortion for CGATT/CGCLASS/CGAUTO"); + if( gmmEntStat.entOwn NEQ srcId ) + { + R_AT( RAT_CME, gmmEntStat.entOwn ) + ( cmd, CME_ERR_Unknown ); + } + gmmEntStat.entOwn = OWN_NONE; + gmmEntStat.curCmd = AT_CMD_NONE; + return( AT_CMPL ); + } + + break; + /* + *--------------------------------------------------------------- + * for SM related commands + *--------------------------------------------------------------- + */ + case( AT_CMD_CGACT ): /* +CGACT command id */ + if( smEntStat.curCmd EQ cmd ) + { + TRACE_EVENT("Command abortion for CGACT"); + if( smEntStat.entOwn NEQ srcId ) + { + R_AT( RAT_CME, smEntStat.entOwn ) + ( cmd, CME_ERR_Unknown ); + } + switch(get_state_working_cid()) + { + case CS_WAITS_FOR_ACTIVATING: + case CS_ACTIVATING: + case CS_ACTIVATED: + smEntStat.entOwn = OWN_NONE; + smEntStat.curCmd = AT_CMD_NONE; + nsapi_set = cmhSM_Give_nsapi_set( work_cids[cid_pointer] ); + if ( nsapi_set ) + { + set_state_working_cid( CS_DEACTIVATE_NORMAL ); + psaSM_PDP_Deactivate( nsapi_set, SMREG_NONLOCAL); + } + else + { + set_state_working_cid( CS_DEFINED ); + *work_cids = 0; + cid_pointer = 0; + } + break; + } + return( AT_CMPL ); + } + break; /* LINT warning */ + case( AT_CMD_CGDATA ): /* +CGDATA command id */ + if( gpppEntStat.curCmd EQ cmd || + smEntStat.curCmd EQ cmd ) + { + TRACE_EVENT("Command abortion for CGDATA"); + if( gpppEntStat.entOwn NEQ srcId && + smEntStat.entOwn NEQ srcId ) + { + R_AT( RAT_CME, gpppEntStat.entOwn ) + ( cmd, CME_ERR_Unknown ); + } + + return cmhSM_deactivateAContext(srcId, work_cids[cid_pointer] ); + } + break; + + case( AT_CMD_CGANS ): /* +CGANS command id */ + + if( smEntStat.curCmd EQ cmd ) + { + TRACE_EVENT("Command abortion for CGANS"); + if( smEntStat.entOwn NEQ srcId ) + { + R_AT( RAT_CME, smEntStat.entOwn ) + ( cmd, CME_ERR_Unknown ); + } + smEntStat.entOwn = OWN_NONE; + smEntStat.curCmd = AT_CMD_NONE; + doneFlg = TRUE; + } + + if( gpppEntStat.curCmd EQ cmd ) + { + if( gpppEntStat.entOwn NEQ srcId ) + { + R_AT( RAT_CME, gpppEntStat.entOwn ) + ( cmd, CME_ERR_Unknown ); + } + gpppEntStat.entOwn = OWN_NONE; + gpppEntStat.curCmd = AT_CMD_NONE; + return( AT_EXCT ); + } + + if( doneFlg == TRUE ) + return( AT_EXCT ); + break; + + case( AT_CMD_CGSMS ): /* +CGSMS command id */ + if( smEntStat.curCmd EQ cmd ) + { + TRACE_EVENT("Command abortion for CGSMS"); + if( smEntStat.entOwn NEQ srcId ) + { + R_AT( RAT_CME, smEntStat.entOwn ) + ( cmd, CME_ERR_Unknown ); + } + smEntStat.entOwn = OWN_NONE; + smEntStat.curCmd = AT_CMD_NONE; + } + return AT_CMPL; + +#endif /*GPRS*/ + + } + + return( AT_FAIL ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| ROUTINE : cmh_mergeTOA | ++-------------------------------------------------------------------+ + + PURPOSE : this function converts the type of number (TON) and the + numbering plan identification into the octet representation + according to GSM 04.08 ( 10.5.4.7 ). +*/ + +GLOBAL UBYTE cmh_mergeTOA ( UBYTE ton, UBYTE npi ) +{ + +/* + *------------------------------------------------------------------- + * convert TON and NPI + *------------------------------------------------------------------- + */ + return( ((ton & 0x07)<<4)+ + ((npi & 0x0F)<<0)+0x80 ); + +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| ROUTINE : cmh_mergeTOS | ++-------------------------------------------------------------------+ + + PURPOSE : this function converts the type of subaddress (TOS) and the + odd/even indicator into the octet representation + according to GSM 04.08 ( 10.5.4.8 ). + +*/ + +GLOBAL UBYTE cmh_mergeTOS ( UBYTE tos, UBYTE oe ) +{ + +/* + *------------------------------------------------------------------- + * convert TOS and odd/even + *------------------------------------------------------------------- + */ + return( ((tos & 0x07)<<4)+ + ((oe & 0x01)<<3)+0x80 ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| ROUTINE : cmh_demergeTOA | ++-------------------------------------------------------------------+ + + PURPOSE : this function converts the the octet representation + according to GSM 04.08 ( 10.5.4.7 ) into type of number + (TON) and the numbering plan identification. +*/ + +GLOBAL void cmh_demergeTOA ( UBYTE toa, UBYTE* ton, UBYTE* npi ) +{ + +/* + *------------------------------------------------------------------- + * convert TON and NPI + *------------------------------------------------------------------- + */ + *ton = (toa>>4) & 0x07; + *npi = (toa>>0) & 0x0F; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| ROUTINE : cmh_demergeTOS | ++-------------------------------------------------------------------+ + + PURPOSE : this function converts the octet representation + according to GSM 04.08 ( 10.5.4.8 ) into the type of + subaddress (TOS) and the odd/even indicator. + +*/ + +GLOBAL void cmh_demergeTOS ( UBYTE tosa, UBYTE* tos, UBYTE* oe ) +{ + +/* + *------------------------------------------------------------------- + * convert TOS and odd/even + *------------------------------------------------------------------- + */ + *tos = (tosa>>4) & 0x07; + *oe = (tosa>>3) & 0x01; +} + + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| STATE : code ROUTINE : cmh_setToaDef | ++--------------------------------------------------------------------+ + + PURPOSE : This function sets the type of address to default values + (when the first character of address is '+' or the first + two characters are '0' default is 145 otherwise default + is 129) +*/ +GLOBAL CHAR* cmh_setToaDef ( CHAR* number, T_ACI_TOA *toa ) +{ + toa->npi = NPI_IsdnTelephony; + + if ( *number EQ '+' ) + { + toa->ton = TON_International; + return number+1; + } + else + { + toa->ton = TON_Unknown; + return number; + } +} + + + + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| ROUTINE : cmh_packBCD | ++-------------------------------------------------------------------+ + + PURPOSE : packing two BCD values in one octet + <bcd_out> resulting packed BCD numbers + <char_in> BCD values input per character + <len_in> number of BCD values to be packed + RETURN : number of packed octets +*/ + +GLOBAL USHORT cmh_packBCD (UBYTE *bcd_out, const UBYTE *char_in, + USHORT len_in) +{ + USHORT no_oct = 0, i; + + if (len_in > MAX_SMS_ADDR_DIG) /* check length */ + len_in = MAX_SMS_ADDR_DIG; + + for (i = 0; i < len_in; i++) + { + if ((i & 1) EQ 0) /* pack high nibble */ + { + no_oct++; + *bcd_out = *char_in++ | 0xF0; /* in case of odd length */ + } + else /* pack low nibble */ + *bcd_out++ &= (*char_in++ << 4) | 0xF; + } + return no_oct; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| ROUTINE : cmh_unpackBCD | ++-------------------------------------------------------------------+ + + PURPOSE : unpacking one octet in two BCD values + <char_out> resulting unpacked BCD values + <bcd_in> BCD numbers input + <len_in> number of octets to be unpacked + RETURN : number of unpacked BCD values +*/ + +GLOBAL USHORT cmh_unpackBCD (UBYTE *char_out, const UBYTE *bcd_in, + USHORT len_in) +{ + USHORT no_bcd = 0, i; + + if (len_in > MAX_SMS_ADDR_DIG/2) /* check length */ + len_in = MAX_SMS_ADDR_DIG/2; + + for (i = 0; i < len_in; i++) + { + if ((*bcd_in & 0xF) NEQ 0xF) /* in case of wrong length */ + { + *char_out++ = *bcd_in & 0xF; /* unpack low nibble */ + no_bcd++; + } + else + break; + if ((*bcd_in & 0xF0) NEQ 0xF0) /* in case of odd length */ + { + *char_out++ = *bcd_in++ >> 4; /* unpack high nibble */ + no_bcd++; + } + else + break; + } + return no_bcd; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| ROUTINE : cmh_unpackSCTS | ++-------------------------------------------------------------------+ + + PURPOSE : unpacking SCTS (or validity period absolute) to the + T_ACI_VP_ABS structure +*/ +GLOBAL void cmh_unpackSCTS (T_ACI_VP_ABS *scts, const UBYTE *buf_in) +{ + + UBYTE lsb, msb, sign; + + cmh_unpackBCD ((UBYTE*)scts, buf_in, 6); + + /* get the time zone octet */ + buf_in += 6; + + lsb = *buf_in >> 4; + msb = *buf_in & 0x07; + scts->timezone = (msb *10) + lsb; /* BCD */ + sign = *buf_in & 0x08; + if (sign) + scts->timezone = -scts->timezone; /* ~scts->timezone + 1; */ +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| ROUTINE : cmh_logRslt | ++-------------------------------------------------------------------+ + + PURPOSE : log result code. + +*/ + +GLOBAL void cmh_logRslt ( T_ACI_CMD_SRC dest, RAT_ID rat, + T_ACI_AT_CMD cmd, SHORT cId, + T_ACI_BS_SPEED spd, T_ACI_CME_ERR err ) +{ +#if defined SMI OR defined MFW OR defined FF_MMI_RIV + T_ACI_RLOG rslt; /* holds result pararmeter */ + + rslt.dest = dest; + + switch( rat ) + { + case( RAT_OK ): + + rslt.atRslt = RLOG_RSLT_OK; + rslt.rsltPrm.rOK.cmdId = cmd; + rslt.rsltPrm.rOK.cId = cId; + break; + + case( RAT_NO_CARRIER ): + + rslt.atRslt = RLOG_RSLT_NoCarrier; + rslt.rsltPrm.rNO_CARRIER.cmdId = cmd; + rslt.rsltPrm.rNO_CARRIER.cId = cId; + break; + + case( RAT_CONNECT ): + + rslt.atRslt = RLOG_RSLT_Connect; + rslt.rsltPrm.rCONNECT.cmdId = cmd; + rslt.rsltPrm.rCONNECT.cId = cId; + rslt.rsltPrm.rCONNECT.speed = spd; + break; + + case( RAT_BUSY ): + + rslt.atRslt = RLOG_RSLT_Busy; + rslt.rsltPrm.rBUSY.cmdId = cmd; + rslt.rsltPrm.rBUSY.cId = cId; + break; + + case( RAT_NO_ANSWER ): + + rslt.atRslt = RLOG_RSLT_NoAnswer; + rslt.rsltPrm.rNO_ANSWER.cmdId = cmd; + rslt.rsltPrm.rNO_ANSWER.cId = cId; + break; + + case( RAT_CME ): + + rslt.atRslt = RLOG_RSLT_CME; + rslt.rsltPrm.rCME.cmdId = cmd; + rslt.rsltPrm.rCME.err = err; + rslt.rsltPrm.rCME.cId = cId; + break; + + default: + + return; + } + + rAT_PercentRLOG( &rslt ); +#endif +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| ROUTINE : cmh_cvtToDefGsm | ++-------------------------------------------------------------------+ + + PURPOSE : converts from internal GSM to default GSM alphabet. + +*/ +GLOBAL void cmh_cvtToDefGsm ( CHAR* in, CHAR* out, USHORT* len ) +{ + USHORT i; /* used for counting */ + + *len = ( USHORT ) strlen ( in ); + + for ( i = 0; i < *len; i++ ) + out[i] = in[i] & 0x7F; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| ROUTINE : cmh_cvtFromDefGsm | ++-------------------------------------------------------------------+ + + PURPOSE : converts from default GSM to internal GSM alphabet. + +*/ +GLOBAL void cmh_cvtFromDefGsm ( CHAR* in, USHORT len, CHAR* out ) +{ + USHORT i; /* used for counting */ + + for ( i = 0; i < len; i++ ) + out[i] = in[i] | 0x80; + + out[len] = '\0'; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT: GSM-PS (6147) MODULE: ACI_CMD | +| STATE : code ROUTINE: cmh_set_delayed_call| ++--------------------------------------------------------------------+ + + PURPOSE : Set function pointer for general-purpose timer routine. + TRUE, if delayed call timer slot is available + FALSE otherwise + setting call=NULL always succeeds. +*/ +static UCHAR (*cmh_timeout_delayed_call) (void*) = NULL; +static void* cmh_timeout_delayed_arg = NULL; + +GLOBAL UBYTE cmh_set_delayed_call (UCHAR (*call) (void*), void* arg) +{ + UCHAR ret; + if (cmh_timeout_delayed_call EQ NULL + OR cmh_timeout_delayed_call EQ call + OR call EQ NULL) + { + cmh_timeout_delayed_call = call; + cmh_timeout_delayed_arg = arg; + ret = TRUE; + } + else ret = FALSE; + return ret; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT: GSM-PS (6147) MODULE: ACI_CMD | +| STATE : code ROUTINE: cmh_set_delayed_call| ++--------------------------------------------------------------------+ + + PURPOSE : start timer for general-purpose timer routine. + TRUE, if delayed call timer slot has been set before +*/ + +GLOBAL UBYTE cmh_start_delayed_call (ULONG ms) +{ + UBYTE ret; + if (cmh_timeout_delayed_call NEQ NULL) { + TRACE_FUNCTION ("cmh_start_delayed_call()"); + vsi_t_start (hCommACI, ACI_TDELAY, ms); + ret = TRUE; + } else ret = FALSE; + return ret; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT: GSM-PS (6147) MODULE: ACI_CMD | +| STATE : code ROUTINE: cmh_timeout | ++--------------------------------------------------------------------+ + + PURPOSE : A timeout has occured for a timer. The function returns + TRUE, if it is a timer which is handled by CMH, else FALSE + is returned to indicate that the timer has not been + processed. + +*/ + +GLOBAL UBYTE cmh_timeout (USHORT index) +{ + TRACE_FUNCTION ("cmh_timeout()"); + + if (index EQ ACI_TMPTY) + { + /* + * timeout multiparty timer + */ + cmhCC_MPTYTimeout(); + return TRUE; + } + + if (index EQ ACI_TECT) + { + /* + * timeout multiparty timer + */ + cmhCC_ECTTimeout(); + return TRUE; + } + +#ifdef FF_FAX + if (index EQ ACI_TFIT) + { + /* + * timeout FAX inactivity timer + */ + cmhT30_FITTimeout(); + return TRUE; + } +#endif /* FF_FAX */ + + if (index EQ ACI_TDELAY) + { + /* + * timeout delayed call timer + */ + if (cmh_timeout_delayed_call EQ NULL) + { + vsi_t_stop (hCommACI, ACI_TDELAY); + } + else if (!cmh_timeout_delayed_call (cmh_timeout_delayed_arg)) + { + cmh_timeout_delayed_call = NULL; + vsi_t_stop (hCommACI, ACI_TDELAY); + } + return TRUE; + } + + if (index EQ ACI_REPEAT_HND) + { + /* redial timer is elapsed */ + cmhCC_redialTimeout(); + } + /* + * the timeout is not for CMH + */ + return FALSE; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| ROUTINE : cmh_bldCalPrms | ++-------------------------------------------------------------------+ + + PURPOSE : this function converts a dial string into the settings + for the called address parameters. +*/ + +/******************************************* +This function is intended only to be called ONCE +for a given number... +Otherwise, TOA info might be corrupted +********************************************/ +GLOBAL SHORT cmh_bldCalPrms ( char * pDialStr, T_CLPTY_PRM * calPrm ) +{ + char * pSubAdr; /* points to subaddress */ + int i; + int len = strlen(pDialStr); + + TRACE_FUNCTION("cmh_bldCalPrms()"); + +/* seach for subaddress */ + pSubAdr = strchr( pDialStr, '-' ); + if ( pSubAdr NEQ NULL ) /* subaddress found */ + { + *pSubAdr = 0x0; /* cut off subaddress */ + pSubAdr++; + + /* + * fill in subaddress information + */ + calPrm -> tos = TOS_NSAP; + strncpy( calPrm->sub, pSubAdr, MAX_SUBADDR_LEN-1 ); + calPrm->sub[MAX_SUBADDR_LEN-1] = 0x0; + calPrm -> oe = (strlen(calPrm->sub) & 1)? OE_ODD : OE_EVEN; + } + else /* subaddress not found */ + { + calPrm -> tos = TOS_NOT_PRES; + calPrm -> oe = OE_EVEN; + calPrm->sub[0] = 0x0; + } + +/* fill in address information */ + + /* Sign "+" could be found anywhere in the string: + for instance in a Key Stroke Sequence */ + + /* Copy character until '+' digit */ + for (i = 0; (i < len) && (pDialStr[i] != '+'); i++) + calPrm->num[i] = pDialStr[i]; + + if (i != len) + { + calPrm->ton = TON_INT_NUMB; + + /* Skip '+' digit and copy next characters */ + for (i++; i < len; i++) + calPrm->num[i-1] = pDialStr[i]; + i--; + } + else + calPrm->ton = TON_UNKNOWN; + + /* Copy EOS */ + calPrm->num[i] = '\0'; + + calPrm -> npi = NPI_ISDN_TEL_NUMB_PLAN; + + return 0; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| ROUTINE : percentCSTAT_stateField | ++-------------------------------------------------------------------+ + + PURPOSE : This function calls the %CSTAT callback and + handels the occurance of %CSTAT and + %CSTAT: RDY indication. +*/ +GLOBAL void percentCSTAT_indication(T_ACI_ENTITY_ID_MSG entityId, + T_ACI_ENTITY_STATE_MSG entityState) +{ + T_ACI_STATE_MSG msgType; + int i = 0; + msgType.entityId = entityId; + msgType.entityState = entityState; + + for(; i < CMD_SRC_MAX; i++) + { + R_AT( RAT_CSTAT, i)(msgType); + } + if( (percentCSTAT_stateField >> entityId & 1U) EQ (unsigned) entityState ) + { + percentCSTAT_stateField ^= 1U << entityId; + } + + if(!percentCSTAT_stateField) + { + msgType.entityId = STATE_MSG_RDY; + for(i = 0; i < CMD_SRC_MAX; i++) + { + R_AT( RAT_CSTAT, i)(msgType); + } + } +} + + +/* ++-------------------------------------------------------------------+ +| PROJECT : MODULE : CMH_F | +| ROUTINE : aci_rat_cmd_mode | ++-------------------------------------------------------------------+ + + PURPOSE : This function is used by the R_AT macro and determines + the command mode that should be used to send the response. + +*/ +GLOBAL T_ACI_CMD_MODE aci_rat_cmd_mode( + RAT_ID cmd, + T_ACI_CMD_SRC src) +{ + T_ACI_CMD_MODE mode; + + if (src!=CMD_SRC_NONE) + { + if (src<CMD_SRC_MAX) + { + if (IS_SRC_USED(src)) + { + + /* + * Get the command mode for the specified source. + */ + mode = aci_cmd_src_mode_get(src); + + /* + * If RATJmpTbl is populated for the specified command mode + * and command, indicate this by returning the command mode. + * The nature of the R_AT macro is such that it is not possible + * to simply call the function in the table from here. + */ + if (mode NEQ CMD_MODE_NONE) + { + if (RATJmpTbl[cmd][mode]) + { + return(mode); + } + TRACE_EVENT_P2("RATJmpTbl[cmd=%d][mode=%d]", cmd, mode); /* in case of problems */ + } + } + } + } + + /* + * A return value of CMD_MODE_NONE is meant to indicate that the + * response should not be sent at all. + */ + TRACE_EVENT_P1("aci_rat_cmd_mode(): CMD_MODE_NONE for src %d", src); + return(CMD_MODE_NONE); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : MODULE : CMH_F | +| ROUTINE : aci_cmd_src_mode_get | ++-------------------------------------------------------------------+ + + PURPOSE : Access function for reading aci_cmd_src_mode[] which + stores the command mode of each command source. + +*/ +GLOBAL T_ACI_CMD_MODE aci_cmd_src_mode_get( + T_ACI_CMD_SRC src_id) +{ + T_ACI_CMD_MODE mode; + + + if (src_id<CMD_SRC_MAX) + { + mode = aci_cmd_src_mode[src_id]; + TRACE_EVENT_P2("aci_cmd_src_mode_get(): aci_cmd_src_mode[%d] = %d", src_id, mode); + return(mode); + } + else + { + TRACE_EVENT("aci_cmd_src_mode_get(): CMD_MODE_NONE"); + return(CMD_MODE_NONE); + } +} + + +/* ++-------------------------------------------------------------------+ +| PROJECT : MODULE : CMH_F | +| ROUTINE : aci_cmd_src_mode_set | ++-------------------------------------------------------------------+ + + PURPOSE : Access function for writing to aci_cmd_src_mode[] which + stores the command mode of each command source. + +*/ +GLOBAL void aci_cmd_src_mode_set( + UBYTE src_id, + T_ACI_CMD_MODE mode) +{ + if (src_id<CMD_SRC_MAX) + { + aci_cmd_src_mode[src_id]=mode; + TRACE_EVENT_P2("aci_cmd_src_mode_set(): aci_cmd_src_mode[%d] = %d", src_id, mode); + } +} + + +/*==== EOF ========================================================*/