static void gpsd_parse( peerT * const peer , const l_fp * const rtime) { clockprocT * const pp = peer->procptr; gpsd_unitT * const up = (gpsd_unitT *)pp->unitptr; json_ctx jctx; const char * clsid; l_fp tmpfp; DPRINTF(2, ("GPSD_JSON(%d): gpsd_parse: time %s '%s'\n", up->unit, ulfptoa(rtime, 6), up->buffer)); /* See if we can grab anything potentially useful */ if (!json_parse_record(&jctx, up->buffer)) return; /* Now dispatch over the objects we know */ clsid = json_object_lookup_string_default( &jctx, 0, "class", "-bad-repy-"); up->tc_recv += 1; if (!strcmp("VERSION", clsid)) process_version(peer, &jctx, rtime); else if (!strcmp("TPV", clsid)) process_tpv(peer, &jctx, rtime); else if (!strcmp("PPS", clsid)) process_pps(peer, &jctx, rtime); else if (!strcmp("WATCH", clsid)) process_watch(peer, &jctx, rtime); else return; /* nothing we know about... */ /* now aggregate TPV and PPS -- no PPS? just use TPV...*/ if (up->fl_tpv) { /* TODO: also check remote receive time stamps */ tmpfp = up->tpv_local; L_SUB(&tmpfp, &up->pps_local); if (up->fl_pps && 0 == tmpfp.l_ui) { refclock_process_offset( pp, up->tpv_stamp, up->pps_recvt, 0.0); if (up->ppscount < PPS_MAXCOUNT) up->ppscount += 1; } else { refclock_process_offset( pp, up->tpv_stamp, up->tpv_recvt, 0.0); if (up->ppscount > 0) up->ppscount -= 1; } up->fl_pps = 0; up->fl_tpv = 0; up->tc_good += 1; } }
static void process_watch_write(int sock, void *eloop_ctx, void *sock_ctx) { process_watch(eloop_ctx, sock_ctx, EVENT_TYPE_WRITE); }
static void process_watch_read(int sock, void *eloop_ctx, void *sock_ctx) { process_watch(eloop_ctx, sock_ctx, EVENT_TYPE_READ); }
static void process_watch_exception(int sock, void *eloop_ctx, void *sock_ctx) { process_watch(eloop_ctx, sock_ctx, EVENT_TYPE_EXCEPTION); }