📄 datateam.cpp
字号:
// DataTeam.cpp: implementation of the CDataTeam class.
//
//////////////////////////////////////////////////////////////////////
#include "DataTeam.h"
#include <stdlib.h>
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include "InfoTeam.h"
#include "BDSin.h"
#include "BDPluse.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDataTeam* g_pDataTeamArray = NULL;
uchar g_nDataTeamPos = 0;
BOOL g_nIsNeedAnalyzer = FALSE;
int nPrevSecondPos = -1;
CDataTeam::CDataTeam()
{
}
CDataTeam::~CDataTeam()
{
}
char CDataTeam::GetNext(uint& nTeamIndex)
{
char nChar;
nTeamIndex ++;
if(nTeamIndex < 5)
return Team_HEAD[nTeamIndex-1];
else if(nTeamIndex < 7)
nChar = ItoChar(m_nHead.m_nSITE_ID,nTeamIndex-5);
else if(nTeamIndex < 9)
nChar = ItoChar(m_nHead.m_nCMD,nTeamIndex-7);
else if(nTeamIndex < 11)
nChar = ItoChar(m_nHead.m_nLENGTH,nTeamIndex-9);
else if(nTeamIndex < 15)
nChar = LtoChar(m_nHead.m_nSECOND,nTeamIndex-11);
else if(nTeamIndex == 15)
nChar = m_nHead.m_nFLAG;
else if(nTeamIndex == 16)
nChar = m_nHead.m_nPSUM;
else if(!m_nIsNumCorrect && nTeamIndex < 20)
{
uint nPos = (m_nDataPos -1 + g_nDataLength)&(g_nDataLength-1);
nChar = LtoChar(
(g_pDataBuff[0][m_nDataPos]+g_pDataBuff[0][nPos])/2,nTeamIndex - 17);
}
else if(nTeamIndex < 17+3*g_nInfoTeam.GetSample())
{
uint nIndex = nTeamIndex - 17;
uint nMod = nIndex/3;
uint nLongPos = (nMod + m_nDataPos) & (g_nDataLength-1);
uint nCharPos = nIndex - nMod*3;
nChar = LtoChar( g_pDataBuff[0][nLongPos],nCharPos);
}
else if(!m_nIsNumCorrect && nTeamIndex < 3*g_nInfoTeam.GetSample() + 20)
{
uint nPos = (m_nDataPos -1 + g_nDataLength)&(g_nDataLength-1);
nChar = LtoChar(
(g_pDataBuff[1][m_nDataPos]+g_pDataBuff[1][nPos])/2,nTeamIndex - 3*g_nInfoTeam.GetSample() - 17);
}
else if(nTeamIndex < 17+6*g_nInfoTeam.GetSample())
{
uint nIndex = nTeamIndex - (17+3*g_nInfoTeam.GetSample());
uint nMod = nIndex/3;
uint nLongPos = (nMod + m_nDataPos) & (g_nDataLength-1);
uint nCharPos = nIndex - nMod*3;
nChar = LtoChar( g_pDataBuff[1][nLongPos],nCharPos);
}
else if(!m_nIsNumCorrect && nTeamIndex < 6*g_nInfoTeam.GetSample() + 20)
{
uint nPos = (m_nDataPos -1 + g_nDataLength)&(g_nDataLength-1);
nChar = LtoChar(
(g_pDataBuff[2][m_nDataPos]+g_pDataBuff[2][nPos])/2,nTeamIndex - 6*g_nInfoTeam.GetSample() - 17);
}
else if(nTeamIndex < 17+9*g_nInfoTeam.GetSample())
{
uint nIndex = nTeamIndex - (17+6*g_nInfoTeam.GetSample());
uint nMod = nIndex/3;
uint nLongPos = (nMod + m_nDataPos) & (g_nDataLength-1);
uint nCharPos = nIndex - nMod*3;
nChar = LtoChar( g_pDataBuff[2][nLongPos],nCharPos);
}
else if(nTeamIndex == 17+9*g_nInfoTeam.GetSample())
{
nChar = ItoChar(m_nCheckSum,0);
}
else if(nTeamIndex == 18+9*g_nInfoTeam.GetSample())
{
nChar = ItoChar(m_nCheckSum,1);
nTeamIndex = 0;
}
if(nTeamIndex == 5 && m_nCheckSumPos == CHECKPOSUNINIT)
m_nCheckSumPos = 0;
if(nTeamIndex > 4 && nTeamIndex < 17 + 9*g_nInfoTeam.GetSample())
{
if(nTeamIndex > m_nCheckSumPos)
{
if(nTeamIndex&0x01)
m_nCheckTemp[0] = nChar;
else
{
int& nInt = (int&)m_nCheckTemp[0];
m_nCheckTemp[1] = nChar;
m_nCheckSum -= nInt;
}
m_nCheckSumPos = nTeamIndex;
}
}
return nChar;
}
void CDataTeam::SetTeam(uint nDataPos, uint nGpsStart, uint nGpsEnd)
{
m_nIsNumCorrect = TRUE;
m_nDataPos = (nDataPos-g_nInfoTeam.GetSample()) & (g_nDataLength-1);
if(nPrevSecondPos != -1 )
{
uint nLength=(m_nDataPos-nPrevSecondPos+g_nDataLength)&(g_nDataLength-1);
if(nLength < g_nInfoTeam.GetSample())
m_nIsNumCorrect = FALSE;
}
nPrevSecondPos = nDataPos;
m_nGpsDataStart = nGpsStart;
m_nGpsDataEnd = nGpsEnd;
m_nHead.m_nSECOND = g_nAbsoluteSecond-1;
Fresh();
g_nIsNeedAnalyzer = TRUE;
}
void CDataTeam::AnalyzerSentence()
{
while(m_nGpsDataStart != m_nGpsDataEnd)
{
if(g_pGpsIn[m_nGpsDataStart] == '$')
break;
m_nGpsDataStart = (m_nGpsDataStart + 1)&(g_nGpsInLength-1);
}
uint start = m_nGpsDataStart;
while(start != m_nGpsDataEnd)
{
if(g_pGpsIn[start] == '*')
break;
start = (start+1)&(g_nGpsInLength-1);
}
g_nStatus.m_nBitStatus.Time = 1;
if(start != m_nGpsDataEnd)
{
char buff[20];
ReadNextStr(buff,m_nGpsDataStart,m_nGpsDataEnd); // Head
ReadNextStr(buff,m_nGpsDataStart,m_nGpsDataEnd); // Weeks
uint nWeeks = atoi(buff);
ReadNextStr(buff,m_nGpsDataStart,m_nGpsDataEnd); // Seconds
ulong nSeconds = atol(buff);
ReadNextStr(buff,m_nGpsDataStart,m_nGpsDataEnd); // leap
uint nLeap = atoi(buff);
ReadNextStr(buff,m_nGpsDataStart,m_nGpsDataEnd); // count seconds
g_nInfoTeam.m_nCountSeconds = atol(buff);
long nAbsoluteSecond = (nWeeks+1024)*604800 + nSeconds -
nLeap + TIME_INTER + g_nInfoTeam.m_nCountSeconds;
if(g_nAbsoluteSecond < nAbsoluteSecond)
g_nAbsoluteSecond = nAbsoluteSecond;
ReadNextStr(buff,m_nGpsDataStart,m_nGpsDataEnd); // longitude
if(strcmp(buff,g_nInfoTeam.m_nLongitude))
{
strcpy(g_nInfoTeam.m_nLongitude,buff);
g_nStatus.m_nBitStatus.LongLat = 1;
}
ReadNextStr(buff,m_nGpsDataStart,m_nGpsDataEnd); // latitude
if(strcmp(buff,g_nInfoTeam.m_nLatitude))
{
strcpy(g_nInfoTeam.m_nLatitude,buff);
g_nStatus.m_nBitStatus.LongLat = 1;
}
ReadNextStr(buff,m_nGpsDataStart,m_nGpsDataEnd); // satelite
if(strcmp(buff,g_nInfoTeam.m_nSatelite))
{
strcpy(g_nInfoTeam.m_nSatelite,buff);
g_nStatus.m_nBitStatus.SateliteNum = 1;
}
ReadNextStr(buff,m_nGpsDataStart,m_nGpsDataEnd); // sea height
if(strcmp(buff,g_nInfoTeam.m_nSeaHeight))
{
strcpy(g_nInfoTeam.m_nSeaHeight,buff);
g_nStatus.m_nBitStatus.Height = 1;
}
ReadNextStr(buff,m_nGpsDataStart,m_nGpsDataEnd);
{
for(uchar i = 0;i<4;i++)
g_nInfoTeam.m_nSateliteCode[i] = buff[i];
}
ReadNextStr(buff,m_nGpsDataStart,m_nGpsDataEnd);
g_nInfoTeam.m_nVol = atoi(buff);
ReadNextStr(buff,m_nGpsDataStart,m_nGpsDataEnd);
g_nInfoTeam.m_nTemperature = atoi(buff);
}
g_nIsNeedAnalyzer = FALSE;
}
void CDataTeam::ReadNextStr(char *buff, uint &nPos, uint nEndPos)
{
nPos = (nPos+1)&(g_nGpsInLength-1);
uint nBuffPos = 0;
while(nPos != nEndPos)
{
if(g_pGpsIn[nPos] == ',')
{
buff[nBuffPos] = 0;
break;
}
buff[nBuffPos++] = g_pGpsIn[nPos];
nPos = (nPos+1)&(g_nGpsInLength-1);
}
}
BOOL CDataTeam::CompareStr(char *src, char *des)
{
int nPos = 0;
while(src[nPos] && des[nPos])
{
if(src[nPos] != des[nPos])
return TRUE;
nPos++;
}
if(src[nPos] == des[nPos])
return FALSE;
else
return TRUE;
}
void CDataTeam::Fresh()
{
m_nHead.m_nSITE_ID = g_nInfoTeam.GetSiteID();
m_nHead.m_nCMD = 0x55AA;
m_nHead.m_nLENGTH = 9*g_nInfoTeam.GetSample()+8;
if(g_nBDSin.IsBiaoDining())
m_nHead.m_nFLAG = 0x03;
else if(g_nBDPluse.IsBiaoDining())
m_nHead.m_nFLAG = 0x01;
else
m_nHead.m_nFLAG = 0x00;
m_nHead.m_nPSUM = -char(char(m_nHead.m_nSITE_ID) +
char(m_nHead.m_nSITE_ID >> 8) +
char(m_nHead.m_nCMD) +
char(m_nHead.m_nCMD >> 8) +
char(m_nHead.m_nLENGTH) +
char(m_nHead.m_nLENGTH >> 8) +
char(m_nHead.m_nSECOND) +
char(m_nHead.m_nSECOND >> 8) +
char(m_nHead.m_nSECOND >> 16) +
char(m_nHead.m_nSECOND >> 24) +
char(m_nHead.m_nFLAG));
m_nCheckSum = 0;
m_nCheckSumPos = CHECKPOSUNINIT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -