#include "GPS.h"
CGPS::CGPS(char* pFileName):CProtocolBase(pFileName)
{
/* below is the version, please change it if you change the program */
FILE *fp = NULL;
int nVaule; // 信息值
int nInfoNum; // 信息数目
int nInfoNo; // 信息序号
int nReadRet; // 读返回值
int nItem;
char strItemName[256];
char sPath[256];
memset(strItemName, 0, sizeof(strItemName));
m_SubProtocolType = m_ptrChannel[0].ptrStructDev[0].ubDevType;
printf("m_SubProtocolType =%d \n",m_SubProtocolType);
RepeatJs=0;
GpsMinTimeEndFlag=0;
m_Counter = 0;
m_cDevState.ClearTimer();
m_cDevState.SetTimer(1200);
m_cSynTime.ClearTimer();
m_cSynTime.SetTimer(300);
m_tmGPSSrcTimer.SetTimer(10);
m_nAreaOffset = 0;
m_nSyncCount = 0;
sprintf(sPath,"%s_0_0.cpt",pFileName);
printf("open file %s\n",sPath);
fp = fopen(sPath, "r");
if (fp != NULL)
{
// 1. 信息数目
PB_ReadNextSetting(fp, nInfoNum);
PB_ReadNextSettingSkipName(fp, m_nAreaOffset);
fclose(fp); fp = NULL;
}
}
CGPS::~CGPS()
{
}
void CGPS::Proc()
{
for (int idPortSeq = 0; idPortSeq < m_nChannelNum; idPortSeq++) {
if (PB_ProcEnable(idPortSeq) == false)
return;
PB_CheckPortStatus(idPortSeq);
PB_ReadNewData(idPortSeq);
g_ppProtocolTP[m_nProtocolIndex].tp = 2;
if(m_cDevState.JudgeTimerIsEnd() == 1)
{
m_cDevState.ClearTimer();
m_cDevState.SetTimer(1200);
if (m_ptrChannel[idPortSeq].ptrStructDev[0].ubDevType != GPS_NSC20_MASTER)
m_ptrChannel[idPortSeq].ptrStructDev[0].ubStatus=0xff;
ClearTimeSyncSource(TIME_SYNC_GPSCOMM);
}
g_ppProtocolTP[m_nProtocolIndex].tp = 3;
if(m_cSynTime.JudgeTimerIsEnd() == 1)
{
m_cSynTime.ClearTimer();
m_cSynTime.SetTimer(300);
PB_SetTimerFlag(2,0);
}
switch(m_ptrChannel[idPortSeq].ptrStructDev[0].ubDevType)
{
case GPS_HUANING:
ProcGPS_HuaNingGPS(idPortSeq);
break;
case GPS_HUANING2:
ProcGPS_HuaNingGPS2(idPortSeq);
break;
case GPS_NSC20:
ProcGPS_NSC20GPS(idPortSeq);
break;
case GPS_NJZz:
ProcGPS_NJZzGPS(idPortSeq);
break;
case GPS_SDKH:
ProcGPS_SDKHGPS(idPortSeq);
break;
case GPS_BJBH:
ProcGPS_BJBHGPS(idPortSeq);
break;
case GPS_YTSX:
ProcGPS_YTSXGPS(idPortSeq);
break;
case GPS_MT6035:
ProcGPS_MT6035(idPortSeq);
break;
case GPS_YTDF:
ProcGPS_YTDFGPS(idPortSeq);
break;
case GPS_SZSH:
ProcGPS_SZSHGPS(idPortSeq);
break;
case GPS_SDZR:
ProcGPS_SDZR(idPortSeq);
break;
case GPS_NSC20_MASTER:
ProcGPS_NSC20_MASTER(idPortSeq);
break;
case GPS_NARI_HST:
ProcGPS_NARI_HST(idPortSeq);
break;
case GPS_NARI_TSS_3:
ProcGPS_NARI_TSS_3(idPortSeq);
break;
case GPS_DL1100_1:
ProcGPS_DL1100_1(idPortSeq);
break;
case GPS_TSS2000B:
ProcGPS_TSS2000B(idPortSeq);
break;
case GPS_IVT_B108:
ProcGPS_IVT_B108(idPortSeq);
break;
case GPS_IRIGB_NS332:
ProcGPS_IRIGB_NS332(idPortSeq);
break;
case GPS_YZ9000:
ProcGPS_YZ9000(idPortSeq);
break;
case GPS_0183:
ProcGPS_BJLB0183(idPortSeq);
break;
default:
PB_ChgRevBuff(idPortSeq,PB_GetRevNum(idPortSeq));
break;
}
}
}
int CGPS::GetInvXorPar(BYTE *lpBuf,int nLen)
{
int i;
BYTE ret;
ret = lpBuf[0];
for(i=0;i<nLen-1;i++)
{
ret^=lpBuf[i+1];
}
ret=~ret;
return ret;
}
BOOL CGPS::SetLocalTime(TIMESTRUCT * TimeVal)
{
if (TimeVal == NULL)
return FALSE;
g_ppProtocolTP[m_nProtocolIndex].tp = 1000;
BOOL bRet;
TIMESTRUCT sTime;
long long Time64Bit;
long DeltaDays = 10957;
time_t StartTime;
time_t timep;
//struct tm *p = NULL;
int nTimeSeq,nRet;
for(nTimeSeq=0;nTimeSeq<2;nTimeSeq++)
{
nRet = PB_GetTimerFlag(nTimeSeq);
if(nRet == 1)
{
return FALSE;
}
m_cSynTime.ClearTimer();
m_cSynTime.SetTimer(300);
PB_SetTimerFlag(2,1);
}
if(TimeVal->ubYear<3 || TimeVal->ubYear>38)
return FALSE;
if(TimeVal->ubMonth>12||TimeVal->ubMonth<1)
return FALSE;
if(TimeVal->ubDay>31||TimeVal->ubDay<1)
return FALSE;
if(TimeVal->ubHour>=24)
return FALSE;
if(TimeVal->ubMinute>=60)
return FALSE;
if(TimeVal->ubSecond>=60)
return FALSE;
if(TimeVal->uwMillSecond>=1000)
return FALSE;
sTime.ubYear = TimeVal->ubYear;
sTime.ubMonth = TimeVal->ubMonth;
sTime.ubDay = TimeVal->ubDay;
sTime.ubHour = TimeVal->ubHour;
sTime.ubMinute = TimeVal->ubMinute;
sTime.ubSecond = TimeVal->ubSecond;
PB_SetSysTime(sTime, TIME_SYNC_GPSCOMM);
/*struct timeval tv;
struct timezone tz;
time(&timep);
p=localtime(&timep);
gettimeofday(&tv,&tz);
p->tm_year = TimeVal->ubYear+2000-1900;
p->tm_mon = TimeVal->ubMonth-1;
p->tm_mday = TimeVal->ubDay;
p->tm_hour = TimeVal->ubHour;
p->tm_min = TimeVal->ubMinute;
p->tm_sec = TimeVal->ubSecond;
time_t tmp_t;
tmp_t = mktime(p);
tv.tv_sec = tmp_t;
settimeofday(&tv,&tz);*/
return bRet;
}
void CGPS::ProcGPS_HuaNingGPS(int idPortSeq)
{
char Str2[5];
TIMESTRUCT TimeVal;
BYTE lpBuf[256];
int num;
if(PB_GetRevNum(idPortSeq)>=42)
{
PB_GetRevBuff(idPortSeq,lpBuf,42,0);
//PB_SendViewDataExchange(idPortSeq,m_ptrChannel[idPortSeq].nSelDevice,0,0,lpBuf,42);
if(lpBuf[0]==0x42&&lpBuf[1]==0x4a&&lpBuf[2]==0x54&&lpBuf[3]==0x2c
&&lpBuf[10]==0x2c&&lpBuf[17]==0x2c)
{
m_Counter ++;
PB_SendViewDataExchange(idPortSeq,m_ptrChannel[idPortSeq].nSelDevice,0,0,lpBuf,42);
lpBuf[42]='\0';
m_cDevState.ClearTimer();
m_cDevState.SetTimer(1200);
//m_ptrChannel[idPortSeq].ubProSetStatus=0;
m_ptrChannel[idPortSeq].ptrStructDev[0].ubStatus=0;
Str2[0]=lpBuf[15];
Str2[1]=lpBuf[16];
Str2[2]='\0';
TimeVal.ubSecond = atoi(Str2);
Str2[0]=lpBuf[13];
Str2[1]=lpBuf[14];
Str2[2]='\0';
TimeVal.ubMinute = atoi(Str2);
Str2[0]=lpBuf[11];
Str2[1]=lpBuf[12];
Str2[2]='\0';
TimeVal.ubHour = atoi(Str2);
Str2[0]=lpBuf[4];
Str2[1]=lpBuf[5];
Str2[2]='\0';
TimeVal.ubYear = atoi(Str2);
Str2[0]=lpBuf[6];
Str2[1]=lpBuf[7];
Str2[2]='\0';
TimeVal.ubMonth = atoi(Str2);
Str2[0]=lpBuf[8];
Str2[1]=lpBuf[9];
Str2[2]='\0';
TimeVal.ubDay = atoi(Str2);
TimeVal.uwMillSecond = 200;
PB_ChgRevBuff(idPortSeq,PB_GetRevNum(idPortSeq));
if(m_Counter%10 == 0) {
if (m_nAreaOffset != 0) {
struct tm tmNow;
tmNow.tm_sec = TimeVal.ubSecond;
tmNow.tm_min = TimeVal.ubMinute;
tmNow.tm_hour = TimeVal.ubHour;
tmNow.tm_mday = TimeVal.ubDay;
tmNow.tm_mon = TimeVal.ubMonth - 1;
tmNow.tm_year = TimeVal.ubYear + 100; //ubYear基于1900年
tmNow.tm_isdst = -1;
unsigned long lSecondNowBasedOn1970 = mktime(&tmNow) + (int)m_nAreaOffset;
time_t timep = lSecondNowBasedOn1970;
struct tm* p = gmtime(&timep);
TimeVal.ubSecond = p->tm_sec;
TimeVal.ubMinute = p->tm_min;
TimeVal.ubHour = p->tm_hour;
TimeVal.ubDay = p->tm_mday;
TimeVal.ubMonth = p->tm_mon + 1;
TimeVal.ubYear = p->tm_year - 100; //ubYear基于1900年
}
PB_TelegramExplain("[GPS] SetTime: %d-%d-%d, %02d:%02d:%02d",
TimeVal.ubYear + 2000, TimeVal.ubMonth, TimeVal.ubDay, TimeVal.ubHour, TimeVal.ubMinute, TimeVal.ubSecond);
SetLocalTime(&TimeVal);
}
RepeatJs=0;
}
else
{
PB_ChgRevBuff(idPortSeq,1);
while(num = PB_GetRevNum(idPortSeq)) //added 2004-2-25
{
num = PB_GetRevBuff(idPortSeq,lpBuf,num);
if(lpBuf[0] == 0x42)
return;
PB_ChgRevBuff(idPortSeq,1);
}
}
}
}
void CGPS::ProcGPS_NSC20GPS(int idPortSeq)
{
#define NSC20GPS_BUFFER_MAX 256
g_ppProtocolTP[m_nProtocolIndex].tp = 6;
char Str2[5];
TIMESTRUCT TimeVal;
BYTE lpBuf[NSC20GPS_BUFFER_MAX];
int num;
if (idPortSeq != 0)
return;
g_ppProtocolTP[m_nProtocolIndex].tp = 7;
if ((PB_GetRevNum(idPortSeq)) >= 19)
{
g_ppProtocolTP[m_nProtocolIndex].tp = 8;
//printf("test1\n");
PB_GetRevBuff(idPortSeq, lpBuf, 19, 0);
g_ppPro