📄 f0b7f5f56761001d168eb4690aa46264
字号:
/**************************************************************
* 函数说明:智能型盲人导航仪
*
*
*
* 备注:由NAVIGATOR 团队制作
* 安江 曹汉超 卢茜茜 冯金龙 王耀文 常玉祥 田景 郭瑞
**************************************************************/
#include <stdio.h>
#include <io.h>
#include <system.h>
#include <alt_types.h>
#include <string.h>
#include <stdlib.h>
// 读取键盘状态或数据超时次数
#define PS2_TIMEOVER 100000
// FreeDev PS2寄存器 OFFSET
#define PS2_STATUS 0x02
#define PS2_DATA 0x03
// FreeDev PS2状态位
#define PS2_NOACK 0x0001
#define PS2_TX_WRITE_ACK 0x0002
#define PS2_RX_DATA_READY 0x04
#define PS2_SHIFT_KEY_ON 0x08
#define PS2_RX_RELEASED 0x10
#define PS2_RX_EXTENDED 0x20
struct gps
{
char mark[12];
char time[10];
char value;
char dim[16];
char lon[15];
char ddmmyy[6];
};
void *gPS2Base;
int wait_rx_ready(int count,alt_u16 *pStatus)
{
int iRet;
alt_u16 status,data;
int i;
if(count==0)
{
do{
status=IORD(gPS2Base,PS2_STATUS);
}while(!(status & PS2_RX_DATA_READY));
*pStatus=status;
return 0;
}else
{
for(i=0;i<count;i++)
{
status=IORD(gPS2Base,PS2_STATUS);
if(status & PS2_RX_DATA_READY)
{
*pStatus=status;
return 0;
}
}
return -1;
}
return -1;
}
int read_scan_code(alt_u8 *scan_code)
{
int iRet,i;
alt_u16 status,data;
if(wait_rx_ready(0,&status)<0)
return -1;
data=IORD(gPS2Base,PS2_DATA);
*scan_code = (data & 0xff00)>>8;
return 0;
}
int read_ascii(alt_u8 *code)
{
int iRet;
alt_u16 status,data;
// 读键盘断码
while(1)
{
if(wait_rx_ready(0,&status)<0)
return -1;
if((status & PS2_RX_RELEASED))
break;
// 读通码
data=IORD(gPS2Base,PS2_DATA);
}
// 读断码数据
data=IORD(gPS2Base,PS2_DATA);
*code = data & 0x00ff;
return 0;
}
int init_ps2(void *base_addr)
{
int iRet;
unsigned char i;
alt_u16 status,data;
alt_u8 key;
gPS2Base=base_addr;
IOWR(FREEDEV_PS2_INST_BASE,PS2_DATA,0xFF);
// printf("reset keyboard......\n");
while(1)
{
iRet=read_scan_code(&key);
if(iRet<0)
{
printf("读取键盘自测试字节错误");
return -1;
}
if(key==0xfa)
continue;
else if(key!=0xaa)
IOWR(gPS2Base,PS2_DATA,0xFF);
else
break;
}
// printf("reset keyboard OK!!\n");
return 0;
}
/***************************************************************************
模块划分:以下属于gps 信息处理模块
负责人:郭瑞
***************************************************************************/
/**************************************************************
* 函数名称:gps_module_datachuli()
* 说明:接受GPS信号,查询当前所处地段;
* 参数:gps接收到的经纬度值,返回为该地的值
* 备注:navigator团队
* 负责人;郭瑞
************************************************************/
int gps_module_chuli()
{
FILE * fp_scdt;
char ch;
char data_in[80];
char sh="1234";
int i;
int j;
int m=0;
int n=0;
int cont[15];
int ditu_w[5]={1,2,3,4,5};
int ditu_j[5]={6,7,8,9,10};
int ditu_add[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
int v=0;
struct gps gps_data;
FILE * fp_gps;
if(fp_scdt=fopen("/dev/scdt_uart","r")==NULL)
{
printf("不能够链接到GPS!");
}
gps_data.dim[0]=4;
gps_data.lon[0]=8;
gps_data.value='A';
if(gps_data.value!='A')
{
printf("不能正常定位!");
}
else
{
ch=fgetc(fp_scdt);
printf("%c",ch);
for(i=0;i<5;i++)
{
if(gps_data.dim[0]==ditu_w[i])
{
m=i;
printf("m=....%d",m);
for(j=0;j<5;j++)
{
if(gps_data.lon[0]==ditu_j[j])
{
n=j;
printf("n=......%d",n);
v=1;
}
}
}
}
}
return ditu_add[m][n];
}
int gps_module_search()
{
int gps_module_chili();
int a=gps_module_chuli();
printf("目前您处的位置为%d",a);
return '4';
}
/******************************************************
* 函数名称:gps_module_inguid
* 说明:智能导航
* 参数:输入为当前位置,输出为导航路径
* 备注:navigator团队
* 负责人:郭瑞
******************************************************/
int gps_module_inguid()
{
}
/*******************************************************
* 函数名称:gps_module_menu()
* 说明:GPS各功能的选择
* 参数:键盘输入,调用各个模块
* 备注:navigatour团队
* 负责人:郭瑞
********************************************************/
int gps_module_menu()
{
int iRet;
int gps_module_search();
alt_u16 status,data;
alt_u8 key;
while(key!='0')
{
FILE * fp_lcd;
fp_lcd=fopen(LCD_16702_0_NAME,"w");
fprintf(fp_lcd,"follow voice\n ");
fprintf(fp_lcd,"1:DQ chaxun");
fprintf(fp_lcd,"2:MB chaxun");
fprintf(fp_lcd,"3:ZN daohang");
fprintf(fp_lcd,"0:ZHU menu");
fprintf(fp_lcd,"4:DQ menu");
printf(".........................................\n");
printf("请按照语音进行操作\n");
printf("正在初始化........................\n");
printf("\t1:当前位置查询\t2:目标地查询\n");
printf("\t3:进入智能导航\t0:返回主目录\n");
printf("\t其他任意键返回当前菜单\n");
printf("请输入你的操作\n");
iRet=init_ps2(FREEDEV_PS2_INST_BASE);
iRet=read_ascii(&key);
printf("%c\n",key);
if (key<='4')
{
switch(key)
{
case '1': key=gps_module_search(); break;
// case '2': break;
// case '3': break;
// case '4': break;
default : printf("输入错误!请重新输入..................\n"); break;
}
}
fclose(fp_lcd);
}
return 0;
}
int sos()
{
FILE* fp_gps;
char* msg="mean danger";
fp_gps=fopen("/dev/scdt_uart", "r+");
if(fp_gps)
{
fwrite(msg,strlen(msg),fp_gps);
fclose(fp_gps);
}
return 0;
}
int menu()
{
FILE *fp_lcd;
fp_lcd=fopen(LCD_16702_0_NAME,"w");
int iRet;
alt_u16 status,data;
alt_u8 key;
// fprintf(fp_lcd,"................\n");
fprintf(fp_lcd,"= 汉 =\n");
// fprintf(fp_lcd,"................\n");
fprintf(fp_lcd,"follow guid!....\n");
fprintf(fp_lcd,"汉\n");
fprintf(fp_lcd,".2.sos message.\n");
printf("选择一号键进入GPS导航\n");
printf("选择二号键进入急救信息发送\n");
printf("没有选择,进入普通模式\n");
printf("请选择..............\n");
iRet=init_ps2(FREEDEV_PS2_INST_BASE);
iRet=read_ascii(&key);
printf("%c\n",key);
return (key);
}
int main()
{
FILE *fp_lcd;
IOWR(LCD_ON_BASE, 0x00,0x01);
IOWR(LCD_BLON_BASE,0x00,0x01);
int sos();
alt_u8 k;
while (1)
{
k=menu();
switch (k)
{
case '1' : gps_module_menu() ; break ;
case '2' : sos(); break ;
// case '3' : mangdaoshibie();break;
default : printf("输入错误,请重新输入!");
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -