]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: ftmod_gsm: Added support for hardware DTMF
authorMoises Silva <moy@sangoma.com>
Fri, 11 Jul 2014 04:41:40 +0000 (00:41 -0400)
committerMoises Silva <moy@sangoma.com>
Fri, 11 Jul 2014 04:52:32 +0000 (00:52 -0400)
libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c

index 3b8fa2f3762032ff782d18407e65a775f3d1a5b3..676302400e82a40c3cb4117aa9a82cea2cb611d5 100755 (executable)
@@ -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;