atmeasuredoc.cpp

来自「串口应变采集系统」· C++ 代码 · 共 758 行 · 第 1/2 页

CPP
758
字号
// AtmeasureDoc.cpp : implementation of the CAtmeasureDoc class
//

#include "stdafx.h"
#include "Atmeasure.h"

#include "AtmeasureSet.h"
#include "AtmeasureDoc.h"
#include "PortDialog.h"
#include "AtmeasureView.h"
#include "SysDialog.h"
#include "Point.h"
#include "SysSet.h"
#include "PortSet.h"
#include "PointSet.h"
#include "PhSet.h"
#include "CyTime.h"


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

/////////////////////////////////////////////////////////////////////////////
// CAtmeasureDoc

IMPLEMENT_DYNCREATE(CAtmeasureDoc, CDocument)

BEGIN_MESSAGE_MAP(CAtmeasureDoc, CDocument)
	//{{AFX_MSG_MAP(CAtmeasureDoc)
	ON_COMMAND(ID_PORT_SET, OnPortSet)
	ON_COMMAND(ID_SYS_CHANNEL, OnSysChannel)
	ON_COMMAND(ID_BALANCE, OnBalance)
	ON_COMMAND(ID_qkbanlance, Onqkbanlance)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAtmeasureDoc construction/destruction

CAtmeasureDoc::CAtmeasureDoc()
{
	// TODO: add one-time construction code here
	//----this sentence must be commentted out after debug !!!!!!!!!!!!!!!!!!!!11 
   m_database.Open("dbat" );

//	m_TestDB.Open("dbpos");
//	m_id=0;
//----------------------------------
//COM port
//	CtrlPort = "COM1";
//	DataPort = "COM3";

//sample frequency
//	SamNormHZ=35;
//data buffer
	sndNum = 0;
	sndTempNum=0;
	PHflag=0;
//	ChannelNum=4;

	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(int i=0;i<64;i++)
		DataInWithHead[i] = 0;

	datacont = 0;
	ctrlcont = 0;
//	times=0;

//	for(i=0;i<15;i++)
//		bochang.buffer[i]=0;

/*	for(i=0;i<5;i++)
	{
        PointNum[i]=15;
	}*/

	for(i=0;i<49;i++)
	{
        wave[i]=0;
		wavesum[i]=0;
		for(int j=0;j<29;j++)
		{
			wavetemp[j][i]=0;
		}
	}
}

CAtmeasureDoc::~CAtmeasureDoc()
{
	//----this sentence must be commentted out after debug !!!!!!!!!!!!!!!!!!!!11 
//		m_TestDB.Close();
		m_database.Close();

}

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

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CAtmeasureDoc serialization

void CAtmeasureDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CAtmeasureDoc diagnostics

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

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

/////////////////////////////////////////////////////////////////////////////
// CAtmeasureDoc commands

/////////////////////端口设置////////////////////////
void CAtmeasureDoc::OnPortSet() 
{
	// TODO: Add your command handler code here
	CPortDialog dlg;
	CString datatemp,ctrltemp;
	///////////////////////////////
    CPortSet *ws;
	ws=new CPortSet;
	ws->Open();
	dlg.m_strCtrl=ws->m_strctrl;
	dlg.m_strData=ws->m_strdata;
	dlg.m_cyedit=ws->m_cyfreq;
	dlg.m_ccedit=ws->m_ccfreq;
	dlg.m_gbjedit=ws->m_gbj;
	dlg.m_dbjedit=ws->m_dbj;
	dlg.m_gyjedit=ws->m_gyj;
	dlg.m_dyjedit=ws->m_dyj;
    ws->Close();

	///////////////////////////
	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;
		}
	}
}
/////////////////////////给51及OCM发送指令/////////////////////////
void CAtmeasureDoc::SendTo51()
{
 	    CString sendStr;
		sndTempNum = sndTempNum%ChannelNum;
    	sndNum = sndTempNum;
    	sendStr.Format("AT%d",sndNum);
 	   if(DataCOMClosed == false)
       	m_CtrlCOM.SetOutput(COleVariant(sendStr));
	     Sleep(40);
     	 sndTempNum++;

}


