📄 mainfrm.cpp
字号:
// 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 + -