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

📄 ogsgar2rnx.c

📁 OpenGPSSim是一个gps模拟程序
💻 C
📖 第 1 页 / 共 2 页
字号:
  default:     ptr+=sprintf( ptr, ", page %2d       ", page);     break;  }   if ( sf_id == 4)  {    switch(page)    {    case 0:        ptr+=sprintf( ptr, "Dummy sat (no data)\n");       break;    case 1:        ptr+=sprintf( ptr, "Reserved\n");       break;    case 12:       ptr+=sprintf( ptr, "Reserved\n");      break;    case 13:#if 0      av=extract_bits(57,2);      switch(av)      {      case 0:         strcpy( av_message, "Available");         break;      case 1:         strcpy( av_message, "Encrypted");         break;      case 2:         strcpy( av_message, "Not available");         break;      case 3:         strcpy( av_message, "?????");         break;      }       ptr+=sprintf(ptr,"NMCT : %s\n",av_message);#endif      ptr+=sprintf( ptr, "NMCT\n");      break;    case 14:     case 15:       ptr+=sprintf( ptr, "Spare\n");      break;    case 17:       ptr+=sprintf( ptr, "ASCII messages\n");      break;    case 18:       ptr+=sprintf( ptr, "Iono parameters\n"); break;    case 19:     case 20:     case 22:     case 23:       ptr+=sprintf( ptr, "Reserved\n");      break;    case 25:       ptr+=sprintf( ptr, "Sat Config\n");       break;    default:      if ((sv_id>=25) && (sv_id<=32))         ptr+=sprintf( ptr, "Almanac (sat %d)\n", sv_id);      else         ptr+=sprintf( ptr, "Other function\n");      break;         }  }  else  {    switch(page)    {     case 0:         ptr+=sprintf( ptr, "Dummy sat (no data)\n");        break;     case -1:        ptr+=sprintf( ptr, "\n");        break;     case 25:        ptr+=sprintf( ptr, "Sat 1-24 health data\n");        break;     default:        ptr+=sprintf( ptr, "Almanac (sat %d)\n",sv_id);       break;    }  }  return fail;  }static void process_frame( ULONG nfr){  BOOLEAN fail;  BYTE sf_id;  char info[256];  fail = info_frame( nfr, info);   if ( fail)     printf(" ERROR:");   printf( "%s", info);   return;}#define MASK_DATA   0x3fffffc0#define MASK_PARITY 0x0000003f////  calc parity bits//static BOOLEAN parity( BYTE *ptr){  BYTE P,T;//  dest = (BYTE*)&NAV_WORD;  memcpy( (void*)&NAV_WORD, (void*)ptr, 4);  if ( P30)     NAV_WORD ^= MASK_DATA;  // source bits complement    P = (BYTE)(P29^d1^d2^d3^d5^d6^d10^d11^d12^d13^d14^d17^d18^d20^d23);  P = (P<<1) + (BYTE)(P30^d2^d3^d4^d6^d7^d11^d12^d13^d14^d15^d18^d19^d21^d24);  P = (P<<1) + (BYTE)(P29^d1^d3^d4^d5^d7^d8^d12^d13^d14^d15^d16^d19^d20^d22);  P = (P<<1) + (BYTE)(P30^d2^d4^d5^d6^d8^d9^d13^d14^d15^d16^d17^d20^d21^d23);  P = (P<<1) + (BYTE)(P30^d1^d3^d5^d6^d7^d9^d10^d14^d15^d16^d17^d18^d21^d22^d24);  P = (P<<1) + (BYTE)(P29^d3^d5^d6^d8^d9^d10^d11^d13^d15^d19^d22^d23^d24);     T = (BYTE)(NAV_WORD&MASK_PARITY);  return (P==T);}                          int copy_to_navbuf( FILE *fd, int sel_sv, char *buf,   long *c50_ptr, int *svprnlist){  int j, k, sfid, nof;  static BOOLEAN par, all_par = 1;  static BYTE record[RECLEN], id, len;  static type_rec0x36 rec;  static ULONG nsf, word,   // GPS word (0,...,9 !)               current_frame[32];  static long last_word = -1;  static int outputnavbits = 0;    int bufpos = 0, loop = 1;  static int first = 1;  if ( first)  {      first = 0;    if ( !ListOnlyPRN)    {      printf( "-------------------------------------------------------------------------\n");      printf( "     ***** Tracking navigation message from PRN %2d *****\n",sel_sv+1);      printf( "-------------------------------------------------------------------------\n");      printf( "Subframe HOW  Words in SF  Parity/Subframe ID/page      Contents\n");      printf( "-------------------------------------------------------------------------\n");    }       for ( k=0; k<32; k++)     {      reset_frame( k);       current_frame[k] = 0xffffffff;    }  }  while ( !feof( fd) && loop)  {//  read records from data file    fread( &id, 1, 1, fd);     fread( &len, 1, 1, fd);     if ( len > RECLEN)    {      printf( "inkonsistent data file\n");      printf( "id = 0x%x, len = %d\n", id, len);      exit(-1);    }    fread( record, 1, len, fd);        if ( id == 0x36)    {      rec = process_0x36( record);  #if 0      printf("rec.uk[0] = %x\n", rec.uk[0]);      printf("rec.uk[1] = %x\n", rec.uk[1]);      printf("rec.uk[2] = %x\n", rec.uk[2]);      printf("rec.uk[3] = %x\n", rec.uk[3]);      printf("rec.sv    = %d\n", rec.sv);      printf("rec.c50   = %d\n", rec.c50);      getchar();#endif      CurSat = rec.sv;      if ( svprnlist)        svprnlist[CurSat+1] += 1;      if ( CurSat == sel_sv)      {             word = ((rec.c50-30) % 300) / 30;//  nsf increases by 1 every subframe (10 GPS words)        nsf  = (rec.c50-30) / 300;          if ( current_frame[CurSat] == 0xffffffff)         {          current_frame[CurSat] = nsf;          printf( " HOW %6d [", 6 * nsf);//          printf(" c50 %8d [", rec.c50-9*30);        }//        printf( "\n");//        printf( "nsf = %d\n", nsf);//        printf( "current_frame[CurSat] = %d\n", current_frame[CurSat]);//        getchar();        if ( nsf != current_frame[CurSat])         {//  read first word of next subframe; thus, previous subframe is complete          printf( "] ");          if ( all_par)             process_frame( nsf);           else             printf( " BAD PARITY\n");          reset_frame( CurSat);           current_frame[CurSat] = nsf;          printf( " HOW %6d [", 6 * nsf);          all_par               = 1;          last_word             = -1;        }//        printf( "\nsfid=%d, word=%d\n", sf_id, word+1);//        getchar();        //        if ( sf_id == 1 && word == 0)//        {//          outputnavbits = 1;//          getchar();//        }          for ( k=1; k < (word-last_word); k++)           printf(" ");        par = parity( rec.uk);        if ( !par)        {          outputnavbits = 0;          bufpos = 0;        }        if ( par)           printf("O");         else           printf("X");        all_par &= par;        last_word = word;//        printf( "\n");//        printf( "sfid=%d, word=%d\n", sf_id, word+1);      //        for ( k=0; k < 30; k++) //          printf( " %02x", Frame[CurSat][k]);//        printf( "\n");        if ( outputnavbits)        {                   for ( k=5; k>=0; k--)            buf[bufpos++] = ((rec.uk[3] >> k) & 0x1) ? 1 : -1;          for ( k=7; k>=0; k--)              buf[bufpos++] = ((rec.uk[2] >> k) & 0x1) ? 1 : -1;          for ( k=7; k>=0; k--)              buf[bufpos++] = ((rec.uk[1] >> k) & 0x1) ? 1 : -1;          for ( k=7; k>=0; k--)              buf[bufpos++] = ((rec.uk[0] >> k) & 0x1) ? 1 : -1;                     if ( bufpos >= 1500)            loop = 0;        } // --- if ( outputnavbits) ---        fflush( stdout);        strip_parity_and_copy_to_frame( rec.uk, word, CurSat);//        printf( "sfid=%d, word=%d\n", sf_id, word+1);//        for ( k=0; k < 30; k++) //          printf( " %02x", Frame[CurSat][k]);//        printf( "\n");//        getchar();//  get subframe id from 2nd GPS word        sfid = (Frame[CurSat][5] >> 2) & 0x7;//        printf( "\n");//        printf( "sfid=%d, word=%d\n", sfid, word+1);//        getchar();//  next word is GPS word 1 / subframe 1 -> switch on output         if ( sfid == 5 && word == 9)          outputnavbits = 1;      }  // --- if ( CurSat == sel_sv) ---    }  // --- if ( id == 0x36)  ---   }  // --- while ( !feof(fd)) ---  //  printf("\n");  *c50_ptr = rec.c50;  return (bufpos);}#if 0//////int main( int argc, char *argv[]){  int k, sel_sv, buflen;  long c50;  FILE *fd, *fpout;  fd = fopen( argv[1], "rb");  if ( !fd)   {     printf("error opening file %s.\n", argv[1]);     exit(0);  }  sel_sv = 10;    // PRN-1   char buf[1500];  char infile[256];  k = 1;  do  {    buflen = copy_to_navbuf( fd, sel_sv, buf, &c50);    if ( buflen == 1500)    {      sprintf( infile, "nav-%08x.dat", c50);      fpout = fopen( infile, "wb");      if ( !fpout)      {        printf( "error opening file %s\n", infile);        exit(-1);      }                fwrite( buf, buflen, 1, fpout);      fclose( fpout);    }  } while( buflen>0);    fclose( fd);  exit( 0);  return (0);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -