📄 ivoice.c
字号:
* 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 + -