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;
gsm_data->dchan->caller_data.priv = (void *)&sms_data;
ftdm_span_send_signal(span, &sigev);
}
-// SEND_STATE_SIGNAL(FTDM_SIGEVENT_SMS);
return;
}
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;
};
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
}
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;
}
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");
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;
return FTDM_FAIL;
}
-
-
-
-
gsm_data = ftdm_calloc(1, sizeof(*gsm_data));
if (!gsm_data) {
return FTDM_FAIL;
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);
}
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;
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;