summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary E. Miller <gem@rellim.com>2018-09-11 18:15:59 -0700
committerGary E. Miller <gem@rellim.com>2018-09-11 18:15:59 -0700
commita7dc77f0c6730f97e5dfbaefa70bfa3730caaeff (patch)
treeb5871ac1f1548d6055e2edae704a7d9a5a6dda8d
parent9628f57fc93982fd22e2e71344d25f41914bbdfb (diff)
downloadgpsd-a7dc77f0c6730f97e5dfbaefa70bfa3730caaeff.tar.gz
ATT: centralize clearing of the attitude data.
This showed up a bug where rtcm3_unpack() was not clearing its rtcm3 data, which is a union with the attitude data.
-rw-r--r--driver_nmea0183.c39
-rw-r--r--driver_nmea2000.c39
-rw-r--r--driver_rtcm3.c1
-rw-r--r--gps.h3
-rw-r--r--gpsutils.c22
-rw-r--r--libgps_core.c3
-rw-r--r--libgpsd_core.c7
7 files changed, 33 insertions, 81 deletions
diff --git a/driver_nmea0183.c b/driver_nmea0183.c
index 5604e045..79d31afa 100644
--- a/driver_nmea0183.c
+++ b/driver_nmea0183.c
@@ -1125,26 +1125,6 @@ static gps_mask_t processHDT(int c UNUSED, char *field[],
/* good data */
session->gpsdata.attitude.heading = heading;
- session->gpsdata.attitude.mag_st = '\0';
- session->gpsdata.attitude.pitch = NAN;
- session->gpsdata.attitude.pitch_st = '\0';
- session->gpsdata.attitude.roll = NAN;
- session->gpsdata.attitude.roll_st = '\0';
- session->gpsdata.attitude.yaw = NAN;
- session->gpsdata.attitude.yaw_st = '\0';
- session->gpsdata.attitude.dip = NAN;
- session->gpsdata.attitude.mag_len = NAN;
- session->gpsdata.attitude.mag_x = NAN;
- session->gpsdata.attitude.mag_y = NAN;
- session->gpsdata.attitude.mag_z = NAN;
- session->gpsdata.attitude.acc_len = NAN;
- session->gpsdata.attitude.acc_x = NAN;
- session->gpsdata.attitude.acc_y = NAN;
- session->gpsdata.attitude.acc_z = NAN;
- session->gpsdata.attitude.gyro_x = NAN;
- session->gpsdata.attitude.gyro_y = NAN;
- session->gpsdata.attitude.temp = NAN;
- session->gpsdata.attitude.depth = NAN;
mask |= (ATTITUDE_SET);
gpsd_log(&session->context->errout, LOG_RAW,
@@ -1304,21 +1284,8 @@ static gps_mask_t processTNTHTM(int c UNUSED, char *field[],
session->gpsdata.attitude.pitch_st = *field[4];
session->gpsdata.attitude.roll = safe_atof(field[5]);
session->gpsdata.attitude.roll_st = *field[6];
- session->gpsdata.attitude.yaw = NAN;
- session->gpsdata.attitude.yaw_st = '\0';
session->gpsdata.attitude.dip = safe_atof(field[7]);
- session->gpsdata.attitude.mag_len = NAN;
session->gpsdata.attitude.mag_x = safe_atof(field[8]);
- session->gpsdata.attitude.mag_y = NAN;
- session->gpsdata.attitude.mag_z = NAN;
- session->gpsdata.attitude.acc_len = NAN;
- session->gpsdata.attitude.acc_x = NAN;
- session->gpsdata.attitude.acc_y = NAN;
- session->gpsdata.attitude.acc_z = NAN;
- session->gpsdata.attitude.gyro_x = NAN;
- session->gpsdata.attitude.gyro_y = NAN;
- session->gpsdata.attitude.temp = NAN;
- session->gpsdata.attitude.depth = NAN;
mask |= (ATTITUDE_SET);
gpsd_log(&session->context->errout, LOG_RAW,
@@ -1415,14 +1382,8 @@ static gps_mask_t processOHPR(int c UNUSED, char *field[],
mask = ONLINE_SET;
session->gpsdata.attitude.heading = safe_atof(field[1]);
- session->gpsdata.attitude.mag_st = '\0';
session->gpsdata.attitude.pitch = safe_atof(field[2]);
- session->gpsdata.attitude.pitch_st = '\0';
session->gpsdata.attitude.roll = safe_atof(field[3]);
- session->gpsdata.attitude.roll_st = '\0';
- session->gpsdata.attitude.yaw = NAN;
- session->gpsdata.attitude.yaw_st = '\0';
- session->gpsdata.attitude.dip = NAN;
session->gpsdata.attitude.temp = safe_atof(field[4]);
session->gpsdata.attitude.depth = safe_atof(field[5]) / METERS_TO_FEET;
session->gpsdata.attitude.mag_len = safe_atof(field[6]);
diff --git a/driver_nmea2000.c b/driver_nmea2000.c
index 38b077e5..cc8a297c 100644
--- a/driver_nmea2000.c
+++ b/driver_nmea2000.c
@@ -1057,26 +1057,6 @@ static gps_mask_t hnd_127250(unsigned char *bu, int len, PGN *pgn, struct gps_de
session->gpsdata.attitude.heading += aux * RAD_2_DEG * 0.0001;
}
// printf("ATT 2:%8.3f %6x\n",session->gpsdata.attitude.heading, aux);
- session->gpsdata.attitude.mag_st = '\0';
- session->gpsdata.attitude.pitch = NAN;
- session->gpsdata.attitude.pitch_st = '\0';
- session->gpsdata.attitude.roll = NAN;
- session->gpsdata.attitude.roll_st = '\0';
- session->gpsdata.attitude.yaw = NAN;
- session->gpsdata.attitude.yaw_st = '\0';
- session->gpsdata.attitude.dip = NAN;
- session->gpsdata.attitude.mag_len = NAN;
- session->gpsdata.attitude.mag_x = NAN;
- session->gpsdata.attitude.mag_y = NAN;
- session->gpsdata.attitude.mag_z = NAN;
- session->gpsdata.attitude.acc_len = NAN;
- session->gpsdata.attitude.acc_x = NAN;
- session->gpsdata.attitude.acc_y = NAN;
- session->gpsdata.attitude.acc_z = NAN;
- session->gpsdata.attitude.gyro_x = NAN;
- session->gpsdata.attitude.gyro_y = NAN;
- session->gpsdata.attitude.temp = NAN;
- session->gpsdata.attitude.depth = NAN;
gpsd_log(&session->context->errout, LOG_DATA,
"pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit);
@@ -1103,25 +1083,6 @@ static gps_mask_t hnd_128267(unsigned char *bu, int len, PGN *pgn, struct gps_de
{
print_data(session->context, bu, len, pgn);
- session->gpsdata.attitude.heading = NAN;
- session->gpsdata.attitude.pitch = NAN;
- session->gpsdata.attitude.pitch_st = '\0';
- session->gpsdata.attitude.roll = NAN;
- session->gpsdata.attitude.roll_st = '\0';
- session->gpsdata.attitude.yaw = NAN;
- session->gpsdata.attitude.yaw_st = '\0';
- session->gpsdata.attitude.dip = NAN;
- session->gpsdata.attitude.mag_len = NAN;
- session->gpsdata.attitude.mag_x = NAN;
- session->gpsdata.attitude.mag_y = NAN;
- session->gpsdata.attitude.mag_z = NAN;
- session->gpsdata.attitude.acc_len = NAN;
- session->gpsdata.attitude.acc_x = NAN;
- session->gpsdata.attitude.acc_y = NAN;
- session->gpsdata.attitude.acc_z = NAN;
- session->gpsdata.attitude.gyro_x = NAN;
- session->gpsdata.attitude.gyro_y = NAN;
- session->gpsdata.attitude.temp = NAN;
session->gpsdata.attitude.depth = getleu32(bu, 1) *.01;
gpsd_log(&session->context->errout, LOG_DATA,
diff --git a/driver_rtcm3.c b/driver_rtcm3.c
index 91e6ab5b..07e8907c 100644
--- a/driver_rtcm3.c
+++ b/driver_rtcm3.c
@@ -94,6 +94,7 @@ void rtcm3_unpack(const struct gps_context_t *context,
else \
fld.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
+ memset(rtcm, 0, sizeof(struct rtcm3_t));
//assert(ugrab(8) == 0xD3);
//assert(ugrab(6) == 0x00);
ugrab(14);
diff --git a/gps.h b/gps.h
index 04ada201..fce26ea1 100644
--- a/gps.h
+++ b/gps.h
@@ -2113,8 +2113,9 @@ int json_oscillator_read(const char *buf, struct gps_data_t *,
extern void libgps_trace(int errlevel, const char *, ...);
-extern void gps_clear_fix(struct gps_fix_t *);
+extern void gps_clear_att(struct attitude_t *);
extern void gps_clear_dop( struct dop_t *);
+extern void gps_clear_fix(struct gps_fix_t *);
extern void gps_merge_fix(struct gps_fix_t *, gps_mask_t, struct gps_fix_t *);
extern void gps_enable_debug(int, FILE *);
extern const char *gps_maskdump(gps_mask_t);
diff --git a/gpsutils.c b/gpsutils.c
index d13cff73..3070ca59 100644
--- a/gpsutils.c
+++ b/gpsutils.c
@@ -265,6 +265,28 @@ void gps_clear_fix(struct gps_fix_t *fixp)
fixp->ecef.vAcc = NAN;
}
+void gps_clear_att(struct attitude_t *attp)
+/* stuff an attitude structure with recognizable out-of-band values */
+{
+ memset(attp, 0, sizeof(struct attitude_t));
+ attp->pitch = NAN;
+ attp->roll = NAN;
+ attp->yaw = NAN;
+ attp->dip = NAN;
+ attp->mag_len = NAN;
+ attp->mag_x = NAN;
+ attp->mag_y = NAN;
+ attp->mag_z = NAN;
+ attp->acc_len = NAN;
+ attp->acc_x = NAN;
+ attp->acc_y = NAN;
+ attp->acc_z = NAN;
+ attp->gyro_x = NAN;
+ attp->gyro_y = NAN;
+ attp->temp = NAN;
+ attp->depth = NAN;
+}
+
void gps_clear_dop( struct dop_t *dop)
{
dop->xdop = dop->ydop = dop->vdop = dop->tdop = dop->hdop = dop->pdop =
diff --git a/libgps_core.c b/libgps_core.c
index e02ff1b9..795a9018 100644
--- a/libgps_core.c
+++ b/libgps_core.c
@@ -111,8 +111,9 @@ int gps_open(const char *host,
gpsdata->set = 0;
gpsdata->status = STATUS_NO_FIX;
gpsdata->satellites_used = 0;
- gps_clear_fix(&(gpsdata->fix));
+ gps_clear_att(&(gpsdata->attitude));
gps_clear_dop(&(gpsdata->dop));
+ gps_clear_fix(&(gpsdata->fix));
return status;
}
diff --git a/libgpsd_core.c b/libgpsd_core.c
index 3678a850..c33c14b8 100644
--- a/libgpsd_core.c
+++ b/libgpsd_core.c
@@ -326,6 +326,7 @@ void gpsd_init(struct gps_device_t *session, struct gps_context_t *context,
gps_clear_fix(&session->newdata);
gps_clear_fix(&session->oldfix);
session->gpsdata.set = 0;
+ gps_clear_att(&session->gpsdata.attitude);
gps_clear_dop(&session->gpsdata.dop);
session->gpsdata.epe = NAN;
session->mag_var = NAN;
@@ -420,6 +421,8 @@ void gpsd_clear(struct gps_device_t *session)
lexer_init(&session->lexer);
session->lexer.errout = session->context->errout;
// session->gpsdata.online = 0;
+ gps_clear_att(&session->gpsdata.attitude);
+ gps_clear_dop(&session->gpsdata.dop);
gps_clear_fix(&session->gpsdata.fix);
session->gpsdata.status = STATUS_NO_FIX;
session->gpsdata.separation = NAN;
@@ -1442,8 +1445,10 @@ gps_mask_t gpsd_poll(struct gps_device_t *session)
#endif /* NOFLOATS_ENABLE */
/* copy/merge device data into staging buffers */
- if ((session->gpsdata.set & CLEAR_IS) != 0)
+ if ((session->gpsdata.set & CLEAR_IS) != 0) {
gps_clear_fix(&session->gpsdata.fix);
+ gps_clear_att(&session->gpsdata.attitude);
+ }
/* don't downgrade mode if holding previous fix */
if (session->gpsdata.fix.mode > session->newdata.mode)
session->gpsdata.set &= ~MODE_SET;