Skip to content
This repository was archived by the owner on Apr 13, 2021. It is now read-only.

Commit 10c6337

Browse files
committed
TRACK: Correctly match week number of measurement to ephemeris
1 parent 300f6ae commit 10c6337

File tree

3 files changed

+20
-5
lines changed

3 files changed

+20
-5
lines changed

include/libswiftnav/gpstime.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ gps_time_t normalize_gps_time(gps_time_t);
4545
time_t gps2time(gps_time_t t);
4646

4747
double gpsdifftime(gps_time_t end, gps_time_t beginning);
48+
void gps_time_match_weeks(gps_time_t *t, const gps_time_t *ref);
4849

4950
#endif /* LIBSWIFTNAV_TIME_H */
5051

src/gpstime.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,19 @@ double gpsdifftime(gps_time_t end, gps_time_t beginning)
8383
}
8484
return dt;
8585
}
86+
87+
/** Set the week number of t so as to minimize the magnitude of the
88+
* time difference between t and ref.
89+
*
90+
* \param t Pointer to GPS time whose week number will be set
91+
* \param ref Reference GPS time
92+
*/
93+
void gps_time_match_weeks(gps_time_t *t, const gps_time_t *ref)
94+
{
95+
t->wn = ref->wn;
96+
double dt = t->tow - ref->tow;
97+
if (dt > WEEK_SECS / 2)
98+
t->wn--;
99+
else if (dt < -WEEK_SECS / 2)
100+
t->wn++;
101+
}

src/track.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -767,12 +767,10 @@ void calc_navigation_measurement_(u8 n_channels, channel_measurement_t* meas[],
767767
TOTs[i] += meas[i]->code_phase_chips / 1.023e6;
768768
TOTs[i] += (nav_time - meas[i]->receiver_time) * meas[i]->code_phase_rate / 1.023e6;
769769

770-
/** \todo Handle GPS time properly here, e.g. week rollover */
771-
nav_meas[i]->tot.wn = ephemerides[i]->toe.wn;
770+
/** \todo Maybe keep track of week number in tracking channel
771+
state or derive it from system time. */
772772
nav_meas[i]->tot.tow = TOTs[i];
773-
774-
if (gpsdifftime(nav_meas[i]->tot, ephemerides[i]->toe) > 3*24*3600)
775-
nav_meas[i]->tot.wn -= 1;
773+
gps_time_match_weeks(&nav_meas[i]->tot, &ephemerides[i]->toe);
776774

777775
nav_meas[i]->raw_doppler = meas[i]->carrier_freq;
778776
nav_meas[i]->snr = meas[i]->snr;

0 commit comments

Comments
 (0)