📄 navigator.c
字号:
/**************************************************************
* 模块名称:智能型盲人导航仪
* 说明:包含智能导航仪的各个模块
*
* 备注:由NAVIGATOR 团队制作
* 安江 曹汉超 卢茜茜 冯金龙 王耀文 常玉祥 田景 郭瑞
**************************************************************/
#include <stdio.h>
#include <io.h>
#include <system.h>
#include <alt_types.h>
#include <string.h>
#include <stdlib.h>
#define PS2_TIMEOVER 100000
#define PS2_STATUS 0x02
#define PS2_DATA 0x03
#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
#include <sd_controller.h>
#define DATA_BUFF_SIZE 16384
extern sd_card_info_struct* sd_card_global;
struct gps
{
char mark[12];
char time[10];
char value;
char dim[16];
char dim_name;
char lon[15];
char lon_name;
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()
{
struct gps gps_data;
FILE * fp_scdt;
int i=0;
int j=0;
char ch;
int m=0;
int k,n;
int cont[14];
char data_in[80];
char data_out[80];
char flag[6];
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;
FILE * fp_gps;
FILE * fp;
char prompt;
char *msg="Detected the character:[a]\n";
char value=0;
// 打开串口设备文件
fp_scdt=fopen("/dev/gps_uart","r+");
ch=fgetc(fp_scdt);
while(ch!='*')
{
ch=fgetc(fp_scdt);
printf("%c",ch);
if(ch=='$')
{
value=1;
}
if(value==1)
{
// printf("%c",ch);
data_in[j]=ch;
printf("%c",data_in[j]);
j=j+1;
}
}
fclose(fp_scdt);
m=0;
n=j;
for(i=0;i<n;i++)
{
if(data_in[i]==',')
{
m=m+1;
cont[m-1]=i;
}
switch(m)
{
case 0 :
gps_data.mark[i]=data_in[i]; ///数据分包包装
break;
case 1:
gps_data.time[(i-cont[0])]=data_in[i+1];
break;
case 2:
gps_data.value=data_in[i];
break;
case 3:
gps_data.dim[(i-cont[m-1])]=data_in[i+1];
break;
case 4:
gps_data.dim_name=data_in[i];
break;
case 5:
gps_data.lon[(i-cont[m-1])]=data_in[i+1];
break;
case 6:
gps_data.lon_name=data_in[i];
break;
case 9:
gps_data.ddmmyy[(i-cont[m-1])]=data_in[i+1];
break;
}
}
printf("\n");
for(i=0;i<cont[0];i++)
printf("%c",gps_data.mark[i]);
printf("\n");
for(i=0;i<cont[1]-cont[0]-1;i++)
printf("%c",gps_data.time[i]);
printf("\n");
printf("%c",gps_data.value);
printf("\n");
for(i=0;i<cont[3]-cont[2]-1;i++)
printf("%c",gps_data.dim[i]);
printf("\n");
printf("%c\n",gps_data.dim_name);
for(i=0;i<cont[5]-cont[4]-1;i++)
printf("%c",gps_data.lon[i]);
printf("\n");
printf("%c",gps_data.lon_name);
printf("\n");
for(i=0;i<cont[9]-cont[8]-1;i++)
printf("%c",gps_data.ddmmyy[i]);
printf("\n");
return 0;
}
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()
{
return 0;
}
/*******************************************************
* 函数名称: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:ZN daohang");
fprintf(fp_lcd,"0:ZHU menu");
fprintf(fp_lcd,"4:DQ menu");
printf(".................................\n");
printf(" 请按照语音进行操作\n");
printf("正在初始化........................\n");
printf("\t1:当前位置查询\n");
printf("\t2:进入智能导航\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': gps_module_chuli(); break;
// case '2': break;
// case '3': break;
// case '4': break;
default : printf("输入错误!请重新输入..................\n"); break;
}
}
fclose(fp_lcd);
}
return 0;
}
/**************************************************
* 函数名称:send_sos_message
* 参数:没有输入参数,输出到PC机上的急救信号
* 功能:实现给家里面传输急救信号
* g
*************************************************/
int send_sos_message()
{
FILE* fp_gps;
char* msg="我遇到了困难,请带我回家!";
fp_gps=fopen("/dev/scdt_uart", "r+");
if(fp_gps)
{
fwrite(msg,strlen(msg),1,fp_gps);
fclose(fp_gps);
}
return 0;
}
int putongmoshi()
{
FILE * fp_scdt;
FILE * fp_gps;
int iRet;
alt_u16 status,data;
alt_u8 key;
printf("进入了一般模式\n");
printf("0:返回主菜单");
iRet=init_ps2(FREEDEV_PS2_INST_BASE);
iRet=read_ascii(&key);
fp_scdt=fopen("/dev/scdt_uart","r+");
fp_gps=fopen("/dev/gps_uart","r+");
while (key!='0')
{
printf("0:返回主菜单\n");
fputc(fgetc(fp_gps),fp_scdt);
printf("%c",fgetc(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,"follow guid!....\n");
fprintf(fp_lcd,".1.gps guid.\n");
fprintf(fp_lcd,".2.sos message.\n");
printf("选择1号键进入GPS导航\n");
printf("选择2号键进入急救信息发送\n");
printf("选择3号键进入普通模式\n");
printf("请选择..............\n");
iRet=init_ps2(FREEDEV_PS2_INST_BASE);
iRet=read_ascii(&key);
printf("%c\n",key);
return (key);
}
/******************************************
* 函数名称:数组转字符串
* 参数:输入为数组,输出为相应的字符串
*
*
* ***************************************/
int main()
{
/***************************sd卡的变量*************************/
int i=0,j=0;
int ret_code = 0;
alt_u8* data_buffer;
alt_u8 filelist_buffer[500];
alt_u8 infile_path[100];
alt_u8 outfile_path[100];
alt_u8 filename[100];
int volumes_mounted;
int fat_file_handle_1, fat_file_handle_2; // FAT file句柄
volatile int time_at_start, time_at_finish, total_read_time, total_write_time;
int kbytes_per_second_read, kbytes_per_second_write; ///读取和写入的速率
int offset, num_files, bytes_read;
int filesize = -1;
int fd;
char cc;
int sd;
/*****************************lcd 的变量**************************/
FILE *fp_lcd;
IOWR(LCD_ON_BASE, 0x00,0x01);
IOWR(LCD_BLON_BASE,0x00,0x01);
fp_lcd=fopen(LCD_16702_0_NAME,"w");
/**********************键盘的变量***************************/
alt_u8 k;
/**************************地图信息***************************/
char ditu_w[5];
char ditu_j[5];
char ditu_v[9];
FILE * fp_sd_w;
FILE * fp_sd_j;
FILE * fp_sd_v;
int m;
int value=0;
char linshi[10];
int send_sos_message();
/***********************************初始化********************************/
printf( "欢迎使用智能型盲人导航仪!\n");
printf( "正在初始化中.................\n" );
printf( "将sd卡中的数据读入到数据区...........\n" );
fprintf(fp_lcd,"Loading.........\n");
// Initialize and mount the filesystem.
volumes_mounted = sd_fat_mount_all();
if( volumes_mounted <= 0 )
{
ret_code = -1;
printf( "不能够链接到Sd卡\n" );
//printf( " error code: 0x%X\n", sd_card_global->error_code );
//printf( " num SD Card init tries: %d\n", sd_card_global->init_tries );
}
else
{
// 读文件测试
fd= open("/dev/sd_controller_inst/Input_Files/w.txt",O_RDONLY);
fp_sd_w= open("/dev/sd_controller_inst/Input_Files/w.txt","r");
if(fp_sd_w<0)
{
printf( "open file %s error\n" , SD_CONTROLLER_INST_NAME );
return 0;
}
i=0;
do{
sd=read(fp_sd_w,&cc,1);
if(sd==1)
{
if(cc!='.')
{
if(cc!=',')
{
ditu_w[i]=cc;
// printf("%c",ditu_w[i]);
i=i+1;
}
}
}
else break;
}while(1);
close(fp_sd_w);
for(i=0;i<5;i++)
{
printf("%c",ditu_w[i]);
}
fp_sd_j= open("/dev/sd_controller_inst/Input_Files/j.txt",O_RDONLY);
if(fp_sd_j<0)
{
printf( "open file %s error\n" , SD_CONTROLLER_INST_NAME );
return 0;
}
i=0;
do{
sd=read(fp_sd_j,&cc,1);
if(sd==1)
{
if(cc!='.')
{
if(cc!=',')
{
linshi[i]=cc;
i=i+1;
}
}
}
else break;
}while(1);
for(i=0;i<5;i++)
{
printf("%c",ditu_j[i]);
}
printf("\n");
close(fp_sd_j);
fp_sd_v= open("/dev/sd_controller_inst/Input_Files/v.txt",O_RDONLY);
if(fp_sd_v<0)
{
printf( "open file %s error\n" , SD_CONTROLLER_INST_NAME );
return 0;
}
do{
sd=read(fp_sd_v,&cc,1);
i=0;
if(sd==1)
{
if(cc!='.')
{
if(cc!=',')
{
ditu_v[i]=cc;
// printf("%c",cc);
}
}
}
else break;
}while(1);
close(fp_sd_v);
value=1;
}
printf("\n初始化成功!\n");
while(value)
{
k=menu();
switch (k)
{
case '1' : gps_module_menu() ; break ;
case '2' : send_sos_message(); break ;
case '3' : putongmoshi(); break;
default : printf("\n输入错误,请重新输入!");
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -