dect
/
asterisk
Archived
13
0
Fork 0

Merge polarity reversal hangup patch (bug #2847)

git-svn-id: http://svn.digium.com/svn/asterisk/trunk@4275 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
markster 2004-11-17 06:18:33 +00:00
parent 901edbbb84
commit d6a6fed8b8
2 changed files with 50 additions and 0 deletions

View File

@ -268,6 +268,12 @@ AST_MUTEX_DEFINE_STATIC(iflock);
static int ifcount = 0;
/* Whether we hang up on a Polarity Switch event */
static int hanguponpolarityswitch = 0;
/* How long (ms) to ignore Polarity Switch events after we answer a call */
static int polarityonanswerdelay = 600;
/* Protect the monitoring thread, so only one process can kill or start it, and not
when it's doing something critical. */
AST_MUTEX_DEFINE_STATIC(monlock);
@ -552,6 +558,9 @@ static struct zt_pvt {
int dtmfrelax; /* whether to run in relaxed DTMF mode */
int fake_event;
int zaptrcallerid; /* should we use the callerid from incoming call on zap transfer or not */
int hanguponpolarityswitch;
int polarityonanswerdelay;
struct timeval polaritydelaytv;
#ifdef ZAPATA_PRI
struct zt_pri *pri;
struct zt_pvt *bearer;
@ -2296,6 +2305,9 @@ static int zt_answer(struct ast_channel *ast)
case SIG_FXOKS:
/* Pick up the line */
ast_log(LOG_DEBUG, "Took %s off hook\n", ast->name);
if(p->hanguponpolarityswitch) {
gettimeofday(&p->polaritydelaytv, NULL);
}
res = zt_set_hook(p->subs[SUB_REAL].zfd, ZT_OFFHOOK);
tone_zone_play_tone(p->subs[index].zfd, -1);
p->dialing = 0;
@ -3695,6 +3707,31 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
break;
}
break;
case ZT_EVENT_POLARITY:
/*
* If we get a Polarity Switch event, check to see
* if it should be ignored (the off-hook action seems
* to cause a Polarity Switch) or whether it is an
* indication of remote end disconnect, in which case
* we should hang up
*/
if(p->hanguponpolarityswitch &&
(p->polarityonanswerdelay > 0) &&
(ast->_state == AST_STATE_UP)) {
struct timeval tv;
gettimeofday(&tv, NULL);
if((((tv.tv_sec - p->polaritydelaytv.tv_sec) * 1000) + ((tv.tv_usec - p->polaritydelaytv.tv_usec)/1000)) > p->polarityonanswerdelay) {
ast_log(LOG_DEBUG, "Hangup due to Reverse Polarity on channel %d\n", p->channel);
ast_softhangup(p->owner, AST_SOFTHANGUP_EXPLICIT);
} else {
ast_log(LOG_DEBUG, "Ignore Reverse Polarity (too close to answer event) on channel %d, state %d\n", p->channel, ast->_state);
}
} else {
ast_log(LOG_DEBUG, "Ignore Reverse Polarity on channel %d, state %d\n", p->channel, ast->_state);
}
break;
default:
ast_log(LOG_DEBUG, "Dunno what to do with event %d on channel %d\n", res, p->channel);
}
@ -6589,6 +6626,9 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
if (si.alarms) tmp->inalarm = 1;
}
tmp->polarityonanswerdelay = polarityonanswerdelay;
tmp->hanguponpolarityswitch = hanguponpolarityswitch;
}
if (tmp && !here) {
/* nothing on the iflist */
@ -9711,6 +9751,10 @@ static int setup_zap(int reload)
cur_rxflash = atoi(v->value);
} else if (!strcasecmp(v->name, "debounce")) {
cur_debounce = atoi(v->value);
} else if (!strcasecmp(v->name, "polarityonanswerdelay")) {
polarityonanswerdelay = atoi(v->value);
} else if (!strcasecmp(v->name, "hanguponpolarityswitch")) {
hanguponpolarityswitch = ast_true(v->value);
}
} else
ast_log(LOG_WARNING, "Ignoring %s\n", v->name);

View File

@ -310,6 +310,12 @@ immediate=no
;
;busycount=4
;
; In some countries, a polarity reversal is used to signal the disconnect
; of a phone line. If the hanguponpolarityswitch option is selected, the
; call will be considered "hung up" on a polarity reversal
;
;hanguponpolarityswitch
;
; On trunk interfaces (FXS) it can be useful to attempt to follow the progress
; of a call through RINGING, BUSY, and ANSWERING. If turned on, call
; progress attempts to determine answer, busy, and ringing on phone lines.