summaryrefslogtreecommitdiff
path: root/libgps_json.c
diff options
context:
space:
mode:
authorMichael Brown <mbrown@fensystems.co.uk>2016-02-03 22:40:23 +0000
committerEric S. Raymond <esr@thyrsus.com>2016-02-09 16:04:52 -0500
commit6a94e2254d02bc4d9e1d7d4015204c32855e8316 (patch)
tree4fd74d260c2abf9e58709e769a937e32ffad8778 /libgps_json.c
parentd019151fc5ce02cbaf4ae56556614d320eb80347 (diff)
downloadgpsd-6a94e2254d02bc4d9e1d7d4015204c32855e8316.tar.gz
Add concept of a GPS-disciplined oscillator
Signed-off-by: Michael Brown <mbrown@fensystems.co.uk>
Diffstat (limited to 'libgps_json.c')
-rw-r--r--libgps_json.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/libgps_json.c b/libgps_json.c
index 7ebb0f78..1d751682 100644
--- a/libgps_json.c
+++ b/libgps_json.c
@@ -395,6 +395,40 @@ int json_pps_read(const char *buf, struct gps_data_t *gpsdata,
return status;
}
+int json_oscillator_read(const char *buf, struct gps_data_t *gpsdata,
+ const char **endptr)
+{
+ bool running = false, reference = false, disciplined = false;
+ int delta = 0;
+ const struct json_attr_t json_attrs_osc[] = {
+ /* *INDENT-OFF* */
+ {"class", t_check, .dflt.check = "OSC"},
+ {"device", t_string, .addr.string = gpsdata->dev.path,
+ .len = sizeof(gpsdata->dev.path)},
+ {"running", t_boolean, .addr.boolean = &running,
+ .dflt.boolean = false},
+ {"reference", t_boolean, .addr.boolean = &reference,
+ .dflt.boolean = false},
+ {"disciplined", t_boolean, .addr.boolean = &disciplined,
+ .dflt.boolean = false},
+ {"delta", t_integer, .addr.integer = &delta,
+ .dflt.integer = 0},
+ {NULL},
+ /* *INDENT-ON* */
+ };
+ int status;
+
+ memset(&gpsdata->osc, '\0', sizeof(gpsdata->osc));
+ status = json_read_object(buf, json_attrs_osc, endptr);
+
+ gpsdata->osc.running = running;
+ gpsdata->osc.reference = reference;
+ gpsdata->osc.disciplined = disciplined;
+ gpsdata->osc.delta = delta;
+
+ return status;
+}
+
int libgps_json_unpack(const char *buf,
struct gps_data_t *gpsdata, const char **end)
/* the only entry point - unpack a JSON object into gpsdata_t substructures */
@@ -536,6 +570,13 @@ int libgps_json_unpack(const char *buf,
gpsdata->set |= PPS_SET;
}
return status;
+ } else if (str_starts_with(classtag, "\"class\":\"OSC\"")) {
+ status = json_oscillator_read(buf, gpsdata, end);
+ if (status == 0) {
+ gpsdata->set &= ~UNION_SET;
+ gpsdata->set |= OSCILLATOR_SET;
+ }
+ return status;
} else
return -1;
}