FreeCalypso > hg > fc-magnetite
view src/aci2/aci/ati_csc.c @ 597:f18b29e27be5
First attempt at MCSI voice path automatic switching
The function is implemented at the ACI level in both aci2 and aci3,
successfully avoids triggering the DSP bug on the first call,
but the shutdown of MCSI upon call completion is not working properly yet
in either version.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 27 Mar 2019 22:18:35 +0000 |
parents | 091f5d38afcd |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-F&D (8411) | Modul : ATI +----------------------------------------------------------------------------- | Copyright 2002 Texas Instruments Berlin, AG | All rights reserved. | | This file is confidential and a trade secret of Texas | Instruments Berlin, AG | The receipt of or possession of this file does not convey | any rights to reproduce or disclose its contents or to | manufacture, use, or sell anything it may describe, in | whole, or in part, without the specific written consent of | Texas Instruments Berlin, AG. +----------------------------------------------------------------------------- | Purpose : AT Command: CONDAT specific commands. +----------------------------------------------------------------------------- */ #ifndef ATI_CSC_C #define ATI_CSC_C #undef DUMMY_ATI_STRINGS #include "aci_all.h" #include "aci_cmh.h" #include "ati_cmd.h" #include "aci_io.h" #include "aci_cmd.h" #include "l4_tim.h" #if defined(FF_WAP) || defined(FF_TCP_IP) || defined(FF_GPF_TCPIP) || defined (FF_SAT_E) #include "dti.h" /* functionality of the dti library */ #include "dti_conn_mng.h" #include "wap_aci.h" #include "psa_ppp_w.h" #endif /* FF_WAP || FF_TCP_IP || FF_GPF_TCPIP || FF_SAT_E */ #include "aci_mem.h" #include "ati_cmd.h" #include "aci_lst.h" #include "aci_prs.h" #include "psa_mmi.h" #include "ati_int.h" /* only needed for testing AT%DAR=5 */ /* #include "aci.h" */ #ifdef FF_ATI_BAT #include "typedefs.h" #include "gdd.h" #include "bat.h" #include "ati_bat.h" #endif /* FF_ATI_BAT */ EXTERN UBYTE std; typedef struct { char *name; T_ACI_CUSCFG_FAC fac; } cuscfg_fac; const cuscfg_fac cus_fac[] = { {"CCMOSM", CUSCFG_FAC_MO_SM_Control}, {"CCMOC", CUSCFG_FAC_MO_Call_Control}, {"CCMOSS", CUSCFG_FAC_MO_SS_Control}, {"CCMOUSSD", CUSCFG_FAC_MO_USSD_Control}, {"2BDIAL", CUSCFG_FAC_2_Digit_Call}, {"EUSSDR", CUSCFG_FAC_Ext_USSD_Res}, {0, CUSCFG_FAC_Not_Present} }; #define MAX_FAC_STR_LENGTH 20 #define MAX_VALUE_LENGTH MAX_FAC_STR_LENGTH /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS MODULE : CMH_MMIS | | STATE : code ROUTINE : atPercentCPRIM | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %CPRIM AT command which is used to send a system primitive (CONFIG PRIMITIVE) to a entity or frame. */ GLOBAL T_ATI_RSLT atPercentCPRIM (char *cl, UBYTE srcId) { char receiver_name[10]; char config_str[80]; T_HANDLE receiver_handle; TRACE_FUNCTION ("atPercentCPRIM()"); *receiver_name = '\0'; *config_str = '\0'; cl = parse(cl, "ss", (LONG)sizeof (receiver_name), receiver_name, (LONG)sizeof (config_str), config_str); if(!cl) { cmdCmeError(CME_ERR_OpNotAllow); TRACE_EVENT ("atPercentCPRIM(): parse error"); return (ATI_FAIL); } receiver_handle = vsi_c_open (VSI_CALLER receiver_name); if (receiver_handle < VSI_OK) { cmdCmeError(CME_ERR_OpNotAllow); TRACE_EVENT_P1 ("atPercentCPRIM(): wrong entity [%s]", receiver_name); return (ATI_FAIL); } psaMMI_ConfigPrim (receiver_handle, config_str); vsi_c_close (VSI_CALLER receiver_handle); return (ATI_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : atPercentBAND | +--------------------------------------------------------------------+ PURPOSE : %BAND multiband configuration command */ GLOBAL T_ATI_RSLT setatPercentBAND (CHAR *cl, UBYTE srcId) { T_ACI_BAND_MODE bandMode; USHORT ushort_bandType = 0xFFFF; /* ushort because of parser **##!!## */ T_ACI_RETURN ret = AT_FAIL; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); src_params->curAtCmd = AT_CMD_BAND; cl = parse(cl,"dr",&bandMode,&ushort_bandType); if (cl EQ NULL) { cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } /* prechecking: only place where consistence can be checked (whether bandType parameter is present or not) */ if( bandMode EQ BAND_MODE_Manual AND ( (ushort_bandType & 0xFF00) NEQ 0x0000) ) { TRACE_EVENT("Error: AT%%BAND manual mode but no bands chosen"); cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } else if( bandMode EQ BAND_MODE_Auto AND ushort_bandType NEQ 0xFFFF ) { TRACE_EVENT("Error: AT%%BAND auto mode but band type has been given: inconsistent"); cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } TRACE_EVENT_P1("ushort_bandType: %04X", ushort_bandType); TRACE_EVENT_P1("bandMode: %d", bandMode); #ifdef FF_ATI_BAT { T_BAT_cmd_send cmd; T_BAT_cmd_set_percent_band my_bat_set_percent_band; TRACE_FUNCTION("setatPercentBAND() calls bat_send() <=== as APPLICATION"); memset(&my_bat_set_percent_band, 0, sizeof(my_bat_set_percent_band)); cmd.ctrl_params = BAT_CMD_SET_PERCENT_BAND; cmd.params.ptr_set_percent_band = &my_bat_set_percent_band; my_bat_set_percent_band.mode = bandMode; my_bat_set_percent_band.band = ushort_bandType; bat_send(ati_bat_get_client(srcId), &cmd); return ATI_EXCT; /* executing, because response is passed by callback function */ } #else /* OLD FUNCTION BODY */ TRACE_FUNCTION("setatPercentBAND()"); ret = sAT_PercentBAND(srcId, bandMode, (UBYTE)ushort_bandType); switch (ret) { case (AT_CMPL): break; case (AT_EXCT): break; default: cmdCmeError(CME_ERR_Unknown); break; } return (map_aci_2_ati_rslt(ret)); #endif /* no FF_ATI_BAT*/ } /* at the moment 5 levels of bands are supported */ /* BITS: | 5 | 4 | 3 | 2 | 1 | | GSM850 | E_GSM | GSM1900 | GSM1800 | GSM900 | */ #define HIGHEST_BAND_SUPPORTED (0x1F) GLOBAL T_ATI_RSLT tesatPercentBAND (CHAR *cl, UBYTE srcId) { T_ACI_BAND_MODE MaxBandMode; UBYTE bands_bitfield; T_ACI_RETURN ret = AT_FAIL; UBYTE c_set_bit = 0; USHORT pos = 0; UBYTE i, tested_filter_byte, highest_set_bit_only=0; TRACE_FUNCTION("tesatPercentBAND()"); ret = tAT_PercentBAND( srcId, &MaxBandMode, &bands_bitfield); if( ret NEQ AT_CMPL ) { cmdCmeError(CME_ERR_Unknown); return (ATI_CMPL); } /* initialization of the string */ pos += sprintf(g_sa, "%s: (0-%d)", "%BAND", MaxBandMode); pos += sprintf( g_sa+pos, ",(" ); if(bands_bitfield EQ 0x00) { /* no particular settings from manufacturer */ pos += sprintf( g_sa+pos, "1-%d)", HIGHEST_BAND_SUPPORTED ); } else { /* search holes between highest bit and lowest bit */ for( i=0; i<8 ; i++ ) { tested_filter_byte = 0x01 << i; if( (bands_bitfield & tested_filter_byte) ) { highest_set_bit_only = tested_filter_byte; c_set_bit++; } } if(c_set_bit) /* alignment at the end */ { c_set_bit--; } if( highest_set_bit_only EQ (0x01 << c_set_bit) ) { /* there is no hole in the supported values, form 1 to max_value */ pos += sprintf( g_sa+pos, "1-%d)", bands_bitfield ); } else { for(i=1 ; i<=bands_bitfield; i++) /* bands_bitfield is obviously the highest possible value */ { if( (i & bands_bitfield) EQ i ) { pos += sprintf( g_sa+pos, "%d,", i); } if(pos>MAX_CMD_LEN-5) /* -5 to have some buffer */ { TRACE_EVENT("output buffer is too short !!!"); break; } } pos--; /* erase last comma */ sprintf( g_sa+pos, ")"); } } io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); return (ATI_CMPL); } GLOBAL T_ATI_RSLT queatPercentBAND (CHAR *cl, UBYTE srcId) { T_ACI_BAND_MODE bandMode; UBYTE bandType; T_ACI_RETURN ret = AT_FAIL; TRACE_FUNCTION("queatPercentBAND()"); ret = qAT_PercentBAND(srcId, &bandMode, &bandType); if (ret NEQ AT_CMPL) { cmdCmeError(CME_ERR_Unknown); return (ATI_FAIL); } if( bandType EQ 0x00 OR bandMode EQ BAND_MODE_Auto ) { sprintf(g_sa, "%s: %d", "%BAND", bandMode); } else { sprintf(g_sa, "%s: %d,%d", "%BAND", bandMode, bandType); } io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); return (ATI_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : atPercentNRG | +--------------------------------------------------------------------+ PURPOSE : %NRG extendet registration command */ GLOBAL T_ATI_RSLT setatPercentNRG (char *cl, UBYTE srcId) { char op[MAX_ALPHA_OPER_LEN]={""}; T_ACI_RETURN ret = AT_FAIL; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); T_ACI_NRG_RGMD regMode = NRG_RGMD_NotPresent; T_ACI_NRG_SVMD srvMode = NRG_SVMD_NotPresent; T_ACI_NRG_SVMD srvStat = NRG_SVMD_NotPresent; T_ACI_NRG_FRMT oprFrmt = NRG_FRMT_NotPresent; TRACE_FUNCTION("setatPercentNRG()"); /* split parameter string in int,int,int,str */ cl = parse(cl,"ddds",®Mode,&srvMode,&oprFrmt,(LONG)20,op); if (!cl) { cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } ret = sAT_PercentNRG(srcId,regMode,srvMode,oprFrmt,op); switch (ret) { case (AT_CMPL): /*operation completed*/ break; case (AT_EXCT): src_params->curAtCmd = AT_CMD_NRG; break; default: cmdCmeError(CME_ERR_Unknown); /*Command failed*/ break; } return (map_aci_2_ati_rslt(ret)); } GLOBAL T_ATI_RSLT queatPercentNRG (char *cl, UBYTE srcId) { char op[MAX_ALPHA_OPER_LEN]; T_ACI_RETURN ret = AT_FAIL; T_ACI_NRG_RGMD regMode= NRG_RGMD_NotPresent; T_ACI_NRG_SVMD srvMode= NRG_SVMD_NotPresent; T_ACI_NRG_SVMD srvStat= NRG_SVMD_NotPresent; T_ACI_NRG_FRMT oprFrmt= NRG_FRMT_NotPresent; TRACE_FUNCTION("queatPercentNRG()"); ret = qAT_PercentNRG(srcId,®Mode,&srvMode, &oprFrmt,&srvStat,op); if (ret EQ AT_CMPL) { if( *op ) sprintf(g_sa,"%s: %d,%d,%d,%d,\"%s\"", "%NRG", regMode,srvMode,oprFrmt,srvStat,op); else sprintf(g_sa,"%s: %d,%d,,%d", "%NRG", regMode,srvMode,srvStat); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } else { cmdCmeError(CME_ERR_Unknown); /*command failed*/ } return (map_aci_2_ati_rslt(ret)); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : atPercentCAOC | +--------------------------------------------------------------------+ PURPOSE : %CAOC / %CACM command (Advice of Charge) */ LOCAL T_ATI_RSLT QueryCCM_ACM(CHAR *cl,T_ACI_AT_CMD cmd, UBYTE srcId) { char currency [MAX_CUR_LEN] = {0x00}; char cvtdCurrency [2*MAX_CUR_LEN] = {0x00}; USHORT lenCurrency = 0; USHORT lenCvtdCurrency = 0; USHORT pos = 0; char ppu [MAX_PPU_LENGTH] = {0x00}; T_ACI_RETURN ret = AT_FAIL; SHORT extra_char; switch(cmd) { case(AT_CMD_CAOC ): /* * AT%CAOC queries the actual ccm value using PUCT */ ret = qAT_PercentCAOC(srcId, currency, ppu); pos = sprintf(g_sa,"%s: ","%CAOC"); break; case(AT_CMD_CACM): /* * AT%CACM requests the ACM using PUCT. */ ret = qAT_PercentCACM(srcId,currency,ppu); pos = sprintf(g_sa,"%s: ","%CACM"); break; } if( ret NEQ AT_CMPL ) { cmdCmeError(CME_ERR_Unknown); return (ATI_FAIL); } extra_char = 5; srcId_cb = srcId; utl_chsetFromGsm((UBYTE*)currency, (USHORT)strlen(currency), (UBYTE*)cvtdCurrency, sizeof(cvtdCurrency), &lenCvtdCurrency, GSM_ALPHA_Def); pos+=sprints(g_sa+pos,cvtdCurrency,lenCvtdCurrency); pos+=sprintf(g_sa+pos,",\"%s\"",ppu); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); return (map_aci_2_ati_rslt(ret)); } GLOBAL T_ATI_RSLT atPercentCAOC (char* cl, UBYTE srcId) { TRACE_FUNCTION("atPercentCAOC()"); return(QueryCCM_ACM(cl,AT_CMD_CAOC,srcId)); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : atPercentCACM | +--------------------------------------------------------------------+ PURPOSE : %CACM command (Advice of Charge, Accumulated Call Meter) */ GLOBAL T_ATI_RSLT atPercentCACM (char* cl, UBYTE srcId) { TRACE_FUNCTION("atPercentCACM()"); return(QueryCCM_ACM(cl,AT_CMD_CACM,srcId)); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : atPercentCTV | +--------------------------------------------------------------------+ PURPOSE : %CTV command (Current Call Timer Values) */ GLOBAL T_ATI_RSLT atPercentCTV (char* cl, UBYTE srcId) { LONG ctv; T_ACI_RETURN ret = AT_FAIL; TRACE_FUNCTION("atPercentCTV()"); switch (*cl) { case('\0'): /* * AT%CTV queries the call timer value */ ret = qAT_PercentCTV(srcId, &ctv); if( ret NEQ AT_CMPL ) { cmdCmeError(CME_ERR_Unknown); return (ATI_FAIL); } resp_disp(srcId, cl,"l",&ctv); break; default: cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } return (map_aci_2_ati_rslt(ret)); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : atPercentCPI | +--------------------------------------------------------------------+ PURPOSE : %CPI command (Call proceeding indication) */ GLOBAL T_ATI_RSLT setatPercentCPI(char *cl, UBYTE srcId) { SHORT mode = ACI_NumParmNotPresent; TRACE_FUNCTION("setatPercentCPI()"); cl = parse(cl,"r",&mode); if(!cl OR mode > 4 OR mode < 0) { cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } ati_user_output_cfg[srcId].CPI_stat=(UBYTE)mode; return (ATI_CMPL); } GLOBAL T_ATI_RSLT queatPercentCPI(char *cl, UBYTE srcId) { SHORT mode = ACI_NumParmNotPresent; int value; TRACE_FUNCTION("queatPercentCPI()"); value = (int)ati_user_output_cfg[srcId].CPI_stat; resp_disp(srcId, cl,"e",&value); return (ATI_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : atPercentVER | +--------------------------------------------------------------------+ PURPOSE : %VER displays version of entities */ extern const char firmware_version_str[]; GLOBAL T_ATI_RSLT atPercentVER (char* cl, UBYTE srcId) { char *me="%VER: "; TRACE_FUNCTION("atPercentVER()"); sprintf(g_sa, "%s%s", me, firmware_version_str); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); return (ATI_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : atPercentCNAP | +--------------------------------------------------------------------+ PURPOSE : %CNAP command (Calling NAme Presentation) */ GLOBAL T_ATI_RSLT setatPercentCNAP(char *cl, UBYTE srcId) { T_ATI_CNAP_MODE cnap_mode; TRACE_FUNCTION("setatPercentCNAP()"); cnap_mode = *cl - '0'; switch(cnap_mode) { case(CNAP_DISABLED): case(CNAP_ENABLED): ati_user_output_cfg[srcId].cnap_mode = cnap_mode; cl++; return (ATI_CMPL); default: cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } } GLOBAL T_ATI_RSLT queatPercentCNAP(char *cl, UBYTE srcId) { T_ACI_RETURN ret = AT_FAIL; TRACE_FUNCTION("queatPercentCNAP()"); ret = qAT_PercentCNAP(srcId); if( ret NEQ AT_EXCT ) { cmdCmeError(CME_ERR_Unknown); } return (map_aci_2_ati_rslt(ret)); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : atPercentALS | +--------------------------------------------------------------------+ PURPOSE : %ALS command (select the aternate line) */ GLOBAL T_ATI_RSLT setatPercentALS ( char *cl, UBYTE srcId ) { T_ACI_RETURN ACI_return = AT_FAIL; T_ACI_ALS_MOD ALSmode; TRACE_FUNCTION( "setatPercentALS()" ); switch( *cl ) { case '0': ALSmode = ALS_MOD_SPEECH; break; case '1': ALSmode = ALS_MOD_AUX_SPEECH; break; default: cmdCmeError(CME_ERR_OpNotSupp); return (map_aci_2_ati_rslt(ACI_return)); } #ifdef FF_ATI_BAT { T_BAT_cmd_send cmd; T_BAT_cmd_set_percent_als my_bat_set_percent_als; TRACE_FUNCTION("setatPercentALS() calls bat_send() <=== as APPLICATION"); memset(&my_bat_set_percent_als, 0, sizeof(my_bat_set_percent_als)); cmd.ctrl_params = BAT_CMD_SET_PERCENT_ALS; cmd.params.ptr_set_percent_als = &my_bat_set_percent_als; my_bat_set_percent_als.mode = ALSmode; bat_send(ati_bat_get_client(srcId), &cmd); return ATI_EXCT; /* executing, because response is passed by callback function */ } #else /* OLD FUNCTION BODY */ ACI_return = sAT_PercentALS( srcId, ALSmode ); if( ACI_return EQ AT_FAIL ) { cmdCmeError(CME_ERR_Unknown); } return (map_aci_2_ati_rslt(ACI_return)); #endif /* no FF_ATI_BAT*/ } GLOBAL T_ATI_RSLT tesatPercentALS ( char *cl, UBYTE srcId ) { char *me = "%ALS"; T_ACI_RETURN ACI_return = AT_FAIL ; T_ACI_ALS_MOD ALSmode; TRACE_FUNCTION( "tesatPercentALS()" ); ACI_return = tAT_PercentALS( srcId, &ALSmode ); if ( ACI_return EQ AT_FAIL ) { cmdCmeError(CME_ERR_Unknown); return (ATI_FAIL); } else if ( ACI_return EQ AT_CMPL ) { if (ALSmode EQ ALS_MOD_NOTPRESENT) { cmdCmeError(CME_ERR_OpNotSupp); return (ATI_FAIL); } if (ALSmode EQ ALS_MOD_SPEECH) sprintf(g_sa,"%s: (0)", me); if (ALSmode EQ ALS_MOD_AUX_SPEECH) sprintf(g_sa,"%s: (1)", me); if (ALSmode EQ (ALS_MOD_SPEECH | ALS_MOD_AUX_SPEECH)) sprintf(g_sa,"%s: (0,1)", me); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); } return (map_aci_2_ati_rslt(ACI_return)); } GLOBAL T_ATI_RSLT queatPercentALS ( char *cl, UBYTE srcId ) { T_ACI_RETURN ACI_return = AT_FAIL; T_ACI_ALS_MOD ALSmode; UBYTE ati_ALSmode; TRACE_FUNCTION( "queatPercentALS()" ); ACI_return = qAT_PercentALS( srcId, &ALSmode ); if( ACI_return NEQ AT_CMPL ) { cmdCmeError(CME_ERR_Unknown); return (ATI_FAIL); } switch( ALSmode ) { case(ALS_MOD_SPEECH): ati_ALSmode = 0; break; case(ALS_MOD_AUX_SPEECH): ati_ALSmode = 1; break; case(ALS_MOD_NOTPRESENT): default: cmdCmeError(CME_ERR_OpNotSupp); return (ATI_FAIL); } resp_disp(srcId, cl,"b",&ati_ALSmode); return (map_aci_2_ati_rslt(ACI_return)); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : atPercentCOLR | +--------------------------------------------------------------------+ PURPOSE : %COLR command no parameter. */ GLOBAL T_ATI_RSLT atPercentCOLR(CHAR *cl, UBYTE srcId) { T_ACI_RETURN ret = AT_FAIL; TRACE_FUNCTION("atPercentCOLR()"); if( *cl NEQ '\0' AND *cl NEQ ';') { cmdCmeError( CME_ERR_OpNotAllow ); return (ATI_FAIL); } ret = qAT_PercentCOLR( srcId ); if( ret NEQ AT_EXCT ) { cmdCmeError( CME_ERR_Unknown ); } return (map_aci_2_ati_rslt(ret)); } /* +--------------------------------------------------------------------+ | PROJECT : GSM MODULE : ATI_CMD | | STATE : code ROUTINE : atPercentCUNS | +--------------------------------------------------------------------+ PURPOSE : %CUNS command parameters: buffering_mode. 0: unsolicited messages may occur any time. 1: unsolicited messages can't happen while typing a command. 2: unsolicited messages can't happen between starting typing a command and its final result. */ GLOBAL T_ATI_RSLT setatPercentCUNS(char *cl, UBYTE srcId) { SHORT buffering_mode = -1; T_ATI_SRC_PARAMS *src_params; cl = parse(cl,"d",&buffering_mode); src_params = find_element (ati_src_list, srcId, search_ati_src_id); if( cl EQ NULL OR src_params EQ NULL OR buffering_mode < 0 OR buffering_mode > 2) { cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } src_params->buff_uns_mode = buffering_mode; return (ATI_CMPL); } GLOBAL T_ATI_RSLT queatPercentCUNS(char *cl, UBYTE srcId) { UBYTE buffering_mode = -1; T_ATI_SRC_PARAMS *src_params; src_params = find_element (ati_src_list, srcId, search_ati_src_id); if(src_params EQ NULL) { cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } buffering_mode = (UBYTE)src_params->buff_uns_mode; resp_disp(srcId, cl, "b", &buffering_mode); return (ATI_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : atPercentPPP | +--------------------------------------------------------------------+ PURPOSE : %PPP command parameters: protocol, login name, password. */ #ifdef DTI #if defined(FF_WAP) || defined(FF_TCP_IP) || defined(FF_GPF_TCPIP) || defined(FF_SAT_E) GLOBAL T_ATI_RSLT atPercentPPP (CHAR *cl, UBYTE srcId) { T_ACI_PPP_PROT protocol; T_ACI_RETURN ret = AT_FAIL; CHAR buffer_login[sizeof(pppShrdPrm.ppp_login)]; CHAR buffer_pwd[sizeof(pppShrdPrm.ppp_password)]; T_ACI_PPP_CON con_type = USE_NO_PPP_FOR_AAA; cl=parse(cl,"dssd",&protocol, sizeof(buffer_login), &buffer_login, sizeof(buffer_pwd), &buffer_pwd, &con_type); if(!cl) { cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } #ifdef FF_ATI_BAT { T_BAT_cmd_send cmd; T_BAT_cmd_set_percent_ppp my_bat_set_percent_ppp; TRACE_FUNCTION("atPercentPPP() calls bat_send() <=== as APPLICATION"); memset(&my_bat_set_percent_ppp,0,sizeof(T_BAT_cmd_set_percent_ppp)); cmd.ctrl_params = BAT_CMD_SET_PERCENT_PPP; cmd.params.ptr_set_percent_ppp = &my_bat_set_percent_ppp; my_bat_set_percent_ppp.authprot = (T_BAT_percent_ppp_authprot)protocol; if(my_bat_set_percent_ppp.c_user = strlen(buffer_login)) { my_bat_set_percent_ppp.v_user = TRUE; memcpy(my_bat_set_percent_ppp.user,buffer_login, my_bat_set_percent_ppp.c_user<=BAT_MAX_PPP_USER_LEN ? my_bat_set_percent_ppp.c_user : BAT_MAX_PPP_USER_LEN); } if(my_bat_set_percent_ppp.c_password = strlen(buffer_pwd)) { my_bat_set_percent_ppp.v_password = TRUE; memcpy(my_bat_set_percent_ppp.password,buffer_pwd, my_bat_set_percent_ppp.c_password<=BAT_MAX_PPP_PASSW_LEN ? my_bat_set_percent_ppp.c_password : BAT_MAX_PPP_PASSW_LEN); } my_bat_set_percent_ppp.conn_type = (T_BAT_percent_ppp_conn_type)con_type; bat_send(ati_bat_get_client(srcId), &cmd); return ATI_EXCT; /* executing, because response is passed by callback function */ } #else /* no FF_ATI_BAT */ TRACE_FUNCTION("atPercentPPP()"); ret = sAT_PercentPPP(srcId,protocol, buffer_login, buffer_pwd, con_type); if (ret EQ AT_FAIL) { cmdCmeError(CME_ERR_Unknown); } return (map_aci_2_ati_rslt(ret)); #endif /* FF_ATI_BAT */ } /** Query PPP-negotiated parameters after connection setup. * */ GLOBAL T_ATI_RSLT queatPercentPPP (CHAR *cl, UBYTE srcId) { ULONG ipaddr = 0 ; /* Own IP address. */ ULONG dns1 = 0, dns2 = 0 ; /* Domain Name Server addresses. */ qAT_PercentPPP(srcId, &ipaddr, &dns1, &dns2) ; /* WARNING: this is for little endian only! */ #define IPADDR_BYTE(b, a) (((a) >> ((b) * 8)) & 0xff) sprintf(g_sa, "%%PPP: %u.%u.%u.%u,%u.%u.%u.%u,%u.%u.%u.%u", IPADDR_BYTE(3, ipaddr), IPADDR_BYTE(2, ipaddr), IPADDR_BYTE(1, ipaddr), IPADDR_BYTE(0, ipaddr), IPADDR_BYTE(3, dns1), IPADDR_BYTE(2, dns1), IPADDR_BYTE(1, dns1), IPADDR_BYTE(0, dns1), IPADDR_BYTE(3, dns2), IPADDR_BYTE(2, dns2), IPADDR_BYTE(1, dns2), IPADDR_BYTE(0, dns2)) ; io_sendMessage (srcId, g_sa, ATI_NORMAL_OUTPUT); return ATI_CMPL ; } #endif /* (FF_WAP) || (FF_TCP_IP) || (FF_GPF_TCPIP) || (FF_SAT_E) */ #endif /* DTI */ /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : atPercentWAP | +--------------------------------------------------------------------+ PURPOSE : %WAP command no parameters. */ #ifdef FF_WAP GLOBAL T_ATI_RSLT atPercentWAP (CHAR *cl, UBYTE srcId) { SHORT setwap_falg; TRACE_FUNCTION("atPercentWAP()"); switch(*cl) { case('0'): case('1'): setwap_falg = ( (*cl - '0')? 1 : 0 ); cl++; sAT_PercentWAP(srcId,setwap_falg); break; default: cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } return (ATI_CMPL); } #endif /* FF_WAP */ /* +------------------------------------------------------------------------------ | Function : SH - setatPercentMMITEST +------------------------------------------------------------------------------ | Description : Test AT cmd for MMI | This command has been introduced in order to use the AT command interface for some MMI | specific testing. It shoudnt be compiled without MMI. | | | Parameters : char *cl | UBYTE srcId | | Return : ATI_CMPL +------------------------------------------------------------------------------ */ #ifdef MFW GLOBAL T_ATI_RSLT setatPercentMMITEST (char *cl, UBYTE srcId) { T_ACI_RETURN ret; TRACE_FUNCTION("setatPercentMMITEST()"); if (*cl NEQ '=') { cmdCmeError (CME_ERR_OpNotAllow); return (ATI_FAIL); } cl++; ret = sAT_PercentMMITEST(srcId, cl); switch(ret) { case AT_CMPL: return (ATI_CMPL); case AT_FAIL: cmdCmeError(CME_ERR_Unknown); return (ATI_FAIL); default: cmdCmeError(CME_ERR_Unknown); return (ATI_FAIL); } /* switch */ } /* setatPercentEM */ #endif /* MFW */ /* +-------------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : setatPercentSMBS | +-------------------------------------------------------------------------+ PURPOSE : %SMBS command (Enable presenting of both Text and PDU formats to SMBS) !!!!!!!!!! ONLY FOR TEST PURPOSES !!!!!!!!!!!!!!!!!!!!!!!!!! */ #if defined FF_MMI_RIV GLOBAL T_ATI_RSLT setatPercentSMBS (CHAR *cl, UBYTE srcId) { T_ACI_RETURN ret = AT_FAIL; T_ACI_PERC_SMBS_MOD mode = PERC_SMBS_MOD_NotPresent; TRACE_FUNCTION("setatPercentSMBS()"); cl=parse(cl, "d", &mode); if (cl EQ NULL) { /* parse problems */ cmdCmsError(CMS_ERR_OpNotAllowed); return (ATI_FAIL); } switch (mode) { case(PERC_SMBS_MOD_DISABLE): case(PERC_SMBS_MOD_ENABLE): break; default: cmdCmsError(CMS_ERR_OpNotAllowed); return (ATI_FAIL); } /* Parameter is allowed then set */ ret = sAT_PercentSMBS (srcId, mode); if (ret EQ AT_FAIL) { cmdCmsError(CMS_ERR_UnSpecErr); return (ATI_FAIL); } return (map_aci_2_ati_rslt(ret)); } /* !!!!!!!!!! ONLY FOR TEST PURPOSES !!!!!!!!!!!!!!!!!!!!!!!!!! */ GLOBAL T_ATI_RSLT queatPercentSMBS (CHAR *cl, UBYTE srcId) { T_ACI_RETURN ret = AT_FAIL; T_ACI_PERC_SMBS_MOD mode = PERC_SMBS_MOD_NotPresent; TRACE_FUNCTION("queatPercentSMBS()"); ret = qAT_PercentSMBS(srcId, &mode); if (ret EQ AT_CMPL) { sprintf(g_sa,"%s%d", "%SMBS: ", mode); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); return (ATI_CMPL); } cmdCmsError(CMS_ERR_NotPresent); // use aciErrDesc return (ATI_FAIL); } #endif /* FF_MMI_RIV */ /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : atPercentDAR | +--------------------------------------------------------------------+ PURPOSE : %DAR command */ /* the following is from os.h derived for the AT%DAR command */ #define FIRST_ENTRY 0xff #define NEXT_ENTRY 0xfe #define OS_OK 0 LONG os_read_dar_ffs_data ( USHORT entry, char *buffer, USHORT len ); GLOBAL T_ATI_RSLT setatPercentDAR (CHAR *cl, UBYTE srcId) { TRACE_FUNCTION("atPercentDAR()"); switch(*cl) { case('\0'): { #ifdef _TARGET_ LONG state; strcpy(g_sa, "%DAR: "); state = os_read_dar_ffs_data ( FIRST_ENTRY, g_sa+6, sizeof(g_sa)-6 ); if ( state == OS_OK ) { io_sendMessage (srcId, g_sa, ATI_NORMAL_OUTPUT); do { if ( (state = os_read_dar_ffs_data ( NEXT_ENTRY, g_sa+6, sizeof(g_sa)-6)) == OS_OK ) io_sendMessage (srcId, g_sa, ATI_NORMAL_OUTPUT); } while ( state == OS_OK ); } else io_sendMessage (srcId, "%DAR: No DAR entry stored", ATI_NORMAL_OUTPUT); #else /* _TARGET_ */ io_sendMessage (srcId, "%DAR: Test output", ATI_NORMAL_OUTPUT); #endif /* _TARGET_ */ } break; default: cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); /* this is only for internal testing of the %DAR command to force a crash of the stack */ /* case('1'): // do an endless loop within ACI while (TRUE) ; break; // never reached case('2'): // consume all memory within ACI while (TRUE) { char *a; ACI_MALLOC(a, 10); } break; // never reached case('3'): // jump to 0x00000000; { void (*a)(void)=0x00000000; (*a)(); } break; // never reached case('4'): // overwrite all memory memset(0x00000000, 0, 0xffffffff); break; // never reached case('5'): // send many messages to ACI while (TRUE) { PALLOC(mncc_alert_ind, MNCC_ALERT_IND); mncc_alert_ind->ti = 0; PSENDX(ACI, mncc_alert_ind); } break; // never reached case('6'): // generate many traces { int i; char buf[]="54 68 65 20 71 75 69 63-6B 20 62 72 6F 77 6E 20 The quick brown"; for (i=0; TRUE; i++) { TRACE_EVENT_P2 ("%08X %s", i, buf) } } break; // never reached */ } return (ATI_CMPL); } /* GLOBAL T_ATI_RSLT queatPercentDAR (CHAR *cl, UBYTE srcId) { TRACE_FUNCTION("queatPercentDAR()"); sprintf(g_sa, "Dummy"); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); return (ATI_CMPL); } */ /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : setatPercentCSTAT | +--------------------------------------------------------------------+ PURPOSE : %CSTAT command (Enable/Disable unsolicited status reports from SIM processes) */ GLOBAL T_ATI_RSLT setatPercentCSTAT (char* cl, UBYTE srcId) { SHORT mode = ACI_NumParmNotPresent; TRACE_FUNCTION("setatPercentCSTAT()"); cl = parse(cl,"r",&mode); if(!cl OR mode > 1 OR mode < 0) { cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } ati_user_output_cfg[srcId].CSTAT_stat=(UBYTE)mode; return (ATI_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : queatPercentCSTAT | +--------------------------------------------------------------------+ PURPOSE : %CSTAT command (query unsolicited status reports from SIM processes) */ GLOBAL T_ATI_RSLT queatPercentCSTAT (char* cl, UBYTE srcId) { SHORT mode = ACI_NumParmNotPresent; int value; TRACE_FUNCTION("queatPercentCSTAT()"); value = (int)ati_user_output_cfg[srcId].CSTAT_stat; resp_disp(srcId, cl,"e",&value); return (ATI_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : tesatPercentNRG | +--------------------------------------------------------------------+ PURPOSE : AT%NRG=? command */ GLOBAL T_ATI_RSLT tesatPercentNRG (char *cl, UBYTE srcId) { T_ACI_RETURN ret = AT_FAIL; CHAR *cmd_key = "%NRG:"; CHAR testcmd_output[25]; T_ACI_NRG NRG_options; TRACE_FUNCTION("tesatPercentNRG()"); ret = tAT_PercentNRG(srcId, &NRG_options); if(ret EQ AT_CMPL) { if(NRG_options.reg_mode) { strcpy(testcmd_output, "("); if(NRG_options.reg_mode & NRG_REG_Auto) { strcat(testcmd_output, "0"); } if(NRG_options.reg_mode & NRG_REG_Manual) { strcat(testcmd_output, ",1"); } if(NRG_options.reg_mode & NRG_REG_Both) { strcat(testcmd_output, ",4"); } strcat(testcmd_output, ")"); } if(NRG_options.srv_mode) { if(NRG_options.srv_mode EQ (NRG_SRV_Full | NRG_SRV_Limited | NRG_SRV_NoSrv | NRG_SRV_SetRegModeOnly)) { strcat(testcmd_output, ",(0-3)"); } else { strcat(testcmd_output, ",("); if(NRG_options.srv_mode & NRG_SRV_Full) { strcat(testcmd_output, "0"); } if(NRG_options.srv_mode & NRG_SRV_Limited) { strcat(testcmd_output, ",1"); } if(NRG_options.srv_mode & NRG_SRV_NoSrv) { strcat(testcmd_output, ",2"); } if(NRG_options.srv_mode & NRG_SRV_SetRegModeOnly) { strcat(testcmd_output, ",3"); } strcat(testcmd_output, ")"); } } if(NRG_options.opr_frmt) { if(NRG_options.opr_frmt EQ (NRG_OPR_Long | NRG_OPR_Short | NRG_OPR_Numeric)) { strcat(testcmd_output, ",(0-2)"); } else { strcat(testcmd_output, ",("); if(NRG_options.opr_frmt & NRG_OPR_Long) { strcat(testcmd_output, "0"); } if(NRG_options.opr_frmt & NRG_OPR_Short) { strcat(testcmd_output, ",1"); } if(NRG_options.opr_frmt & NRG_OPR_Numeric) { strcat(testcmd_output, ",2"); } strcat(testcmd_output, ")"); } } sprintf(g_sa,"%s %s",cmd_key, testcmd_output); io_sendMessage (srcId, g_sa, ATI_NORMAL_OUTPUT); return(ATI_CMPL); } return(map_aci_2_ati_rslt(ret)); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : setatPercentCSTAT | +--------------------------------------------------------------------+ PURPOSE : %CUSCFG command (Enable/Disable customized handling of facilities specified) */ GLOBAL T_ATI_RSLT setatPercentCUSCFG (char* cl, UBYTE srcId) { T_ACI_RETURN ret = AT_FAIL; T_ACI_CUSCFG_FAC fac_num; T_ACI_CUSCFG_MOD mode; T_ACI_CUSCFG_STAT status; char fac_str[MAX_FAC_STR_LENGTH] = {0}; char value[MAX_VALUE_LENGTH] = {0}; USHORT i; SHORT pos; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("setatPercentCUSCFG()"); /* * The command being added for a customer should be blocked from other users * shall be used only for Windows simulation */ #ifdef _SIMULATION_ cl = parse(cl,"sds",(LONG)MAX_FAC_STR_LENGTH,fac_str, &mode, (LONG)MAX_VALUE_LENGTH, value); if(!cl OR *fac_str EQ 0 OR mode < 0 OR mode >2) { cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } strcpy(fac_str, strupper(fac_str)); for (i=0;cus_fac[i].name NEQ NULL; i++) { if (strcmp(cus_fac[i].name,fac_str) EQ 0 ) { fac_num=cus_fac[i].fac; /*translates facility string in facility number */ break; } } if(fac_num EQ CUSCFG_FAC_Not_Present) { cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } if(mode EQ CUSCFG_MOD_Query) { ret = qAT_PercentCUSCFG(srcId, fac_num, &status); if(ret EQ AT_CMPL) { pos = sprintf(g_sa,"%CUSCFG: %d", status); ci_remTrailCom(g_sa, pos); io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT); return (ATI_CMPL); } } else { ret = sAT_PercentCUSCFG(srcId, fac_num, mode, value); } if(ret NEQ AT_CMPL) { cmdCmeError(CME_ERR_Unknown); } return (map_aci_2_ati_rslt(ret)); #else cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); #endif } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : setatPercentSTDR | +--------------------------------------------------------------------+ PURPOSE : %STDR Read variable <std> */ GLOBAL T_ATI_RSLT setatPercentSTDR (CHAR *cl, UBYTE srcId) { T_ACI_RETURN ret = AT_FAIL; UBYTE rvstd; TRACE_FUNCTION("setatPercentSTDR()"); switch (*cl) { case('\0'): /* * AT%STDR queries the value of <std> variable */ ret = qAT_PercentSTDR (srcId, &rvstd); if( ret NEQ AT_CMPL ) { cmdCmeError(CME_ERR_Unknown); return (ATI_FAIL); } resp_disp(srcId, cl,"b",&rvstd); break; default: cmdCmeError(CME_ERR_OpNotAllow); return (ATI_FAIL); } return (map_aci_2_ati_rslt(ret)); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | STATE : code ROUTINE : setatPercentCMGMDU | +--------------------------------------------------------------------+ PURPOSE : %CMGMDU Reset the TP-Reply path */ GLOBAL T_ATI_RSLT setatPercentCMGMDU (CHAR *cl, UBYTE srcId) { T_ACI_RETURN ret = AT_FAIL; SHORT idx=-1; T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id); TRACE_FUNCTION("setatPercentCMGMDU()"); cl = parse(cl,"r",&idx); if ( !cl OR idx > 255 OR idx < 0) { cmdCmsError(CMS_ERR_OpNotAllowed); return (ATI_FAIL); } #ifdef _CONC_TESTING_ ret = sAT_PercentCMGMDU (srcId, (UBYTE)idx); #else ret = sAT_PercentCMGMDU_Gl(srcId, (UBYTE)idx, NULL); #endif if (ret EQ AT_EXCT) { src_params->curAtCmd = AT_CMD_P_CMGMDU; return (ATI_EXCT); } else { cmdCmsError(CMS_ERR_NotPresent); return (ATI_FAIL); } } #endif /* ATI_CSC_C */