summaryrefslogtreecommitdiff
path: root/driver_ubx.c
diff options
context:
space:
mode:
authorGary E. Miller <gem@rellim.com>2017-09-05 14:41:07 -0700
committerGary E. Miller <gem@rellim.com>2017-09-05 15:07:34 -0700
commit6f0b1e2df3a8b4cf4e3fce10dc37cdb020fbfcc1 (patch)
treee143678aa667976a27e682c720d39572cd1ecbeb /driver_ubx.c
parent2e7249635b0d3644bab1e2d04ad83ce56b026073 (diff)
downloadgpsd-6f0b1e2df3a8b4cf4e3fce10dc37cdb020fbfcc1.tar.gz
Revert "Support UBX NAV-PVT"
This reverts commit 22a020ec1c2bc85eff681ecacc6d2bb79fdddc9c. This commit broke PPS on uBlox. PPS would flip from offset 0 to offset -1, and back, every few minutes. Also stray characters (^M) in the log files.
Diffstat (limited to 'driver_ubx.c')
-rw-r--r--driver_ubx.c165
1 files changed, 19 insertions, 146 deletions
diff --git a/driver_ubx.c b/driver_ubx.c
index 79674410..88be6c07 100644
--- a/driver_ubx.c
+++ b/driver_ubx.c
@@ -130,129 +130,19 @@ static gps_mask_t
ubx_msg_nav_pvt(struct gps_device_t *session, unsigned char *buf,
size_t data_len)
{
- uint8_t valid;
- uint8_t flags;
- uint8_t navmode;
- struct tm unpacked_date;
- double subseconds;
- double hacc, vacc, sacc;
- int *status = &session->gpsdata.status;
- int *mode = &session->newdata.mode;
+ unsigned int flags;
gps_mask_t mask = 0;
if (data_len != 92)
return 0;
- valid = (unsigned int)getub(buf, 11);
- navmode = (unsigned char)getub(buf, 20);
flags = (unsigned int)getub(buf, 21);
- switch (navmode)
- {
- case UBX_MODE_TMONLY:
- {
- if (*mode != MODE_NO_FIX) {
- *mode = MODE_NO_FIX;
- mask |= MODE_SET;
- }
- if (*status != STATUS_NO_FIX) {
- *status = STATUS_NO_FIX;
- mask |= STATUS_SET;
- }
- break;
- }
- case UBX_MODE_3D:
- case UBX_MODE_GPSDR:
- {
- if (*mode != MODE_3D) {
- *mode = MODE_3D;
- mask |= MODE_SET;
- }
- if ((flags & UBX_NAV_PVT_FLAG_DGPS) == UBX_NAV_PVT_FLAG_DGPS) {
- if (*status != STATUS_DGPS_FIX) {
- *status = STATUS_DGPS_FIX;
- mask |= STATUS_SET;
- }
- } else {
- if (*status != STATUS_FIX) {
- *status = STATUS_FIX;
- mask |= STATUS_SET;
- }
- }
- mask |= LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLEAR_IS
- | REPORT_IS;
- break;
- }
- case UBX_MODE_2D:
- case UBX_MODE_DR: /* consider this too as 2D */
- {
- if (*mode != MODE_2D) {
- *mode = MODE_2D;
- mask |= MODE_SET;
- };
- if (*status != STATUS_FIX) {
- *status = STATUS_FIX;
- mask |= STATUS_SET;
- }
- mask |= LATLON_SET | SPEED_SET;
- break;
- }
- default:
- {
- if (*mode != MODE_NO_FIX) {
- *mode = MODE_NO_FIX;
- mask |= MODE_SET;
- };
- if (*status != STATUS_NO_FIX) {
- *status = STATUS_NO_FIX;
- mask |= STATUS_SET;
- }
- break;
- }
- }
-
- if ((valid & UBX_NAV_PVT_VALID_DATE_TIME) == UBX_NAV_PVT_VALID_DATE_TIME) {
- unpacked_date.tm_year = (uint16_t)getleu16(buf, 4) - 1900;
- unpacked_date.tm_mon = (uint8_t)getub(buf, 6) - 1;
- unpacked_date.tm_mday = (uint8_t)getub(buf, 7);
- unpacked_date.tm_hour = (uint8_t)getub(buf, 8);
- unpacked_date.tm_min = (uint8_t)getub(buf, 9);
- unpacked_date.tm_sec = (uint8_t)getub(buf, 10);
- unpacked_date.tm_isdst = 0;
- unpacked_date.tm_wday = 0;
- unpacked_date.tm_yday = 0;
- subseconds = 1e-9 * (int32_t)getles32(buf, 16);
- session->newdata.time = \
- (timestamp_t)mkgmtime(&unpacked_date) + subseconds;
- mask |= TIME_SET | NTPTIME_IS;
- }
-
- session->newdata.longitude = 1e-7 * (int32_t)getles32(buf, 24);
- session->newdata.latitude = 1e-7 * (int32_t)getles32(buf, 28);
- session->newdata.altitude = 1e-3 * (int32_t)getles32(buf, 32);
- session->newdata.speed = 1e-3 * (int32_t)getles32(buf, 60);
- session->newdata.track = 1e-5 * (int32_t)getles32(buf, 64);
- hacc = (double)(getles32(buf, 40) / 1000.0);
- vacc = (double)(getles32(buf, 44) / 1000.0);
- sacc = (double)(getles32(buf, 48) / 1000.0);
- // Assuming hacc == epx == epy is the best we can do
- session->newdata.epx = session->newdata.epy = hacc;
- session->newdata.epv = vacc;
- session->newdata.eps = sacc;
- mask |= HERR_SET | VERR_SET | SPEEDERR_SET;
+ /* TODO: finish decoding UBX_MON_PVT
+ * no need until depreacaed UBX_MON_SOL is dead
+ */
gpsd_log(&session->context->errout, LOG_DATA,
- "NAV_PVT: flags=%02x time=%.2f lat=%.2f lon=%.2f alt=%.2f track=%.2f speed=%.2f climb=%.2f mode=%d status=%d used=%d\n",
- flags,
- session->newdata.time,
- session->newdata.latitude,
- session->newdata.longitude,
- session->newdata.altitude,
- session->newdata.track,
- session->newdata.speed,
- session->newdata.climb,
- session->newdata.mode,
- session->gpsdata.status,
- session->gpsdata.satellites_used);
+ "NAV-PVT: flags:%02x\n", flags);
return mask;
}
@@ -276,14 +166,10 @@ ubx_msg_nav_sol(struct gps_device_t *session, unsigned char *buf,
#define DATE_VALID (UBX_SOL_VALID_WEEK | UBX_SOL_VALID_TIME)
if ((flags & DATE_VALID) == DATE_VALID) {
unsigned short gw;
- unsigned int iTOW;
- int fTOW;
- iTOW = (unsigned int)getleu32(buf, 0);
- fTOW = (int)getles32(buf, 4);
+ unsigned int tow;
+ tow = (unsigned int)getleu32(buf, 0);
gw = (unsigned short)getles16(buf, 8);
- session->newdata.time = gpsd_gpstime_resolve(session, gw,
- (iTOW * 1e-3)
- + (fTOW * 1e-9));
+ session->newdata.time = gpsd_gpstime_resolve(session, gw, tow / 1000.0);
mask |= TIME_SET | NTPTIME_IS;
}
#undef DATE_VALID
@@ -406,36 +292,24 @@ static gps_mask_t
ubx_msg_nav_timegps(struct gps_device_t *session, unsigned char *buf,
size_t data_len)
{
- unsigned int gw, iTOW, flags;
- int fTOW;
- gps_mask_t mask = 0;
+ unsigned int gw, tow, flags;
if (data_len != 16)
return 0;
+ tow = (unsigned int)getleu32(buf, 0);
+ gw = (unsigned int)getles16(buf, 8);
flags = (unsigned int)getub(buf, 11);
- // Valid leap seconds
- if ((flags & UBX_TIMEGPS_VALID_LEAP_SECOND) == UBX_TIMEGPS_VALID_LEAP_SECOND)
+ if ((flags & 0x7) != 0)
session->context->leap_seconds = (int)getub(buf, 10);
- // Valid GPS time of week and week number
-#define VALID_TIME (UBX_TIMEGPS_VALID_TIME | UBX_TIMEGPS_VALID_WEEK)
- if ((flags & VALID_TIME) == VALID_TIME)
-#undef VALID_TIME
- {
- iTOW = (unsigned int)getleu32(buf, 0);
- fTOW = (int)getles32(buf, 4);
- gw = (unsigned int)getles16(buf, 8);
- session->newdata.time =
- gpsd_gpstime_resolve(session,
- (unsigned short int)gw,
- ((double)iTOW * 1e-3) + ((double)fTOW * 1e-9));
- mask |= (TIME_SET | NTPTIME_IS);
- }
+ session->newdata.time = gpsd_gpstime_resolve(session,
+ (unsigned short int)gw,
+ (double)tow / 1000.0);
gpsd_log(&session->context->errout, LOG_DATA,
- "TIMEGPS: time=%.2f mask={TIME}\n",
- session->newdata.time);
- return mask;
+ "TIMEGPS: time=%.2f leap=%d, mask={TIME}\n",
+ session->newdata.time, session->context->leap_seconds);
+ return TIME_SET | NTPTIME_IS;
}
/**
@@ -612,8 +486,7 @@ gps_mask_t ubx_parse(struct gps_device_t * session, unsigned char *buf,
break;
case UBX_NAV_PVT:
gpsd_log(&session->context->errout, LOG_PROG, "UBX_NAV_PVT\n");
- mask = ubx_msg_nav_pvt(session, &buf[UBX_PREFIX_LEN], data_len)
- | (CLEAR_IS | REPORT_IS);
+ mask = ubx_msg_nav_pvt(session, &buf[UBX_PREFIX_LEN], data_len);
break;
case UBX_NAV_POSUTM:
gpsd_log(&session->context->errout, LOG_DATA, "UBX_NAV_POSUTM\n");