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

📄 xt9702slavedlg.cpp

📁 南瑞xt9702规约
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -