📄 ivfxboardunit.cpp
字号:
//---------------------------------------------------------------------------
#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 + -