summaryrefslogtreecommitdiff
path: root/driver_italk.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2014-09-22 14:50:03 -0400
committerEric S. Raymond <esr@thyrsus.com>2014-09-22 14:50:03 -0400
commit282691da60ec526772f713a63fa0b8f43aea7acb (patch)
tree622f4d55c882f63475b84691d41108dd17326cca /driver_italk.c
parentf63bdafc18991624b872e9efa858c024834a540e (diff)
downloadgpsd-282691da60ec526772f713a63fa0b8f43aea7acb.tar.gz
Refactor representation of satellite data into an array of structs...
...from a set of parallel arrays. This change flushed out a longstanding bug in the computation of DOPs for estimated error bars. Some test-load rebuilds were required: geostar-geos1m-binary.log.chk: With this change error estimates are computed and reported. trimble-lassen_iq-3dfix.log, trimble-lassen_iq-3dfix.log: the change revealed a bug in the computation of satellite-seen bits. Error estimates did not change. navcom.log: Error estimates changed. With these rebuilds, all regression tests pass.
Diffstat (limited to 'driver_italk.c')
-rw-r--r--driver_italk.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/driver_italk.c b/driver_italk.c
index 92175012..ffd3c33e 100644
--- a/driver_italk.c
+++ b/driver_italk.c
@@ -140,16 +140,19 @@ static gps_mask_t decode_itk_prnstatus(struct gps_device_t *session,
for (i = st = 0; i < nchan; i++) {
unsigned int off = 7 + 52 + 10 * i;
unsigned short flags;
+ bool used;
flags = (unsigned short) getleu16(buf, off);
- session->gpsdata.ss[i] = (float)(getleu16(buf, off + 2) & 0xff);
- session->gpsdata.PRN[i] = (int)getleu16(buf, off + 4) & 0xff;
- session->gpsdata.elevation[i] = (int)getles16(buf, off + 6) & 0xff;
- session->gpsdata.azimuth[i] = (int)getles16(buf, off + 8) & 0xff;
- if (session->gpsdata.PRN[i]) {
+ used = flags & PRN_FLAG_USE_IN_NAV;
+ session->gpsdata.skyview[i].ss = (float)(getleu16(buf, off + 2) & 0xff);
+ session->gpsdata.skyview[i].PRN = (int)getleu16(buf, off + 4) & 0xff;
+ session->gpsdata.skyview[i].elevation = (int)getles16(buf, off + 6) & 0xff;
+ session->gpsdata.skyview[i].azimuth = (int)getles16(buf, off + 8) & 0xff;
+ session->gpsdata.skyview[i].used = used;
+ if (session->gpsdata.skyview[i].PRN > 0) {
st++;
- if (flags & PRN_FLAG_USE_IN_NAV)
- session->gpsdata.used[nsv++] = session->gpsdata.PRN[i];
+ if (used)
+ session->sats_used[nsv++] = session->gpsdata.skyview[i].PRN;
}
}
session->gpsdata.satellites_visible = (int)st;
@@ -258,8 +261,8 @@ static gps_mask_t decode_itk_pseudo(struct gps_device_t *session,
/*@-type@*/
for (i = 0; i < n; i++){
- session->gpsdata.PRN[i] = getleu16(buf, 7 + 26 + (i*36)) & 0xff;
- session->gpsdata.ss[i] = getleu16(buf, 7 + 26 + (i*36 + 2)) & 0x3f;
+ session->gpsdata.skyview[i].PRN = getleu16(buf, 7 + 26 + (i*36)) & 0xff;
+ session->gpsdata.skyview[i].ss = getleu16(buf, 7 + 26 + (i*36 + 2)) & 0x3f;
session->gpsdata.raw.satstat[i] = getleu32(buf, 7 + 26 + (i*36 + 4));
session->gpsdata.raw.pseudorange[i] = getled64((char *)buf, 7 + 26 + (i*36 + 8));
session->gpsdata.raw.doppler[i] = getled64((char *)buf, 7 + 26 + (i*36 + 16));