FreeCalypso > hg > freecalypso-sw
diff gsm-fw/g23m-aci/aci/cphs_aci.c @ 775:eedbf248bac0
gsm-fw/g23m-aci subtree: initial import from LoCosto source
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 12 Oct 2014 01:45:14 +0000 |
parents | |
children | b63b6e9da6cd |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/g23m-aci/aci/cphs_aci.c Sun Oct 12 01:45:14 2014 +0000 @@ -0,0 +1,384 @@ +/* ++--------------------------------------------------------------------+ +| PROJECT: $Workfile:: cphs_aci.c $| +| $Author:: $Revision:: $| +| CREATED: $Modtime:: $| +| STATE : code | ++--------------------------------------------------------------------+ + + MODULE : CPHS + + PURPOSE : This module contains the functions adapting CPHS module to ACI. +*/ + +#ifndef CPHS_ACI_C +#define CPHS_ACI_C + +#include "aci_all.h" + +#include "cphs.h" + +#include "aci_cmh.h" +#include "psa.h" +#include "cmh.h" + +#include "psa_util.h" +#include "psa_sim.h" /* cos' of simShrdPrm !!! */ + +#include "cmh_cc.h" +#include "psa_cc.h" + +static UBYTE last_sim_operation; + +/* ACI/CPHS adapt layer... Only part of the CPHS where cmh calls are allowed */ +GLOBAL void cphs_aci_sim_access_cb(SHORT sim_shrd_id) +{ + BOOL sim_failure = FALSE; + T_ACI_CME_ERR err; + + TRACE_FUNCTION("cphs_aci_sim_access_cb()"); + + if( simShrdPrm.atb[sim_shrd_id].errCode NEQ SIM_NO_ERROR ) + { + sim_failure = TRUE; + } + + switch(last_sim_operation) + { + case(CPHS_SIM_READ_TRANSP_EF): + case(CPHS_SIM_READ_RECORD): + if(simShrdPrm.atb[sim_shrd_id].dataLen <= 0) + { + sim_failure = TRUE; + } + break; + } + + /* free sim table entry */ + simShrdPrm.atb[sim_shrd_id].ntryUsdFlg = FALSE; + + if(sim_failure) + { + /* an error occured !!! */ + TRACE_EVENT("SIM Access Error !!!"); + err = (T_ACI_CME_ERR)cmhSIM_GetCmeFromSim(simShrdPrm.atb[sim_shrd_id].errCode); + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, err); + cphs_sim_data_failure(); + return; + } + + cphs_sim_data_accessed(simShrdPrm.atb[sim_shrd_id].recMax, + simShrdPrm.atb[sim_shrd_id].dataLen); + +} + +GLOBAL void cphs_sim_access_data(UBYTE cphs_sim_operation, + UBYTE cphs_sim_field, + UBYTE record, + UBYTE *data_buffer, + UBYTE data_buffer_size) +{ + USHORT sim_field_id = 0; + + TRACE_FUNCTION("cphs_sim_access_data()"); + + /* The CPHS files are located under GSM standard DFs, therefore + * it is not possible that their identifier values conflict with + * standard values within the same DF. SIM code has incorporated + * the CPHS spec so that we are able to find these files without + * path information. We cannot totally rule out the possibility + * that future versions of 3GPP 51.011 (GSM 11.11) create file + * identifiers in DF(TELECOM), which are the same as CPHS identifiers + * in DF(GSM) or vice versa, but this is very unlikely, + * because CPHS is widely known and used by various operators + * in contrast to HOMEZONE, which is specific to one operator. */ + + switch(cphs_sim_field) + { + case(CPHS_SIM_CFU): + TRACE_EVENT("CPHS Access sim field: SIM_CPHS_CFF"); + sim_field_id = SIM_CPHS_CFF; + break; + + case(CPHS_SIM_VWI): + TRACE_EVENT("CPHS Access sim field: SIM_CPHS_VMW"); + sim_field_id = SIM_CPHS_VMW; + break; + + case(CPHS_SIM_CINF): + TRACE_EVENT("CPHS Access sim field: SIM_CPHS_CINF"); + sim_field_id = SIM_CPHS_CINF; + break; + + case(CPHS_SIM_CSP): + TRACE_EVENT("CPHS Access sim field: SIM_CPHS_CSP"); + sim_field_id = SIM_CPHS_CSP; + break; + + case(CPHS_SIM_ORANGE_CSP): + TRACE_EVENT("CPHS Access sim field: SIM_ORANGE_CSP2"); + sim_field_id = SIM_ORANGE_CSP2; + break; + + case(CPHS_SIM_OPNLONG): + TRACE_EVENT("CPHS Access sim field: SIM_CPHS_ONSTR"); + sim_field_id = SIM_CPHS_ONSTR; + break; + + case(CPHS_SIM_OPNSHORT): + TRACE_EVENT("CPHS Access sim field: SIM_CPHS_ONSHF"); + sim_field_id = SIM_CPHS_ONSHF; + break; + + case(CPHS_SIM_MB): + TRACE_EVENT("CPHS Access sim field: SIM_CPHS_MBXN"); + sim_field_id = SIM_CPHS_MBXN; + break; + + case(CPHS_SIM_INFO_NUMS): + TRACE_EVENT("CPHS Access sim field: SIM_CPHS_INFN"); + sim_field_id = SIM_CPHS_INFN; + break; + + case(CPHS_SIM_INFO_NUMS_EA01): /* in case of old sims */ + TRACE_EVENT("CPHS Access sim field: SIM_CPHS_INFN2"); + sim_field_id = SIM_CPHS_INFN2; + break; + + case(CPHS_SIM_ALSNAMES): + TRACE_EVENT("CPHS Access sim field: SIM_MSISDN"); + sim_field_id = SIM_MSISDN; + break; + + default: + TRACE_ERROR("cphs_sim_access_data(): wrong cphs_sim_field value !!!"); + break; + } + + last_sim_operation = cphs_sim_operation; + + switch(cphs_sim_operation) + { + case(CPHS_SIM_READ_TRANSP_EF): + cmhSIM_ReadTranspEF( CMD_SRC_NONE, + AT_CMD_NONE, + FALSE, + NULL, + sim_field_id, + 0, + data_buffer_size, + data_buffer, + cphs_aci_sim_access_cb ); + break; + + case(CPHS_SIM_WRITE_TRANSP_EF): + cmhSIM_WriteTranspEF(CMD_SRC_NONE, + AT_CMD_NONE, + FALSE, + NULL, + sim_field_id, + 0, + data_buffer_size, + data_buffer, + cphs_aci_sim_access_cb ); + break; + + case(CPHS_SIM_READ_RECORD): + cmhSIM_ReadRecordEF( CMD_SRC_NONE, + AT_CMD_CPHS, + FALSE, + NULL, + sim_field_id, + record, + data_buffer_size, + data_buffer, + cphs_aci_sim_access_cb ); + break; + + case(CPHS_SIM_WRITE_RECORD): + cmhSIM_WriteRecordEF( CMD_SRC_NONE, + AT_CMD_CPHS, + FALSE, + NULL, + sim_field_id, + record, + data_buffer_size, + data_buffer, + cphs_aci_sim_access_cb ); + break; + + default: + TRACE_ERROR("cphs_sim_access_data(): wrong cphs_sim_operation value !!!"); + break; + } + +} + +/* converts a BCD number bcd of bcd_size length +into a string of ascii digits and writes the result in number */ +GLOBAL void cphs_bcd2number(CHAR *number, + UBYTE *bcd, + UBYTE bcd_size) +{ + int i; + UBYTE *num_buffer; + + TRACE_FUNCTION("cphs_bcd2number()"); + + MALLOC(num_buffer, 2*bcd_size); + + /* Decode BCD */ + for(i=0;i<bcd_size;i++) + { + num_buffer[2*i] = (bcd[i] & 0x0F); + num_buffer[2*i + 1] = (bcd[i] & 0xF0)>>4; + } + + utl_BCD2DialStr((const UBYTE *)num_buffer, number, (UBYTE)(2*bcd_size)); + + MFREE(num_buffer); +} + +GLOBAL T_CPHS_RET cphs_get_als_active_line(UBYTE srcId, T_CPHS_LINES *line) +{ + T_ACI_ALS_MOD ALSmode; + + TRACE_FUNCTION("cphs_get_als_active_line()"); + + cmhCC_get_active_als_mode((T_ACI_CMD_SRC)srcId, &ALSmode ); + + switch( ALSmode ) + { + case(ALS_MOD_SPEECH): + *line = CPHS_LINE1; + break; + + case(ALS_MOD_AUX_SPEECH): + *line = CPHS_LINE2; + break; + + case(ALS_MOD_NOTPRESENT): + default: + *line = CPHS_LINE_NULL; + break; + } + + return(CPHS_OK); +} + + +/* if( ! psaSIM_ChkSIMSrvSup( SRV_MSISDN )) return( AT_CMPL ); */ + + +GLOBAL T_CPHS_LINES als_get_call_info(SHORT call_id) +{ + T_CC_CALL_TBL *ctb; /* Pointer to call table entry */ + SHORT cId = call_id-1; /* tarnslation from +CLCC-like call_id and ACI cId */ + T_ACI_CRING_SERV_TYP cring_type; /* type of bearer of call */ + + TRACE_FUNCTION("als_get_call_info()"); + +/* ==== if the CPHS module is to be ported, then AT+CLCC shall be used... + Extra info might need to be added to differentiate AuxVoice from Voice... ==== + MALLOC(calLst, MAX_CALL_NR * sizeof(T_ACI_CLCC_CALDESC)); + if(qAT_PlusCLCC(srcId, calLst) NEQ AT_CMPL) + { + TRACE_ERROR("+CLCC: error"); + return(CPHS_FAIL); + }*/ + + if (!psaCC_ctbIsValid (cId)) + { + /* Call is not active ! */ + return(CPHS_LINE_NULL); + } + + ctb = ccShrdPrm.ctb[cId]; + + switch(cmhCC_getcalltype(cId)) + { + case(VOICE_CALL): + cring_type = (T_ACI_CRING_SERV_TYP)cmhCC_GetCallType_from_bearer (&ctb->BC[ctb->curBC]); + if(cring_type EQ CRING_SERV_TYP_Voice) + { + return(CPHS_LINE1); + } + else if(cring_type EQ CRING_SERV_TYP_AuxVoice) + { + return(CPHS_LINE2); + } + break; +#ifdef FAX_AND_DATA + case( TRANS_CALL ): + case( NON_TRANS_CALL ): + return(CPHS_LINE_DATA); + + case( FAX_CALL ): + return(CPHS_LINE_FAX); +#endif + } + +/* MFREE(calLst); */ + return(CPHS_LINE_NULL); +} + +void cphs_sim_read_mb_ext_rcd_cb(SHORT table_id) +{ + BOOL sim_failure = FALSE; + T_ACI_CME_ERR err; + + if( simShrdPrm.atb[table_id].errCode NEQ SIM_NO_ERROR ) + { + sim_failure = TRUE; + } + + switch(last_sim_operation) + { + case(CPHS_SIM_READ_TRANSP_EF): + case(CPHS_SIM_READ_RECORD): + if(simShrdPrm.atb[table_id].dataLen <= 0) + { + sim_failure = TRUE; + } + break; + } + + /* free sim table entry */ + simShrdPrm.atb[table_id].ntryUsdFlg = FALSE; + + if(sim_failure) + { + /* an error occured !!! */ + TRACE_EVENT("SIM Access Error !!!"); + err = (T_ACI_CME_ERR)cmhSIM_GetCmeFromSim(simShrdPrm.atb[table_id].errCode); + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, err); + cphs_sim_data_failure(); + return; + } + + + cphs_write_sim_mb_ext_data(simShrdPrm.atb[table_id].dataLen); + +} + +#define DEFAULT_MAXSIZE_OF_RECORD (100) +GLOBAL void cphs_sim_read_mb_ext_rcd(UBYTE record,UBYTE *data_buffer) +{ + + cmhSIM_ReadRecordEF ( CMD_SRC_NONE, + AT_CMD_NONE, + FALSE, + NULL, + SIM_EXT1, + record, + DEFAULT_MAXSIZE_OF_RECORD, + data_buffer, + cphs_sim_read_mb_ext_rcd_cb); + + +} + + + +#endif /* CPHS_ACI_C */ +