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

📄 exa06doc.cpp

📁 比较经典的串口开发原码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// exa06Doc.cpp : implementation of the CExa06Doc class
//

#include "stdafx.h"
#include "exa06.h"

#include "exa06Doc.h"
#include "AdduserDialog.h"
#include "TemperDialog.h"
#include "PortDialog.h"
#include "AdminDialog.h"
#include "ChangePassDialog.h"
#include "SampleHZ.h"
#include "SamParaDialog.h"
#include "exa06View.h"
#include "COMctrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CEvent InsertCompelte;
/////////////////////////////////////////////////////////////////////////////
// CExa06Doc diagnostics

#ifdef _DEBUG
void CExa06Doc::AssertValid() const
{
	CDocument::AssertValid();
}

void CExa06Doc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CExa06Doc

IMPLEMENT_DYNCREATE(CExa06Doc, CDocument)

BEGIN_MESSAGE_MAP(CExa06Doc, CDocument)
	//{{AFX_MSG_MAP(CExa06Doc)
	ON_COMMAND(ID_ADD_USER, OnAddUser)
	ON_COMMAND(ID_PORT_SET, OnPortSet)
	ON_COMMAND(ID_TEMPER_SET, OnTemperSet)
	ON_COMMAND(ID_ADMIN_PRIRO, OnAdminPriro)
	ON_COMMAND(ID_PASSWORD_CHANGE, OnPasswordChange)
	ON_COMMAND(ID_SAMPLEHZ, OnSamplehz)
	ON_COMMAND(ID_CHANNEL1, OnChannel1)
	ON_COMMAND(ID_CHANNEL2, OnChannel2)
	ON_COMMAND(ID_CHANNEL3, OnChannel3)
	ON_COMMAND(ID_CHANNEL4, OnChannel4)
	ON_COMMAND(ID_CHANNEL5, OnChannel5)
	ON_COMMAND(ID_CHANNEL6, OnChannel6)
	ON_COMMAND(ID_CHANNEL7, OnChannel7)
	ON_COMMAND(ID_CHANNEL8, OnChannel8)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CExa06Doc construction/destruction

CExa06Doc::CExa06Doc()
{
//COM port
	CtrlPort = "COM1";
	DataPort = "COM2";
//tempereture set
	AlarmHigh_Temper    = 80;
	AlarmLow_Temper     = 10;
	PreAlarmLow_Temper  = 20;
	PreAlarmHigh_Temper = 60;
//user and password
	User[0] = "at";
	Pass[0] = "at";
	Priority[0] = 2;
	curPri      =1; //user 0; admin 1; debuger 2
	curNum		=1;	//current user , admin and debugger numbers
//frequze param, in second
	SamNormHZ   = 5;
	SamAlarmHZ  = 2;
	SaveNormHZ  = 20;
	SaveAlarmHZ = 1;
	ShowHZ      = 30;
//channel param inclide: a,t,init value and name
	ChannelNum = 4;
	PointPerChannel = 15;
	
	for(int i=0;i<8;i++)
	{
		for(int j=0;j<20;j++)
		{
			ChannelName[i][j]    = _T("");
			ChannelValueA[i][j]  = 0;
			ChannelInit[i][j]    = 0;
			ChannelValueT[i][j]  = -255;
		}
	}
	
	ChannelParam();	
//normal or excepet 0:normal, 1:except
	Mode = 0;

//the position of every point
//	PointPos = new CPoint(ChannelNum*20);
	for(i=0;i<ChannelNum*20;i++)
	{
		this->PointPos[i].x = 0;
 		this->PointPos[i].y = 0;
	}
	AddPointPos();
 //init db
	
	DataCount = 0;
//data buffer
	sndNum = 0;
	sndTempNum =0;
	m_strSendRequire = _T("0000 0003 0000 002C 0000 0000 0000 0001 0000 0001 0000 0000 0000 0064 0000 0000 FFFF FF9A 0000 0000 FFFF FBD3");
	String2Hex(m_strSendRequire,m_SendRequireHEX);
	DataWithHeadLen = 0;
	for(i=0;i<64;i++)
		DataInWithHead[i] = 0;

	datacont = 0;
	ctrlcont = 0;

	for(i=0;i<this->PointPerChannel;i++)
		tempbuffer.buffer[i] = 0;
	for(int j=0;j<4;j++)
	{
		tempdraw[j].CurChannel = j;
		for(i=0;i<PointPerChannel;i++)
			tempdraw[j].buffer[i] = 0;
	}
}

CExa06Doc::~CExa06Doc()
{
}

BOOL CExa06Doc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	CFile file;
	if(file.Open("dat",CFile::modeRead))
	{

		CArchive ar(&file,CArchive::load); 
		//提取温度
		ar>>AlarmHigh_Temper>>AlarmLow_Temper>>PreAlarmLow_Temper>>PreAlarmHigh_Temper;
		//提取端口
		ar>>CtrlPort>>DataPort; 
		//提取用户名,密码,权限及用户数目
		ar>>curNum;
		for(int i=0;i<curNum;i++)
			ar>>User[i]>>Pass[i]>>Priority[i];
		//提取采样和存储频率
		ar>>SamAlarmHZ>>SamNormHZ>>SaveAlarmHZ>>SaveNormHZ;
		//channel and point num
		ar>>ChannelNum>>PointPerChannel;
		//通道参数 a,t ,init,dot
		for(i=0;i<8;i++)
		{
			for(int j=0;j<20;j++)
			{
				ar>>ChannelName[i][j];
				ar>>ChannelValueA[i][j];
				ar>>ChannelInit[i][j];
				ar>>ChannelValueT[i][j];
			}
		}
		
		ar.Flush();
		ar.Close();
		file.Close();
		return TRUE;
	}	
	file.Open("dat",CFile::modeCreate);

	
/**/
	

	return TRUE;
}


BOOL CExa06Doc::OnOpenDocument(LPCTSTR lpszPathName) 
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;
	
	// TODO: Add your specialized creation code here
	HBITMAP hBitmap = (HBITMAP)::LoadImage (NULL, lpszPathName,
        IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
	
    if (hBitmap == NULL) {
		CString string;
		string.Format (_T ("%s 不能打开这张图片"), lpszPathName);
		MessageBox (NULL,string,"错误!",MB_ICONERROR);
        return FALSE;
	}
	m_backgroundset = 1;
    m_background.Attach (hBitmap);

	return TRUE;
}

void CExa06Doc::OnCloseDocument() 
{

	CFile file;
	CFileException fe;
	if(!file.Open("dat",CFile::modeWrite|CFile::modeCreate,&fe))
	{
		fe.ReportError();
		return;
	}

	CArchive ar(&file,CArchive::store);
	//存储温度
	ar<<AlarmHigh_Temper<<AlarmLow_Temper<<PreAlarmLow_Temper<<PreAlarmHigh_Temper;
	//存储端口
	ar<<CtrlPort<<DataPort;
	//存储用户名,密码,权限及用户数目
	ar<<curNum;
	for(int i=0;i<curNum;i++)
		ar<<User[i]<<Pass[i]<<Priority[i];
	//存储采样和存储频率
	ar<<SamAlarmHZ<<SamNormHZ<<SaveAlarmHZ<<SaveNormHZ;
	//通道数和每条通道的点数
	ar<<ChannelNum<<PointPerChannel;
	//通道参数 a,t ,init,dot
	for(i=0;i<8;i++)
	{
		for(int j=0;j<20;j++)
		{
			ar<<ChannelName[i][j];
			ar<<ChannelValueA[i][j];
			ar<<ChannelInit[i][j];
			ar<<ChannelValueT[i][j];
		}
	}

	ar.Flush();
	ar.Close();
	file.Close();
/**/	


	CDocument::OnCloseDocument();
}


void CExa06Doc::OnPortSet() 
{
	// TODO: Add your command handler code here
		CPortDialog dlg;
	CString datatemp,ctrltemp;

	dlg.m_strData = DataPort;
	dlg.m_strCtrl = CtrlPort;
begin:	
	datatemp = DataPort;
	ctrltemp = CtrlPort;

	if(dlg.DoModal()==IDOK)
	{
	//data port setting
		DataPort = dlg.m_strData;
	//ctrl port setting
		CtrlPort = dlg.m_strCtrl;
	//check the two setting
		if((DataPort.CompareNoCase("COM1")&&DataPort.CompareNoCase("COM2")&&DataPort.CompareNoCase("COM3")&&
			DataPort.CompareNoCase("COM4")&&DataPort.CompareNoCase("COM5")&&DataPort.CompareNoCase("COM6")))
		{
			DataPort = datatemp;
			AfxMessageBox("error setting");	
			goto begin;
		}

		if((CtrlPort.CompareNoCase("COM1")&&CtrlPort.CompareNoCase("COM2")&&CtrlPort.CompareNoCase("COM3")&&
			CtrlPort.CompareNoCase("COM4")&&CtrlPort.CompareNoCase("COM5")&&CtrlPort.CompareNoCase("COM6")))
		{
			CtrlPort = ctrltemp;
			MessageBox(NULL,"端口设置错误","错误",MB_ICONERROR);	
			goto begin;
		}
	//two channel can not use one COM
		if(!DataPort.CompareNoCase(CtrlPort))
		{
			DataPort = datatemp;
			CtrlPort = ctrltemp;
			MessageBox(NULL,"端口冲突","错误",MB_ICONERROR);	
			goto begin;
		}
	}
}

void CExa06Doc::OnTemperSet() 
{
	// TODO: Add your command handler code here
	CTemperDialog dlg;
	dlg.m_nHigh = AlarmHigh_Temper;
	dlg.m_nLow  = AlarmLow_Temper;
	dlg.m_nPreHigh = PreAlarmHigh_Temper;
	dlg.m_nPreLow  = PreAlarmLow_Temper;
begin:
	if(dlg.DoModal()==IDOK)
	{
		if(dlg.m_nHigh>dlg.m_nPreHigh&&
			dlg.m_nPreHigh>dlg.m_nPreLow&&
			dlg.m_nPreLow>dlg.m_nLow)
		{
			AlarmHigh_Temper = dlg.m_nHigh;
			AlarmLow_Temper  = dlg.m_nLow;
			PreAlarmHigh_Temper = dlg.m_nPreHigh;
			PreAlarmLow_Temper  = dlg.m_nPreLow;
		}
		else 
		{
			MessageBox(NULL,"参数设置错误!","错误",MB_ICONERROR);
			goto begin;
		}
	}
}


void CExa06Doc::OnAddUser() 
{
	// TODO: Add your command handler code here
	CString tempName;
	CString tempPass;
	CAdduserDialog dlg;
begin:
	if(dlg.DoModal()==IDOK)
	{
	//there is no place for new user
		if(curNum>=USERNUM)
		{
			AfxMessageBox("用户数已满");	
			return;
		}

		tempName = dlg.m_strAddName;
		tempPass = dlg.m_strAddPass;
	//username can not be clear
		if(!dlg.m_strAddName.Compare(""))
		{
			AfxMessageBox("用户名不能为空");
			goto begin;
		}
	//if there is still a some name user
		for(int i=0;i<curNum;i++)
		{
			if(!dlg.m_strAddName.Compare(User[i]))
			{
				AfxMessageBox("改用户已存在");
				goto begin;
			}
		}
	//confirm the password
		if(dlg.m_strAddPass!=dlg.m_strConfirmPass)
		{
			AfxMessageBox("请确认密码");
			goto begin;
		}
	//save username and password 
		User[curNum] = tempName;
		Pass[curNum] = tempPass;
		if(curPri>0)
		{
			Priority[curNum] = 1;
			AfxMessageBox("添加用户成功,管理员权限");
		}
		else
		{
			Priority[curNum] = 0;	
			AfxMessageBox("添加用户成功,一般用户权限");
		}

		curNum++;
	}
}

void CExa06Doc::OnAdminPriro() 
{
	CAdminDialog dlg;
begin:
	if(dlg.DoModal()==IDOK)
	{
		for(int i=0;i<USERNUM;i++)
		{
			if(!User[i].Compare(dlg.m_strName)) //check username
			{
				if(!Pass[i].Compare(dlg.m_strPass)) //check password
				{
					if(Priority[i]>0)			//wether this user can be a administrator
						curPri = 1;
					break;
				}
				else
				{
					MessageBox(NULL,"密码错误!","错误",MB_ICONERROR);
					goto begin;
				}
			}
		}//after loop
		if(curPri==0)
			AfxMessageBox("无管理员权限");
		else
			AfxMessageBox("升级为管理员");
	}
}

void CExa06Doc::OnPasswordChange() 
{
	// TODO: Add your command handler code here
	CChangePassDialog dlg;
	int pos = curNum;
begin:
	if(dlg.DoModal()==IDOK)
	{
	//wether the user is in the list
		for(int i=0;i<curNum;i++)
		{
			if(!User[i].Compare(dlg.m_strUserName))
				pos = i;
		}
		
		if(pos==curNum)
		{
			AfxMessageBox("改用户不存在");
			goto begin;
		}
	//wether the password is right
		if(Pass[pos].Compare(dlg.m_strOldPass))
		{
			AfxMessageBox("原密码错误");
			goto begin;
		}
	//confirm the password
		if(dlg.m_strNewPass!=dlg.m_strConfirmNew)
		{
			AfxMessageBox("请确认新密码");
			goto begin;
		}
	//rewrite the password
		Pass[pos] = dlg.m_strNewPass;
		AfxMessageBox("密码修改成功");

	}
}

void CExa06Doc::OnSamplehz() 
{
	// TODO: Add your command handler code here
	CSampleHZ dlg;

	dlg.m_SamAlHour  = SamAlarmHZ/3600;
	dlg.m_SamAlMin   = (SamAlarmHZ-dlg.m_SamAlHour*3600)/60;
	dlg.m_SamAlSec   = SamAlarmHZ-dlg.m_SamAlHour*3600-dlg.m_SamAlMin*60;

	dlg.m_SamNorHour = SamNormHZ/3600;
	dlg.m_SamNorMin  = (SamNormHZ-dlg.m_SamNorHour*3600)/60;
	dlg.m_SamNorSec  = SamNormHZ-dlg.m_SamNorHour*3600-dlg.m_SamNorMin*60;

	dlg.m_SavAlHour  = SaveAlarmHZ/3600;
	dlg.m_SavAlMin   = (SaveAlarmHZ-dlg.m_SavAlHour*3600)/60;
	dlg.m_SavAlSec   = SaveAlarmHZ-dlg.m_SavAlHour*3600-dlg.m_SavAlMin*60;

	dlg.m_SavNorHour = SaveNormHZ/3600;
	dlg.m_SavNorMin  = (SaveNormHZ-dlg.m_SavNorHour*3600)/60;
	dlg.m_SavNorSec  = SaveNormHZ-dlg.m_SavNorHour*3600-dlg.m_SavNorMin*60;

	if(dlg.DoModal()==IDOK)
	{
		SamAlarmHZ  = dlg.m_SamAlHour*3600+dlg.m_SamAlMin*60+dlg.m_SamAlSec;
		SamNormHZ   = dlg.m_SamNorHour*3600+dlg.m_SamNorMin*60+dlg.m_SamNorSec;
		SaveAlarmHZ = dlg.m_SavAlHour*3600+dlg.m_SavAlMin*60+dlg.m_SavAlSec;
		SaveNormHZ  = dlg.m_SavNorHour*3600+dlg.m_SavNorMin*60+dlg.m_SavNorSec;
	}
}

void CExa06Doc::OnChannel1() 
{
	// TODO: Add your command handler code here
	CSamParaDialog dlg;
	
	ShowPara(0,dlg);
	if(dlg.DoModal()==IDOK)
	{
		EditParm(0 , dlg);
	}
}

void CExa06Doc::OnChannel2() 
{
	// TODO: Add your command handler code here
	CSamParaDialog dlg;

	ShowPara(1,dlg);
	if(dlg.DoModal()==IDOK)
	{
		EditParm(1 , dlg);
	}
}

void CExa06Doc::OnChannel3() 
{
	// TODO: Add your command handler code here
	CSamParaDialog dlg;
	ShowPara(2,dlg);
	if(dlg.DoModal()==IDOK)
	{
		EditParm(2 , dlg);
	}
}

void CExa06Doc::OnChannel4() 
{
	// TODO: Add your command handler code here
	CSamParaDialog dlg;
	ShowPara(3,dlg);
	if(dlg.DoModal()==IDOK)
	{
		EditParm(3, dlg);
	}
}

void CExa06Doc::OnChannel5() 
{
	// TODO: Add your command handler code here
	CSamParaDialog dlg;
	ShowPara(4,dlg);
	if(dlg.DoModal()==IDOK)
	{
		EditParm(4 , dlg);
	}	
}

void CExa06Doc::OnChannel6() 
{

⌨️ 快捷键说明

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