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

📄 gps_collect.c

📁 通过车载终端采集GPS数据
💻 C
字号:
#include "gps_collect.h"
#include "菜单.h"
#include "keyboard.h"
#include "string.h"
#include "nf_drv.h"
#include "16c554.h"
#include "stdio.h"
GPS_LINE_INFO gps_8line[8];//
//0:主界面;1:菜单界面;11:线路选择界面;13:删除信息;14:上传至电脑
unsigned char cur_menu_status;
unsigned char gps_receive_flg;
unsigned char cur_line;
unsigned char cur_direction;
unsigned char tmp_line;
unsigned char tmp_direction;
unsigned char sysinfo[100];
unsigned char gps_str[80];

extern void delayMs(unsigned int timeMs);
unsigned char gps_data_buf[256];
/*保存gps数据,每一页的前半页前240个字节保存3条,
后半页的前240个字节保存3条*/
void savegpstoflash(void)
{
	Uint32 pos,page;
	Uint16 add;
	if(cur_direction==24)
	{  //上行时采集计算存储地址
		page=(gps_8line[cur_line].gps_counter_up-1)/3;
		add= ((gps_8line[cur_line].gps_counter_up-1)%3)*80;
		pos= page*256+cur_line*0x00100000+0x00200000+add;
	}
	else if(cur_direction==25)
	{	//下行时采集计算存储地址
		page=(gps_8line[cur_line].gps_counter_down-1)/3;
		add= ((gps_8line[cur_line].gps_counter_down-1)%3)*80;
		pos= page*256+cur_line*0x00100000+0x00280000+add;
	}
	if(page==1000)
	{	//每页6条,共6000条,满后停止
	 	gps_receive_flg=0;
		return;	
	}
	nf_wp_off();	 //打开写保护,再保存,+1是为了最后多保存一个0作结束符
	nf_write_onebuf(pos,gps_str,strlen(gps_str)+1);
	nf_wp_on();
	 //由于保存的个数加1,所以把线路参数保存一下下
	sysinfo[8*sizeof(GPS_LINE_INFO)]=cur_line;
	sysinfo[8*sizeof(GPS_LINE_INFO)+1]=cur_direction;
	memcpy(sysinfo,&gps_8line[0],8*sizeof(GPS_LINE_INFO));
	nf_wp_off();	 //打开写保护,再保存,+1是为了最后多保存一个0作结束符
	nf_write_onebuf(0x00000000,sysinfo,8*sizeof(GPS_LINE_INFO)+2);
	nf_wp_on();

}
/*
  只在保存线路参数时用
  地址是0x00000000的前98个字节
  每次都块擦除,再全部重写


void savetoflash(Uint32 pos, Byte* pBuf, Uint16 nLen)
{
	nf_wp_off();
	nf_block_erase(pos);
	nf_check_status();
	nf_write_onebuf_withouterase(pos,pBuf,nLen);
	nf_wp_on();
	 
}*/
/*
  线路参数初始化
  从5608中读取98个字节

*/
void sysinit(void)
{
	nf_read_tobuf(0x00000000,sysinfo,8*sizeof(GPS_LINE_INFO)+2);
	memcpy(&gps_8line[0],sysinfo,8*sizeof(GPS_LINE_INFO));
	cur_line=sysinfo[8*sizeof(GPS_LINE_INFO)];
	cur_direction=sysinfo[8*sizeof(GPS_LINE_INFO)+1];
	gps_receive_flg=0;
}
/*
  在上下行选择界面下的操作
  操作完成后保存操作结果
  功能包括设置上下行,删除某条线路的上行或下行参数

*/
void process_direction(void)
{
	unsigned char key;
	menu_direction();	   //显示上下行选择界面
 	tmp_direction=0xff;
	while(1)
	{
		key=  get_key();
		switch(key)
		{
			case KEY_CODE_NUM1:
				tmp_direction=24;
				menu_display_char(0,1,'1',1);
			break;
			case KEY_CODE_NUM2:
				tmp_direction=25;
				menu_display_char(0,2,'2',1);
			break;

			case KEY_CODE_ESC:
				return;
			break;

			case KEY_CODE_ENTER:
				if(	cur_menu_status==11&&tmp_direction!=0xff)
				{
			   		cur_line=tmp_line;
					cur_direction=tmp_direction;
					sysinfo[8*sizeof(GPS_LINE_INFO)]=cur_line;
					sysinfo[8*sizeof(GPS_LINE_INFO)+1]=cur_direction;
					memcpy(sysinfo,&gps_8line[0],8*sizeof(GPS_LINE_INFO));
					nf_wp_off();	 //打开写保护,再保存,+1是为了最后多保存一个0作结束符
					nf_write_onebuf(0x00000000,sysinfo,8*sizeof(GPS_LINE_INFO)+2);
					nf_wp_on();
				}
				else if(cur_menu_status==13&&tmp_direction!=0xff)
				{
					if(tmp_direction==24)
					{
						gps_8line[tmp_line].gps_counter_up=0;
						gps_8line[tmp_line].station_counter_up=0;
						gps_8line[tmp_line].corner_counter_up=0;
					}
					else if(tmp_direction==25)
					{
						gps_8line[tmp_line].gps_counter_down=0;
						gps_8line[tmp_line].station_counter_down=0;
						gps_8line[tmp_line].corner_counter_down=0;
					}
					sysinfo[8*sizeof(GPS_LINE_INFO)]=cur_line;
					sysinfo[8*sizeof(GPS_LINE_INFO)+1]=cur_direction;
					memcpy(sysinfo,&gps_8line[0],8*sizeof(GPS_LINE_INFO));
					nf_wp_off();	 //打开写保护,再保存,+1是为了最后多保存一个0作结束符
					nf_write_onebuf(0x00000000,sysinfo,8*sizeof(GPS_LINE_INFO)+2);
					nf_wp_on();
					//保存这个结构体
				}

				return;
			break;

			default:
			
			break;
		}
	}
}
/*
  设置线路名
  即输入线路号,再保存

*/
void process_inputline(void)
{
	unsigned char index=0,key,linename[4];
	menu_inputline();
	while(1)
	{
	 	key=  get_key();
		switch(key)
		{
			case KEY_CODE_NUM0:
				key=0;	
			case KEY_CODE_NUM1:
			case KEY_CODE_NUM2:
			case KEY_CODE_NUM3:
			case KEY_CODE_NUM4:
			case KEY_CODE_NUM5:
			case KEY_CODE_NUM6:
			case KEY_CODE_NUM7:
			case KEY_CODE_NUM8:
			case KEY_CODE_NUM9:
				if(index>=4)break;
				menu_display_char(index+5,1,key+'0',0);
				linename[index]=key+'0';
				index++;
			break;
				
			case KEY_CODE_ESC:
				if(index==0)
				{
					return;
				}
				else
				{
					index--;
					menu_display_char(index+5,1,'-',0);
				}
			break;

			case KEY_CODE_ENTER:
				if(index<4) break;
				memcpy(gps_8line[tmp_line].linename,linename,4);
					sysinfo[8*sizeof(GPS_LINE_INFO)]=cur_line;
					sysinfo[8*sizeof(GPS_LINE_INFO)+1]=cur_direction;
					memcpy(sysinfo,&gps_8line[0],8*sizeof(GPS_LINE_INFO));
					nf_wp_off();	 //打开写保护,再保存,+1是为了最后多保存一个0作结束符
					nf_write_onebuf(0x00000000,sysinfo,8*sizeof(GPS_LINE_INFO)+2);
					nf_wp_on();
 
				return;
			break;

			default:
			
			break;
		}
	}
}
/*
上传GPS数据函数
 读取存储器中的GPS数据,并发到串口B通道上
 上传过程中可以通过按取消键退出
 上传完也要按取消键才能退出
*/

void process_upgps(void)
{
	unsigned char up[6]="上行";
	unsigned char down[6]="下行";

	Uint32 pos,page;
	Uint16 tem;
	Byte i;
	Byte *pp;
	up[4]=down[4]='\r';
	up[5]=down[5]='\n';
	menu_up_gps_record();
	nf_read_tobuf(0x00000000,sysinfo,8*sizeof(GPS_LINE_INFO));
	memcpy(&gps_8line[0],sysinfo,8*sizeof(GPS_LINE_INFO));
	page=0;
	tem= gps_8line[tmp_line].gps_counter_up;
	menu_display_char(11,0,tem/1000+'0',0);
	menu_display_char(12,0,tem/100%10+'0',0);
	menu_display_char(13,0,tem/10%10+'0',0);
	menu_display_char(14,0,tem%10+'0',0);
	if(tem)
		siob_send(up, 6);
	while(tem)
	{
		pos= page*256+tmp_line*0x00100000+0x00200000;
		nf_read_tobuf(pos,gps_data_buf,240);
		i=0;
		while(i<3)
		{
			menu_display_char(6,0,tem/1000+'0',0);
			menu_display_char(7,0,tem/100%10+'0',0);
			menu_display_char(8,0,tem/10%10+'0',0);
			menu_display_char(9,0,tem%10+'0',0);
			if(get_key()==KEY_CODE_ESC) return;
			if(tem)
        	{
    			pp=gps_data_buf+i*80;
    			siob_send(pp, strlen(pp));
			}
			else break;
			tem--;
			i++;
		}

		page++;

	}
	page=0;
	tem= gps_8line[tmp_line].gps_counter_down;
	menu_display_char(11,1,tem/1000+'0',0);
	menu_display_char(12,1,tem/100%10+'0',0);
	menu_display_char(13,1,tem/10%10+'0',0);
	menu_display_char(14,1,tem%10+'0',0);
	if(tem)
		siob_send(down, 6);
	while(tem)
	{
		pos= page*256+tmp_line*0x00100000+0x00280000;
		nf_read_tobuf(pos,gps_data_buf,240);
		i=0;
		while(i<3)
		{
			menu_display_char(6,1,tem/1000+'0',0);
			menu_display_char(7,1,tem/100%10+'0',0);
			menu_display_char(8,1,tem/10%10+'0',0);
			menu_display_char(9,1,tem%10+'0',0);
			if(get_key()==KEY_CODE_ESC) return;
			if(tem)
        	{
    			pp=gps_data_buf+i*80;
    			siob_send(pp, strlen(pp));
			}
			else break;
			tem--;
			i++;
		}

		page++;

	}
	menu_process_over();
	while(get_key()!=KEY_CODE_ESC);

}
/*
  线路选择处理函数

*/
void process_line(void)
{
	unsigned char key;
	tmp_line=0xff;
	menu_line();	//显示线路选择界面
	while(1)
	{
	 	key=get_key();
		switch(key)
		{
			//按对应数字键,反显数字,并记下线路序号.
			case KEY_CODE_NUM1:
			case KEY_CODE_NUM2:
			case KEY_CODE_NUM3:
			case KEY_CODE_NUM4:
			case KEY_CODE_NUM5:
			case KEY_CODE_NUM6:
			case KEY_CODE_NUM7:
			case KEY_CODE_NUM8:
				menu_line();	//显示线路选择界面
				if(key<5)
				 	menu_display_char(0,key-1,key+'0',1);
				else  
					menu_display_char(8,key-5,key+'0',1);
				tmp_line=key-1;
			break;

			case KEY_CODE_ESC:
				return;
			break;

			case KEY_CODE_ENTER:
				if(tmp_line>7) return;  
				if(	cur_menu_status==11)
				{
					process_direction();	   //显示上下行选择界面
				}
				else if(cur_menu_status==13)
				{
					process_direction();	   //显示上下行选择界面
				}
				else if(cur_menu_status==14)
				{
					process_upgps();
					

				}
				menu_line();	//显示线路选择界面
				tmp_line=0xff; 
			break;

			case KEY_CODE_FUNC:
				if(tmp_line>7)break;  
				if(	cur_menu_status==11)
				{
				   	process_inputline();
				   	menu_line();	 //显示菜单界面
					tmp_line=0xff; 
				}
			break;
			default:
			
			break;
		}

	}
}
//main函数调用,显示菜单界面,按1,2,3,4键有效,按取消或确定键退出
void main_process(void)
{
	unsigned char key;
	menu_fun();	 //显示菜单界面
	while(1)
	{
	 	key=get_key();
		switch(key)
		{
			case KEY_CODE_NUM1:
				cur_menu_status=11;
				process_line();		//线路选择处理函数
				menu_fun();	 //显示菜单界面
				cur_menu_status=1;
			break;
			case KEY_CODE_NUM2:
			//	if(gps_8line[cur_line].gps_counter_up==6000)
				gps_receive_flg=!gps_receive_flg;
				menu_fun();	 //显示菜单界面
			break;
			case KEY_CODE_NUM3:
				cur_menu_status=13;
				process_line();		//线路选择处理函数
				menu_fun();	 //显示菜单界面
				cur_menu_status=1;
			
			break;
			case KEY_CODE_NUM4:
				cur_menu_status=14;
				process_line();		//线路选择处理函数
				menu_fun();	 //显示菜单界面
				cur_menu_status=1;
			
			break;

			case KEY_CODE_ESC:
			case KEY_CODE_ENTER:
				return;
			break;

			default:
			
			break;
		}

	}
}

⌨️ 快捷键说明

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