Add support for ring begin event and configurable ringtimeout.
authorMark Spencer <markster@digium.com>
Wed, 31 Aug 2005 05:02:33 +0000 (05:02 +0000)
committerMark Spencer <markster@digium.com>
Wed, 31 Aug 2005 05:02:33 +0000 (05:02 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6470 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_zap.c
configs/zapata.conf.sample

index eac5f8b..c741cb6 100755 (executable)
@@ -358,7 +358,7 @@ static inline int zt_wait_event(int fd)
 #define CALLWAITING_REPEAT_SAMPLES     ( (10000 * 8) / READ_SIZE) /* 300 ms */
 #define CIDCW_EXPIRE_SAMPLES           ( (500 * 8) / READ_SIZE) /* 500 ms */
 #define MIN_MS_SINCE_FLASH                     ( (2000) )      /* 2000 ms */
 #define CALLWAITING_REPEAT_SAMPLES     ( (10000 * 8) / READ_SIZE) /* 300 ms */
 #define CIDCW_EXPIRE_SAMPLES           ( (500 * 8) / READ_SIZE) /* 500 ms */
 #define MIN_MS_SINCE_FLASH                     ( (2000) )      /* 2000 ms */
-#define RINGT                                          ( (8000 * 8) / READ_SIZE)
+#define DEFAULT_RINGT                          ( (8000 * 8) / READ_SIZE)
 
 struct zt_pvt;
 
 
 struct zt_pvt;
 
@@ -367,6 +367,7 @@ struct zt_pvt;
 static int r2prot = -1;
 #endif
 
 static int r2prot = -1;
 #endif
 
+static int ringt_base = DEFAULT_RINGT;
 
 #ifdef ZAPATA_PRI
 
 
 #ifdef ZAPATA_PRI
 
@@ -610,6 +611,7 @@ static struct zt_pvt {
        int cidpos;
        int cidlen;
        int ringt;
        int cidpos;
        int cidlen;
        int ringt;
+       int ringt_base;
        int stripmsd;
        int callwaitcas;
        int callwaitrings;
        int stripmsd;
        int callwaitcas;
        int callwaitrings;
@@ -1040,7 +1042,8 @@ static char *events[] = {
                "Pulse Start",
                "Timer Expired",
                "Timer Ping",
                "Pulse Start",
                "Timer Expired",
                "Timer Ping",
-               "Polarity Reversal"
+               "Polarity Reversal",
+               "Ring Begin",
 };
 
 static struct {
 };
 
 static struct {
@@ -1069,7 +1072,7 @@ static char *alarm2str(int alarm)
 static char *event2str(int event)
 {
         static char buf[256];
 static char *event2str(int event)
 {
         static char buf[256];
-        if ((event < 18) && (event > -1))
+        if ((event < (sizeof(events) / sizeof(events[0]))) && (event > -1))
                 return events[event];
         sprintf(buf, "Event %d", event); /* safe */
         return buf;
                 return events[event];
         sprintf(buf, "Event %d", event); /* safe */
         return buf;
@@ -3703,7 +3706,7 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
                        case SIG_FXSGS:
                        case SIG_FXSKS:
                                if (ast->_state == AST_STATE_RING) {
                        case SIG_FXSGS:
                        case SIG_FXSKS:
                                if (ast->_state == AST_STATE_RING) {
-                                       p->ringt = RINGT;
+                                       p->ringt = p->ringt_base;
                                }
 
                                /* If we get a ring then we cannot be in 
                                }
 
                                /* If we get a ring then we cannot be in 
@@ -3752,6 +3755,19 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
                                ast_log(LOG_WARNING, "Don't know how to handle ring/off hoook for signalling %d\n", p->sig);
                        }
                        break;
                                ast_log(LOG_WARNING, "Don't know how to handle ring/off hoook for signalling %d\n", p->sig);
                        }
                        break;
+#ifdef ZT_EVENT_RINGBEGIN
+               case ZT_EVENT_RINGBEGIN:
+                       switch(p->sig) {
+                       case SIG_FXSLS:
+                       case SIG_FXSGS:
+                       case SIG_FXSKS:
+                               if (ast->_state == AST_STATE_RING) {
+                                       p->ringt = p->ringt_base;
+                               }
+                               break;
+                       }
+                       break;
+#endif                 
                case ZT_EVENT_RINGEROFF:
                        if (p->inalarm) break;
                        if (p->radio) break;
                case ZT_EVENT_RINGEROFF:
                        if (p->inalarm) break;
                        if (p->radio) break;
@@ -5750,7 +5766,7 @@ static void *ss_thread(void *data)
                
                                                                curRingData[receivedRingT] = p->ringt;
                
                
                                                                curRingData[receivedRingT] = p->ringt;
                
-                                                               if (p->ringt < RINGT/2)
+                                                               if (p->ringt < p->ringt_base/2)
                                                                        break;
                                                                ++receivedRingT; /* Increment the ringT counter so we can match it against
                                                                                values in zapata.conf for distinctive ring */
                                                                        break;
                                                                ++receivedRingT; /* Increment the ringT counter so we can match it against
                                                                                values in zapata.conf for distinctive ring */
@@ -5854,7 +5870,7 @@ static void *ss_thread(void *data)
 
                                                curRingData[receivedRingT] = p->ringt;
 
 
                                                curRingData[receivedRingT] = p->ringt;
 
-                                               if (p->ringt < RINGT/2)
+                                               if (p->ringt < p->ringt_base/2)
                                                        break;
                                                ++receivedRingT; /* Increment the ringT counter so we can match it against
                                                                values in zapata.conf for distinctive ring */
                                                        break;
                                                ++receivedRingT; /* Increment the ringT counter so we can match it against
                                                                values in zapata.conf for distinctive ring */
@@ -5948,7 +5964,7 @@ static void *ss_thread(void *data)
                        callerid_free(cs);
                ast_setstate(chan, AST_STATE_RING);
                chan->rings = 1;
                        callerid_free(cs);
                ast_setstate(chan, AST_STATE_RING);
                chan->rings = 1;
-               p->ringt = RINGT;
+               p->ringt = p->ringt_base;
                res = ast_pbx_run(chan);
                if (res) {
                        ast_hangup(chan);
                res = ast_pbx_run(chan);
                if (res) {
                        ast_hangup(chan);
@@ -6088,7 +6104,7 @@ static int handle_init_event(struct zt_pvt *i, int event)
                case SIG_FXSLS:
                case SIG_FXSGS:
                case SIG_FXSKS:
                case SIG_FXSLS:
                case SIG_FXSGS:
                case SIG_FXSKS:
-                               i->ringt = RINGT;
+                               i->ringt = i->ringt_base;
                                /* Fall through */
                case SIG_EMWINK:
                case SIG_FEATD:
                                /* Fall through */
                case SIG_EMWINK:
                case SIG_FEATD:
@@ -6905,6 +6921,7 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
                tmp->transfertobusy = transfertobusy;
                tmp->sig = signalling;
                tmp->radio = radio;
                tmp->transfertobusy = transfertobusy;
                tmp->sig = signalling;
                tmp->radio = radio;
+               tmp->ringt_base = ringt_base;
                tmp->firstradio = 0;
                if ((signalling == SIG_FXOKS) || (signalling == SIG_FXOLS) || (signalling == SIG_FXOGS))
                        tmp->permcallwaiting = callwaiting;
                tmp->firstradio = 0;
                if ((signalling == SIG_FXOKS) || (signalling == SIG_FXOLS) || (signalling == SIG_FXOGS))
                        tmp->permcallwaiting = callwaiting;
@@ -10555,6 +10572,8 @@ static int setup_zap(int reload)
                                                }
                                        }
                                }
                                                }
                                        }
                                }
+                       } else if (!strcasecmp(v->name, "ringtimeout")) {
+                               ringt_base = (atoi(v->value) * 8) / READ_SIZE;
                        } else if (!strcasecmp(v->name, "prewink")) {
                                cur_prewink = atoi(v->value);
                        } else if (!strcasecmp(v->name, "preflash")) {
                        } else if (!strcasecmp(v->name, "prewink")) {
                                cur_prewink = atoi(v->value);
                        } else if (!strcasecmp(v->name, "preflash")) {
index 4eca285..d8fe458 100755 (executable)
@@ -422,6 +422,12 @@ immediate=no
 ;callprogress=yes
 ;progzone=us
 ;
 ;callprogress=yes
 ;progzone=us
 ;
+; FXO (FXS signalled) devices must have a timeout to determine whe there was a
+; hangup before the line was answered.  This value can be tweaked to shorten
+; how long it takes before Zap considers a non-ringing line to have hungup.
+;
+;ringtimeout=8000
+;
 ; For FXO (FXS signalled) devices, whether to use pulse dial instead of DTMF
 ;
 ;pulsedial=yes
 ; For FXO (FXS signalled) devices, whether to use pulse dial instead of DTMF
 ;
 ;pulsedial=yes