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

📄 mainfrm.cpp

📁 程序实现了PDA对手持型GPS的导航设计。用一个串口类控制串口通讯
💻 CPP
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "GpsNav.h"

#include "MainFrm.h"
#include "GpsNavView.h"
#include "DisplayView.h"
#include "math.h"

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


#define PSPC_TOOLBAR_HEIGHT 24

const DWORD dwAdornmentFlags = 0; // exit button
int GetGpsQuality(const CString str);
double GetHDop(const CString str);
int GetSatNum(const CString str);
void Str2Str(const CString str,char *tostr);
bool CheckOut(const CString &str);
RESULT GetResult(const CString str);
/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)
	ON_COMMAND(ID_MENUEXIT, OnMenuexit)
	ON_WM_CANCELMODE()
	ON_CBN_SELCHANGE(IDC_COM, OnCom)
	ON_COMMAND(ID_EXIT, OnExit)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()



static UINT indicators[] =
{
	//ID_SEPARATOR,           // status line indicator
	ID_COOR,
};

PARA pp={	
6378137.0,
6378140. ,
298.257223563,
298.257,
};

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

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	m_nCurrentExample=1;
	m_index=0;
	m_strReceived="";
}

CMainFrame::~CMainFrame()
{

}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	ModifyStyle(m_hWnd,WS_CAPTION,WS_MINIMIZEBOX,SWP_NOSIZE);
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	m_wndCommandBar.m_bShowSharedNewButton = FALSE;
	m_ToolTipsTable[0] = MakeString(IDS_NEW);
	m_ToolTipsTable[1] = MakeString(IDS_FILE);
	m_ToolTipsTable[2] = MakeString(IDS_MHELP);
	m_ToolTipsTable[3] = MakeString(IDS_CUT);
	m_ToolTipsTable[4] = MakeString(IDS_COPY);
	m_ToolTipsTable[5] = MakeString(IDS_PASTE);
	m_ToolTipsTable[6] = MakeString(IDS_ABOUT);  

	if(!m_wndCommandBar.Create(this) ||
	   !m_wndCommandBar.InsertMenuBar(IDR_MAINFRAME) ||
	   !m_wndCommandBar.AddAdornments() ||
	   !m_wndCommandBar.LoadToolBar(IDR_MAINFRAME)  ||
		!m_wndCommandBar.SendMessage(TB_SETTOOLTIPS, (WPARAM)(6), (LPARAM)(&m_ToolTipsTable[1])))
	{
		TRACE0("Failed to create CommandBar\n");
		return -1;      // fail to create
	}

	
	m_Cmb=m_wndCommandBar.InsertComboBox(80,IDC_COM, CMDBAR_END,CBS_DROPDOWNLIST |WS_VSCROLL); 

	m_Cmb->SetOwner(this);

	m_Cmb->AddString(_T("Setup"));
	m_Cmb->AddString(_T("Display"));
	m_Cmb->SetCurSel(0);


	m_wndCommandBar.SetBarStyle(m_wndCommandBar.GetBarStyle() |
		CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED);


	
	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
	}
	
	m_wndStatusBar.SetPaneText(0,_T("Not start navigation!"),TRUE);

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;

	return TRUE;
}



LPTSTR CMainFrame::MakeString(UINT stringID)
{
	TCHAR buffer[255];
	TCHAR* theString;

	::LoadString(AfxGetInstanceHandle(), stringID, buffer, 255);
	theString = new TCHAR[lstrlen(buffer) + 1];
	lstrcpy(theString, buffer);
	return theString;
}   

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

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

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

#endif //_DEBUG

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


LONG CMainFrame::OnCommunication(WPARAM parach, LPARAM port)//UINT, LONG
{
	CString ssss="";
	if (port <= 0 || port > 4)
		return -1;

	POSITION po=AfxGetApp()->GetFirstDocTemplatePosition();
	CDocTemplate *pDocTem=AfxGetApp()->GetNextDocTemplate(po);
	po=pDocTem->GetFirstDocPosition();
	CGpsNavDoc *pDoc=(CGpsNavDoc *)pDocTem->GetNextDoc(po);


	DBLH dd;
	int nQuality;
	double HDop;
	int nSats;

	CString str="",str1="";
	int i=0;
	CWayPoint cp;

		if(!CheckOut(m_strReceived))
		{
			return 0;
		}
		/////////////////////////////////////////////////////////////
		pDoc->m_res=GetResult(m_strReceived);

		int hh=(int)(pDoc->m_res.fTime/10000.);
		int mm=(int)((pDoc->m_res.fTime-hh*10000)/100.);
		float ss=pDoc->m_res.fTime-hh*10000-mm*100;
		str.Format(_T("%2d:%2d:%5.2f"),hh,mm,ss);

		dd.DB=((int)(pDoc->m_res.fLat/100.)+(pDoc->m_res.fLat-100*(int)(pDoc->m_res.fLat/100.))/60.)/P2;
		dd.DL=((int)(pDoc->m_res.fLon/100.)+(pDoc->m_res.fLon-100*(int)(pDoc->m_res.fLon/100.))/60.)/P2;
		dd.DH=pDoc->m_res.fAntenna;
		nQuality=pDoc->m_res.nQuality;
		HDop=pDoc->m_res.fHdop;
		nSats=pDoc->m_res.nSates;
		str1.Format(_T("*Sats:%2d"),nSats);
		str+=str1;
		switch(nQuality)
		{
		case 0:
			str+="*Invalid";
			break;
		case 1:
			str+="*GPS Fixed";
			break;
		case 2:
			str+="*DGPS Fixed";
			break;
		}
		str1.Format(_T("*HDop:%3.1lf"),HDop);
		str+=str1;

		cp.SetDblh(dd);
		pDoc->m_Way.SetOldPoint(pDoc->m_Way.GetCurPoint());
		pDoc->m_Way.SetCurPoint(cp);


		//////////////////////////////////////////////////////////////

		m_index=0;
		m_strReceived="";
		m_wndStatusBar.SetPaneText(0,LPCTSTR(str),TRUE);

		pDoc->UpdateAllViews(NULL);
	return 0;
}

void CMainFrame::ShowDisplayView(int b)
{
	CView* pOldActiveView = GetActiveView();
		::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, m_nCurrentExample);

	CRuntimeClass* pNewViewClass;
	switch (m_nCurrentExample)
	{
		case 0:
			if(!b)
			{
				pNewViewClass = RUNTIME_CLASS(CGpsNavView);
				m_Cmb->SetCurSel(0);
			}
			break;
		case 1:
			if(b)
			{
				pNewViewClass = RUNTIME_CLASS(CDisplayView);
				m_Cmb->SetCurSel(1);
			}
			break;
		default:
			ASSERT(0);
			return;
	}

	// create the new view
	CCreateContext context;
	context.m_pNewViewClass = pNewViewClass;
	context.m_pCurrentDoc = GetActiveDocument();
	CView* pNewView = STATIC_DOWNCAST(CView, CreateView(&context));
	if (pNewView != NULL)
	{
		// the new view is there, but invisible and not active...
		pNewView->ShowWindow(SW_SHOW);
		pNewView->OnInitialUpdate();
		SetActiveView(pNewView);
		RecalcLayout();
		m_nCurrentExample = !m_nCurrentExample;

		// finally destroy the old view...
		pOldActiveView->DestroyWindow();
	}

}


bool CheckOut(const CString &str)
{
	return true;//暂时没有实现
}

RESULT GetResult(const CString str)
{
	RESULT re;
	memset(&re,0,sizeof(RESULT));
	char buf[1024];
	char cLat,cLon;
	CString s="";
	int nStart,nEnd;
	nStart=str.Find(',');
	nEnd=str.Find(',',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%f",&re.fTime);

	nStart=nEnd;
	nEnd=str.Find(',',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%f",&re.fLat);

	nStart=nEnd;
	nEnd=str.Find(',',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%c",&cLat);
	if(cLat=='S')
		re.fLat=-re.fLat;

	nStart=nEnd;
	nEnd=str.Find(',',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%f",&re.fLon);

	nStart=nEnd;
	nEnd=str.Find(',',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%c",&cLon);
	if(cLon=='W')
		re.fLon=-re.fLon;

	nStart=nEnd;
	nEnd=str.Find(',',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%d",&re.nQuality);

	nStart=nEnd;
	nEnd=str.Find(',',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%d",&re.nSates);

	nStart=nEnd;
	nEnd=str.Find(',',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%f",&re.fHdop);

	nStart=nEnd;
	nEnd=str.Find(',',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%f",&re.fAntenna);

	nStart=nEnd;
	nEnd=str.Find(',',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%c",&re.cUnits_of_Antenna);

	nStart=nEnd;
	nEnd=str.Find(',',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%f",&re.fGeoidal_separation);

	nStart=nEnd;
	nEnd=str.Find(',',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%c",&re.cUnits_of_Geoidal);

	nStart=nEnd;
	nEnd=str.Find(',',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%f",&re.fAge_of_Data);

	nStart=nEnd;
	nEnd=str.Find('*',nStart+1);
	s=str.Mid(nStart+1,nEnd-nStart-1);
	Str2Str(s,buf);
	sscanf(buf,"%s",re.sStation_ID);

	return re;
}

FPOINT GetPoint(const CWayPoint &p1,const CWayPoint &p2,const CWayPoint &p3)
{
	FPOINT p;
	double x1,y1,x2,y2,x3,y3;
	x1=p1.c.CX,x2=p2.c.CX,x3=p3.c.CX;
	y1=p1.c.CY,y2=p2.c.CY,y3=p3.c.CY;
	double Dx=x1-x2,Dy=y1-y2;
	if(fabs(Dx)<0.0001)
	{
		p.X=x1;
		p.Y=y3;
	}
	else
	{
		p.X=( (y3-y2)*Dx*Dy+x3*Dx*Dx+x2*Dy*Dy )/(Dx*Dx+Dy*Dy);
		p.Y=y2+Dy*(p.X-x2)/Dx;
	}
	return p;
}

double NavelMer(double lon,int base,int &index)
{
	double na=0;
	int n=0;
	if(lon<0)
		lon+=360.;
	switch(base)
	{
	case 3:
		n=int ((lon+1.5)/3.+0.5);
		index=n;
		na=index*3;
		break;
	case 6:
		n=int ((lon)/6.+1);
		index=n;
		na=index*6-3;
		break;
	default :
		na=index=-1;
	}
	na/=P2;
	return na;
}

bool Gauss(const DBLH dd,CXYH &cc,const PARA pp)
{	
	double alfa;
	double a;
	alfa=pp.Alfa[0];
	alfa=1.0/alfa;
	a=pp.A[0];
	
	int index=0;
	double
		radLat=dd.DB,		
		radLon=dd.DL;
	double radL0=NavelMer(dd.DL*P2,6,index);
	if(radL0==-1)
	{
		return false;
	}
	double H=dd.DH;
	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=pp.Alfa[1];
	alfa=1.0/alfa;
	a=pp.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;
	DBLH blh;
	blh.DL=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.DB=atan(t2);
	blh.DH=sqrt(x*x+y*y)/cosB-N;

	//正算
	radLat=blh.DB,radLon=blh.DL;
	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.;
	cc.CX=coor_x;
	cc.CY=coor_y;
	cc.CH=dd.DH;//blh.DH;
	return true;
}

bool InvGauss(const CXYH cc,DBLH &dd,const PARA pp)
{
	return true;//暂时没有实现
}

double GetDist(const CWayPoint &wpt1,const CWayPoint &wpt2)
{
	CXYH cc1,cc2;
	wpt1.GetC(cc1);
	wpt2.GetC(cc2);
	double re=sqrt((cc1.CX-cc2.CX)*(cc1.CX-cc2.CX)+(cc1.CY-cc2.CY)*(cc1.CY-cc2.CY));
	if(fabs(re)<0.1)
		return 0;
	else
		return re;
}
double GetDist(const CWayPoint &wpt1,double x,double y)
{
	CXYH cc1;
	wpt1.GetC(cc1);
	double re=sqrt((cc1.CX-x)*(cc1.CX-x)+(cc1.CY-y)*(cc1.CY-y));
	if(fabs(re)<0.1)
		return 0;
	else
		return re;
}

double GetBearing(const CWayPoint &wpt1,const CWayPoint &wpt2)
{
	CXYH cc1,cc2;
	wpt1.GetC(cc1);
	wpt2.GetC(cc2);
	return atan2((cc2.CY-cc1.CY),(cc2.CX-cc1.CX));
}
double GetHeight(const CWayPoint &wpt1,const CWayPoint &wpt2)
{
	CXYH cc1,cc2;
	wpt1.GetC(cc1);
	wpt2.GetC(cc2);
	return cc2.CH-cc1.CH;
}

double Dms2Rad(double dms)
{
	int du,fen;
	double miao;
	du=int(dms+0.0001)%360;
	fen=int((dms-du)*100+0.0001);
	miao=(((dms-du)*100)-fen)*100;

	return (du+fen/60.0+miao/3600.0)/180.0*PI;
}

double Rad2Dms(double rad)
{
	while(rad<0)
		rad+=2*PI;
	while(rad>2*PI)
		rad-=2*PI;
	double dms=rad/PI*180.0;
	int du,fen;
	double miao;
	du=int (dms+0.0001);
	fen=int ((dms-du)*60+0.0001);
	miao=(dms-(du+fen/60.0))*3600;

	return du+fen/100.0+miao/10000;
}

void Str2Str(const CString str,char *tostr)
{
	for(int i=0;i<str.GetLength();i++)
		tostr[i]=(char)str[i];
	tostr[i]=0;
}

TCHAR* GetUnicodeString(const char *s) 
{
	int nSize = strlen(s); 
	TCHAR *pUnicodeString = new TCHAR[nSize+1]; 
	
	MultiByteToWideChar(CP_ACP, 0, s,-1,pUnicodeString,strlen(s)); 
	return pUnicodeString; 
}

void CMainFrame::OnCom()
{
	int b=m_Cmb->GetCurSel();
	if(m_nCurrentExample!=(UINT) b)
	{
		return;
	}
	ShowDisplayView(b);
}


void CMainFrame::OnMenuexit() 
{
	CFrameWnd::DestroyWindow();
}

void CMainFrame::OnCancelMode() 
{
	CFrameWnd::OnCancelMode();
}

void CMainFrame::OnExit() 
{
	if(::AfxMessageBox(_T("Exit Program?"),MB_OKCANCEL)!=IDOK)
		return;
	//int AfxMessageBox(LPCTSTR lpszText,UINT nType = MB_OK,UINT nIDHelp = 0 );

	//if(::MessageBox(NULL,_T("Exit Program?"),_T("Warning!"),MB_OKCANCEL)!=IDOK)
	//	return;
	CFrameWnd::DestroyWindow();
	
}


⌨️ 快捷键说明

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