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

📄 navigator.c

📁 在开发FPGA上比较有用
💻 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 + -