diff options
-rw-r--r-- | channels/chan_zap.c | 52 | ||||
-rw-r--r-- | configs/zapata.conf.sample | 3 | ||||
-rw-r--r-- | doc/India-CID.txt | 75 | ||||
-rw-r--r-- | include/asterisk/callerid.h | 1 |
4 files changed, 128 insertions, 3 deletions
diff --git a/channels/chan_zap.c b/channels/chan_zap.c index e63c61173..b007b9f84 100644 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -6398,7 +6398,7 @@ static void *ss_thread(void *data) /* If we want caller id, we're in a prering state due to a polarity reversal * and we're set to use a polarity reversal to trigger the start of caller id, * grab the caller id and wait for ringing to start... */ - } else if (p->use_callerid && (chan->_state == AST_STATE_PRERING && p->cid_start == CID_START_POLARITY)) { + } else if (p->use_callerid && (chan->_state == AST_STATE_PRERING && (p->cid_start == CID_START_POLARITY || p->cid_start == CID_START_POLARITY_IN))) { /* If set to use DTMF CID signalling, listen for DTMF */ if (p->cid_signalling == CID_SIG_DTMF) { int i = 0; @@ -6644,6 +6644,45 @@ static void *ss_thread(void *data) return NULL; } } else if (p->use_callerid && p->cid_start == CID_START_RING) { + if (p->cid_signalling == CID_SIG_DTMF) { + int i = 0; + cs = NULL; + zt_setlinear(p->subs[index].zfd, 0); + res = 2000; + for (;;) { + struct ast_frame *f; + res = ast_waitfor(chan, res); + if (res <= 0) { + ast_log(LOG_WARNING, "DTMFCID timed out waiting for ring. " + "Exiting simple switch\n"); + ast_hangup(chan); + return NULL; + } + f = ast_read(chan); + if (f->frametype == AST_FRAME_DTMF) { + dtmfbuf[i++] = f->subclass; + ast_log(LOG_DEBUG, "CID got digit '%c'\n", f->subclass); + res = 2000; + } + ast_frfree(f); + + if (p->ringt_base == p->ringt) + break; + + } + dtmfbuf[i] = '\0'; + zt_setlinear(p->subs[index].zfd, p->subs[index].linear); + /* Got cid and ring. */ + callerid_get_dtmf(dtmfbuf, dtmfcid, &flags); + ast_log(LOG_DEBUG, "CID is '%s', flags %d\n", + dtmfcid, flags); + /* If first byte is NULL, we have no cid */ + if (!ast_strlen_zero(dtmfcid)) + number = dtmfcid; + else + number = NULL; + /* If set to use V23 Signalling, launch our FSK gubbins and listen for it */ + } else { /* FSK Bell202 callerID */ cs = callerid_new(p->cid_signalling); if (cs) { @@ -6822,6 +6861,7 @@ static void *ss_thread(void *data) } else ast_log(LOG_WARNING, "Unable to get caller ID space\n"); } + } else cs = NULL; @@ -6956,7 +6996,11 @@ static int handle_init_event(struct zt_pvt *i, int event) case SIG_SF_FEATB: case SIG_SF: /* Check for callerid, digits, etc */ - chan = zt_new(i, AST_STATE_RING, 0, SUB_REAL, 0, 0); + if (i->cid_start == CID_START_POLARITY_IN) { + chan = zt_new(i, AST_STATE_PRERING, 0, SUB_REAL, 0, 0); + } else { + chan = zt_new(i, AST_STATE_RING, 0, SUB_REAL, 0, 0); + } if (chan && ast_pthread_create_detached(&threadid, NULL, ss_thread, chan)) { ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel); res = tone_zone_play_tone(i->subs[SUB_REAL].zfd, ZT_TONE_CONGESTION); @@ -7047,7 +7091,7 @@ static int handle_init_event(struct zt_pvt *i, int event) case SIG_FXSLS: case SIG_FXSKS: case SIG_FXSGS: - if (i->cid_start == CID_START_POLARITY) { + if (i->cid_start == CID_START_POLARITY || i->cid_start == CID_START_POLARITY_IN) { i->polarity = POLARITY_REV; ast_verbose(VERBOSE_PREFIX_2 "Starting post polarity " "CID detection on channel %d\n", @@ -11920,6 +11964,8 @@ static int process_zap(struct zt_chan_conf *confp, struct ast_variable *v, int r } else if (!strcasecmp(v->name, "cidstart")) { if (!strcasecmp(v->value, "ring")) confp->chan.cid_start = CID_START_RING; + else if (!strcasecmp(v->value, "polarity_in")) + confp->chan.cid_start = CID_START_POLARITY_IN; else if (!strcasecmp(v->value, "polarity")) confp->chan.cid_start = CID_START_POLARITY; else if (ast_true(v->value)) diff --git a/configs/zapata.conf.sample b/configs/zapata.conf.sample index f76af674b..510c06d9f 100644 --- a/configs/zapata.conf.sample +++ b/configs/zapata.conf.sample @@ -257,6 +257,9 @@ usecallerid=yes ; What signals the start of caller ID ; ring = a ring signals the start ; polarity = polarity reversal signals the start +; polarity_IN = polarity reversal signals the start, for India, +; for dtmf dialtone detection; using DTMF. +; (see doc/India-CID.txt) ; ;cidstart=ring ; diff --git a/doc/India-CID.txt b/doc/India-CID.txt new file mode 100644 index 000000000..5961bb555 --- /dev/null +++ b/doc/India-CID.txt @@ -0,0 +1,75 @@ +India finds itself in a unique situation (hopefully). It has several +telephone line providers, and they are not all using the same CID +signalling; and the CID signalling is not like other countries. + +In order to help those in India quickly find to the CID signalling +system that their carrier uses (or range of them), and get the +configs right with a minimal amount of experimentation, this file +is provided. Not all carriers are covered, and not all mentioned +below are complete. Those with updates to this table should post +the new information on bug 6683 of the asterisk bug tracker. + + +--------------------------------------------------------- +Provider: Bharti (is this BSNL?) +Config: cidstart=polarity_in + cidsignalling=dtmf +Results: ? (this should work), but needs to be tested? +tested by: +-------------------------------------------------------- + +Provider: VSNL +Config: + +Results: ? +tested by: +-------------------------------------------------------- + +Provider: BSNL +Config: cid_start=ring + cid_signalling=dtmf + +Results: ? +tested by: (abhi) +-------------------------------------------------------- + +Provider: MTNL, old BSNL +Config: cidsignalling = v23 + cidstart=ring + +Results: works +tested by: (enterux) +-------------------------------------------------------- + +Provider: MTNL (Delhi) +Config: cidsignalling = v23 + cidstart = ring + +cidsignalling = dtmf +cidstart = polarity_IN + +cidsignalling = dtmf +cidstart = polarity + +Results: fails +tested by: brealer +-------------------------------------------------------- + +Provider: TATA +Config: cidsignalling = dtmf + cidstart=polarity_IN + +Results: works +tested by: brealer +--------------------------------------------------------- + +Asterisk still doesn't work with some of the CID scenarios in India. +If you are in India, and not able to make CID work with any of the +permutations of cidsignalling and cidstart, it could be that this +particular situation is not covered by Asterisk. A good course of +action would be to get in touch with the provider, and find out from +them exactly how their CID signalling works. Describe this to us, +and perhaps someone will be able to extend the code to cover their +signalling. + + diff --git a/include/asterisk/callerid.h b/include/asterisk/callerid.h index bf4030e15..efc8e874a 100644 --- a/include/asterisk/callerid.h +++ b/include/asterisk/callerid.h @@ -58,6 +58,7 @@ #define CID_START_RING 1 #define CID_START_POLARITY 2 +#define CID_START_POLARITY_IN 3 #define AST_LIN2X(a) ((codec == AST_FORMAT_ALAW) ? (AST_LIN2A(a)) : (AST_LIN2MU(a))) |