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

📄 ivfxboardunit.cpp

📁 基于板卡的fax源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "IVFXBoardUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)

// 最大允许8个通道
char *channels[] = {
	"dxxxB1C1",
	"dxxxB1C2",
	"dxxxB1C3",
	"dxxxB1C4",
	"dxxxB1C5",
	"dxxxB1C6",
	"dxxxB1C7",
	"dxxxB1C8",
	NULL,};
//---------------------------------------------------------------------------
__fastcall IVFXBoard::IVFXBoard()
{
    m_ChannelNumber         = DEFAULT_CHANNEL_NUMBER;
    m_ErrorCode             = 0;

    bSetTitle               = false;

    // Init fax title
    memset(faxtitle,0,FAXTITLE_MAX_LEN);
    memcpy(faxtitle,"Ideal Fax Server",16);   // 默认的Title为"Ideal Fax Server"
}
__fastcall IVFXBoard::~IVFXBoard()
{

}
//---------------------------------------------------------------------------
bool IVFXBoard::OpenChannel()
{
    // 代表板卡是否成功启动的标志
    bool bStart = true;

    for (int i=0; i<m_ChannelNumber; i++) {
        if ((m_hVox[i] = dx_open(channels[i], 0)) == -1) {

           bStart = false;
           m_ErrorCode = VFX_BOARD_ERROR_OPENVOICE;
           break;
        }

        if ((m_hFax[i] = fx_open(channels[i], 0)) == -1) {

           bStart = false;
           m_ErrorCode = VFX_BOARD_ERROR_OPENFAX;
           break;
        }

#ifndef DONGJIN_VER
        // 东进的连不上这个函数
        if (build_tone(i) == -1){

           bStart = false;
           // ErrorCode在子函数中
           break;
        }
        else {

        }
#endif
    }
    return bStart;
}
//---------------------------------------------------------------------------
bool IVFXBoard::CloseChannle()
{
    bool bStop = true;
    
    // 关闭所有的通道
	for (int count = 0; count < m_ChannelNumber; count++) {
		if (fx_close(m_hFax[count]) == -1) {
            bStop = false;
		}

		if (dx_close(m_hVox[count]) == -1) {
            bStop = false;
		}
	}
    return bStop;
}
//---------------------------------------------------------------------------
int IVFXBoard::GetLastError()
{
    return m_ErrorCode;
}
//---------------------------------------------------------------------------

int IVFXBoard::build_tone(int channelnumber)
{

	if(dx_deltones(m_hVox[channelnumber]) == -1){
        m_ErrorCode =  VFX_BUILDTONE_ERROR_DELTONE;
		dx_close(m_hVox[channelnumber]);
		return -1;
	}


	if(dx_bldst(TID_4,450,50,TN_LEADING)==-1){
        m_ErrorCode = VFX_BUILDTONE_ERROR_BLDST;
        dx_close(m_hVox[channelnumber]);
		return -1;
	}

	if(dx_addtone(m_hVox[channelnumber],NULL,0)==-1){
        m_ErrorCode = VFX_BUILDTONE_ERROR_ADDTONE;
        dx_close(m_hVox[channelnumber]);
		return -1;
	}

	if(dx_blddt(TID_3,328,50,461,50,TN_LEADING)==-1){
        m_ErrorCode = VFX_BUILDTONE_ERROR_BLDDT;
        dx_close(m_hVox[channelnumber]);
		return -1;
	}

	if(dx_addtone(m_hVox[channelnumber],NULL,0)==-1){
        m_ErrorCode = VFX_BUILDTONE_ERROR_ADDTONE;
		dx_close(m_hVox[channelnumber]);
		return -1;
	}

	if(dx_blddtcad(TID_2,328,50,461,50,25,5,25,5,2)==-1){
        m_ErrorCode = VFX_BUILDTONE_ERROR_BLDDTCAD;
		dx_close(m_hVox[channelnumber]);
		return -1;
	}

	if(dx_addtone(m_hVox[channelnumber],NULL,0)==-1){
        m_ErrorCode = VFX_BUILDTONE_ERROR_ADDTONE;
		dx_close(m_hVox[channelnumber]);
		return -1;
	}

	if(dx_bldstcad(TID_1,450,50,35,5,35,5,2)==-1){
        m_ErrorCode = VFX_BUILDTONE_ERROR_BLDSTCAD;
		dx_close(m_hVox[channelnumber]);
		return -1;
	}

	if(dx_addtone(m_hVox[channelnumber],NULL,0)==-1){
        m_ErrorCode = VFX_BUILDTONE_ERROR_ADDTONE;
        dx_close(m_hVox[channelnumber]);
		return -1;
	}

	return(0);
}
//---------------------------------------------------------------------------

int IVFXBoard::sethook(int channelnumber,int hookcode)
{
    if (dx_sethook(m_hVox[channelnumber],hookcode,EV_SYNC) == -1) {
        m_ErrorCode =  VFX_BOARD_ERROR_SETHOOK;
        return -1;
    }
    return 0;
}
//---------------------------------------------------------------------------

int IVFXBoard::WaitForInput(int channelnumber)
{
    if (RouteVoice(channelnumber) == FALSE) {
        ITools::WriteLog(CTI,"路由语音出错","通道"+IntToStr(channelnumber));
        return -1;
    }
    
    if (dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC) == -1) {
		return -1;
	}

    if (dx_wtring(m_hVox[channelnumber],1,DX_OFFHOOK,-1) == -1){
        m_ErrorCode =  VFX_BOARD_ERROR_WAITINPUT;
		return -1;
	}

    ::ITools::WriteLog(CTI,"等待用户拨入...","通道"+IntToStr(channelnumber));
    return 0;
}
//---------------------------------------------------------------------------
/****************************************************************************
*       函数名称:      PlayFile
*
*       描述:          播放语音文件,并获取用户输入按键信息
*
*       参数:           In:
*                           channelnumber:  接受传真占用的传真通道号    0.1.2..
*                           filename:       接受的文件名称,可以不存在
*                           voxformat:      要播放的语音文件格式(true:vox false: wav)
*                       Out:
*                           digbuf:         获取的按键信息
*                       return:
*                           0: 成功
*
*       历史:           Created by xr on 03/09/25
*****************************************************************************/
int IVFXBoard::PlayFile(int channelnumber, char *filename, bool voxformat, char *digbuf, int boxlen)
{
    int term;
    DV_DIGIT sdigp;

    static DV_TPT tpt[3];
    dx_clrtpt(&tpt[0],3);

    if (dx_clrdigbuf(m_hVox[channelnumber]) == -1) {
        return -1;
    }

    // 设置中断条件
    tpt[0].tp_type	    = IO_CONT;
	tpt[0].tp_termno    = DX_MAXDTMF;
	tpt[0].tp_length    = 1;
	tpt[0].tp_flags     = TF_MAXDTMF;

    tpt[1].tp_type	    = IO_CONT;
	tpt[1].tp_termno    = DX_MAXTIME;
	tpt[1].tp_length    = 600;
	tpt[1].tp_flags     = TF_MAXTIME;


    tpt[2].tp_type	    = IO_EOT;
	tpt[2].tp_termno    = DX_LCOFF;
	tpt[2].tp_length    = 1;
	tpt[2].tp_flags     = TF_LCOFF;

    if (voxformat) {        // 播放Vox文件
        if (dx_playvox(m_hVox[channelnumber],filename,&tpt[0],NULL,EV_SYNC) == -1) {
            ITools::WriteLog(CTI,"播放文件失败","即将挂机");
    		dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC);
            return -1;
        }
    }
    else {
        // 播放Wav文件        faxin.WAV
        if (dx_playwav(m_hVox[channelnumber],filename,&tpt[0],EV_SYNC) == -1) {
    		dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC);
            return -1;
        }
    }

    term = ATDX_TERMMSK(m_hVox[channelnumber]);

    DV_TPT stpt[3];
    dx_clrtpt(stpt,3);
	stpt[0].tp_type     = IO_CONT;
	stpt[0].tp_termno   = DX_MAXDTMF;	/* Maximum number of digits */
	stpt[0].tp_length   = boxlen;	    /* terminate on 4 digits */
	stpt[0].tp_flags    = TF_MAXDTMF;	/* terminate if already in buf. */

    stpt[1].tp_type	    = IO_CONT;
	stpt[1].tp_termno    = DX_MAXTIME;
	stpt[1].tp_length    = 60;
	stpt[1].tp_flags     = TF_MAXTIME;

	stpt[2].tp_type = IO_EOT;
	stpt[2].tp_termno = DX_LCOFF;	/* LC off termination */
	stpt[2].tp_length = TF_LCOFF;			/* Use 30 ms (10 ms resolution
										* timer) */
	stpt[2].tp_flags = TF_LCOFF|TF_10MS; /* level triggered, clear history,
											* 10 ms resolution */

    ITools::WriteLog(CTI,"开始获取按键信息...","通道号"+IntToStr(channelnumber));
    switch (term) {
        case TM_MAXTIME:
            ITools::WriteLog(CTI,"播放语音超时","");
    		dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC);
            return -1;

        case TM_MAXDTMF:
           // stpt[0].tp_length   = DEFAULT_FAXBOX_LEN-1;
            if (dx_getdig(m_hVox[channelnumber], &stpt[0], &sdigp, EV_SYNC) == -1) {
        		dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC);
                return -1;
            }
            else {
                for (int i=0 ;i<DEFAULT_MAX_BOX_BUF_LEN; i++) {
                    digbuf[i] = sdigp.dg_value[i];
                }
                return 0;
            }

        default:
            if (dx_getdig(m_hVox[channelnumber], &stpt[0], &sdigp, EV_SYNC) == -1) {
        		dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC);
                return -1;
            }
            else {
                for (int i=0 ;i<DEFAULT_MAX_BOX_BUF_LEN; i++) {
                    digbuf[i] = sdigp.dg_value[i];
                }
                return 0;
            }
    }
}
//---------------------------------------------------------------------------
/****************************************************************************
*       函数名称:      SendFax
*
*       描述:          发送传真文件,返回发送结果
*
*       参数:           In:
*                           channelnumber:  发送占用的传真通道号    0.1.2..
*                           dialstring:     拨打的传真号码
*                           filename:       要发送的传真文件(tiff/txt)
*                           tiff:           是否为tiff文件  true:tiff   false: txt
*                       return:
*                           发送结果:       0:成功
*
*       历史:           Created by xr on 03/09/25
*                       Modified by xr on 03/11/24  dialstring包含"-" 为拨分机
*****************************************************************************/

int IVFXBoard::SendFax(int channelnumber, char *dialstring, char *filename, bool tiff)
{
	DX_CAP capp;
	DF_IOTT iott;

	int tifd1   = 0;
	int term    = 0;
    int sufterm = 0;
	unsigned short value = 0;

	dx_clrcap(&capp);
	capp.ca_nbrdna = 4;

	if (fx_initstat(m_hFax[channelnumber],DF_TX) == -1) {      //fx_initstat()用于指定是传送还是接受
		return SEND_FAX_ERROR_INITSTAT;
	}
    if (fx_setparm(m_hFax[channelnumber],FC_LOCALID,(void *)faxtitle) != 0) {
    }


	value=DFC_AUTO;
	if (fx_setparm(m_hFax[channelnumber],FC_SENDCONT,(void*)&value) == -1) {
        return SEND_FAX_ERROR_SETPARAM;
    }
    
	tifd1 = dx_fileopen(filename,O_RDONLY|O_BINARY,NULL);
	if (tifd1 == -1) {
		dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC);
		return SEND_FAX_ERROR_FILEOPEN;
	}

    if (tiff) {
        fx_setiott(&iott,tifd1,DF_TIFF,DFC_EOP);
        iott.io_type    = IO_DEV|IO_EOT;
        iott.io_firstpg = 0;
        iott.io_pgcount = -1L;
        iott.io_fhandle = tifd1;
        iott.io_datatype= DF_TIFF;
        iott.io_phdcont = DFC_EOP;
    }
    else {
        fx_setiott(&iott,tifd1,DF_ASCII,DFC_EOP);
        iott.io_type    = IO_DEV|IO_EOT;
        iott.io_firstpg = 0;
        iott.io_pgcount = -1L;
        iott.io_fhandle = tifd1;
        iott.io_datatype= DF_ASCII;
        iott.io_phdcont = DFC_EOP;
    }

    if (RouteVoice(channelnumber) == FALSE) {
        ITools::WriteLog(CTI,"拨号路由时语音失败","通道号"+IntToStr(channelnumber));
    }

    // 先挂机再摘机
	if (dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC) == -1) {
        dx_fileclose(tifd1);
        return SEND_FAX_ERROR_ONHOOK;
    }
	if (dx_sethook(m_hVox[channelnumber],DX_OFFHOOK,EV_SYNC) == -1) {
        dx_fileclose(tifd1);

⌨️ 快捷键说明

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