From 7321b86adf4166343bcc2cf04c5d2c56dc5e4b58 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 18 Jun 2007 21:32:56 +0000 Subject: [PATCH] update analog git-svn-id: http://svn.openzap.org/svn/openzap/trunk@273 a93c3328-9c30-0410-af19-c9cd2b2d52af --- libs/openzap/src/include/openzap.h | 1 + libs/openzap/src/include/zap_types.h | 9 ++++ libs/openzap/src/include/zap_zt.h | 43 +++++++++---------- libs/openzap/src/zap_analog.c | 2 +- libs/openzap/src/zap_io.c | 39 ++++++++++++++--- libs/openzap/src/zap_wanpipe.c | 2 + libs/openzap/src/zap_zt.c | 62 ++++++++++++++++++++++++++++ 7 files changed, 131 insertions(+), 27 deletions(-) diff --git a/libs/openzap/src/include/openzap.h b/libs/openzap/src/include/openzap.h index afbf11fbc9..4bf1979e46 100644 --- a/libs/openzap/src/include/openzap.h +++ b/libs/openzap/src/include/openzap.h @@ -386,6 +386,7 @@ struct zap_span { zio_event_cb_t event_callback; zap_mutex_t *mutex; zap_trunk_type_t trunk_type; + zap_analog_start_type_t start_type; zap_signal_type_t signal_type; struct zap_isdn_data *isdn_data; struct zap_analog_data *analog_data; diff --git a/libs/openzap/src/include/zap_types.h b/libs/openzap/src/include/zap_types.h index 613e1f6e98..1e27cf9a80 100644 --- a/libs/openzap/src/include/zap_types.h +++ b/libs/openzap/src/include/zap_types.h @@ -119,6 +119,15 @@ typedef enum { #define TRUNK_STRINGS "E1", "T1", "J1", "BRI", "FXO", "FXS", "NONE" ZAP_STR2ENUM_P(zap_str2zap_trunk_type, zap_trunk_type2str, zap_trunk_type_t) +typedef enum { + ZAP_ANALOG_START_KEWL, + ZAP_ANALOG_START_LOOP, + ZAP_ANALOG_START_GROUND, + ZAP_ANALOG_START_INVALID +} zap_analog_start_type_t; +#define START_TYPE_STRINGS "KEWL", "LOOP", "GROUND", "INVALID" +ZAP_STR2ENUM_P(zap_str2zap_analog_start_type, zap_analog_start_type2str, zap_analog_start_type_t) + typedef enum { ZAP_OOB_DTMF, ZAP_OOB_ONHOOK, diff --git a/libs/openzap/src/include/zap_zt.h b/libs/openzap/src/include/zap_zt.h index d26a9813b8..35d9cd8d23 100644 --- a/libs/openzap/src/include/zap_zt.h +++ b/libs/openzap/src/include/zap_zt.h @@ -110,26 +110,26 @@ struct zt_maintinfo { int span_no; /* span number */ int command; /* Maintenance mode to set (from zt_maintenance_mode_t) */ }; - -struct zt_lineconfig { -/* Used in ZT_SPANCONFIG */ - int span; /* Which span number (0 to use name) */ - char name[20]; /* Name of span to use */ - int lbo; /* line build-outs */ - int lineconfig; /* line config parameters (framing, coding) */ - int sync; /* what level of sync source we are */ -} - -struct zt_chanconfig { -/* Used in ZT_CHANCONFIG */ - int chan; /* Channel we're applying this to (0 to use name) */ - char name[40]; /* Name of channel to use */ - int sigtype; /* Signal type */ - int deflaw; /* Default law (ZT_LAW_DEFAULT, ZT_LAW_MULAW, or ZT_LAW_ALAW */ - int master; /* Master channel if sigtype is ZT_SLAVE */ - int idlebits; /* Idle bits (if this is a CAS channel) or channel to monitor (if this is DACS channel) */ - char netdev_name[16]; /* name for the hdlc network device */ -} + +struct zt_lineconfig { +/* Used in ZT_SPANCONFIG */ + int span; /* Which span number (0 to use name) */ + char name[20]; /* Name of span to use */ + int lbo; /* line build-outs */ + int lineconfig; /* line config parameters (framing, coding) */ + int sync; /* what level of sync source we are */ +}; + +struct zt_chanconfig { +/* Used in ZT_CHANCONFIG */ + int chan; /* Channel we're applying this to (0 to use name) */ + char name[40]; /* Name of channel to use */ + int sigtype; /* Signal type */ + int deflaw; /* Default law (ZT_LAW_DEFAULT, ZT_LAW_MULAW, or ZT_LAW_ALAW */ + int master; /* Master channel if sigtype is ZT_SLAVE */ + int idlebits; /* Idle bits (if this is a CAS channel) or channel to monitor (if this is DACS channel) */ + char netdev_name[16]; /* name for the hdlc network device */ +}; /* Enumerations */ @@ -238,7 +238,8 @@ ZT_SIG_EM = (1 << 6) /* E&M */ #define ZT_GETGAINS _IOWR (ZT_CODE, 16, struct zt_gains) /* Get Channel audio gains */ #define ZT_SETGAINS _IOWR (ZT_CODE, 17, struct zt_gains) /* Set Channel audio gains */ - +#define ZT_SPANCONFIG _IOW (ZT_CODE, 18, struct zt_lineconfig) /*Set Line (T1) Configurations and start system */ +#define ZT_CHANCONFIG _IOW (ZT_CODE, 19, struct zt_chanconfig) /* Set Channel Configuration */ #define ZT_AUDIOMODE _IOW (ZT_CODE, 32, int) /* Set a clear channel into audio mode */ #define ZT_ECHOCANCEL _IOW (ZT_CODE, 33, int) /* Control Echo Canceller */ #define ZT_HDLCRAWMODE _IOW (ZT_CODE, 36, int) /* Set a clear channel into HDLC w/out FCS checking/calculation mode */ diff --git a/libs/openzap/src/zap_analog.c b/libs/openzap/src/zap_analog.c index 91f982a2f4..672885ecee 100644 --- a/libs/openzap/src/zap_analog.c +++ b/libs/openzap/src/zap_analog.c @@ -44,6 +44,7 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj); static ZIO_CHANNEL_OUTGOING_CALL_FUNCTION(analog_fxo_outgoing_call) { if (!zap_test_flag(zchan, ZAP_CHANNEL_OFFHOOK) && !zap_test_flag(zchan, ZAP_CHANNEL_INTHREAD)) { + //zap_channel_command(zchan, ZAP_COMMAND_TRACE_INPUT, "/tmp/inbound.ul"); zap_channel_command(zchan, ZAP_COMMAND_OFFHOOK, NULL); zap_channel_command(zchan, ZAP_COMMAND_ENABLE_PROGRESS_DETECT, NULL); zchan->needed_tones[ZAP_TONEMAP_DIAL] = 1; @@ -424,7 +425,6 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj) case ZAP_CHANNEL_STATE_GENRING: { send_caller_id(chan); - //zap_channel_command(chan, ZAP_COMMAND_TRACE_OUTPUT, "/tmp/outbound.ul"); zap_channel_command(chan, ZAP_COMMAND_GENERATE_RING_ON, NULL); } break; diff --git a/libs/openzap/src/zap_io.c b/libs/openzap/src/zap_io.c index 2545e70724..8009cf536d 100644 --- a/libs/openzap/src/zap_io.c +++ b/libs/openzap/src/zap_io.c @@ -95,6 +95,9 @@ ZAP_STR2ENUM(zap_str2zap_oob_event, zap_oob_event2str, zap_oob_event_t, OOB_NAME ZAP_ENUM_NAMES(TRUNK_TYPE_NAMES, TRUNK_STRINGS) ZAP_STR2ENUM(zap_str2zap_trunk_type, zap_trunk_type2str, zap_trunk_type_t, TRUNK_TYPE_NAMES, ZAP_TRUNK_NONE) +ZAP_ENUM_NAMES(START_TYPE_NAMES, START_TYPE_STRINGS) +ZAP_STR2ENUM(zap_str2zap_analog_start_type, zap_analog_start_type2str, zap_analog_start_type_t, START_TYPE_NAMES, ZAP_ANALOG_START_INVALID) + ZAP_ENUM_NAMES(SIGNAL_NAMES, SIGNAL_STRINGS) ZAP_STR2ENUM(zap_str2zap_signal_event, zap_signal_event2str, zap_signal_event_t, SIGNAL_NAMES, ZAP_SIGEVENT_INVALID) @@ -1719,10 +1722,23 @@ static zap_status_t load_config(void) } else { zap_copy_string(number, val, sizeof(number)); } - } else if (!strcasecmp(var, "fxo-channel")) { + } else if (!strncasecmp(var, "fxo-channel", 11)) { if (span->trunk_type == ZAP_TRUNK_NONE) { - span->trunk_type = ZAP_TRUNK_FXO; - zap_log(ZAP_LOG_DEBUG, "setting trunk type to '%s'\n", zap_trunk_type2str(span->trunk_type)); + char *stype = var + 11; + zap_analog_start_type_t tmp, start_type = ZAP_ANALOG_START_KEWL; + + span->trunk_type = ZAP_TRUNK_FXO; + if (stype) { + while(*stype == '-') stype++; + if ((tmp = zap_str2zap_analog_start_type(stype)) != ZAP_ANALOG_START_INVALID) { + start_type = tmp; + } + + } + + span->start_type = start_type; + zap_log(ZAP_LOG_DEBUG, "setting trunk type to '%s' (%s)\n", zap_trunk_type2str(span->trunk_type), + zap_analog_start_type2str(start_type)); } if (span->trunk_type == ZAP_TRUNK_FXO) { configured += zio->configure_span(span, val, ZAP_CHAN_TYPE_FXO, name, number); @@ -1731,8 +1747,21 @@ static zap_status_t load_config(void) } } else if (!strcasecmp(var, "fxs-channel")) { if (span->trunk_type == ZAP_TRUNK_NONE) { - span->trunk_type = ZAP_TRUNK_FXS; - zap_log(ZAP_LOG_DEBUG, "setting trunk type to '%s'\n", zap_trunk_type2str(span->trunk_type)); + char *stype = var + 11; + zap_analog_start_type_t tmp, start_type = ZAP_ANALOG_START_KEWL; + + span->trunk_type = ZAP_TRUNK_FXS; + if (stype) { + while(*stype == '-') stype++; + if ((tmp = zap_str2zap_analog_start_type(stype)) != ZAP_ANALOG_START_INVALID) { + start_type = tmp; + } + + } + + span->start_type = start_type; + zap_log(ZAP_LOG_DEBUG, "setting trunk type to '%s' (%s)\n", zap_trunk_type2str(span->trunk_type), + zap_analog_start_type2str(start_type)); } if (span->trunk_type == ZAP_TRUNK_FXS) { configured += zio->configure_span(span, val, ZAP_CHAN_TYPE_FXS, name, number); diff --git a/libs/openzap/src/zap_wanpipe.c b/libs/openzap/src/zap_wanpipe.c index ea34579d78..229cd600f0 100644 --- a/libs/openzap/src/zap_wanpipe.c +++ b/libs/openzap/src/zap_wanpipe.c @@ -801,12 +801,14 @@ ZIO_SPAN_NEXT_EVENT_FUNCTION(wanpipe_next_event) break; case WP_TDMAPI_EVENT_RING_DETECT: { + printf("you fucking suck: ring\n"); event_id = tdm_api.wp_tdm_cmd.event.wp_tdm_api_event_ring_state & WP_TDMAPI_EVENT_RING_PRESENT ? ZAP_OOB_RING_START : ZAP_OOB_RING_STOP; } break; case WP_TDMAPI_EVENT_RING_TRIP_DETECT: { + printf("you fucking suck: trip\n"); event_id = tdm_api.wp_tdm_cmd.event.wp_tdm_api_event_ring_state & WP_TDMAPI_EVENT_RING_PRESENT ? ZAP_OOB_ONHOOK : ZAP_OOB_OFFHOOK; } diff --git a/libs/openzap/src/zap_zt.c b/libs/openzap/src/zap_zt.c index 90f310fc92..3461721440 100644 --- a/libs/openzap/src/zap_zt.c +++ b/libs/openzap/src/zap_zt.c @@ -48,8 +48,16 @@ static struct { static unsigned zt_open_range(zap_span_t *span, unsigned start, unsigned end, zap_chan_type_t type, char *name, char *number) { unsigned configured = 0, x; + const char ctlpath[] = "/dev/zap/ctl"; char path[128] = ""; zt_params_t ztp; + zap_socket_t ctlfd = ZT_INVALID_SOCKET; + + + if ((ctlfd = open(ctlpath, O_RDWR)) < 0) { + zap_log(ZAP_LOG_ERROR, "Cannot open control device\n"); + return 0; + } memset(&ztp, 0, sizeof(ztp)); @@ -62,6 +70,56 @@ static unsigned zt_open_range(zap_span_t *span, unsigned start, unsigned end, za sockfd = open(path, O_RDWR); if (sockfd != ZT_INVALID_SOCKET && zap_span_add_channel(span, sockfd, type, &chan) == ZAP_SUCCESS) { + if (type == ZAP_CHAN_TYPE_FXS || type == ZAP_CHAN_TYPE_FXO) { + struct zt_chanconfig cc; + memset(&cc, 0, sizeof(cc)); + cc.chan = cc.master = x; + switch(type) { + case ZAP_CHAN_TYPE_FXS: + { + switch(span->start_type) { + case ZAP_ANALOG_START_KEWL: + cc.sigtype = ZT_SIG_FXOKS; + break; + case ZAP_ANALOG_START_LOOP: + cc.sigtype = ZT_SIG_FXOLS; + break; + case ZAP_ANALOG_START_GROUND: + cc.sigtype = ZT_SIG_FXOGS; + break; + default: + break; + } + } + break; + case ZAP_CHAN_TYPE_FXO: + { + switch(span->start_type) { + case ZAP_ANALOG_START_KEWL: + cc.sigtype = ZT_SIG_FXSKS; + break; + case ZAP_ANALOG_START_LOOP: + cc.sigtype = ZT_SIG_FXSLS; + break; + case ZAP_ANALOG_START_GROUND: + cc.sigtype = ZT_SIG_FXSGS; + break; + default: + break; + } + } + break; + default: + break; + } + if (ioctl(ctlfd, ZT_CHANCONFIG, &cc)) { + zap_log(ZAP_LOG_INFO, "failure configuring device %s chan %d fd %d (%s)\n", + path, x, ctlfd, strerror(errno)); + close(sockfd); + break; + } + } + len = zt_globals.eclevel; if (ioctl(chan->sockfd, ZT_ECHOCANCEL, &len)) { zap_log(ZAP_LOG_INFO, "failure configuring device %s as OpenZAP device %d:%d fd:%d err:%s\n", @@ -92,6 +150,8 @@ static unsigned zt_open_range(zap_span_t *span, unsigned start, unsigned end, za } zap_log(ZAP_LOG_INFO, "configuring device %s as OpenZAP device %d:%d fd:%d\n", path, chan->span_id, chan->chan_id, sockfd); + + chan->rate = 8000; chan->physical_span_id = ztp.span_no; chan->physical_chan_id = ztp.chan_no; @@ -125,6 +185,8 @@ static unsigned zt_open_range(zap_span_t *span, unsigned start, unsigned end, za } } + close(ctlfd); + return configured; }