www.pudn.com > dialogic_IVR.rar > AI2001Dlg.cpp
// AI2001Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "AI2001.h"
#include "AI2001Dlg.h"
#include "setupdlg.h"
//Add header --------2001/6/30
#include "Answer.h"
#include "Mindex.h"
#include "SourceMonitor.h"
#include "ServiceDataQueue.h"
#include "VSInterpreter.h"
//Add end --------2001/6/30
#include "export.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//Add protype --------2001/6/30
extern CVSInterpreter vsInterpreter;
extern int isConnect;
int iShow = 0;
int InitAI2001( void );
int RunAI2001( HWND hWnd );
int CreatConsole( void );
BOOL WINAPI HandlerRoutine( DWORD dwCtrlType );
//Add end --------2001/6/30
extern HANDLE __hStdOut;
int m_ChannelStatus[1441];
HICON hIcon[8];
CCriticalSection m_cs;
int m_iMyWindowFlag=0;//弹出窗口标识 1 子窗口 0 其它应用程序
int iDrawFlag=0;
int m_iCurrNo=0;
int m_iStatusNo=0;
int m_iTotal=0;
int m_iFlag=0;
extern int maxchans;
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAI2001Dlg dialog
CAI2001Dlg::CAI2001Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CAI2001Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CAI2001Dlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CAI2001Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAI2001Dlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
DDX_Control(pDX, IDC_BUTTON_START, m_btnStart);
DDX_Control(pDX, IDC_BUTTON_EXIT, m_btnExit);
DDX_Control(pDX, IDC_BUTTON_SCRIPT, m_btnScript);
DDX_Control(pDX, IDC_BUTTON_SETUP, m_btnSetup);
DDX_Control(pDX, IDC_BUTTON_CONSOLE, m_btnConsole);
DDX_Control(pDX, IDC_BUTTON_SIMUIVR, m_btnSimuIvr );
}
BEGIN_MESSAGE_MAP(CAI2001Dlg, CDialog)
//{{AFX_MSG_MAP(CAI2001Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_ACTIVATE()
ON_COMMAND(ID_MENUITEM_ONHOOK, OnMenuitemOnhook)
ON_WM_MOUSEMOVE()
ON_WM_CREATE()
ON_BN_CLICKED(IDC_BUTTON_EXIT, OnButtonExit)
ON_BN_CLICKED(IDC_BUTTON_SETUP, OnButtonSetup)
ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)
ON_WM_RBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()
ON_WM_MOVE()
ON_COMMAND(ID_MENUITEM_SCRIPT, OnMenuitemScript)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BUTTON_CONSOLE, OnButtonConsole)
ON_BN_CLICKED(IDC_BUTTON_SCRIPT, OnButtonScript)
ON_COMMAND(ID_MENUITEM_RESET, OnMenuitemReset)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON_SIMUIVR, OnButtonSimuivr)
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_IVR, OnSelchangeTabIvr)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAI2001Dlg message handlers
BOOL CAI2001Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
//读取图标
m_btnStart.SetIcon(IDI_START);
m_btnConsole.SetIcon(IDI_CONSOLE);
m_btnScript.SetIcon(IDI_SCRIPT);
m_btnSetup.SetIcon(IDI_SETUP);
m_btnSimuIvr.SetIcon(IDI_SIMUIVR);
m_btnExit.SetIcon(IDI_EXIT);
hIcon[0] = AfxGetApp()->LoadIcon(IDI_WHITE);
hIcon[1] = AfxGetApp()->LoadIcon(IDI_CYAN);
hIcon[7] = AfxGetApp()->LoadIcon(IDI_GREEN);
hIcon[2] = AfxGetApp()->LoadIcon(IDI_YELLOW);
hIcon[3] = AfxGetApp()->LoadIcon(IDI_RED);
hIcon[4] = AfxGetApp()->LoadIcon(IDI_BLACK);
hIcon[5] = AfxGetApp()->LoadIcon(IDI_BLUE);
hIcon[6] = AfxGetApp()->LoadIcon(IDI_PURPLE);
for (int i=0;i<7;i++)
SetIcon(hIcon[i],TRUE);
CTabCtrl *pTab=(CTabCtrl *)GetDlgItem(IDC_TAB_IVR);
TC_ITEM tcItem;//添加标签
tcItem.mask=TCIF_TEXT;
//----------------------------------------------------
//insert sub1 dlg
//----------------------------------------------------
tcItem.pszText = "模块一";
pTab->InsertItem(0,&tcItem);
m_sub1Dlg.Create(IDD_DIALOG_PANE1,pTab);
//-------------------------------------
tcItem.pszText = "模块二";
pTab->InsertItem(1,&tcItem);
m_sub2Dlg.Create(IDD_DIALOG_PANE2,pTab);
//-----------------------------------
tcItem.pszText = "模块三";
pTab->InsertItem(2,&tcItem);
m_sub3Dlg.Create(IDD_DIALOG_PANE3,pTab);
//------------------------------------
tcItem.pszText = "模块四";
pTab->InsertItem(3, &tcItem);
m_sub4Dlg.Create(IDD_DIALOG_PANE4,pTab);
pTab->SetCurSel(0);
m_sub1Dlg.ShowWindow(SW_SHOW);
InitAI2001();
SetTimer( 1, 500, NULL );
int nTime = GetPrivateProfileInt("TIMESLICE", "time", 10, ".\\setup.ini");
SetTimer( 2, nTime*1000, NULL );
// Sleep(1000);
int run = GetPrivateProfileInt("Auto_Run", "run",1,".\\setup.ini");
if(run)
OnButtonStart();
return TRUE; // return TRUE unless you set the focus to a control
}
void CAI2001Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
m_iMyWindowFlag=1;
dlgAbout.DoModal();
m_iMyWindowFlag=0;
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CAI2001Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this); // device context for painting
dc.SetMapMode(MM_ANISOTROPIC);
dc.SetWindowExt(400,400);
dc.SetViewportExt(dc.GetDeviceCaps(LOGPIXELSX),
dc.GetDeviceCaps(LOGPIXELSY));
int i,j,iChannelNo;
int iResult,x,y;
switch(iDrawFlag) //0:初始状态 1:更改局部状态-offhook2onhook 2:更改局部状态-onhook2offhook 3.更改局部状态-err status
{
case 0:
dc.DrawIcon(240, 1290, hIcon[1]);
dc.DrawIcon(240+400, 1290, hIcon[2]);
dc.DrawIcon(240+780, 1290, hIcon[3]);
dc.DrawIcon(240+1170, 1290, hIcon[0]);
//iDrawFlag = 4;
break;
}
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CAI2001Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
int ChannelNoToPoint(int iChannelNo, int &x, int &y)
{
if (iChannelNo > 360) return -1;
int i,j;
i = iChannelNo % 30;
j = iChannelNo / 30;
if (i != 0)
{
x = BEGIN_X + (i - 1) * INTERVAL_X;
y = BEGIN_Y + j * INTERVAL_Y;
}
else
{
x = BEGIN_X + 29 * INTERVAL_X;
y = BEGIN_Y + (j - 1) * INTERVAL_Y;
}
return 0;
}
int PointToChannelNo(CPoint point)
{
int i,j;
if (point.x * SCALE < BEGIN_X || point.y * SCALE < BEGIN_Y || point.y * SCALE > (BEGIN_Y+INTERVAL_Y*12) || point.x * SCALE > (BEGIN_X+30*INTERVAL_X))
return 0;
else
{
i = (int)(point.x * SCALE - BEGIN_X) / INTERVAL_X;//col number
j = (int)(point.y * SCALE - BEGIN_Y) / INTERVAL_Y;//row number
if (point.x > (i*INTERVAL_X+BEGIN_X)/SCALE && point.x < (BEGIN_X+32+i*INTERVAL_X)/SCALE &&
point.y > (j*INTERVAL_Y+BEGIN_Y)/SCALE && point.y < (BEGIN_Y+32+j*INTERVAL_Y)/SCALE &&
i < 30)
return (j*30+i+1);
else
return 0;
}
}
void CAI2001Dlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CDialog::OnActivate(nState, pWndOther, bMinimized);
// TODO: Add your message handler code here
if (nState == WA_INACTIVE && m_iMyWindowFlag == 0)
{
this->ShowWindow(SW_MINIMIZE);
m_iMyWindowFlag = 0;
}
iDrawFlag = 0;
}
void CAI2001Dlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnMouseMove(nFlags, point);
}
int CAI2001Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_StatusBarCtl.Create(WS_CHILD|WS_VISIBLE|CCS_BOTTOM|SBARS_SIZEGRIP,
CRect(0,0,0,0), this, ID_MY_STATUS_BAR);
int nParts = 4;
CRect rect;
char sTemp[200];
int iFlag = GetPrivateProfileString("CHANNEL", "MAXCHANS", NULL, sTemp, sizeof(sTemp), ".\\Setup.ini");
if(iFlag == 0)
{
AfxMessageBox("Please set the channelnumber in the setup.ini first!");
return -1;
}
m_StatusBarCtl.GetClientRect(&rect);
int widths[4] = { rect.right/4, rect.right/2, rect.right*3/4, -1 };
m_StatusBarCtl.SetParts(4, widths );
m_iTotal = atoi(sTemp);
sprintf(sTemp,"总端口数: %d",m_iTotal);
m_StatusBarCtl.SetText(sTemp,0,0);
m_StatusBarCtl.SetText("呼入次数: 0",1,0);
m_StatusBarCtl.SetText("呼出次数: 0",2,0);
m_StatusBarCtl.SetText("联机状态: 0",3,0);
//获取运行时间
CTime tFirstTime;
tFirstTime = CTime::GetCurrentTime();
strcpy(sTemp,tFirstTime.Format("AI2001 Professional - [ 启动时间:%Y-%m-%d %H:%M:%S ]"));
this->SetWindowText( sTemp );
//初始化通道状态 0 无效通道 1 待机状态 2 通话状态 3 故障状态
int i;
for(i=0;i<1001;i++)
m_ChannelStatus[i] = 0;
for(i=0;i<=m_iTotal;i++)
m_ChannelStatus[i] = 1;
return 0;
}
void CAI2001Dlg::OnButtonExit()
{
// TODO: Add your control notification handler code here
SendMessage(WM_CLOSE);
//CDialog::OnOK();
}
void CAI2001Dlg::OnButtonSetup()
{
// TODO: Add your control notification handler code here
CSetupDlg setup;
m_iMyWindowFlag=1;
setup.DoModal();
m_iMyWindowFlag=0;
}
void CAI2001Dlg::OnButtonStart()
{
// TODO: Add your control notification handler code here
if (m_iFlag == 0)
{
if( RunAI2001( this->m_hWnd ) != 0 )
{
//AfxMessageBox("Start failed", MB_ICONEXCLAMATION);
return;
}
//m_btnStart.EnableWindow( FALSE );
m_btnStart.SetIcon(IDI_STOP);
m_btnStart.SetWindowText("停止");
m_btnSimuIvr.EnableWindow(TRUE); //刷新脚本按钮
UpdateData(FALSE);
m_iFlag = 1;
}
else
{
SendMessage(WM_CLOSE);
/*
if (!SetEvent(ghDLGCEvent)) // unsuccessful
{
AfxMessageBox("Stop failed", MB_ICONEXCLAMATION);
return;
}
m_btnStart.SetIcon(IDI_START);
m_btnStart.SetWindowText("启动");
UpdateData(FALSE);
m_iFlag = 0;
*/
}
}
void CAI2001Dlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_iCurrNo = PointToChannelNo(point);
if (m_iCurrNo != 0 && (m_iCurrNo <= m_iTotal))
{
CMenu menu;
CRect rect;
this->GetWindowRect(rect);
menu.LoadMenu(IDR_MYMENU);
char szTemp[20];
sprintf(szTemp,"通道号:%d",m_iCurrNo);
menu.ModifyMenu(0, MF_BYCOMMAND, 0, szTemp);
menu.EnableMenuItem(ID_MENUITEM_ONHOOK,MF_ENABLED);
if (m_ChannelStatus[m_iCurrNo] != 2)
menu.EnableMenuItem(ID_MENUITEM_ONHOOK,MF_GRAYED);
menu.EnableMenuItem(ID_MENUITEM_RESET,MF_ENABLED);
if (m_ChannelStatus[m_iCurrNo] != 3)
menu.EnableMenuItem(ID_MENUITEM_RESET,MF_GRAYED);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,rect.left+point.x+5,rect.top+point.y+30,this);
}
CDialog::OnRButtonDown(nFlags, point);
}
void CAI2001Dlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
/*
if (m_iCurrNo != 0 && m_iCurrNo <= m_iTotal && m_ChannelStatus[m_iCurrNo] == 1)
{
m_cs.Lock();
m_ChannelStatus[m_iCurrNo] = 2;
m_cs.Unlock();
iDrawFlag = 2;
m_iStatusNo = m_iCurrNo;
wprintf("channelno:%d",m_iCurrNo);
Invalidate(FALSE);
UpdateWindow();
}
*/
CDialog::OnLButtonDblClk(nFlags, point);
}
void CAI2001Dlg::OnMove(int x, int y)
{
CDialog::OnMove(x, y);
// TODO: Add your message handler code here
iDrawFlag=0;
}
int InitAI2001( void )
{
if ((ghDLGCEvent = CreateEvent(
NULL, // pointer to security attributes, we use default
FALSE, // flag for manual reset event, we choose auto-reset
FALSE, // flag for initial state, we choose unsignalled
NULL) // pointer to event-object name, we choose no name
) == NULL)// failure
{
AfxMessageBox("ghDLGCEvent = CreateEvent failed", MB_ICONEXCLAMATION);
return -1;
}
GetPrivateProfileString("PATH", "SYSPATH", "\\Pansr\\Voc\\", SVocDir, 128, ".\\Setup.ini" );
GetPrivateProfileString("PATH", "USRPATH", "\\Pansr\\Voc\\", GVocDir, 128, ".\\Setup.ini" );
GetPrivateProfileString("PATH", "FAXPATH","\\Pansr\\Fax\\", SFaxDir, 128, ".\\Setup.ini" );
char combvox[128] = ".\\combvox.ini";
int unit, tlen ;
CMindex *mindex = new CMindex;
mindex->InitCombvox( combvox, "MANDARIN" );
unit = mindex->GetCount();
tlen = mindex->GetCombBufLen();
pCombIdx[0] = new IDXINFO[unit];
pCombBuf[0] = new char[tlen];
memcpy( (char *)pCombIdx[0], mindex->GetCombIdx(), unit*sizeof(IDXINFO) );
memcpy( pCombBuf[0], mindex->GetCombBuf(), tlen );
CombCount[0] = unit;
mindex->ResetComb();
mindex->InitCombvox( combvox, "CANTONESE" );
unit = mindex->GetCount();
tlen = mindex->GetCombBufLen();
pCombIdx[1] = new IDXINFO[unit];
pCombBuf[1] = new char[tlen];
memcpy( (char *)pCombIdx[1], mindex->GetCombIdx(), unit*sizeof(IDXINFO) );
memcpy( pCombBuf[1], mindex->GetCombBuf(), tlen );
CombCount[1] = unit;
mindex->ResetComb();
mindex->ReadEnglish( combvox, "ENGLISH" );
unit = mindex->GetCount();
tlen = mindex->GetCombBufLen();
pCombIdx[2] = new IDXINFO[unit];
pCombBuf[2] = new char[tlen];
memcpy( (char *)pCombIdx[2], mindex->GetCombIdx(), unit*sizeof(IDXINFO) );
memcpy( pCombBuf[2], mindex->GetCombBuf(), tlen );
CombCount[2] = unit;
mindex->ResetComb();
delete mindex;
pSilenceBuf = new char[16000];
memset( pSilenceBuf, 0x08, 16000 );
maxchans = GetPrivateProfileInt("CHANNEL", "MAXCHANS", 4, ".\\Setup.ini" );
frontend = GetPrivateProfileInt("CHANNEL", "FRONTEND", 2, ".\\Setup.ini" );
char faxtype[12] = "";
GetPrivateProfileString("CHANNEL", "FAXRES", "VFAX",faxtype,12, ".\\Setup.ini" );
if( stricmp( faxtype, "GFAX" ) == 0 )
{
gammfax = 1;
faxchans = GetPrivateProfileInt("GFAX", "FAXCHANS", 0, ".\\Setup.ini" );
faxbdnum = GetPrivateProfileInt("GFAX", "FAXBDNUM", 0, ".\\Setup.ini" );
}
else
{
gammfax = 0;
faxchans = GetPrivateProfileInt("VFAX", "FAXCHANS", 0, ".\\Setup.ini" );
faxbdnum = GetPrivateProfileInt("VFAX", "FAXBDNUM", 0, ".\\Setup.ini" );
}
msichans = GetPrivateProfileInt("MSI", "MSICHANS", 0, ".\\Setup.ini" );
msibdnum = GetPrivateProfileInt("MSI", "MSIBDNUM", 0, ".\\Setup.ini" );
warnspan = GetPrivateProfileInt("WARN", "WARNSPAN", 4, ".\\Setup.ini" );
stopspan = GetPrivateProfileInt("WARN", "STOPSPAN", 6, ".\\Setup.ini" );
warntype = GetPrivateProfileInt("WARN", "WARNTYPE", 0, ".\\Setup.ini" );
return 0;
}
int RunAI2001( HWND hWnd )
{
int chdev;
if((chdev = dx_open("dxxxB1C1", 0)) == -1)
{
m_iMyWindowFlag=1;
AfxMessageBox("Dialogic Service is not running! \r\nPlease first run it!", MB_ICONEXCLAMATION );
m_iMyWindowFlag=0;
return -1;
}
else
{
dx_close(chdev);
}
DeleteFile("SourceMonitor.inf");
if (!ResetEvent(ghDLGCEvent)) // make sure ghDLGCEvent is unsignalled
{
AfxMessageBox("Reset event failed in OnDlgcButton", MB_ICONEXCLAMATION );
return -1;
}
//-----Run VSInterpreter thread
//
struct VSInterpreterThreadParam *pvsInterpreter;
pvsInterpreter = (struct VSInterpreterThreadParam *)malloc(sizeof(VSInterpreterThreadParam));
memset( (char *)pvsInterpreter, 0x0, sizeof(VSInterpreterThreadParam) );
pvsInterpreter->iChannelCount = maxchans;
//初始化
strcpy(pvsInterpreter->aszInstructionFileName, "d:\\ai2001\\script\\vscript_isee.ini" );
if( !AfxBeginThread(VSInterpreterThread,(LPVOID)pvsInterpreter) )
{
AfxMessageBox("AfxBeginThread VSInterpreter failed.", MB_ICONEXCLAMATION);
return -1;
}
Sleep(1000); //等待CONSOLE创建完毕
//-----Run Dialogic thread
//
ARG_STRUCT m_args;
m_args.hWnd = hWnd;
m_args.d4xbdnum = 1;
m_args.dtibdnum = 1;
m_args.maxchans = maxchans;
m_args.faxbdnum = faxbdnum;
m_args.faxchans = faxchans;
m_args.msibdnum = msibdnum;
m_args.msichans = msichans;
m_args.frontend = frontend;
m_args.scbus = TRUE;
m_args.routeag = TRUE;
m_args.boardtag = FALSE;
if (!AfxBeginThread(RunDialogic,(LPVOID)&m_args))
{
AfxMessageBox("AfxBeginThread RunDialogic failed.", MB_ICONEXCLAMATION);
return -1;
}
Sleep(4000);
return 0;
}
void CAI2001Dlg::OnCancel()
{
// TODO: Add your message handler code here and/or call default
//CDialog::OnCancel();
}
void CAI2001Dlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if(AfxMessageBox("您确实要退出吗?" ,MB_YESNO|MB_DEFBUTTON2) == IDYES)
{
SetEvent(ghDLGCEvent);
Sleep(4000);
CDialog::OnOK();
}
//CDialog::OnClose();
}
void CAI2001Dlg::OnButtonConsole()
{
// TODO: Add your control notification handler code here
if( __hStdOut == NULL )
{
CreatConsole();
iDrawFlag = 0;
Invalidate(FALSE);
UpdateWindow();
}
else
{
__hStdOut = NULL;
FreeConsole();
}
}
BOOL WINAPI HandlerRoutine( DWORD dwCtrlType )
{
__hStdOut = NULL;
FreeConsole();
return TRUE;
}
int CreatConsole( void )
{
AllocConsole();
SetConsoleTitle("Console Window");
__hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD co = {100, 100};
SetConsoleScreenBufferSize(__hStdOut, co);
SetConsoleCtrlHandler( HandlerRoutine, TRUE );
CWnd *pwnd = AfxGetMainWnd();
SetForegroundWindow(pwnd->m_hWnd);
return 0;
}
void CAI2001Dlg::OnButtonScript()
{
// TODO: Add your control notification handler code here
if( m_iFlag == 0 ) return;
if( !iShow )
{
vsInterpreter.m_psourceMonitor->ShowWindow( SW_SHOW );
iShow = 1;
}
else
{
vsInterpreter.m_psourceMonitor->ShowWindow( SW_HIDE );
iShow = 0;
}
}
BOOL CAI2001Dlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
switch(pMsg->message)
{
case WM_DLGC_STATE:
if (pMsg->lParam == ST_ERROR)
{
m_ChannelStatus[pMsg->wParam] = 3;
iDrawFlag = 3;
}
else if(pMsg->lParam == ST_WTRING ||pMsg->lParam == ST_ONHOOK)
{
m_ChannelStatus[pMsg->wParam] = 1;
iDrawFlag = 1;
}
else
{
m_ChannelStatus[pMsg->wParam] = 2;
iDrawFlag = 2;
}
m_iStatusNo=pMsg->wParam;
wprintf("channelno:%d state:%d",pMsg->wParam,pMsg->lParam);
if(m_iStatusNo>0&&m_iStatusNo<=360)
{
m_sub1Dlg.Invalidate(FALSE);
m_sub1Dlg.UpdateWindow();
}
if(m_iStatusNo>360&&m_iStatusNo<=720)
{
m_sub2Dlg.Invalidate(FALSE);
m_sub2Dlg.UpdateWindow();
}
if(m_iStatusNo>720&&m_iStatusNo<=1080)
{
m_sub3Dlg.Invalidate(FALSE);
m_sub3Dlg.UpdateWindow();
}
if(m_iStatusNo>1080&&m_iStatusNo<=1140)
{
m_sub4Dlg.Invalidate(FALSE);
m_sub4Dlg.UpdateWindow();
}
/* if(m_iStatusNo<=360)
::SendMessage(m_sub1Dlg.m_hWnd, WM_PAINT,0,0);
if(m_iStatusNo>360 && m_iStatusNo<=720)
::SendMessage(m_sub2Dlg.m_hWnd, WM_PAINT, 0,0);
if(m_iStatusNo>720 && m_iStatusNo<=1080)
::SendMessage(m_sub3Dlg.m_hWnd, WM_PAINT, 0,0);
if(m_iStatusNo>1080 && m_iStatusNo<=1440)
::SendMessage(m_sub4Dlg.m_hWnd, WM_PAINT, 0,0);
*/
break;
case WM_KEYDOWN: //屏蔽回车键
if(pMsg->wParam == VK_RETURN)
return TRUE;
case WM_DLGC_STOPPED:
case WM_DLGC_CODE:
default:
break;
}
return CDialog::PreTranslateMessage(pMsg);
}
void CAI2001Dlg::OnMenuitemOnhook()
{
// TODO: Add your command handler code here
/*
SendMessage(WM_POP_STATE, m_iCurrNo, 1 );
m_cs.Lock();
m_ChannelStatus[m_iCurrNo]=1;
m_cs.Unlock();
m_iStatusNo = m_iCurrNo;
iDrawFlag = 1;
Invalidate(FALSE);
UpdateWindow();
*/
}
void CAI2001Dlg::OnMenuitemReset()
{
// TODO: Add your command handler code here
SendMessage(WM_POP_STATE, m_iCurrNo, 2 );
}
void CAI2001Dlg::OnMenuitemScript()
{
// TODO: Add your command handler code here
SendMessage(WM_POP_STATE, m_iCurrNo, 3 );
}
void CAI2001Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
char aszTemp[100]="";
switch( nIDEvent )
{
case 1:
if( m_iFlag != 1 ) return;
sprintf(aszTemp, "呼入次数: %d", vsInterpreter.m_iCountOfTurnOnOfTotal_In );
m_StatusBarCtl.SetText(aszTemp, 1, 0);
sprintf(aszTemp, "呼出次数: %d", vsInterpreter.m_iCountOfTurnOnOfTotal_Out );
m_StatusBarCtl.SetText(aszTemp, 2, 0);
sprintf(aszTemp, "联机状态: %d", isConnect );
m_StatusBarCtl.SetText(aszTemp, 3, 0);
break;
case 2:
Ccs_sr_Connect();
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
//更新脚本,
//add by lj 2003/05/21
void CAI2001Dlg::OnButtonSimuivr()
{
//将内存中脚本文件重新读入内存
/*********************************************************
将m_vsFileBufferList(BUFFER末尾有0结束)中已经load进内存的所有文件
重新load一次。
重新load script.ini中引用的所有脚本到内存
------add by lj 2003/05/22
*********************************************************/
int j;
struct CurrentState *pcurrentState;
FILE *file;
int iFileSize;
for(int i=0; iaszInstructionFile, "rb");
if(file == NULL)
{
wprintf_err1("In LoadVSFileToBuffer_Refresh(%d) can not open %s", i, pcurrentState->aszInstructionFile);
return;
}
fseek(file, SEEK_SET, SEEK_END);
iFileSize = ftell(file) + 1; //在末尾增加一个0
fseek(file, SEEK_SET, SEEK_SET);
char *szFileBuf;
szFileBuf = (char *)malloc(iFileSize);
if(fread(szFileBuf, sizeof(char), iFileSize, file) != iFileSize - 1)
{
wprintf_err1("In LoadVSFileToBuffer_Refresh(%d), fread(%s) failed", i, pcurrentState->aszInstructionFile);
return;
}
szFileBuf[iFileSize - 1] = 0;
fclose(file);
//检查这个通道的脚本文件是否已被调入内存
for(j = 0; j < vsInterpreter.m_vsFileBufList.iCount; j ++)
{
if(stricmp((vsInterpreter.m_vsFileBufList.vsFileBuf)[j].aszVSFileName, pcurrentState->aszInstructionFile) == 0)
break;
}
if(j < vsInterpreter.m_vsFileBufList.iCount)
{//已被调入过
//刷新调入内存中的VSFILE
free((vsInterpreter.m_vsFileBufList.vsFileBuf)[j].szFileBuf); //释放原来的内存
(vsInterpreter.m_vsFileBufList.vsFileBuf)[j].szFileBuf = szFileBuf;
continue ;
}
//未被调入过,则调入内存
vsInterpreter.m_vsFileBufList.iCount ++;
vsInterpreter.m_vsFileBufList.vsFileBuf = (struct VSFileBuf *)realloc(vsInterpreter.m_vsFileBufList.vsFileBuf, vsInterpreter.m_vsFileBufList.iCount * sizeof(struct VSFileBuf));
(vsInterpreter.m_vsFileBufList.vsFileBuf)[vsInterpreter.m_vsFileBufList.iCount - 1].szFileBuf = szFileBuf;
(vsInterpreter.m_vsFileBufList.vsFileBuf)[vsInterpreter.m_vsFileBufList.iCount - 1].iFileBufLen = iFileSize;
strcpy((vsInterpreter.m_vsFileBufList.vsFileBuf)[vsInterpreter.m_vsFileBufList.iCount - 1].aszVSFileName, pcurrentState->aszInstructionFile);
}
//将script.ini中引用的子script调入内存
char szFileName[100] = "\0";
char aszTempKey[100] = "\0";
int len;
CStdioFile fTemp;
CString strTemp;
int nStart, nEnd;
if(fTemp.Open(".\\script.ini",CFile::modeRead) == 0)
return;
while( fTemp.ReadString(strTemp) )
{
if((nStart=strTemp.Find('=')) != -1 && (nEnd=strTemp.Find('#')) != -1)
{
memset(szFileName, 0x0, 100);
memset(aszTempKey, 0x0, 100);
strcpy(szFileName, strTemp.Mid(nStart+1, nEnd-nStart-1 ));
if( szFileName[0] != '\\' && szFileName[1] != ':' )
{
GetCurrentDirectory(100, aszTempKey);
len = strlen(aszTempKey);
if( aszTempKey[len-1] != '\\' )
{
strcat( aszTempKey, "\\Script\\" );
strcat( aszTempKey, szFileName );
}
strcpy( szFileName, aszTempKey );
}
if((file = fopen(szFileName, "rb")) == NULL)
{
continue;
}
fseek(file, SEEK_SET, SEEK_END);
iFileSize = ftell(file) + 1; //在末尾增加一个0
fseek(file, SEEK_SET, SEEK_SET);
char* szIniBuf;
szIniBuf = (char *)malloc(iFileSize);
if(fread(szIniBuf, sizeof(char), iFileSize, file) != iFileSize - 1)
{
wprintf_err1("In LoadVSFileToBuffer_Refresh(%d), fread(%s) failed", i, pcurrentState->aszInstructionFile);
return ;
}
szIniBuf[iFileSize - 1] = 0;
fclose(file);
//写到内存文件,先检查是否已经调入内存
for(j = 0; j < vsInterpreter.m_vsFileBufList.iCount; j ++)
{
if(stricmp((vsInterpreter.m_vsFileBufList.vsFileBuf)[j].aszVSFileName, szFileName) == 0)
break;
}
if(j < vsInterpreter.m_vsFileBufList.iCount)
{//已被调入过
//刷新调入内存中的VSFILE
free((vsInterpreter.m_vsFileBufList.vsFileBuf)[j].szFileBuf); //释放原来的内存
(vsInterpreter.m_vsFileBufList.vsFileBuf)[j].szFileBuf = szIniBuf;
(vsInterpreter.m_vsFileBufList.vsFileBuf)[j].iFileBufLen = iFileSize;
continue ;
}
//未被调入过,则调入内存
vsInterpreter.m_vsFileBufList.iCount ++;
vsInterpreter.m_vsFileBufList.vsFileBuf = (struct VSFileBuf *)realloc(vsInterpreter.m_vsFileBufList.vsFileBuf, vsInterpreter.m_vsFileBufList.iCount * sizeof(struct VSFileBuf));
(vsInterpreter.m_vsFileBufList.vsFileBuf)[vsInterpreter.m_vsFileBufList.iCount - 1].szFileBuf = szIniBuf;
(vsInterpreter.m_vsFileBufList.vsFileBuf)[vsInterpreter.m_vsFileBufList.iCount - 1].iFileBufLen = iFileSize;
strcpy((vsInterpreter.m_vsFileBufList.vsFileBuf)[vsInterpreter.m_vsFileBufList.iCount - 1].aszVSFileName, szFileName);
}
}
fTemp.Close();
return ;
}
//end add
void CAI2001Dlg::OnSelchangeTabIvr(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CTabCtrl *pTab=(CTabCtrl *)GetDlgItem(IDC_TAB_IVR);
int nPage=pTab->GetCurSel();
if(nPage==0)
{
iDrawFlag = 0; //初始化
m_sub2Dlg.ShowWindow(SW_HIDE);
m_sub3Dlg.ShowWindow(SW_HIDE);
m_sub4Dlg.ShowWindow(SW_HIDE);
m_sub1Dlg.ShowWindow(SW_SHOW);
::SendMessage(m_sub1Dlg.m_hWnd, WM_PAINT, 0, 0);
}
if(nPage==1)
{
iDrawFlag = 0; //初始化
m_sub1Dlg.ShowWindow(SW_HIDE);
m_sub3Dlg.ShowWindow(SW_HIDE);
m_sub4Dlg.ShowWindow(SW_HIDE);
m_sub2Dlg.ShowWindow(SW_SHOW);
::SendMessage(m_sub2Dlg.m_hWnd, WM_PAINT, 0, 0);
}
if(nPage==2)
{
iDrawFlag = 0;
m_sub2Dlg.ShowWindow(SW_HIDE);
m_sub1Dlg.ShowWindow(SW_HIDE);
m_sub4Dlg.ShowWindow(SW_HIDE);
m_sub3Dlg.ShowWindow(SW_SHOW);
::SendMessage(m_sub3Dlg.m_hWnd, WM_PAINT, 0, 0);
}
if(nPage==3)
{
iDrawFlag = 0;
m_sub2Dlg.ShowWindow(SW_HIDE);
m_sub3Dlg.ShowWindow(SW_HIDE);
m_sub1Dlg.ShowWindow(SW_HIDE);
m_sub4Dlg.ShowWindow(SW_SHOW);
::SendMessage(m_sub4Dlg.m_hWnd, WM_PAINT, 0, 0);
}
*pResult = 0;
}