summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libgps_json.c128
-rw-r--r--test/clientlib/multipacket.log.chk4
2 files changed, 73 insertions, 59 deletions
diff --git a/libgps_json.c b/libgps_json.c
index ad1fdfb7..c8976952 100644
--- a/libgps_json.c
+++ b/libgps_json.c
@@ -85,8 +85,6 @@ static int json_tpv_read(const char *buf, struct gps_data_t *gpsdata,
status = json_read_object(buf, json_attrs_1, endptr);
if (status == 0) {
- gpsdata->status = STATUS_FIX;
- gpsdata->set = STATUS_SET;
/*@-usedef@*/
if (isnan(gpsdata->fix.time)!=0) {
if (tbuf[0] == '\0')
@@ -95,34 +93,6 @@ static int json_tpv_read(const char *buf, struct gps_data_t *gpsdata,
gpsdata->fix.time = iso8601_to_unix(tbuf);
}
/*@+usedef@*/
- if (isnan(gpsdata->fix.time) == 0)
- gpsdata->set |= TIME_SET;
- if (isnan(gpsdata->fix.ept) == 0)
- gpsdata->set |= TIMERR_SET;
- if (isnan(gpsdata->fix.longitude) == 0)
- gpsdata->set |= LATLON_SET;
- if (isnan(gpsdata->fix.altitude) == 0)
- gpsdata->set |= ALTITUDE_SET;
- if (isnan(gpsdata->fix.epx) == 0 && isnan(gpsdata->fix.epy) == 0)
- gpsdata->set |= HERR_SET;
- if (isnan(gpsdata->fix.epv) == 0)
- gpsdata->set |= VERR_SET;
- if (isnan(gpsdata->fix.track) == 0)
- gpsdata->set |= TRACK_SET;
- if (isnan(gpsdata->fix.speed) == 0)
- gpsdata->set |= SPEED_SET;
- if (isnan(gpsdata->fix.climb) == 0)
- gpsdata->set |= CLIMB_SET;
- if (isnan(gpsdata->fix.epd) == 0)
- gpsdata->set |= TRACKERR_SET;
- if (isnan(gpsdata->fix.eps) == 0)
- gpsdata->set |= SPEEDERR_SET;
- if (isnan(gpsdata->fix.epc) == 0)
- gpsdata->set |= CLIMBERR_SET;
- if (isnan(gpsdata->fix.epc) == 0)
- gpsdata->set |= CLIMBERR_SET;
- if (gpsdata->fix.mode != MODE_NOT_SEEN)
- gpsdata->set |= MODE_SET;
}
return status;
}
@@ -176,9 +146,6 @@ static int json_noise_read(const char *buf, struct gps_data_t *gpsdata,
gpsdata->gst.utctime = iso8601_to_unix(tbuf);
}
/*@+usedef@*/
-
- gpsdata->set &= ~UNION_SET;
- gpsdata->set |= GST_SET;
return 0;
}
@@ -263,7 +230,6 @@ static int json_sky_read(const char *buf, struct gps_data_t *gpsdata,
}
}
- gpsdata->set |= SATELLITE_SET;
return 0;
}
@@ -322,9 +288,6 @@ static int json_att_read(const char *buf, struct gps_data_t *gpsdata,
/*@ +fullinitblock @*/
return json_read_object(buf, json_attrs_1, endptr);
-
- gpsdata->set &= ~UNION_SET;
- gpsdata->set |= ATTITUDE_SET;
}
static int json_devicelist_read(const char *buf, struct gps_data_t *gpsdata,
@@ -376,8 +339,6 @@ static int json_devicelist_read(const char *buf, struct gps_data_t *gpsdata,
}
gpsdata->devices.time = timestamp();
- gpsdata->set &= ~UNION_SET;
- gpsdata->set |= DEVICELIST_SET;
return 0;
}
@@ -402,12 +363,8 @@ static int json_version_read(const char *buf, struct gps_data_t *gpsdata,
memset(&gpsdata->version, '\0', sizeof(gpsdata->version));
status = json_read_object(buf, json_attrs_version, endptr);
- if (status != 0)
- return status;
- gpsdata->set &= ~UNION_SET;
- gpsdata->set |= VERSION_SET;
- return 0;
+ return status;
}
static int json_error_read(const char *buf, struct gps_data_t *gpsdata,
@@ -430,9 +387,7 @@ static int json_error_read(const char *buf, struct gps_data_t *gpsdata,
if (status != 0)
return status;
- gpsdata->set &= ~UNION_SET;
- gpsdata->set |= ERROR_SET;
- return 0;
+ return status;
}
int libgps_json_unpack(const char *buf,
@@ -446,15 +401,64 @@ int libgps_json_unpack(const char *buf,
return -1;
#define STARTSWITH(str, prefix) strncmp(str, prefix, sizeof(prefix)-1)==0
if (STARTSWITH(classtag, "\"class\":\"TPV\"")) {
- return json_tpv_read(buf, gpsdata, end);
- } else if (STARTSWITH(classtag, "\"class\":\"NOISE\"")) {
- return json_noise_read(buf, gpsdata, end);
+ int status = json_tpv_read(buf, gpsdata, end);
+ gpsdata->status = STATUS_FIX;
+ gpsdata->set = STATUS_SET;
+ if (isnan(gpsdata->fix.time) == 0)
+ gpsdata->set |= TIME_SET;
+ if (isnan(gpsdata->fix.ept) == 0)
+ gpsdata->set |= TIMERR_SET;
+ if (isnan(gpsdata->fix.longitude) == 0)
+ gpsdata->set |= LATLON_SET;
+ if (isnan(gpsdata->fix.altitude) == 0)
+ gpsdata->set |= ALTITUDE_SET;
+ if (isnan(gpsdata->fix.epx) == 0 && isnan(gpsdata->fix.epy) == 0)
+ gpsdata->set |= HERR_SET;
+ if (isnan(gpsdata->fix.epv) == 0)
+ gpsdata->set |= VERR_SET;
+ if (isnan(gpsdata->fix.track) == 0)
+ gpsdata->set |= TRACK_SET;
+ if (isnan(gpsdata->fix.speed) == 0)
+ gpsdata->set |= SPEED_SET;
+ if (isnan(gpsdata->fix.climb) == 0)
+ gpsdata->set |= CLIMB_SET;
+ if (isnan(gpsdata->fix.epd) == 0)
+ gpsdata->set |= TRACKERR_SET;
+ if (isnan(gpsdata->fix.eps) == 0)
+ gpsdata->set |= SPEEDERR_SET;
+ if (isnan(gpsdata->fix.epc) == 0)
+ gpsdata->set |= CLIMBERR_SET;
+ if (isnan(gpsdata->fix.epc) == 0)
+ gpsdata->set |= CLIMBERR_SET;
+ if (gpsdata->fix.mode != MODE_NOT_SEEN)
+ gpsdata->set |= MODE_SET;
+ return status;
+ } else if (STARTSWITH(classtag, "\"class\":\"GST\"")) {
+ status = json_noise_read(buf, gpsdata, end);
+ if (status == 0) {
+ gpsdata->set &= ~UNION_SET;
+ gpsdata->set |= GST_SET;
+ }
+ return status;
} else if (STARTSWITH(classtag, "\"class\":\"SKY\"")) {
- return json_sky_read(buf, gpsdata, end);
+ int status = json_sky_read(buf, gpsdata, end);
+ if (status == 0)
+ gpsdata->set |= SATELLITE_SET;
+ return status;
} else if (STARTSWITH(classtag, "\"class\":\"ATT\"")) {
- return json_att_read(buf, gpsdata, end);
+ status = json_att_read(buf, gpsdata, end);
+ if (status == 0) {
+ gpsdata->set &= ~UNION_SET;
+ gpsdata->set |= ATTITUDE_SET;
+ }
+ return status;
} else if (STARTSWITH(classtag, "\"class\":\"DEVICES\"")) {
- return json_devicelist_read(buf, gpsdata, end);
+ status = json_devicelist_read(buf, gpsdata, end);
+ if (status == 0) {
+ gpsdata->set &= ~UNION_SET;
+ gpsdata->set |= DEVICELIST_SET;
+ }
+ return status;
} else if (STARTSWITH(classtag, "\"class\":\"DEVICE\"")) {
status = json_device_read(buf, &gpsdata->dev, end);
if (status == 0)
@@ -462,11 +466,18 @@ int libgps_json_unpack(const char *buf,
return status;
} else if (STARTSWITH(classtag, "\"class\":\"WATCH\"")) {
status = json_watch_read(buf, &gpsdata->policy, end);
- if (status == 0)
+ if (status == 0) {
+ gpsdata->set &= ~UNION_SET;
gpsdata->set |= POLICY_SET;
+ }
return status;
} else if (STARTSWITH(classtag, "\"class\":\"VERSION\"")) {
- return json_version_read(buf, gpsdata, end);
+ status = json_version_read(buf, gpsdata, end);
+ if (status == 0) {
+ gpsdata->set &= ~UNION_SET;
+ gpsdata->set |= VERSION_SET;
+ }
+ return status;
#ifdef RTCM104V2_ENABLE
} else if (STARTSWITH(classtag, "\"class\":\"RTCM2\"")) {
status = json_rtcm2_read(buf,
@@ -490,7 +501,12 @@ int libgps_json_unpack(const char *buf,
return status;
#endif /* AIVDM_ENABLE */
} else if (STARTSWITH(classtag, "\"class\":\"ERROR\"")) {
- return json_error_read(buf, gpsdata, end);
+ status = json_error_read(buf, gpsdata, end);
+ if (status == 0) {
+ gpsdata->set &= ~UNION_SET;
+ gpsdata->set |= ERROR_SET;
+ }
+ return status;
} else
return -1;
#undef STARTSWITH
diff --git a/test/clientlib/multipacket.log.chk b/test/clientlib/multipacket.log.chk
index 84a9a2ca..cc1b4904 100644
--- a/test/clientlib/multipacket.log.chk
+++ b/test/clientlib/multipacket.log.chk
@@ -1,4 +1,2 @@
-flags: (0x20100000) {DEVICELIST|POLICY}
+flags: (0x20000000) {POLICY}
POLICY: watcher=true nmea=false raw=0 scaled=false timing=false, devpath=
-DEVICELIST:1 devices:
-1: path='/dev/ttyS0' driver='SiRF binary'