diff options
author | Gary E. Miller <gem@rellim.com> | 2018-09-11 18:15:59 -0700 |
---|---|---|
committer | Gary E. Miller <gem@rellim.com> | 2018-09-11 18:15:59 -0700 |
commit | a7dc77f0c6730f97e5dfbaefa70bfa3730caaeff (patch) | |
tree | b5871ac1f1548d6055e2edae704a7d9a5a6dda8d | |
parent | 9628f57fc93982fd22e2e71344d25f41914bbdfb (diff) | |
download | gpsd-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.c | 39 | ||||
-rw-r--r-- | driver_nmea2000.c | 39 | ||||
-rw-r--r-- | driver_rtcm3.c | 1 | ||||
-rw-r--r-- | gps.h | 3 | ||||
-rw-r--r-- | gpsutils.c | 22 | ||||
-rw-r--r-- | libgps_core.c | 3 | ||||
-rw-r--r-- | libgpsd_core.c | 7 |
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); @@ -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); @@ -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; |