int CAtmeasureDoc::String2Hex(CString str, CByteArray &senddata)
{
	int hexdata,lowhexdata;
	int hexdatalen=0;
	int len=str.GetLength();
	
	senddata.SetSize(len/2);
	
	for(int i=0;i<len;)
	{
		char lstr,hstr=str[i];
		if(hstr==' ')
		{
			i++;
			continue;
		}
		i++;
		if(i>=len)
			break;
		lstr=str[i];
		hexdata=ConvertHexChar(hstr);
		lowhexdata=ConvertHexChar(lstr);
		if((hexdata==16)||(lowhexdata==16))
			break;
		else 
			hexdata=hexdata*16+lowhexdata;
		i++;
		senddata[hexdatalen]=(char)hexdata;
		hexdatalen++;
	}
	
	senddata.SetSize(hexdatalen);
	return hexdatalen;

}

char CAtmeasureDoc::ConvertHexChar(char ch)
{
	if((ch>='0')&&(ch<='9'))
		return ch-0x30;
	else if((ch>='A')&&(ch<='F'))
		return ch-'A'+10;
	else if((ch>='a')&&(ch<='f'))
		return ch-'a'+10;
	else return (-1);
}
//////////////////////从OCM中取数///////////////////////////
void CAtmeasureDoc::GetData()
{
    VARIANT variant;
	COleSafeArray safearray;
	long len=0;
	BYTE tempDataIn[256];

	variant = m_DataCOM.GetInput();
	safearray = variant;
	len = safearray.GetOneDimSize();
	DataWithHeadLen = len/4;
//////////////////convert data into byte type/////////////////////
	for(long k=0;k<len;k++)
		safearray.GetElement(&k,tempDataIn+k);
////////////////convert data into dword type/////////////////////

	for(k=0;k<len;k=k+4)
	{
		DataInWithHead[k/4] = tempDataIn[k];
		DataInWithHead[k/4] = DataInWithHead[k/4]<<8;
		DataInWithHead[k/4] += tempDataIn[k+1];
		DataInWithHead[k/4] = DataInWithHead[k/4]<<8;
		DataInWithHead[k/4] += tempDataIn[k+2];
		DataInWithHead[k/4] = DataInWithHead[k/4]<<8;
		DataInWithHead[k/4] += tempDataIn[k+3];
	}	
}

DWORD CAtmeasureDoc::CheckSum(DWORD array[], int start, int end)
{
    DWORD sum=0,temp;
	BYTE  ttemp;
	for(int i=start;i<end;i++)
	{
		temp=array[i];
		for(int j=0;j<=3;j++)
		{			
			ttemp=temp&0xff;
			sum+=ttemp;
			temp=temp>>8;
			
		}
	}
	sum=~sum;
	return(sum);
}

bool CAtmeasureDoc::CheckData()
{
	DWORD datasum = CheckSum(DataInWithHead ,4 ,DataWithHeadLen-3);
	DWORD allsum  = CheckSum(DataInWithHead ,0 ,DataWithHeadLen-1);
	if((DataInWithHead[0]!=0x00000003)||
			(DataInWithHead[DataWithHeadLen-3]!=datasum)||
			(DataInWithHead[DataWithHeadLen-1]!=allsum))
		{
//			AfxMessageBox("校验和错误");
			return false;
		}
	return true;
}


int CAtmeasureDoc::GetWaveLen()
{ 
//	this->Pointpos(61);
	CAtmeasureView* pView;
	CFrameWnd * pFrame = (CFrameWnd *)(AfxGetApp()->m_pMainWnd);
	pView = (CAtmeasureView*)pFrame->GetActiveView();
    
	int pointnum=PointNum[sndNum];
	int peaknum = 0;
	long double temp;

	peaknum = DataInWithHead[7];
	if(peaknum != pointnum)
        return 1;

	if(datacont<10)
	{
		for(int i=0;i<peaknum;i++)
			{
				temp = ((double)(DataInWithHead[8+i]&0x0000ffff))/1000+180;
//				bochang.buffer[i] = (299792.458/temp);
                wavetemp[datacont][i]=(299792.458/temp);
   			}
	   
	}
	else
	{
		for(int i=0;i<peaknum;i++)
		{
           double iTemp;
           for(int j=1;j<10;j++)
		   {
                  for(int k=10-1;k>=j;k--)
				  {
                     if(wavetemp[k][i]<wavetemp[k-1][i])
					 {
                      iTemp = wavetemp[k-1][i];
                      wavetemp[k-1][i] =wavetemp[k][i];
                      wavetemp[k][i] = iTemp;
					 }
				  }
		   }
		}     

			for(int m=0;m<peaknum;m++)
				for(int n=2;n<8;n++)
				{
			    	wavesum[m]+=wavetemp[n][m];
				}

⌨️ 快捷键说明

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