]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: ftmod_zt - created zt_channel_next_event() to poll for events on a single...
authorArnaldo Pereira <arnaldo@sangoma.com>
Thu, 9 Dec 2010 14:48:33 +0000 (12:48 -0200)
committerArnaldo Pereira <arnaldo@sangoma.com>
Thu, 9 Dec 2010 14:48:33 +0000 (12:48 -0200)
libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.c

index 9247edc72e6ebf291f1d1b059e9c94f2b6d3ceb5..9a6597c8927898905f1e67ee819d4451cce12f9c 100644 (file)
@@ -177,6 +177,7 @@ static ftdm_socket_t CONTROL_FD = ZT_INVALID_SOCKET;
 
 FIO_SPAN_NEXT_EVENT_FUNCTION(zt_next_event);
 FIO_SPAN_POLL_EVENT_FUNCTION(zt_poll_event);
+FIO_CHANNEL_NEXT_EVENT_FUNCTION(zt_channel_next_event);
 
 /**
  * \brief Initialises codec, and rx/tx gains
@@ -981,6 +982,107 @@ FIO_SPAN_POLL_EVENT_FUNCTION(zt_poll_event)
        return k ? FTDM_SUCCESS : FTDM_FAIL;
 }
 
+/**
+ * \brief Retrieves an event from a ftdmtel span
+ * \param ftdmchan Channel to retrieve event from
+ * \param event FreeTDM event to return
+ * \return Success or failure
+ */
+FIO_CHANNEL_NEXT_EVENT_FUNCTION(zt_channel_next_event)
+{
+       uint32_t i, event_id = FTDM_OOB_INVALID;
+       zt_event_t zt_event_id = 0;
+       ftdm_span_t *span = ftdmchan->span;
+
+       if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_EVENT)) {
+               ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_EVENT);
+               if (ioctl(ftdmchan->sockfd, codes.GETEVENT, &zt_event_id) == -1) {
+                       snprintf(span->last_error, sizeof(span->last_error), "%s", strerror(errno));
+                       return FTDM_FAIL;
+               }
+
+               switch(zt_event_id) {
+               case ZT_EVENT_RINGEROFF:
+                       {
+                               return FTDM_FAIL;
+                       }
+                       break;
+               case ZT_EVENT_RINGERON:
+                       {
+                               return FTDM_FAIL;
+                       }
+                       break;
+               case ZT_EVENT_RINGBEGIN:
+                       {
+                               event_id = FTDM_OOB_RING_START;
+                       }
+                       break;
+               case ZT_EVENT_ONHOOK:
+                       {
+                               event_id = FTDM_OOB_ONHOOK;
+                       }
+                       break;
+               case ZT_EVENT_WINKFLASH:
+                       {
+                               if (ftdmchan->state == FTDM_CHANNEL_STATE_DOWN || ftdmchan->state == FTDM_CHANNEL_STATE_DIALING) {
+                                       event_id = FTDM_OOB_WINK;
+                               } else {
+                                       event_id = FTDM_OOB_FLASH;
+                               }
+                       }
+                       break;
+               case ZT_EVENT_RINGOFFHOOK:
+                       {
+                               if (ftdmchan->type == FTDM_CHAN_TYPE_FXS || (ftdmchan->type == FTDM_CHAN_TYPE_EM && ftdmchan->state != FTDM_CHANNEL_STATE_UP)) {
+                                       ftdm_set_flag_locked(ftdmchan, FTDM_CHANNEL_OFFHOOK);
+                                       event_id = FTDM_OOB_OFFHOOK;
+                               } else if (ftdmchan->type == FTDM_CHAN_TYPE_FXO) {
+                                       event_id = FTDM_OOB_RING_START;
+                               } else {
+                                       event_id = FTDM_OOB_NOOP;
+                               }
+                       }
+                       break;
+               case ZT_EVENT_ALARM:
+                       {
+                               event_id = FTDM_OOB_ALARM_TRAP;
+                       }
+                       break;
+               case ZT_EVENT_NOALARM:
+                       {
+                               event_id = FTDM_OOB_ALARM_CLEAR;
+                       }
+                       break;
+               case ZT_EVENT_BITSCHANGED:
+                       {
+                               event_id = FTDM_OOB_CAS_BITS_CHANGE;
+                               int bits = 0;
+                               int err = ioctl(ftdmchan->sockfd, codes.GETRXBITS, &bits);
+                               if (err) {
+                                       return FTDM_FAIL;
+                               }
+                               ftdmchan->rx_cas_bits = bits;
+                       }
+                       break;
+               default:
+                       {
+                               ftdm_log(FTDM_LOG_WARNING, "Unhandled event %d for %d:%d\n", zt_event_id, span->span_id, i);
+                               event_id = FTDM_OOB_INVALID;
+                       }
+                       break;
+               }
+
+               ftdmchan->last_event_time = 0;
+               span->event_header.e_type = FTDM_EVENT_OOB;
+               span->event_header.enum_id = event_id;
+               span->event_header.channel = ftdmchan;
+               *event = &span->event_header;
+               return FTDM_SUCCESS;
+       }
+
+       return FTDM_FAIL;
+}
+
 /**
  * \brief Retrieves an event from a ftdmtel span
  * \param span Span to retrieve event from