📄 faxdm.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 + -