📄 busdispatch.c
字号:
Offset_UnSendGPS = num;
}
}
else
{
for(i=0;i<num-1;i++)
{
lseek(GPS_fd,i*GPS_RECORD_LEN,SEEK_SET);
retr = read(GPS_fd,tmpbuf,sizeof(tmpbuf));
if(retr<sizeof(tmpbuf))
{
printf("retr is wrong!\n");
}
if(tmpbuf[0]!=tmpbuf[GPS_RECORD_LEN])
{
if(tmpbuf[0]==0)
{
Offset_SendGPS = i + 1;
}
else
{
Offset_UnSendGPS = i + 1;
}
}
if((tmpbuf[13]*256*256*256 + tmpbuf[14]*256*256 + tmpbuf[15]*256 + tmpbuf[16])
>(tmpbuf[39]*256*256*256 + tmpbuf[40]*256*256 + tmpbuf[41]*256 + tmpbuf[42]))
{
Oldest = i + 1;
}
}
if(Offset_UnSendGPS==Offset_SendGPS)
{
Offset_SendGPS = Offset_SendGPS = Oldest;
}
}
}
int GetFileGpsInfo(char *data)
{
int retr,filesize;
char tmpbuf[10];
time_t last;
memset(data,0,25);
if(GPS_fd<=0)
return 0;
last = 0;
filesize = GetFileSize(GPSFile);
while(1)
{
if(Offset_UnSendGPS*GPS_RECORD_LEN>=filesize)
return 0;
lseek(GPS_fd,Offset_UnSendGPS*GPS_RECORD_LEN,SEEK_SET);
read(GPS_fd,tmpbuf,1);
retr = read(GPS_fd,data,25);
// printf("UnSednGps is %d!\n",Offset_UnSendGPS );
if(retr < 25)
break; //到了文件末尾,没有未发送的GPS数据
if((tmpbuf[0]!=0))
{
if(last > (data[12]*256*256*256+data[13]*256*256+data[14]*256+data[15]))
break;
else
{
last = data[12]*256*256*256+data[13]*256*256+data[14]*256+data[15];
Offset_UnSendGPS = (Offset_UnSendGPS + 1) % RECORDMAX;
continue;
}
}
printf("Find data to send!\n");
return 1;
}
printf("All GPS data is sended!\n");
return 0;
}
//发送成功的GPS信息,必然是文件中最新的一条
void GpsSendOK()
{
char ok = 1;
if(GPS_fd<=0)
return;
lseek(GPS_fd,Offset_UnSendGPS*GPS_RECORD_LEN,SEEK_SET);
write(GPS_fd,&ok,1);
Offset_UnSendGPS = (Offset_UnSendGPS + 1) % RECORDMAX;
}
//从存储的GPS历史信息文件中读出在指定时间之间的GPS位置信息,
//为信息分配响应大小的内存空间,并把找到的符合要求的历史数据的条数放在*recordnum内返回。
//函数的返回值为内存的起始地址
char *GetGpsHisData(time_t start,time_t end,int *num)
{
int tlnum,i,j;
int retr;
int recordnum;
char tmpbuf[4];
time_t recordtm;
char *buf;
recordnum = 0;
tlnum = GetFileSize(GPSFile) / GPS_RECORD_LEN; //获知当前全部GPS条目数
printf("Total tlnum is %d!\n",tlnum);
for(i=0;i<tlnum;i++)
{
lseek(GPS_fd,i*GPS_RECORD_LEN + 13,SEEK_SET);
retr = read(GPS_fd,tmpbuf,4);
recordtm = (tmpbuf[0] & 0xFF)*256*256*256 + (tmpbuf[1] & 0xFF)*256*256 + (tmpbuf[2] & 0xFF)*256+ (tmpbuf[3] & 0xFF);
if((recordtm>=start)&&(recordtm<=end)) //在时间范围内
{
recordnum++;
}
}
if(recordnum==0)
{
*num = 0;
return NULL;
}
buf = malloc(25*recordnum);
j = 0;
for(i=0;i<num;i++)
{
lseek(GPS_fd,i*GPS_RECORD_LEN + 13,SEEK_SET);
retr = read(GPS_fd,tmpbuf,4);
recordtm = (tmpbuf[0] & 0xFF)*256*256*256 + (tmpbuf[1] & 0xFF)*256*256 + (tmpbuf[2] & 0xFF)*256+ (tmpbuf[3] & 0xFF);
if((recordtm>=start)&&(recordtm<=end)) //在时间范围内
{
lseek(GPS_fd,i*GPS_RECORD_LEN + 1,SEEK_SET);
read(GPS_fd,buf+(25*j),25);
j++;
if(j==recordnum)
break;
}
}
*num = recordnum;
return buf;
}
//从文件中读取最新的客流量信息
int GetFileAPCInfo(char *data)
{
int retr,filesize;
char tmpbuf[10];
memset(data,0,35);
if(APC_fd<=0)
return 0;
filesize = GetFileSize(APCFile);
if(Offset_UnSendAPC*36>=filesize)
return 0;
lseek(APC_fd,Offset_UnSendAPC*36,SEEK_SET);
read(APC_fd,tmpbuf,1); //读取首位进行判断
retr = read(APC_fd,data,35);
// printf("UnSednGps is %d!\n",Offset_UnSendGPS );
if((tmpbuf[0]!=0)||(retr < 35)) //没有未发送的APC数据
{
printf("All APC data is sended!\n");
return 0;
}
printf("Find data to send!\n");
return 1;
}
//发送成功的APC信息,必然是文件中最新的一条,从当前读取的位置删除掉记录
void APCSendOK()
{
char ok = 1;
if(APC_fd<=0)
return;
lseek(APC_fd,Offset_UnSendAPC*APC_RECORD_LEN,SEEK_SET);
write(APC_fd,&ok,1);
Offset_UnSendAPC = (Offset_UnSendAPC + 1) % RECORDMAX;
}
//
void APCFileInit(void)
{
int num,retr;
int i;
char tmpbuf[72];
int Oldest;
Offset_UnSendAPC = 0;
Offset_SendAPC = 0;
Oldest = 0;
APC_FileSize = GetFileSize(APCFile);
if((APC_fd=open(APCFile,O_RDWR|O_CREAT))<0)
return ;
num = APC_FileSize / APC_RECORD_LEN;
MB_DEB("%s: num is %d!",__FUNCTION__,num);
if(num < RECORDMAX)
{
Offset_SendAPC = num;
for(i=0;i<num;i++)
{
read(APC_fd,tmpbuf,APC_RECORD_LEN);
if(tmpbuf[0]==0)
{
Offset_UnSendAPC = i;
break;
}
Offset_UnSendAPC = num;
}
}
else
{
for(i=0;i<num-1;i++)
{
lseek(APC_fd,i*APC_RECORD_LEN,SEEK_SET);
retr = read(APC_fd,tmpbuf,sizeof(tmpbuf));
if(retr<sizeof(tmpbuf))
{
printf("retr is wrong!\n");
}
if(tmpbuf[0]!=tmpbuf[APC_RECORD_LEN])
{
if(tmpbuf[0]==0)
{
Offset_SendAPC = i + 1;
}
else
{
Offset_UnSendAPC = i + 1;
}
}
if((tmpbuf[13]*256*256*256 + tmpbuf[14]*256*256 + tmpbuf[15]*256 + tmpbuf[16])
>(tmpbuf[39]*256*256*256 + tmpbuf[40]*256*256 + tmpbuf[41]*256 + tmpbuf[42]))
{
Oldest = i + 1;
}
}
if(Offset_UnSendAPC==Offset_SendAPC)
{
Offset_SendAPC = Offset_SendAPC = Oldest;
}
}
}
//从存储的APC历史信息文件中读出在指定时间之间的GPS位置信息,
//为信息分配响应大小的内存空间,并把找到的符合要求的历史数据的条数放在*recordnum内返回。
//函数的返回值为内存的起始地址
char *GetAPCHisData(time_t start,time_t end,int *num)
{
int tlnum,i,j;
int retr;
int recordnum;
char tmpbuf[4];
time_t recordtm;
char *buf;
recordnum = 0;
tlnum = GetFileSize(APCFile) / APC_RECORD_LEN; //获知当前全部APC条目数
printf("Total tlnum is %d!\n",tlnum);
for(i=0;i<tlnum;i++)
{
lseek(APC_fd,i*APC_RECORD_LEN + 13,SEEK_SET);
retr = read(APC_fd,tmpbuf,4);
recordtm = (tmpbuf[0] & 0xFF)*256*256*256 + (tmpbuf[1] & 0xFF)*256*256 + (tmpbuf[2] & 0xFF)*256+ (tmpbuf[3] & 0xFF);
if((recordtm>=start)&&(recordtm<=end)) //在时间范围内
{
recordnum++;
}
}
if(recordnum==0)
{
*num = 0;
return NULL;
}
buf = malloc(35*recordnum);
j=0;
for(i=0;i<num;i++)
{
lseek(APC_fd,i*APC_RECORD_LEN + 13,SEEK_SET);
retr = read(APC_fd,tmpbuf,4);
recordtm = (tmpbuf[0] & 0xFF)*256*256*256 + (tmpbuf[1] & 0xFF)*256*256 + (tmpbuf[2] & 0xFF)*256+ (tmpbuf[3] & 0xFF);
if((recordtm>=start)&&(recordtm<=end)) //在时间范围内
{
lseek(APC_fd,i*APC_RECORD_LEN + 1,SEEK_SET);
read(APC_fd,buf+(35*j),35);
j++;
if(j==recordnum)
break;
}
}
*num = recordnum;
return buf;
}
//从文件中读出最新的carstate信息
int GetFileCRInfo(char *data)
{
int retr,filesize;
char tmpbuf[10];
memset(data,0,19);
if(CR_fd<=0)
return 0;
filesize = GetFileSize(CRFile);
if(Offset_UnSendCR*CR_RECORD_LEN>=filesize)
return 0;
lseek(CR_fd,Offset_UnSendCR*CR_RECORD_LEN,SEEK_SET);
read(CR_fd,tmpbuf,1); //读取首位进行判断
retr = read(CR_fd,data,CR_RECORD_LEN-1);
// printf("UnSednGps is %d!\n",Offset_UnSendGPS );
if((tmpbuf[0]!=0)||(retr < (CR_RECORD_LEN-1))) //没有未发送的GPS数据
{
printf("All CR data is sended!\n");
return 0;
}
printf("Find data to send!\n");
return 1;
}
//发送成功的CR信息,必然是文件中最新的一条
void CRSendOK()
{
char ok = 1;
if(CR_fd<=0)
return;
lseek(CR_fd,Offset_UnSendCR*CR_RECORD_LEN,SEEK_SET);
write(CR_fd,&ok,1);
Offset_UnSendCR = (Offset_UnSendCR + 1) % RECORDMAX;
}
//
void CRFileInit(void)
{
int num,retr;
int i;
char tmpbuf[40];
int Oldest;
Offset_UnSendCR = 0;
Offset_SendCR = 0;
Oldest = 0;
CR_FileSize = GetFileSize(CRFile);
if((CR_fd=open(CRFile,O_RDWR|O_CREAT))<0)
return ;
num = CR_FileSize / CR_RECORD_LEN;
MB_DEB("%s: num is %d!",__FUNCTION__,num);
if(num < RECORDMAX)
{
Offset_SendCR = num;
for(i=0;i<num;i++)
{
read(CR_fd,tmpbuf,CR_RECORD_LEN);
if(tmpbuf[0]==0)
{
Offset_UnSendCR = i;
break;
}
Offset_UnSendCR = num;
}
}
else
{
for(i=0;i<num-1;i++)
{
lseek(CR_fd,i*CR_RECORD_LEN,SEEK_SET);
retr = read(CR_fd,tmpbuf,sizeof(tmpbuf));
if(retr<sizeof(tmpbuf))
{
printf("retr is wrong!\n");
}
if(tmpbuf[0]!=tmpbuf[CR_RECORD_LEN])
{
if(tmpbuf[0]==0)
{
Offset_SendCR = i + 1;
}
else
{
Offset_UnSendCR = i + 1;
}
}
if((tmpbuf[1]*256*256*256 + tmpbuf[2]*256*256 + tmpbuf[3]*256 + tmpbuf[4])
>(tmpbuf[21]*256*256*256 + tmpbuf[22]*256*256 + tmpbuf[23]*256 + tmpbuf[24]))
{
Oldest = i + 1;
}
}
if(Offset_UnSendCR==Offset_SendCR)
{
Offset_SendCR = Offset_SendCR = Oldest;
}
}
}
char *GetCRHisData(time_t start,time_t end,int *num)
{
int tlnum,i,j;
int retr;
int recordnum;
char tmpbuf[4];
time_t recordtm;
char *buf;
recordnum = 0;
tlnum = GetFileSize(CRFile) / CR_RECORD_LEN; //获知当前全部CR条目数
printf("Total tlnum is %d!\n",tlnum);
for(i=0;i<tlnum;i++)
{
lseek(CR_fd,i*CR_RECORD_LEN + 1,SEEK_SET);
retr = read(CR_fd,tmpbuf,4);
recordtm = (tmpbuf[0] & 0xFF)*256*256*256 + (tmpbuf[1] & 0xFF)*256*256 + (tmpbuf[2] & 0xFF)*256+ (tmpbuf[3] & 0xFF);
if((recordtm>=start)&&(recordtm<=end)) //在时间范围内
{
recordnum++;
}
}
if(recordnum==0)
{
*num = 0;
return NULL;
}
buf = malloc(CR_RECORD_LEN*recordnum); //是否发送标志可以在取出后用于填入数据标志
j=0;
for(i=0;i<num;i++)
{
lseek(CR_fd,i*CR_RECORD_LEN + 1,SEEK_SET); //定位到时间区域
retr = read(CR_fd,tmpbuf,4);
recordtm = (tmpbuf[0] & 0xFF)*256*256*256 + (tmpbuf[1] & 0xFF)*256*256 + (tmpbuf[2] & 0xFF)*256+ (tmpbuf[3] & 0xFF);
if((recordtm>=start)&&(recordtm<=end)) //在时间范围内
{
lseek(CR_fd,i*CR_RECORD_LEN ,SEEK_SET);
read(CR_fd,buf+(CR_RECORD_LEN*j),CR_RECORD_LEN);
j++;
if(j==recordnum)
break;
}
}
*num = recordnum;
return buf;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -