<p>George Joseph <strong>submitted</strong> this change.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/18800">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Kevin Harwell: Looks good to me, but someone else must approve
  George Joseph: Looks good to me, approved; Approved for Submit

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">chan_dahdi: Add POLARITY function.<br><br>Adds a POLARITY function which can be used to<br>retrieve the current polarity of an FXS channel<br>as well as set the polarity of an FXS channel<br>to idle or reverse at any point during a call.<br><br>ASTERISK-30000 #close<br><br>Change-Id: If6f50998f723e4484bf68e2473f5cedfeaf9b8f1<br>---<br>M channels/chan_dahdi.c<br>A doc/CHANGES-staging/chan_dahdi_polarity.txt<br>2 files changed, 118 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c</span><br><span>index 38290b0..55a0090 100644</span><br><span>--- a/channels/chan_dahdi.c</span><br><span>+++ b/channels/chan_dahdi.c</span><br><span>@@ -177,6 +177,35 @@</span><br><span>                       <para>This application will Accept the R2 call either with charge or no charge.</para></span><br><span>           </description></span><br><span>         </application></span><br><span style="color: hsl(120, 100%, 40%);">+  <function name="POLARITY" language="en_US"></span><br><span style="color: hsl(120, 100%, 40%);">+         <synopsis></span><br><span style="color: hsl(120, 100%, 40%);">+                      Set or get the polarity of a DAHDI channel.</span><br><span style="color: hsl(120, 100%, 40%);">+           </synopsis></span><br><span style="color: hsl(120, 100%, 40%);">+             <syntax /></span><br><span style="color: hsl(120, 100%, 40%);">+              <description></span><br><span style="color: hsl(120, 100%, 40%);">+                   <para>The POLARITY function can be used to set the polarity of a DAHDI channel.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                    <para>Applies only to FXS channels (using FXO signalling) with supporting hardware.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                        <para>The polarity can be set to the following numeric or named values:</para></span><br><span style="color: hsl(120, 100%, 40%);">+                    <enumlist></span><br><span style="color: hsl(120, 100%, 40%);">+                              <enum name="0" /></span><br><span style="color: hsl(120, 100%, 40%);">+                             <enum name="idle" /></span><br><span style="color: hsl(120, 100%, 40%);">+                          <enum name="1" /></span><br><span style="color: hsl(120, 100%, 40%);">+                             <enum name="reverse" /></span><br><span style="color: hsl(120, 100%, 40%);">+                       </enumlist></span><br><span style="color: hsl(120, 100%, 40%);">+                     <para>However, when read, the function will always return 0 or 1.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                  <example title="Set idle polarity"></span><br><span style="color: hsl(120, 100%, 40%);">+                   same => n,Set(POLARITY()=0)</span><br><span style="color: hsl(120, 100%, 40%);">+                        </example></span><br><span style="color: hsl(120, 100%, 40%);">+                      <example title="Set reverse polarity"></span><br><span style="color: hsl(120, 100%, 40%);">+                        same => n,NoOp(Current Polarity: ${POLARITY()})</span><br><span style="color: hsl(120, 100%, 40%);">+                    same => n,Set(POLARITY()=reverse)</span><br><span style="color: hsl(120, 100%, 40%);">+                  same => n,NoOp(New Polarity: ${POLARITY()})</span><br><span style="color: hsl(120, 100%, 40%);">+                        </example></span><br><span style="color: hsl(120, 100%, 40%);">+                      <example title="Reverse the polarity from whatever it is currently"></span><br><span style="color: hsl(120, 100%, 40%);">+                  same => n,Set(POLARITY()=${IF($[ "${POLARITY()}" = "1" ]?0:1)})</span><br><span style="color: hsl(120, 100%, 40%);">+                        </example></span><br><span style="color: hsl(120, 100%, 40%);">+              </description></span><br><span style="color: hsl(120, 100%, 40%);">+  </function></span><br><span>    <info name="CHANNEL" language="en_US" tech="DAHDI"></span><br><span>              <enumlist></span><br><span>                     <enum name="dahdi_channel"></span><br><span>@@ -2694,6 +2723,86 @@</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! \brief Return DAHDI pivot if channel is FXO signalled */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct dahdi_pvt *fxo_pvt(struct ast_channel *chan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int res;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct dahdi_params dahdip;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct dahdi_pvt *pvt = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (strcasecmp(ast_channel_tech(chan)->type, "DAHDI")) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_WARNING, "%s is not a DAHDI channel\n", ast_channel_name(chan));</span><br><span style="color: hsl(120, 100%, 40%);">+                return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   memset(&dahdip, 0, sizeof(dahdip));</span><br><span style="color: hsl(120, 100%, 40%);">+       res = ioctl(ast_channel_fd(chan, 0), DAHDI_GET_PARAMS, &dahdip);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (res) {</span><br><span style="color: hsl(120, 100%, 40%);">+            ast_log(LOG_WARNING, "Unable to get parameters of %s: %s\n", ast_channel_name(chan), strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+              return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!(dahdip.sigtype & __DAHDI_SIG_FXO)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ast_log(LOG_WARNING, "%s is not FXO signalled\n", ast_channel_name(chan));</span><br><span style="color: hsl(120, 100%, 40%);">+          return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   pvt = ast_channel_tech_pvt(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!dahdi_analog_lib_handles(pvt->sig, 0, 0)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           ast_log(LOG_WARNING, "Channel signalling is not analog");</span><br><span style="color: hsl(120, 100%, 40%);">+           return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return pvt;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int polarity_read(struct ast_channel *chan, const char *cmd, char *data, char *buffer, size_t buflen)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct dahdi_pvt *pvt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      pvt = fxo_pvt(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!pvt) {</span><br><span style="color: hsl(120, 100%, 40%);">+           return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   snprintf(buffer, buflen, "%d", pvt->polarity);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int polarity_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct dahdi_pvt *pvt;</span><br><span style="color: hsl(120, 100%, 40%);">+        int polarity;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       pvt = fxo_pvt(chan);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!pvt) {</span><br><span style="color: hsl(120, 100%, 40%);">+           return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!strcasecmp(value, "idle")) {</span><br><span style="color: hsl(120, 100%, 40%);">+           polarity = POLARITY_IDLE;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (!strcasecmp(value, "reverse")) {</span><br><span style="color: hsl(120, 100%, 40%);">+         polarity = POLARITY_REV;</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              polarity = atoi(value);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (polarity != POLARITY_IDLE && polarity != POLARITY_REV) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_log(LOG_WARNING, "Invalid polarity: '%s'\n", value);</span><br><span style="color: hsl(120, 100%, 40%);">+            return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   my_set_polarity(pvt, polarity);</span><br><span style="color: hsl(120, 100%, 40%);">+       return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct ast_custom_function polarity_function = {</span><br><span style="color: hsl(120, 100%, 40%);">+       .name = "POLARITY",</span><br><span style="color: hsl(120, 100%, 40%);">+ .write = polarity_write,</span><br><span style="color: hsl(120, 100%, 40%);">+      .read = polarity_read,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int my_start(void *pvt)</span><br><span> {</span><br><span>  struct dahdi_pvt *p = pvt;</span><br><span>@@ -17605,6 +17714,8 @@</span><br><span>         ast_unregister_application(dahdi_accept_r2_call_app);</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   ast_custom_function_unregister(&polarity_function);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    ast_cli_unregister_multiple(dahdi_cli, ARRAY_LEN(dahdi_cli));</span><br><span>        ast_manager_unregister("DAHDIDialOffhook");</span><br><span>        ast_manager_unregister("DAHDIHangup");</span><br><span>@@ -19793,6 +19904,8 @@</span><br><span>   ast_register_application_xml(dahdi_accept_r2_call_app, dahdi_accept_r2_call_exec);</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      ast_custom_function_register(&polarity_function);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      ast_cli_register_multiple(dahdi_cli, ARRAY_LEN(dahdi_cli));</span><br><span>  memset(round_robin, 0, sizeof(round_robin));</span><br><span>         ast_manager_register_xml("DAHDITransfer", 0, action_transfer);</span><br><span>diff --git a/doc/CHANGES-staging/chan_dahdi_polarity.txt b/doc/CHANGES-staging/chan_dahdi_polarity.txt</span><br><span>new file mode 100644</span><br><span>index 0000000..365ab20</span><br><span>--- /dev/null</span><br><span>+++ b/doc/CHANGES-staging/chan_dahdi_polarity.txt</span><br><span>@@ -0,0 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Subject: chan_dahdi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+A POLARITY function is now available that allows</span><br><span style="color: hsl(120, 100%, 40%);">+getting or setting the polarity on a channel</span><br><span style="color: hsl(120, 100%, 40%);">+from the dialplan.</span><br><span></span><br></pre><div style="white-space:pre-wrap"></div><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/18800">change 18800</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/18800"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 18 </div>
<div style="display:none"> Gerrit-Change-Id: If6f50998f723e4484bf68e2473f5cedfeaf9b8f1 </div>
<div style="display:none"> Gerrit-Change-Number: 18800 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: N A <mail@interlinked.x10host.com> </div>
<div style="display:none"> Gerrit-Reviewer: Friendly Automation </div>
<div style="display:none"> Gerrit-Reviewer: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Kevin Harwell <kharwell@digium.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>