?? taskedport.h
字號:
// TaskedPort.h: interface for the CTaskedPort class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_TASKEDPORT_H__55962DCB_4955_4ACA_A605_74F41A464656__INCLUDED_)
#define AFX_TASKEDPORT_H__55962DCB_4955_4ACA_A605_74F41A464656__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define IDU_TASK_COMPLETE (WM_USER + 101)
#include "SerialPort.h"
#include "RichException.h"
#include "Waiting.h"
/*
CTaskedPort任務類
用戶可以指定任務的目標,即待查找的一組匹配字符串以及相應的匹配碼
任務完成時可以通過以下途徑通知用戶:
1. 給窗口發送消息;
2. 設置事件為有信號;
3. 調用OnTaskCompleted()方法;
4. 簡單地設置成員變量m_bCompleted;
*/
class CTaskedPort;
class CPortTask
{
protected:
CStringArray m_sMatches;
CByteArray m_nMatchCodes;
int m_nLimit;
HANDLE m_hCompleteEvent;
BOOL m_bCompleted;
CWnd * m_pOwner;
UINT m_nNotifyMessageID;
CMutex m_Mutex;
int m_nMatchIndex;
int m_nDirty; //數據臟計數,每次接收到數據,該計數自動加1
CTaskedPort * m_pOwnerPort;
CString m_sFullInput; //該任務消化的字符
void EndTask(); //結束當前任務
void CompleteTask(); //完成當前任務
public:
CStringArray * GetMatches();
CString m_sTaskName;
CString GetInputBuffer();
int GetDirty();
void SetBufferSize(int nLimit); //設置緩沖區長度
void AbortTask(); //取消當前任務
void ResetTask(); //重置當前任務
void SetOwner(CTaskedPort * pOwnerPort); //設置隸屬CTaskedPort
int GetMatchCode(); //獲取匹配碼
CPortTask(CString sTaskName);
~CPortTask();
void AttachEvent(CWnd * pOwner, UINT nMessageID = IDU_TASK_COMPLETE); //設置消息通知方式
void AttachEvent(HANDLE hEvent); //設置事件通知方式
int Catch(CString sInput); //消化字符串
BOOL IsCompleted(); //指定該任務是否已完成
virtual void OnTaskCompleted();
int AddMatches(CString sMatches); //添加多個匹配項,匹配項之間以|分隔
int AddMatch(CString sMatch); //添加匹配項
int AddMatch(CString sMatch, int nValue); //添加匹配項,并指定匹配碼
};
/*
支持任務的串口操作類
任務包括后臺任務和前臺任務
同時只允許一個任務被激活
如果存在前臺任務,后臺任務自動隱藏
載入新的任務,會自動覆蓋舊的任務
后臺任務一直存在
*/
class CTaskedPort : public CSerialPort
{
private:
CPortTask * m_pBGTask; //后臺任務
CPortTask * m_pFGTask; //前臺任務
public:
void WaitForTask(CPortTask *pTask, int nEndCondition, CWaiting * pWaiting, DWORD nIdleTimeLimit);
void Close();
//等待時間
enum
{
tmShort = 20,
tmNormal = 1000,
tmInitialize = 3000,
tmLong = 6000,
tmLonger = 20000,
};
//指定GetInput函數的行為
enum
{
//指定GetInput調用的終止條件
//0-3: 匹配條件
ecDirty = 0x0001, //有值即返回
ecWaiting = 0x0002, //不等待
ecOkOrError = 0x0004, //有OK或者ERROR即返回
ecCrlf = 0x0008, //有回車即返回
//4-7: 指定發生等待超時時GetInput的動作選項
ecRetryAlways = 0x0100, //一直等待
ecRetryPrompt = 0x0200, //提示用戶是否繼續
};
CMutex m_Mutex;
BOOL Open(CString sPort);
int Request(CString sRequest, CString & sResponse, int nEndCondition, CWaiting * pWaiting, char * sFind = NULL, CString sTaskName = "", DWORD nIdleTimeLimit = tmNormal);
DWORD SendCommand(CString sCommand, DWORD nIdleTimeLimit = tmNormal);
CString Request(CString sRequest, int nEndCondition, CWaiting * pWaiting, char * sFind = NULL, CString sTaskName = "", DWORD nIdleTimeLimit = tmNormal);
void UnloadTask(CPortTask * pTask);
void LoadFGTask(CPortTask * pTask);
void LoadBGTask(CPortTask * pTask);
CString m_sInputBuffer;
void OnEvRxChar();
CTaskedPort();
virtual ~CTaskedPort();
};
#endif // !defined(AFX_TASKEDPORT_H__55962DCB_4955_4ACA_A605_74F41A464656__INCLUDED_)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -