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

📄 busdispatch.c

📁 基于嵌入式linux下
💻 C
📖 第 1 页 / 共 3 页
字号:
			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 + -