FreeCalypso > hg > fc-tourmaline
view src/g23m-fad/t30/t30_kerp.c @ 78:c632896652ba
mfw/ti1_key.c: properly initialize notified_keys array
The code in this ti1_key.c layer needs to call kpd_subscribe() and
kpd_define_key_notification() functions in order to register with the
KPD driver. The original code passed KPD_NB_PHYSICAL_KEYS in
nb_notified_keys - this constant is defined to 24 in kpd_cfg.h on all
platforms of interest to us - but it only filled the first 23 slots
in the notified_keys array, resulting in stack garbage being passed
to KPD API functions. The fix consists of initializing the last
missed array slot to KPD_KEY_RECORD, the key ID for the right side
button on the D-Sample handset.
On our current hw targets this "Record" button exists as the EXTRA
button on our Luna keypad board and as the camera button on the
Pirelli DP-L10. There is no support whatsoever for this button
in current BMI+MFW, we have no plans of doing anything with Pirelli's
camera button even if we do get our UI fw running on that phone,
and the Mother's dream of building our own FreeCalypso handset with
the same button arrangement as D-Sample (including the right side
button) is currently very nebulous - but let us nonetheless handle
the full set of buttons on the KPD to MFW interface, and let upper
layers weed out unsupported buttons.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 25 Oct 2020 23:41:01 +0000 |
parents | fa8dc04885d8 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-F&D (8411) | Modul : t30_kerp +----------------------------------------------------------------------------- | 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 Modul defines the functions for processing | of incomming primitives for the component T30 | of the mobile station +----------------------------------------------------------------------------- */ #ifndef T30_KERP_C #define T30_KERP_C #endif #define ENTITY_T30 /*==== INCLUDES ===================================================*/ #include <string.h> #include <stdlib.h> #include <stddef.h> #include "typedefs.h" #include "pcm.h" #include "vsi.h" #include "macdef.h" #include "pconst.cdg" #include "mconst.cdg" #include "message.h" #include "ccdapi.h" #include "custom.h" #include "gsm.h" #include "prim.h" #include "cnf_t30.h" #include "mon_t30.h" #include "pei.h" #include "tok.h" #include "dti.h" /* functionality of the dti library */ #include "t30.h" /*==== CONST =======================================================*/ /*==== TYPES =======================================================*/ /*==== VAR EXPORT ==================================================*/ /*==== VAR LOCAL ===================================================*/ /*==== FUNCTIONS ===================================================*/ /* uplink -------- DTI_DATA_TEST_REQ (SDU) | v DTI_DATA_REQ (DescList) | v compress TDC FAD_DATA_REQ (SDU) downlink -------- DTI_DATA_TEST_IND (SDU) ^ | DTI_DATA_IND (DescList) ^ expand TDC | FAD_DATA_IND (SDU) */ LOCAL void cleanup_dti_data_req_desc(T_desc2 **desc) { if (*desc AND (*desc)->len) { MFREE_DESC2(*desc); } *desc = NULL; } LOCAL UBYTE prepare_fad_data_req(void) { if (t30_data->fad_data_req EQ NULL) { PALLOC_SDU (fad_data_req, FAD_DATA_REQ, (USHORT)(t30_data->frames_per_prim << 3)); fad_data_req->sdu.l_buf = 0; fad_data_req->final = FALSE; fad_data_req->trans_rate = t30_data->trans_rate; t30_data->fad_data_req = fad_data_req; } return TDCcompress(t30_data->dti_data_req_desc, &t30_data->fad_data_req->sdu); } /*----------------------------------------------------------------------------- | Function : sig_dti_ker_data_received_ind +------------------------------------------------------------------------------ | Description : Process reason DTI_REASON_DATA_RECEIVED | received from dtilib callback function. | | Parameters : dti_data_req | | Return : - +------------------------------------------------------------------------------ */ GLOBAL void sig_dti_ker_data_received_ind (T_DTI2_DATA_REQ *dti_data_req) { BOOL ready; TRACE_FUNCTION ("sig_dti_ker_data_received_ind()"); if (dti_data_req) /* got a new DTI_DATA_REQ */ { t30_data->dti_data_req_desc = (T_desc2*)dti_data_req->desc_list2.first; PFREE (dti_data_req); t30_data->dti_data_req_ptr = NULL; switch (GET_STATE (KER)) { case T30_SND_RDY: ready = prepare_fad_data_req(); if (ready & READY_UPLI_PAGE) { t30_data->fad_data_req->final = TRUE; sig_ker_msg_mdat_req(t30_data->fad_data_req); SET_STATE (KER, T30_SND_DATF); } else if (ready & READY_UPLI_SDU) { sig_ker_msg_mdat_req(t30_data->fad_data_req); SET_STATE (KER, T30_SND_DAT); } else { snd_dti_ready_ind(); } break; default: cleanup_dti_data_req_desc(&t30_data->dti_data_req_desc); break; } } else /* more DTI data to process */ { switch (GET_STATE (KER)) { case T30_SND_DAT: { ready = prepare_fad_data_req(); if (ready & READY_UPLI_PAGE) { t30_data->fad_data_req->final = TRUE; SET_STATE (KER, T30_SND_DATF); sig_ker_msg_mdat_req(t30_data->fad_data_req); } else if (ready & READY_UPLI_SDU) { sig_ker_msg_mdat_req(t30_data->fad_data_req); } else { SET_STATE (KER, T30_SND_RDY); snd_dti_ready_ind(); } break; } default: break; } } } /* +------------------------------------------------------------------------------ | Function : sig_dti_ker_tx_buffer_ready_ind +------------------------------------------------------------------------------ | Description : Process reason DTI_REASON_TX_BUFFER_READY received from | dti library callback function. | | Parameters : - | | Return : - +------------------------------------------------------------------------------ */ GLOBAL void sig_dti_ker_tx_buffer_ready_ind() { TRACE_FUNCTION ("sig_dti_ker_tx_buffer_ready_ind()"); if(t30_data->dti_data_ind_empty) /* send flow control primitive if available */ { snd_dti_data_ind(&t30_data->dti_data_ind_empty); } else /* send regular data primitive */ { switch (GET_STATE (KER)) { case T30_RCV_MSG: if (t30_data->dti_data_ind) { snd_dti_data_ind(&t30_data->dti_data_ind); if (t30_data->dti_data_ind_final) { SET_STATE (KER, T30_RCV_RDYF); } else { SET_STATE (KER, T30_RCV_RDY); } } else SET_STATE (KER, T30_RCV_DATW); break; case T30_RCV_RDY: if (t30_data->dti_data_ind) { snd_dti_data_ind(&t30_data->dti_data_ind); if (t30_data->dti_data_ind_final) { SET_STATE (KER, T30_RCV_RDYF); } else { SET_STATE (KER, T30_RCV_RDY); } } else SET_STATE (KER, T30_RCV_DAT); break; case T30_RCV_RDYF: SET_STATE (KER, T30_RCV_PSTW); snd_t30_phase_ind(BCS_PHASE); break; case T30_SND_RDYW: SET_STATE (KER, T30_SND_RDY); break; default: TRACE_EVENT("ERROR: DTI_REASON_TX_BUFFER_READY in wrong KER state"); break; } } } LOCAL void snd_eol_ind(void) { PALLOC (t30_eol_ind, T30_EOL_IND); t30_eol_ind->eol = t30_data->eol; t30_data->eol = 0; PSENDX (MMI, t30_eol_ind); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_t30_dti_req | +--------------------------------------------------------------------+ PURPOSE : Process primitive T30_DTI_REQ received from MMI and confirms with T30_DTI_CNF. */ GLOBAL void ker_t30_dti_req (T_T30_DTI_REQ *t30_dti_req) { TRACE_FUNCTION ("ker_t30_dti_req()"); PACCESS (t30_dti_req); switch (GET_STATE (KER)) { case T30_RCV_MSGW: { ker_check_rtc(NULL); if (t30_dti_req->dti_conn NEQ T30_CONNECT_DTI) { TRACE_EVENT("ERROR: DTI not connected"); } else { SET_STATE (KER, T30_RCV_MSG); dti_connect_setup(t30_dti_req); } break; } case T30_RCV_PSTW: { if (t30_dti_req->dti_conn NEQ T30_DISCONNECT_DTI) { TRACE_EVENT("ERROR: DTI not disconnected"); } else { SET_STATE (KER, T30_RCV_PST); dti_disconnect(); snd_t30_dti_cnf(T30_DISCONNECT_DTI); snd_eol_ind(); } break; } case T30_SND_MSG: { if (t30_dti_req->dti_conn NEQ T30_CONNECT_DTI) { TRACE_EVENT("ERROR: DTI not connected"); } else { SET_STATE (KER, T30_SND_RDYW); dti_connect_setup(t30_dti_req); } break; } case T30_SND_PSTW: { if (t30_dti_req->dti_conn NEQ T30_DISCONNECT_DTI) { TRACE_EVENT("ERROR: DTI not disconnected"); } else { SET_STATE(KER, T30_SND_PST); dti_disconnect(); snd_t30_dti_cnf(T30_DISCONNECT_DTI); SET_STATE (KER, T30_SND_PST); t30_data->mux.mode = MUX_BCS; sig_ker_mux_mux_req (); snd_t30_sgn_ind(t30_data->sgn_ind); } break; } default: if (t30_dti_req->dti_conn EQ T30_DISCONNECT_DTI) { dti_disconnect(); snd_t30_dti_cnf(T30_DISCONNECT_DTI); switch (GET_STATE (KER)) { case T30_RCV_DAT: case T30_RCV_DATW: case T30_RCV_MSG: case T30_RCV_MSGW: case T30_RCV_RDY: case T30_RCV_RDYF: case T30_RCV_RDYW: snd_error_ind(ERR_PH_C_RCV_UNSPEC); break; case T30_SND_DAT: case T30_SND_DATF: case T30_SND_MSG: case T30_SND_RDY: case T30_SND_RDYW: snd_error_ind(ERR_PH_C_SND_UNSPEC); break; } SET_STATE (KER, T30_IDLE); } else TRACE_EVENT("ERROR: T30_DTI_REQ in wrong KER state"); break; } PFREE (t30_dti_req); } /* +------------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : sig_dti_ker_connection_opened_ind | +------------------------------------------------------------------------+ PURPOSE : Process reason DTI_REASON_CONNECTION_OPENED received from dtilib callback function */ GLOBAL void sig_dti_ker_connection_opened_ind () { TRACE_FUNCTION ("sig_dti_ker_connection_opened_ind()"); switch (GET_STATE (KER)) { case T30_RCV_MSG: case T30_SND_RDYW: { dti_connect_open(); break; } default: TRACE_EVENT("ERROR: DTI_REASON_CONNECTION_OPENED in wrong KER state"); break; } } /* +------------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : sig_dti_ker_connection_closed_ind | +------------------------------------------------------------------------+ PURPOSE : Process reason DTI_REASON_CONNECTION_CLOSED received from dtilib callback function */ GLOBAL void sig_dti_ker_connection_closed_ind () { TRACE_FUNCTION ("sig_dti_ker_connection_closed_ind()"); switch (GET_STATE (KER)) { case T30_RCV_PSTW: SET_STATE (KER, T30_RCV_PST); dti_connect_close(); snd_eol_ind(); break; case T30_SND_PSTW: SET_STATE(KER, T30_SND_PST); dti_connect_close(); SET_STATE (KER, T30_SND_PST); t30_data->mux.mode = MUX_BCS; sig_ker_mux_mux_req (); snd_t30_sgn_ind(t30_data->sgn_ind); break; default: dti_connect_close(); switch (GET_STATE (KER)) { case T30_RCV_DAT: case T30_RCV_DATW: case T30_RCV_MSG: case T30_RCV_MSGW: case T30_RCV_RDY: case T30_RCV_RDYF: case T30_RCV_RDYW: snd_error_ind(ERR_PH_C_RCV_UNSPEC); break; case T30_SND_DAT: case T30_SND_DATF: case T30_SND_MSG: case T30_SND_RDY: case T30_SND_RDYW: snd_error_ind(ERR_PH_C_SND_UNSPEC); break; } SET_STATE (KER, T30_IDLE); break; } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_fad_activate_cnf| +--------------------------------------------------------------------+ PURPOSE : Process primitive FAD_ACTIVATE_CNF received from FAD. FAD informs T30 that FAD is activated. T30 informs MMI that activation has been completed. */ GLOBAL void ker_fad_activate_cnf (T_FAD_ACTIVATE_CNF *fad_activate_cnf) { TRACE_FUNCTION ("ker_fad_activate_cnf()"); PACCESS (fad_activate_cnf); switch (GET_STATE (KER)) { case T30_ACTIVATE: { PPASS (fad_activate_cnf, t30_activate_cnf, T30_ACTIVATE_CNF); #ifdef _TARGET_ /* * sleep for 2 seconds because we should not send DIS to early * on a real network */ vsi_t_sleep (VSI_CALLER FRAMES_400); #endif /* * we pass also the buffer size parameters to MMI */ SET_STATE (KER, T30_IDLE); PSENDX (MMI, t30_activate_cnf); break; } default: PFREE (fad_activate_cnf); break; } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_fad_data_cnf | +--------------------------------------------------------------------+ PURPOSE : Process primitive FAD_DATA_CNF received from FAD. This primitive is received after a command or response has been sent successfully by FAD. */ GLOBAL void ker_fad_data_cnf (T_FAD_DATA_CNF *fad_data_cnf) { TRACE_FUNCTION ("ker_fad_data_cnf()"); PACCESS (fad_data_cnf); t30_data->data_cnf = TRUE; switch (GET_STATE (KER)) { case T30_DCN: snd_complete_ind(CMPL_DCN); break; case T30_RCV_CFR: TIMERSTART (T2_INDEX, MSG_VALUE); SET_STATE (KER, T30_RCV_MSGW); snd_t30_phase_ind(MSG_PHASE); break; case T30_RCV_DIS: TIMERSTART (T4_INDEX, T4_VALUE); SET_STATE (KER, T30_RCV_DCS); break; case T30_RCV_MCF: TIMERSTART (T2_INDEX, T2_VALUE); switch (t30_data->res) { case BCS_EOM: SET_STATE (KER, T30_RCV_T2); break; case BCS_EOP: SET_STATE (KER, T30_RCV_DCN); break; case BCS_MPS: t30_data->prev = BCS_MCF; SET_STATE (KER, T30_RCV_MSGW); snd_t30_phase_ind(MSG_PHASE); break; } break; case T30_RCV_PI: switch (t30_data->res) { case SGN_PRI_EOM: case SGN_PRI_EOP: case SGN_PRI_MPS: snd_complete_ind(CMPL_PI); break; default: SET_STATE (KER, T30_RCV_PST); break; } break; case T30_RCV_RT: SET_STATE (KER, T30_RCV_DCS); break; case T30_RCV_RT2: SET_STATE (KER, T30_RCV_DCS); break; case T30_SND_DCN: TIMERSTART (T4_INDEX, DCN_VALUE); break; case T30_SND_DCN1: snd_complete_ind(CMPL_DCN); break; case T30_SND_DCS: { PALLOC (fad_snd_tcf_req, FAD_SND_TCF_REQ); fad_snd_tcf_req->trans_rate = t30_data->trans_rate; PSENDX (FAD, fad_snd_tcf_req); SET_STATE (KER, T30_SND_TCF); } break; case T30_SND_DTC: TIMERSTOP (T1_INDEX); SET_STATE (KER, T30_RCV_DCS); break; case T30_SND_DATF: TIMERSTOP (T4_INDEX); SET_STATE (KER, T30_SND_PSTW); cleanup_dti_data_req_desc(&t30_data->dti_data_req_desc); snd_t30_phase_ind(BCS_PHASE); break; case T30_SND_PRI: snd_complete_ind(CMPL_PI); break; case T30_SND_SGN: TIMERSTART (T4_INDEX, T4_VALUE); SET_STATE (KER, T30_SND_MCF); break; } PFREE (fad_data_cnf); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_fad_deactivate_cnf| +--------------------------------------------------------------------+ PURPOSE : Process primitive FAD_DEACTIVATE_CNF received from FAD. FAD informs T30 that FAD is deactivated. T30 informs MMI that deactivation has been completed. */ GLOBAL void ker_fad_deactivate_cnf (T_FAD_DEACTIVATE_CNF *fad_deactivate_cnf) { TRACE_FUNCTION ("ker_fad_deactivate_cnf()"); PACCESS (fad_deactivate_cnf); PFREE (fad_deactivate_cnf); if (GET_STATE (KER) EQ T30_DEACTIVATE) { PALLOC (t30_deactivate_cnf, T30_DEACTIVATE_CNF); SET_STATE (KER, T30_NULL); PSENDX (MMI, t30_deactivate_cnf); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_fad_error_ind | +--------------------------------------------------------------------+ PURPOSE : Process primitive FAD_ERROR_IND received from FAD. All running timers are stopped and the error message is passed to MMI. */ GLOBAL void ker_fad_error_ind (T_FAD_ERROR_IND *fad_error_ind) { TRACE_FUNCTION ("ker_fad_error_ind()"); PACCESS (fad_error_ind); { PPASS (fad_error_ind, t30_error_ind, T30_ERROR_IND); PSENDX (MMI, t30_error_ind); } TIMERSTOP (T1_INDEX); TIMERSTOP (T2_INDEX); TIMERSTOP (T4_INDEX); SET_STATE (KER, T30_IDLE); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_fad_rcv_tcf_cnf | +--------------------------------------------------------------------+ PURPOSE : Process primitive FAD_RCV_TCF_CNF received from FAD. FAD sends the ratio of the received TCF. If the ratio is OK a CFR is sent as response otherwise an FTT. */ GLOBAL void ker_fad_rcv_tcf_cnf (T_FAD_RCV_TCF_CNF *fad_rcv_tcf_cnf) { TRACE_FUNCTION ("ker_fad_rcv_tcf_cnf()"); PACCESS (fad_rcv_tcf_cnf); switch (GET_STATE (KER)) { case T30_RCV_TCF: { TIMERSTOP (T2_INDEX); t30_data->rate_modified = FALSE; if (fad_rcv_tcf_cnf->ratio >= t30_data->threshold) { _decodedMsg[0] = BCS_CFR; SET_STATE (KER, T30_RCV_CFR); sig_ker_bcs_bdat_req (FINAL_YES); } else { _decodedMsg[0] = BCS_FTT; SET_STATE (KER, T30_RCV_DIS); sig_ker_bcs_bdat_req (FINAL_YES); } break; } default: break; } PFREE (fad_rcv_tcf_cnf); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_fad_ready_ind | +--------------------------------------------------------------------+ PURPOSE : Process primitive FAD_READY_IND received from FAD. FAD informs T30 that next fax data block can be sent. T30 passes this information to MMI. */ GLOBAL void ker_fad_ready_ind (T_FAD_READY_IND *fad_ready_ind) { TRACE_FUNCTION ("ker_fad_ready_ind()"); PACCESS (fad_ready_ind); switch (GET_STATE (KER)) { case T30_SND_DAT: { if (t30_data->dti_data_req_ptr) /* pending data in DTI_DATA_REQ */ { sig_dti_ker_data_received_ind (NULL); } else { SET_STATE (KER, T30_SND_RDY); snd_dti_ready_ind(); } break; } default: break; } PFREE (fad_ready_ind); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : sig_dti_ker_tx_buffer_full_ind | +--------------------------------------------------------------------+ PURPOSE : Process signal DTI_REASON_TX_BUFFER_FULL received from dti library callback function. The buffer function of DTILIB is not used. So there is nothing to be done here yet.. */ GLOBAL void sig_dti_ker_tx_buffer_full_ind() { TRACE_FUNCTION ("sig_dti_ker_tx_buffer_full_ind()"); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_fad_snd_tcf_cnf | +--------------------------------------------------------------------+ PURPOSE : Process primitive FAD_SND_TCF_CNF received from FAD. FAD informs T30 that the TCF has been sent. */ GLOBAL void ker_fad_snd_tcf_cnf (T_FAD_SND_TCF_CNF *fad_snd_tcf_cnf) { TRACE_FUNCTION ("ker_fad_snd_tcf_cnf()"); PACCESS (fad_snd_tcf_cnf); PFREE (fad_snd_tcf_cnf); switch (GET_STATE (KER)) { case T30_SND_TCF: { SET_STATE (KER, T30_SND_CFR); TIMERSTART (T4_INDEX, T4_VALUE); break; } default: break; } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : Initialize_Shared_Fax_Data_Memory| +--------------------------------------------------------------------+ PURPOSE : */ LOCAL void Initialize_Shared_Fax_Data_Memory(void) { ker_init (&t30_data_base[0]); bcs_init (&t30_data_base[0]); SET_STATE (MUX, T30_MUX_OFF); t30_data_magic_num = T30_DATA_MAGIC_NUM; /* memory is initialized */ } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_t30_activate_req| +--------------------------------------------------------------------+ PURPOSE : Process primitive T30_ACTIVATE_REQ received from MMI. MMI activates T30. T30 then activates FAD. The BCS multiplexer is switched on. */ GLOBAL void ker_t30_activate_req (T_T30_ACTIVATE_REQ *t30_activate_req) { TRACE_FUNCTION ("ker_t30_activate_req()"); PACCESS (t30_activate_req); Initialize_Shared_Fax_Data_Memory(); switch (GET_STATE (KER)) { case T30_NULL: { PALLOC (fad_activate_req, FAD_ACTIVATE_REQ); memset (t30_data, 0, sizeof(T_T30_DATA)); t30_data->threshold = t30_activate_req->threshold; t30_data->preamble_ind = TRUE; t30_data->trans_rate = t30_activate_req->trans_rate; t30_data->bitorder = t30_activate_req->bitorder; t30_data->rate_modified = FALSE; t30_data->TDC_doli_pending = FALSE; t30_data->TDC_upli_pending = FALSE; t30_data->frames_per_prim = MSG_SIZE_BITS >> 3; /* traditionally */ fad_activate_req->trans_rate = t30_activate_req->trans_rate; fad_activate_req->frames_per_prim = t30_activate_req->frames_per_prim; SET_STATE (KER, T30_ACTIVATE); PSENDX (FAD, fad_activate_req); t30_data->mux.mode = MUX_BCS; sig_ker_mux_mux_req (); TIMERSTART (T1_INDEX, T1_VALUE); break; } default: break; } PFREE (t30_activate_req); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_t30_cap_req | +--------------------------------------------------------------------+ PURPOSE : Process primitive T30_CAP_REQ received from MMI. The DIS parameters are prepared for sending to remote site. */ GLOBAL void ker_t30_cap_req (T_T30_CAP_REQ *t30_cap_req) { TRACE_FUNCTION ("ker_t30_cap_req()"); PACCESS (t30_cap_req); switch (GET_STATE (KER)) { case T30_IDLE: if (t30_cap_req->hdlc_info.v_dis) { TIMERSTOP (T1_INDEX); TIMERSTART (T1_INDEX, T1_VALUE); t30_data->mux.mode = MUX_BCS; t30_data->fmod = FMOD_RCV; t30_data->dir = 0; sig_ker_mux_mux_req (); memcpy (&t30_data->hdlc_snd, &t30_cap_req->hdlc_info, sizeof (T_hdlc_info)); memset (&t30_data->hdlc_rcv, 0, sizeof (T_hdlc_info)); SET_STATE (KER, T30_RCV_DIS); ker_send_dis (); } break; case T30_SND_CAP: if (t30_cap_req->hdlc_info.v_dcs) { SET_STATE (KER, T30_SND_DCS); t30_data->fmod = FMOD_SND; ker_send_dcs (t30_cap_req); } else if (t30_cap_req->hdlc_info.v_dtc) { SET_STATE (KER, T30_SND_DTC); t30_data->fmod = FMOD_POLL; ker_send_dtc (t30_cap_req); } break; default: break; } PFREE (t30_cap_req); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_t30_config_req | +--------------------------------------------------------------------+ PURPOSE : Process primitive T30_CONFIG_REQ received from MMI. MMI sends configuration parameters to control the behaviour of T30. The parameter test_mode is for internal use only. */ GLOBAL void ker_t30_config_req (T_T30_CONFIG_REQ *t30_config_req) { TRACE_FUNCTION ("ker_t30_config_req()"); PACCESS (t30_config_req); if (t30_config_req->test_mode & TST_BCS) Initialize_Shared_Fax_Data_Memory(); t30_data->hdlc_report = t30_config_req->hdlc_report; #ifdef _SIMULATION_ /* test_mode */ t30_data->test_mode = t30_config_req->test_mode; #endif PFREE (t30_config_req); #ifdef _SIMULATION_ /* test_mode */ if (t30_data->test_mode) { TRACE_EVENT(" "); TRACE_EVENT ("!!!! T E S T - M O D E !!!!"); TRACE_EVENT(" "); if (t30_data->test_mode & TST_BCS) TRACE_EVENT(">>> test-mode: BCS test only"); if (t30_data->test_mode & TST_STUFF) TRACE_EVENT(">>> test-mode: stuffing / destuffing off"); if (t30_data->test_mode & TST_FCS) TRACE_EVENT(">>> test-mode: FCS generating / checking off"); if (t30_data->test_mode & TST_CTRL) TRACE_EVENT(">>> test-mode: HDLC control checking off"); if (t30_data->test_mode & TST_RTC) TRACE_EVENT(">>> test-mode: RTC checking off"); if (t30_data->test_mode & TST_BUF) TRACE_EVENT(">>> test-mode: show contents of some buffers"); TRACE_EVENT(" "); } else { TRACE_EVENT(" "); TRACE_EVENT(">>> NORMAL MODE <<<"); TRACE_EVENT(" "); } #endif } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_t30_deactivate_req| +--------------------------------------------------------------------+ PURPOSE : Process primitive T30_DEACTIVATE_REQ received from MMI. MMI deactivates T30. T30 then deactivates FAD. */ GLOBAL void ker_t30_deactivate_req (T_T30_DEACTIVATE_REQ *t30_deactivate_req) { TRACE_FUNCTION ("ker_t30_deactivate_req()"); PACCESS (t30_deactivate_req); { PPASS (t30_deactivate_req, fad_deactivate_req, FAD_DEACTIVATE_REQ); PSENDX (FAD, fad_deactivate_req); SET_STATE (KER, T30_DEACTIVATE); } TIMERSTOP (T1_INDEX); TIMERSTOP (T2_INDEX); TIMERSTOP (T4_INDEX); t30_data->mux.mode = MUX_OFF; sig_ker_mux_mux_req(); cleanup_dti_data_req_desc(&t30_data->dti_data_req_desc); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_t30_modify_req | +--------------------------------------------------------------------+ PURPOSE : Process primitive T30_MODIFY_REQ received from MMI. MMI sends new parameter values to T30. T30 passes some of this parameters to FAD. */ GLOBAL void ker_t30_modify_req (T_T30_MODIFY_REQ *t30_modify_req) { TRACE_FUNCTION ("ker_t30_modify_req()"); PACCESS (t30_modify_req); t30_data->trans_rate = t30_modify_req->trans_rate; { PPASS (t30_modify_req, fad_modify_req, FAD_MODIFY_REQ); PSENDX (FAD, fad_modify_req); } switch (GET_STATE (KER)) { case T30_SND_TCF: { if (!t30_data->rate_modified) { /* * rate is modified or confirmed (t30_modify_req) by ACI; send TCF in FAD */ PALLOC (fad_snd_tcf_req, FAD_SND_TCF_REQ); fad_snd_tcf_req->trans_rate = t30_data->trans_rate; PSENDX (FAD, fad_snd_tcf_req); t30_data->rate_modified = TRUE; } } break; case T30_SND_DCS: case T30_RCV_DCS: case T30_RCV_TCF: { t30_data->rate_modified = TRUE; } break; } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : T30_KERP | | STATE : code ROUTINE : ker_t30_sgn_req | +--------------------------------------------------------------------+ PURPOSE : Process primitive T30_SGN_REQ received from MMI. MMI informs T30 which response should be send. T30 prepares an appropriate message and requests FAD to send this message. */ GLOBAL void ker_t30_sgn_req (T_T30_SGN_REQ *t30_sgn_req) { TRACE_FUNCTION ("ker_t30_sgn_req()"); PACCESS (t30_sgn_req); switch (GET_STATE (KER)) { case T30_IDLE: { switch (t30_sgn_req->sgn) { case SGN_DCN: { _decodedMsg[0] = BCS_DCN; SET_STATE (KER, T30_SND_DCN1); sig_ker_bcs_bdat_req (FINAL_YES); break; } default: { ker_send_err (ERR_SGN_NOT_ALLOWED); break; } } break; } case T30_RCV_PST: { switch (t30_sgn_req->sgn) { case SGN_MCF: { _decodedMsg[0] = BCS_MCF; SET_STATE (KER, T30_RCV_MCF); sig_ker_bcs_bdat_req (FINAL_YES); break; } case SGN_PIN: { _decodedMsg[0] = BCS_PIN; SET_STATE (KER, T30_RCV_PI); sig_ker_bcs_bdat_req (FINAL_YES); break; } case SGN_PIP: { _decodedMsg[0] = BCS_PIP; SET_STATE (KER, T30_RCV_PI); sig_ker_bcs_bdat_req (FINAL_YES); break; } case SGN_RTN: { _decodedMsg[0] = BCS_RTN; t30_data->prev = BCS_RTN; SET_STATE (KER, T30_RCV_RT); sig_ker_bcs_bdat_req (FINAL_YES); break; } case SGN_RTP: { _decodedMsg[0] = BCS_RTP; t30_data->prev = BCS_RTP; SET_STATE (KER, T30_RCV_RT); sig_ker_bcs_bdat_req (FINAL_YES); break; } default: { ker_send_err (ERR_SGN_NOT_ALLOWED); break; } } break; } /*-------------------------------------------------------------*/ case T30_SND_CAP: { switch (t30_sgn_req->sgn) { case SGN_DCN: { _decodedMsg[0] = BCS_DCN; SET_STATE (KER, T30_DCN); t30_data->fmod = FMOD_IDLE; sig_ker_bcs_bdat_req (FINAL_YES); break; } default: { ker_send_err (ERR_SGN_NOT_ALLOWED); break; } } break; } /*-------------------------------------------------------------*/ case T30_SND_PI: { switch (t30_data->sgn_req) { case SGN_EOM: case SGN_EOP: case SGN_MPS: case SGN_PRI_EOM: case SGN_PRI_EOP: case SGN_PRI_MPS: { switch (t30_sgn_req->sgn) { case SGN_PRI_EOM: { _decodedMsg[0] = BCS_PRI_EOM; SET_STATE (KER, T30_SND_PRI); sig_ker_bcs_bdat_req (FINAL_YES); break; } case SGN_PRI_EOP: { _decodedMsg[0] = BCS_PRI_EOP; SET_STATE (KER, T30_SND_PRI); sig_ker_bcs_bdat_req (FINAL_YES); break; } case SGN_PRI_MPS: { _decodedMsg[0] = BCS_PRI_MPS; SET_STATE (KER, T30_SND_PRI); sig_ker_bcs_bdat_req (FINAL_YES); break; } } break; } case SGN_CONT: { SET_STATE (KER, T30_IDLE); break; } default: { ker_send_err (ERR_SGN_NOT_ALLOWED); break; } } break; } /*-------------------------------------------------------------*/ case T30_SND_PST: { t30_data->repeat = 1; switch (t30_sgn_req->sgn) { case SGN_DCN: { _decodedMsg[0] = BCS_DCN; SET_STATE (KER, T30_DCN); sig_ker_bcs_bdat_req (FINAL_YES); break; } case SGN_EOM: { t30_data->sgn_req = BCS_EOM; _decodedMsg[0] = BCS_EOM; SET_STATE (KER, T30_SND_SGN); sig_ker_bcs_bdat_req (FINAL_YES); break; } case SGN_EOP: { t30_data->sgn_req = BCS_EOP; _decodedMsg[0] = BCS_EOP; SET_STATE (KER, T30_SND_SGN); sig_ker_bcs_bdat_req (FINAL_YES); break; } case SGN_MPS: { t30_data->sgn_req = BCS_MPS; _decodedMsg[0] = BCS_MPS; SET_STATE (KER, T30_SND_SGN); sig_ker_bcs_bdat_req (FINAL_YES); break; } case SGN_PRI_EOM: { t30_data->sgn_req = BCS_PRI_EOM; _decodedMsg[0] = BCS_PRI_EOM; SET_STATE (KER, T30_SND_SGN); sig_ker_bcs_bdat_req (FINAL_YES); break; } case SGN_PRI_EOP: { t30_data->sgn_req = BCS_PRI_EOP; _decodedMsg[0] = BCS_PRI_EOP; SET_STATE (KER, T30_SND_SGN); sig_ker_bcs_bdat_req (FINAL_YES); break; } case SGN_PRI_MPS: { t30_data->sgn_req = BCS_PRI_MPS; _decodedMsg[0] = BCS_PRI_MPS; SET_STATE (KER, T30_SND_SGN); sig_ker_bcs_bdat_req (FINAL_YES); break; } case SGN_CONT: { SET_STATE (KER, T30_IDLE); break; } default: { ker_send_err (ERR_SGN_NOT_ALLOWED); break; } } break; } default: break; } PFREE (t30_sgn_req); }