📄 xt9702slavedlg.cpp
字号:
// Xt9702SlaveDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Xt9702Slave.h"
#include "Xt9702SlaveDlg.h"
#include "ComSetting.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CXt9702SlaveDlg dialog
UINT CommProc( LPVOID pParam )
{
OVERLAPPED os;
DWORD dwMask, dwTrans;
COMSTAT ComStat;
DWORD dwErrorFlags;
CXt9702SlaveDlg *pDoc = ( CXt9702SlaveDlg* )pParam;
memset( &os, 0, sizeof( OVERLAPPED ));
os.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
if( os.hEvent == NULL ) {
AfxMessageBox( "Can't create event object!" );
return (UINT)-1;
}
while( pDoc->m_bConnected ) {
ClearCommError( pDoc->m_hCom, &dwErrorFlags, &ComStat );
if( ComStat.cbInQue ) {
// 无限等待WM_COMMNOTIFY消息被处理完
WaitForSingleObject( pDoc->m_hPostMsgEvent, INFINITE );
ResetEvent( pDoc->m_hPostMsgEvent );
// 通知视图
PostMessage( pDoc->GetSafeHwnd(), WM_COMMNOTIFY, EV_RXCHAR, 0 );
continue;
}
dwMask = 0;
if( !WaitCommEvent( pDoc->m_hCom, &dwMask, &os )) { // 重叠操作
if( GetLastError() == ERROR_IO_PENDING ) // 无限等待重叠操作结果
GetOverlappedResult( pDoc->m_hCom, &os, &dwTrans, TRUE );
else {
CloseHandle( os.hEvent );
return ( UINT )-1;
}
}
}
CloseHandle( os.hEvent );
return 0L;
}
LRESULT CXt9702SlaveDlg::MainRecv( WPARAM wParam, LPARAM lParam )
{
int nLength = 0;
int m_start = 0;
BYTE* pData = NULL;
DWORD m_dwOld_Count = 0;
if( !m_bConnected || ( wParam & EV_RXCHAR ) != EV_RXCHAR ) { // 是否是EV_RXCHAR事件?
SetEvent( m_hPostMsgEvent ); // 允许发送下一个WM_COMMNOTIFY消息
return 0L;
}
nLength = ReadCommData( &RecBuf.buffer[RecBuf.count], XT9702_MAX_BUFFER - RecBuf.count );
if( nLength<= 0 ) {
SetEvent( m_hPostMsgEvent );
return 0L;
}
RecBuf.count += nLength;
m_dwOld_Count = RecBuf.count;
if( RecBuf.count <= 0 || RecBuf.count > XT9702_MAX_BUFFER ) {
RecBuf.count = 0;
SetEvent( m_hPostMsgEvent );
return 0L;
}
while( RecBuf.count >= XT9702_MIN_BUFFER ) { //加入自己的判断条件
m_start = m_dwOld_Count - RecBuf.count;
pData = NULL;
pData = &RecBuf.buffer[m_start];
if( !m_bIsSyn ) {
if( IsSynHead( pData ) ) {
m_bIsSyn = TRUE;
m_nrecState = XT9702S_CTRL;
RecBuf.count -= XT9702_MIN_BUFFER;
OnShowMSG( pData, 6 );
}
else {
RecBuf.count--;
}
continue;
}
if( m_nrecState == XT9702S_CTRL ) {
if( IsGetCRC8Check( pData, XT9702_MIN_BUFFER ) ) {
OnShowMSG( pData, 6 );
m_nFrameType = *(pData+1);
m_nrecState = XT9702S_INFO;
RecBuf.count -= XT9702_MIN_BUFFER;
}
else {
RecBuf.count--;
}
continue;
}
if( m_nrecState == XT9702S_INFO ) {
if( IsSynHead( pData ) ) {
m_bIsSyn = TRUE;
m_nrecState = XT9702S_CTRL;
RecBuf.count -= XT9702_MIN_BUFFER;
OnShowMSG( pData, 6 );
continue;
}
else {
if( IsGetCRC8Check( pData, XT9702_MIN_BUFFER ) ) {
MainProc( pData, XT9702_MIN_BUFFER );
OnShowMSG( pData, 6 );
RecBuf.count -= XT9702_MIN_BUFFER;
continue;
}
else {
RecBuf.count--;
continue;
}
}
}
}
SetEvent( m_hPostMsgEvent ); //允许发送下一个信息
return 0L;
}
void CXt9702SlaveDlg::MainProc( BYTE* buffer, DWORD len )
{
if( m_nFrameType == XT9702C_YK_SELECT ) {
if( buffer[0] != XT9702F_YK_SELECT ) return;
if( buffer[1] != buffer[3] || buffer[2] != buffer[4] ) return;
if( buffer[1] != 0xcc && buffer[1] != 0x33 ) return;
SetYk( buffer[2], buffer[1], buffer[0] );
}
else if( m_nFrameType == XT9702C_YK_EXECUTE ) {
if( buffer[0] != XT9702F_YK_EXECUTE ) return;
if( buffer[1] != buffer[3] || buffer[2] != buffer[4] ) return;
if( buffer[1] != 0xaa ) return;
SetYk( buffer[2], buffer[1], buffer[0] );
}
else if( m_nFrameType == XT9702C_YK_CANCEL ) {
if( buffer[0] != XT9702F_YK_CANCEL ) return;
if( buffer[1] != buffer[3] || buffer[2] != buffer[4] ) return;
if( buffer[1] != 0x55 ) return;
SetYk( buffer[2], buffer[1], buffer[0] );
}
else if( m_nFrameType == XT9702C_SET_TIME ) {
if( buffer[0] == XT9702F_SET_TIME_LOW ) {
time.wMilliseconds = buffer[2] & 0x03;time.wMilliseconds <<= 8;
time.wMilliseconds += buffer[1];
time.wSecond= buffer[3] & 0x3f;
time.wMinute = buffer[4] & 0x3f;
return;
}
else if( buffer[0] == XT9702F_SET_TIME_HIGH ) {
time.wHour = buffer[1] & 0x1f;
time.wDay = buffer[2] & 0x1f;
time.wMonth = buffer[3] & 0x0f;
time.wYear = 2000 + buffer[4];
SetSystemTime( &time );
}
}
}
void CXt9702SlaveDlg::SetYk( int order, BYTE value, BYTE act )
{
m_Yk.order = order;
m_Yk.value = value;
m_Yk.act = act;
}
BOOL CXt9702SlaveDlg::GetYk( int &order, BYTE &value, BYTE &act )
{
order = m_Yk.order;
value = m_Yk.value;
act = m_Yk.act;
ClearYk();
return TRUE;
}
void CXt9702SlaveDlg::ClearYk( void )
{
memset( &m_Yk, -1, sizeof( m_Yk ) );
}
void CXt9702SlaveDlg::MainSend( void )
{
BOOL bInsert;
BYTE buffer[XT9702_MIN_BUFFER];
if( m_nSendState == XT9702S_SYNC ) {
buffer[0] = 0xeb; buffer[1] = 0x90;
buffer[2] = 0xeb; buffer[3] = 0x90;
buffer[4] = 0xeb; buffer[5] = 0x90;
WriteCommData( buffer, 6 );
RichEdit.crTextColor = RGB( 255, 0, 0 );
OnShowMSG( buffer );
m_nSendState = XT9702S_CTRL;
}
else if( m_nSendState == XT9702S_CTRL ) {
buffer[0] = XT9702S_CMD_BYTE;
switch( m_nCurFrame ) {
case XT9702P_A_FRAME:
buffer[1] = XT9702C_A_FRAME;
buffer[2] = m_nInfoCount;
if( buffer[2] > 16 ) buffer[2] = 16;
break;
case XT9702P_B_FRAME:
buffer[1] = XT9702C_B_FRAME;
buffer[2] = m_nInfoCount;
if( buffer[2] > 16 ) buffer[2] = 16;
break;
case XT9702P_C_FRAME:
buffer[1] = XT9702C_C_FRAME;
buffer[2] = m_nInfoCount;
if( buffer[2] > 16 ) buffer[2] = 16;
break;
case XT9702P_D1_FRAME:
buffer[1] = XT9702C_D1_FRAME;
buffer[2] = m_nInfoCount;
break;
case XT9702P_D2_FRAME:
buffer[1] = XT9702C_D2_FRAME;
buffer[2] = m_nInfoCount;
break;
case XT9702P_E_FRAME:
buffer[1] = XT9702C_E_FRAME;
buffer[2] = m_nInfoCount;
break;
case XT9702P_TIME_FRAME:
buffer[1] = XT9702C_SET_TIME;
buffer[2] = 0x02;
break;
}
buffer[3] = 0;
buffer[4] = 0;
buffer[5] = GetCRC8Check( buffer, 5 );
WriteCommData( buffer, 6 );
RichEdit.crTextColor = RGB( 255, 255, 0 );
OnShowMSG( buffer );
m_nSendState = XT9702S_INFO;
}
else if( m_nSendState == XT9702S_INFO ) {
//insert other frame
bInsert = FALSE;
if( (m_nCurInfo & 0x0f)+m_nNeedInsert < m_nInfoCount ) {
//dose have yk verify frame
if( GetYKFrame( buffer ) ) {
bInsert = TRUE;
}
//dose have yxbw frame
else if( GetCOSFrame( buffer ) ) {
bInsert = TRUE;
}
else {
m_nNeedInsert = 0;
}
}
if( m_nNeedInsert <= 0 ) {
m_nNeedInsert = 3;
}
if( bInsert ) {
switch( m_nCurFrame ) {
case XT9702P_A_FRAME:
case XT9702P_B_FRAME:
case XT9702P_C_FRAME:
m_nYCCurInfo++;
m_nCurInfo = m_nYCCurInfo;
break;
case XT9702P_D1_FRAME:
m_nYXCurInfo++;
m_nCurInfo = m_nYXCurInfo;
break;
case XT9702P_D2_FRAME:
m_nYMCurInfo++;
m_nCurInfo = m_nYMCurInfo;
break;
case XT9702P_E_FRAME:
m_nSOECurInfo++;
m_nCurInfo = m_nSOECurInfo;
m_nCurInfo++;
break;
}
}
else {
switch( m_nCurFrame ) {
case XT9702P_A_FRAME:
case XT9702P_B_FRAME:
case XT9702P_C_FRAME:
GetYCFrame( m_nCurInfo, buffer );
OnShowMSG( m_nYCCurInfo/8, m_nYCCurInfo );
m_nYCCurInfo++;
m_nCurInfo = m_nYCCurInfo;
break;
case XT9702P_D1_FRAME:
GetYXFrame( m_nCurInfo, buffer );
OnShowMSG( m_nYXCurInfo, m_nYXCurInfo );
m_nYXCurInfo++;
m_nCurInfo = m_nYXCurInfo;
break;
case XT9702P_D2_FRAME:
GetYMFrame( m_nCurInfo, buffer );
m_nYMCurInfo++;
m_nCurInfo = m_nYMCurInfo;
break;
case XT9702P_E_FRAME:
GetSOEFrame( m_nCurInfo, buffer );
m_nSOECurInfo++;
m_nCurInfo = m_nSOECurInfo;
break;
case XT9702P_TIME_FRAME:
// GetSetTimeFrame( m_nCurInfo, buffer );
m_nTimeCurInfo++;
m_nCurInfo = m_nTimeCurInfo;
break;
}
}
buffer[5] = GetCRC8Check( buffer, 5 );
WriteCommData( buffer, 6 );
OnShowMSG( buffer );
if( m_nCurFrame == XT9702P_A_FRAME ||
m_nCurFrame == XT9702P_B_FRAME ||
m_nCurFrame == XT9702P_C_FRAME ) {
if( (m_nCurInfo & 0x0f) == 0 || (m_nCurInfo & 0x0f) >= m_nInfoCount ) {
m_nSendState = XT9702S_IDLE;
m_nCurFrame = 0;
}
}
else {
if( (m_nCurInfo & 0xff) >= m_nInfoCount ) {
m_nSendState = XT9702S_IDLE;
m_nCurFrame = 0;
}
}
}
else {
m_nCurFrame = 0;
if( m_nFramePoll & XT9702P_A_FRAME ) {
m_nFramePoll &= ~XT9702P_A_FRAME;
m_nCurFrame = XT9702P_A_FRAME;
m_nInfoCount = GetYCFrameCount();
if( m_nYCCurInfo >= m_nInfoCount ) m_nYCCurInfo = 0;
m_nCurInfo = m_nYCCurInfo;
if( m_nInfoCount > m_nCurInfo ) {
m_nInfoCount -= m_nCurInfo;
}
if( m_nInfoCount > 16 ) m_nInfoCount = 16;
m_nSendState = XT9702S_SYNC;
if( m_nInfoCount == 0 ) m_nSendState = XT9702S_IDLE;
}
else if( m_nFramePoll & XT9702P_D1_FRAME ) {
m_nFramePoll &= ~XT9702P_D1_FRAME;
m_nCurFrame = XT9702P_D1_FRAME;
m_nInfoCount = GetYXFrameCount();
m_nYXCurInfo = 0;
m_nCurInfo = m_nYXCurInfo;
m_nSendState = XT9702S_SYNC;
if( m_nInfoCount == 0 ) m_nSendState = XT9702S_IDLE;
}
else if( m_nFramePoll & XT9702P_D2_FRAME ) {
m_nFramePoll &= ~XT9702P_D2_FRAME;
m_nCurFrame = XT9702P_D2_FRAME;
m_nInfoCount = GetYMFrameCount();
m_nYMCurInfo = 0;
m_nCurInfo = m_nYMCurInfo;
m_nSendState = XT9702S_SYNC;
if( m_nInfoCount == 0 ) m_nSendState = XT9702S_IDLE;
}
else if( m_nFramePoll & XT9702P_E_FRAME ) {
m_nFramePoll &= ~XT9702P_E_FRAME;
m_nCurFrame = XT9702P_E_FRAME;
m_nInfoCount = GetSOEFrameCount();
m_nSOECurInfo = 0;
m_nCurInfo = 0;
m_nSendState = XT9702S_SYNC;
}
else if( m_nFramePoll & XT9702P_TIME_FRAME ) {
m_nFramePoll &= ~XT9702P_TIME_FRAME;
m_nCurFrame = XT9702P_TIME_FRAME;
m_nInfoCount = 2;
m_nTimeCurInfo = 0;
m_nCurInfo = 0;
m_nSendState = XT9702S_SYNC;
}
}
}
CXt9702SlaveDlg::CXt9702SlaveDlg(CWnd* pParent /*=NULL*/)
: CDialog(CXt9702SlaveDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CXt9702SlaveDlg)
// 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);
}
CXt9702SlaveDlg::~CXt9702SlaveDlg()
{
if( m_bConnected ) {
CloseComm();
}
}
void CXt9702SlaveDlg::OnCancel()
{
if( m_bConnected ) {
CloseComm();
}
CDialog::OnCancel();
}
void CXt9702SlaveDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CXt9702SlaveDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CXt9702SlaveDlg, CDialog)
//{{AFX_MSG_MAP(CXt9702SlaveDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE( WM_COMMNOTIFY, MainRecv )
ON_WM_TIMER()
//}}AFX_MSG_MAP
ON_BN_CLICKED( IDC_BUTTON_START, OnStart )
ON_BN_CLICKED( IDC_BUTTON_SHOWYX, OnShowYx )
ON_BN_CLICKED( IDC_BUTTON_SHOWYC, OnShowYc )
ON_BN_CLICKED( IDC_BUTTON_SHOWYM, OnShowYm )
ON_BN_CLICKED( IDC_BUTTON_CLEAR, OnClear )
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CXt9702SlaveDlg message handlers
void CXt9702SlaveDlg::MasterInit( void )
{
m_pEdit = NULL;
m_pRichEditSend = NULL;
m_pRichEditRec = NULL;
m_pThread = NULL;
m_pButton = NULL;
m_pYxListCtrl = NULL;
m_pYcListCtrl = NULL;
m_pYmListCtrl = NULL;
m_pYxNum = NULL;
m_pYcNum = NULL;
m_pYmNum = NULL;
m_pYkNum = NULL;
m_pEditYx = NULL;
m_pEditYc = NULL;
m_pEditYm = NULL;
m_pEditYk = NULL;
m_pbtShowYx = NULL;
m_pbtShowYc = NULL;
m_pbtShowYm = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -