📄 ogr2rnx.c
字号:
printf ("%2d %5.0f ", SELECTED_SV + 1, (float) mean_q / n); printf ("%4.1f %5.1f ", mean / n, sqrt ((sigma - mean * mean / n) / n)); printf ("%4.1f %5.1f\n", mean2 / n2, sqrt ((sigma2 - mean2 * mean2 / n2) / n2)); } if (STDIN == 0) fclose (fd); exit (0);}// ////////////////PARSE NAV RELATED FUNCTIONS ///////////////////////////BYTE current_sat;typedef struct{ BYTE prn; double acc; BYTE health; double af[3]; double tgd; double crs; double crc; double cuc; double cus; double cic; double cis; double M0; double dn; double ecc; double roota; double W0; double Wdot; double i0; double idot; double w; double toc; int week; double toe; double tom; int iodc; int iode2; int iode3; int last_iode; BYTE L2_code; BYTE L2_data; BYTE fit_flag; UINT aodo;} EPHEM;EPHEM eph[32];double URA_TABLE[16] = { 2, 2.8, 4, 5.7, 8, 11.3, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, -1};voiddump_eph_ok (FILE * fd){ EPHEM ep = eph[current_sat]; char msg[700], ch; char *ptr = msg; // int toc,sec,min,hour; double toc; ULONG garmin_wdays, week; struct tm gmt; double frac; int k; BYTE health; double cero = 0.0; int out; char f1[10], f4[40]; if (ep.prn == 0) return; if (VC_format) strcpy (f1, "%20.12e"); else strcpy (f1, "%19.12e"); strcpy (f4, " "); for (k = 0; k < 4; k++) strcat (f4, f1); strcat (f4, "\n"); health = ep.health >> 5; // Convert toc time week = (ULONG) ep.week; garmin_wdays = (week - 521) * 7; toc = ep.toc; frac = toc - floor (toc); toc = floor (toc); get_current_date (garmin_wdays, (ULONG) toc, &gmt); ptr += sprintf (ptr, "%2d %02d %2d ", ep.prn, (1900 + gmt.tm_year) % 100, gmt.tm_mon + 1); ptr += sprintf (ptr, "%02d %2d %2d", gmt.tm_mday, gmt.tm_hour, gmt.tm_min); ptr += sprintf (ptr, "%5.1f", (double) gmt.tm_sec + frac); // sec=toc%86400; hour=sec/3600; sec-=hour*3600; min=sec/60; // sec-=min*60; // ptr+=sprintf(ptr,"TOC %d(%02d:%02d:%02d): ",toc,hour,min,sec); for (k = 0; k < 3; k++) ptr += sprintf (ptr, f1, ep.af[k]); ptr += sprintf (ptr, "\n"); ptr += sprintf (ptr, f4, (double) ep.iode2, ep.crs, ep.dn, ep.M0); ptr += sprintf (ptr, f4, ep.cuc, ep.ecc, ep.cus, ep.roota); ptr += sprintf (ptr, f4, ep.toe, ep.cic, ep.W0, ep.cis); ptr += sprintf (ptr, f4, ep.i0, ep.crc, ep.w, ep.Wdot); ptr += sprintf (ptr, f4, ep.idot, (double) ep.L2_code, (double) week, (double) ep.L2_data); ptr += sprintf (ptr, f4, ep.acc, (double) health, ep.tgd, (double) (ep.iodc)); ptr += sprintf (ptr, f4, ep.tom, cero, cero, cero); /* * for(k=0;k<3;k++) ptr+=sprintf(ptr,"%20.12e",ep.af[k]); * ptr+=sprintf(ptr,"\n"); * * ptr+=sprintf(ptr," * %20.12e%20.12e%20.12e%20.12e\n",(double)ep.iode2,ep.crs,ep.dn,ep.M0); * ptr+=sprintf(ptr," * %20.12e%20.12e%20.12e%20.12e\n",ep.cuc,ep.ecc,ep.cus,ep.roota); * ptr+=sprintf(ptr," * %20.12e%20.12e%20.12e%20.12e\n",ep.toe,ep.cic,ep.W0,ep.cis); * ptr+=sprintf(ptr," * %20.12e%20.12e%20.12e%20.12e\n",ep.i0,ep.crc,ep.w,ep.Wdot); * ptr+=sprintf(ptr," * %20.12e%20.12e%20.12e%20.12e\n",ep.idot,(double)ep.L2_code,(double)week,(double)ep.L2_data); * ptr+=sprintf(ptr," * %20.12e%20.12e%20.12e%20.12e\n",ep.acc,(double)health,ep.tgd,(double)(ep.iodc)); * //ptr+=sprintf(ptr," %20.12e\n",ep.tom); ptr+=sprintf(ptr," * %20.12e%20.12e%20.12e%20.12e\n",ep.tom,cero,cero,cero); */ if (VC_format) { out = 0; k = 0; while (ch = msg[k]) { if (ch == 'e') { msg[k - out] = 'D'; k++; msg[k - out] = msg[k]; k++; out++; } else msg[k - out] = ch; k++; } msg[k - out] = 0; } else for (k = 0; k < (ptr - msg); k++) if (msg[k] == 'e') msg[k] = 'D'; // printf("%d\n",strlen(msg)); fprintf (fd, "%s", msg); // getchar(); return;}intformat_double_old (char *dest, double a){ char ptr[32]; int ND, k, exp, index; int pos_coma, pos_e; char sgn, first; sprintf (ptr, "%+20.12e", a); // printf("Inicio: %s\n",ptr); k = 0; while (ptr[k] != '.') k++; pos_coma = k; while (ptr[k] != 'e') k++; pos_e = k + 1; exp = atoi (ptr + pos_e); first = ptr[pos_coma - 1]; sgn = ptr[pos_coma - 2]; if (sgn == '+') sgn = ' '; index = 0; dest[index++] = ' '; dest[index++] = sgn; dest[index++] = '.'; if (first == '0') ND = 12; else { dest[index++] = first; ND = 11; exp++; } for (k = 1; k <= ND; k++) dest[index++] = ptr[pos_coma + k]; index += sprintf (dest + index, "D%+03d", exp); // printf("Chars written %d\n",index); return index;}/* * re-format 1.234E+01 into 0.1234D+01 */intformat_double (char *dest, double a, int ND){ char ptr[32]; int k, exp, index; int pos_coma, pos_e; char sgn, first; BOOLEAN leading_cero = 1; sprintf (ptr, "%+20.11e", a); // printf("Inicio: %s\n",ptr); k = 0; while (ptr[k] != '.') k++; pos_coma = k; while ((ptr[k] != 'e') && (ptr[k] != 'E')) k++; pos_e = k + 1; exp = atoi (ptr + pos_e); first = ptr[pos_coma - 1]; sgn = ptr[pos_coma - 2]; if (sgn == '+') sgn = ' '; index = 0; // if (leading_cero) { dest[index++] = sgn; dest[index++] = '0'; } else { dest[index++] = ' '; dest[index++] = sgn; } dest[index++] = '.'; dest[index++] = first;// ND = 11; exp++; for (k = 1; k < ND; k++) dest[index++] = ptr[pos_coma + k]; index += sprintf (dest + index, "D%+03d", exp); // printf("Chars written %d\n",index); return index;}intwrite_four (char *ptr, double one, double two, double three, double four){ int index = 0; index += sprintf (ptr + index, " "); index += format_double (ptr + index, one, 12); index += format_double (ptr + index, two, 12); index += format_double (ptr + index, three, 12); index += format_double (ptr + index, four, 12); index += sprintf (ptr + index, "\n"); return index;}voiddump_eph (FILE * fd){ EPHEM ep = eph[current_sat]; char msg[700]; char *ptr = msg; // int toc,sec,min,hour; double toc; ULONG garmin_wdays, week; struct tm gmt; double frac; int k; BYTE health; double cero = 0.0; if (ep.prn == 0) return; health = ep.health >> 5; // Convert toc time week = (ULONG) ep.week; garmin_wdays = (week - 521) * 7; toc = ep.toc; frac = toc - floor (toc); toc = floor (toc); get_current_date (garmin_wdays, (ULONG) toc, &gmt); ptr += sprintf (ptr, "%2d %02d %2d ", ep.prn, (1900 + gmt.tm_year) % 100, gmt.tm_mon + 1); ptr += sprintf (ptr, "%02d %2d %2d", gmt.tm_mday, gmt.tm_hour, gmt.tm_min); ptr += sprintf (ptr, "%5.1f", (double) gmt.tm_sec + frac); // sec=toc%86400; hour=sec/3600; sec-=hour*3600; min=sec/60; // sec-=min*60; // ptr+=sprintf(ptr,"TOC %d(%02d:%02d:%02d): ",toc,hour,min,sec); for (k = 0; k < 3; k++) ptr += format_double (ptr, ep.af[k], 12); ptr += sprintf (ptr, "\n"); ptr += write_four (ptr, (double) ep.iode2, ep.crs, ep.dn, ep.M0); ptr += write_four (ptr, ep.cuc, ep.ecc, ep.cus, ep.roota); ptr += write_four (ptr, ep.toe, ep.cic, ep.W0, ep.cis); ptr += write_four (ptr, ep.i0, ep.crc, ep.w, ep.Wdot); ptr += write_four (ptr, ep.idot, (double) ep.L2_code, (double) week, (double) ep.L2_data); ptr += write_four (ptr, ep.acc, (double) health, ep.tgd, (double) (ep.iodc)); ptr += write_four (ptr, ep.tom, cero, cero, cero); fprintf (fd, "%s", msg);// printf ("%s\n", msg); return; // getchar();}voidreset_frame ( void){ memcpy (frame[current_sat], RESET, 30); memcpy (check_frame[current_sat], RESET, 30); return;}voidp_bits (BYTE b){ int i; for (i = 7; i >= 0; i--) printf ("%d", (b & (1 << i)) >> i);}voidp_nbits (BYTE b, int n){ int i; for (i = n - 1; i >= 0; i--) printf ("%d", (b & (1 << i)) >> i);}/* * Move bits 2 to 25 from BYTE org[4] to global frame[][] */voidstrip_parity (BYTE * org, ULONG word){ BYTE *dest; int k, index; BYTE d30; d30 = (org[3] >> 6) & 0x1; index = word * 3; dest = frame[current_sat] + index; for (k = 0; k < 3; k++) { dest[k] = ((org[3 - k] & 0x3f) << 2) + ((org[2 - k] & 0xc0) >> 6); if (d30 == 1) dest[k] = dest[k] ^ 0xff; check_frame[current_sat][index + k] = 1; } // memcpy(check+index,OK,3);#ifdef TRACE printf ("D30 %d\n", d30); for (k = 3; k >= 0; k--) printf ("%02x ", org[k]); printf ("\n"); for (k = 3; k >= 0; k--) p_bits (org[k]); printf ("\n"); printf (" "); for (k = 0; k < 3; k++) p_bits (dest[k]); printf ("\n");#endif return;}// Extract bit number nbit from byte stream ptrBYTEpeak_bit (int nbit, BYTE * ptr){ int byte_pos = (nbit >> 3); int bit_pos = 7 - (nbit & 0x07); BYTE res = (ptr[byte_pos] & (1 << bit_pos)) >> bit_pos; return res;}// Place bit (0/1) in position nbit of byte stream destvoidpoke_bit (BYTE bit, int nbit, BYTE * dest){ int byte_pos = (nbit >> 3); int bit_pos = (nbit & 0x07); BYTE mask; BYTE org = dest[byte_pos]; // printf("ORG %d byte %d bit %d\n",org,byte_pos,bit_pos); bit_pos = 7 - bit_pos; mask = 0xff - (1 << bit_pos); org &= mask; // p_bits(org); printf("\n"); // p_bits(mask); printf("\n"); bit &= 0x01; org = org | (bit << bit_pos); // p_bits(org); printf("\n"); dest[byte_pos] = org; return;}// Extract L bits starting from frame[ini-1] as unsigned long int (32 bits // max)ULONGextrae_ulong (int ini, int L){ ULONG res = 0; BYTE *dest = (BYTE *) & res; int k, pos_lsb; BYTE data; ini = ini - 1; pos_lsb = ini + L - 1; for (k = 0, pos_lsb = ini + L - 1; k < L; k++, pos_lsb--) { data = peak_bit (pos_lsb, frame[current_sat]); poke_bit (data, LSB[k], dest); } return res;}doubleget_real (ULONG data, int L, BYTE signo, int scale){ double res, factor; ULONG limit; res = (double) data; if (signo) { limit = 1 << (L - 1); if (data >= limit) res = res - pow ((double) 2.0, (double) L); } factor = pow (2.0, (double) scale); res = res * factor; return res;}voidfill_subframe1 (void){ ULONG temp; double d; int L; BYTE alert, antispoof; char on_off[2][4]; char *tab = " "; strcpy (on_off[0], " ON"); strcpy (on_off[1], "OFF"); eph[current_sat].prn = current_sat + 1; alert = (BYTE) extrae_ulong (42, 1); antispoof = (BYTE) extrae_ulong (43, 1); // Possible rollover problems ca. 2020 temp = extrae_ulong (49, 10); eph[current_sat].week = temp + 1024; temp = extrae_ulong (59, 2); eph[current_sat].L2_code = (BYTE) temp; temp = extrae_ulong (61, 4); eph[current_sat].acc = URA_TABLE[temp]; temp = extrae_ulong (71, 2); temp = (temp << 8) + extrae_ulong (169, 8); eph[current_sat].iodc = temp; temp = extrae_ulong (73, 1); eph[current_sat].L2_data = (BYTE) temp; temp = extrae_ulong (65, 6); eph[current_sat].health = (BYTE) temp; L = 8; temp = extrae_ulong (161, L); d = get_real (temp, L, 1, -31); eph[current_sat].tgd = d; temp = extrae_ulong (177, 16); temp <<= 4; eph[current_sat].toc = temp; L = 22; temp = extrae_ulong (217, L); d = get_real (temp, L, 1, -31); eph[current_sat].af[0] = d; L = 16; temp = extrae_ulong (201, L); d = get_real (temp, L, 1, -43); eph[current_sat].af[1] = d; L = 8; temp = extrae_ulong (193, 8); d = get_real (temp, L, 1, -55); eph[current_sat].af[2] = d; if (VERBOSE_NAV == 0) return; if ((SELECTED_SF != -1) && (SELECTED_SF != 1)) return; // printf("------------------------------------------------------------------\n"); printf ("\nPRN %02d: ", eph[current_sat].prn); printf ("Issue Of Data Clock (IODC) %04u -> IODE %3d. ", eph[current_sat].iodc, eph[current_sat].iodc & 0xff); printf ("Week
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -