FreeCalypso > hg > fc-tourmaline
diff src/g23m-fad/t30/t30_kerf.c @ 1:fa8dc04885d8
src/g23m-*: import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:25:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-fad/t30/t30_kerf.c Fri Oct 16 06:25:50 2020 +0000 @@ -0,0 +1,2963 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-F&D (8411) +| Modul : t30_kerf ++----------------------------------------------------------------------------- +| 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 procedures and functions for +| the component T30 of the mobile station ++----------------------------------------------------------------------------- +*/ + +#ifndef T30_KERF_C +#define T30_KERF_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 ===================================================*/ + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_init | ++--------------------------------------------------------------------+ + + PURPOSE : initialize kernel + +*/ + +GLOBAL void ker_init (T_T30_DATA *pt30_data) +{ + TRACE_FUNCTION ("ker_init()"); + + memset (pt30_data, 0, sizeof (T_T30_DATA)); + SET_STATE (KER, T30_NULL); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_check_rtc | ++--------------------------------------------------------------------+ + + PURPOSE : This function scans the received fax data for RTC. + +*/ + +GLOBAL UBYTE ker_check_rtc (T_FAD_DATA_IND *fad_data_ind) +{ + USHORT i; + UBYTE bit_ptr; + + TRACE_FUNCTION ("ker_check_rtc()"); + +#ifdef _SIMULATION_ /* RTC checking OFF */ + if (t30_data->test_mode & TST_RTC) + return RTC_NO; +#endif + + if (fad_data_ind EQ NULL) + { + t30_data->rtc_zero = 0; + t30_data->rtc_eol = 0; + return RTC_NO; + } + + for (i = 0 ; i < (fad_data_ind->sdu.l_buf >> 3); i++) + { + UBYTE ch = fad_data_ind->sdu.buf[i]; + if (!ch) + { + t30_data->rtc_zero += 8; + continue; + } + bit_ptr = 0x80; + do + { + if (ch & bit_ptr) + { + if (t30_data->rtc_zero >= 11) + t30_data->eol++; + + if (t30_data->rtc_zero EQ 11) + { + if (++t30_data->rtc_eol EQ 6) + { + t30_data->rtc_eol = 0; + t30_data->rtc_zero = 0; + t30_data->eol -= 5; + return RTC_YES; + } + } + else + { + if (t30_data->rtc_eol) + t30_data->rtc_eol = 0; + else if (t30_data->rtc_zero >= 11) + t30_data->rtc_eol++; + } + t30_data->rtc_zero = 0; + } + else + t30_data->rtc_zero++; + + bit_ptr >>= 1; + } + while (bit_ptr); + } + return RTC_NO; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dcs_cap0 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the mandatory fax capabilities. + +*/ + +LOCAL void ker_fill_dcs_cap0 (T_BCS_DCS *bcs_dcs) +{ +#define X t30_data->hdlc_rcv.dcs +#define Y bcs_dcs->cap0_snd + + TRACE_FUNCTION ("ker_fill_dcs_cap0()"); + + X.rec_fax_op = Y.rec_fax_op; + X.data_sig_rate = Y.data_sig_rate; + X.R8_lines_pels = Y.R8_lines_pels; + X.two_dim_coding = Y.two_dim_coding; + X.rec_width = Y.rec_width; + X.max_rec_len = Y.max_rec_len; + X.min_scan_time = Y.min_scan_time; + + /* + t30_data->trans_rate = Y.data_sig_rate; + */ +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dcs_cap1 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 1. + +*/ + +LOCAL void ker_fill_dcs_cap1 (T_BCS_DCS *bcs_dcs) +{ +#define X t30_data->hdlc_rcv.dcs +#define Y bcs_dcs->cap1_snd + + TRACE_FUNCTION ("ker_fill_dcs_cap1()"); + + if (bcs_dcs->v_cap1_snd) + { + X.uncomp_mode = Y.uncomp_mode; + X.err_corr_mode = Y.err_corr_mode; + X.frame_size = Y.frame_size; + X.t6_coding = Y.t6_coding; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dcs_cap2 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 2. + +*/ + +LOCAL void ker_fill_dcs_cap2 (T_BCS_DCS *bcs_dcs) +{ +#define X t30_data->hdlc_rcv.dcs +#define Y bcs_dcs->cap2_snd + + TRACE_FUNCTION ("ker_fill_dcs_cap2()"); + + if (bcs_dcs->v_cap2_snd) + { + /* for future use */ + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dcs_cap3 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 3. + +*/ + +LOCAL void ker_fill_dcs_cap3 (T_BCS_DCS *bcs_dcs) +{ +#define X t30_data->hdlc_rcv.dcs +#define Y bcs_dcs->cap3_snd + + TRACE_FUNCTION ("ker_fill_dcs_cap3()"); + + if (bcs_dcs->v_cap3_snd) + { + X.R8_lines = Y.R8_lines; + X.r_300_pels = Y.r_300_pels; + X.R16_lines_pels = Y.R16_lines_pels; + X.resolution_type = Y.resolution_type; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dcs_cap4 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 4. + +*/ + +LOCAL void ker_fill_dcs_cap4 (T_BCS_DCS *bcs_dcs) +{ +#define X t30_data->hdlc_rcv.dcs +#define Y bcs_dcs->cap4_snd + + TRACE_FUNCTION ("ker_fill_dcs_cap4()"); + + if (bcs_dcs->v_cap4_snd) + { + X.subaddr = Y.subaddr; + X.password = Y.password; + X.bft = Y.bft; + X.dtm = Y.dtm; + X.edi = Y.edi; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dcs_cap5 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 5. + +*/ + +LOCAL void ker_fill_dcs_cap5 (T_BCS_DCS *bcs_dcs) +{ +#define X t30_data->hdlc_rcv.dcs +#define Y bcs_dcs->cap5_snd + + TRACE_FUNCTION ("ker_fill_dcs_cap5()"); + + if (bcs_dcs->v_cap5_snd) + { + X.btm = Y.btm; + X.char_mode = Y.char_mode; + X.mixed_mode = Y.mixed_mode; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dcs_cap6 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 6. + +*/ + +LOCAL void ker_fill_dcs_cap6 (T_BCS_DCS *bcs_dcs) +{ +#define X t30_data->hdlc_rcv.dcs +#define Y bcs_dcs->cap6_snd + + TRACE_FUNCTION ("ker_fill_dcs_cap6()"); + + if (bcs_dcs->v_cap6_snd) + { + X.proc_mode_26 = Y.proc_mode_26; + X.dig_network_cap = Y.dig_network_cap; + X.duplex = Y.duplex; + X.jpeg = Y.jpeg; + X.full_colour = Y.full_colour; + X.huffman_tables = Y.huffman_tables; + X.r_12_bits_pel_comp = Y.r_12_bits_pel_comp; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dcs_cap7 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 7. + +*/ + +LOCAL void ker_fill_dcs_cap7 (T_BCS_DCS *bcs_dcs) +{ +#define X t30_data->hdlc_rcv.dcs +#define Y bcs_dcs->cap7_snd + + TRACE_FUNCTION ("ker_fill_dcs_cap7()"); + + if (bcs_dcs->v_cap7_snd) + { + X.no_subsamp = Y.no_subsamp; + X.cust_illum = Y.cust_illum; + X.cust_gamut = Y.cust_gamut; + X.na_letter = Y.na_letter; + X.na_legal = Y.na_legal; + X.sing_prog_seq_coding_basic = Y.sing_prog_seq_coding_basic; + X.sing_prog_seq_coding_L0 = Y.sing_prog_seq_coding_L0; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dcs_info | ++--------------------------------------------------------------------+ + + PURPOSE : This function fills the hdlc-frame-buffer with the + received DCS-parameters. + +*/ + +GLOBAL void ker_fill_dcs_info (T_BCS_DCS *bcs_dcs) +{ + TRACE_FUNCTION ("ker_fill_dcs_info()"); + + memset (&t30_data->hdlc_rcv.dcs, 0xFF, + sizeof (t30_data->hdlc_rcv.dcs)); + + t30_data->hdlc_rcv.v_dcs = 1; + + ker_fill_dcs_cap0 (bcs_dcs); + ker_fill_dcs_cap1 (bcs_dcs); + ker_fill_dcs_cap2 (bcs_dcs); + ker_fill_dcs_cap3 (bcs_dcs); + ker_fill_dcs_cap4 (bcs_dcs); + ker_fill_dcs_cap5 (bcs_dcs); + ker_fill_dcs_cap6 (bcs_dcs); + ker_fill_dcs_cap7 (bcs_dcs); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dis_cap0 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the mandatory fax capabilities. + +*/ + +LOCAL void ker_fill_dis_cap0 (T_BCS_DIS *bcs_dis) +{ +#define X t30_data->hdlc_rcv.dis +#define Y bcs_dis->cap0_rcv + + TRACE_FUNCTION ("ker_fill_dis_cap0()"); + + X.v8 = Y.v8; + X.n_byte = Y.n_byte; + X.ready_tx_fax = Y.ready_tx_fax; + X.rec_fax_op = Y.rec_fax_op; + X.data_sig_rate = Y.data_sig_rate; + X.R8_lines_pels = Y.R8_lines_pels; + X.two_dim_coding = Y.two_dim_coding; + X.rec_width = Y.rec_width; + X.max_rec_len = Y.max_rec_len; + X.min_scan_time = Y.min_scan_time; + + /* + t30_data->trans_rate = Y.data_sig_rate; + */ +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dis_cap1 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 1. + +*/ + +LOCAL void ker_fill_dis_cap1 (T_BCS_DIS *bcs_dis) +{ +#define X t30_data->hdlc_rcv.dis +#define Y bcs_dis->cap1_rcv + + TRACE_FUNCTION ("ker_fill_dis_cap1()"); + + if (bcs_dis->v_cap1_rcv) + { + X.uncomp_mode = Y.uncomp_mode; + X.err_corr_mode = Y.err_corr_mode; + X.t6_coding = Y.t6_coding; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dis_cap2 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 2. + +*/ + +LOCAL void ker_fill_dis_cap2 (T_BCS_DIS *bcs_dis) +{ +#define X t30_data->hdlc_rcv.dis +#define Y bcs_dis->cap2_rcv + + TRACE_FUNCTION ("ker_fill_dis_cap2()"); + + if (bcs_dis->v_cap2_rcv) + { + /* for future use */ + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dis_cap3 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 3. + +*/ + +LOCAL void ker_fill_dis_cap3 (T_BCS_DIS *bcs_dis) +{ +#define X t30_data->hdlc_rcv.dis +#define Y bcs_dis->cap3_rcv + + TRACE_FUNCTION ("ker_fill_dis_cap3()"); + + if (bcs_dis->v_cap3_rcv) + { + X.R8_lines = Y.R8_lines; + X.r_300_pels = Y.r_300_pels; + X.R16_lines_pels = Y.R16_lines_pels; + X.i_res_pref = Y.i_res_pref; + X.m_res_pref = Y.m_res_pref; + X.min_scan_time_hr = Y.min_scan_time_hr; + X.sel_polling = Y.sel_polling; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dis_cap4 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 4. + +*/ + +LOCAL void ker_fill_dis_cap4 (T_BCS_DIS *bcs_dis) +{ +#define X t30_data->hdlc_rcv.dis +#define Y bcs_dis->cap4_rcv + + TRACE_FUNCTION ("ker_fill_dis_cap4()"); + + if (bcs_dis->v_cap4_rcv) + { + X.subaddr = Y.subaddr; + X.password = Y.password; + X.ready_tx_doc = Y.ready_tx_doc; + X.bft = Y.bft; + X.dtm = Y.dtm; + X.edi = Y.edi; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dis_cap5 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 5. + +*/ + +LOCAL void ker_fill_dis_cap5 (T_BCS_DIS *bcs_dis) +{ +#define X t30_data->hdlc_rcv.dis +#define Y bcs_dis->cap5_rcv + + TRACE_FUNCTION ("ker_fill_dis_cap5()"); + + if (bcs_dis->v_cap5_rcv) + { + X.btm = Y.btm; + X.ready_tx_mixed = Y.ready_tx_mixed; + X.char_mode = Y.char_mode; + X.mixed_mode = Y.mixed_mode; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dis_cap6 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 6. + +*/ + +LOCAL void ker_fill_dis_cap6 (T_BCS_DIS *bcs_dis) +{ +#define X t30_data->hdlc_rcv.dis +#define Y bcs_dis->cap6_rcv + + TRACE_FUNCTION ("ker_fill_dis_cap6()"); + + if (bcs_dis->v_cap6_rcv) + { + X.proc_mode_26 = Y.proc_mode_26; + X.dig_network_cap = Y.dig_network_cap; + X.duplex = Y.duplex; + X.jpeg = Y.jpeg; + X.full_colour = Y.full_colour; + X.r_12_bits_pel_comp = Y.r_12_bits_pel_comp; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dis_cap7 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 7. + +*/ + +LOCAL void ker_fill_dis_cap7 (T_BCS_DIS *bcs_dis) +{ +#define X t30_data->hdlc_rcv.dis +#define Y bcs_dis->cap7_rcv + + TRACE_FUNCTION ("ker_fill_dis_cap7()"); + + if (bcs_dis->v_cap7_rcv) + { + X.no_subsamp = Y.no_subsamp; + X.cust_illum = Y.cust_illum; + X.cust_gamut = Y.cust_gamut; + X.na_letter = Y.na_letter; + X.na_legal = Y.na_legal; + X.sing_prog_seq_coding_basic = Y.sing_prog_seq_coding_basic; + X.sing_prog_seq_coding_L0 = Y.sing_prog_seq_coding_L0; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dis_info | ++--------------------------------------------------------------------+ + + PURPOSE : This function fills the hdlc-frame-buffer with the + received DIS-parameters. + +*/ + +GLOBAL void ker_fill_dis_info (T_BCS_DIS *bcs_dis) +{ + TRACE_FUNCTION ("ker_fill_dis_info()"); + + memset (&t30_data->hdlc_rcv.dis, 0xFF, + sizeof (t30_data->hdlc_rcv.dis)); + + t30_data->hdlc_rcv.v_dis = 1; + + ker_fill_dis_cap0 (bcs_dis); + ker_fill_dis_cap1 (bcs_dis); + ker_fill_dis_cap2 (bcs_dis); + ker_fill_dis_cap3 (bcs_dis); + ker_fill_dis_cap4 (bcs_dis); + ker_fill_dis_cap5 (bcs_dis); + ker_fill_dis_cap6 (bcs_dis); + ker_fill_dis_cap7 (bcs_dis); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dtc_cap0 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the mandatory fax capabilities. + +*/ + +LOCAL void ker_fill_dtc_cap0 (T_BCS_DTC *bcs_dtc) +{ +#define X t30_data->hdlc_rcv.dtc +#define Y bcs_dtc->cap0_rcv + + TRACE_FUNCTION ("ker_fill_dtc_cap0()"); + + X.v8 = Y.v8; + X.n_byte = Y.n_byte; + X.ready_tx_fax = Y.ready_tx_fax; + X.rec_fax_op = Y.rec_fax_op; + X.data_sig_rate = Y.data_sig_rate; + X.R8_lines_pels = Y.R8_lines_pels; + X.two_dim_coding = Y.two_dim_coding; + X.rec_width = Y.rec_width; + X.max_rec_len = Y.max_rec_len; + X.min_scan_time = Y.min_scan_time; + + /* + t30_data->trans_rate = Y.data_sig_rate; + */ +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dtc_cap1 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 1. + +*/ + +LOCAL void ker_fill_dtc_cap1 (T_BCS_DTC *bcs_dtc) +{ +#define X t30_data->hdlc_rcv.dtc +#define Y bcs_dtc->cap1_rcv + + TRACE_FUNCTION ("ker_fill_dtc_cap1()"); + + if (bcs_dtc->v_cap1_rcv) + { + X.uncomp_mode = Y.uncomp_mode; + X.err_corr_mode = Y.err_corr_mode; + X.t6_coding = Y.t6_coding; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dtc_cap2 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 2. + +*/ + +LOCAL void ker_fill_dtc_cap2 (T_BCS_DTC *bcs_dtc) +{ +#define X t30_data->hdlc_rcv.dtc +#define Y bcs_dtc->cap2_rcv + + TRACE_FUNCTION ("ker_fill_dtc_cap2()"); + + if (bcs_dtc->v_cap2_rcv) + { + /* for future use */ + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dtc_cap3 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 3. + +*/ + +LOCAL void ker_fill_dtc_cap3 (T_BCS_DTC *bcs_dtc) +{ +#define X t30_data->hdlc_rcv.dtc +#define Y bcs_dtc->cap3_rcv + + TRACE_FUNCTION ("ker_fill_dtc_cap3()"); + + if (bcs_dtc->v_cap3_rcv) + { + X.R8_lines = Y.R8_lines; + X.r_300_pels = Y.r_300_pels; + X.R16_lines_pels = Y.R16_lines_pels; + X.i_res_pref = Y.i_res_pref; + X.m_res_pref = Y.m_res_pref; + X.min_scan_time_hr = Y.min_scan_time_hr; + X.sel_polling = Y.sel_polling; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dtc_cap4 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 4. + +*/ + +LOCAL void ker_fill_dtc_cap4 (T_BCS_DTC *bcs_dtc) +{ +#define X t30_data->hdlc_rcv.dtc +#define Y bcs_dtc->cap4_rcv + + TRACE_FUNCTION ("ker_fill_dtc_cap4()"); + + if (bcs_dtc->v_cap4_rcv) + { + X.subaddr = Y.subaddr; + X.password = Y.password; + X.ready_tx_doc = Y.ready_tx_doc; + X.bft = Y.bft; + X.dtm = Y.dtm; + X.edi = Y.edi; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dtc_cap5 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 5. + +*/ + +LOCAL void ker_fill_dtc_cap5 (T_BCS_DTC *bcs_dtc) +{ +#define X t30_data->hdlc_rcv.dtc +#define Y bcs_dtc->cap5_rcv + + TRACE_FUNCTION ("ker_fill_dtc_cap5()"); + + if (bcs_dtc->v_cap5_rcv) + { + X.btm = Y.btm; + X.ready_tx_mixed = Y.ready_tx_mixed; + X.char_mode = Y.char_mode; + X.mixed_mode = Y.mixed_mode; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dtc_cap6 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 6. + +*/ + +LOCAL void ker_fill_dtc_cap6 (T_BCS_DTC *bcs_dtc) +{ +#define X t30_data->hdlc_rcv.dtc +#define Y bcs_dtc->cap6_rcv + + TRACE_FUNCTION ("ker_fill_dtc_cap6()"); + + if (bcs_dtc->v_cap6_rcv) + { + X.proc_mode_26 = Y.proc_mode_26; + X.dig_network_cap = Y.dig_network_cap; + X.duplex = Y.duplex; + X.jpeg = Y.jpeg; + X.full_colour = Y.full_colour; + X.r_12_bits_pel_comp = Y.r_12_bits_pel_comp; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dtc_cap7 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 7. + +*/ + +LOCAL void ker_fill_dtc_cap7 (T_BCS_DTC *bcs_dtc) +{ +#define X t30_data->hdlc_rcv.dtc +#define Y bcs_dtc->cap7_rcv + + TRACE_FUNCTION ("ker_fill_dtc_cap7()"); + + if (bcs_dtc->v_cap7_rcv) + { + X.no_subsamp = Y.no_subsamp; + X.cust_illum = Y.cust_illum; + X.cust_gamut = Y.cust_gamut; + X.na_letter = Y.na_letter; + X.na_legal = Y.na_legal; + X.sing_prog_seq_coding_basic = Y.sing_prog_seq_coding_basic; + X.sing_prog_seq_coding_L0 = Y.sing_prog_seq_coding_L0; + } + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_fill_dtc_info | ++--------------------------------------------------------------------+ + + PURPOSE : This function fills the hdlc-frame-buffer with the + received DTC-parameters. + +*/ + +GLOBAL void ker_fill_dtc_info (T_BCS_DTC *bcs_dtc) +{ + TRACE_FUNCTION ("ker_fill_dtc_info()"); + + memset (&t30_data->hdlc_rcv.dtc, 0xFF, + sizeof (t30_data->hdlc_rcv.dtc)); + + t30_data->hdlc_rcv.v_dtc = 1; + + ker_fill_dtc_cap0 (bcs_dtc); + ker_fill_dtc_cap1 (bcs_dtc); + ker_fill_dtc_cap2 (bcs_dtc); + ker_fill_dtc_cap3 (bcs_dtc); + ker_fill_dtc_cap4 (bcs_dtc); + ker_fill_dtc_cap5 (bcs_dtc); + ker_fill_dtc_cap6 (bcs_dtc); + ker_fill_dtc_cap7 (bcs_dtc); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dcs_cap0 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the mandatory fax capabilities. + +*/ + +LOCAL void ker_prep_dcs_cap0 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DCS *bcs_dcs) +{ +#define X bcs_dcs->cap0_snd +#define Y t30_cap_req->hdlc_info.dcs + + TRACE_FUNCTION ("ker_prep_dcs_cap0()"); + + X.rec_fax_op = Y.rec_fax_op; + X.data_sig_rate = Y.data_sig_rate; + X.R8_lines_pels = Y.R8_lines_pels; + X.two_dim_coding = Y.two_dim_coding; + X.rec_width = Y.rec_width; + X.max_rec_len = Y.max_rec_len; + X.min_scan_time = Y.min_scan_time; + + /* + t30_data->trans_rate = Y.data_sig_rate; + */ +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dcs_cap1 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 1. + +*/ + +LOCAL void ker_prep_dcs_cap1 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DCS *bcs_dcs) +{ +#define X bcs_dcs->cap1_snd +#define Y t30_cap_req->hdlc_info.dcs + + TRACE_FUNCTION ("ker_prep_dcs_cap1()"); + + if (Y.uncomp_mode != 0xFF) + { + bcs_dcs->v_cap1_snd = TRUE; + + X.uncomp_mode = Y.uncomp_mode; + X.err_corr_mode = Y.err_corr_mode; + X.frame_size = Y.frame_size; + X.t6_coding = Y.t6_coding; + } + else + bcs_dcs->v_cap1_snd = FALSE; + +#undef X +#undef Y +} + +#ifdef EXTENDED_FAX_CAP2 +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dcs_cap2 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 2. + +*/ + +LOCAL void ker_prep_dcs_cap2 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DCS *bcs_dcs) +{ +#define X bcs_dcs->cap2_snd +#define Y t30_cap_req->hdlc_info.dcs + + TRACE_FUNCTION ("ker_prep_dcs_cap2()"); + + if (1) /* for future use */ + { + bcs_dcs->v_cap2_snd = TRUE; + } + else + bcs_dcs->v_cap2_snd = FALSE; + +#undef X +#undef Y +} +#endif + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dcs_cap3 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 3. + +*/ + +LOCAL void ker_prep_dcs_cap3 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DCS *bcs_dcs) +{ +#define X bcs_dcs->cap3_snd +#define Y t30_cap_req->hdlc_info.dcs + + TRACE_FUNCTION ("ker_prep_dcs_cap3()"); + + if (Y.R8_lines != 0xFF) + { + bcs_dcs->v_cap3_snd = TRUE; + + X.R8_lines = Y.R8_lines; + X.r_300_pels = Y.r_300_pels; + X.R16_lines_pels = Y.R16_lines_pels; + X.resolution_type = Y.resolution_type; + } + else + bcs_dcs->v_cap3_snd = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dcs_cap4 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 4. + +*/ + +LOCAL void ker_prep_dcs_cap4 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DCS *bcs_dcs) +{ +#define X bcs_dcs->cap4_snd +#define Y t30_cap_req->hdlc_info.dcs + + TRACE_FUNCTION ("ker_prep_dcs_cap4()"); + + if (Y.subaddr != 0xFF) + { + bcs_dcs->v_cap4_snd = TRUE; + + X.subaddr = Y.subaddr; + X.password = Y.password; + X.bft = Y.bft; + X.dtm = Y.dtm; + X.edi = Y.edi; + } + else + bcs_dcs->v_cap4_snd = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dcs_cap5 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 5. + +*/ + +LOCAL void ker_prep_dcs_cap5 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DCS *bcs_dcs) +{ +#define X bcs_dcs->cap5_snd +#define Y t30_cap_req->hdlc_info.dcs + + TRACE_FUNCTION ("ker_prep_dcs_cap5()"); + + if (Y.btm != 0xFF) + { + bcs_dcs->v_cap5_snd = TRUE; + + X.btm = Y.btm; + X.char_mode = Y.char_mode; + X.mixed_mode = Y.mixed_mode; + } + else + bcs_dcs->v_cap5_snd = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dcs_cap6 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 6. + +*/ + +LOCAL void ker_prep_dcs_cap6 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DCS *bcs_dcs) +{ +#define X bcs_dcs->cap6_snd +#define Y t30_cap_req->hdlc_info.dcs + + TRACE_FUNCTION ("ker_prep_dcs_cap6()"); + + if (Y.proc_mode_26 != 0xFF) + { + bcs_dcs->v_cap6_snd = TRUE; + + X.proc_mode_26 = Y.proc_mode_26; + X.dig_network_cap = Y.dig_network_cap; + X.duplex = Y.duplex; + X.jpeg = Y.jpeg; + X.full_colour = Y.full_colour; + X.huffman_tables = Y.huffman_tables; + X.r_12_bits_pel_comp = Y.r_12_bits_pel_comp; + } + else + bcs_dcs->v_cap6_snd = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dcs_cap7 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 7. + +*/ + +LOCAL void ker_prep_dcs_cap7 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DCS *bcs_dcs) +{ +#define X bcs_dcs->cap7_snd +#define Y t30_cap_req->hdlc_info.dcs + + TRACE_FUNCTION ("ker_prep_dcs_cap7()"); + + if (Y.no_subsamp != 0xFF) + { + bcs_dcs->v_cap7_snd = TRUE; + + X.no_subsamp = Y.no_subsamp; + X.cust_illum = Y.cust_illum; + X.cust_gamut = Y.cust_gamut; + X.na_letter = Y.na_letter; + X.na_legal = Y.na_legal; + X.sing_prog_seq_coding_basic = Y.sing_prog_seq_coding_basic; + X.sing_prog_seq_coding_L0 = Y.sing_prog_seq_coding_L0; + } + else + bcs_dcs->v_cap7_snd = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dcs | ++--------------------------------------------------------------------+ + + PURPOSE : This function fills the hdlc-frame-buffer with the + DCS-parameters to send. + +*/ + +LOCAL void ker_prep_dcs (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DCS *bcs_dcs) +{ + TRACE_FUNCTION ("ker_prep_dcs()"); + + ker_prep_dcs_cap0 (t30_cap_req, bcs_dcs); + ker_prep_dcs_cap1 (t30_cap_req, bcs_dcs); + +#ifdef EXTENDED_FAX_CAP2 + ker_prep_dcs_cap2 (t30_cap_req, bcs_dcs); +#endif + + ker_prep_dcs_cap3 (t30_cap_req, bcs_dcs); + ker_prep_dcs_cap4 (t30_cap_req, bcs_dcs); + ker_prep_dcs_cap5 (t30_cap_req, bcs_dcs); + ker_prep_dcs_cap6 (t30_cap_req, bcs_dcs); + ker_prep_dcs_cap7 (t30_cap_req, bcs_dcs); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dis_cap0 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the mandatory fax capabilities. + +*/ + +LOCAL void ker_prep_dis_cap0 (T_BCS_DIS *bcs_dis) +{ +#define X bcs_dis->cap0_rcv +#define Y t30_data->hdlc_snd.dis + + TRACE_FUNCTION ("ker_prep_dis_cap0()"); + + X.v8 = Y.v8; + X.n_byte = Y.n_byte; + X.ready_tx_fax = Y.ready_tx_fax; + X.rec_fax_op = Y.rec_fax_op; + X.data_sig_rate = Y.data_sig_rate; + X.R8_lines_pels = Y.R8_lines_pels; + X.two_dim_coding = Y.two_dim_coding; + X.rec_width = Y.rec_width; + X.max_rec_len = Y.max_rec_len; + X.min_scan_time = Y.min_scan_time; + + /* + t30_data->trans_rate = Y.data_sig_rate; + */ +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dis_cap1 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 1. + +*/ + +LOCAL void ker_prep_dis_cap1 (T_BCS_DIS *bcs_dis) +{ +#define X bcs_dis->cap1_rcv +#define Y t30_data->hdlc_snd.dis + + TRACE_FUNCTION ("ker_prep_dis_cap1()"); + + if (Y.uncomp_mode != 0xFF) + { + bcs_dis->v_cap1_rcv = TRUE; + + X.uncomp_mode = Y.uncomp_mode; + X.err_corr_mode = Y.err_corr_mode; + X.t6_coding = Y.t6_coding; + } + else + bcs_dis->v_cap1_rcv = FALSE; + +#undef X +#undef Y +} + +#ifdef EXTENDED_FAX_CAP2 +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dis_cap2 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 2. + +*/ + +LOCAL void ker_prep_dis_cap2 (T_BCS_DIS *bcs_dis) +{ +#define X bcs_dis->cap2_rcv +#define Y t30_data->hdlc_snd.dis + + TRACE_FUNCTION ("ker_prep_dis_cap2()"); + + if (1) /* for future use */ + { + bcs_dis->v_cap2_rcv = TRUE; + } + else + bcs_dis->v_cap2_rcv = FALSE; + +#undef X +#undef Y +} +#endif + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dis_cap3 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 3. + +*/ + +LOCAL void ker_prep_dis_cap3 (T_BCS_DIS *bcs_dis) +{ +#define X bcs_dis->cap3_rcv +#define Y t30_data->hdlc_snd.dis + + TRACE_FUNCTION ("ker_prep_dis_cap3()"); + + if (Y.R8_lines != 0xFF) + { + bcs_dis->v_cap3_rcv = TRUE; + + X.R8_lines = Y.R8_lines; + X.r_300_pels = Y.r_300_pels; + X.R16_lines_pels = Y.R16_lines_pels; + X.i_res_pref = Y.i_res_pref; + X.m_res_pref = Y.m_res_pref; + X.min_scan_time_hr = Y.min_scan_time_hr; + X.sel_polling = Y.sel_polling; + } + else + bcs_dis->v_cap3_rcv = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dis_cap4 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 4. + +*/ + +LOCAL void ker_prep_dis_cap4 (T_BCS_DIS *bcs_dis) +{ +#define X bcs_dis->cap4_rcv +#define Y t30_data->hdlc_snd.dis + + TRACE_FUNCTION ("ker_prep_dis_cap4()"); + + if (Y.subaddr != 0xFF) + { + bcs_dis->v_cap4_rcv = TRUE; + + X.subaddr = Y.subaddr; + X.password = Y.password; + X.ready_tx_doc = Y.ready_tx_doc; + X.bft = Y.bft; + X.dtm = Y.dtm; + X.edi = Y.edi; + } + else + bcs_dis->v_cap4_rcv = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dis_cap5 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 5. + +*/ + +LOCAL void ker_prep_dis_cap5 (T_BCS_DIS *bcs_dis) +{ +#define X bcs_dis->cap5_rcv +#define Y t30_data->hdlc_snd.dis + + TRACE_FUNCTION ("ker_prep_dis_cap5()"); + + if (Y.btm != 0xFF) + { + bcs_dis->v_cap5_rcv = TRUE; + + X.btm = Y.btm; + X.ready_tx_mixed = Y.ready_tx_mixed; + X.char_mode = Y.char_mode; + X.mixed_mode = Y.mixed_mode; + } + else + bcs_dis->v_cap5_rcv = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dis_cap6 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 6. + +*/ + +LOCAL void ker_prep_dis_cap6 (T_BCS_DIS *bcs_dis) +{ +#define X bcs_dis->cap6_rcv +#define Y t30_data->hdlc_snd.dis + + TRACE_FUNCTION ("ker_prep_dis_cap6()"); + + if (Y.proc_mode_26 != 0xFF) + { + bcs_dis->v_cap6_rcv = TRUE; + + X.proc_mode_26 = Y.proc_mode_26; + X.dig_network_cap = Y.dig_network_cap; + X.duplex = Y.duplex; + X.jpeg = Y.jpeg; + X.full_colour = Y.full_colour; + X.r_12_bits_pel_comp = Y.r_12_bits_pel_comp; + } + else + bcs_dis->v_cap6_rcv = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dis_cap7 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 7. + +*/ + +LOCAL void ker_prep_dis_cap7 (T_BCS_DIS *bcs_dis) +{ +#define X bcs_dis->cap7_rcv +#define Y t30_data->hdlc_snd.dis + + TRACE_FUNCTION ("ker_prep_dis_cap7()"); + + if (Y.no_subsamp != 0xFF) + { + bcs_dis->v_cap7_rcv = TRUE; + + X.no_subsamp = Y.no_subsamp; + X.cust_illum = Y.cust_illum; + X.cust_gamut = Y.cust_gamut; + X.na_letter = Y.na_letter; + X.na_legal = Y.na_legal; + X.sing_prog_seq_coding_basic = Y.sing_prog_seq_coding_basic; + X.sing_prog_seq_coding_L0 = Y.sing_prog_seq_coding_L0; + } + else + bcs_dis->v_cap7_rcv = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dis | ++--------------------------------------------------------------------+ + + PURPOSE : This function fills the hdlc-frame-buffer with the + DIS-parameters to send. + +*/ + +LOCAL void ker_prep_dis (T_BCS_DIS *bcs_dis) +{ + TRACE_FUNCTION ("ker_prep_dis()"); + + ker_prep_dis_cap0 (bcs_dis); + ker_prep_dis_cap1 (bcs_dis); + +#ifdef EXTENDED_FAX_CAP2 + ker_prep_dis_cap2 (bcs_dis); +#endif + + ker_prep_dis_cap3 (bcs_dis); + ker_prep_dis_cap4 (bcs_dis); + ker_prep_dis_cap5 (bcs_dis); + ker_prep_dis_cap6 (bcs_dis); + ker_prep_dis_cap7 (bcs_dis); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dtc_cap0 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the mandatory fax capabilities. + +*/ + +LOCAL void ker_prep_dtc_cap0 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DTC *bcs_dtc) +{ +#define X bcs_dtc->cap0_rcv +#define Y t30_cap_req->hdlc_info.dtc + + TRACE_FUNCTION ("ker_prep_dtc_cap0()"); + + X.v8 = Y.v8; + X.n_byte = Y.n_byte; + X.ready_tx_fax = Y.ready_tx_fax; + X.rec_fax_op = Y.rec_fax_op; + X.data_sig_rate = Y.data_sig_rate; + X.R8_lines_pels = Y.R8_lines_pels; + X.two_dim_coding = Y.two_dim_coding; + X.rec_width = Y.rec_width; + X.max_rec_len = Y.max_rec_len; + X.min_scan_time = Y.min_scan_time; + + /* + t30_data->trans_rate = Y.data_sig_rate; + */ +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dtc_cap1 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 1. + +*/ + +LOCAL void ker_prep_dtc_cap1 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DTC *bcs_dtc) +{ +#define X bcs_dtc->cap1_rcv +#define Y t30_cap_req->hdlc_info.dtc + + TRACE_FUNCTION ("ker_prep_dtc_cap1()"); + + if (Y.uncomp_mode != 0xFF) + { + bcs_dtc->v_cap1_rcv = TRUE; + + X.uncomp_mode = Y.uncomp_mode; + X.err_corr_mode = Y.err_corr_mode; + X.t6_coding = Y.t6_coding; + } + else + bcs_dtc->v_cap1_rcv = FALSE; + +#undef X +#undef Y +} + +#ifdef EXTENDED_FAX_CAP2 +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dtc_cap2 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 2. + +*/ + +LOCAL void ker_prep_dtc_cap2 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DTC *bcs_dtc) +{ +#define X bcs_dtc->cap2_rcv +#define Y t30_cap_req->hdlc_info.dtc + + TRACE_FUNCTION ("ker_prep_dtc_cap2()"); + + if (1) /* for future use */ + { + bcs_dtc->v_cap2_rcv = TRUE; + } + else + bcs_dtc->v_cap2_rcv = FALSE; + +#undef X +#undef Y +} +#endif + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dtc_cap3 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 3. + +*/ + +LOCAL void ker_prep_dtc_cap3 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DTC *bcs_dtc) +{ +#define X bcs_dtc->cap3_rcv +#define Y t30_cap_req->hdlc_info.dtc + + TRACE_FUNCTION ("ker_prep_dtc_cap3()"); + + if (Y.R8_lines != 0xFF) + { + bcs_dtc->v_cap3_rcv = TRUE; + + X.R8_lines = Y.R8_lines; + X.r_300_pels = Y.r_300_pels; + X.R16_lines_pels = Y.R16_lines_pels; + X.i_res_pref = Y.i_res_pref; + X.m_res_pref = Y.m_res_pref; + X.min_scan_time_hr = Y.min_scan_time_hr; + X.sel_polling = Y.sel_polling; + } + else + bcs_dtc->v_cap3_rcv = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dtc_cap4 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 4. + +*/ + +LOCAL void ker_prep_dtc_cap4 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DTC *bcs_dtc) +{ +#define X bcs_dtc->cap4_rcv +#define Y t30_cap_req->hdlc_info.dtc + + TRACE_FUNCTION ("ker_prep_dtc_cap4()"); + + if (Y.subaddr != 0xFF) + { + bcs_dtc->v_cap4_rcv = TRUE; + + X.subaddr = Y.subaddr; + X.password = Y.password; + X.ready_tx_doc = Y.ready_tx_doc; + X.bft = Y.bft; + X.dtm = Y.dtm; + X.edi = Y.edi; + } + else + bcs_dtc->v_cap4_rcv = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dtc_cap5 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 5. + +*/ + +LOCAL void ker_prep_dtc_cap5 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DTC *bcs_dtc) +{ +#define X bcs_dtc->cap5_rcv +#define Y t30_cap_req->hdlc_info.dtc + + TRACE_FUNCTION ("ker_prep_dtc_cap5()"); + + if (Y.btm != 0xFF) + { + bcs_dtc->v_cap5_rcv = TRUE; + + X.btm = Y.btm; + X.ready_tx_mixed = Y.ready_tx_mixed; + X.char_mode = Y.char_mode; + X.mixed_mode = Y.mixed_mode; + } + else + bcs_dtc->v_cap5_rcv = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dtc_cap6 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 6. + +*/ + +LOCAL void ker_prep_dtc_cap6 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DTC *bcs_dtc) +{ +#define X bcs_dtc->cap6_rcv +#define Y t30_cap_req->hdlc_info.dtc + + TRACE_FUNCTION ("ker_prep_dtc_cap6()"); + + if (Y.proc_mode_26 != 0xFF) + { + bcs_dtc->v_cap6_rcv = TRUE; + + X.proc_mode_26 = Y.proc_mode_26; + X.dig_network_cap = Y.dig_network_cap; + X.duplex = Y.duplex; + X.jpeg = Y.jpeg; + X.full_colour = Y.full_colour; + X.r_12_bits_pel_comp = Y.r_12_bits_pel_comp; + } + else + bcs_dtc->v_cap6_rcv = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dtc_cap7 | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the extended fax capabilities 7. + +*/ + +LOCAL void ker_prep_dtc_cap7 (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DTC *bcs_dtc) +{ +#define X bcs_dtc->cap7_rcv +#define Y t30_cap_req->hdlc_info.dtc + + TRACE_FUNCTION ("ker_prep_dtc_cap7()"); + + if (Y.no_subsamp != 0xFF) + { + bcs_dtc->v_cap7_rcv = TRUE; + + X.no_subsamp = Y.no_subsamp; + X.cust_illum = Y.cust_illum; + X.cust_gamut = Y.cust_gamut; + X.na_letter = Y.na_letter; + X.na_legal = Y.na_legal; + X.sing_prog_seq_coding_basic = Y.sing_prog_seq_coding_basic; + X.sing_prog_seq_coding_L0 = Y.sing_prog_seq_coding_L0; + } + else + bcs_dtc->v_cap7_rcv = FALSE; + +#undef X +#undef Y +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_prep_dtc | ++--------------------------------------------------------------------+ + + PURPOSE : This function fills the hdlc-frame-buffer with the + DTC-parameters to send. + +*/ + +LOCAL void ker_prep_dtc (T_T30_CAP_REQ *t30_cap_req, + T_BCS_DTC *bcs_dtc) +{ + TRACE_FUNCTION ("ker_prep_dtc()"); + + ker_prep_dtc_cap0 (t30_cap_req, bcs_dtc); + ker_prep_dtc_cap1 (t30_cap_req, bcs_dtc); + +#ifdef EXTENDED_FAX_CAP2 + ker_prep_dtc_cap2 (t30_cap_req, bcs_dtc); +#endif + + ker_prep_dtc_cap3 (t30_cap_req, bcs_dtc); + ker_prep_dtc_cap4 (t30_cap_req, bcs_dtc); + ker_prep_dtc_cap5 (t30_cap_req, bcs_dtc); + ker_prep_dtc_cap6 (t30_cap_req, bcs_dtc); + ker_prep_dtc_cap7 (t30_cap_req, bcs_dtc); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_req_csi | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the optional command CSI. + +*/ + +LOCAL void ker_req_csi (void) +{ + MCAST (csi, BCS_CSI); + + TRACE_FUNCTION ("ker_req_csi()"); + + if (t30_data->hdlc_snd.c_csi) + { + csi->fcf = BCS_CSI; + + csi->c_cld_sub_nr = t30_data->hdlc_snd.c_csi; + + memcpy (csi->cld_sub_nr, t30_data->hdlc_snd.csi, + sizeof (t30_data->hdlc_snd.csi)); + + sig_ker_bcs_bdat_req (FINAL_NO); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_req_nsf | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the optional command NSF. + +*/ + +LOCAL void ker_req_nsf (void) +{ + MCAST (nsf, BCS_NSF); + + TRACE_FUNCTION ("ker_req_nsf()"); + + if (t30_data->hdlc_snd.c_nsf) + { + nsf->fcf = BCS_NSF; + + nsf->non_std_fac.l_non_std_fac = t30_data->hdlc_snd.c_nsf << 3; + nsf->non_std_fac.o_non_std_fac = 0; + + memcpy (nsf->non_std_fac.b_non_std_fac, t30_data->hdlc_snd.nsf, + sizeof (t30_data->hdlc_snd.nsf)); + + sig_ker_bcs_bdat_req (FINAL_NO); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_res_cig | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the optional command CIG. + +*/ + +LOCAL void ker_res_cig (T_T30_CAP_REQ *t30_cap_req) +{ + MCAST (cig, BCS_CIG); + + TRACE_FUNCTION ("ker_res_cig()"); + + if (t30_cap_req->hdlc_info.c_cig) + { + cig->fcf = BCS_CIG; + + cig->c_clg_sub_nr = t30_cap_req->hdlc_info.c_cig; + + memcpy (cig->clg_sub_nr, t30_cap_req->hdlc_info.cig, + sizeof (t30_cap_req->hdlc_info.cig)); + + sig_ker_bcs_bdat_req (FINAL_NO); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_res_crp | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the optional command CRP. + +*/ + +LOCAL void ker_res_crp (T_T30_CAP_REQ *t30_cap_req) +{ + MCAST (crp, BCS_CRP); + + TRACE_FUNCTION ("ker_res_crp()"); + + if (t30_cap_req->hdlc_info.crp) + { + crp->fcf = BCS_CRP; + + sig_ker_bcs_bdat_req (FINAL_NO); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_res_nsc | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the optional command NSC. + +*/ + +LOCAL void ker_res_nsc (T_T30_CAP_REQ *t30_cap_req) +{ + MCAST (nsc, BCS_NSC); + + TRACE_FUNCTION ("ker_res_nsc()"); + + if (t30_cap_req->hdlc_info.c_nsc) + { + nsc->fcf = BCS_NSC; + + nsc->non_std_fac.l_non_std_fac = t30_cap_req->hdlc_info.c_nsc << 3; + nsc->non_std_fac.o_non_std_fac = 0; + + memcpy (nsc->non_std_fac.b_non_std_fac, t30_cap_req->hdlc_info.nsc, + sizeof (t30_cap_req->hdlc_info.nsc)); + + sig_ker_bcs_bdat_req (FINAL_NO); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_res_nss | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the optional command NSS. + +*/ + +LOCAL void ker_res_nss (T_T30_CAP_REQ *t30_cap_req) +{ + MCAST (nss, BCS_NSS); + + TRACE_FUNCTION ("ker_res_nss()"); + + if (t30_cap_req->hdlc_info.c_nss) + { + nss->fcf = BCS_NSS; + + nss->non_std_fac.l_non_std_fac = t30_cap_req->hdlc_info.c_nss << 3; + nss->non_std_fac.o_non_std_fac = 0; + + memcpy (nss->non_std_fac.b_non_std_fac, t30_cap_req->hdlc_info.nss, + sizeof (t30_cap_req->hdlc_info.nss)); + + sig_ker_bcs_bdat_req (FINAL_NO); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_res_pwd_poll | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the optional command PWD_POLL. + +*/ + +LOCAL void ker_res_pwd_poll (T_T30_CAP_REQ *t30_cap_req) +{ + MCAST (pwd, BCS_PWD_POLL); + + TRACE_FUNCTION ("ker_res_pwd_poll()"); + + if (t30_cap_req->hdlc_info.c_pwd) + { + pwd->fcf = BCS_PWD_POLL; + + pwd->c_pm_pword = t30_cap_req->hdlc_info.c_pwd; + + memcpy (pwd->pm_pword, t30_cap_req->hdlc_info.pwd, + sizeof (t30_cap_req->hdlc_info.pwd)); + + sig_ker_bcs_bdat_req (FINAL_NO); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_res_pwd_snd | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the optional command PWD_SND. + +*/ + +LOCAL void ker_res_pwd_snd (T_T30_CAP_REQ *t30_cap_req) +{ + MCAST (pwd, BCS_PWD_SND); + + TRACE_FUNCTION ("ker_res_pwd_snd()"); + + if (t30_cap_req->hdlc_info.c_pwd) + { + pwd->fcf = BCS_PWD_SND; + + pwd->c_sm_pword = t30_cap_req->hdlc_info.c_pwd; + + memcpy (pwd->sm_pword, t30_cap_req->hdlc_info.pwd, + sizeof (t30_cap_req->hdlc_info.pwd)); + + sig_ker_bcs_bdat_req (FINAL_NO); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_res_sep | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the optional command SEP. + +*/ + +LOCAL void ker_res_sep (T_T30_CAP_REQ *t30_cap_req) +{ + MCAST (sep, BCS_SEP); + + TRACE_FUNCTION ("ker_res_sep()"); + + if (t30_cap_req->hdlc_info.c_sep) + { + sep->fcf = BCS_SEP; + + sep->c_pm_sub_addr = t30_cap_req->hdlc_info.c_sep; + + memcpy (sep->pm_sub_addr, t30_cap_req->hdlc_info.sep, + sizeof (t30_cap_req->hdlc_info.sep)); + + sig_ker_bcs_bdat_req (FINAL_NO); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_res_sub | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the optional command SUB. + +*/ + +LOCAL void ker_res_sub (T_T30_CAP_REQ *t30_cap_req) +{ + MCAST (sub, BCS_SUB); + + TRACE_FUNCTION ("ker_res_sub()"); + + if (t30_cap_req->hdlc_info.c_sub) + { + sub->fcf = BCS_SUB; + + sub->c_sub_addr = t30_cap_req->hdlc_info.c_sub; + + memcpy (sub->sub_addr, t30_cap_req->hdlc_info.sub, + sizeof (t30_cap_req->hdlc_info.sub)); + + sig_ker_bcs_bdat_req (FINAL_NO); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_res_tsi | ++--------------------------------------------------------------------+ + + PURPOSE : This function prepares the optional command TSI. + +*/ + +LOCAL void ker_res_tsi (T_T30_CAP_REQ *t30_cap_req) +{ + MCAST (tsi, BCS_TSI); + + TRACE_FUNCTION ("ker_res_tsi()"); + + if (t30_cap_req->hdlc_info.c_tsi) + { + tsi->fcf = BCS_TSI; + + tsi->c_tra_sub_nr = t30_cap_req->hdlc_info.c_tsi; + + memcpy (tsi->tra_sub_nr, t30_cap_req->hdlc_info.tsi, + sizeof (t30_cap_req->hdlc_info.tsi)); + + sig_ker_bcs_bdat_req (FINAL_NO); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_send_dcs | ++--------------------------------------------------------------------+ + + PURPOSE : This function sends command DCS to FAD. + +*/ + +GLOBAL void ker_send_dcs (T_T30_CAP_REQ *t30_cap_req) +{ + TRACE_FUNCTION ("ker_send_dcs()"); + + ker_res_nss (t30_cap_req); + ker_res_pwd_snd (t30_cap_req); + ker_res_sub (t30_cap_req); + ker_res_crp (t30_cap_req); + ker_res_tsi (t30_cap_req); + + { + MCAST (bcs_dcs, BCS_DCS); + bcs_dcs->fcf = BCS_DCS; + ker_prep_dcs (t30_cap_req, bcs_dcs); + sig_ker_bcs_bdat_req (FINAL_YES); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_send_dis | ++--------------------------------------------------------------------+ + + PURPOSE : This function sends command DIS to FAD. + +*/ + +GLOBAL void ker_send_dis (void) +{ + MCAST (dis, BCS_DIS); + + TRACE_FUNCTION ("ker_send_dis()"); + + ker_req_nsf (); + ker_req_csi (); + + dis->fcf = BCS_DIS; + + ker_prep_dis (dis); + + sig_ker_bcs_bdat_req (FINAL_YES); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_send_dtc | ++--------------------------------------------------------------------+ + + PURPOSE : This function sends command DTC to FAD. + +*/ + +GLOBAL void ker_send_dtc (T_T30_CAP_REQ *t30_cap_req) +{ + MCAST (dtc, BCS_DTC); + + TRACE_FUNCTION ("ker_send_dtc()"); + + ker_res_nsc (t30_cap_req); + ker_res_pwd_poll (t30_cap_req); + ker_res_sep (t30_cap_req); + ker_res_cig (t30_cap_req); + + dtc->fcf = BCS_DTC; + + ker_prep_dtc(t30_cap_req, dtc); + + sig_ker_bcs_bdat_req (FINAL_YES); +} + +GLOBAL void snd_t30_sgn_ind(UBYTE sgn) +{ + PALLOC (t30_sgn_ind, T30_SGN_IND); + t30_sgn_ind->sgn = sgn; + PSENDX (MMI, t30_sgn_ind); +} + +GLOBAL void snd_complete_ind(UBYTE cmpl) +{ + PALLOC (t30_cmpl_ind, T30_CMPL_IND); + t30_cmpl_ind->cmpl = cmpl; + PSENDX (MMI, t30_cmpl_ind); + SET_STATE (KER, T30_IDLE); +} + +GLOBAL void snd_error_ind(USHORT cause) +{ + PALLOC (t30_error_ind, T30_ERROR_IND); + t30_error_ind->cause = cause; + PSENDX (MMI, t30_error_ind); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_send_err | ++--------------------------------------------------------------------+ + + PURPOSE : This function sends an error cause to MMI. + +*/ + +GLOBAL void ker_send_err (USHORT cause) +{ + TRACE_FUNCTION ("ker_send_err()"); + + TIMERSTOP (T1_INDEX); + TIMERSTOP (T2_INDEX); + TIMERSTOP (T4_INDEX); + + memset (&t30_data->hdlc_rcv, 0, sizeof (T_hdlc_info)); + + SET_STATE (KER, T30_IDLE); + + snd_error_ind(cause); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : TDCexpand | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ + +LOCAL void TDCexpand(T_sdu *sdu, T_desc_list2 *desc_list, BOOL final) +{ + T_desc2 *desc; + USHORT dataSize, di = 0, si, len; + UBYTE *p; + ULONG *pLast = &desc_list->first; + + if (t30_data->dti_data_ind) + { + while (*pLast) + { + desc = (T_desc2*)pLast; + pLast = (ULONG*)desc->next; + } + } + len = sdu->l_buf >> 3; + dataSize = len; + + if (t30_data->TDC_doli_pending EQ TRUE) + dataSize++; + + p = &sdu->buf[sdu->o_buf >> 3]; + for (si = 0; si < len-1; si++) + if (p[si] EQ TDC_DLE) + dataSize++; + + if (final) + dataSize += 2; + + dataSize = (dataSize/t30_data->frames_per_prim + 1) * t30_data->frames_per_prim; + MALLOC(desc, (USHORT)(sizeof(T_desc2) + dataSize)); + desc->next = 0; + *pLast = (ULONG)desc; + p = &sdu->buf[sdu->o_buf >> 3]; + if (t30_data->TDC_doli_pending EQ TRUE) + { + desc->buffer[di++] = TDC_DLE; + if (p[0] EQ TDC_DLE) + desc->buffer[di++] = TDC_SUB;/*lint !e661 (Warning -- Possible access of out-of-bounds pointer)*/ + else + { + desc->buffer[di++] = TDC_DLE;/*lint !e661 (Warning -- Possible access of out-of-bounds pointer)*/ + desc->buffer[di++] = p[0];/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ + } + t30_data->TDC_doli_pending = FALSE; + si = 1; + } + else + si = 0; + + while (si < len-1) + { + desc->buffer[di++] = p[si]; + if (p[si] EQ TDC_DLE) + { + if (p[si+1] EQ TDC_DLE) + { + desc->buffer[di++] = TDC_SUB;/*lint !e661 (Warning -- Possible access of out-of-bounds pointer)*/ + si++; + } + else + desc->buffer[di++] = TDC_DLE;/*lint !e661 (Warning -- Possible access of out-of-bounds pointer)*/ + } + si++; + } + + if (si EQ len-1 AND p[si] EQ TDC_DLE) + t30_data->TDC_doli_pending = TRUE; + else + desc->buffer[di++] = p[si];/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ + if (final) + { + desc->buffer[di++] = TDC_DLE;/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ + desc->buffer[di++] = TDC_ETX;/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ + } + desc_list->list_len += desc->len = di; + desc->size = desc->len; + desc->offset = 0; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : TDCcompress | ++--------------------------------------------------------------------+ + + PURPOSE : Move contents of T_desc_list2 into T_sdu w/o TDCs +*/ + +GLOBAL UBYTE TDCcompress(T_desc2 *desc, T_sdu *sdu) +{ + T_desc2 *desc_next; + UBYTE *d, *s, *s_end, ready = 0; + + s_end = sdu->buf + t30_data->frames_per_prim; + s = sdu->buf + (sdu->l_buf >> 3); + + if (t30_data->dti_data_req_ptr EQ NULL) + d = desc->buffer; + else + d = t30_data->dti_data_req_ptr; + + while (s < s_end AND desc AND !ready) + { + if (t30_data->TDC_upli_pending) + { + switch (*d) + { + case TDC_EOM: /* end of document (message) */ + TRACE_EVENT ("DTE->DCE:EOM"); + t30_data->sgn_ind = SGN_EOM; /* cmhT30_PPMRcvd(SGN_EOM) */ + ready = READY_UPLI_PAGE; + break; + + case TDC_EOP: /* end of document and session (procedure) */ + TRACE_EVENT ("DTE->DCE:EOP"); + t30_data->sgn_ind = SGN_EOP; /* cmhT30_PPMRcvd(SGN_EOP) */ + ready = READY_UPLI_PAGE; + break; + + case TDC_ETX: + /* + * end of page or as acknowledge to a sent DLE,CAN (cancel Phase C) + */ + TRACE_EVENT ("DTE->DCE:ETX"); + t30_data->sgn_ind = SGN_EOP; + ready = READY_UPLI_PAGE; + break; + + case TDC_MPS: /* end of page, more pages to follow */ + TRACE_EVENT ("DTE->DCE:MPS"); + t30_data->sgn_ind = SGN_MPS; /* cmhT30_PPMRcvd(SGN_MPS) */ + ready = READY_UPLI_PAGE; + break; + + case TDC_SOH: /* SOH (start of header) in packet mode */ + TRACE_EVENT ("DTE->DCE:SOH"); + break; + + case TDC_ETB: /* ETB (end of text block) in packet mode */ + TRACE_EVENT ("DTE->DCE:ETB"); + break; + + case TDC_OVR: /* overrun error marker */ + TRACE_EVENT ("DTE->DCE:OVERRUN in DTE"); + /* + * add call to cmhT30 here overrun handling ?? + */ + break; + + case TDC_BCR: /* buffer credit request */ + TRACE_EVENT ("DTE->DCE:REQ CREDIT"); + switch (GET_STATE (KER)) + { + case T30_SND_MSG: + break; + case T30_RCV_MSG: + break; + } + break; + + case TDC_PRI: /* procedural interrupt signal */ + TRACE_EVENT ("DTE->DCE:PRI"); + t30_data->sgn_ind = SGN_NOT_USED; /* cmhT30_PRIRcvd() */ + break; + + case TDC_DC2: /* receive buffer status: buffer is empty */ + TRACE_EVENT ("DTE->DCE:DC2"); + t30_data->sgn_ind = SGN_NOT_USED; /* cmhT30_DTERdy2Rcv() */ + break; + + case TDC_CAN: /* Requests DCE/DTE to stop delivering Phase C data */ + TRACE_EVENT ("DTE->DCE:CANCEL"); + /* + * add call to cmhT30 here + */ + break; + + default: + if ('a' <= *d AND *d <= 'n') /* interpret as fax cap setting */ + { + TRACE_EVENT ("DTE->DCE:FAX CAPS"); + /* + * add call to cmhT30 here for setup the fax caps + */ + } + else + { + *s = TDC_DLE; + s++; + sdu->l_buf += 8; + if (*d EQ TDC_SUB) /* double the TDC_DLE */ + { + *s = *d; + s++; + sdu->l_buf += 8; + } + t30_data->TDC_upli_pending = FALSE; + + d++; + if (d EQ desc->buffer + desc->len) + { + desc_next = (T_desc2 *)desc->next; + MFREE(desc); + desc = desc_next; + d = desc->buffer; + } + } + } + t30_data->TDC_upli_pending = FALSE; + } + else + { + if (*d EQ TDC_DLE) + { + t30_data->TDC_upli_pending = TRUE; + } + else + { + *s = *d; + s++; + sdu->l_buf += 8; + } + d++; + if (d EQ desc->buffer + desc->len) + { + desc_next = (T_desc2 *)desc->next; + MFREE(desc); + desc = desc_next; + d = desc->buffer; + } + } + if (desc AND !ready) + t30_data->dti_data_req_ptr = d; + else + t30_data->dti_data_req_ptr = NULL; + } + if (s EQ s_end) + ready |= READY_UPLI_SDU; + + return ready; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : check_ignore | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ + +LOCAL BOOL check_ignore(T_FAD_DATA_IND *fad_data_ind) +{ + if (!fad_data_ind) + return TRUE; + + if (ker_check_rtc(fad_data_ind) EQ RTC_YES AND !fad_data_ind->final) + { + PALLOC (fad_ignore_req, FAD_IGNORE_REQ); + PSENDX (FAD, fad_ignore_req); + SET_STATE(KER, T30_RCV_RDYF); + return TRUE; + } + return FALSE; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : append_dti_data_ind | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ + +LOCAL BOOL append_dti_data_ind(T_FAD_DATA_IND *fad_data_ind) +{ + TRACE_FUNCTION ("append_dti_data_ind()"); + + TDCexpand(&fad_data_ind->sdu, &t30_data->dti_data_ind->desc_list2, fad_data_ind->final); + return check_ignore(fad_data_ind); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : create_dti_data_ind | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ + +LOCAL BOOL create_dti_data_ind(T_FAD_DATA_IND *fad_data_ind) +{ + PALLOC (dti_data_ind, DTI2_DATA_IND); + + TRACE_FUNCTION ("create_dti_data_ind()"); + + dti_data_ind->link_id = t30_data->link_id; + dti_data_ind->parameters.p_id = DTI_PID_UOS; + dti_data_ind->parameters.st_lines.st_flow = DTI_FLOW_ON; + dti_data_ind->parameters.st_lines.st_line_sa = DTI_SA_ON; + dti_data_ind->parameters.st_lines.st_line_sb = DTI_SB_ON; + dti_data_ind->parameters.st_lines.st_break_len = DTI_BREAK_OFF; + + dti_data_ind->desc_list2.list_len = 0; + dti_data_ind->desc_list2.first = (ULONG)NULL; + + if (fad_data_ind) + { + t30_data->dti_data_ind = dti_data_ind; + TDCexpand(&fad_data_ind->sdu, &dti_data_ind->desc_list2, fad_data_ind->final); + return check_ignore(fad_data_ind); + } + else + { + t30_data->dti_data_ind_empty = dti_data_ind; + return FALSE; + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : prepare_dti_data_ind| ++--------------------------------------------------------------------+ + + PURPOSE : +*/ + +GLOBAL void prepare_dti_data_ind(T_FAD_DATA_IND *fad_data_ind) +{ + BOOL ignore; + + TRACE_FUNCTION ("prepare_dti_data_ind()"); + + t30_data->dti_data_ind_final = fad_data_ind->final; + + if (!t30_data->dti_data_ind) + ignore = create_dti_data_ind(fad_data_ind); + else + ignore = append_dti_data_ind(fad_data_ind); + + if (!ignore AND !t30_data->dti_data_ind_final) + { + PALLOC (fad_ready_req, FAD_READY_REQ); + PSENDX (FAD, fad_ready_req); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : snd_dti_data_ind | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ + +GLOBAL void snd_dti_data_ind(T_DTI2_DATA_IND **dti_data_ind) +{ + TRACE_FUNCTION ("snd_dti_data_ind()"); + + dti_send_data( + t30_hDTI, + T30_DTI_UP_DEF_INSTANCE, + T30_DTI_UP_INTERFACE, + T30_DTI_UP_CHANNEL, + *dti_data_ind + ); + + *dti_data_ind = NULL; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : snd_t30_phase_ind | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ + +GLOBAL void snd_t30_phase_ind(UBYTE phase) +{ + TRACE_FUNCTION ("snd_t30_phase_ind()"); + + { + PALLOC (t30_phase_ind, T30_PHASE_IND); + t30_phase_ind->phase = phase; + PSENDX (MMI, t30_phase_ind); + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : dti_connect_setup | ++--------------------------------------------------------------------+ + + PURPOSE : call dti_open() to establish a dtilib connection +*/ + +GLOBAL void dti_connect_setup(T_T30_DTI_REQ *t30_dti_req) +{ + TRACE_FUNCTION ("dti_connect_setup()"); + + t30_data->link_id = t30_dti_req->link_id; + + if (t30_data->dti_state NEQ DTI_CLOSED) + { + dti_disconnect(); + } + + create_dti_data_ind(NULL); /* send empty primitive to set flow control */ + + /* + * open new dti library communication channel + */ + t30_data->dti_state = DTI_SETUP; + + if (dti_open( + t30_hDTI, + T30_DTI_UP_DEF_INSTANCE, + T30_DTI_UP_INTERFACE, + T30_DTI_UP_CHANNEL, + T30_DTI_UPLINK_QUEUE_SIZE, + t30_dti_req->dti_direction, + DTI_QUEUE_UNUSED, + DTI_VERSION_10, + (U8*)t30_dti_req->entity_name, + t30_dti_req->link_id + )) + return; + + t30_data->dti_state = DTI_CLOSED; + snd_t30_dti_cnf(T30_DISCONNECT_DTI); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : dti_connect_open | ++--------------------------------------------------------------------+ + + PURPOSE : acknowledge established a dtilib connection +*/ + +GLOBAL void dti_connect_open() +{ + TRACE_FUNCTION ("dti_connect_open()"); + + if(t30_data->dti_state EQ DTI_SETUP) + { + t30_data->dti_state = DTI_IDLE; + snd_t30_dti_cnf(T30_CONNECT_DTI); + snd_dti_ready_ind(); + } + else + { + TRACE_ERROR ("dti connection is not in SETUP state!"); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : snd_t30_dti_ind | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ + +LOCAL void snd_t30_dti_ind(void) +{ + TRACE_FUNCTION ("snd_t30_dti_ind()"); + { + PALLOC (t30_dti_ind, T30_DTI_IND); + PSENDX (MMI, t30_dti_ind); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : dti_connect_close | ++--------------------------------------------------------------------+ + + PURPOSE : react to closing of dtilib connection +*/ + +GLOBAL void dti_connect_close() +{ + TRACE_FUNCTION ("ti_connect_close()"); + + if(t30_data->dti_state NEQ DTI_CLOSED) + { + t30_data->dti_state = DTI_CLOSED; + snd_t30_dti_ind(); + } + else + { + TRACE_ERROR ("dti connection is not in SETUP/OPEN state!"); + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : dti_connect_close | ++--------------------------------------------------------------------+ + + PURPOSE : close down a dtilib connection +*/ + +GLOBAL void dti_disconnect() +{ + TRACE_FUNCTION ("dti_disconnect()"); + + /* + * shut down dtilib communication + */ + if(t30_data->dti_state NEQ DTI_CLOSED) + { + dti_close( + t30_hDTI, + T30_DTI_UP_DEF_INSTANCE, + T30_DTI_UP_INTERFACE, + T30_DTI_UP_CHANNEL, + FALSE + ); + t30_data->dti_state = DTI_CLOSED; + } + else + { + TRACE_ERROR ("dti connection is not in SETUP/OPEN state!"); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : snd_t30_dti_cnf | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ + +GLOBAL void snd_t30_dti_cnf(UBYTE dti_conn) +{ + TRACE_FUNCTION ("snd_t30_dti_cnf()"); + + { + PALLOC (t30_dti_cnf, T30_DTI_CNF); + t30_dti_cnf->dti_conn = dti_conn; + PSENDX (MMI, t30_dti_cnf); + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERP | +| STATE : code ROUTINE : snd_dti_ready_ind | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ + +GLOBAL void snd_dti_ready_ind(void) +{ + TRACE_FUNCTION ("snd_dti_ready_ind()"); + + dti_start( + t30_hDTI, + T30_DTI_UP_DEF_INSTANCE, + T30_DTI_UP_INTERFACE, + T30_DTI_UP_CHANNEL + ); +} + +#if defined _SIMULATION_ || defined KER_DEBUG_BCS || defined KER_DEBUG_MSG +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : T30_KERF | +| STATE : code ROUTINE : ker_debug | ++--------------------------------------------------------------------+ + + PURPOSE : This function debugs the contents of a buffer. +*/ + +GLOBAL void ker_debug(CHAR *header, UBYTE *buf, USHORT len) +{ +#define BYTE2HEXSTR(B, H) {UBYTE b, *a = (UBYTE*)(H);\ + b = (((UBYTE)(B)) >> 4) & 0x0F;\ + if (b > 9) b += 'A'-10; else b += '0'; *a = b;\ + b = ((UBYTE)(B)) & 0x0F;\ + if (b > 9) b += 'A'-10; else b += '0'; *(a+1) = b;} + + USHORT i, k = 0; + char trace_buf[81]; + + /* + TRACE_EVENT("====== KERNEL DEBUG START ======"); + */ + TRACE_EVENT_P2("%s: len=%d", header, len); + + for (i = 0; i < len; i++) + { + BYTE2HEXSTR(buf[i], &trace_buf[k]); + k += 2; + if (k EQ 80) + break; + } + trace_buf[k] = 0; + TRACE_EVENT(trace_buf); + /* + TRACE_EVENT("====== KERNEL DEBUG END ======"); + */ +} +#endif +