1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/*
* Copyright (C) 2010 Eric S. Raymond.
*
* This software is distributed under a BSD-style license. See the
* file "COPYING" in the top-level directory of the distribution for details.
*
*/
/* This simple program shows the basic functionality of the C++ wrapper class */
#include <iostream>
#include "libgpsmm.h"
using namespace std;
/*
* We should get libgps_dump_state() from the client library, but
* scons has a bug; we can't get it to add -lgps to the link line,
* apparently because it doesn't honor parse_flags on a Program()
* build of a C++ file.
*/
static void libgps_dump_state(struct gps_data_t *collect)
{
/* no need to dump the entire state, this is a sanity check */
#ifndef USE_QT
/* will fail on a 32-bit macine */
(void)fprintf(stdout, "flags: (0x%04x) %s\n",
(unsigned int)collect->set, gps_maskdump(collect->set));
#endif
if (collect->set & ONLINE_SET)
(void)fprintf(stdout, "ONLINE: %lf\n", collect->online);
if (collect->set & TIME_SET)
(void)fprintf(stdout, "TIME: %lf\n", collect->fix.time);
if (collect->set & LATLON_SET)
(void)fprintf(stdout, "LATLON: lat/lon: %lf %lf\n",
collect->fix.latitude, collect->fix.longitude);
if (collect->set & ALTITUDE_SET)
(void)fprintf(stdout, "ALTITUDE: altitude: %lf U: climb: %lf\n",
collect->fix.altitude, collect->fix.climb);
if (collect->set & SPEED_SET)
(void)fprintf(stdout, "SPEED: %lf\n", collect->fix.speed);
if (collect->set & TRACK_SET)
(void)fprintf(stdout, "TRACK: track: %lf\n", collect->fix.track);
if (collect->set & CLIMB_SET)
(void)fprintf(stdout, "CLIMB: climb: %lf\n", collect->fix.climb);
if (collect->set & STATUS_SET)
(void)fprintf(stdout, "STATUS: status: %d\n", collect->status);
if (collect->set & MODE_SET)
(void)fprintf(stdout, "MODE: mode: %d\n", collect->fix.mode);
if (collect->set & DOP_SET)
(void)fprintf(stdout,
"DOP: satellites %d, pdop=%lf, hdop=%lf, vdop=%lf\n",
collect->satellites_used, collect->dop.pdop,
collect->dop.hdop, collect->dop.vdop);
if (collect->set & VERSION_SET)
(void)fprintf(stdout, "VERSION: release=%s rev=%s proto=%d.%d\n",
collect->version.release,
collect->version.rev,
collect->version.proto_major,
collect->version.proto_minor);
if (collect->set & POLICY_SET)
(void)fprintf(stdout,
"POLICY: watcher=%s nmea=%s raw=%d scaled=%s timing=%s, devpath=%s\n",
collect->policy.watcher ? "true" : "false",
collect->policy.nmea ? "true" : "false",
collect->policy.raw,
collect->policy.scaled ? "true" : "false",
collect->policy.timing ? "true" : "false",
collect->policy.devpath);
if (collect->set & SATELLITE_SET) {
int i;
(void)fprintf(stdout, "SKY: satellites in view: %d\n",
collect->satellites_visible);
for (i = 0; i < collect->satellites_visible; i++) {
(void)fprintf(stdout, " %2.2d: %2.2d %3.3d %3.0f %c\n",
collect->PRN[i], collect->elevation[i],
collect->azimuth[i], collect->ss[i],
collect->used[i] ? 'Y' : 'N');
}
}
if (collect->set & DEVICE_SET)
(void)fprintf(stdout, "DEVICE: Device is '%s', driver is '%s'\n",
collect->dev.path, collect->dev.driver);
#ifdef OLDSTYLE_ENABLE
if (collect->set & DEVICEID_SET)
(void)fprintf(stdout, "GPSD ID is %s\n", collect->dev.subtype);
#endif /* OLDSTYLE_ENABLE */
if (collect->set & DEVICELIST_SET) {
int i;
(void)fprintf(stdout, "DEVICELIST:%d devices:\n",
collect->devices.ndevices);
for (i = 0; i < collect->devices.ndevices; i++) {
(void)fprintf(stdout, "%d: path='%s' driver='%s'\n",
collect->devices.ndevices,
collect->devices.list[i].path,
collect->devices.list[i].driver);
}
}
}
int main(void)
{
gpsmm gps_rec("localhost", DEFAULT_GPSD_PORT);
if (gps_rec.stream(WATCH_ENABLE|WATCH_JSON) == NULL) {
cerr << "No GPSD running.\n";
return 1;
}
for (;;) {
struct gps_data_t* newdata;
if (!gps_rec.waiting(5000000))
continue;
if ((newdata = gps_rec.read()) == NULL) {
cerr << "Read error.\n";
return 1;
} else {
libgps_dump_state(newdata);
}
}
cout << "Exiting\n";
return 0;
}
|