FreeCalypso > hg > fc-magnetite
view src/aci2/aci/cmh_t30r.c @ 600:8f50b202e81f
board preprocessor conditionals: prep for more FC hw in the future
This change eliminates the CONFIG_TARGET_FCDEV3B preprocessor symbol and
all preprocessor conditionals throughout the code base that tested for it,
replacing them with CONFIG_TARGET_FCFAM or CONFIG_TARGET_FCMODEM. These
new symbols are specified as follows:
CONFIG_TARGET_FCFAM is intended to cover all hardware designs created by
Mother Mychaela under the FreeCalypso trademark. This family will include
modem products (repackagings of the FCDEV3B, possibly with RFFE or even
RF transceiver changes), and also my desired FreeCalypso handset product.
CONFIG_TARGET_FCMODEM is intended to cover all FreeCalypso modem products
(which will be firmware-compatible with the FCDEV3B if they use TI Rita
transceiver, or will require a different fw build if we switch to one of
Silabs Aero transceivers), but not the handset product. Right now this
CONFIG_TARGET_FCMODEM preprocessor symbol is used to conditionalize
everything dealing with MCSI.
At the present moment the future of FC hardware evolution is still unknown:
it is not known whether we will ever have any beyond-FCDEV3B hardware at all
(contingent on uncertain funding), and if we do produce further FC hardware
designs, it is not known whether they will retain the same FIC modem core
(triband), if we are going to have a quadband design that still retains the
classic Rita transceiver, or if we are going to switch to Silabs Aero II
or some other transceiver. If we produce a quadband modem that still uses
Rita, it will run exactly the same fw as the FCDEV3B thanks to the way we
define TSPACT signals for the RF_FAM=12 && CONFIG_TARGET_FCFAM combination,
and the current fcdev3b build target will be renamed to fcmodem. OTOH, if
that putative quadband modem will be Aero-based, then it will require a
different fw build target, the fcdev3b target will stay as it is, and the
two targets will both define CONFIG_TARGET_FCFAM and CONFIG_TARGET_FCMODEM,
but will have different RF_FAM numbers. But no matter which way we are
going to evolve, it is not right to have conditionals on CONFIG_TARGET_FCDEV3B
in places like ACI, and the present change clears the way for future
evolution.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 01 Apr 2019 01:05:24 +0000 |
parents | 93999a60b835 |
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 ) { UBYTE cmdBuf; TRACE_FUNCTION ("cmhT30_Disconnect()"); /* clear FAX call */ cmdBuf = t30EntStat.curCmd; 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 = 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 ) { UBYTE cmdBuf; TRACE_FUNCTION ("cmhT30_ProcIntInst()"); /* send notification and wait for call modification */ cmdBuf = t30EntStat.curCmd; 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 ========================================================*/