diff options
author | Michael Brown <mbrown@fensystems.co.uk> | 2016-02-03 22:40:23 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2016-02-09 16:04:52 -0500 |
commit | 6a94e2254d02bc4d9e1d7d4015204c32855e8316 (patch) | |
tree | 4fd74d260c2abf9e58709e769a937e32ffad8778 /libgps_json.c | |
parent | d019151fc5ce02cbaf4ae56556614d320eb80347 (diff) | |
download | gpsd-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.c | 41 |
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; } |