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

📄 hello.cpp

📁 基于PC104的24位数据采集器的完整源码
💻 CPP
字号:
#include <stdio.h>
#include <fstream.h>
#include <iostream.h>
#include <string.h>
#include <dos.h>
#include <bios.h>
#include <time.h>
#include "hello.h"
#include "DataTeam.h"
#include "InfoTeam.H"
#include "combase.h"
#include "BDSin.h"
#include "BDPluse.h"

extern "C"
{
#include "par4CH.h"
}

#ifdef __cplusplus
	#define __CPPARGS ...
#else
	#define __CPPARGS
#endif

#define	RESTARTCOMPUTER		0X19

void interrupt ( *oldhandler[2])(__CPPARGS);
void interrupt (handler_IRQ5)(__CPPARGS);
void interrupt (handler_IRQ6)(__CPPARGS);

// par24ch设备句柄
DEVHANDLE g_nDevHandle;
long PC_BUFFER[TOTALCHANNELS*4];
uint g_nHalfFifoSize;
BOOL PAR24BInit();

void lcdinit(void);
void lcdout(char* pBuff,int x,int y);
void clearscreen();
void InfoOut(char* pBuff,int x,int y)	// 同时在屏幕和LCD显示屏上显示信息
{
	lcdout(pBuff,x,y);
	cout << pBuff << endl;
}


char*	g_pGpsIn;
uint	g_nGpsInPos = 0;
uint	g_nGpsInLength = 0x400;

long*	g_pDataBuff[CHANNELS];
long*	g_pSourceBuff[CHANNELS];
uint 	g_nDataLength = 0x2000;
uint g_nDataInPos = 0;

ulong g_nAbsoluteSecond = 0;

double g_pCorrectZeroData[CHANNELS];
long g_nCorrectPeriod = 0;
uint g_nDataCorrectPos = 0;

BOOL m_nIsInit = FALSE;

serial g_nOutSerial;
serial g_nConGpsSerial;

// add the 8255 port support
#define COM8255		0x313
#define COM_INIT		0X80

STATUS g_nStatus;

CSendTeam*	g_pSendTeam[SENDTEAM_LENGTH];
unsigned int	g_nSendTeamPos = 0;

BOOL nIsExit = FALSE;
BOOL g_nIsWrite = TRUE;
BOOL g_nIsCheckKey = TRUE;
uchar nIsCheckSample = 0;


void OnSerialSpeedChange(int nSpeed);
void OnSampleChange(SAMPLERATE nSampleRate);
BOOL ReadBiaodinFile();
void ExitInstance();
BOOL InitInstance();
void RefreshShow();
void CorrectWave();
void ReadWave();
void CheckKey();

int main()
{
	if(!InitInstance())
	{
		const char *buff = "Init system failure,exit...";
		InfoOut((char*)buff,0,3);
		return 1;
	}
	while(!nIsExit)
	{
		if(g_nIsWrite)
			ReadWave();
		if(g_nDataCorrectPos != g_nDataInPos)
			CorrectWave();
		if(g_nIsNeedAnalyzer)
      {
      	long nPos = (g_nDataTeamPos-1+DATATEAM_MAX_LENGTH)&(DATATEAM_MAX_LENGTH-1);
         g_pDataTeamArray[nPos].AnalyzerSentence();
	   }
		if(g_nStatus.m_nStatus)
			RefreshShow();
		if(g_nIsCheckKey)
		{
			g_nIsCheckKey = FALSE;
			CheckKey();
		}
      g_nInfoTeam.Refresh();
	}
	ExitInstance();
	return 0;
}

BOOL ReadBiaodinFile()
{
	fstream instream("C:\\BIAODIN.DAT",ios::in);
	if(!instream)
	{
		InfoOut("BiaoDin open error",0,1);
		return FALSE;
	}

	CBDSin::SINBUFF = new int[SINBUFFLENGTH];
	for(int i = 0;i<SINBUFFLENGTH;i++)
	{
		instream >> CBDSin::SINBUFF[i];
	}
	instream.close();
	InfoOut("BiaoDin read sucess",0,1);

	return TRUE;
}

