📄 hello.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, ®s, ®s);
}
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 + -