www.pudn.com > GPSComEVC3.0.rar > MainFrm.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;iGetCurSel(); 
	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(); 
	 
}