📄 ogsgar2rnx.c
字号:
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 + -