dlggongzhuang.cpp

来自「串口收发工具」· C++ 代码 · 共 1,053 行 · 第 1/2 页

CPP
1,053
字号
	editGzNo.GetWindowText(strTemp);
	byBufTemp[8] = BYTE(atoi(strTemp));
	WORD parity = CManager::Crc16Parity(&byBufTemp[1],8);
	byBufTemp[9] =  (BYTE)LOBYTE(parity);
	byBufTemp[10] = (BYTE)HIBYTE(parity);

	m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
	if(m_doc)
	{
		m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
		SetTimer(3,timer3,NULL);
		ShowWaitCursor(true);
		SendCodeToHEX(byBufTemp,11);
	}
}

void CDlgGongzhuang::ShowWaitCursor(bool bShow)
{
	if (bShow)
	{
		m_ChangeCursor = TRUE;
		((CMaintainApp*)AfxGetApp())->BeginWaitCursor();
	}
	else
	{
		((CMaintainApp*)AfxGetApp())->EndWaitCursor();
		m_ChangeCursor = FALSE;
	}
}

void CDlgGongzhuang::SPITest()
{
	KillTimer(1);
	nCurOperation = GONGZHUANG_TEST_SPI;

	SetStatusBarInfo("");	

	BYTE byBufTemp[11];
	byBufTemp[0] = 0x7E;
	byBufTemp[1] = byGroupNo;
	byBufTemp[2] = byAddrNo;
	byBufTemp[3] = 2;
	byBufTemp[4] = 0;
	byBufTemp[5] = 0x70;
	byBufTemp[6] = 0;
	byBufTemp[7] = 0x03;
	CString strTemp;
	editGzNo.GetWindowText(strTemp);
	byBufTemp[8] = BYTE(atoi(strTemp));
	WORD parity = CManager::Crc16Parity(&byBufTemp[1],8);
	byBufTemp[9] =  (BYTE)LOBYTE(parity);
	byBufTemp[10] = (BYTE)HIBYTE(parity);

	m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
	if(m_doc)
	{
		m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
		SetTimer(3,timer3,NULL);
		ShowWaitCursor(true);
		SendCodeToHEX(byBufTemp,11);
	}
}

void CDlgGongzhuang::AddrLineTest()
{
	KillTimer(1);
	nCurOperation = GONGZHUANG_TEST_ADDRLINE;

	SetStatusBarInfo("");

	BYTE byBufTemp[11];
	byBufTemp[0] = 0x7E;
	byBufTemp[1] = byGroupNo;
	byBufTemp[2] = byAddrNo;
	byBufTemp[3] = 2;
	byBufTemp[4] = 0;
	byBufTemp[5] = 0x70;
	byBufTemp[6] = 0;
	byBufTemp[7] = 0x04;
	CString strTemp;
	editGzNo.GetWindowText(strTemp);
	byBufTemp[8] = BYTE(atoi(strTemp));
	WORD parity = CManager::Crc16Parity(&byBufTemp[1],8);
	byBufTemp[9] =  (BYTE)LOBYTE(parity);
	byBufTemp[10] = (BYTE)HIBYTE(parity);

	m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
	if(m_doc)
	{
		m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
		SetTimer(3,timer3,NULL);
		ShowWaitCursor(true);
		SendCodeToHEX(byBufTemp,11);
	}
}

void CDlgGongzhuang::BuzzerTest(bool bBeginOrStop)
{
	KillTimer(1);
	nCurOperation = GONGZHUANG_TEST_BUZZER;
	BYTE byBufTemp[11];
	byBufTemp[0] = 0x7E;
	byBufTemp[1] = byGroupNo;
	byBufTemp[2] = byAddrNo;
	byBufTemp[3] = 2;
	byBufTemp[4] = 0;
	byBufTemp[5] = 0x70;
	byBufTemp[6] = 0;
	byBufTemp[7] = 0x05;
	byBufTemp[8] = bBeginOrStop?0:1;
	WORD parity = CManager::Crc16Parity(&byBufTemp[1],8);
	byBufTemp[9] =  (BYTE)LOBYTE(parity);
	byBufTemp[10] = (BYTE)HIBYTE(parity);

	m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
	if(m_doc)
	{
		for(int i=0;i<3;i++)
			m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
		SendCodeToHEX(byBufTemp,11);
	}
}

void CDlgGongzhuang::CommTest()
{
	KillTimer(1);

	nCurOperation = GONGZHUANG_TEST_COMM;

	SetStatusBarInfo("");

	BYTE byBufTemp[12];
	byBufTemp[0] = 0x7E;
	byBufTemp[1] = byGroupNo;
	byBufTemp[2] = byAddrNo;
	byBufTemp[3] = 3;
	byBufTemp[4] = 0;
	byBufTemp[5] = 0xf0;//工装功能码为70,上传时最高位为1,即f0
	byBufTemp[6] = 0;
	//串口测试正确的标准是收发一致,此处为了让返回的数据在处理时方便,自定义了一个扩展功能码ff
	//这样返回判断时ff标明是串口测试返回
	byBufTemp[7] = 0xff;
	byBufTemp[8] = 0;
	byBufTemp[9] = 0;
	byBufTemp[10] = LOBYTE(CManager::Crc16Parity(&byBufTemp[1],9));
	byBufTemp[11] = HIBYTE(CManager::Crc16Parity(&byBufTemp[1],9));

	m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
	if(m_doc)
	{
		m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
		SetTimer(3,timer3,NULL);
		ShowWaitCursor(true);
		SendCodeToHEX(byBufTemp,11);
	}
}

void CDlgGongzhuang::ClockTest()
{
	KillTimer(1);

	nCurOperation = GONGZHUANG_TEST_CLOCK;

	SetStatusBarInfo(_T("时钟测试,设置当前时间..."));	

	BYTE byBufTemp[18];
	byBufTemp[0] = 0x7E;
	byBufTemp[1] = byGroupNo;
	byBufTemp[2] = byAddrNo;
	byBufTemp[3] = 0x09;
	byBufTemp[4] = 0x00;
	byBufTemp[5] = 0x10;
	byBufTemp[6] = 0x00;//基站状态
	t = CTime::GetCurrentTime();
	byBufTemp[7] = LOBYTE(t.GetYear());
	byBufTemp[8] = HIBYTE(t.GetYear());
	byBufTemp[9] = t.GetMonth();
	byBufTemp[10] = t.GetDay();
	byBufTemp[11] = t.GetHour();
	byBufTemp[12] = t.GetMinute();
	byBufTemp[13] = t.GetSecond();
	byBufTemp[14] = 0x00;
	byBufTemp[15] = 0x00;
	byBufTemp[16] = LOBYTE(CManager::Crc16Parity(&byBufTemp[1],15));
	byBufTemp[17] = HIBYTE(CManager::Crc16Parity(&byBufTemp[1],15));

	m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
	if(m_doc)
	{
		m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
		ShowWaitCursor(true);
		SendCodeToHEX(byBufTemp,18);
		Sleep(2000);
		SetStatusBarInfo(_T("时钟测试,召唤时间..."));		

		//发送完当前时间后召唤时间
		memset(byBufTemp,0,sizeof(byBufTemp));
		byBufTemp[0] = 0x7E;
		byBufTemp[1] = byGroupNo;
		byBufTemp[2] = byAddrNo;
		byBufTemp[3] = 0;
		byBufTemp[4] = 0;
		byBufTemp[5] = 0x11;
		byBufTemp[6] = 0x00;//
		byBufTemp[7] = LOBYTE(CManager::Crc16Parity(&byBufTemp[1],6));
		byBufTemp[8] = HIBYTE(CManager::Crc16Parity(&byBufTemp[1],6));
		
		m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
		if(m_doc)
		{
			m_doc->SendData(byBufTemp,9,true);
			SetTimer(3,timer3,NULL);
			SendCodeToHEX(byBufTemp,9);
		}
	}
}

void CDlgGongzhuang::ProcessGzData(BYTE *buf,int len)
{
	CString strTemp;
	BYTE byHead = 0x7E;
	BYTE byFuncCode,byExtendFuncCode;
	int i;
	CString str;

	if ((buf[0]!=byHead)||(buf[1]!=byGroupNo)||(buf[2]!=byAddrNo))//帧头组号站号
		return ;
	
	byFuncCode = buf[5];		//功能码
	byExtendFuncCode = buf[7];	//扩展功能码

	switch(byFuncCode) {
	case 0xB0://ycyx return
		if (nCurOperation!=GONGZHUANG_TEST_YCYX) return;
		nYcCount = buf[7];//yc count
		nYxCount = buf[8]*8;//yx count 
		
		if(nYcCount>GONGZHUANG_YCOUNT)
			nYcCount = GONGZHUANG_YCOUNT;
		if (nYxCount>GONGZHUANG_YXOUNT)
			nYxCount = GONGZHUANG_YXOUNT;
				
		//取得遥测
		for (i=0;i<nYcCount;i++)
		{
			WORD wTemp = MAKEWORD(buf[2*i+9],buf[2*i+10]);
			ycValue[i] = (float)0.1*(wTemp&0x7fff);
			if(wTemp&0x8000)
				ycValue[i] *= -1;
		}
		
		//取得遥信
		for(i=0;i<nYxCount/8;i++)
			for (int j=0;j<8;j++)
				yxValue[i*8+j] = (buf[9+2*buf[7]+i]>>j)&0x1;
		SetStatusBarInfo(_T("遥测遥信"));
		break;

	case 0x91://召唤时钟返回
		KillTimer(3);
		TimeDelay(MAKEWORD(buf[7],buf[8]),buf[9],buf[10],buf[11],buf[12],buf[13]);
		break;
	case 0xf0://工装测试返回
		switch(byExtendFuncCode) {
		case 0x02://I2C return
			str = _T("I2C");
			break;
		case 0x03://SPI return
			str = _T("SPI");
			break;
		case 0x04://addrline return
			str = _T("地址线");
			break;
		case 0x07://yt return
			str = _T("遥调");
			break;
		case 0xff://comm return
			str = _T("串口");
			break;
		default:
			break;
		}
		ShowWaitCursor(false);
		if(buf[9])
			strRtn = str + GZ_TEST_ERROR;
		else
			strRtn = str + GZ_TEST_OK;
			
		SetStatusBarInfo(strRtn);
		KillTimer(3);
		break;
		
	default:
		break;
	}
}
void CDlgGongzhuang::TimeDelay(int i1,int i2,int i3,int i4,int i5,int i6)
{
	CTime tRtn(i1,i2,i3,i4,i5,i6);
	CTimeSpan ts = tRtn - t;
	if (nCurOperation == GONGZHUANG_TEST_CLOCKCALL) 
		strRtn.Format("返回时间:%s",tRtn.Format("%Y-%m-%d %H:%M:%S"));
	else
		strRtn.Format("返回时间:%s(%d秒)",tRtn.Format("%Y-%m-%d %H:%M:%S"),
			ts.GetTotalSeconds()-2);
	SetStatusBarInfo(strRtn);
	ShowWaitCursor(false);
}

void CDlgGongzhuang::OnI2c() 
{
	// TODO: Add your command handler code here
	OnGzycyxOff();
	I2CTest();
	SetStatusBarInfo(_T("I2C测试..."));
}

void CDlgGongzhuang::OnSpi() 
{
	// TODO: Add your command handler code here
	OnGzycyxOff();
	SPITest();
	SetStatusBarInfo(_T("SPI测试..."));
}

void CDlgGongzhuang::OnAddressline() 
{
	// TODO: Add your command handler code here
	OnGzycyxOff();
	AddrLineTest();
	SetStatusBarInfo(_T("地址线测试..."));
}

void CDlgGongzhuang::OnBuzzerOn() 
{
	// TODO: Add your command handler code here
	OnGzycyxOff();
	BuzzerTest(1);
	SetStatusBarInfo(_T("蜂鸣器测试"));
}

void CDlgGongzhuang::OnBuzzerOff() 
{
	// TODO: Add your command handler code here
	OnGzycyxOff();
	BuzzerTest(0);
	SetStatusBarInfo(_T("蜂鸣器测试结束"));
}

void CDlgGongzhuang::OnGzclock() 
{
	// TODO: Add your command handler code here
	OnGzycyxOff();
	ClockTest();
}

void CDlgGongzhuang::OnGzcomm() 
{
	// TODO: Add your command handler code here
	OnGzycyxOff();
	CommTest();
	SetStatusBarInfo(_T("串口测试..."));
}

void CDlgGongzhuang::OnGzycyxOn() 
{
	// TODO: Add your command handler code here
	nCurOperation = GONGZHUANG_TEST_YCYX;
	t = SetTimer(1,timer1,NULL);
}

void CDlgGongzhuang::OnGzycyxOff() 
{
	// TODO: Add your command handler code here
	KillTimer(1);

	nYcCount = 0;
	nYxCount = 0;

	memset(ycValue,-1000,sizeof(ycValue));
	memset(ycValueOld,-2000,sizeof(ycValueOld));
	memset(yxValue,-1,sizeof(yxValue));
	memset(yxValueOld,-1,sizeof(yxValueOld));

	CRect rc;
	rc.left = nYcLineLeft;
	rc.right = nYcLineLeft+nCellYcWidth*24;
	rc.top = ntop+9*nCell;
	rc.bottom = ntop+9*nCell+4*nCellYcHigh;

	RedrawWindow(rc);
	for (int j=0;j<8;j++)
	{
		for (int i=0;i<8;i++)
		{
			yxicon[i+j*8].ShowWindow(SW_HIDE);
			yxicon[i+j*8].RedrawWindow();
		}
	}

	SetStatusBarInfo(_T("遥测遥信结束"));
	BYTE bytemp;
	SendCodeToHEX(&bytemp,0);
	Sleep(1000);
}

