⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datateam.cpp

📁 基于PC104的24位数据采集器的完整源码
💻 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 + -