📄 gps_collect.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 + -