void CDlgGongzhuang::OnGzYkbegin() 
{
	// TODO: Add your command handler code here
	OnGzycyxOff();
	YkTestBegin();
	SetStatusBarInfo(_T("遥控开始"));
}

void CDlgGongzhuang::OnGzYkend() 
{
	// TODO: Add your command handler code here
	OnGzycyxOff();
	YkTestStop();
	SetStatusBarInfo(_T("遥控结束"));
}

void CDlgGongzhuang::OnGzYt() 
{
	// TODO: Add your command handler code here
	OnGzycyxOff();
	YtTest();	
	SetStatusBarInfo(_T("遥调操作..."));
}

static CString strSendCodeOld;
void CDlgGongzhuang::SendCodeToHEX(BYTE* buf,int len)
{
	strSendCode.Empty();
	
	CString strTemp;

	for (int i=0;i<len;i++)
	{
		strTemp.Format("%02X ",buf[i]);
		strSendCode += strTemp;
	}
	if (strSendCode.Compare(strSendCodeOld)!=0)
	{
		RedrawWindow(rcSendCode);
		strSendCodeOld = strSendCode;
	}
	
}															
					
void CDlgGongzhuang::DrawBitmap(HDC hDC, int nX, int nY, UINT nID)
{
	HBITMAP hBitmap,hOldBitmap;
	hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(nID),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
	BITMAP bm;
	GetObject(hBitmap,sizeof(BITMAP),&bm);
	HDC hMemDC = CreateCompatibleDC(hDC);
	hOldBitmap = (HBITMAP)SelectObject(hMemDC,hBitmap);

	BitBlt(hDC,nX,nY,bm.bmWidth,bm.bmHeight,hMemDC,0,0,SRCCOPY);
	SelectObject(hMemDC,hOldBitmap);
	DeleteDC(hMemDC);
	DeleteObject(hBitmap);
}

void CDlgGongzhuang::DrawTitleOnBmp(HDC hDC, int nX, int nY, CString str)
{
	HFONT oldFont = (HFONT)SelectObject(hDC,HFONT(m_font));
	int oldMode = GetBkMode(hDC);
	SetBkMode(hDC,TRANSPARENT);
	TextOut(hDC,nX,nY,str,str.GetLength());
	SetBkMode(hDC,oldMode);
	SelectObject(hDC,oldFont);
}

BOOL CDlgGongzhuang::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	// TODO: Add your message handler code here and/or call default
	if (m_ChangeCursor) 
	{ 
		RestoreWaitCursor(); 
		return TRUE; 
	} 
	return CFrameWnd::OnSetCursor(pWnd, nHitTest, message);
}

void CDlgGongzhuang::OnGzclockcall() 
{
	// TODO: Add your command handler code here
	OnGzycyxOff();
	
	nCurOperation = GONGZHUANG_TEST_CLOCKCALL;

	SetStatusBarInfo(_T("召唤时钟..."));	

	BYTE byBufTemp[9];
	byBufTemp[0] = 0x7E;
	byBufTemp[1] = byGroupNo;
	byBufTemp[2] = byAddrNo;
	byBufTemp[3] = 0;
	byBufTemp[4] = 0;
	byBufTemp[5] = 0x11;
	byBufTemp[6] = 0x00;//
	byBufTemp[7] = LOBYTE(CManager::Crc16Parity(&byBufTemp[1],6));
	byBufTemp[8] = HIBYTE(CManager::Crc16Parity(&byBufTemp[1],6));
	
	m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
	if(m_doc)
	{
		m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
		SetTimer(3,timer3,NULL);
		ShowWaitCursor(true);
		SendCodeToHEX(byBufTemp,9);
	}
}

BOOL CDlgGongzhuang::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if ((pMsg->message == WM_MOUSEMOVE)||(pMsg->message == WM_LBUTTONDOWN))
		if (m_ChangeCursor)
			return true;
	
	return CFrameWnd::PreTranslateMessage(pMsg);
}

⌨️ 快捷键说明

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