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
|
/*
* This file is Copyright (c) 2010 by the GPSD project
* SPDX-License-Identifier: BSD-2-clause
*/
#include "gpsd.h"
#if defined(DBUS_EXPORT_ENABLE)
#include <dbus/dbus.h>
static DBusConnection *connection = NULL;
/*
* Does what is required to initialize the dbus connection
* This is pretty basic at this point, as we don't receive commands via dbus.
* Returns 0 when everything is OK.
*/
int initialize_dbus_connection(void)
{
DBusError error;
dbus_error_init(&error);
connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
if (connection == NULL) {
dbus_error_free(&error);
/* report error */
return 1;
}
return 0;
}
void send_dbus_fix(struct gps_device_t *channel)
{
/* sends the current fix data for this channel via dbus */
struct gps_data_t *gpsdata;
struct gps_fix_t *gpsfix;
DBusMessage *message;
/*DBusMessageIter iter; */
dbus_uint32_t serial; /* collected, but not used */
char *gpsd_devname;
/* this packet format was designed before we split eph */
double eph;
/* if the connection is non existent, return without doing anything */
if (connection == NULL)
return;
gpsdata = &(channel->gpsdata);
gpsfix = &(gpsdata->fix);
/* this packet format was designed before we split eph */
eph = EMIX(gpsfix->epx, gpsfix->epy);
gpsd_devname = gpsdata->dev.path;
/* Send the named signal. */
message = dbus_message_new_signal("/org/gpsd", "org.gpsd", "fix");
dbus_message_append_args(message,
DBUS_TYPE_DOUBLE, &(gpsfix->time),
DBUS_TYPE_INT32, &(gpsfix->mode),
DBUS_TYPE_DOUBLE, &(gpsfix->ept),
DBUS_TYPE_DOUBLE, &(gpsfix->latitude),
DBUS_TYPE_DOUBLE, &(gpsfix->longitude),
DBUS_TYPE_DOUBLE, &(eph),
DBUS_TYPE_DOUBLE, &(gpsfix->altitude),
DBUS_TYPE_DOUBLE, &(gpsfix->epv),
DBUS_TYPE_DOUBLE, &(gpsfix->track),
DBUS_TYPE_DOUBLE, &(gpsfix->epd),
DBUS_TYPE_DOUBLE, &(gpsfix->speed),
DBUS_TYPE_DOUBLE, &(gpsfix->eps),
DBUS_TYPE_DOUBLE, &(gpsfix->climb),
DBUS_TYPE_DOUBLE, &(gpsfix->epc),
DBUS_TYPE_STRING, &gpsd_devname,
DBUS_TYPE_INVALID);
dbus_message_set_no_reply(message, TRUE);
dbus_connection_send(connection, message, &serial);
dbus_message_unref(message);
}
#endif /* defined(DBUS_EXPORT_ENABLE) */
|