BOOL InitInstance()
{
	// initlize the 8255 port to prepare to drive lcd
	outport(COM8255,COM_INIT);
	outport(0x311,0x80);	// Power Down DA

	// init the start var
	lcdinit();

	g_nInfoTeam.LoadConfig();

	if(!ReadBiaodinFile())
		return FALSE;

	g_pDataTeamArray = new CDataTeam[DATATEAM_MAX_LENGTH];
   if(!g_pDataTeamArray)
   	return FALSE;


	if(!PAR24BInit())
	  return FALSE;

	//save the old interrupt vector
	oldhandler[0] = getvect(INT_IRQ5);
	oldhandler[1] = getvect(INT_IRQ6);

	// install the new interrupt handler
	setvect(INT_IRQ5, handler_IRQ5);
	setvect(INT_IRQ6, handler_IRQ6);

	disable();
	outportb(IMR,inportb(IMR) & IRQ5);
	outportb(IMR,inportb(IMR) & IRQ6);
	enable();

	g_nConGpsSerial.Open(COM2,9600,0,8,1);
	g_nOutSerial.Open(COM1,g_nInfoTeam.GetSerialSpeed(),0,8,1);
	if(g_nConGpsSerial.flag || g_nOutSerial.flag)
	{
		InfoOut("Serial init failure",0,0);
		return FALSE;
	}
	InfoOut("Serial init sucess",0,0);

	for(uint n = 0;n<CHANNELS;n++)
	{
		g_pDataBuff[n] = new long[g_nDataLength];
		if(!g_pDataBuff[n])
			return FALSE;

		g_pSourceBuff[n] = new long[g_nDataLength];
		if(!g_pSourceBuff[n])
			return FALSE;
	}
	g_pGpsIn = new char[g_nGpsInLength];
	if(!g_pGpsIn)
		return FALSE;
		
	
	clearscreen();
	char buff[10];
	sprintf(buff,"%2d",g_nInfoTeam.GetSiteID());
	lcdout(buff,0,2);
	sprintf(buff,"%3d",g_nInfoTeam.GetSample());
	lcdout(buff,3,2);
	sprintf(buff,"%6d",g_nInfoTeam.GetSerialSpeed());
	lcdout(buff,7,2);
	lcdout("C",0,3);
	lcdout("F",3,3);		

	return TRUE;
}

void  ExitInstance()
{
	/* reset the old interrupt handler */
	disable();
	setvect(INT_IRQ5, oldhandler[0]);
	setvect(INT_IRQ6, oldhandler[1]);
	outportb(IMR,inportb(IMR) | ~IRQ6);
	outportb(IMR,inportb(IMR) | ~IRQ5);
	enable();

	g_nInfoTeam.SaveConfig();
	lcdout("Save config ........",0,0);

	Par4chStop(g_nDevHandle);
	Par4chClose(g_nDevHandle);
	lcdout("Stop sample device..",0,1);

	for(uint n = 0;n<CHANNELS;n++)
	{
		if(g_pDataBuff[n])
			delete g_pDataBuff[n];
		if(g_pSourceBuff[n])
			delete g_pSourceBuff[n];
	}
	if(g_pGpsIn)
		delete g_pGpsIn;
	if(CBDSin::SINBUFF)
		delete[] CBDSin::SINBUFF;
	if(g_pDataTeamArray)
   	delete[] g_pDataTeamArray;      
	lcdout("Release memory......",0,2);
	lcdout("Sample process exit.",0,3);
	lcdout("Restarting computer",0,0);

	union REGS regs;
	int86(RESTARTCOMPUTER, &regs, &regs);
}

BOOL PAR24BInit()
{
	double nActualSps;
	if(g_nInfoTeam.GetSample() == SAMPLE200)
	{
		g_nDevHandle = Par4chOpen(
			PAR4CH_0x378,
			PAR4CH_PORT_MODE_EPP,
			g_nInfoTeam.GetSample(),
			&nActualSps,
			NULL);
	}
	else
	{
		g_nDevHandle = Par4chOpen(
			PAR4CH_0x378,
			PAR4CH_PORT_MODE_EPP,
			g_nInfoTeam.GetSample()*2,
			&nActualSps,
			NULL);
	}

	/*g_nDevHandle = Par4chFullOpen(
		PAR4CH_0x378,
		PAR4CH_PORT_MODE_EPP,
		PAR4CH_DF_SIGNED,
		PAR4CH_GAIN_1,
		PAR4CH_TURBO_16,
		PAR4CH_DECIMATION_100Hz_T16,
		PAR4CH_EXTRADECIMATION_MIN,
		0,
		NULL,
		NULL);*/

	if(g_nDevHandle == BAD_DEVHANDLE)
	{
		InfoOut("Sample dev failure..",0,2);
		return FALSE;
	}

	InfoOut("Sample dev sucess...",0,2);
	return TRUE;
}

void CheckKey()
{
	if(bioskey(1))
	{
		int key = bioskey(0);
		key = key&0xff?0:key>>8;
		switch(key)
		{
			case 59:	// Press F1
				nIsExit = TRUE;
				break;
			case 60:	// Press F2
				if(g_nInfoTeam.IsCorrectZero())
				{
					g_nInfoTeam.SetIsCorrectZero(FALSE);
				}
				else
				{
					g_nInfoTeam.SetIsCorrectZero(TRUE);
				}
				break;
			case 61:	// Press F3
				break;
			case 62:	// Press F4
				g_nInfoTeam.SetIsFilt(!g_nInfoTeam.IsFilt());
				break;
			case 120:	// ALT-1
				disable();
				g_nInfoTeam.SetSample(SAMPLE50);
				enable();
				break;
			case 121:	// ALT-2
				disable();
				g_nInfoTeam.SetSample(SAMPLE100);
				enable();
				break;
			case 122:	// ALT-3
				disable();
				g_nInfoTeam.SetSample(SAMPLE200);
				enable();
				break;
			default:
				break;
		}
	}
}

uint nPrevPos = 0;
void interrupt (handler_IRQ5)(__CPPARGS)
{
	disable();
   g_nAbsoluteSecond ++;
	g_pSendTeam[g_nSendTeamPos++] = &g_pDataTeamArray[g_nDataTeamPos];
	g_nSendTeamPos &= (SENDTEAM_LENGTH-1);
	g_pDataTeamArray[g_nDataTeamPos].
			SetTeam(g_nDataInPos,nPrevPos,g_nGpsInPos);
	g_nDataTeamPos = (g_nDataTeamPos+1)&(DATATEAM_MAX_LENGTH-1);
	nPrevPos = g_nGpsInPos;

	// Test whether the buffer is empty
	StartSend();

   // info Team
  	if(g_nInfoTeam.GetTimeLength() > 0 && (!(g_nAbsoluteSecond%g_nInfoTeam.GetTimeLength())))
	{
		g_pSendTeam[g_nSendTeamPos++] = &g_nInfoTeam;
		g_nSendTeamPos &= (SENDTEAM_LENGTH-1);
		g_nInfoTeam.Update();
	}


	// Test Whether start the biaodin
	if(g_nBDSin.IsStart(g_nAbsoluteSecond))
		g_nBDSin.Start();
	else if(g_nBDPluse.IsStart(g_nAbsoluteSecond))
   	g_nBDPluse.Start();
	else if(g_nBDSin.IsPowerUp(g_nAbsoluteSecond))
   	g_nBDSin.DAPowerUp();
	else if(g_nBDPluse.IsPowerUp(g_nAbsoluteSecond))
   	g_nBDPluse.DAPowerUp();

	// out the end sign
	outportb(ICR,EOI);
	enable();
}

uchar nMSCounter = 1,nSampleCounter = 0;
void interrupt (handler_IRQ6)(__CPPARGS)
{
	disable();

	g_nBDSin.Doing();
   g_nBDPluse.Doing();

	if(nSampleCounter++ == 	g_nInfoTeam.GetHalfSampleTime())
	{
		g_nIsWrite = TRUE;
		nSampleCounter = 0;
	}

	if(nMSCounter++ == 25)
	{
		nMSCounter = 0;
		g_nIsCheckKey = TRUE;
	}

	if(!m_nIsInit)
	{
		Par4chStart(g_nDevHandle);
		m_nIsInit = TRUE;
	}

	// out the end sign
	outportb(ICR,EOI);
	enable();
}

void OnSampleChange()
{
	Par4chStop(g_nDevHandle);
	Par4chClose(g_nDevHandle);
	if(!PAR24BInit())
		return;
	Par4chStart(g_nDevHandle);
}

void OnSerialSpeedChange()
{
	Par4chStop(g_nDevHandle);
	g_nOutSerial.ResetSpeed(g_nInfoTeam.GetSerialSpeed());
	Par4chStart(g_nDevHandle);
}

void RefreshShow()
{
	char buff[50];
	if(g_nStatus.m_nBitStatus.SiteID)
	{
		g_nStatus.m_nBitStatus.SiteID = 0;
		sprintf(buff,"%2d",g_nInfoTeam.GetSiteID());
		lcdout(buff,0,2);
	}
	if(g_nStatus.m_nBitStatus.LongLat)
	{
		g_nStatus.m_nBitStatus.LongLat = 0;
		//lcdout(g_nInfoTeam.m_nLongitude,0,1);
		//lcdout(g_nInfoTeam.m_nLatitude,11,1);
	}
	if(g_nStatus.m_nBitStatus.Height)
	{
		g_nStatus.m_nBitStatus.Height = 0;
	}
	if(g_nStatus.m_nBitStatus.Time)
	{
		g_nStatus.m_nBitStatus.Time = 0;
		time_t nTime = g_nAbsoluteSecond+TIMEZONE;
		struct tm * pTime = gmtime(&nTime);
		char nTemp[10];
		sprintf(buff,"20%d%d-",pTime->tm_year/10%10,pTime->tm_year%10);
		sprintf(nTemp,"%d%d-",(pTime->tm_mon+1)/10,(pTime->tm_mon+1)%10);
		strcat(buff,nTemp);
		sprintf(nTemp,"%d%d ",pTime->tm_mday/10,pTime->tm_mday%10);
		strcat(buff,nTemp);
		sprintf(nTemp,"%d%d:",pTime->tm_hour/10,pTime->tm_hour%10);
		strcat(buff,nTemp);
		sprintf(nTemp,"%d%d:",pTime->tm_min/10,pTime->tm_min%10);
		strcat(buff,nTemp);
		sprintf(nTemp,"%d%d",pTime->tm_sec/10,pTime->tm_sec%10);
		strcat(buff,nTemp);
		lcdout(buff,0,0);
		long nSimTime = g_nDataInPos - g_nDataCorrectPos;
		sprintf(buff,"%ld",nSimTime);
		lcdout(buff,18,3);
	}
	if(g_nStatus.m_nBitStatus.SampleRate)
	{
		// change the lcd sample
		g_nStatus.m_nBitStatus.SampleRate = 0;
		sprintf(buff,"%3d",g_nInfoTeam.GetSample());
		lcdout(buff,3,2);
	}
	if(g_nStatus.m_nBitStatus.SerialSpeed)
	{
		g_nStatus.m_nBitStatus.SerialSpeed = 0;
		sprintf(buff,"%5d",g_nInfoTeam.GetSerialSpeed());
		lcdout(buff,7,2);
	}
	if(g_nStatus.m_nBitStatus.Filt)
	{
		// change the lcd sample
		g_nStatus.m_nBitStatus.Filt = 0;
		if(g_nInfoTeam.IsFilt())
			lcdout("F",3,3);
		else
		lcdout(" ",3,3);
	}
	if(g_nStatus.m_nBitStatus.BiaoDinWave)
	{
		g_nStatus.m_nBitStatus.BiaoDinWave = 0;
		if(g_nBDSin.IsBiaoDining())
			lcdout("S",5,3);
		else
			lcdout(" ",5,3);
	}
	if(g_nStatus.m_nBitStatus.BiaoDinPluse)
	{
		g_nStatus.m_nBitStatus.BiaoDinPluse = 0;
		if(g_nBDPluse.IsBiaoDining())
			lcdout("P",6,3);
		else
			lcdout(" ",6,3);
	}

}

void CorrectWave()
{
	for(uchar n = 0;n<CHANNELS;n++)
	{
		if(g_nCorrectPeriod == g_nInfoTeam.GetTotalCorrectPeriod())
		{
			if(g_nInfoTeam.IsCorrectZero())
			{
				g_pDataBuff[n][g_nDataCorrectPos] = g_pSourceBuff[n][g_nDataCorrectPos] -
					g_pCorrectZeroData[n]/g_nInfoTeam.GetTotalCorrectPeriod();
			}
			else
				g_pDataBuff[n][g_nDataInPos] = g_pSourceBuff[n][g_nDataCorrectPos];
			g_pCorrectZeroData[n] += g_pSourceBuff[n][g_nDataCorrectPos];
			long nPrevPos = (g_nDataCorrectPos - g_nInfoTeam.GetTotalCorrectPeriod() + g_nDataLength)&(g_nDataLength-1);
			g_pCorrectZeroData[n] -= g_pSourceBuff[n][nPrevPos];
		}
		else
		{
			g_pDataBuff[n][g_nDataCorrectPos] = g_pSourceBuff[n][g_nDataCorrectPos];
			g_pCorrectZeroData[n] += g_pSourceBuff[n][g_nDataCorrectPos];
		}
	}
	if(g_nCorrectPeriod != g_nInfoTeam.GetTotalCorrectPeriod())
		g_nCorrectPeriod ++;
	g_nDataCorrectPos = ++g_nDataCorrectPos&(g_nDataLength-1);
}

void ReadWave()
{
	uchar nActualNum = Par4chReadData(g_nDevHandle,
							PC_BUFFER,
							TOTALCHANNELS*4,
							NULL	);
	for(char i = 0;i<nActualNum;i+=TOTALCHANNELS)
	{
		if(g_nInfoTeam.GetSample() == SAMPLE200)
		{
			for(uchar n = 0;n<CHANNELS;n++)
				g_pSourceBuff[n][g_nDataInPos] = PC_BUFFER[i+n];
				g_nDataInPos = ++g_nDataInPos&(g_nDataLength-1);
		}
		else if(nIsCheckSample)
		{
			nIsCheckSample = 0;
			for(uchar n = 0;n<CHANNELS;n++)
				g_pSourceBuff[n][g_nDataInPos] = PC_BUFFER[i+n];
			g_nDataInPos = ++g_nDataInPos&(g_nDataLength-1);
		}
		else
			nIsCheckSample = 1;
	}
	g_nIsWrite = FALSE;
}

⌨️ 快捷键说明

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