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

📄 faxdm.cpp

📁 dialogic卡
💻 CPP
字号:
// faxdm.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <srllib.h>
#include <dxxxlib.h>
#include <dtilib.h>
#include <faxlib.h>
#include <fcntl.h>
#include <sctools.h>
#define MAXCHAN 30 //Maximum number of channels allowed.
//change DNIS_LEN and ANI_LEN before you run this program, make them are with computer1
#define DNIS_LEN 3 //The Dialed Number Identification Number Service length
#define ANI_LEN 7 //The Automatic Number identification length, can change
char *voxchannels[] = {
	"dxxxB1C1" , "dxxxB1C2" , "dxxxB1C3" , "dxxxB1C4",
		"dxxxB2C1" , "dxxxB2C2" , "dxxxB2C3" , "dxxxB2C4",
		"dxxxB3C1" , "dxxxB3C2" , "dxxxB3C3" , "dxxxB3C4",
		"dxxxB4C1" , "dxxxB4C2" , "dxxxB4C3" , "dxxxB4C4",
		"dxxxB5C1" , "dxxxB5C2" , "dxxxB5C3" , "dxxxB5C4",
		"dxxxB6C1" , "dxxxB6C2" , "dxxxB6C3" , "dxxxB6C4",
		"dxxxB7C1" , "dxxxB7C2" , "dxxxB7C3" , "dxxxB7C4",
		"dxxxB8C1" , "dxxxB8C2" ,
		NULL,
};
char *dtichannels[] = {
	"dtiB1T1" , "dtiB1T2" , "dtiB1T3" , "dtiB1T4",
		"dtiB1T5" , "dtiB1T6" , "dtiB1T7" , "dtiB1T8",
		"dtiB1T9" , "dtiB1T10", "dtiB1T11", "dtiB1T12",
		"dtiB1T13", "dtiB1T14", "dtiB1T15", "dtiB1T16",
		"dtiB1T17", "dtiB1T18", "dtiB1T19", "dtiB1T20",
		"dtiB1T21", "dtiB1T22", "dtiB1T23", "dtiB1T24",
		"dtiB1T25", "dtiB1T26", "dtiB1T27", "dtiB1T28",
		"dtiB1T29", "dtiB1T30",
		NULL,
};
static int fsig[15][2]={
	{1380,1500},{1380,1620},{1500,1620},{1380,1740},{1500,1740},
	{1620,1740},{1380,1860},{1500,1860},{1620,1860},{1740,1860},
	{1380,1980},{1500,1980},{1620,1980},{1740,1980},{1860,1980}
};
static int bsig[15][2]={
	{1140,1020},{1140, 900},{1020, 900},{1140, 780},{1020, 780},
	{ 900, 780},{1140, 660},{1020, 660},{ 900, 660},{ 780, 660},
	{1140, 540},{1020, 540},{ 900, 540},{ 780, 540},{ 660, 540}
};
static int ssig[17][2]={
	{ 700, 900},{ 700,1100},{ 900,1100},{ 700,1300},{ 900,1300},
	{1100,1300},{ 700,1500},{ 900,1500},{1100,1500},{1300,1500},
	{1500,1700},{ 700,1700},{ 900,1700},{1300,1700},{1100,1700},
	{1700, 0},{1900, 0}
};
int protocol = R2_SIGNAL;

typedef struct CHANNEL {
	int vox;
	int dti;
	int hook;
} ;
struct CHANNEL dev[MAXCHAN];
// Declarations for the multithreaded part
int faxproc();
int r2_playfsig(int voxdev, int forwardsig, int backwardsig,int mode);
int r2_creatbsig(int voxdev,int toneid);
int dt_onhook(int dtidev);
int printts(int dtidev);
int sendfax(char *filehandle,int faxdev);
int dialout(int dtidev, int voxdev, char * dnis, char *ani);
void printstart(void);
/*************************************************************************
* NAME : main()
* DESCRIPTION : Entry point to application.
* RETURNS : 0.
* CAUTIONS : none.
*************************************************************************/
int main(void)
{
	int mode = 1000;
	printstart();
	if(sr_setparm(SRL_DEVICE,SR_INTERPOLLID,&mode)==-1){
		printf("sr_setparm() error.\n");
		return 0;
	}
	faxproc();
	return 0;
	
}
/*************************************************************************
* NAME : faxproc(i)
*************************************************************************/
int faxproc()
{
	static char Ani[ANI_LEN+3]="1234567";
	static char Dnis[DNIS_LEN+3]="123";
	char chan[4];
	int faxdev,j;

	printf("\n\nPlease input the Called ID [DNIS]: ");
	gets(Dnis);
	printf("Please input the Caller ID [ANI]: ");
	gets(Ani);
	printf("Please input the channel number you want to use (1..30):");
	gets(chan);
	j=atoi(chan);
	if((j<1) || (j>30)) {
		printf("Invalid channel number, use default 1.\n");
		j=1;
	}
	j--;
	if ((dev[j].vox = dx_open(voxchannels[j], 0)) == -1) {
		printf("Error opening channel %s\n",voxchannels[j]);
		exit(1);
	}
	if ((dev[j].dti = dt_open(dtichannels[j], 0)) == -1) {
		printf("Error opening channel %s\n",dtichannels[j]);
		exit(1);
	}
	if(nr_scroute(dev[j].dti,SC_DTI,dev[j].vox,SC_VOX,SC_FULLDUP)==-1){
		printf("Can not route sc.\n");
		exit(1);
	}
	//set tone detection
	dx_deltones(dev[j].vox);
	if(r2_creatbsig(dev[j].vox,R2_ALLFSIG)==-1){
		printf("r2_creatfsig() error.\n");
		return -1;
	}
	printf("j=%d, %s ,%s\n",j,Dnis,Ani);
	dev[j].hook=DX_ONHOOK;
	dt_onhook(dev[j].dti);
	printf("Dialing %s on channel %s...\n",Ani,ATDV_NAMEP(dev[j].vox));
		if(dialout(dev[j].dti,dev[j].vox,Dnis,Ani)==-1){
			printf("Unsuccessful Dial.\n");
			dt_onhook(dev[j].dti);
			return 0;
		}
		dev[j].hook=DX_OFFHOOK;
		if((faxdev=fx_open("dxxxB9C1",0))==-1){
			printf("Error: cannot open fax device\n");
			return 1;
		}
		printf("Using VFX dxxxB9C1 channel\n");
		nr_scroute(dev[j].dti,SC_DTI,faxdev,SC_FAX,SC_FULLDUP);
		sendfax("e1test.tif",faxdev);
		fx_close(faxdev);
		if (dx_close(dev[j].vox) == -1) {
			printf("Error closing channel %s\n",voxchannels[j]);
			exit(1);
			
		}
		if (dt_close(dev[j].dti) == -1) {
			fprintf(stderr, "Error closing channel %s\n",dtichannels[j]);
			exit(1);
		}
		return 0L;
}
/*******************************************************
* Name: int dt_onhook(int dtidev)
* Function: set dti device on hook
* Parameter: int dtidev is dti device channel handle
* Return value: 0, if successful
* : -1, unsuccessful
*******************************************************/
int dt_onhook(int dtidev)
{
	int retval;
	long tsbits, arcv, brcv, axmt, bxmt;
	//set abcd(xxxx)-->xx11
	if(dt_settssig(dtidev,DTB_CBIT|DTB_DBIT,DTA_ADDMSK)==-1){
		printf("dt_settssig() in dt_onhook(1) error.\n");
		return -1;
	}
	//get forward and backward a,b bit
	if((tsbits=ATDT_TSSGBIT(dtidev))==AT_FAILURE){
		printf("ATDT_TSSGBIT() in dt_onhook(2) error\n");
		return -1;
	}
	arcv=(tsbits & DTSG_RCVA)?1:0;//ForWard
	brcv=(tsbits & DTSG_RCVB)?1:0;
	axmt=(tsbits & DTSG_XMTA)?1:0;//BackWard
	bxmt=(tsbits & DTSG_XMTB)?1:0;
	
	//The old state is already hangup when (FW:10 && BW:10);
	if((axmt==1)&&(bxmt==0)&&(arcv==1)&&(brcv==0))
		return 0;//successful
	//The forward signal hangs up first (FW:10);
	if((arcv==1)&&(brcv==0)){
		if(axmt==0) //BW:01-->11
			if((retval=dt_settssig(dtidev,DTB_ABIT,DTA_ADDMSK))!=0){
				printf("dt_settssig() in dt_onhook(3) error\n");
				return -1;
			}
			//BW:11-->10
			if((retval=dt_settssig(dtidev,DTB_BBIT,DTA_SUBMSK))!=0){
				printf("dt_settssig() in dt_onhook(4) error\n");
				return -1;
			}
			return 0;//successful
	}
	//Else, the backword signal hangs up first
	//BW:01-->11
	if((retval=dt_settssig(dtidev,DTB_ABIT,DTA_ADDMSK))!=0){
		printf("dt_settssig() in dt_onhook(5) error\n");
		return -1;
	}
	do{//until FW:00-->10
		if((tsbits=ATDT_TSSGBIT(dtidev))==AT_FAILURE){
			printf("ATDT_TSSGBIT() in dt_onhook(6) error\n");
			return -1;
		}
		arcv=(tsbits & DTSG_RCVA)?1:0;
		brcv=(tsbits & DTSG_RCVB)?1:0;
		axmt=(tsbits & DTSG_XMTA)?1:0;
		bxmt=(tsbits & DTSG_XMTB)?1:0;
	}while(arcv!=1);
	
	//BW:11-->10
	if((retval=dt_settssig(dtidev,DTB_BBIT,DTA_SUBMSK))!=0){
		printf("dt_settssig() in dt_onhook(7) error\n");
		return -1;
	}
	return 0;//successful
}
int printts(int dtidev)
{
	long tsbits;
	int arcv,brcv,crcv,drcv,axmt,bxmt,cxmt,dxmt;
	if((tsbits=ATDT_TSSGBIT(dtidev))==AT_FAILURE){
		printf("ATDT_TSSGBIT() error.\n");
		return -1;
	}
	arcv=(tsbits & DTSG_RCVA)?1:0;
	brcv=(tsbits & DTSG_RCVB)?1:0;
	crcv=(tsbits & DTSG_RCVC)?1:0;
	drcv=(tsbits & DTSG_RCVD)?1:0;
	axmt=(tsbits & DTSG_XMTA)?1:0;
	bxmt=(tsbits & DTSG_XMTB)?1:0;
	cxmt=(tsbits & DTSG_XMTC)?1:0;
	dxmt=(tsbits & DTSG_XMTD)?1:0;
	printf("\t\tRX=%d %d %d %d, ",arcv,brcv,crcv,drcv);
	printf("\t\tTX=%d %d %d %d.\n",axmt,bxmt,cxmt,dxmt);
	return 0;
}
int r2_creatbsig(int voxdev,int toneid)
{
	int baseid=toneid, lastid=toneid, td;
	int toneidx;
	if(toneid==R2_ALLFSIG){
		baseid=R2_BASEID;
		
		lastid=R2_LASTID;
	}
	baseid+=15;
	lastid+=15;
	for(td=baseid;td<=lastid;td++){
		toneidx = td - R2_BASEID - 15;
		if(dx_blddt(td,bsig[toneidx][0],50,
			bsig[toneidx][1],50,TN_LEADING)==-1) return -1;
		if(dx_addtone(voxdev,NULL,0)==-1) return -1;
	}
	return 0;
}
int r2_playfsig(int voxdev, int forwardsig, int backwardsig,
				int mode)
{
	int toneidx;
	TN_GEN tngen;
	static DV_TPT tpt[2];
	int errno;
	toneidx=forwardsig - R2_BASEID;
	switch(protocol){
	case SOC_SIGNAL: //2
		dx_bldtngen(&tngen, ssig[toneidx][0], ssig[toneidx][1],SOC_DEFAMPL, SOC_DEFAMPL, -1);
		break;
	case R2_SIGNAL: //1
	default:
		dx_bldtngen(&tngen, fsig[toneidx][0], fsig[toneidx][1],R2_DEFAMPL, R2_DEFAMPL, 60*100);
		break;
	}
	dx_clrtpt(tpt,2);
	tpt[0].tp_type=IO_CONT;
	tpt[0].tp_termno=DX_TONE;
	tpt[0].tp_length=backwardsig;
	tpt[0].tp_flags=TF_TONE;
	tpt[0].tp_data=DX_TONEON;
	tpt[1].tp_type=IO_EOT;
	tpt[1].tp_termno=DX_MAXTIME;
	tpt[1].tp_length=200;
	tpt[1].tp_flags=TF_10MS;
	//printf("FW=%d; BW=%d\n",forwardsig,backwardsig);
	errno=dx_playtone(voxdev,&tngen,tpt,mode);
	if(errno==-1)printf("Error %s\n",ATDV_ERRMSGP(voxdev));
	return errno;
}
int dialout(int dtidev, int voxdev, char * dnis, char *ani)
{
	static char dialstring[DNIS_LEN+ANI_LEN+6];
	int i;
	long tsbits,timeout=15000,time=0;
	int arcv,brcv;
	int axmt,bxmt;
	int evtdat,bksig;
	static DX_EBLK eblk;
	//if dnis includes any error digits
	for(i=0;i<(int)strlen(dnis);i++)
		if((dnis[i]>'9')||(dnis[i]<'0')){
			printf("%s: The telephone number is not correct.\n",ATDV_NAMEP(voxdev));
			return -1;
		}
		for(i=0;i<(int)strlen(ani);i++)
			if((ani[i]>'9')||(ani[i]<'0')){
				printf("%s: The telephone number is not correct.\n",ATDV_NAMEP(voxdev));
				return -1;
				
			}
			//empty the event queue
			if(dx_getevt(voxdev,&eblk,1)>=0){
				while(dx_getevt(voxdev,&eblk,1)>=0)
					;
			}
			printf("-----------------%s_%s\n",dnis,ani);
			//set 1011-->0011
			if(dt_settssig(dtidev,DTB_ABIT,DTA_SUBMSK)!=0){
				printf("dt_settssig() error.\n");
				return -1;
			}
			time=0;
			do{
				Sleep(50);
				time+=50;
				if((tsbits=ATDT_TSSGBIT(dtidev))==AT_FAILURE){
					printf("ATDT_TSSGBIT() error\n");
					return -1;
				}
				arcv=(tsbits & DTSG_RCVA)?1:0;
				brcv=(tsbits & DTSG_RCVB)?1:0;
				axmt=(tsbits & DTSG_XMTA)?1:0;
				bxmt=(tsbits & DTSG_XMTB)?1:0;
				if(time>timeout) return -1;
			}while(!((arcv==1)&&(brcv==1)&&(axmt==0)&&(bxmt==0)));
			//Multiple Frequency Control Process Starts
			//FW: 1 6 8 x 6 5 0 4 5 3 6 5 SIGI_15 SIGII_3
			//BW: A1 A1 A6 A1 A1 A1 A1 A1 A1 A1 A1 A1 A3 B1
			strcpy(dialstring,dnis);//dnis=168
			strcat(dialstring,"1"); //x, calling type
			strcat(dialstring,ani); //ani=65045365
			printf("--------------The number is %s\n",dialstring);
			for(i=0;i<(int)strlen(dialstring);i++){
				
				if(dialstring[i]=='0') evtdat=SIGI_10;
				else evtdat=dialstring[i]-0x31+SIGI_1;
				if(i==(int)(strlen(dnis)-1)) bksig=121;//A6
				else bksig=116;//A1
				//dial process
				//printf("i=%2d, Sending Char '%c', BK Signal=%d\n",i,dialstring[i],bksig);
					if(r2_playfsig(voxdev,evtdat,bksig,EV_SYNC)==-1){
						printf("r2_playfsig error.\n");
						return -1;
					}
					//Backward signal SIGA_1 Toneon
					if(dx_getevt(voxdev,&eblk,10)==-1){
						printf("dx_getevt(1) in dialout(%d)\n",i);
						return 0;
					}
					//Backward signal SIGA_1 Toneoff
					if(dx_getevt(voxdev,&eblk,10)==-1){
						printf("dx_getevt(2) in dialout(%d)\n",i);
						return 0;
					}
			}//end sending dialing string
			//Send SIGI_15 ,BK:A3
			if(r2_playfsig(voxdev,SIGI_15,118,EV_SYNC)==-1){
				printf("r2_playfsig(3) error.\n");
				return -1;
			}
			//Get
			dx_getevt(voxdev,&eblk,10);//SIGI_15 Toneon
			dx_getevt(voxdev,&eblk,10);//SIGI_15 Toneoff
			//Send SIGII_3 ,BK:SIGB_1
			if(r2_playfsig(voxdev,113,116,EV_SYNC)==-1){
				printf("r2_playfsig() error.\n");
				return -1;
			}
			//Get
			dx_getevt(voxdev,&eblk,10);//SIGB_1 Toneon
			dx_getevt(voxdev,&eblk,10);//SIGB_1 Toneoff
			//If not SIGB_1, error or busy
			if(eblk.ev_data!=116){
				if(r2_playfsig(voxdev,116,eblk.ev_data,EV_SYNC)==-1){
					printf("r2_playfsig() error.\n");
					return -1;
				}
				dx_getevt(voxdev,&eblk,10);//SIGB_1 TONEON
				dx_getevt(voxdev,&eblk,10);//SIGB_1 TONEOFF
				printf("%s: The line %s is busy.\n",ATDV_NAMEP(voxdev),dnis);
				return -1;
			}
			//MFC ends here.
			printf("%s: Ringing...\n",ATDV_NAMEP(voxdev));
			time=0;
			do{
				if((tsbits=ATDT_TSSGBIT(dtidev))==AT_FAILURE){
					printf("ATDT_TSSGBIT() error.\n");
					return -1;
				}
				arcv=(tsbits & DTSG_RCVA)?1:0;
				brcv=(tsbits & DTSG_RCVB)?1:0;
				axmt=(tsbits & DTSG_XMTA)?1:0;
				bxmt=(tsbits & DTSG_XMTB)?1:0;
				if(brcv==0) return dt_onhook(dtidev);
				Sleep(250);
				time+=250;
				if(time>timeout){
					printf("%s: The line %s has no answer.\n",ATDV_NAMEP(voxdev),dialstring);
					return -1;
				}
			} while(arcv==1);//11-->01 From ONHOOK to OFFHOOK
			
			printf("%s: %s OFFHOOK.\n",ATDV_NAMEP(voxdev),dnis);
			return 0;
}
// ********************* FAX *************************
int sendfax(char *filehandle,int faxdev)
{
	DF_IOTT iott;
	int tifd1;
	int errorval;
	unsigned short value;
	if(fx_initstat(faxdev,DF_TX)==-1){
		printf(" %s: Error initstat().\n",ATDV_NAMEP(faxdev));
		return 1;
	}
	printf("%s: fx_initstat() done.\n",ATDV_NAMEP(faxdev));
	value=DFC_AUTO;
	if(fx_setparm(faxdev,FC_SENDCONT,(void*)&value)==-1){
		printf("%s: Error fx_setparm fax. %d %s\n",ATDV_NAMEP(faxdev),ATDV_LASTERR(faxdev),ATDV_ERRMSGP(faxdev));
	}
	printf("%s: fx_setparm() done.\n",ATDV_NAMEP(faxdev));
	tifd1=dx_fileopen(filehandle,O_RDONLY|O_BINARY,NULL);
	if(tifd1==-1) {
		printf("%s: File \"%s\" not found.\n",ATDV_NAMEP(faxdev),filehandle);
		return 1;
	}
	fx_setiott(&iott,tifd1,DF_TIFF,DFC_EOP);
	iott.io_type=IO_DEV|IO_EOT;
	iott.io_firstpg=0;
	iott.io_pgcount=(long int)-1L;
	iott.io_fhandle=tifd1;
	iott.io_datatype=DF_TIFF;
	
	iott.io_phdcont=DFC_EOP;
	printf("Begin sending fax \"%s\".\n",filehandle);
	errorval=fx_sendfax(faxdev,&iott,EV_SYNC);
	printf("Sendfax error value is %d\n",errorval);
	if (errorval==-1){
		printf("%s: Error sending fax. %d %s\n",ATDV_NAMEP(faxdev),ATDV_LASTERR(faxdev),ATDV_ERRMSGP(faxdev));
	}
	printf("Sending fax completed.\n");
	return 0;
}
void printstart(void)
{
	printf("\nD/300SC-E1+VFX/40SC Demo Program for NT .\n");
	printf("Compiler: Visual C++2.0 Later.\n");
	printf("For more information, read the header of this source C++ code.\n");
	printf("\t\tDialogic Corporation, Beijing. Tel:8610-65045364.\n\n");
	printf("In this program DNIS_LEN=%d,ANI_LEN=%d\n",DNIS_LEN,ANI_LEN);
	printf("Please make BLT=0 for D/300 and BLT=1 for VFX, and config\n");
	printf("VFX as resource mode\n");
	printf("-------------------------------------------------------------------\n");
}

⌨️ 快捷键说明

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