freetdm: ftmod_gsm: Added support for hardware DTMF
This commit is contained in:
parent
a0a8a66525
commit
0b6f10a6a8
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue