FreeCalypso > hg > fc-magnetite
diff src/g23m-aci/aci/cmh_t30r.c @ 162:53929b40109c
src/g23m-aci: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 11 Oct 2016 02:02:43 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-aci/aci/cmh_t30r.c Tue Oct 11 02:02:43 2016 +0000 @@ -0,0 +1,1315 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-PS (6147) +| Modul : CMH_T30R ++----------------------------------------------------------------------------- +| 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 the functions which are responsible +| for the responses of the protocol stack adapter for +| T 30. ++----------------------------------------------------------------------------- +*/ + +#if defined (DTI) || defined (FF_FAX) + +#ifndef CMH_T30R_C +#define CMH_T30R_C +#endif + +#include "aci_all.h" +/*==== INCLUDES ===================================================*/ +#include "dti.h" /* functionality of the dti library */ +#include "aci_cmh.h" +#include "ati_cmd.h" +#include "aci_cmd.h" +#include "aci_io.h" + +#include "aci_lst.h" + +#ifdef FAX_AND_DATA + #include "aci_fd.h" +#endif + +#include "dti_conn_mng.h" +#include "dti_cntrl_mng.h" + +#include "aci.h" +#include "psa.h" +#include "psa_t30.h" +#include "psa_cc.h" +#include "cmh.h" +#include "cmh_t30.h" +#include "cmh_cc.h" + +#include "p_gsmcom.val" /* error cause originating entities */ +#include "p_fad.val" /* causes values */ + +#include "cmh_ra.h" + +#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*/ +/*==== CONSTANTS ==================================================*/ + +/*==== TYPES ======================================================*/ + +/*==== EXPORT =====================================================*/ + +#ifdef _SIMULATE_FAX_DATA_ +EXTERN void TST_rstSimData( void ); +#endif /*_SIMULATE_FAX_DATA_*/ + +/*==== VARIABLES ==================================================*/ + +LOCAL BOOL HDLCfst = TRUE; /* flags first occurence of HDLC frame */ + +/*==== FUNCTIONS ==================================================*/ +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_Activated | ++-------------------------------------------------------------------+ + + PURPOSE : T30 entity activated, connection established + +*/ + +GLOBAL void cmhT30_Activated ( void ) +{ +#ifdef FF_PSI + T_ACI_DTI_PRC_PSI *src_infos = find_element (psi_src_params, + (UBYTE)t30EntStat.entOwn, cmhPSItest_srcId); +#endif /*FF_PSI*/ + TRACE_FUNCTION ("cmhT30_Activated()"); + + io_setDCD (t30EntStat.entOwn, IO_DCD_ON); +#ifdef FF_PSI + if (src_infos NEQ NULL) + psaPSI_ESCAPEreq( (UBYTE)t30EntStat.entOwn, ESC_DETECTION_OFF); + else +#endif /*FF_PSI*/ + +#ifdef UART + psaUART_ESCAPEreq( (UBYTE)t30EntStat.entOwn, UART_ESC_DETECTION_OFF ); +#endif + /* inform call control about successful operation */ + +#ifdef _SIMULATE_FAX_DATA_ + TST_rstSimData(); +#endif /*_SIMULATE_FAX_DATA_*/ + + psaT30_Config( ); + + cmhCC_T30_Activated(); + + t30ShrdPrm.faxStat = FS_IDL; +} +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_CapRmtSite | ++-------------------------------------------------------------------+ + + PURPOSE : Capabilities recieved from remote site. + +*/ + +GLOBAL void cmhT30_CapRmtSite ( void ) +{ + UBYTE strBuf[CSI_LEN]; /* string buffer */ + UBYTE cmdBuf; /* buffers current command */ + + TRACE_FUNCTION ("cmhT30_CapRmtSite()"); +/* + *------------------------------------------------------------------- + * determine call type + *------------------------------------------------------------------- + */ + switch( psaCC_ctb(t30ShrdPrm.cId)->calType ) + { + case( CT_MOC ): + /* + *--------------------------------------------------------------- + * check for DCS frame + *--------------------------------------------------------------- + */ + if( t30ShrdPrm.hdlc_rcv.v_dcs EQ TRUE ) + { + /*--- send non-standard set-up information ---*/ + if( t30ShrdPrm.hdlc_rcv.c_nss NEQ 0 ) + { + R_AT( RAT_FNS, t30EntStat.entOwn ) + ( t30ShrdPrm.hdlc_rcv.c_nss, t30ShrdPrm.hdlc_rcv.nss ); + } + /*--- send password information ---*/ + if( fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FAPpwd EQ + FAP_VAL_Enabled AND + t30ShrdPrm.hdlc_rcv.c_pwd NEQ 0 ) + { + memcpy + ( + (char *) strBuf, + (char *) t30ShrdPrm.hdlc_rcv.pwd, + t30ShrdPrm.hdlc_rcv.c_pwd + ); + + strBuf[t30ShrdPrm.hdlc_rcv.c_pwd] = '\0'; + + R_AT( RAT_FPW, t30EntStat.entOwn ) + ( strBuf ); + } + + /*--- send subaddress information ---*/ + if( fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FAPsub EQ + FAP_VAL_Enabled AND + t30ShrdPrm.hdlc_rcv.c_sub NEQ 0 ) + { + memcpy + ( + (char *) strBuf, + (char *) t30ShrdPrm.hdlc_rcv.sub, + t30ShrdPrm.hdlc_rcv.c_sub + ); + + strBuf[t30ShrdPrm.hdlc_rcv.c_sub] = '\0'; + + R_AT( RAT_FSA, t30EntStat.entOwn ) + ( strBuf ); + } + + /*--- send transmitting subscriber information ---*/ + if( t30ShrdPrm.hdlc_rcv.c_tsi NEQ 0 ) + { + memcpy + ( + (char *) strBuf, + (char *) t30ShrdPrm.hdlc_rcv.tsi, + t30ShrdPrm.hdlc_rcv.c_tsi + ); + + strBuf[t30ShrdPrm.hdlc_rcv.c_tsi] = '\0'; + + R_AT( RAT_FTI, t30EntStat.entOwn ) + ( strBuf ); + } + + /*--- send DCS frame information ---*/ + R_AT( RAT_FCS, t30EntStat.entOwn ) + ( t30NgtPrms.FCSvr = cmhT30_GetResolution + ( &t30ShrdPrm.hdlc_rcv.dcs, FRT_DCS), + t30NgtPrms.FCSbr = cmhT30_GetBitRate + ( &t30ShrdPrm.hdlc_rcv.dcs, FRT_DCS), + t30NgtPrms.FCSwd = cmhT30_GetPageWidth + ( &t30ShrdPrm.hdlc_rcv.dcs), + t30NgtPrms.FCSln = cmhT30_GetPageLength + ( &t30ShrdPrm.hdlc_rcv.dcs), + t30NgtPrms.FCSdf = cmhT30_GetDataComp + ( &t30ShrdPrm.hdlc_rcv.dcs), + t30NgtPrms.FCSec = cmhT30_GetErrCorr + ( &t30ShrdPrm.hdlc_rcv.dcs), + t30NgtPrms.FCSbf = cmhT30_GetFileTrnsfr + ( &t30ShrdPrm.hdlc_rcv.dcs), + t30NgtPrms.FCSst = cmhT30_GetScanTime + ( &t30ShrdPrm.hdlc_rcv.dcs), + t30NgtPrms.FCSjp = cmhT30_GetJPEG + ( &t30ShrdPrm.hdlc_rcv.dcs) ); + + /*--- check for T30 modification ---*/ + if( cmhT30_Chk4TCHAdpt() ) + { + ccShrdPrm.datStat = DS_TCH_MDF; /* wait for TCH change */ + } + else + { + if( cmhT30_Modify() NEQ AT_EXCT ) + { + ccShrdPrm.datStat = DS_DSC_REQ; + cmhT30_Deactivate(); + } + } + } + + /* + *--------------------------------------------------------------- + * check for DIS frame + *--------------------------------------------------------------- + */ + if( t30ShrdPrm.hdlc_rcv.v_dis EQ TRUE ) + { + /*--- a DIS frame which is in context with the + FDT command, forces a DCS retransmission and quit ---*/ + if( t30EntStat.curCmd EQ AT_CMD_FDT ) + { + cmhT30_SendCaps ( t30EntStat.entOwn, FRT_DCS ); + break; + } + + /*--- send non-standard facility information ---*/ + if( t30ShrdPrm.hdlc_rcv.c_nsf NEQ 0 ) + { + R_AT( RAT_FNF, t30EntStat.entOwn ) + ( t30ShrdPrm.hdlc_rcv.c_nsf, t30ShrdPrm.hdlc_rcv.nsf ); + } + + /*--- send calling subscriber information ---*/ + if( t30ShrdPrm.hdlc_rcv.c_csi NEQ 0 ) + { + memcpy + ( + (char *) strBuf, + (char *) t30ShrdPrm.hdlc_rcv.csi, + t30ShrdPrm.hdlc_rcv.c_csi + ); + + strBuf[t30ShrdPrm.hdlc_rcv.c_csi] = '\0'; + + R_AT( RAT_FCI, t30EntStat.entOwn ) + ( strBuf ); + } + + /*--- send DIS frame information ---*/ + R_AT( RAT_FIS, t30EntStat.entOwn ) + ( cmhT30_GetResolution( &t30ShrdPrm.hdlc_rcv.dis, FRT_DIS ), + cmhT30_GetBitRate ( &t30ShrdPrm.hdlc_rcv.dis, FRT_DIS ), + cmhT30_GetPageWidth ( &t30ShrdPrm.hdlc_rcv.dis), + cmhT30_GetPageLength( &t30ShrdPrm.hdlc_rcv.dis), + cmhT30_GetDataComp ( &t30ShrdPrm.hdlc_rcv.dis), + cmhT30_GetErrCorr ( &t30ShrdPrm.hdlc_rcv.dis), + cmhT30_GetFileTrnsfr( &t30ShrdPrm.hdlc_rcv.dis), + cmhT30_GetScanTime ( &t30ShrdPrm.hdlc_rcv.dis), + cmhT30_GetJPEG ( &t30ShrdPrm.hdlc_rcv.dis) ); + + /*--- send polling capability information ---*/ + if( t30ShrdPrm.hdlc_rcv.dis.ready_tx_fax EQ 1 AND + fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FSPval EQ + FSP_VAL_PollEnable AND + fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FCRval EQ + FCR_VAL_RcvCap ) + { + R_AT( RAT_FPO, t30EntStat.entOwn )(); + } + + /*--- release command state ---*/ + switch( t30EntStat.curCmd ) + { + case( AT_CMD_D ): + + t30EntStat.curCmd = AT_CMD_NONE; + break; + } + } + break; + + case( CT_MTC ): + + /* + *--------------------------------------------------------------- + * check for DCS frame + *--------------------------------------------------------------- + */ + if( t30ShrdPrm.hdlc_rcv.v_dcs EQ TRUE ) + { + /*--- send non-standard set-up information ---*/ + if( t30ShrdPrm.hdlc_rcv.c_nss NEQ 0 ) + { + R_AT( RAT_FNS, t30EntStat.entOwn ) + ( t30ShrdPrm.hdlc_rcv.c_nss, t30ShrdPrm.hdlc_rcv.nss ); + } + + /*--- send password information ---*/ + if( fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FAPpwd EQ + FAP_VAL_Enabled AND + t30ShrdPrm.hdlc_rcv.c_pwd NEQ 0 ) + { + memcpy + ( + (char *) strBuf, + (char *) t30ShrdPrm.hdlc_rcv.pwd, + t30ShrdPrm.hdlc_rcv.c_pwd + ); + + strBuf[t30ShrdPrm.hdlc_rcv.c_pwd] = '\0'; + + R_AT( RAT_FPW, t30EntStat.entOwn ) + ( strBuf ); + } + + /*--- send subaddress information ---*/ + if( fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FAPsub EQ + FAP_VAL_Enabled AND + t30ShrdPrm.hdlc_rcv.c_sub NEQ 0 ) + { + memcpy + ( + (char *) strBuf, + (char *) t30ShrdPrm.hdlc_rcv.sub, + t30ShrdPrm.hdlc_rcv.c_sub + ); + + strBuf[t30ShrdPrm.hdlc_rcv.c_sub] = '\0'; + + R_AT( RAT_FSA, t30EntStat.entOwn ) + ( strBuf ); + } + + /*--- send transmitting subscriber information ---*/ + if( t30ShrdPrm.hdlc_rcv.c_tsi NEQ 0 ) + { + memcpy + ( + (char *) strBuf, + (char *) t30ShrdPrm.hdlc_rcv.tsi, + t30ShrdPrm.hdlc_rcv.c_tsi + ); + + strBuf[t30ShrdPrm.hdlc_rcv.c_tsi] = '\0'; + + R_AT( RAT_FTI, t30EntStat.entOwn ) + ( strBuf ); + } + + /*--- send DCS frame information ---*/ + R_AT( RAT_FCS, t30EntStat.entOwn ) + ( t30NgtPrms.FCSvr = cmhT30_GetResolution + ( &t30ShrdPrm.hdlc_rcv.dcs, FRT_DCS), + t30NgtPrms.FCSbr = cmhT30_GetBitRate + ( &t30ShrdPrm.hdlc_rcv.dcs, FRT_DCS), + t30NgtPrms.FCSwd = cmhT30_GetPageWidth + ( &t30ShrdPrm.hdlc_rcv.dcs), + t30NgtPrms.FCSln = cmhT30_GetPageLength + ( &t30ShrdPrm.hdlc_rcv.dcs), + t30NgtPrms.FCSdf = cmhT30_GetDataComp + ( &t30ShrdPrm.hdlc_rcv.dcs), + t30NgtPrms.FCSec = cmhT30_GetErrCorr + ( &t30ShrdPrm.hdlc_rcv.dcs), + t30NgtPrms.FCSbf = cmhT30_GetFileTrnsfr + ( &t30ShrdPrm.hdlc_rcv.dcs), + t30NgtPrms.FCSst = cmhT30_GetScanTime + ( &t30ShrdPrm.hdlc_rcv.dcs), + t30NgtPrms.FCSjp = cmhT30_GetJPEG + ( &t30ShrdPrm.hdlc_rcv.dcs) ); + + /*--- check for T30 modification ---*/ + if( cmhT30_Chk4TCHAdpt() ) + { + ccShrdPrm.datStat = DS_TCH_MDF; /* wait for TCH change */ + } + else + { + if( cmhT30_Modify() NEQ AT_EXCT ) + { + ccShrdPrm.datStat = DS_DSC_REQ; + cmhT30_Deactivate(); + } + } + } + + /* + *--------------------------------------------------------------- + * check for DTC frame + *--------------------------------------------------------------- + */ + else if( t30ShrdPrm.hdlc_rcv.v_dtc EQ TRUE ) + { + /*--- DTC received but no polling document available ---*/ + if( fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FLPval EQ + FLP_VAL_NoPollDoc ) + { + R_AT( RAT_FHS, t30EntStat.entOwn ) + ( FHSstat = FHS_STAT_InvComrecCmd ); + + cmdBuf = t30EntStat.curCmd; + t30EntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_OK, t30EntStat.entOwn )( cmdBuf ); + + cmhCC_T30_Failed(); + return; + } + + /*--- send non-standard facilities command ---*/ + if( t30ShrdPrm.hdlc_rcv.c_nsc NEQ 0 ) + { + R_AT( RAT_FNC, t30EntStat.entOwn ) + ( t30ShrdPrm.hdlc_rcv.c_nsc, t30ShrdPrm.hdlc_rcv.nsc ); + } + + /*--- send password information ---*/ + if( fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FAPpwd EQ + FAP_VAL_Enabled AND + t30ShrdPrm.hdlc_rcv.c_pwd NEQ 0) + { + memcpy + ( + (char *) strBuf, + (char *) t30ShrdPrm.hdlc_rcv.pwd, + t30ShrdPrm.hdlc_rcv.c_pwd + ); + + strBuf[t30ShrdPrm.hdlc_rcv.c_pwd] = '\0'; + + R_AT( RAT_FPW, t30EntStat.entOwn ) + ( strBuf ); + } + + /*--- send selective polling information ---*/ + if( fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FAPsep EQ + FAP_VAL_Enabled AND + t30ShrdPrm.hdlc_rcv.c_sep NEQ 0) + { + memcpy + ( + (char *) strBuf, + (char *) t30ShrdPrm.hdlc_rcv.sep, + t30ShrdPrm.hdlc_rcv.c_sep + ); + + strBuf[t30ShrdPrm.hdlc_rcv.c_sep] = '\0'; + + R_AT( RAT_FPA, t30EntStat.entOwn ) + ( strBuf ); + } + + /*--- send calling subscriber information ---*/ + if( t30ShrdPrm.hdlc_rcv.c_cig NEQ 0 ) + { + memcpy + ( + (char *) strBuf, + (char *) t30ShrdPrm.hdlc_rcv.cig, + t30ShrdPrm.hdlc_rcv.c_cig + ); + + strBuf[t30ShrdPrm.hdlc_rcv.c_cig] = '\0'; + + R_AT( RAT_FPI, t30EntStat.entOwn ) + ( strBuf ); + } + + /*--- send DTC frame information ---*/ + R_AT( RAT_FTC, t30EntStat.entOwn ) + ( cmhT30_GetResolution( &t30ShrdPrm.hdlc_rcv.dtc, FRT_DTC), + cmhT30_GetBitRate ( &t30ShrdPrm.hdlc_rcv.dtc, FRT_DTC), + cmhT30_GetPageWidth ( &t30ShrdPrm.hdlc_rcv.dtc), + cmhT30_GetPageLength( &t30ShrdPrm.hdlc_rcv.dtc), + cmhT30_GetDataComp ( &t30ShrdPrm.hdlc_rcv.dtc), + cmhT30_GetErrCorr ( &t30ShrdPrm.hdlc_rcv.dtc), + cmhT30_GetFileTrnsfr( &t30ShrdPrm.hdlc_rcv.dtc), + cmhT30_GetScanTime ( &t30ShrdPrm.hdlc_rcv.dtc), + cmhT30_GetJPEG ( &t30ShrdPrm.hdlc_rcv.dtc) ); + } + + /*--- release command state ---*/ + switch( t30EntStat.curCmd ) + { + case( AT_CMD_A ): + + t30EntStat.curCmd = AT_CMD_NONE; + break; + + case( AT_CMD_FDR ): + + cmhT30_StartFIT(); + t30EntStat.curCmd = AT_CMD_NONE; + R_AT( RAT_OK, t30EntStat.entOwn )( AT_CMD_FDR ); + return; + } + break; + } + +/* + *------------------------------------------------------------------- + * inform call control about received capability parameter + *------------------------------------------------------------------- + */ + if( t30ShrdPrm.faxStat EQ FS_IDL ) + { + cmhCC_T30_RmtCaps(); + } + return; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhL2R_Deactivated | ++-------------------------------------------------------------------+ + + PURPOSE : T30 entity deactivated, connection disconnected + +*/ + +GLOBAL void cmhT30_Deactivated ( void ) +{ +#ifdef FF_PSI + T_ACI_DTI_PRC_PSI *src_infos = find_element (psi_src_params, + (UBYTE)t30EntStat.entOwn, cmhPSItest_srcId); +#endif /*FF_PSI*/ + TRACE_FUNCTION ("cmhT30_Deactivated()"); + io_setDCD (t30EntStat.entOwn, IO_DCD_OFF); +#ifdef FF_PSI + if (src_infos NEQ NULL) + psaPSI_ESCAPEreq( (UBYTE)t30EntStat.entOwn, ESC_DETECTION_ON); + else +#endif /*FF_PSI*/ +#ifdef UART + psaUART_ESCAPEreq( (UBYTE)t30EntStat.entOwn, UART_ESC_DETECTION_ON ); +#endif + /* inform call control about disconnection */ + HDLCfst = TRUE; + + cmhCC_T30_Deactivated(); + + t30ShrdPrm.faxStat = NO_VLD_FS; + t30ShrdPrm.cId = NO_ENTRY; + t30EntStat.curCmd = AT_CMD_NONE; + + pageSentFlg = TRUE; + DTCSentFlg = FALSE; + PRIRcvdFlg = FALSE; + + cmhT30_StopFIT(); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_Disconnect | ++-------------------------------------------------------------------+ + + PURPOSE : request to disconnect + +*/ + +GLOBAL void cmhT30_Disconnect ( void ) +{ + + TRACE_FUNCTION ("cmhT30_Disconnect()"); + + /* clear FAX call */ + t30EntStat.curCmd = AT_CMD_NONE; + + R_AT( RAT_FHS, t30EntStat.entOwn )( FHSstat = FHS_STAT_NormEnd ); + + /* pretends an orderly FAX abort */ + psaCC_ctb(t30ShrdPrm.cId)->curCmd = AT_CMD_FKS; + psaCC_ctb(t30ShrdPrm.cId)->curSrc = t30EntStat.entOwn; + + cmhT30_Deactivate(); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_Disconnected | ++-------------------------------------------------------------------+ + + PURPOSE : T30 entity deactivated + +*/ + +GLOBAL void cmhT30_Disconnected ( void ) +{ + TRACE_FUNCTION ("cmhT30_Disconnected()"); + + /* clear FAX call */ + switch( t30EntStat.curCmd ) + { + case( AT_CMD_FKS ): + + t30EntStat.curCmd = AT_CMD_NONE; + break; + } + + R_AT( RAT_FHS, t30EntStat.entOwn )( FHSstat = FHS_STAT_NormEnd ); + + psaCC_ctb(t30ShrdPrm.cId)->curCmd = AT_CMD_FKS; + psaCC_ctb(t30ShrdPrm.cId)->curSrc = t30EntStat.entOwn; + + cmhT30_Deactivate(); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_Failure | ++-------------------------------------------------------------------+ + + PURPOSE : T30 entity failure, connection will be disconnected + +*/ + +GLOBAL void cmhT30_Failure ( void ) +{ + TRACE_FUNCTION ("cmhT30_Failure()"); + + /* + *------------------------------------------------------------------- + * general failure indication + *------------------------------------------------------------------- + */ + TRACE_EVENT_P1("T30/FAD ERROR: 0x%04x", t30ShrdPrm.err_cause); + + switch (GET_CAUSE_ORIGIN_ENTITY(t30ShrdPrm.err_cause)) + { + case (FAD_ORIGINATING_ENTITY): /* FAD error cause */ + + if ( ERR_REM_FAD < t30ShrdPrm.err_cause AND t30ShrdPrm.err_cause < ERR_LOCAL_FAD) + { + FHSstat = FHS_STAT_FADRmtStnErr; + } + else if (ERR_LOCAL_FAD < t30ShrdPrm.err_cause AND t30ShrdPrm.err_cause < ERR_OWN_FAD) + { + switch (t30ShrdPrm.err_cause) + { + case ERR_LOCAL_DATA_MSG_UFL: + FHSstat = FHS_STAT_DteDceDataUndrflw; + break; + default: + FHSstat = FHS_STAT_FADLclStnErr; + break; + } + } + else if (ERR_OWN_FAD < t30ShrdPrm.err_cause AND t30ShrdPrm.err_cause < ERR_GENERAL_FAD) + { + FHSstat = FHS_STAT_FADOwnErr; + } + else + FHSstat = FHS_STAT_FADGnrlErr; + break; + + case (T30_ORIGINATING_ENTITY): /* T30 error cause */ + + FHSstat = (T_ACI_FHS_STAT)GET_CAUSE_VALUE(t30ShrdPrm.err_cause); + break; + } + +/* + *------------------------------------------------------------------- + * indicate a hang-up status code if a FAX transaction is active and + * it is in context with the +FDR or +FDT command + *------------------------------------------------------------------- + */ + if( ccShrdPrm.datStat EQ DS_ACT) +/* + AND + (t30EntStat.curCmd EQ AT_CMD_FDR OR + t30EntStat.curCmd EQ AT_CMD_FDT )) +*/ { + TRACE_EVENT ("STOP FAX DATA PHASE"); + + R_AT( RAT_FHS, t30EntStat.entOwn )( FHSstat ); + + cmhCC_flagCall( t30ShrdPrm.cId, &((&cmhPrm[t30EntStat.entOwn].ccCmdPrm) -> mltyDscFlg)); + + /* pretend an orderly abort */ + psaCC_ctb(t30ShrdPrm.cId)->curCmd = t30EntStat.curCmd; + psaCC_ctb(t30ShrdPrm.cId)->curSrc = t30EntStat.entOwn; + } +/* + *------------------------------------------------------------------- + * notify CC about the failure to release the call + *------------------------------------------------------------------- + */ + t30ShrdPrm.faxStat = FS_IDL; + t30EntStat.curCmd = AT_CMD_NONE; + + cmhCC_T30_Failed(); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_HDLCRpt | ++-------------------------------------------------------------------+ + + PURPOSE : HDLC reporting + +*/ + +GLOBAL void cmhT30_HDLCRpt ( void ) +{ + TRACE_FUNCTION ("cmhT30_HDLCRpt()"); + + /* HDLC report indication */ + if( t30ShrdPrm.report.l_buf NEQ 0 ) + { + switch( t30ShrdPrm.report.dir ) + { + case( DIR_SND ): + + R_AT( RAT_FHT, t30EntStat.entOwn ) + ((t30ShrdPrm.report.l_buf>>3), &t30ShrdPrm.report.buf ); + break; + + case( DIR_RCV ): + + R_AT( RAT_FHR, t30EntStat.entOwn ) + ((t30ShrdPrm.report.l_buf>>3), &t30ShrdPrm.report.buf ); + break; + } + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_PreambleRcvd | ++-------------------------------------------------------------------+ + + PURPOSE : Preamble received + +*/ + +GLOBAL void cmhT30_PreambleRcvd ( void ) +{ + TRACE_FUNCTION ("cmhT30_PreambleRcvd()"); + + /* indicate first received preamble */ + if( HDLCfst EQ TRUE ) + { + R_AT( RAT_FCO, t30EntStat.entOwn )(); + HDLCfst = FALSE; + } +} + + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_TransCmpl | ++-------------------------------------------------------------------+ + + PURPOSE : transmission completed + +*/ + +GLOBAL void cmhT30_TransCmpl ( void ) +{ + TRACE_FUNCTION ("cmhT30_TransCmpl()"); + + /* terminate FAX call */ + t30ShrdPrm.faxStat = FS_IDL; + DTCSentFlg = TRUE; + + psaCC_ctb(t30ShrdPrm.cId)->curCmd = t30EntStat.curCmd; + psaCC_ctb(t30ShrdPrm.cId)->curSrc = t30EntStat.entOwn; + t30EntStat.curCmd = AT_CMD_NONE; + + TRACE_EVENT ("STOP FAX DATA PHASE"); + + R_AT( RAT_FHS, t30EntStat.entOwn )( FHSstat = FHS_STAT_NormEnd ); + + cmhCC_flagCall( t30ShrdPrm.cId, &((&cmhPrm[t30EntStat.entOwn].ccCmdPrm) -> mltyDscFlg)); + + ccShrdPrm.datStat = DS_DSC_REQ; + cmhT30_Deactivate (); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_NextPage | ++-------------------------------------------------------------------+ + + PURPOSE : next page requested + +*/ + +GLOBAL void cmhT30_NextPage ( void ) +{ + UBYTE cmdBuf; /* buffers current command */ + + TRACE_FUNCTION ("cmhT30_NextPage()"); + + /* terminate command and store result to FPS( FAX send ) */ + if (ccShrdPrm.ctb[t30ShrdPrm.cId] NEQ NULL AND + psaCC_ctb(t30ShrdPrm.cId)->calType EQ CT_MOC ) + { + fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FPSppr = FPS_PPR_Mcf; + + cmdBuf = t30EntStat.curCmd; + t30EntStat.curCmd = AT_CMD_NONE; + + TRACE_EVENT ("STOP FAX DATA PHASE"); + + cmhT30_StartFIT(); + + R_AT( RAT_OK, t30EntStat.entOwn )( cmdBuf ); + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_NextDoc | ++-------------------------------------------------------------------+ + + PURPOSE : next document requested + +*/ + +GLOBAL void cmhT30_NextDoc ( void ) +{ + UBYTE cmdBuf; /* buffers current command */ + + TRACE_FUNCTION ("cmhT30_NextDoc()"); + + /* send capabilities for next document ( FAX receive ) */ + if (psaCC_ctb(t30ShrdPrm.cId)->calType EQ CT_MTC) + { + cmhT30_SendCaps ( t30EntStat.entOwn, FRT_DIS ); + } + + /* terminate command and store result to FPS( FAX send ) */ + else if (psaCC_ctb(t30ShrdPrm.cId)->calType EQ CT_MOC ) + { + fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FPSppr = FPS_PPR_Mcf; + + cmdBuf = t30EntStat.curCmd; + t30EntStat.curCmd = AT_CMD_NONE; + + TRACE_EVENT ("STOP FAX DATA PHASE"); + cmhT30_StartFIT(); + + R_AT( RAT_OK, t30EntStat.entOwn )( cmdBuf ); + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_RTN | ++-------------------------------------------------------------------+ + + PURPOSE: Retrain Negative (RTN) + To indicate that the previous message has not been satisfactorily received. + However, further receptions may be possible, + provided training is retransmitted. +*/ + +GLOBAL void cmhT30_RTN ( void ) +{ + TRACE_FUNCTION ("cmhT30_RTN()"); + + psaT30_Capabilities(); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_RTP | ++-------------------------------------------------------------------+ + + PURPOSE: Retrain Positive (RTP) + To indicate that a complete message has been received + and that additional messages may follow + after retransmission of training and CFR. +*/ + +GLOBAL void cmhT30_RTP ( void ) +{ + TRACE_FUNCTION ("cmhT30_RTP()"); + + psaT30_Capabilities(); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_FTT | ++-------------------------------------------------------------------+ + + PURPOSE : failure to train + +*/ + +GLOBAL void cmhT30_FTT ( void ) +{ + TRACE_FUNCTION ("cmhT30_FTT()"); + + /* re-negotiate bit rate and send new DCS */ + + /* check for minimum speed condition */ + if( t30NgtPrms.FCSbr EQ F_BR_2400 OR + t30NgtPrms.FCSbr -1 < fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FMSbr ) + { + t30ShrdPrm.faxStat = FS_IDL; + t30EntStat.curCmd = AT_CMD_NONE; + /* pretend an orderly abort */ + psaCC_ctb(t30ShrdPrm.cId)->curCmd = AT_CMD_FKS; + psaCC_ctb(t30ShrdPrm.cId)->curSrc = t30EntStat.entOwn; + ccShrdPrm.datStat = DS_DSC_REQ; + cmhT30_Deactivate (); + + R_AT( RAT_FHS, t30EntStat.entOwn )( FHSstat = FHS_STAT_TrainFail ); + } + else + { + t30NgtPrms.FCSbr--; + cmhT30_SendCaps ( t30EntStat.entOwn, FRT_DCS ); + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_PageReceived | ++-------------------------------------------------------------------+ + + PURPOSE : FAX page was received + +*/ + +GLOBAL void cmhT30_PageReceived ( void ) +{ + TRACE_FUNCTION ("cmhT30_PageReceived()"); + + /* indicate page status */ + t30ShrdPrm.faxStat = FS_RCV_DOC; + t30EntStat.curCmd = AT_CMD_NONE; + + TRACE_EVENT ("STOP FAX DATA PHASE"); + cmhT30_StartFIT(); + + /* FCQ controls output of FPS */ + + if(fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FCQrq EQ FCQ_RQ_CQCDisabled) + { + R_AT( RAT_FPS, t30EntStat.entOwn )( FPS_PPR_Mcf,t30ShrdPrm.eol,0,0,0 ); + } + else + { + R_AT( RAT_FPS, t30EntStat.entOwn )( fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FPSppr,t30ShrdPrm.eol,0,0,0 ); + } + + R_AT( RAT_FET, t30EntStat.entOwn )( FET_PPM_Mps ); + R_AT( RAT_OK, t30EntStat.entOwn ) ( AT_CMD_FDR ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_DocReceived | ++-------------------------------------------------------------------+ + + PURPOSE : FAX document was received + +*/ + +GLOBAL void cmhT30_DocReceived ( void ) +{ + TRACE_FUNCTION ("cmhT30_DocReceived()"); + + /* reset polling mode if received doc was polled */ + if (psaCC_ctb(t30ShrdPrm.cId)->calType EQ CT_MOC) + { + fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FSPval = FSP_VAL_PollDisabled; + } + + /* indicate page status */ + t30ShrdPrm.faxStat = FS_DOC_TRF; + t30EntStat.curCmd = AT_CMD_NONE; + + TRACE_EVENT ("STOP FAX DATA PHASE"); + cmhT30_StartFIT(); + + /* FCQ controls output of FPS */ + if(fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FCQrq EQ FCQ_RQ_CQCDisabled) + { + R_AT( RAT_FPS, t30EntStat.entOwn )( FPS_PPR_Mcf,t30ShrdPrm.eol,0,0,0 ); + } + else + { + R_AT( RAT_FPS, t30EntStat.entOwn )( fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FPSppr,t30ShrdPrm.eol,0,0,0 ); + } + + R_AT( RAT_FET, t30EntStat.entOwn )( FET_PPM_Eom ); + R_AT( RAT_OK, t30EntStat.entOwn ) ( AT_CMD_FDR ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_ProcEnd | ++-------------------------------------------------------------------+ + + PURPOSE : FAX document was received + +*/ + +GLOBAL void cmhT30_ProcEnd ( void ) +{ + TRACE_FUNCTION ("cmhT30_ProcEnd()"); + + /* indicate page status */ + t30ShrdPrm.faxStat = FS_RCV_DOC; + t30EntStat.curCmd = AT_CMD_NONE; + + TRACE_EVENT ("STOP FAX DATA PHASE"); + cmhT30_StartFIT(); + + /* FCQ controls output of FPS */ + if(fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FCQrq EQ FCQ_RQ_CQCDisabled) + { + R_AT( RAT_FPS, t30EntStat.entOwn )( FPS_PPR_Mcf,t30ShrdPrm.eol,0,0,0 ); + } + else + { + R_AT( RAT_FPS, t30EntStat.entOwn )( fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FPSppr,t30ShrdPrm.eol,0,0,0 ); + } + + R_AT( RAT_FET, t30EntStat.entOwn )( FET_PPM_Eop ); + R_AT( RAT_OK, t30EntStat.entOwn )( AT_CMD_FDR ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_ProcInt | ++-------------------------------------------------------------------+ + + PURPOSE : Procedural Interrupt +*/ + +GLOBAL void cmhT30_ProcInt ( void ) +{ + TRACE_FUNCTION ("cmhT30_ProcInt()"); + + /* resend PPM to T.30 */ + if(fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FIEval EQ FIE_VAL_AcceptPRI) + { + t30ShrdPrm.sgn_snd |= PRI_MRK; + } + + if( pageSentFlg EQ TRUE ) + { + if( psaT30_Ppm( ) < 0 ) /* T30 PPM request */ + { + TRACE_EVENT( "FATAL RETURN psaT30 in cmhT30_ProcInt" ); + } + } + else + { + ppmPendFlg = TRUE; + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_ProcIntInst | ++-------------------------------------------------------------------+ + + PURPOSE : Procedural Interrupt Installed + +*/ + +GLOBAL void cmhT30_ProcIntInst ( void ) +{ + + TRACE_FUNCTION ("cmhT30_ProcIntInst()"); + + /* send notification and wait for call modification */ + t30EntStat.curCmd = AT_CMD_NONE; + + TRACE_EVENT ("STOP FAX DATA PHASE"); + + R_AT( RAT_FVO, t30EntStat.entOwn )(); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_PageReceivedPRI | ++-------------------------------------------------------------------+ + + PURPOSE : FAX page was received, procedural interupt request + +*/ + +GLOBAL void cmhT30_PageReceivedPRI ( void ) +{ + TRACE_FUNCTION ("cmhT30_PageReceivedPRI()"); + + /* indicate page status */ + t30ShrdPrm.faxStat = FS_RCV_DOC; + t30EntStat.curCmd = AT_CMD_NONE; + + TRACE_EVENT ("STOP FAX DATA PHASE"); + cmhT30_StartFIT(); + + /* FCQ controls output of FPS */ + if(fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FCQrq EQ FCQ_RQ_CQCEnabled) + { + R_AT( RAT_FPS, t30EntStat.entOwn )( FPS_PPR_Pip,t30ShrdPrm.eol,0,0,0 ); + } + else if(fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FCQrq EQ FCQ_RQ_CQCDisabled) + { + R_AT( RAT_FPS, t30EntStat.entOwn )( FPS_PPR_Mcf,t30ShrdPrm.eol,0,0,0 ); + } + + R_AT( RAT_FET, t30EntStat.entOwn )( FET_PPM_PriMps ); + R_AT( RAT_OK, t30EntStat.entOwn ) ( AT_CMD_FDR ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_DocReceivedPRI | ++-------------------------------------------------------------------+ + + PURPOSE : FAX document was received, procedural interrupt request + +*/ + +GLOBAL void cmhT30_DocReceivedPRI ( void ) +{ + + TRACE_FUNCTION ("cmhT30_DocReceivedPRI()"); + + /* reset polling mode if received doc was polled */ + if(psaCC_ctb(t30ShrdPrm.cId)->calType EQ CT_MOC) + { + fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FSPval = FSP_VAL_PollDisabled; + } + + /* indicate page status */ + t30ShrdPrm.faxStat = FS_DOC_TRF; + t30EntStat.curCmd = AT_CMD_NONE; + + + TRACE_EVENT ("STOP FAX DATA PHASE"); + cmhT30_StartFIT(); + + /* FCQ controls output of FPS */ + if(fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FCQrq EQ FCQ_RQ_CQCEnabled) + { + R_AT( RAT_FPS, t30EntStat.entOwn )( FPS_PPR_Pin,t30ShrdPrm.eol,0,0,0 ); + } + else if(fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FCQrq EQ FCQ_RQ_CQCDisabled) + { + R_AT( RAT_FPS, t30EntStat.entOwn )( FPS_PPR_Mcf,t30ShrdPrm.eol,0,0,0 ); + } + + R_AT( RAT_FET, t30EntStat.entOwn )( FET_PPM_PriEom ); + R_AT( RAT_OK, t30EntStat.entOwn ) ( AT_CMD_FDR ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_T30R | +| ROUTINE : cmhT30_ProcEndPRI | ++-------------------------------------------------------------------+ + + PURPOSE : FAX document was received, procedural interrupt request + +*/ + +GLOBAL void cmhT30_ProcEndPRI ( void ) +{ + + TRACE_FUNCTION ("cmhT30_ProcEndPRI()"); + + /* indicate page status */ + t30ShrdPrm.faxStat = FS_RCV_DOC; + t30EntStat.curCmd = AT_CMD_NONE; + + TRACE_EVENT ("STOP FAX DATA PHASE"); + cmhT30_StartFIT(); + + /* FCQ controls output of FPS */ + if(fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FCQrq EQ FCQ_RQ_CQCEnabled) + { + R_AT( RAT_FPS, t30EntStat.entOwn )( FPS_PPR_Pin,t30ShrdPrm.eol,0,0,0 ); + } + else if(fnd_cmhPrm[t30EntStat.entOwn].t30CmdPrm.FCQrq EQ FCQ_RQ_CQCDisabled) + { + R_AT( RAT_FPS, t30EntStat.entOwn )( FPS_PPR_Mcf,t30ShrdPrm.eol,0,0,0 ); + } + + R_AT( RAT_FET, t30EntStat.entOwn )( FET_PPM_PriEop ); + R_AT( RAT_OK, t30EntStat.entOwn ) ( AT_CMD_FDR ); +} + +//#ifdef DTI +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : CMH_T30R | +| STATE : code ROUTINE : T30_connect_dti_cb | ++--------------------------------------------------------------------+ + + PURPOSE : Callback for connection between T30 and UART. + +*/ + +GLOBAL BOOL T30_connect_dti_cb(UBYTE dti_id, T_DTI_CONN_STATE result_type) +{ + T_ACI_DTI_PRC *srcInfos; + T_DTI_CNTRL info; + + TRACE_FUNCTION("T30_connect_dti_cb"); + + + if (dti_cntrl_get_info_from_dti_id( dti_id, &info) EQ FALSE) + { + TRACE_EVENT_P1("cannot find info for dti_id=%d", dti_id); + return FALSE; + } + + srcInfos = find_element (uart_src_params, info.src_id, cmhUARTtest_srcId); + if (srcInfos EQ NULL) + { + TRACE_EVENT_P1 ("[ERR] T30_connect_dti_cb: srcId=%d not found", info.src_id); + return FALSE; + } + + switch( result_type) + { + case(DTI_CONN_STATE_DISCONNECTED): + + dti_cntrl_clear_conn_parms( dti_id ); + + if (t30EntStat.isTempDisconnected) + { + BITFIELD_SET (srcInfos->data_cntr, UART_DTI_SB_BIT); + t30EntStat.isTempDisconnected = FALSE; + } + else + { + BITFIELD_CLEAR (srcInfos->data_cntr, UART_DTI_SB_BIT); + cmhT30_Deactivate(); + } + break; + + case(DTI_CONN_STATE_CONNECTED): + case(DTI_CONN_STATE_CONNECTING): + case(DTI_CONN_STATE_DISCONNECTING): + break; + case(DTI_CONN_STATE_ERROR): + dti_cntrl_close_dpath_from_dti_id( dti_id ); + break; + + default: + TRACE_EVENT("T30_connect_dti_cb call with not awaited value"); + break; + } + return TRUE; +} +#endif /* DTI OR FF_FAX*/ +/*==== EOF ========================================================*/