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

📄 mainfrm.cpp

📁 用vc++实现了开关串口
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "GpsNav.h"
#include <afxdlgs.h>
#include "MyScrollView.h"

#include "GpsNavDoc.h"
#include "SerialPort.h"

#include "InfoDlg.h"
#include "SetupDlg.h"

#include "MainFrm.h"
void AddText(HWND hwnd, char *pszFormat) ;
void Marker(LONG x, LONG y, HDC hdc);
double Rad2Dms(double rad);
CString Result2Str(RESULT res);

const int LINE=50+2;

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

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(ID_MENUReadFile, OnMENUReadFile)
	ON_COMMAND(ID_MENUSTART, OnMenustart)
	ON_COMMAND(ID_MENUMOT, OnMenumot)
	ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)
	ON_MESSAGE(WM_COMM_CTS_DETECTED, OnCTSDetected)
	ON_COMMAND(ID_MENUsetup, OnMENUsetup)
	ON_COMMAND(ID_MENUstop, OnMENUstop)
	ON_WM_CLOSE()
	ON_COMMAND(ID_APP_EXIT, OnAppExit)
	ON_WM_GETMINMAXINFO()
	ON_UPDATE_COMMAND_UI(ID_MENUMOT, OnUpdateMenumot)
	ON_UPDATE_COMMAND_UI(ID_MENUstop, OnUpdateMENUstop)
	ON_UPDATE_COMMAND_UI(ID_MENUSTART, OnUpdateMenustart)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	bStart=false;
	nPort=1;
	memset(m_strReceived,0,N);
	index=0;
	bWrite=false;
	bOpen=false;
	pLogFile=NULL;
	pMotFile=NULL;
	m_pPort=new CSerialPort();

}

CMainFrame::~CMainFrame()
{
	if(pMotFile!=NULL)
	{
		pMotFile->Close();
		delete pMotFile;
		pMotFile=NULL;
	}
	if(pLogFile!=NULL)
	{
		pLogFile->Close();
		delete pLogFile;
		pLogFile=NULL;
	}
	if(m_pPort!=NULL)
	{
		delete m_pPort;
		m_pPort=NULL;
	}
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	/*
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);
	*/

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

		
	CRect rect;
	(GetDesktopWindow())->GetClientRect(&rect);
	cs.cx = rect.Width();
	cs.cy = rect.Height()*97/100;
	cs.style &= ~WS_MAXIMIZEBOX;
	cs.style &= ~WS_MINIMIZEBOX;


	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class

	CRect rect;
	GetClientRect(&rect);
	m_wndSplitter.CreateStatic(
		this,
		1,
		2
		);	
	m_wndSplitter.CreateView(
		0,
		0,
		RUNTIME_CLASS(CMyFormView),
		CSize(rect.Width()*30/100,rect.Height()),pContext);
	m_wndSplitter.CreateView(
		0,
		1,
		RUNTIME_CLASS(CMyView),
		CSize(rect.Width()*70/100,rect.Height()),pContext);
	pMyFormView=(CMyFormView *)m_wndSplitter.GetPane(0,0);
	pMyView = (CMyView*)m_wndSplitter.GetPane(0,1);

	
	
	return true;	
	//return CFrameWnd::OnCreateClient(lpcs, pContext);
}


void CMainFrame::OnMENUReadFile() 
{
	// TODO: Add your command handler code here
	CFileDialog cf(TRUE);
	if((cf.DoModal())==IDOK)
	{
		//BeginWaitCursor();
		CString fpn=cf.GetPathName();
		ReadHexFile(fpn);
		//EndWaitCursor();
	}
	
}

BOOL CMainFrame::ReadHexFile(const CString &fpn)
{
	CString pFileName(fpn);
	CString pLogFileName("");
	pLogFileName=fpn+".log";
	CFile 
		*pHexFile= NULL,
		*pLogFile=NULL;
	LONG lFileLength;
	lFileLength = 0L;
	int nBytes=N;

	double a[2];
	double alfa[2];
	a[0]=A0,a[1]=A1;
	alfa[0]=ALFA0,alfa[1]=ALFA1;

	if (pHexFile != NULL)
	{
		pHexFile->Close();
		delete pHexFile;
		pHexFile = NULL;
	}
	if (pLogFile != NULL)
	{
		pLogFile ->Close();
		delete pLogFile;
	}
	TRY
	{
		pHexFile = new CFile(pFileName,CFile::modeRead | CFile::typeBinary | CFile::shareExclusive);
	}
	CATCH( CFileException, e )
	{
		#ifdef _DEBUG
			afxDump << "File could not be opened " << e->m_cause << "\n";
		#endif

		AfxMessageBox("Hex文件打开出错!");
		return FALSE;
	}
	END_CATCH
	TRY
	{
		pLogFile = new CFile(pLogFileName,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::shareDenyRead);
	}
	CATCH( CFileException, e )
	{
		#ifdef _DEBUG
			afxDump << "File could not be opened " << e->m_cause << "\n";
		#endif

		AfxMessageBox("Log文件打开/读写出错!");
		return FALSE;
	}
	END_CATCH

	CString str="Date\t\tTime\t\t\tx\t\t\ty\t\t\th\t\tsatelite\r\n";

	pLogFile->Write(str,str.GetLength());

	str="";
	char ch[50]="";
	char p[50]="";

	lFileLength = pHexFile ->GetLength();
	LONG lPos;
	lPos = pHexFile ->GetPosition();
	unsigned char szBuf[1024*100];
	unsigned char cTemp[2]="";
	int nRet=0;
	int i=0;
	Ha ha;

	str.Format("需要一定的时间,请稍后!\r\n");
	strcpy(p,str);
	AddText(pMyView->pMyEditView->m_hWnd,p);
	pMyView->pMyEditView->SendMessage(WM_VSCROLL,SB_BOTTOM,0);	
		
	pMyView->pMyEditView->UpdateWindow( );
	BeginWaitCursor( );

	while(lPos<lFileLength)
	{
		if ((pHexFile ->Read(cTemp, 1)) !=1)
			break;
		lPos=pHexFile->GetPosition();

		if(cTemp[0]!='\r')
		{
			szBuf[nRet++]=cTemp[0];
			continue;
		}
		szBuf[nRet++]=cTemp[0];
		if ((pHexFile ->Read(cTemp, 1)) !=1)
			break;
		lPos=pHexFile->GetPosition();

		if(cTemp[0]!='\n')
		{
			szBuf[nRet++]=cTemp[0];
			continue;
		}
		szBuf[nRet++]=cTemp[0];
		for(i=0;i<nRet;i++)
		{
			if(szBuf[i]!='@')
				continue;
			else if(szBuf[i+1]!='@')
				continue;
			else if(szBuf[i+2]!='H')
				continue;
			else if(szBuf[i+3]!='a')
				continue;
			else if(!CheckOut(szBuf,i))
			{
				i+=M;
			}
			else
			{
				ReadHa(szBuf,i,ha);
				ProcessHa(ha,a,alfa,pLogFile);
				i+=M;
			}
		}
		cTemp[0]='\0';
		nRet=0;
		memset(szBuf,'\0',1024*100);
	}	
	EndWaitCursor(); 

	str.Format("读取文件成功!结果保存在%s中!\r\n",pLogFileName);
	strcpy(p,str);
	AddText(pMyView->pMyEditView->m_hWnd,p);
	pMyView->pMyEditView->SendMessage(WM_VSCROLL,SB_BOTTOM,0);	

	pHexFile->Close();
	pLogFile->Close();

	return TRUE;
}




void CMainFrame::ReadHa(const unsigned char *szBuf,int i,Ha& ha)
{
	int j=0;
	i+=4;
	ha.Date_m=ReadBit(szBuf,i,1);
	i+=1;
	ha.Date_d=ReadBit(szBuf,i,1);
	i+=1;
	ha.Date_yy=ReadBit(szBuf,i,2);
	i+=2;

	ha.Time_h=ReadBit(szBuf,i,1);
	i+=1;
	ha.Time_m=ReadBit(szBuf,i,1);
	i+=1;
	ha.Time_s=ReadBit(szBuf,i,1);
	i+=1;
	ha.Time_ffff=ReadBit(szBuf,i,4);
	i+=4;

	ha.Position_aaaa=ReadBit(szBuf,i,4);
	i+=4;
	ha.Position_oooo=ReadBit(szBuf,i,4);
	i+=4;
	ha.Position_hhhh=ReadBit(szBuf,i,4);
	i+=4;
	ha.Position_mmmm=ReadBit(szBuf,i,4);
	i+=4;

	ha.Position_UnFilter_aaaa=ReadBit(szBuf,i,4);
	i+=4;
	ha.Position_UnFilter_oooo=ReadBit(szBuf,i,4);
	i+=4;
	ha.Position_UnFilter_hhhh=ReadBit(szBuf,i,4);
	i+=4;
	ha.Position_UnFilter_mmmm=ReadBit(szBuf,i,4);
	i+=4;
	
	ha.Speed_VV=ReadBit(szBuf,i,2);
	i+=2;
	ha.Speed_vv=ReadBit(szBuf,i,2);
	i+=2;

	ha.Heading_hh=ReadBit(szBuf,i,2);
	i+=2;
	
	ha.Geometry_dd=ReadBit(szBuf,i,2);
	i+=2;

	ha.Satellite_Data_n=ReadBit(szBuf,i,1);
	i+=1;
	ha.Satellite_Data_t=ReadBit(szBuf,i,1);
	i+=1;

	for(j=0;j<12;j++)
	{
		ha.Channel_Data_i[j]=ReadBit(szBuf,i,1);
		i+=1;
		ha.Channel_Data_m[j]=ReadBit(szBuf,i,1);
		i+=1;
		ha.Channel_Data_s[j]=ReadBit(szBuf,i,1);
		i+=1;
		ha.Channel_Data_i_IODE[j]=ReadBit(szBuf,i,1);
		i+=1;
		ha.Channel_Data_dd[j]=ReadBit(szBuf,i,2);
		i+=2;
	}
	ha.Channel_Data_ss=ReadBit(szBuf,i,2);
	i+=2;	
	ha.Channel_Data_rr=ReadBit(szBuf,i,2);
	i+=2;
	
	ha.Cscillator_ClockPara_cc=ReadBit(szBuf,i,2);
	i+=2;
	ha.Cscillator_ClockPara_oooo=ReadBit(szBuf,i,4);
	i+=4;
	ha.Cscillator_ClockPara_TT=ReadBit(szBuf,i,2);
	i+=2;

	ha.UTCParameters_u=ReadBit(szBuf,i,1);
	i+=1;

	ha.GMTOffset_s=ReadBit(szBuf,i,1);
	i+=1;
	ha.GMTOffset_h=ReadBit(szBuf,i,1);
	i+=1;
	ha.GMTOffset_m=ReadBit(szBuf,i,1);
	i+=1;
	for(j=0;j<6;j++)
	{
		ha.GMTOffset_v[j]=ReadBit(szBuf,i,1);
		i+=1;
	}

	ha.C=ReadBit(szBuf,i,1);
	i+=1;

	return ;
}

unsigned long CMainFrame::ReadBit(const unsigned char *szBuf,int i,int num)
{
	unsigned long ul=0;
	CString sTemp;
	char *stopstring;
	switch(num)
	{
	case 1:
		sTemp.Format(_T("%x"),szBuf[i++]);
		ul = strtoul(sTemp, &stopstring, 16);
		return ul;
	case 2:
		sTemp.Format(_T("%x"),szBuf[i++]);
		ul += strtoul(sTemp, &stopstring, 16)*16*16;
		sTemp.Format(_T("%x"),szBuf[i++]);
		ul += strtoul(sTemp, &stopstring, 16);
		return ul;
	case 4:
		sTemp.Format(_T("%x"),szBuf[i++]);
		ul += strtoul(sTemp, &stopstring, 16)*16*16*16*16*16*16;
		sTemp.Format(_T("%x"),szBuf[i++]);
		ul += strtoul(sTemp, &stopstring, 16)*16*16*16*16;
		sTemp.Format(_T("%x"),szBuf[i++]);
		ul += strtoul(sTemp, &stopstring, 16)*16*16;
		sTemp.Format(_T("%x"),szBuf[i++]);
		ul += strtoul(sTemp, &stopstring, 16);
		return ul;
	}
	return ul;
}

BOOL CMainFrame::CheckOut(const unsigned char *szBuf,int i)
{
	unsigned long 
		ul=0,
		ul1=0,
		ul2=0;
	CString sTemp;
	char *stopstring;
	int j=i;
	for(i+=2;i<j+M-3;i++)
	{
		sTemp.Format(_T("%x"),szBuf[i]);
		ul2 = strtoul(sTemp, &stopstring, 16);
		ul1^=ul2;
	}
	sTemp.Format(_T("%x"),szBuf[i++]);
	ul = strtoul(sTemp, &stopstring, 16);
	if(ul1==ul)
	{
		return TRUE;
	}
	else 
	{
		return FALSE;
	}
}


RESULT CMainFrame::ProcessHa(const Ha &ha,const double A[],const double Alfa[],CFile *pLogFile)
{
	RESULT result;
	result.flag=false;
	result.X=0;
	result.Y=0;

	CString sLine="";
	CString sTemp="";
	double alfa;
	double a;
	alfa=Alfa[0];
	alfa=1.0/alfa;
	a=A[0];
	
	int index=0;
	double 
		radLat=ha.Position_aaaa/3600000./180*PI,
		radLon=ha.Position_oooo/3600000./180*PI;
	double radL0=NavelMer(ha.Position_oooo/3600000.,6,index);
	if(radL0==-1)
	{
		return result;
	}
	double H=ha.Position_hhhh/100.;
	double coor_x=0,coor_y=0;
	double b=a*(1-alfa),c=a*a/b,e=sqrt(1-(b/a)*(b/a)),e1=sqrt((a/b)*(a/b)-1);
	
	double sinB=sin(radLat),cosB=cos(radLat),t=tan(radLat),
			cosL=cos(radLon),sinL=sin(radLon),
			ita=e1*cosB,V=sqrt(1+ita*ita),N=c/V;
	double x,y,z;
	x=(N+H)*cosB*cosL;
	y=(N+H)*cosB*sinL;
	z=(N*(1-e*e)+H)*sinB;

	alfa=Alfa[1];
	alfa=1.0/alfa;
	a=A[1];
	b=a*(1-alfa),c=a*a/b,e=sqrt(1-(b/a)*(b/a)),e1=sqrt((a/b)*(a/b)-1);	
	sinB=sin(radLat),cosB=cos(radLat),t=tan(radLat),
		cosL=cos(radLon),sinL=sin(radLon),ita=e1*cosB,V=sqrt(1+ita*ita),N=c/V;
	BLH blh;
	blh.L=atan2(y,x);
	double t1,t2,t0;
	t2=t0=z/sqrt(x*x+y*y);
	do
	{
		t1=t2;
		t2=t0+c*e*e*t1/sqrt(x*x+y*y)/sqrt(1+e1*e1+t1*t1);
	}
	while(fabs(t2-t1)>E);
	blh.B=atan(t2);
	blh.H=sqrt(x*x+y*y)/cosB-N;

	//正算
	radLat=blh.B,radLon=blh.L;
	radL0=NavelMer(radLon*P2,6,index);	
	sinB=sin(radLat),cosB=cos(radLat),t=tan(radLat),
		cosL=cos(radLon),sinL=sin(radLon),ita=e1*cosB,V=sqrt(1+ita*ita),N=c/V;
	double a0,a2,a4,a6,a8;
	double m0,m2,m4,m6,m8;
	double X;
	m0=a*(1-e*e);
	m2=3.0/2.0*e*e*m0;
	m4=5.0/4.0*e*e*m2;
	m6=7.0/6.0*e*e*m4;
	m8=9.0/8.0*e*e*m6;
	a0=m0+m2/2.0+3.0*m4/8.0+5.0*m6/16.0+35.0*m8/128.0;
	a2=m2/2.0+m4/2.0+15.0*m6/32.0+7.0*m8/16.0;
	a4=m4/8.0+3.0*m6/16.0+7.0*m8/32.0;
	a6=m6/32.0+m8/16.0;
	a8=m8/128.0;
	double l=(radLon-radL0)*P1;
	X=a0*radLat-sinB*cosB*((a2-a4+a6)+(2*a4-16.0*a6/3.0)*sinB*sinB+16.0/3.0*a6*sinB*sinB*sinB*sinB);
	coor_x=X+N/2.0/P1/P1*sinB*cosB*l*l+N/24.0/P1/P1/P1/P1*sinB*cosB*cosB*cosB*(5.0-t*t+9*ita*ita+4*ita*ita*ita*ita)*l*l*l*l+N/720.0/pow(P1,6)*sinB*pow(cosB,5)*(61-58*t*t+t*t*t*t)*pow(l,6);
	coor_y=N/P1*cosB*l+N/6.0/P1/P1/P1*cosB*cosB*cosB*(1.0-t*t+ita*ita)*l*l*l+N/120.0/pow(P1,5)*pow(cosB,5)*(5.0-18.0*t*t+t*t*t*t+14*ita*ita-58.0*ita*ita*t*t)*pow(l,5);
	coor_y+=500000.;
	coor_y+=index*1000000.;

	//Write Log File

	sTemp.Format(_T("%2d-"),ha.Date_m);
	sLine+=sTemp;
	sTemp.Format(_T("%2d-"),ha.Date_d);
	sLine+=sTemp;

⌨️ 快捷键说明

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