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