📄 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数据的信息头(m_headOfstring)
m_string=str.Right(str.GetLength()-headlength-1);//提取出ASCII数据的数据块(m_string)
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
int flaglength=m_headOfstring.Find(','); //信息头格式:#BESTPOSA,X,X,X,...,X;
flagstr=m_headOfstring.Left(flaglength); //取信息头第一个逗号分隔符左边的字符串
/* ASCII数据块标识(DataString.h) !!注意和二进制数据块标识相区别!!!!!!
#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;
}
//获取数据块的域
CString CDataString::GetDataAtFieldN(CString *str, int n)
{
CString reStr;
return reStr;
}
//获取ASCII数据中域的数目
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(); //已到锁定的最后一颗卫星,返回域数目 ???
//锁定的卫星数=[(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数据中GPGSV数据块
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; //可见卫星数
int index=4;
for(int i=0;i<nGps;i++)
{
VARIABLE_GPGSV gpsi;
//将ASCII数据中数据块各字段保存在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类型数组中放数据
//CArray<VARIABLE_GPGSV, VARIABLE_GPGSV> *pAGpgsv
pAGpgsv->SetAtGrow(i,gpsi);
index=index+4;
////////////////////////////////////////////////////////////////
//在GSVVIEW.cpp中调用该数组:
// CArray<VARIABLE_GPGSV, VARIABLE_GPGSV> AGpgsv;
// ds.GetGpgsv(&AGpgsv);
// pDoc->m_prnR.SetGpsInf(&AGpgsv);
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -