[asterisk-commits] rmudgett: branch rmudgett/align_analog r295513 - /team/rmudgett/align_analog/...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Nov 18 19:39:43 CST 2010
Author: rmudgett
Date: Thu Nov 18 19:39:38 2010
New Revision: 295513
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=295513
Log:
Misc items to bring sig_analog extraction into alignment with chan_dahdi.
* Restore SMDI support that got lost.
* Fixed initial value of struct analog_pvt.use_callerid. It may get
forced on depending upon other config options.
* Removed unused struct analog_pvt.usedistinctiveringdetection.
* Rename several function's index variable to idx.
* Some formatting tweaks.
Modified:
team/rmudgett/align_analog/channels/chan_dahdi.c
team/rmudgett/align_analog/channels/sig_analog.c
team/rmudgett/align_analog/channels/sig_analog.h
Modified: team/rmudgett/align_analog/channels/chan_dahdi.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/align_analog/channels/chan_dahdi.c?view=diff&rev=295513&r1=295512&r2=295513
==============================================================================
--- team/rmudgett/align_analog/channels/chan_dahdi.c (original)
+++ team/rmudgett/align_analog/channels/chan_dahdi.c Thu Nov 18 19:39:38 2010
@@ -955,7 +955,7 @@
*/
unsigned int use_smdi:1;
struct mwisend_info mwisend_data;
- /*! \brief The serial port to listen for SMDI data on */
+ /*! \brief The SMDI interface to get SMDI messages from. */
struct ast_smdi_interface *smdi_iface;
/*! \brief Distinctive Ring data */
@@ -12589,7 +12589,9 @@
analog_p->threewaycalling = conf->chan.threewaycalling;
analog_p->transfer = conf->chan.transfer;
analog_p->transfertobusy = conf->chan.transfertobusy;
- analog_p->use_callerid = conf->chan.use_callerid;
+ analog_p->use_callerid = tmp->use_callerid;
+ analog_p->use_smdi = tmp->use_smdi;
+ analog_p->smdi_iface = tmp->smdi_iface;
analog_p->outsigmod = ANALOG_SIG_NONE;
analog_p->echotraining = conf->chan.echotraining;
analog_p->cid_signalling = conf->chan.cid_signalling;
@@ -12609,7 +12611,6 @@
break;
}
analog_p->callwaitingcallerid = conf->chan.callwaitingcallerid;
- analog_p->usedistinctiveringdetection = conf->chan.usedistinctiveringdetection;
analog_p->ringt = conf->chan.ringt;
analog_p->ringt_base = ringt_base;
analog_p->chan_tech = &dahdi_tech;
Modified: team/rmudgett/align_analog/channels/sig_analog.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/align_analog/channels/sig_analog.c?view=diff&rev=295513&r1=295512&r2=295513
==============================================================================
--- team/rmudgett/align_analog/channels/sig_analog.c (original)
+++ team/rmudgett/align_analog/channels/sig_analog.c Thu Nov 18 19:39:38 2010
@@ -1566,21 +1566,22 @@
}
}
-void analog_handle_dtmfup(struct analog_pvt *p, struct ast_channel *ast, enum analog_sub index, struct ast_frame **dest)
+void analog_handle_dtmfup(struct analog_pvt *p, struct ast_channel *ast, enum analog_sub idx, struct ast_frame **dest)
{
struct ast_frame *f = *dest;
+
+ ast_debug(1, "DTMF digit: %c on %s\n", f->subclass.integer, ast->name);
if (analog_check_confirmanswer(p)) {
ast_debug(1, "Confirm answer on %s!\n", ast->name);
/* Upon receiving a DTMF digit, consider this an answer confirmation instead
of a DTMF digit */
- p->subs[index].f.frametype = AST_FRAME_CONTROL;
- p->subs[index].f.subclass.integer = AST_CONTROL_ANSWER;
- *dest = &p->subs[index].f;
+ p->subs[idx].f.frametype = AST_FRAME_CONTROL;
+ p->subs[idx].f.subclass.integer = AST_CONTROL_ANSWER;
+ *dest = &p->subs[idx].f;
/* Reset confirmanswer so DTMF's will behave properly for the duration of the call */
analog_set_confirmanswer(p, 0);
- }
- if (p->callwaitcas) {
+ } else if (p->callwaitcas) {
if ((f->subclass.integer == 'A') || (f->subclass.integer == 'D')) {
ast_debug(1, "Got some DTMF, but it's for the CAS\n");
p->caller.id.name.str = p->callwait_name;
@@ -1589,11 +1590,11 @@
}
if (analog_handles_digit(f))
p->callwaitcas = 0;
- p->subs[index].f.frametype = AST_FRAME_NULL;
- p->subs[index].f.subclass.integer = 0;
- *dest = &p->subs[index].f;
+ p->subs[idx].f.frametype = AST_FRAME_NULL;
+ p->subs[idx].f.subclass.integer = 0;
+ *dest = &p->subs[idx].f;
} else {
- analog_cb_handle_dtmfup(p, ast, index, dest);
+ analog_cb_handle_dtmfup(p, ast, idx, dest);
}
}
@@ -1691,6 +1692,7 @@
struct callerid_state *cs = NULL;
char *name = NULL, *number = NULL;
int flags = 0;
+ struct ast_smdi_md_message *smdi_msg = NULL;
int timeout;
int getforward = 0;
char *s1, *s2;
@@ -1745,6 +1747,7 @@
analog_dsp_reset_and_flush_digits(p);
+ /* set digit mode appropriately */
if (ANALOG_NEED_MFDETECT(p)) {
analog_dsp_set_digitmode(p, ANALOG_DIGITMODE_MF);
} else {
@@ -2047,6 +2050,7 @@
ast_hangup(chan);
goto quit;
} else if (res) {
+ ast_debug(1,"waitfordigit returned '%c' (%d), timeout = %d\n", res, res, timeout);
exten[len++]=res;
exten[len] = '\0';
}
@@ -2285,12 +2289,29 @@
case ANALOG_SIG_FXSGS:
case ANALOG_SIG_FXSKS:
/* check for SMDI messages */
- /* BUGBUG where did SMDI code go? */
+ if (p->use_smdi && p->smdi_iface) {
+ smdi_msg = ast_smdi_md_message_wait(p->smdi_iface, ANALOG_SMDI_MD_WAIT_TIMEOUT);
+ if (smdi_msg != NULL) {
+ ast_copy_string(chan->exten, smdi_msg->fwd_st, sizeof(chan->exten));
+
+ if (smdi_msg->type == 'B')
+ pbx_builtin_setvar_helper(chan, "_SMDI_VM_TYPE", "b");
+ else if (smdi_msg->type == 'N')
+ pbx_builtin_setvar_helper(chan, "_SMDI_VM_TYPE", "u");
+
+ ast_debug(1, "Received SMDI message on %s\n", chan->name);
+ } else {
+ ast_log(LOG_WARNING, "SMDI enabled but no SMDI message present\n");
+ }
+ }
+
+ if (p->use_callerid && (p->cid_signalling == CID_SIG_SMDI && smdi_msg)) {
+ number = smdi_msg->calling_st;
/* 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... */
- if (p->use_callerid && (chan->_state == AST_STATE_PRERING
+ } else if (p->use_callerid && (chan->_state == AST_STATE_PRERING
&& (p->cid_start == ANALOG_CID_START_POLARITY
|| p->cid_start == ANALOG_CID_START_POLARITY_IN
|| p->cid_start == ANALOG_CID_START_DTMF_NOALERT))) {
@@ -2543,6 +2564,9 @@
}
ast_hangup(chan);
quit:
+ if (smdi_msg) {
+ ASTOBJ_UNREF(smdi_msg, ast_smdi_md_message_destroy);
+ }
analog_decrease_ss_count(p);
return NULL;
}
Modified: team/rmudgett/align_analog/channels/sig_analog.h
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/align_analog/channels/sig_analog.h?view=diff&rev=295513&r1=295512&r2=295513
==============================================================================
--- team/rmudgett/align_analog/channels/sig_analog.h (original)
+++ team/rmudgett/align_analog/channels/sig_analog.h Thu Nov 18 19:39:38 2010
@@ -27,7 +27,9 @@
#include "asterisk/channel.h"
#include "asterisk/frame.h"
-
+#include "asterisk/smdi.h"
+
+#define ANALOG_SMDI_MD_WAIT_TIMEOUT 1500 /* 1.5 seconds */
#define ANALOG_MAX_CID 300
#define READ_SIZE 160
#define RING_PATTERNS 3
@@ -276,13 +278,13 @@
unsigned int transfertobusy:1; /*!< allow flash-transfers to busy channels */
unsigned int use_callerid:1; /*!< Whether or not to use caller id on this channel */
unsigned int callwaitingcallerid:1;
+ /*!
+ * \brief TRUE if SMDI (Simplified Message Desk Interface) is enabled
+ */
+ unsigned int use_smdi:1;
+ /*! \brief The SMDI interface to get SMDI messages from. */
+ struct ast_smdi_interface *smdi_iface;
const struct ast_channel_tech *chan_tech;
- /*!
- * \brief TRUE if distinctive rings are to be detected.
- * \note For FXO lines
- * \note Set indirectly from the "usedistinctiveringdetection" value read in from chan_dahdi.conf
- */
- unsigned int usedistinctiveringdetection:1;
/* Not used for anything but log messages. Could be just the TCID */
int channel; /*!< Channel Number */
More information about the asterisk-commits
mailing list