dlggongzhuang.cpp
来自「串口收发工具」· C++ 代码 · 共 1,053 行 · 第 1/2 页
CPP
1,053 行
// DlgGongzhuang.cpp : implementation file
//
#include "stdafx.h"
#include "maintain.h"
#include "DlgGongzhuang.h"
#include "MainFrm.h"
#include "manager.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static UINT gz_indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_SEPARATOR,
};
extern bool bShowData;
/////////////////////////////////////////////////////////////////////////////
// CDlgGongzhuang
IMPLEMENT_DYNCREATE(CDlgGongzhuang, CFrameWnd)
CDlgGongzhuang::CDlgGongzhuang()
{
nCell = 35;//遥信表格宽度
nleft = 180;
ntop = 60;
nIconWidth = 25;
nCellYcWidth = 25;
nCellYcHigh = 22;
xBmp = 10;
yBmp = 120;
bYKBegin = false;
bBuzzerBegin = false;
nBtnIconWidth = 84;
nBtnIconHeight = 24;
nPowerWidth = 66;
nPowerHeight = 172;
timer1 = 500;
timer2 = 500;
timer3 = 3000;
nCurOperation = 0;
nYxLineLeft = nleft+60;
nYcLineLeft = 150;
nYtNoWidth = 100;
nYtNoHeight = 20;
nYcCount = 0;
nYxCount = 0;
m_ChangeCursor = false;
}
CDlgGongzhuang::~CDlgGongzhuang()
{
}
BEGIN_MESSAGE_MAP(CDlgGongzhuang, CFrameWnd)
//{{AFX_MSG_MAP(CDlgGongzhuang)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_TIMER()
ON_COMMAND(IDR_I2C, OnI2c)
ON_COMMAND(IDR_SPI, OnSpi)
ON_COMMAND(IDR_ADDRESSLINE, OnAddressline)
ON_COMMAND(IDR_BUZZER_ON, OnBuzzerOn)
ON_COMMAND(IDR_BUZZER_OFF, OnBuzzerOff)
ON_COMMAND(IDR_GZCLOCK, OnGzclock)
ON_COMMAND(IDR_GZCOMM, OnGzcomm)
ON_COMMAND(IDR_GZYCYX_ON, OnGzycyxOn)
ON_COMMAND(IDR_GZYCYX_OFF, OnGzycyxOff)
ON_COMMAND(IDR_GZ_YKBEGIN, OnGzYkbegin)
ON_COMMAND(IDR_GZ_YKEND, OnGzYkend)
ON_COMMAND(IDR_GZ_YT, OnGzYt)
ON_WM_SETCURSOR()
ON_COMMAND(IDR_GZCLOCKCALL, OnGzclockcall)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgGongzhuang message handlers
int CDlgGongzhuang::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
if (!m_toolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_TOOLTIPS ) ||
!m_toolBar.LoadToolBar(IDR_GZ))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_statusBar.Create(this) ||
!m_statusBar.SetIndicators(gz_indicators,
sizeof(gz_indicators)/sizeof(UINT)))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
// m_toolBar.EnableDocking(CBRS_ALIGN_ANY);
// EnableDocking(CBRS_ALIGN_ANY);
// DockControlBar(&m_toolBar);
editYtNo.Create(WS_VISIBLE|WS_CHILD|WS_BORDER,CRect(0,0,0,0),this,IDS_GZ_YTNO);
editYtValue.Create(WS_VISIBLE|WS_CHILD|WS_BORDER,CRect(0,0,0,0),this,IDS_GZ_YTVALUE);
editGzNo.Create(WS_VISIBLE|WS_CHILD|WS_BORDER,CRect(0,0,0,0),this,IDS_GZ_GZNO);
memset(ycValue,-1000,sizeof(ycValue));
memset(ycValueOld,-2000,sizeof(ycValueOld));
memset(yxValue,-1,sizeof(yxValue));
memset(yxValueOld,-1,sizeof(yxValueOld));
for(int i=0;i<GONGZHUANG_YXOUNT;i++)
yxicon[i].Create("",SW_HIDE|WS_CHILD|SS_ICON,CRect(0,0,0,0),this);
memset(bDataBuf,0,sizeof(bDataBuf));
//SetTimer(1,,NULL);
SetTimer(2,timer2,NULL);
CreateFont();
return 0;
}
void CDlgGongzhuang::CreateFont()
{
LOGFONT logfont;
memset(&logfont, 0, sizeof logfont);
logfont.lfHeight = 14;
logfont.lfWidth=7;
logfont.lfWeight=FW_NORMAL;
logfont.lfCharSet=DEFAULT_CHARSET;
lstrcpy(logfont.lfFaceName, _T("宋体"));
m_font.CreateFontIndirect(&logfont);
SetFont(&m_font);
}
void CDlgGongzhuang::OnPaint()
{
CPaintDC dc(this); // device context for painting
CFont *oldFont = dc.SelectObject((CFont*)&m_font);
PaintBkLine(dc);
dc.SelectObject(oldFont);
}
void CDlgGongzhuang::PaintBkLine(CPaintDC& dc)
{
CString str;
CPen pen(PS_SOLID,1,RGB(128,128,128));
CPen* oldPen;
oldPen = (CPen*)dc.SelectObject(&pen);
DrawBitmap(dc.GetSafeHdc(),0,41,IDB_GZ_CLOUD);
DrawTitleOnBmp(dc.GetSafeHdc(),60,120,_T("工装测试"));
DrawBitmap(dc.GetSafeHdc(),xBmp+25,yBmp+40,IDB_POWER_DF);
dc.MoveTo(0,41);
dc.LineTo(10000,41);
for (int i=0;i<9;i++)
{
dc.MoveTo(nYxLineLeft,ntop+i*nCell);
dc.LineTo(nYxLineLeft+nCell*8,ntop+i*nCell);
if (i<8)
{
str.Format(_T("遥信%d"),i*8);
dc.TextOut(nleft,ntop+i*nCell+8,str);
}
}
for (i=0;i<9;i++)
{
dc.MoveTo(nYxLineLeft+i*nCell,ntop);
dc.LineTo(nYxLineLeft+i*nCell,ntop+nCell*8);
}
for (i=0;i<5;i++)
{
dc.MoveTo(nYcLineLeft,ntop+9*nCell+i*nCellYcHigh);
dc.LineTo(nYcLineLeft+nCellYcWidth*24,ntop+9*nCell+i*nCellYcHigh);
if (i<4)
{
str.Format(_T("遥测%d"),i*8);
dc.TextOut(nYcLineLeft-80,ntop+9*nCell+i*nCellYcHigh,str);
}
}
for (i=0;i<9;i++)
{
dc.MoveTo(nYcLineLeft+i*3*nCellYcWidth,ntop+9*nCell);
dc.LineTo(nYcLineLeft+i*3*nCellYcWidth,ntop+9*nCell+4*nCellYcHigh);
}
dc.TextOut(nYcLineLeft-80,ntop+9*nCell+5*nCellYcHigh,_T("发送码:"));
dc.TextOut(nYcLineLeft,ntop+9*nCell+5*nCellYcHigh,strSendCode);
rcSendCode.left = nYcLineLeft;
rcSendCode.right = rcSendCode.left + 5000;
rcSendCode.top = ntop+9*nCell+5*nCellYcHigh;
rcSendCode.bottom = rcSendCode.top + 20;
dc.TextOut(nYxLineLeft+nCell*8+30,ntop+3,_T("遥调序号"));
dc.TextOut(nYxLineLeft+nCell*8+30,ntop+nYtNoHeight+6,_T("遥调值"));
dc.TextOut(nYxLineLeft+nCell*8+30,ntop+nYtNoHeight*3+6,_T("I2C/SPI号"));
dc.SelectObject(oldPen);
//YX黑边框
dc.MoveTo(nYxLineLeft-1,ntop-1);
dc.LineTo(nYxLineLeft+nCell*8+2,ntop-1);
dc.MoveTo(nYxLineLeft-1,ntop+8*nCell+1);
dc.LineTo(nYxLineLeft+nCell*8+2,ntop+8*nCell+1);
dc.MoveTo(nYxLineLeft-1,ntop-1);
dc.LineTo(nYxLineLeft-1,ntop+nCell*8+1);
dc.MoveTo(nYxLineLeft+8*nCell+1,ntop);
dc.LineTo(nYxLineLeft+8*nCell+1,ntop+nCell*8+1);
//YC黑边框
dc.MoveTo(nYcLineLeft-1,ntop+9*nCell-1);
dc.LineTo(nYcLineLeft+nCellYcWidth*24+2,ntop+9*nCell-1);
dc.MoveTo(nYcLineLeft-1,ntop+9*nCell+4*nCellYcHigh+1);
dc.LineTo(nYcLineLeft+nCellYcWidth*24+2,ntop+9*nCell+4*nCellYcHigh+1);
dc.MoveTo(nYcLineLeft-1,ntop+9*nCell-1);
dc.LineTo(nYcLineLeft-1,ntop+9*nCell+4*nCellYcHigh+1);
dc.MoveTo(nYcLineLeft+8*3*nCellYcWidth+1,ntop+9*nCell);
dc.LineTo(nYcLineLeft+8*3*nCellYcWidth+1,ntop+9*nCell+4*nCellYcHigh+1);
ShowGzYcYxData(dc);
}
void CDlgGongzhuang::OnDestroy()
{
CFrameWnd::OnDestroy();
KillTimer(1);
KillTimer(2);
bShowData = true;
m_font.DeleteObject();
((CMainFrame*)AfxGetMainWnd())->GzWndDestroy();
//::SendMessage(hWnd,MSG_GZWND_DESTROY,0,0);
// TODO: Add your message handler code here
}
void CDlgGongzhuang::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if (editYtNo)
{
editYtNo.MoveWindow(nYxLineLeft+nCell*8+100,ntop,nYtNoWidth,nYtNoHeight);
editYtValue.MoveWindow(nYxLineLeft+nCell*8+100,ntop+nYtNoHeight+3,nYtNoWidth,nYtNoHeight);
editGzNo.MoveWindow(nYxLineLeft+nCell*8+100,ntop+nYtNoHeight*3+3,nYtNoWidth,nYtNoHeight);
editYtNo.SetWindowText("0");
editYtValue.SetWindowText("0.0");
editGzNo.SetWindowText("0");
}
}
void CDlgGongzhuang::YkTestBegin()
{
KillTimer(1);
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] = 0x06;
byBufTemp[8] = 0;
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);
SendCodeToHEX(byBufTemp,11);
}
}
void CDlgGongzhuang::YkTestStop()
{
KillTimer(1);
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] = 0x06;
byBufTemp[8] = 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)
{
m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
SendCodeToHEX(byBufTemp,11);
}
}
void CDlgGongzhuang::YtTest()
{
nCurOperation = GONGZHUANG_TEST_YT;
KillTimer(1);
SetStatusBarInfo("");
CString strTemp;
editYtValue.GetWindowText(strTemp);
float fYtValue = (float)atof(strTemp);
WORD wYtValue = fYtValue*10;
editYtNo.GetWindowText(strTemp);
BYTE byYtNo = (BYTE)atoi(strTemp);
BYTE byBufTemp[13];
byBufTemp[0] = 0x7E;
byBufTemp[1] = byGroupNo;
byBufTemp[2] = byAddrNo;
byBufTemp[3] = 4;
byBufTemp[4] = 0;
byBufTemp[5] = 0x70;
byBufTemp[6] = 0;
byBufTemp[7] = 0x07;
byBufTemp[8] = byYtNo;
byBufTemp[9] = (BYTE)LOBYTE(wYtValue);
byBufTemp[10] = (BYTE)HIBYTE(wYtValue);
WORD parity = CManager::Crc16Parity(&byBufTemp[1],10);
byBufTemp[11] = (BYTE)LOBYTE(parity);
byBufTemp[12] = (BYTE)HIBYTE(parity);
m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
if(m_doc)
{
m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
SetTimer(3,timer3,NULL);
SendCodeToHEX(byBufTemp,13);
ShowWaitCursor(true);
}
}
void CDlgGongzhuang::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent) {
case 1:
CallYcYx();
break;
case 2:
RefreshGzYcYxDisplay();
break;
case 3:
OverTimeNotReturn();
break;
default:
break;
}
CFrameWnd::OnTimer(nIDEvent);
}
void CDlgGongzhuang::OverTimeNotReturn()
{
//((CMaintainApp*)AfxGetApp())->EndWaitCursor();
KillTimer(3);
ShowWaitCursor(false);
CString str = _T("测试超时未返回");
switch(nCurOperation) {
case GONGZHUANG_TEST_YT:
strRtn = _T("遥调") + str;
break;
case GONGZHUANG_TEST_I2C:
strRtn = _T("I2C") + str;
break;
case GONGZHUANG_TEST_SPI:
strRtn = _T("SPI") + str;
break;
case GONGZHUANG_TEST_ADDRLINE:
strRtn = _T("地址线")+ str;
break;
case GONGZHUANG_TEST_CLOCK:
strRtn = _T("时钟") + str;
break;
case GONGZHUANG_TEST_COMM:
strRtn = _T("串口") + str;
break;
case GONGZHUANG_TEST_CLOCKCALL:
strRtn = _T("召唤时钟超时未返回");
break;
default:
break;
}
SetStatusBarInfo(strRtn);
}
void CDlgGongzhuang::TransBuf(BYTE *buf,int len)
{
memcpy(bDataBuf,buf,len);
ProcessGzData(bDataBuf,len);
}
void CDlgGongzhuang::RefreshGzYcYxDisplay()
{
CRect rc;
//根据遥测值刷新显示
for (int i=0;i<4;i++)
{
for (int j=0;j<8;j++)
{
if (ycValue[i*8+j]!=ycValueOld[i*8+j])
{
rc.left = nYcLineLeft+j*3*nCellYcWidth+3;
rc.top = ntop+9*nCell+3+i*nCellYcHigh;
rc.right = rc.left + nCellYcWidth*2;
rc.bottom = rc.top + nCellYcHigh-5;
RedrawWindow(rc);
ycValueOld[i*8+j]=ycValue[i*8+j];
}
}
}
//根据遥信值刷新图标
for (int j=0;j<8;j++)
{
for (i=0;i<8;i++)
{
if (((j*8+i)>=nYxCount)||(nYxCount==0)) yxicon[i+j*8].ShowWindow(SW_HIDE);
if (yxValue[i+j*8]!=yxValueOld[i+j*8])
{
yxicon[i+j*8].SetIcon((yxValue[i+j*8]==0)?AfxGetApp()->LoadIcon(IDI_GZ0):AfxGetApp()->LoadIcon(IDI_GZ1));
yxicon[i+j*8].MoveWindow(nYxLineLeft+nCell*i+6,ntop+j*nCell+7,nIconWidth,nIconWidth,true);
yxicon[i+j*8].ShowWindow(SW_SHOW);
yxicon[i+j*8].RedrawWindow();
yxValueOld[i+j*8] = yxValue[i+j*8];
}
}
}
}
void CDlgGongzhuang::ShowGzYcYxData(CPaintDC& dc)
{
CString str;
//根据遥测值刷新显示
for (int i=0;i<4;i++)
{
for (int j=0;j<8;j++)
{
str.Format("%.1f",ycValue[i*8+j]);
if (((i*8+j)>=nYcCount)||nYcCount==0)
str = " ";
dc.TextOut(nYcLineLeft+3+j*3*nCellYcWidth,ntop+9*nCell+3+i*nCellYcHigh,str);
}
}
//根据遥信值刷新图标 yx的刷新在RefreshGzYcYxDisplay中
}
void CDlgGongzhuang::CallYcYx()
{
BYTE byBufTemp[9];
byBufTemp[0] = 0x7E;
byBufTemp[1] = byGroupNo;
byBufTemp[2] = byAddrNo;
byBufTemp[3] = 0;
byBufTemp[4] = 0;
byBufTemp[5] = 0x30;
byBufTemp[6] = 0;
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);
SendCodeToHEX(byBufTemp,9);
SetStatusBarInfo(_T("遥测遥信......"));
}
}
void CDlgGongzhuang::SetStatusBarInfo(CString str)
{
m_statusBar.SetPaneText(1,str);
}
void CDlgGongzhuang::I2CTest()
{
KillTimer(1);
nCurOperation = GONGZHUANG_TEST_I2C;
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] = 0x02;
CString strTemp;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?