?? datastring.cpp
字號:
// DataString.cpp: implementation of the CDataString class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GSV.h"
#include "DataString.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define INDEXOFFIELD(i) dataindex[i],dataindex[i+1]-dataindex[i]-1
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDataString::CDataString()
{
}
CDataString::CDataString(CByteArray *pBinData)
{
CString flagstr;
CString str;
for(int i=0;i<pBinData->GetSize();i++)
{
str=str+(char)pBinData->GetAt(i); //注意!!!!!!!!
}
if(str.IsEmpty()!=0)
return;
if(str[0]=='#')
{
int headlength=str.Find(';');
if(headlength==-1){
m_string=str;
return;
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
m_headOfstring=str.Left(headlength); //提取出ASCII數(shù)據(jù)的信息頭(m_headOfstring)
m_string=str.Right(str.GetLength()-headlength-1);//提取出ASCII數(shù)據(jù)的數(shù)據(jù)塊(m_string)
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
int flaglength=m_headOfstring.Find(','); //信息頭格式:#BESTPOSA,X,X,X,...,X;
flagstr=m_headOfstring.Left(flaglength); //取信息頭第一個逗號分隔符左邊的字符串
/* ASCII數(shù)據(jù)塊標識(DataString.h) !!注意和二進制數(shù)據(jù)塊標識相區(qū)別!!!!!!
#define BESTPOSA 0
#define RANGEA 1
#define GPGSV 2
*/
//int flagDataType; (DataString.h)
if(flagstr=="#BESTPOSA"){
m_flagDataType = BESTPOSA;
}else if(flagstr=="#RANGEA"){
m_flagDataType = RANGEA;
}
}else if(str[0]=='$'){
int flaglength=str.Find(',');
flagstr=str.Left(flaglength);
m_string=str;
if(flagstr=="$GPGSV"){
m_flagDataType = GPGSV;
}
}
}
CDataString::CDataString(CString str)
{
CString flagstr;
if(str.IsEmpty()!=0)
return;
if(str[0]=='#')
{
int headlength=str.Find(';');
if(headlength==-1){
m_string=str;
return;
}
m_headOfstring=str.Left(headlength);
m_string=str.Right(str.GetLength()-headlength-1);
int flaglength=m_headOfstring.Find(',');
flagstr=m_headOfstring.Left(flaglength);
if(flagstr=="#BESTPOSA"){
m_flagDataType = BESTPOSA;
}else if(flagstr=="#RANGEA"){
m_flagDataType = RANGEA;
}
}else if(str[0]=='$'){
int flaglength=str.Find(',');
flagstr=str.Left(flaglength);
m_string=str;
if(flagstr=="$GPGSV"){
m_flagDataType = GPGSV;
}
}
}
CDataString::~CDataString()
{
}
CString CDataString::GetHeadString()
{
return m_headOfstring; //返回信息頭串
}
//"分離"保存ASCII頭信息
BOOL CDataString::GetHeadData(HEAD_DATABLOCK *pHeaddata)
{
if(m_headOfstring.IsEmpty()!=0)
return FALSE;
CArray<int,int> dataindex;
GetHowManyFields(m_headOfstring,&dataindex);
strcpy(pHeaddata->Message,m_headOfstring.Mid(INDEXOFFIELD(0)));
strcpy(pHeaddata->Port,m_headOfstring.Mid(INDEXOFFIELD(1)));
//將信息頭部分字段保存在m_headOfstring中
sscanf(m_headOfstring.Mid(INDEXOFFIELD(2)),
"%f",&pHeaddata->SequenceNum);
sscanf(m_headOfstring.Mid(INDEXOFFIELD(3)),
"%f",&pHeaddata->IdleTime);
strcpy(pHeaddata->GpsTimeStatus,m_headOfstring.Mid(INDEXOFFIELD(4)));
sscanf(m_headOfstring.Mid(INDEXOFFIELD(5)),
"%d",&pHeaddata->Week);
sscanf(m_headOfstring.Mid(INDEXOFFIELD(6)),
"%lf",&pHeaddata->Seconds);
sscanf(m_headOfstring.Mid(INDEXOFFIELD(7)),
"%f",&pHeaddata->ReceiverStatus);
sscanf(m_headOfstring.Mid(INDEXOFFIELD(8)),
"%f",&pHeaddata->Reserved);
sscanf(m_headOfstring.Mid(dataindex[9],m_headOfstring.GetLength()-dataindex[9]),
"%f",&pHeaddata->ReceiverSWversion);
return TRUE;
}
//獲取數(shù)據(jù)塊的域
CString CDataString::GetDataAtFieldN(CString *str, int n)
{
CString reStr;
return reStr;
}
//獲取ASCII數(shù)據(jù)中域的數(shù)目
int CDataString::GetHowManyFields(CString str,CArray<int,int> *DataIndex)
{
// CArray<int,int> DataIndex;
if(str.IsEmpty()!=0)
return 0;
// str.TrimLeft(',');
// str.TrimRight(',');
int fieldlength_s=0;
int fieldlength_e=0;
DataIndex->Add(0);
for(;;)
{
fieldlength_e=str.Find(',',fieldlength_s);
if(fieldlength_e==-1){
int whs=str.Find('*');
if(whs==-1){
return DataIndex->GetSize(); //已到鎖定的最后一顆衛(wèi)星,返回域數(shù)目 ???
//鎖定的衛(wèi)星數(shù)=[(DataIndex->GetSize())-5]/4 ??
}else
{
DataIndex->Add(whs+1);
return DataIndex->GetSize();
}
}
fieldlength_s=fieldlength_e+1;
DataIndex->Add(fieldlength_s);
}
}
/*
BOOL CDataString::GetBestPos(VARIABLE_POS *pBestpos)
{
if(m_string.IsEmpty()!=0)
return FALSE;
CArray<int,int> dataindex;
GetHowManyFields(m_string,&dataindex);
sscanf(m_string.Mid(INDEXOFFIELD(2)),
"%lf",&pBestpos->lat);
sscanf(m_string.Mid(INDEXOFFIELD(3)),
"%lf",&pBestpos->lon);
sscanf(m_string.Mid(INDEXOFFIELD(4)),
"%lf",&pBestpos->hgt);
return TRUE;
}*/
/*
BOOL CDataString::GetRange(CArray<VARIABLE_RANGE, VARIABLE_RANGE> *pArange)
{
if(m_string.IsEmpty()!=0)
return FALSE;
HEAD_DATABLOCK head;
GetHeadData(&head);
CArray<int,int> dataindex;
GetHowManyFields(m_string,&dataindex);
int nObs;
sscanf(m_string.Mid(INDEXOFFIELD(0)),
"%ld",&nObs);
if(nObs==0){return FALSE;}
int index=0;
for(int i=0;i<nObs;i++)
{
// VARIABLE_RANGE *prange=new VARIABLE_RANGE;
VARIABLE_RANGE range;
range.week=head.Week;
range.second=head.Seconds;
sscanf(m_string.Mid(INDEXOFFIELD(index+1)),
"%hd",&range.PRN);
sscanf(m_string.Mid(INDEXOFFIELD(index+2)),
"%hd",&range.Reserved);
sscanf(m_string.Mid(INDEXOFFIELD(index+3)),
"%lf",&range.psr);
sscanf(m_string.Mid(INDEXOFFIELD(index+4)),
"%f",&range.psr_std);
sscanf(m_string.Mid(INDEXOFFIELD(index+5)),
"%lf",&range.adr);
sscanf(m_string.Mid(INDEXOFFIELD(index+6)),
"%f",&range.adr_std);
sscanf(m_string.Mid(INDEXOFFIELD(index+7)),
"%f",&range.Dopp);
sscanf(m_string.Mid(INDEXOFFIELD(index+8)),
"%f",&range.CN0);
sscanf(m_string.Mid(INDEXOFFIELD(index+9)),
"%f",&range.locktime);
sscanf(m_string.Mid(INDEXOFFIELD(index+10)),
"%x",&range.ch_tr_status);
pArange->SetAtGrow(i,range);
index=index+10;
}
return TRUE;
}*/
//獲取ASCII數(shù)據(jù)中GPGSV數(shù)據(jù)塊
BOOL CDataString::GetGpgsv(CArray<VARIABLE_GPGSV, VARIABLE_GPGSV> *pAGpgsv)
{
if(m_string.IsEmpty()!=0)
return FALSE;
CArray<int,int> dataindex;
GetHowManyFields(m_string,&dataindex);
int nObs = dataindex.GetSize();
if(nObs<5){return FALSE;}
int nGps=(nObs-5)/4; //可見衛(wèi)星數(shù)
int index=4;
for(int i=0;i<nGps;i++)
{
VARIABLE_GPGSV gpsi;
//將ASCII數(shù)據(jù)中數(shù)據(jù)塊各字段保存在m_string中
sscanf(m_string.Mid(INDEXOFFIELD(index)),
"%hd",&gpsi.PRN);
sscanf(m_string.Mid(INDEXOFFIELD(index+1)),
"%hd",&gpsi.elev);
sscanf(m_string.Mid(INDEXOFFIELD(index+2)),
"%hd",&gpsi.azimuth);
CString ss=m_string.Mid(INDEXOFFIELD(index+3));
if(ss.IsEmpty())
{ gpsi.SNR=100;
}else{
sscanf(ss,"%hd",&gpsi.SNR);
}
//CArray::SetAtGrow 向CArray類型數(shù)組中放數(shù)據(jù)
//CArray<VARIABLE_GPGSV, VARIABLE_GPGSV> *pAGpgsv
pAGpgsv->SetAtGrow(i,gpsi);
index=index+4;
////////////////////////////////////////////////////////////////
//在GSVVIEW.cpp中調(diào)用該數(shù)組:
// CArray<VARIABLE_GPGSV, VARIABLE_GPGSV> AGpgsv;
// ds.GetGpgsv(&AGpgsv);
// pDoc->m_prnR.SetGpsInf(&AGpgsv);
}
return TRUE;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -