diff --git a/libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c b/libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c index 3b8fa2f376..676302400e 100755 --- a/libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c +++ b/libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c @@ -404,8 +404,6 @@ void on_wat_rel_cfm(unsigned char span_id, uint8_t call_id) void on_wat_sms_ind(unsigned char span_id, wat_sms_event_t *sms_event) { - //printf("on_wat_sms_ind\r\n"); - ftdm_span_t *span = NULL; ftdm_channel_t *ftdmchan; @@ -431,7 +429,6 @@ void on_wat_sms_ind(unsigned char span_id, wat_sms_event_t *sms_event) gsm_data->dchan->caller_data.priv = (void *)&sms_data; ftdm_span_send_signal(span, &sigev); } -// SEND_STATE_SIGNAL(FTDM_SIGEVENT_SMS); return; } @@ -450,26 +447,35 @@ void on_wat_sms_sts(unsigned char span_id, uint8_t sms_id, wat_sms_status_t *sta return; } +static void on_wat_dtmf_ind(unsigned char span_id, const char *dtmf) +{ + ftdm_span_t *span = NULL; + ftdm_gsm_span_data_t *gsm_data = NULL; + + if (!(span = GetSpanByID(span_id, &gsm_data))) { + return; + } + + ftdm_channel_queue_dtmf(gsm_data->bchan, dtmf); +} void on_wat_log(uint8_t level, char *fmt, ...) { - int ftdm_level; - char buff[10001]; + char buff[4096]; va_list argptr; va_start(argptr, fmt); switch(level) { - case WAT_LOG_CRIT: ftdm_level = FTDM_LOG_LEVEL_CRIT; break; - case WAT_LOG_ERROR: ftdm_level = FTDM_LOG_LEVEL_ERROR; break; - default: + case WAT_LOG_CRIT: ftdm_level = FTDM_LOG_LEVEL_CRIT; break; + case WAT_LOG_ERROR: ftdm_level = FTDM_LOG_LEVEL_ERROR; break; case WAT_LOG_WARNING: ftdm_level = FTDM_LOG_LEVEL_WARNING; break; - case WAT_LOG_INFO: ftdm_level = FTDM_LOG_LEVEL_INFO; break; + case WAT_LOG_INFO: ftdm_level = FTDM_LOG_LEVEL_INFO; break; case WAT_LOG_NOTICE: ftdm_level = FTDM_LOG_LEVEL_NOTICE; break; - case WAT_LOG_DEBUG: ftdm_level = FTDM_LOG_LEVEL_DEBUG; break; - + case WAT_LOG_DEBUG: ftdm_level = FTDM_LOG_LEVEL_DEBUG; break; + default: ftdm_level = FTDM_LOG_LEVEL_ERROR; break; }; @@ -498,32 +504,33 @@ void on_wat_free(void *ptr) void on_wat_log_span(uint8_t span_id, uint8_t level, char *fmt, ...) { -#if 0 + ftdm_span_t *span = NULL; + ftdm_gsm_span_data_t *gsm_data = NULL; int ftdm_level; -return; + char buff[4096]; va_list argptr; + + if (!(span = GetSpanByID(span_id, &gsm_data))) { + return; + } + va_start(argptr, fmt); - char buff[10001]; switch(level) { - case WAT_LOG_CRIT: ftdm_level = FTDM_LOG_LEVEL_CRIT; break; - case WAT_LOG_ERROR: ftdm_level = FTDM_LOG_LEVEL_ERROR; break; - default: - + case WAT_LOG_CRIT: ftdm_level = FTDM_LOG_LEVEL_CRIT; break; + case WAT_LOG_ERROR: ftdm_level = FTDM_LOG_LEVEL_ERROR; break; case WAT_LOG_WARNING: ftdm_level = FTDM_LOG_LEVEL_WARNING; break; - case WAT_LOG_INFO: ftdm_level = FTDM_LOG_LEVEL_INFO; break; + case WAT_LOG_INFO: ftdm_level = FTDM_LOG_LEVEL_INFO; break; case WAT_LOG_NOTICE: ftdm_level = FTDM_LOG_LEVEL_NOTICE; break; - case WAT_LOG_DEBUG: ftdm_level = FTDM_LOG_LEVEL_DEBUG; break; - + case WAT_LOG_DEBUG: ftdm_level = FTDM_LOG_LEVEL_DEBUG; break; + default: ftdm_level = FTDM_LOG_LEVEL_ERROR; break; }; - vsprintf(buff, fmt, argptr); - ftdm_log(FTDM_PRE, ftdm_level, "WAT span %d:%s", span_id, buff); + ftdm_log_chan_ex(gsm_data->dchan, __FILE__, __FUNCTION__, __LINE__, ftdm_level, "%s", buff); va_end(argptr); -#endif } @@ -553,8 +560,6 @@ static ftdm_status_t ftdm_gsm_stop(ftdm_span_t *span) static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(ftdm_gsm_get_channel_sig_status) { - ftdm_log(FTDM_LOG_INFO, "\r\nftdm_gsm_get_channel_sig_status\r\n"); - if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SIG_UP)) { *status = FTDM_SIG_STATE_UP; } @@ -857,6 +862,7 @@ static ftdm_status_t init_wat_lib(void) wat_interface.wat_sms_ind = on_wat_sms_ind; wat_interface.wat_sms_sts = on_wat_sms_sts; wat_interface.wat_span_sts = on_wat_span_status; + wat_interface.wat_dtmf_ind = on_wat_dtmf_ind; if (wat_register(&wat_interface)) { ftdm_log(FTDM_LOG_DEBUG, "Failed registering interface to WAT library ...\n"); @@ -883,12 +889,16 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_gsm_configure_span_signaling) unsigned paramindex = 0; const char *var = NULL; const char *val = NULL; - + + int codec = FTDM_CODEC_SLIN; + int interval = 20; + /* libwat is smart enough to set good default values for the timers if they are set to 0 */ memset(&span_config, 0, sizeof(span_config)); - + /* set some span defaults */ span_config.moduletype = WAT_MODULE_TELIT; + span_config.hardware_dtmf = WAT_FALSE; if (FTDM_SUCCESS != init_wat_lib()) { return FTDM_FAIL; @@ -935,10 +945,6 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_gsm_configure_span_signaling) return FTDM_FAIL; } - - - - gsm_data = ftdm_calloc(1, sizeof(*gsm_data)); if (!gsm_data) { return FTDM_FAIL; @@ -966,6 +972,15 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_gsm_configure_span_signaling) ftdm_log(FTDM_LOG_DEBUG, "Configuring GSM span %s with moduletype %s\n", span->name, val); } else if (!strcasecmp(var, "debug")) { span_config.debug_mask = wat_str2debug(val); + ftdm_log(FTDM_LOG_DEBUG, "Configuring GSM span %s with debug mask %s == 0x%X\n", span->name, val, span_config.debug_mask); + } else if (!strcasecmp(var, "hwdtmf")) { + if (ftdm_true(val)) { + span_config.hardware_dtmf = WAT_TRUE; + } else { + span_config.hardware_dtmf = WAT_FALSE; + } + ftdm_log(FTDM_LOG_DEBUG, "Configuring GSM span %s with hardware dtmf %s\n", span->name, val); + ftdm_channel_set_feature(gsm_data->bchan, FTDM_CHANNEL_FEATURE_DTMF_DETECT); } else { ftdm_log(FTDM_LOG_ERROR, "Ignoring unknown GSM parameter '%s'", var); } @@ -979,14 +994,13 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_gsm_configure_span_signaling) span->signal_cb = sig_cb; span->signal_type = FTDM_SIGTYPE_GSM; - span->signal_data = gsm_data; /* Gideon, plz fill me with gsm span specific data (you allocate and free) */ + span->signal_data = gsm_data; span->outgoing_call = gsm_outgoing_call; span->get_span_sig_status = ftdm_gsm_get_span_sig_status; span->set_span_sig_status = ftdm_gsm_set_span_sig_status; span->get_channel_sig_status = ftdm_gsm_get_channel_sig_status; span->set_channel_sig_status = ftdm_gsm_set_channel_sig_status; - //printf("\r\nspan->state_map = &gsm_state_map;\r\n"); span->state_map = &gsm_state_map; span->state_processor = ftdm_gsm_state_advance; @@ -999,28 +1013,15 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_gsm_configure_span_signaling) gsm_data->span = span; -#if 0 - /* setup the scheduler (create if needed) */ - snprintf(schedname, sizeof(schedname), "ftmod_r2_%s", span->name); - ftdm_assert(ftdm_sched_create(&r2data->sched, schedname) == FTDM_SUCCESS, "Failed to create schedule!\n"); - spanpvt->sched = r2data->sched; -#endif - - -fprintf(stdout, "Configuring wat span %d %s \r\n", span->span_id, span->name); + fprintf(stdout, "Configuring wat span %d %s \r\n", span->span_id, span->name); if (wat_span_config(span->span_id, &span_config)) { ftdm_log(FTDM_LOG_ERROR, "Failed to configure span %s for GSM signaling!!\n", span->name); return FTDM_FAIL; } - { - int codec = FTDM_CODEC_SLIN; - int interval = 20; - - ftdm_channel_command(gsm_data->bchan, FTDM_COMMAND_SET_NATIVE_CODEC, &codec); - ftdm_channel_command(gsm_data->bchan, FTDM_COMMAND_SET_CODEC, &codec); - ftdm_channel_command(gsm_data->bchan, FTDM_COMMAND_SET_INTERVAL, &interval); - } + ftdm_channel_command(gsm_data->bchan, FTDM_COMMAND_SET_NATIVE_CODEC, &codec); + ftdm_channel_command(gsm_data->bchan, FTDM_COMMAND_SET_CODEC, &codec); + ftdm_channel_command(gsm_data->bchan, FTDM_COMMAND_SET_INTERVAL, &interval); return FTDM_SUCCESS;