FreeCalypso > hg > fc-tourmaline
view src/g23m-aci/aci/cmh_t30r.c @ 275:79cfefc1e2b4
audio mode load: gracefully handle mode files of wrong AEC version
Unfortunately our change of enabling L1_NEW_AEC (which is necessary
in order to bring our Calypso ARM fw into match with the underlying
DSP reality) brings along a change in the audio mode file binary
format and file size - all those new tunable AEC parameters do need
to be stored somewhere, after all. But we already have existing
mode files in the old format, and setting AEC config to garbage when
loading old audio modes (which is what would happen without the
present change) is not an appealing proposition.
The solution implemented in the present change is as follows: the
audio mode loading code checks the file size, and if it differs
from the active version of T_AUDIO_MODE, the T_AUDIO_AEC_CFG structure
is cleared - set to the default (disabled AEC) for the compiled type
of AEC. We got lucky in that this varying T_AUDIO_AEC_CFG structure
sits at the end of T_AUDIO_MODE!
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 30 Jul 2021 02:55:48 +0000 |
parents | fa8dc04885d8 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | 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 ========================================================*/