RS92: PRN-32 toggle

dump
Zilog80 2016-10-15 21:36:36 +02:00
rodzic d10efcca25
commit c8ffaf7624
2 zmienionych plików z 37 dodań i 8 usunięć

Wyświetl plik

@ -95,6 +95,7 @@ typedef struct {
int sats[4]; int sats[4];
double dop; double dop;
unsigned short aux[4]; unsigned short aux[4];
double diter;
} gpx_t; } gpx_t;
gpx_t gpx; gpx_t gpx;
@ -109,6 +110,7 @@ int option_verbose = 0, // ausfuehrliche Anzeige
option_ecc = 0, // Reed-Solomon ECC option_ecc = 0, // Reed-Solomon ECC
fileloaded = 0, fileloaded = 0,
option_vergps = 0, option_vergps = 0,
option_iter = 0,
option_vel = 0, // velocity option_vel = 0, // velocity
option_aux = 0, // Aux/Ozon option_aux = 0, // Aux/Ozon
rawin = 0; rawin = 0;
@ -665,6 +667,7 @@ int prnbits_le(ui16_t byte16, ui8_t bits[64], int block) {
} }
ui8_t prns[12], // PRNs in data ui8_t prns[12], // PRNs in data
sat_status[12]; sat_status[12];
int prn32toggle = 0x1;
void prn12(ui8_t *prn_le, ui8_t prns[12]) { void prn12(ui8_t *prn_le, ui8_t prns[12]) {
int i, j, d; int i, j, d;
for (i = 0; i < 12; i++) { for (i = 0; i < 12; i++) {
@ -683,7 +686,9 @@ void prn12(ui8_t *prn_le, ui8_t prns[12]) {
} }
else if ( (i % 3 != 2) && (prn_le[5*(i+1)] & 1) ) { // Spalte 0,1 else if ( (i % 3 != 2) && (prn_le[5*(i+1)] & 1) ) { // Spalte 0,1
prns[i] = 32; // vorausgesetzt im Block folgt auf PRN-32 prns[i] = 32; // vorausgesetzt im Block folgt auf PRN-32
if (prns[i+1] > 1) prns[i+1] ^= 0x1; // entweder PRN-1 oder PRN-gerade if (prns[i+1] > 1) { // entweder PRN-1 oder PRN-gerade
prns[i+1] ^= prn32toggle;
}
} }
} }
else if ((sat_status[i] & 0x0F) == 0) { // erste beiden bits: 0x03 ? else if ((sat_status[i] & 0x0F) == 0) { // erste beiden bits: 0x03 ?
@ -1015,7 +1020,7 @@ int get_GPSkoord(int N) {
double lat, lon, alt, rx_cl_bias; double lat, lon, alt, rx_cl_bias;
double vH, vD, vU; double vH, vD, vU;
double lat1s, lon1s, alt1s; double lat1s, lon1s, alt1s;
double pos_ecef[3], pos1s_ecef[3], double pos_ecef[3], pos1s_ecef[3], dpos_ecef[3],
vel_ecef[3], dvel_ecef[3]; vel_ecef[3], dvel_ecef[3];
double gdop, gdop0 = 1000.0; double gdop, gdop0 = 1000.0;
double hdop, vdop, pdop; double hdop, vdop, pdop;
@ -1024,7 +1029,7 @@ int get_GPSkoord(int N) {
int num = 0; int num = 0;
SAT_t Sat_A[4]; SAT_t Sat_A[4];
SAT_t Sat_B[12]; // N <= 12 SAT_t Sat_B[12]; // N <= 12
SAT_t Sat_V[12]; SAT_t Sat_B1s[12];
if (option_vergps == 8) { if (option_vergps == 8) {
fprintf(stdout, " sats: "); fprintf(stdout, " sats: ");
@ -1083,7 +1088,7 @@ int get_GPSkoord(int N) {
if (option_vergps == 8 || option_vergps == 2) { if (option_vergps == 8 || option_vergps == 2) {
for (j = 0; j < N; j++) Sat_B[j] = sat[prn[j]]; for (j = 0; j < N; j++) Sat_B[j] = sat[prn[j]];
for (j = 0; j < N; j++) Sat_V[j] = sat1s[prn[j]]; for (j = 0; j < N; j++) Sat_B1s[j] = sat1s[prn[j]];
NAV_bancroft1(N, Sat_B, pos_ecef, &rx_cl_bias); NAV_bancroft1(N, Sat_B, pos_ecef, &rx_cl_bias);
ecef2elli(pos_ecef[0], pos_ecef[1], pos_ecef[2], &lat, &lon, &alt); ecef2elli(pos_ecef[0], pos_ecef[1], pos_ecef[2], &lat, &lon, &alt);
@ -1092,8 +1097,20 @@ int get_GPSkoord(int N) {
gdop = sqrt(DOP[0]+DOP[1]+DOP[2]+DOP[3]); gdop = sqrt(DOP[0]+DOP[1]+DOP[2]+DOP[3]);
} }
NAV_LinP(N, Sat_B, pos_ecef, rx_cl_bias, dpos_ecef, &rx_cl_bias);
gpx.diter = dist(0, 0, 0, dpos_ecef[0], dpos_ecef[0],dpos_ecef[0]);
if (gpx.diter > 10000) prn32toggle ^= 0x1;
if (option_iter) {
for (j = 0; j < 3; j++) pos_ecef[j] += dpos_ecef[j];
ecef2elli(pos_ecef[0], pos_ecef[1], pos_ecef[2], &lat, &lon, &alt);
}
if (option_vel == 1) { if (option_vel == 1) {
NAV_bancroft1(N, Sat_V, pos1s_ecef, &rx_cl_bias); NAV_bancroft1(N, Sat_B1s, pos1s_ecef, &rx_cl_bias);
if (option_iter) {
NAV_LinP(N, Sat_B1s, pos1s_ecef, rx_cl_bias, dpos_ecef, &rx_cl_bias);
for (j = 0; j < 3; j++) pos1s_ecef[j] += dpos_ecef[j];
}
for (j = 0; j < 3; j++) vel_ecef[j] = pos_ecef[j] - pos1s_ecef[j]; for (j = 0; j < 3; j++) vel_ecef[j] = pos_ecef[j] - pos1s_ecef[j];
get_GPSvel(lat, lon, vel_ecef, &vH, &vD, &vU); get_GPSvel(lat, lon, vel_ecef, &vH, &vD, &vU);
ecef2elli(pos1s_ecef[0], pos1s_ecef[1], pos1s_ecef[2], &lat1s, &lon1s, &alt1s); ecef2elli(pos1s_ecef[0], pos1s_ecef[1], pos1s_ecef[2], &lat1s, &lon1s, &alt1s);
@ -1218,8 +1235,13 @@ int print_position() { // GPS-Hoehe ueber Ellipsoid
if (k >= 4) { if (k >= 4) {
if (get_GPSkoord(k) > 0) { if (get_GPSkoord(k) > 0) {
fprintf(stdout, " "); fprintf(stdout, " ");
if (almanac) fprintf(stdout, " lat: %.4f lon: %.4f alt: %.1f ", gpx.lat, gpx.lon, gpx.h); if (almanac) fprintf(stdout, " lat: %.4f lon: %.4f alt: %.1f ", gpx.lat, gpx.lon, gpx.h);
else fprintf(stdout, " lat: %.5f lon: %.5f alt: %.1f ", gpx.lat, gpx.lon, gpx.h); else fprintf(stdout, " lat: %.5f lon: %.5f alt: %.1f ", gpx.lat, gpx.lon, gpx.h);
if (option_iter && (option_vergps == 8 || option_vergps == 2)) {
fprintf(stdout, " (d:%.1f) ", gpx.diter);
}
if (option_vel && option_vergps >= 2) { if (option_vel && option_vergps >= 2) {
fprintf(stdout," vH: %4.1f D: %5.1f° vV: %3.1f ", gpx.vH, gpx.vD, gpx.vU); fprintf(stdout," vH: %4.1f D: %5.1f° vV: %3.1f ", gpx.vH, gpx.vD, gpx.vU);
} }
@ -1348,6 +1370,9 @@ int main(int argc, char *argv[]) {
option_vel = 2; option_vel = 2;
if (option_vergps < 1) option_vergps = 2; if (option_vergps < 1) option_vergps = 2;
} }
else if ( (strcmp(*argv, "--iter") == 0) ) {
option_iter = 1;
}
else if ( (strcmp(*argv, "-v") == 0) ) { else if ( (strcmp(*argv, "-v") == 0) ) {
option_verbose = 1; option_verbose = 1;
} }

Wyświetl plik

@ -637,6 +637,7 @@ int prnbits_le(ui16_t byte16, ui8_t bits[64], int block) {
} }
ui8_t prns[12], // PRNs in data ui8_t prns[12], // PRNs in data
sat_status[12]; sat_status[12];
int prn32toggle = 0x1;
void prn12(ui8_t *prn_le, ui8_t prns[12]) { void prn12(ui8_t *prn_le, ui8_t prns[12]) {
int i, j, d; int i, j, d;
for (i = 0; i < 12; i++) { for (i = 0; i < 12; i++) {
@ -655,7 +656,9 @@ void prn12(ui8_t *prn_le, ui8_t prns[12]) {
} }
else if ( (i % 3 != 2) && (prn_le[5*(i+1)] & 1) ) { // Spalte 0,1 else if ( (i % 3 != 2) && (prn_le[5*(i+1)] & 1) ) { // Spalte 0,1
prns[i] = 32; // vorausgesetzt im Block folgt auf PRN-32 prns[i] = 32; // vorausgesetzt im Block folgt auf PRN-32
if (prns[i+1] > 1) prns[i+1] ^= 0x1; // entweder PRN-1 oder PRN-gerade if (prns[i+1] > 1) { // entweder PRN-1 oder PRN-gerade
prns[i+1] ^= prn32toggle;
}
} }
} }
else if ((sat_status[i] & 0x0F) == 0) { // erste beiden bits: 0x03 ? else if ((sat_status[i] & 0x0F) == 0) { // erste beiden bits: 0x03 ?
@ -1064,11 +1067,12 @@ int get_GPSkoord(int N) {
gdop = sqrt(DOP[0]+DOP[1]+DOP[2]+DOP[3]); gdop = sqrt(DOP[0]+DOP[1]+DOP[2]+DOP[3]);
} }
NAV_LinP(N, Sat_B, pos_ecef, rx_cl_bias, dpos_ecef, &rx_cl_bias);
gpx.diter = dist(0, 0, 0, dpos_ecef[0], dpos_ecef[0],dpos_ecef[0]);
if (gpx.diter > 10000) prn32toggle ^= 0x1;
if (option_iter) { if (option_iter) {
NAV_LinP(N, Sat_B, pos_ecef, rx_cl_bias, dpos_ecef, &rx_cl_bias);
for (j = 0; j < 3; j++) pos_ecef[j] += dpos_ecef[j]; for (j = 0; j < 3; j++) pos_ecef[j] += dpos_ecef[j];
ecef2elli(pos_ecef[0], pos_ecef[1], pos_ecef[2], &lat, &lon, &alt); ecef2elli(pos_ecef[0], pos_ecef[1], pos_ecef[2], &lat, &lon, &alt);
gpx.diter = dist(0, 0, 0, dpos_ecef[0], dpos_ecef[0],dpos_ecef[0]);
} }
if (option_vel == 1) { if (option_vel == 1) {