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

📄 autodemo.cpp

📁 自编的串口通信程序
💻 CPP
字号:
// AutoDemo.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "AutoDemo.h"

#include "MainFrm.h"
#include "ChildFrm.h"
#include "AutoDemoDoc.h"
#include "AutoDemoView.h"
#include "TraceDoc.h"
#include "TraceView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAutoDemoApp

BEGIN_MESSAGE_MAP(CAutoDemoApp, CWinApp)
	//{{AFX_MSG_MAP(CAutoDemoApp)
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
	ON_COMMAND(ID_START_SCRIPT_EXEC, OnStartCommThread)
	ON_UPDATE_COMMAND_UI(ID_START_SCRIPT_EXEC, OnUpdateStartCommThread)
	ON_COMMAND(ID_PAUSE_SCRIPT_EXEC, OnSuspendCommThread)
	ON_UPDATE_COMMAND_UI(ID_PAUSE_SCRIPT_EXEC, OnUpdateSuspendCommThread)
	ON_THREAD_MESSAGE(WM_GEN_COMM_CMD_RSP,OnGenCommCmdRsp)
	ON_COMMAND(ID_STOP_SCRIPT_EXEC, OnStopScriptExec)
	ON_UPDATE_COMMAND_UI(ID_STOP_SCRIPT_EXEC, OnUpdateStopScriptExec)
	//}}AFX_MSG_MAP
	// Standard file based document commands
	ON_COMMAND(ID_FILE_NEW,OnFileNew)
	ON_COMMAND(ID_FILE_OPEN,OnFileOpen)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAutoDemoApp construction

CAutoDemoApp::CAutoDemoApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
	m_ScriptOpen=NULL;
	m_pGenCommThrd=NULL;
	m_scriptExeState.status=SCRIPT_STOPPED;
	m_scriptExeState.cmdSeq=-1;
	pDocScn=NULL;
	pDocTra=NULL;
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CAutoDemoApp object

CAutoDemoApp theApp;
CString traceStr;
/////////////////////////////////////////////////////////////////////////////
// CAutoDemoApp initialization

BOOL CAutoDemoApp::InitInstance()
{
	AfxEnableControlContainer();

	// Standard initialization
	// If you are not using these features and wish to reduce the size
	//  of your final executable, you should remove from the following
	//  the specific initialization routines you do not need.

#ifdef _AFXDLL
	Enable3dControls();			// Call this when using MFC in a shared DLL
#else
	Enable3dControlsStatic();	// Call this when linking to MFC statically
#endif

	// Change the registry key under which our settings are stored.
	// TODO: You should modify this string to be something appropriate
	// such as the name of your company or organization.
	SetRegistryKey(_T("Local AppWizard-Generated Applications"));

	LoadStdProfileSettings();  // Load standard INI file options (including MRU)

	// Register the application's document templates.  Document templates
	//  serve as the connection between documents, frame windows and views.

	pDocTemplateScn = new CMultiDocTemplate(
		IDR_AUTODETYPE,
		RUNTIME_CLASS(CAutoDemoDoc),
		RUNTIME_CLASS(CChildFrame), // custom MDI child frame
		RUNTIME_CLASS(CAutoDemoView));
	AddDocTemplate(pDocTemplateScn);

	pDocTemplateTrace = new CMultiDocTemplate(
		IDS_DOC_TYPE_TRACE,
		RUNTIME_CLASS(CTraceDoc),
		RUNTIME_CLASS(CChildFrame), // custom MDI child frame
		RUNTIME_CLASS(CTraceView));
	AddDocTemplate(pDocTemplateTrace);

	// create main MDI Frame window
	CMainFrame* pMainFrame = new CMainFrame;
	if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
		return FALSE;
	m_pMainWnd = pMainFrame;

	// Parse command line for standard shell commands, DDE, file open
	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);
    // DON'T display a new MDI child window during startup!!!
   cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

	// Dispatch commands specified on the command line
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;

	// The main window has been initialized, so show and update it.
	pMainFrame->ShowWindow(m_nCmdShow);
	pMainFrame->UpdateWindow();
	
	if(!m_pGenCommThrd)
	{
	m_pGenCommThrd=::AfxBeginThread(RUNTIME_CLASS(CGenCOMM),THREAD_PRIORITY_NORMAL,0,0,NULL);
	ASSERT(m_pGenCommThrd);
	m_pGenCommThrd->m_bAutoDelete=FALSE;
	}


	return TRUE;
}


/////////////////////////////////////////////////////////////////////////////
// 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)
		// No message handlers
	//}}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()

// App command to run the dialog
void CAutoDemoApp::OnAppAbout()
{
	CAboutDlg aboutDlg;
	aboutDlg.DoModal();
}

/////////////////////////////////////////////////////////////////////////////
// CAutoDemoApp message handlers


void CAutoDemoApp::OnFileNew()
{
	if (m_pDocManager != NULL)
	{
	  ASSERT(pDocTemplateScn != NULL);
	  ASSERT_KINDOF(CDocTemplate, pDocTemplateScn);
	  if(!m_ScriptOpen)
	  {		

		pDocTemplateTrace->OpenDocumentFile(NULL);

		pDocTemplateScn->OpenDocumentFile(NULL);

		POSITION pos = pDocTemplateScn->GetFirstDocPosition();
		pDocScn=(CAutoDemoDoc*)pDocTemplateScn->GetNextDoc(pos);
	
		pos = pDocTemplateTrace->GetFirstDocPosition();
		pDocTra=(CTraceDoc*)pDocTemplateTrace->GetNextDoc(pos);
		m_ScriptOpen=TRUE;
	


	  }else
	  {

		if(OnExitScriptExe()==FALSE)
			return;
		// get name/title of document
		CString name=pDocScn->GetPathName();
		if (!name.IsEmpty())
		{
			VERIFY(name.LoadString(AFX_IDS_UNTITLED));
		}
	
		CString prompt;
	    AfxFormatString1(prompt, IDS_CLOSE_CUR_SCRIPT, name);
       switch(AfxMessageBox(prompt, MB_YESNOCANCEL, IDS_CLOSE_CUR_SCRIPT))
	   {
   		case IDCANCEL:
// 	     	return FALSE;       // don't continue
            break;
		case IDYES:
			{
			pDocScn=NULL;
			pDocTra=NULL;

			pDocTemplateTrace->CloseAllDocuments(FALSE);
			pDocTemplateScn->CloseAllDocuments(FALSE);
			   		
			pDocTemplateTrace->OpenDocumentFile(NULL);	
			pDocTemplateScn->OpenDocumentFile(NULL);

			POSITION pos = pDocTemplateScn->GetFirstDocPosition();
			pDocScn=(CAutoDemoDoc*)pDocTemplateScn->GetNextDoc(pos);
		
			pos = pDocTemplateTrace->GetFirstDocPosition();
			pDocTra=(CTraceDoc*)pDocTemplateTrace->GetNextDoc(pos);
			}
			break;

		case IDNO:
			// If not saving changes, revert the document
			break;

		default:
			ASSERT(FALSE);
			break;
	   }
	  }
	}
		// if returns NULL, the user has already been alerted
}
void CAutoDemoApp::OnFileOpen()
{
	if(OnExitScriptExe()==FALSE)
	   return;

	if (m_pDocManager != NULL)
	{
		// prompt the user (with all document templates)
		CString newName;
		ASSERT(pDocTemplateScn != NULL);
		ASSERT_KINDOF(CDocTemplate, pDocTemplateScn);
		if (!(m_pDocManager->DoPromptFileName(newName, AFX_IDS_OPENFILE,
		OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, TRUE, pDocTemplateScn)))
		return; // open cancelled
		
		if(pDocScn==NULL&&pDocTra==NULL) //open new
		{
		  pDocTemplateTrace->OpenDocumentFile(NULL);	
		  m_pDocManager->OpenDocumentFile(newName);

	   	  POSITION pos = pDocTemplateScn->GetFirstDocPosition();
		  pDocScn=(CAutoDemoDoc*)pDocTemplateScn->GetNextDoc(pos);
	
		  pos = pDocTemplateTrace->GetFirstDocPosition();
		  pDocTra=(CTraceDoc*)pDocTemplateTrace->GetNextDoc(pos);

		  m_ScriptOpen=TRUE;

		  return;
		}
		
	   CString prompt;
	   AfxFormatString1(prompt, IDS_CLOSE_CUR_SCRIPT, newName);
       switch(AfxMessageBox(prompt, MB_YESNOCANCEL, IDS_CLOSE_CUR_SCRIPT))
	   {
   		case IDCANCEL:
// 	     	return FALSE;       // don't continue
            break;
		case IDYES:
			{
			pDocScn=NULL;
			pDocTra=NULL;

			pDocTemplateTrace->CloseAllDocuments(FALSE);
			pDocTemplateScn->CloseAllDocuments(FALSE);
			   		
			pDocTemplateTrace->OpenDocumentFile(NULL);	
		    m_pDocManager->OpenDocumentFile(newName);

			POSITION pos = pDocTemplateScn->GetFirstDocPosition();
			pDocScn=(CAutoDemoDoc*)pDocTemplateScn->GetNextDoc(pos);
		
			pos = pDocTemplateTrace->GetFirstDocPosition();
			pDocTra=(CTraceDoc*)pDocTemplateTrace->GetNextDoc(pos);
			}
			break;

		case IDNO:
			// If not saving changes, revert the document
			break;

		default:
			ASSERT(FALSE);
			break;
	   }
		// if returns NULL, the user has already been alerted
	}

}

void CAutoDemoApp::OnStartCommThread() 
{
	// TODO: Add your command handler code here
	
	

	if(m_scriptExeState.status==SCRIPT_STOPPED&&pDocScn->m_cmdStr.cmdNumber!=0) //let's restart
	{
		m_scriptExeState.status=SCRIPT_STARTED;
		m_scriptExeState.cmdSeq=-1;
		m_pGenCommThrd->PostThreadMessage(WM_GEN_COMM_CMD,0,0);
	}else if(++m_scriptExeState.cmdSeq<pDocScn->m_cmdStr.cmdNumber)//ok ,let's continue
	{
		m_scriptExeState.status=SCRIPT_STARTED;
		m_pGenCommThrd->PostThreadMessage(WM_GEN_COMM_CMD,
                                      (WPARAM)((pDocScn->m_cmdStr.cmdStr[m_scriptExeState.cmdSeq].str)),0);
	}else
		m_scriptExeState.status=SCRIPT_STOPPED;
	
}

void CAutoDemoApp::OnUpdateStartCommThread(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here

    if(pDocScn!=NULL&&
		m_scriptExeState.status!=SCRIPT_STARTED
		)
		pCmdUI->Enable(TRUE);
	else 
		pCmdUI->Enable(FALSE);

}

void CAutoDemoApp::OnSuspendCommThread() 
{
	// TODO: Add your command handler code here
	m_scriptExeState.status=SCRIPT_PAUSED;
}

void CAutoDemoApp::OnUpdateSuspendCommThread(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(pDocScn!=NULL&&
		m_scriptExeState.status==SCRIPT_STARTED
		)
		pCmdUI->Enable(TRUE);
	else 
		pCmdUI->Enable(FALSE);

	
}

void CAutoDemoApp::OnGenCommCmdRsp(WPARAM wParam, LPARAM lParam)
{    
	pDocTra->UpdateAllViews(NULL,1);

	switch(wParam)
	{
    case CMD_EXECUTED: 
	case CMD_SKIPPED:
		if(m_scriptExeState.status==SCRIPT_STARTED&&
		  ++m_scriptExeState.cmdSeq<pDocScn->m_cmdStr.cmdNumber
		  )//Communication starts ok
		{

		//Next CMD
		m_pGenCommThrd->PostThreadMessage(WM_GEN_COMM_CMD,
										  (WPARAM)((pDocScn->m_cmdStr.cmdStr[m_scriptExeState.cmdSeq].str)),0);
		}else if(m_scriptExeState.cmdSeq==pDocScn->m_cmdStr.cmdNumber&&
				 m_scriptExeState.status==SCRIPT_STARTED)
		{
			m_scriptExeState.cmdSeq=-1;
			m_scriptExeState.status=SCRIPT_STOPPED;
		}
		break;
	case CMD_EXECUTING:
		break;
	}
}

int CAutoDemoApp::ExitInstance() 
{
	// TODO: Add your message handler code here
	if(m_pGenCommThrd!=NULL)
	{
		m_pGenCommThrd->PostThreadMessage(WM_QUIT,0,0);
		DWORD dwExitCode=-1;
		for(;;)
		{
			if(::GetExitCodeThread(m_pGenCommThrd->m_hThread,&dwExitCode)&&dwExitCode!=STILL_ACTIVE)
				break;
		}
		delete m_pGenCommThrd;
		m_pGenCommThrd=NULL;
	}

	return CWinApp::ExitInstance();
}

void CAutoDemoApp::OnStopScriptExec() 
{
	// TODO: Add your command handler code here
	m_scriptExeState.cmdSeq=-1;
	m_scriptExeState.status=SCRIPT_STOPPED;
}

void CAutoDemoApp::OnUpdateStopScriptExec(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
    if(pDocScn!=NULL&&
		m_scriptExeState.status!=SCRIPT_STOPPED
		)
		pCmdUI->Enable(TRUE);
	else 
		pCmdUI->Enable(FALSE);
}

BOOL CAutoDemoApp::OnExitScriptExe()
{
	
	if(m_scriptExeState.status!=SCRIPT_STOPPED)
	{
  	  m_pGenCommThrd->SuspendThread();
	  switch(AfxMessageBox("Stop the current running script?",MB_OKCANCEL))
		{
		  case IDCANCEL:
			  {
				m_pGenCommThrd->ResumeThread();
  		  	    return FALSE;
			  }
	      case IDYES:
			  {
				m_scriptExeState.status=SCRIPT_STOPPED;
			    return TRUE;
			  }
	  }
	}
	return TRUE;
}

⌨️ 快捷键说明

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