提交 f57c33f1 authored 作者: Moises Silva's avatar Moises Silva

OPENZAP-112 --resolve

上级 8ea3cbd5
...@@ -75,6 +75,11 @@ with the signaling protocols that you can run on top of your I/O interfaces. ...@@ -75,6 +75,11 @@ with the signaling protocols that you can run on top of your I/O interfaces.
<param name="polarity-delay" value="600"/> <param name="polarity-delay" value="600"/>
--> -->
<!-- Retrieve caller id on polarity reverse -->
<!--
<param name="polarity-callerid" value="true"/>
-->
<!-- regex to stop dialing when it matches --> <!-- regex to stop dialing when it matches -->
<!--<param name="dial-regex" value="5555"/>--> <!--<param name="dial-regex" value="5555"/>-->
......
...@@ -3021,6 +3021,7 @@ static switch_status_t load_config(void) ...@@ -3021,6 +3021,7 @@ static switch_status_t load_config(void)
const char *enable_callerid = "true"; const char *enable_callerid = "true";
const char *answer_polarity = "false"; const char *answer_polarity = "false";
const char *hangup_polarity = "false"; const char *hangup_polarity = "false";
const char *polarity_callerid = "false";
int polarity_delay = 600; int polarity_delay = 600;
int callwaiting = 1; int callwaiting = 1;
int dialtone_timeout = 5000; int dialtone_timeout = 5000;
...@@ -3102,6 +3103,8 @@ static switch_status_t load_config(void) ...@@ -3102,6 +3103,8 @@ static switch_status_t load_config(void)
hangup_polarity = val; hangup_polarity = val;
} else if (!strcasecmp(var, "polarity-delay")) { } else if (!strcasecmp(var, "polarity-delay")) {
polarity_delay = atoi(val); polarity_delay = atoi(val);
} else if (!strcasecmp(var, "polarity-callerid")) {
polarity_callerid = val;
} else if (!strcasecmp(var, "fail-dial-regex")) { } else if (!strcasecmp(var, "fail-dial-regex")) {
fail_dial_regex = val; fail_dial_regex = val;
} else if (!strcasecmp(var, "hold-music")) { } else if (!strcasecmp(var, "hold-music")) {
...@@ -3164,6 +3167,7 @@ static switch_status_t load_config(void) ...@@ -3164,6 +3167,7 @@ static switch_status_t load_config(void)
"enable_callerid", enable_callerid, "enable_callerid", enable_callerid,
"answer_polarity_reverse", answer_polarity, "answer_polarity_reverse", answer_polarity,
"hangup_polarity_reverse", hangup_polarity, "hangup_polarity_reverse", hangup_polarity,
"polarity_callerid", polarity_callerid,
"polarity_delay", &polarity_delay, "polarity_delay", &polarity_delay,
"callwaiting", &callwaiting, "callwaiting", &callwaiting,
"wait_dialtone_timeout", &dialtone_timeout, "wait_dialtone_timeout", &dialtone_timeout,
......
...@@ -39,7 +39,8 @@ typedef enum { ...@@ -39,7 +39,8 @@ typedef enum {
FTDM_ANALOG_RUNNING = (1 << 0), FTDM_ANALOG_RUNNING = (1 << 0),
FTDM_ANALOG_CALLERID = (1 << 1), FTDM_ANALOG_CALLERID = (1 << 1),
FTDM_ANALOG_ANSWER_POLARITY_REVERSE = (1 << 2), FTDM_ANALOG_ANSWER_POLARITY_REVERSE = (1 << 2),
FTDM_ANALOG_HANGUP_POLARITY_REVERSE = (1 << 3) FTDM_ANALOG_HANGUP_POLARITY_REVERSE = (1 << 3),
FTDM_ANALOG_POLARITY_CALLERID = (1 << 4)
} ftdm_analog_flag_t; } ftdm_analog_flag_t;
#define FTDM_MAX_HOTLINE_STR 20 #define FTDM_MAX_HOTLINE_STR 20
......
...@@ -275,6 +275,15 @@ static FIO_SIG_CONFIGURE_FUNCTION(ftdm_analog_configure_span) ...@@ -275,6 +275,15 @@ static FIO_SIG_CONFIGURE_FUNCTION(ftdm_analog_configure_span)
break; break;
} }
hotline = val; hotline = val;
} else if (!strcasecmp(var, "polarity_callerid")) {
if (!(val = va_arg(ap, char *))) {
break;
}
if (ftdm_true(val)) {
flags |= FTDM_ANALOG_POLARITY_CALLERID;
} else {
flags &= ~FTDM_ANALOG_POLARITY_CALLERID;
}
} else { } else {
ftdm_log(FTDM_LOG_ERROR, "Unknown parameter %s in span %s\n", var, span->name); ftdm_log(FTDM_LOG_ERROR, "Unknown parameter %s in span %s\n", var, span->name);
} }
...@@ -1130,8 +1139,18 @@ static __inline__ ftdm_status_t process_event(ftdm_span_t *span, ftdm_event_t *e ...@@ -1130,8 +1139,18 @@ static __inline__ ftdm_status_t process_event(ftdm_span_t *span, ftdm_event_t *e
break; break;
} }
if (event->channel->state == FTDM_CHANNEL_STATE_DOWN) { if (event->channel->state == FTDM_CHANNEL_STATE_DOWN) {
ftdm_log_chan_msg(event->channel, FTDM_LOG_DEBUG, if (ftdm_test_flag(analog_data, FTDM_ANALOG_CALLERID)
"Ignoring polarity reversal because this channel is down\n"); && ftdm_test_flag(analog_data, FTDM_ANALOG_POLARITY_CALLERID)) {
ftdm_log_chan_msg(event->channel, "Polarity reversal detected while down, getting caller id now\n");
ftdm_set_state(event->channel, FTDM_CHANNEL_STATE_GET_CALLERID);
event->channel->ring_count = 1;
ftdm_mutex_unlock(event->channel->mutex);
locked = 0;
ftdm_thread_create_detached(ftdm_analog_channel_run);
} else {
ftdm_log_chan_msg(event->channel, FTDM_LOG_DEBUG,
"Ignoring polarity reversal because this channel is down\n");
}
break; break;
} }
/* we have a good channel, set the polarity flag and let the channel thread deal with it */ /* we have a good channel, set the polarity flag and let the channel thread deal with it */
......
...@@ -29,6 +29,12 @@ ...@@ -29,6 +29,12 @@
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Contributors:
*
* Moises Silva <moy@sangoma.com>
* W McRoberts <fs@whmcr.com>
*
*/ */
#include "private/ftdm_core.h" #include "private/ftdm_core.h"
...@@ -94,6 +100,7 @@ struct ioctl_codes { ...@@ -94,6 +100,7 @@ struct ioctl_codes {
ioctlcmd ECHOTRAIN; ioctlcmd ECHOTRAIN;
ioctlcmd SETTXBITS; ioctlcmd SETTXBITS;
ioctlcmd GETRXBITS; ioctlcmd GETRXBITS;
ioctlcmd SETPOLARITY;
}; };
/** /**
...@@ -169,7 +176,8 @@ static struct ioctl_codes dahdi_ioctl_codes = { ...@@ -169,7 +176,8 @@ static struct ioctl_codes dahdi_ioctl_codes = {
.GETCONFMUTE = DAHDI_GETCONFMUTE, .GETCONFMUTE = DAHDI_GETCONFMUTE,
.ECHOTRAIN = DAHDI_ECHOTRAIN, .ECHOTRAIN = DAHDI_ECHOTRAIN,
.SETTXBITS = DAHDI_SETTXBITS, .SETTXBITS = DAHDI_SETTXBITS,
.GETRXBITS = DAHDI_GETRXBITS .GETRXBITS = DAHDI_GETRXBITS,
.SETPOLARITY = DAHDI_SETPOLARITY
}; };
#define ZT_INVALID_SOCKET -1 #define ZT_INVALID_SOCKET -1
...@@ -826,6 +834,15 @@ static FIO_COMMAND_FUNCTION(zt_command) ...@@ -826,6 +834,15 @@ static FIO_COMMAND_FUNCTION(zt_command)
err = ioctl(ftdmchan->sockfd, codes.FLUSH, &flushmode); err = ioctl(ftdmchan->sockfd, codes.FLUSH, &flushmode);
} }
break; break;
case FTDM_COMMAND_SET_POLARITY:
{
ftdm_polarity_t polarity = FTDM_COMMAND_OBJ_INT;
err = ioctl(ftdmchan->sockfd, codes.SETPOLARITY, polarity);
if (!err) {
ftdmchan->polarity = polarity;
}
}
break;
case FTDM_COMMAND_FLUSH_RX_BUFFERS: case FTDM_COMMAND_FLUSH_RX_BUFFERS:
{ {
int flushmode = ZT_FLUSH_READ; int flushmode = ZT_FLUSH_READ;
...@@ -1088,6 +1105,12 @@ static __inline__ ftdm_status_t zt_channel_process_event(ftdm_channel_t *fchan, ...@@ -1088,6 +1105,12 @@ static __inline__ ftdm_status_t zt_channel_process_event(ftdm_channel_t *fchan,
*event_id = FTDM_OOB_NOOP; /* What else could we do? */ *event_id = FTDM_OOB_NOOP; /* What else could we do? */
} }
break; break;
case ZT_EVENT_POLARITY:
{
ftdm_log_chan_msg(fchan, FTDM_LOG_ERROR, "Got polarity reverse (ZT_EVENT_POLARITY)\n");
*event_id = FTDM_OOB_POLARITY_REVERSE;
}
break;
case ZT_EVENT_NONE: case ZT_EVENT_NONE:
{ {
ftdm_log_chan_msg(fchan, FTDM_LOG_DEBUG, "No event\n"); ftdm_log_chan_msg(fchan, FTDM_LOG_DEBUG, "No event\n");
......
...@@ -29,6 +29,12 @@ ...@@ -29,6 +29,12 @@
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Contributors:
*
* Moises Silva <moy@sangoma.com>
* W McRoberts <fs@whmcr.com>
*
*/ */
#ifndef FTDM_ZT_H #ifndef FTDM_ZT_H
...@@ -349,6 +355,7 @@ ZT_ABIT = 8 ...@@ -349,6 +355,7 @@ ZT_ABIT = 8
#define DAHDI_SETTXBITS _IOW (DAHDI_CODE, 43, int) #define DAHDI_SETTXBITS _IOW (DAHDI_CODE, 43, int)
#define DAHDI_GETRXBITS _IOR (DAHDI_CODE, 43, int) #define DAHDI_GETRXBITS _IOR (DAHDI_CODE, 43, int)
#define DAHDI_SETPOLARITY _IOW (DAHDI_CODE, 92, int) /* Polarity setting for FXO lines */
#endif #endif
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论