⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ivoice.c

📁 170话费催交系统
💻 C
📖 第 1 页 / 共 2 页
字号:
 *     RETURNS: None.
 *    CAUTIONS: None.
 ***************************************************************************/
void setonhook(int channel)
{
   /* Setting eventmask for A on and A off events */
   if (dt_setevtmsk(dxinfo[channel].dtihandle,DTG_SIGEVT,DTMM_AON|DTMM_AOFF
                                                 ,DTA_SUBMSK)==-1){
       printf("error setevetmsk()\n");
       exit(1);
   }

   /* Setting A on and D on for transmitting idle */
   if (dt_settssig(dxinfo[channel].dtihandle,DTB_ABIT|
                                                DTB_DBIT,DTA_SETMSK)==-1){
      printf("error dt_setigmod");
      exit(1);
   }

   /* enabling multitasking function for detecting seizer */
   if (dt_mtfcn(dxinfo[channel].dtihandle,DEMT_WTCALL,0) == -1){
      printf("error dt_mtfcn");
      exit(1);
   }
   printf("Waiting for call\n");
}

/***************************************************************************
 *        NAME: void check_event(int channel, int event)
 * DESCRIPTION: check the validity of an event on a particular channel and
 *              calls appropriate function depending on current state, and
 *              the event receiver.
 *       INPUT: channel = a channel number
 *              event = an event code or number
 *      OUTPUT: None.
 *     RETURNS: None.
 *    CAUTIONS: None.
 ***************************************************************************/
void check_event(int channel, int event)
{
   int i;
   int flag =1;
   void (*func_ptr)(int);

   for (i=0; i< TABLE_SIZE; i++){
      if(dxinfo[channel].state == table[i].current_state &&
                                    event == table[i].event){
             flag = 0;
                 func_ptr = table[i].funcptr;
                 dxinfo[channel].state = table[i].next_state;
                 (*func_ptr)(channel);

                 break;
      }
   }


/* if unexpected event is received process it */

/*   if (flag == 1)
      printf("INVALID EVENT ON CHANNEL %d\n",channel); */

}

/***************************************************************************
 *        NAME: int process_event(int channel)
 * DESCRIPTION: Process the event and save the next channel state
 *       INPUT: channel = a channel number
 *      OUTPUT: None.
 *     RETURNS: integer
 *    CAUTIONS: None.
 ***************************************************************************/
int process_event(int channel)
{
   int event;
   long bitmask;
   unsigned short *bit;
   DX_CST *cstp;

   /* Process the Event and Save the Next Channel State */

   event = sr_getevttype();    /* get event type */

   switch(event){

      /* If cst_event is received then check cst_event field of DX_CST 
         to get event info. */
      case TDX_CST:
         cstp = (DX_CST *) sr_getevtdatap();
            switch ( cstp->cst_event ) {

                case DE_DIGITS:
                   return(DE_DIGITS);

                case DE_TONEON:
                   printf("DE_TONEON received\n");
                   return(DE_TONEON);

                case DE_TONEOFF:
                   printf("DE_TONEOFF reveived\n");
                   return(DE_TONEOFF);

                default:
                   break;
            }
            break;

      /* Check the bit transition if signaling event is received */
      case DTEV_SIG:{
           bit = (unsigned short *) sr_getevtdatap() ;
           bit = (unsigned short *) sr_getevtdatap() ;
           if ((*bit & DTMM_AON) == DTMM_AON )
              return(DX_ONHOOK);
      }
      break;

      /* dt_mtfcn terminated */
      case DTEV_MTFCNCPT:
         return(DTEV_MTFCNCPT);

      /* Check the terminating condition */
      case TDX_GETDIG:             /* Get Digits Completed */

         bitmask = ATDX_TERMMSK( dxinfo[ channel ].devhandle);

         /* If a Loop Current Drop was Detected goto ON-HOOK state */

         if ( bitmask & TM_MAXDTMF ) {
              printf("digits received %s\n",dxinfo[channel].digbuf.dg_value);
              return( TM_MAXDTMF );
         }

         if ( bitmask & TM_MAXTIME){
              printf("time out while waiting for digits\n");
              return( TM_MAXTIME );
         }
      default:
         printf("Invalid event process evt%x\n",event);
     }
}

/***************************************************************************
 *        NAME: void wait_event()
 * DESCRIPTION: Wait for Completion of an Event
 *       INPUT: None.
 *      OUTPUT: None.
 *     RETURNS: None.
 *    CAUTIONS: None.
 ***************************************************************************/
void wait_event()
{
   int channel;
   int chdev;
   int event;
   int msieventflag=0;

   while ( 1 )  {

      /* Wait for Completion of an Event */

      sr_waitevt( -1 );


     /* Get the channel number from which the event was received. */

      channel = 1;
      chdev = sr_getevtdev();
      while ( channel <= MAXCHANS ) {
        if ( dxinfo[ channel ].devhandle == chdev || dxinfo[channel].dtihandle==                                                                chdev)  {
             break;
        } else {
           channel++;
        }
      }


     event = process_event(channel);

     /* printf("event 0x%x channel %d\n",event,channel);*/


     check_event(channel,event);

   }
}

/***************************************************************************
 *        NAME: void main(void)
 * DESCRIPTION: The entry point of the application
 *       INPUT: None.
 *      OUTPUT: None.
 *     RETURNS: None.
 *    CAUTIONS: None.
 ***************************************************************************/
void main(void)
{
   sysinit();           /* initilize the system */
   wait_event();        /* wait for events */
}

/***************************************************************************
 *        NAME: void playtone(int channel)
 * DESCRIPTION: play forward and backtone tone
 *       INPUT: channel = a channel number
 *      OUTPUT: message of success of failure
 *     RETURNS: None
 *    CAUTIONS: None
 ***************************************************************************/
void playtone(int channel)
{
 //  DV_TPT tpt[2];

   /* Set the event mask for A on and A off detection */
   if (dt_setevtmsk(dxinfo[channel].dtihandle,DTG_SIGEVT,DTMM_AON|DTMM_AOFF,
                                                     DTA_SETMSK)== -1){
      printf("error setting evtmsk");
      exit(1);
   }

   /* Play first backward R2-Mf tone */
   printf("PLAYING BACKWARD TONE\n");
   if (r2_playbsig(dxinfo[channel].devhandle,SIGA_1,SIGI_1,EV_SYNC)==-1){
      printf("error playing tone\n");
      exit(1);
   }

}

/***************************************************************************
 *        NAME: void nochange(int x)
 * DESCRIPTION: do no changes.
 *       INPUT: None.
 *      OUTPUT: None.
 *     RETURNS: None.
 *    CAUTIONS: None.
 ***************************************************************************/
void nochange(int x)
{
   return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -