summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarkster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2004-09-27 19:50:03 +0000
committermarkster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2004-09-27 19:50:03 +0000
commitecc3317016685aaf284ae70ffa7afb6ac1e02523 (patch)
tree5089219209dc6f21cedc7d518cf5fedb4d27e559
parent1d7d247ab9d612f392b8f812e2afe33c1204a43d (diff)
Fix negative cadences
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@461 5390a7c7-147a-4af0-8ec9-7488f05a26cb
-rwxr-xr-xzaptel.c25
-rwxr-xr-xzaptel.h1
2 files changed, 23 insertions, 3 deletions
diff --git a/zaptel.c b/zaptel.c
index c3088d7..339da65 100755
--- a/zaptel.c
+++ b/zaptel.c
@@ -1989,7 +1989,8 @@ static int initialize_channel(struct zt_chan *chan)
chan->afterdialingtimer = 0;
chan->cadencepos = 0;
-
+ chan->firstcadencepos = 0; /* By default loop back to first cadence position */
+
/* HDLC & FCS stuff */
fasthdlc_init(&chan->rxhdlc);
fasthdlc_init(&chan->txhdlc);
@@ -3782,10 +3783,28 @@ static int zt_chanandpseudo_ioctl(struct inode *inode, struct file *file, unsign
if (copy_from_user(&stack.cad, (struct zt_ring_cadence *)data, sizeof(stack.cad)))
return -EIO;
memcpy(chan->ringcadence, &stack.cad, sizeof(chan->ringcadence));
+ chan->firstcadencepos = 0;
+ /* Looking for negative ringing time indicating where to loop back into ringcadence */
+ for (i=0; i<ZT_MAX_CADENCE; i+=2 ) {
+ if (chan->ringcadence[i]<0) {
+ chan->ringcadence[i] *= -1;
+ chan->firstcadencepos = i;
+ break;
+ }
+ }
} else {
/* Reset to default */
+ chan->firstcadencepos = 0;
if (chan->curzone) {
memcpy(chan->ringcadence, chan->curzone->ringcadence, sizeof(chan->ringcadence));
+ /* Looking for negative ringing time indicating where to loop back into ringcadence */
+ for (i=0; i<ZT_MAX_CADENCE; i+=2 ) {
+ if (chan->ringcadence[i]<0) {
+ chan->ringcadence[i] *= -1;
+ chan->firstcadencepos = i;
+ break;
+ }
+ }
} else {
memset(chan->ringcadence, 0, sizeof(chan->ringcadence));
chan->ringcadence[0] = chan->starttime;
@@ -4888,11 +4907,11 @@ static inline void __rbs_otimer_expire(struct zt_chan *chan)
/* Turn on the ringer now that the silent time has passed */
++chan->cadencepos;
if (chan->cadencepos >= ZT_MAX_CADENCE)
- chan->cadencepos = 0;
+ chan->cadencepos = chan->firstcadencepos;
len = chan->ringcadence[chan->cadencepos];
if (!len) {
- chan->cadencepos = 0;
+ chan->cadencepos = chan->firstcadencepos;
len = chan->ringcadence[chan->cadencepos];
}
diff --git a/zaptel.h b/zaptel.h
index 3c2bdd9..14dd69f 100755
--- a/zaptel.h
+++ b/zaptel.h
@@ -1021,6 +1021,7 @@ struct zt_chan {
/* Ring cadence */
int ringcadence[ZT_MAX_CADENCE];
+ int firstcadencepos; /* Where to restart ring cadence */
/* Digit string dialing stuff */
int digitmode; /* What kind of tones are we sending? */