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

📄 mainfrm.cpp

📁 The ITU-T(Telecommunication Standardization Sector)is a permanent organ of the International Telecom
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "Bedlamite.h"

#include "MainFrm.h"

#include "direct.h"
#include "CommandEngine.h"
#include "BedlamiteView.h"
#include "staticview.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
#define		WAITTIMER		10		//	等待用户提问、回答的定时器
#define		OVERTIME		3		//	超时时间
#define		OVERTIMES		2		//	超时次数

#define		REJECT_NUM		5
#define		WRITEPORT		0x378
#define		READPORT		0x379

int		g_nQNum		= ROBOT_ANSWER_COUNT;
int		g_nStatus	= 0;
extern	int		g_nDeviceID;
extern	BOOL	g_bPlayEnd;
extern	int		PlayFileAsync(int& wDeviceID, char *szWaveFileName, HWND hWnd);
extern	int		StopPlayFileAsync(int& wDeviceID, HWND hWnd);

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
	// Global help commands
	ON_COMMAND(ID_HELP_FINDER, CFrameWnd::OnHelpFinder)
	ON_COMMAND(ID_HELP, CFrameWnd::OnHelp)
	ON_COMMAND(ID_CONTEXT_HELP, CFrameWnd::OnContextHelp)
	ON_COMMAND(ID_DEFAULT_HELP, CFrameWnd::OnHelpFinder)
	
	ON_MESSAGE(WM_NEWUTTERANCE, OnBeginUtterance)
	ON_MESSAGE(WM_ADDWAVEFRAME, OnAddWaveFrame)
	ON_MESSAGE(WM_ENDUTTERANCE, OnEndUtterance)
	ON_MESSAGE(WM_DRAGONVOICE_FIRM, OnDragonFirm)
	ON_MESSAGE(WM_DRAGONVOICE_GETVOLUME, OnDragonGetVolume)
	ON_MESSAGE(MM_MCINOTIFY, OnMyPlayEnd)
	ON_MESSAGE(WM_PLAYTIME, OnPlayTime)
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	m_nOvertime	= 0;
	m_nGetVol	= 0;
	m_nLocalH	= -1;
	m_nDegree	= 0;
	m_bRun		= FALSE;
	m_bSection	= FALSE;
	m_bHave		= FALSE;
	m_sScroll	= "";
	m_aryList.RemoveAll();
}

CMainFrame::~CMainFrame()
{
	theApp.m_bSetTiemr = FALSE;
	StopPlayFileAsync(g_nDeviceID, this->m_hWnd);
	g_bPlayEnd	= TRUE;
	Sleep(100);
	FreeResource();
	theApp.m_LogTrace.WriteLine("释放资源");
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	//Insert Control of CMD
	CRect rc(5, 8, 50, 20);
	m_pEditCMD = new CEdit;
	m_pEditCMD = (CEdit *)m_wndToolBar.InsertControl(RUNTIME_CLASS(CEdit), 
		_T(""), rc, IDC_STATIC_CMD, WS_TABSTOP | ES_READONLY | ES_RIGHT);
	m_pEditCMD->SetWindowText("命令集:");
	rc = CRect(0,0,100,120);
	m_pcmbCMD =(CComboBox *) m_wndToolBar.InsertControl(RUNTIME_CLASS(CComboBox), 
		_T(""), rc, IDC_CMD, WS_VSCROLL | CBS_DROPDOWNLIST);
	m_pcmbCMD->AddString(_T("Default"));
	m_pcmbCMD->AddString(_T("CMDST_CMD1"));
	m_pcmbCMD->AddString(_T("CMDST_CMD2"));
	m_pcmbCMD->SetCurSel(0);

	//Insert Control of AM
	/*rc = CRect(5, 8, 65, 20);
	m_pEditAM = new CEdit;
	m_pEditAM = (CEdit *)m_wndToolBar.InsertControl(RUNTIME_CLASS(CEdit), 
		_T(""), rc, ID_CONTEXT_HELP, WS_TABSTOP | ES_READONLY | ES_RIGHT);
	m_pEditAM->SetWindowText("00:00:00");
	/*rc = CRect(0,0,100,120);
	m_pcmbAM =(CComboBox *) m_wndToolBar.InsertControl(RUNTIME_CLASS(CComboBox), 
		_T(""), rc, IDC_AM, WS_VSCROLL | CBS_DROPDOWNLIST);
	m_pcmbAM->AddString(_T("MALE"));
	m_pcmbAM->AddString(_T("FEMALE"));
	m_pcmbAM->SetCurSel(0);*/

	//	添加音量显示条
	rc = CRect(0, 0, 200, 20);
	m_pctrlVolume = (CProgressCtrl *)m_wndToolBar.InsertControl(RUNTIME_CLASS(CProgressCtrl), 
		_T(""), rc, ID_CTRL_VOLUME, 0);
	m_pctrlVolume->SetRange(0, 100);

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	cs.style = WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX;

	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers

// ==============================================================
// 自定义消息响应函数
LRESULT CMainFrame::OnBeginUtterance(WPARAM wParam, LPARAM lParam)
{
	return 0L;
}

LRESULT CMainFrame::OnAddWaveFrame(WPARAM wParam, LPARAM lParam)
{
	return 0L;
}

LRESULT CMainFrame::OnEndUtterance(WPARAM wParam, LPARAM lParam)
{
	return 0L;
}

LRESULT CMainFrame::OnDragonFirm(WPARAM wParam, LPARAM lParam)
{
	theApp.m_LogTrace.WriteLine("调用OnDragonFirm");
	//	判断是否处理识别结果
	//if (!m_bDispose) return 0L;

	//	清空识别结果
	int  nCount = 5;
	for (int i = 0; i < 5; i ++)
	{
		m_szResult[i][0]	= '\0';
	}

	SrGetFirmWords(m_szResult, nCount);

	CView *pView = GetActiveView();
	if (strlen(m_szResult[0]) > 0)
	{
		//	有识别结果,关闭定时器,播放相应语音文件
		//KillTimer(WAITTIMER);
		pView->SendMessage(WM_DISPLAYRESULT, (WPARAM)(m_szResult[0]), 0);
		
		for (int j = 0; j < m_aryList.GetSize(); j ++)
		{
			LPQUESTIONINFO lpInfo = (LPQUESTIONINFO)m_aryList.GetAt(j);
			if (strcmp(m_szResult[0], lpInfo->cmdbuf) == 0)
			{
				//	判断有几部分组成
				PlayFileAsync(g_nDeviceID, lpInfo->filename, this->m_hWnd);
				if (lpInfo->nP == 3)
				{
					//	播放数字
					CString sPath;
					sPath.Format("./Data/Wav/%03d.wav", theApp.m_nCount);
					PlayFileAsync(g_nDeviceID, (LPTSTR)(LPCTSTR)sPath, this->m_hWnd);

					sPath = "./Data/Wav/19_end.wav";
					PlayFileAsync(g_nDeviceID, (LPTSTR)(LPCTSTR)sPath, this->m_hWnd);
				}
				break;
			}
		}
		theApp.m_LogTrace.WriteLine("处理识别结果");

		//	继续识别
		StartRecord();
	}
	else
	{
		theApp.m_LogTrace.WriteLine("无识别结果");
		pView->SendMessage(WM_DISPLAYRESULT, (WPARAM)("无识别结果"), 0);
		Sleep(200);
		StartRecord();
	}
	return 0L;
}

LRESULT CMainFrame::OnDragonGetVolume(WPARAM wParam, LPARAM lParam)
{
	int nVol = SrGetAudioVolume();
	nVol *= 4;
	if (nVol > 100) nVol = 100;
	if (m_nGetVol == 1)
	{
		m_pctrlVolume->SetPos(nVol);
		m_nGetVol = 0;
	}
	else
		m_nGetVol ++;

	return 0L;
}
// ========================================================================= 

BOOL CMainFrame::InitRecognition()
{
	m_bDispose	= FALSE;
	
	try
	{
		GenerateQuesion("Data.dll");

		for (int i = 0; i < 5; i ++)
		{
			m_szResult[i]		= new char[MAX_PATH];
			m_szResult[i][0]	= '\0';
		}

		memset(m_chCurSelCmd, '\0', sizeof(char));
		strcpy(m_chAM, "MALE");
		strcpy(m_chCMD, "CMD");

		char dataPathName[MAX_PATH];
		_getcwd(dataPathName, MAX_PATH);
		if (SrInitDragonVoice (dataPathName, m_chAM, GetSafeHwnd()) == 0)
		{
			SrLoadCommandMode("CMD");
			SrSetActiveCommand("CMD");

			SrSetParameter(SET_EP_CHECK, 3);
		}
		else
		{
			AfxMessageBox("Initialize Command Engine Failed, Exit");
			exit(1);
		}
	}
	catch(...)
	{
		AfxMessageBox("Initialize Command Engine Failed, Exit");
		exit(1);
	}

⌨️ 快捷键说明

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