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

📄 zzmondlg.cpp

📁 用can传输图像
💻 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 + -