freetdm: ftmod_gsm: Added support for hardware DTMF

This commit is contained in:
Moises Silva 2014-07-11 00:41:40 -04:00
parent a0a8a66525
commit 0b6f10a6a8
1 changed files with 52 additions and 51 deletions

View File

@ -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;