?? navigator.c
字號:
/**************************************************************
* 模塊名稱:智能型盲人導(dǎo)航儀
* 說明:包含智能導(dǎo)航儀的各個(gè)模塊
*
* 備注:由NAVIGATOR 團(tuán)隊(duì)制作
* 安江 曹漢超 盧茜茜 馮金龍 王耀文 常玉祥 田景 郭瑞
**************************************************************/
#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);
}
// 讀斷碼數(shù)據(jù)
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("讀取鍵盤自測試字節(jié)錯(cuò)誤");
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 信息處理模塊
負(fù)責(zé)人:郭瑞
***************************************************************************/
/**************************************************************
* 函數(shù)名稱:gps_module_datachuli()
* 說明:接受GPS信號,查詢當(dāng)前所處地段;
* 參數(shù):gps接收到的經(jīng)緯度值,返回為該地的值
* 備注:navigator團(tuán)隊(duì)
* 負(fù)責(zé)人;郭瑞
************************************************************/
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;
// 打開串口設(shè)備文件
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]; ///數(shù)據(jù)分包包裝
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';
}
/******************************************************
* 函數(shù)名稱:gps_module_inguid
* 說明:智能導(dǎo)航
* 參數(shù):輸入為當(dāng)前位置,輸出為導(dǎo)航路徑
* 備注:navigator團(tuán)隊(duì)
* 負(fù)責(zé)人:郭瑞
******************************************************/
int gps_module_inguid()
{
return 0;
}
/*******************************************************
* 函數(shù)名稱:gps_module_menu()
* 說明:GPS各功能的選擇
* 參數(shù):鍵盤輸入,調(diào)用各個(gè)模塊
* 備注:navigatour團(tuán)隊(duì)
* 負(fù)責(zé)人:郭瑞
********************************************************/
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(" 請按照語音進(jìn)行操作\n");
printf("正在初始化........................\n");
printf("\t1:當(dāng)前位置查詢\n");
printf("\t2:進(jìn)入智能導(dǎo)航\t0:返回主目錄\n");
printf("\t其他任意鍵返回當(dāng)前菜單\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("輸入錯(cuò)誤!請重新輸入..................\n"); break;
}
}
fclose(fp_lcd);
}
return 0;
}
/**************************************************
* 函數(shù)名稱:send_sos_message
* 參數(shù):沒有輸入?yún)?shù),輸出到PC機(jī)上的急救信號
* 功能:實(shí)現(xiàn)給家里面?zhèn)鬏敿本刃盘? * 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("進(jìn)入了一般模式\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號鍵進(jìn)入GPS導(dǎo)航\n");
printf("選擇2號鍵進(jìn)入急救信息發(fā)送\n");
printf("選擇3號鍵進(jìn)入普通模式\n");
printf("請選擇..............\n");
iRet=init_ps2(FREEDEV_PS2_INST_BASE);
iRet=read_ascii(&key);
printf("%c\n",key);
return (key);
}
/******************************************
* 函數(shù)名稱:數(shù)組轉(zhuǎn)字符串
* 參數(shù):輸入為數(shù)組,輸出為相應(yīng)的字符串
*
*
* ***************************************/
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( "歡迎使用智能型盲人導(dǎo)航儀!\n");
printf( "正在初始化中.................\n" );
printf( "將sd卡中的數(shù)據(jù)讀入到數(shù)據(jù)區(qū)...........\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輸入錯(cuò)誤,請重新輸入!");
}
}
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -