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

📄 inteteam.cpp

📁 基于PC104的24位数据采集器的完整源码
💻 CPP
字号:


#include <stdio.h>
#include "InteTeam.h"
#include "hello.h"
#include "InfoTeam.h"
#include "BDSin.h"

void lcdout(char*,int,int);

const INTERFACE_TYPE TYPE_ARRAY[] = {
			INTERFACE_SITEID,
			INTERFACE_SAMPLE,
			INTERFACE_SERIAL,
			INTERFACE_BIAODINPLUSE,
			INTERFACE_BIAODINWAVE,
			INTERFACE_FILT,
			INTERFACE_CORRECT};
const char TEAMHEAD[] = {0xbf,0x13,0x97,0x74};
const unsigned int  COMMAND[] = {0X1008,0X1004,0X100A,0X1007,0X1006,0XFFAF,0X1009};
const unsigned int  LENGTH[] = {8,4,10,16,0,0,6};
const unsigned int  SCOMMAND[] = {0X2008,0X2004,0,0X2007,0X2006,0XFFAF,0X2009};
const unsigned int  SLENGTH[] = {8,8,0,16,0,0,6};
const int  TYPENUM = 7;

CInterTeam g_nInterTeam;

CInterTeam::CInterTeam()
{
	m_nTeamIndex = 0;

	m_nSendType = INTERFACE_NULL;

	m_pReceiveBuff = new char[HEX_BIG];
}

CInterTeam::~CInterTeam()
{
	if(m_pReceiveBuff)
		delete[] m_pReceiveBuff;
}

char CInterTeam::GetNext(unsigned int& nTeamIndex)
{
	char nChar;
	nTeamIndex ++;
	if(nTeamIndex < 5)
		nChar = Team_HEAD[nTeamIndex-1];
	else if(nTeamIndex < 7)
		nChar = ItoChar(g_nInfoTeam.GetSiteID(),nTeamIndex - 5);
	else if(nTeamIndex < 9)
		nChar = ItoChar(SCOMMAND[m_nSendType],nTeamIndex - 7);
	else if(nTeamIndex < 11)
	{
		if(SLENGTH[m_nSendType])
			nChar = ItoChar(SLENGTH[m_nSendType],nTeamIndex - 9);
		else if(m_nSendType == INTERFACE_BIAODINWAVE)
		{
			// 正玄函数
			nChar = ItoChar(14+6*g_nBDSin.m_nFrqNum,nTeamIndex - 9);
		}
	}
	else
	{
		switch(m_nSendType)
		{
		case INTERFACE_SITEID:
			{
				if(nTeamIndex < 15)
					nChar = 0;
				else if(nTeamIndex < 17)
					nChar = ItoChar(g_nInfoTeam.GetSiteID(),nTeamIndex - 15);
				else
				{
					int nCheckSum = -(g_nInfoTeam.GetSiteID()*2+
									SCOMMAND[m_nSendType]+SLENGTH[m_nSendType]);
					nChar = ItoChar(nCheckSum,nTeamIndex - 17);
				}

				if(nTeamIndex == 18)
					nTeamIndex = 0;
			}
		break;
		case INTERFACE_SAMPLE:
			{
				if(nTeamIndex < 12)
					nChar = ItoChar(g_nInfoTeam.GetSample(),nTeamIndex - 10);
				else if(nTeamIndex < 14)
					nChar = ItoChar(2,nTeamIndex - 12);
				else if(nTeamIndex < 16)
					nChar = ItoChar(g_nInfoTeam.GetFrqWidth(),nTeamIndex - 12);
				else
				{
					int nCheckSum = -(g_nInfoTeam.GetSiteID()+SCOMMAND[m_nSendType]+
							SLENGTH[m_nSendType]+g_nInfoTeam.GetSample()+2+
							g_nInfoTeam.GetFrqWidth());
					nChar = ItoChar(nCheckSum,nTeamIndex - 17);
				}

				if(nTeamIndex == 18)
					nTeamIndex = 0;
			}
		break;
		case INTERFACE_BIAODINWAVE:
			{
				if(nTeamIndex < 12)
					nChar = ItoChar(7,nTeamIndex - 10);
				else if(nTeamIndex < 14)
					nChar = ItoChar(g_nBDSin.IsClockStart(),nTeamIndex - 12);
				else if(nTeamIndex < 18)
					nChar = LtoChar(g_nBDSin.GetStartSecond(),nTeamIndex - 14);
				else if(nTeamIndex < 20)
					nChar = ItoChar(g_nBDSin.GetTMDay(),nTeamIndex - 18);
				else if(nTeamIndex < 22)
					nChar = ItoChar(g_nBDSin.m_nFrqNum,nTeamIndex - 20);
				else if(nTeamIndex < 22+6*g_nBDSin.m_nFrqNum)
				{
					int nFrqPos = (nTeamIndex - 22)/6;
					int nCountPos = nTeamIndex - 22 - nFrqPos*6;
					if(nCountPos < 2)
						nChar = ItoChar(g_nBDSin.m_pFrqArray[nFrqPos].m_nPeriod,nCountPos);
					else if(nCountPos < 4)
						nChar = ItoChar(g_nBDSin.m_pFrqArray[nFrqPos].m_nFrq,nCountPos-2);
					else
						nChar = ItoChar(g_nBDSin.m_pFrqArray[nFrqPos].m_nDamp,nCountPos-4);
				}
				else
				{
					int nCheckSum = 0;
					for(int i = 0;i<g_nBDSin.m_nFrqNum;i++)
					{
						nCheckSum -= g_nBDSin.m_pFrqArray[i].m_nPeriod;
						nCheckSum -= g_nBDSin.m_pFrqArray[i].m_nFrq;
						nCheckSum -= g_nBDSin.m_pFrqArray[i].m_nDamp;
					}
					long nSecond = g_nBDSin.GetStartSecond();
					int* pSecond = (int*)&nSecond;
					nCheckSum = -(g_nInfoTeam.GetSiteID()+SCOMMAND[m_nSendType]+
							21+7*g_nBDSin.m_nFrqNum+pSecond[0]+pSecond[1]+
							g_nBDSin.GetTMDay());
					nChar = ItoChar(nCheckSum,nTeamIndex - 22-6*g_nBDSin.m_nFrqNum);
				}

				if(nTeamIndex == 24+6*g_nBDSin.m_nFrqNum)
					nTeamIndex = 0;
			}
		break;
		}
	}

	return nChar;
}

void CInterTeam::CheckTeamHead(char nChar)
{
	static unsigned int nIndex = 0;
	if(nChar != TEAMHEAD[nIndex])
	{
		nIndex = 0;
		if(nChar == TEAMHEAD[m_nTeamIndex])
			nIndex ++;
	}
	else if(nIndex == 3)
	{
		nIndex = 0;
		m_nTeamIndex = 4;
	}
	else
		nIndex ++;
}

void CInterTeam::TeamIn(char nChar)
{
	m_pReceiveBuff[m_nTeamIndex] = nChar;

	if(m_nTeamIndex < 4)
	{
		if(nChar != TEAMHEAD[m_nTeamIndex])
		{
			m_nTeamIndex = 0;
			if(nChar == TEAMHEAD[m_nTeamIndex])
				m_nTeamIndex ++;
		}
		else
			m_nTeamIndex ++;
	}
	else
	{
		m_nTeamIndex ++;
		CheckTeamHead(nChar);
	}

	unsigned int& nLength = (unsigned int&)m_pReceiveBuff[8];
	if(m_nTeamIndex < 10)
	{

	}
	else if(m_nTeamIndex == 10)
	{
		// 检验命令和长度
		unsigned int& nSiteID = (unsigned int&)m_pReceiveBuff[4];
		unsigned int& nCommand = (unsigned int&)m_pReceiveBuff[6];

		m_nSendType = INTERFACE_NULL;

		for(int i = 0;i<TYPENUM;i++)
		{
			if(nCommand == COMMAND[i])
			{
				if(nSiteID == g_nInfoTeam.GetSiteID() &&
								(!LENGTH[i]||nLength == LENGTH[i]))
					m_nSendType = TYPE_ARRAY[i];
				break;
			}
		}

		if(m_nSendType == INTERFACE_NULL)
			m_nTeamIndex = 0;

	}
	else if(m_nSendType != INTERFACE_NULL && m_nTeamIndex == nLength + 10)
	{
		m_nTeamIndex = 0;
		int nSum = 0;
		for(int i = 4;i<nLength+10;i+=2)
		{
			int& nInt = (int&)m_pReceiveBuff[i];
			nSum += nInt;
		}

		if(nSum != 0)
		{
			// frame error
			m_nSendType = INTERFACE_NULL;
			return;
		}

		switch(m_nSendType)
		{
			case INTERFACE_SITEID:
			{
				unsigned int& nSiteID = (unsigned int&)m_pReceiveBuff[14];
				g_nInfoTeam.SetSiteID(nSiteID);
			}
			break;
			case INTERFACE_SAMPLE:
			{
				unsigned int& nSampleRate = (unsigned int&)m_pReceiveBuff[10];
				g_nInfoTeam.SetSample(nSampleRate);
			}
			break;
			case INTERFACE_SERIAL:
			{
				unsigned long& nSerialSpeed = (unsigned long&)m_pReceiveBuff[14];
				g_nInfoTeam.SetSerialSpeed(nSerialSpeed);
				m_nSendType = INTERFACE_NULL;
			}
			break;
			case INTERFACE_BIAODINWAVE:
			{
				int& nCalID = (int&)m_pReceiveBuff[10];
				int& nTimeEnable = (int&)m_pReceiveBuff[12];
				long& nSecond = (long&)m_pReceiveBuff[14];
				int& nDay = (int&)m_pReceiveBuff[18];
				int& nNum = (int&)m_pReceiveBuff[20];
				if(nCalID != 7 || ((nLength-14) != 6*nNum) || nNum >=50)
				{
					m_nSendType = INTERFACE_NULL;
					break;
				}
				if(nTimeEnable == 0)
				{
					g_nBDSin.SetClockFalse();
				}
				else
				{
					long nSec = nDay;
					nSec *= 86400;
					g_nBDSin.SetClockStart(nSecond,nSec);
					g_nBDSin.m_nFrqNum = nNum;
					g_nBDSin.ReadFromBuff(&m_pReceiveBuff[22]);
				}
			}
			break;
		}

		// send back
		if(m_nSendType != INTERFACE_NULL)
		{
			if(SLENGTH[m_nSendType] != 0)
			{
				g_pSendTeam[g_nSendTeamPos++] = &g_nInterTeam;
				g_nSendTeamPos &= (SENDTEAM_LENGTH-1);
			}
		}
	}

	//char buff[20];
	//sprintf(buff,"%d,%d  ",m_nSendType,m_nTeamIndex);
	//lcdout(buff,0,3);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -