📄 zzmondlg.cpp
字号:
// zzMonDlg.cpp : implementation file
//
#include "stdafx.h"
#include "zzMon.h"
#include "zzMonDlg.h"
#include "CAN.h"
#include "ControlCAN.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CZzMonDlg dialog
CZzMonDlg::CZzMonDlg(CWnd* pParent /*=NULL*/)
: CDialog(CZzMonDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CZzMonDlg)
m_edit1 = 0;
m_Showing1_CO2 = 0.0f;
m_Showing1_IndoorTemperature = 0.0f;
m_Showing1_IndoorHumidity = 0.0f;
m_Showing_OutdoorTemperature = 0.0f;
m_Showing_OutdoorHumidity = 0.0f;
//}}AFX_DATA_INIT
ShowWindows[0].SensorParameter.OnLine=TRUE;
ShowWindows[0].IfWork=TRUE;
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CZzMonDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CZzMonDlg)
DDX_Control(pDX, IDC_EDIT7, m_test1);
DDX_Text(pDX, IDC_EDIT1, m_edit1);
DDX_Text(pDX, IDC_EDIT2, m_Showing1_CO2);
DDX_Text(pDX, IDC_EDIT3, m_Showing1_IndoorTemperature);
DDX_Text(pDX, IDC_EDIT4, m_Showing1_IndoorHumidity);
DDX_Text(pDX, IDC_EDIT5, m_Showing_OutdoorTemperature);
DDX_Text(pDX, IDC_EDIT6, m_Showing_OutdoorHumidity);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CZzMonDlg, CDialog)
//{{AFX_MSG_MAP(CZzMonDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_MESSAGE(WM_MY_MESSAGECAN, OnCANNotify)
ON_BN_CLICKED(IDOK, InputShowID1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CZzMonDlg message handlers
BOOL CZzMonDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
// UINT InWin;
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization her
// InitialWindows();
CWinThread* m_pThread;
if(OpenConnection( ))
{
// MessageBox("启动成功");
CANSTATENOW.m_bConnected=TRUE;
CANSTATENOW.STATE=1;
//CANSTATELAST.m_bConnected=TRUE;
// CANSTATELAST.STATE=1;
m_pThread=AfxBeginThread(CANProc, this,//this,
THREAD_PRIORITY_NORMAL, 0,
CREATE_SUSPENDED, NULL); // 创建并挂起线程
if(m_pThread==NULL)
{
VCI_CloseDevice(HostDevtype,HostDevind);
return FALSE;
}
else
{
CANSTATENOW.m_bConnected=TRUE;
m_pThread->ResumeThread(); // 恢复线程运行
}
if((m_hPostMsgEvent=CreateEvent(NULL, TRUE, TRUE, NULL))==NULL)
return FALSE;
SENDCANBroadcasting(); //发送广播帧
SetTimer(1,500,NULL); //启动定时器1,用于窗口更新
ResendTimer1Count=0;
TargetWindow=0;
IfTimer1Received=TRUE;
if((m_hPostMsgEvent=CreateEvent(NULL, TRUE, TRUE, NULL))==NULL)
{
return FALSE;
}
}
return TRUE; // return TRUE unless you set the focus to a control
}
void CZzMonDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CZzMonDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CZzMonDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//DEL void CZzMonDlg::OnChangeEdit1()
//DEL {
//DEL UINT Num ;
//DEL
//DEL Num=CZzMonDlg::JudgeWindowsEdit(m_edit1);
//DEL
//DEL if (Num==3)
//DEL {
//DEL ShowWindows[0].IfWork=TRUE;
//DEL ShowWindows[0].SensorParameter.OnLine=TRUE;
//DEL ShowWindows[0].SensorParameter.ID=m_edit1;
//DEL IfTimer1Received=TRUE;
//DEL //CANSTATENOW.ID=ShowWindows[0].SensorParameter.ID;
//DEL
//DEL }
//DEL
//DEL // TODO: If this is a RICHEDIT control, the control will not
//DEL // send this notification unless you override the CDialog::OnInitDialog()
//DEL // function and call CRichEditCtrl().SetEventMask()
//DEL // with the ENM_CHANGE flag ORed into the mask.
//DEL
//DEL // TODO: Add your control notification handler code here
//DEL
//DEL }
////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void CZzMonDlg::OnTimer(UINT nIDEvent)
{
switch (nIDEvent)
{
case 1: //用于向显示窗口更新发数据帧
//Communication();
SENDCAN(2,1,NULL);
Showing();
//case 2:
}
// TODO: Add your message handler code here and/or call default
CDialog::OnTimer(nIDEvent);
}
////////////////////////////////////判断是否输入传感器号正确,
//////////返回1表示还没有选择,返回2表示输入错误,返回3表示正确
UINT CZzMonDlg::JudgeWindowsEdit(LONG edit)
{
if (edit==0)
{
MessageBox("请选择下位机");
return 1;
}
else
{
if (edit<=1 && edit>=MAXNODE)
{
MessageBox("请正确选择下位机");
return 2;
}
}
return 3;
}
///////////////////////////////初始化显示窗口
VOID CZzMonDlg::InitialWindows()
{
UINT Num;
Num=JudgeWindowsEdit(m_edit1);
if (Num==3)
{
ShowWindows[0].IfWork=TRUE;
ShowWindows[0].SensorParameter.ID=m_edit1;
}
else
{
ShowWindows[0].IfWork=FALSE;
}
}
VOID CZzMonDlg::Communication()
{
CANSTATELAST.ID=CANSTATENOW.ID;
CANSTATELAST.STATE=CANSTATENOW.STATE;
if (ShowWindows[TargetWindow].IfWork==TRUE)
{
CANSTATENOW.ID=ShowWindows[TargetWindow].SensorParameter.ID;
CANSTATENOW.STATE=1;
//SENDCAN(CANSTATENOW.ID,1,NULL);
if (IfTimer1Received==TRUE)
{
if (TargetWindow<MAXWINDOWS)
{
TargetWindow++; //还要从接受处进行判断
}
SENDCAN(CANSTATENOW.ID,1,NULL);
IfTimer1Received=FALSE;
}
else
{
if (ResendTimer1Count>=ResendCount)
{
ShowWindows[TargetWindow].SensorParameter.OnLine=FALSE;
ShowWindows[TargetWindow].IfWork=FALSE; //不在线,不在工作
ResendTimer1Count=0;
if (TargetWindow<MAXWINDOWS)
{
TargetWindow++; //还要从接受处进行判断
}
}
else
{
SENDCAN(CANSTATENOW.ID,1,NULL);
}
if (CANSTATELAST.ID==CANSTATENOW.ID && CANSTATELAST.STATE==CANSTATENOW.STATE)
{
ResendTimer1Count++;
}
}
}
else
{
if (TargetWindow<MAXWINDOWS)
{
TargetWindow++; //还要从接受处进行判断
}
}
}
LRESULT CZzMonDlg::OnCANNotify(WPARAM wParam, LPARAM lParam)
{
VCI_CAN_OBJ frameinfo[20];
BYTE RECBUFF[128];
VCI_ERR_INFO errinfo;
INT Len=1,i,j;
KillTimer(1);
Sleep(200);
Len=VCI_Receive(HostDevtype,HostDevind,HostCannum,frameinfo,20,20);
if (Len<0)
{
VCI_ReadErrInfo(HostDevtype,HostDevind,HostCannum,&errinfo);
}
else
{
if (Len==1 && frameinfo[0].ID==0 && frameinfo[0].DataLen==8 )
{
for (i=0;i<8;i++)
{
RECBUFF[i]=frameinfo[0].Data[i];
}
AlarmSignal(RECBUFF, 8); //报警处理,级别最高
return 1;
}
if (Len==ParametersFRAMELEN && CANSTATENOW.STATE==1)
{
//KillTimer(1);
for (i=0;i<ParametersFRAMELEN;i++)
{
for (j=0;j<8;j++)
{
RECBUFF[i*8+j]=frameinfo[i].Data[j];
}
}
ParameterSignal(RECBUFF,80);//参数帧处理
return 1;
}
if (Len==ImageFRAMELEN && CANSTATENOW.STATE==2)
{
for (i=0;i<ImageFRAMELEN;i++)
{
for (j=0;j<8;j++)
{
RECBUFF[i*8+j]=frameinfo[i].Data[j];
}
}
ImageSignal(RECBUFF,128);//图像帧处理
return 1;
}
if (Len==1 && CANSTATENOW.STATE==3)
{
for (i=0;i<8;i++)
{
RECBUFF[i]=frameinfo[0].Data[i];
}
ConfirmedSignal(RECBUFF, 8);//确认帧处理
return 1;
}
}
return 1;
}
VOID CZzMonDlg::AlarmSignal(BYTE *RECBUFF,UINT LEN)
{
UINT WrongNum;
LONG ID;
ID=(RECBUFF[0]*128+RECBUFF[1])& 0x0fff;
WrongNum=RECBUFF[2];
/* switch (WrongNum)
{
case 0x01: // 照相模块故障
case 0x10: //二氧化碳模块故障
case 0x11: //二氧化碳浓度过低
case 0x12: //二氧化碳浓度过高
case 0x20: //室内温湿度模块故障h
case 0x21: //室内温度过低
case 0x22: //室内温度过高
case 0x21: //室内湿度过低
case 0x22: //室内湿度过高
case 0x20: //室外温湿度模块故障
case 0x21: //室外温度过低
case 0x22: //室外温度过高
case 0x21: //室外湿度过低
case 0x22: //室外湿度过高
}*/
}
VOID CZzMonDlg::ParameterSignal(BYTE *RECBUFF,UINT LEN)
{
BYTE Sensor;
// float CO2concentra ; //二氧化碳浓度
// float IndoorTemperature; //室内温度
// float IndoorHumidity; //室内湿度
// float OutdoorTemperature; //室外温度
// float OutdoorHumidity; //室外湿度
// float Temperature[32]; //温度传感器,最多32个
Sensor=RECBUFF[0];
if ((Sensor&0x80)==0x80 )
{
ShowWindows[TargetWindow].SensorParameter.IfImage=TRUE;
}
if ((Sensor&0x40)==0x40 )
{
ShowWindows[TargetWindow].SensorParameter.CO2concentra=(FLOAT)(RECBUFF[2]*128+RECBUFF[3])/10;
}
if ((Sensor&0x20)==0x20 )
{
ShowWindows[TargetWindow].SensorParameter.IndoorTemperature=(FLOAT)(RECBUFF[4]*256+RECBUFF[5])/10;
ShowWindows[TargetWindow].SensorParameter.IndoorHumidity=(FLOAT)(RECBUFF[6]*256+RECBUFF[7])/10;
}
if ((Sensor&0x10)==0x10 )
{
ShowWindows[TargetWindow].SensorParameter.OutdoorTemperature=(FLOAT)(RECBUFF[8]<<8|RECBUFF[9])/10;
ShowWindows[TargetWindow].SensorParameter.OutdoorHumidity=(FLOAT)(RECBUFF[10]*256+RECBUFF[11])/10;
}
ShowWindows[TargetWindow].SensorParameter.CO2concentra=(FLOAT)(RECBUFF[2]*256+RECBUFF[3])/10;
SetEvent(m_hPostMsgEvent);
SetTimer(1,500,NULL);
IfTimer1Received=TRUE;
}
void CZzMonDlg::ImageSignal(BYTE *RECBUFF, UINT LEN)
{
}
void CZzMonDlg::ConfirmedSignal(BYTE *RECBUFF, UINT LEN)
{
}
void CZzMonDlg::InputShowID1()
{
UINT Num ;
CString str;
GetDlgItem(IDC_EDIT1)->GetWindowText(str);
m_edit1 = atoi(str);
Num=CZzMonDlg::JudgeWindowsEdit(m_edit1);
if (Num==3)
{
ShowWindows[0].IfWork=TRUE;
ShowWindows[0].SensorParameter.OnLine=TRUE;
ShowWindows[0].SensorParameter.ID=m_edit1;
//IfTimer1Received=TRUE;
//CANSTATENOW.ID=ShowWindows[0].SensorParameter.ID;
}
// TODO: Add your control notification handler code here
}
void CZzMonDlg::Showing()
{
if (ShowWindows[0].SensorParameter.OnLine==TRUE)
{
m_Showing1_CO2=ShowWindows[0].SensorParameter.CO2concentra;
m_Showing1_IndoorHumidity=ShowWindows[0].SensorParameter.IndoorHumidity;
m_Showing1_IndoorTemperature=ShowWindows[0].SensorParameter.IndoorTemperature;
m_Showing_OutdoorHumidity=ShowWindows[0].SensorParameter.OutdoorHumidity;
m_Showing_OutdoorTemperature=ShowWindows[0].SensorParameter.OutdoorTemperature;
//Invalidate();
CString str;
str.Format("%.1f",ShowWindows[0].SensorParameter.CO2concentra);
m_test1.SetWindowText(str);
}
}
void CZzMonDlg::OnButton2()
{
m_dlg1.Create(IDD_DIALOG1,this);
m_dlg1.SetWindowPos(this,0,0,500,500,0);
m_dlg1.ShowWindow(SW_SHOW);
for(int i=0;i< 200;i++)
m_dlg1.DrawGraph(5);
// TODO: Add your control notification handler code here
}
void CZzMonDlg::OnButton3()
{
m_dlg2.Create(IDD_DIALOG1,this);
m_dlg2.ShowWindow(SW_SHOW);
// TODO: Add your control notification handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -