summaryrefslogtreecommitdiff
path: root/src/gypsy-client.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gypsy-client.c')
-rw-r--r--src/gypsy-client.c540
1 files changed, 437 insertions, 103 deletions
diff --git a/src/gypsy-client.c b/src/gypsy-client.c
index 4951466..52dc1f6 100644
--- a/src/gypsy-client.c
+++ b/src/gypsy-client.c
@@ -8,6 +8,21 @@
* Author: Iain Holmes <iain@gnome.org>
* Copyright (C) 2007 Iain Holmes
* Copyright (C) 2007 Openedhand Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
*/
/*
@@ -19,6 +34,7 @@
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
+#include <stdlib.h>
#include <errno.h>
#include <termios.h>
@@ -40,7 +56,10 @@
#include "gypsy-client.h"
#include "gypsy-marshal-internal.h"
+#include "nmea.h"
#include "nmea-parser.h"
+#include "garmin.h"
+#include "nmea-gen.h"
#define GYPSY_ERROR g_quark_from_static_string ("gypsy-error")
@@ -48,17 +67,20 @@
extern char* nmea_log;
#define READ_BUFFER_SIZE 1024
+
typedef struct _GypsyClientPrivate {
+
char *device_path; /* Device path of our GPS */
- int fd; /* File descriptor used to read from the GPS */
+ int fd; /* File descriptor used to read from the GPS */
GIOChannel *channel; /* The channel we talk to the GPS on */
- GIOChannel *debug_log; /* The channel to write the NMEA to, or NULL if
- debugging is off */
+ GIOChannel *debug_log; /* The channel to write the NMEA to,
+ or NULL if debugging is off */
+
guint32 error_id, connect_id, input_id;
- char sentence[READ_BUFFER_SIZE + 1]; /* This is for building the
- NMEA sentence */
+ char sentence[READ_BUFFER_SIZE + 1]; /* This is for building
+ the NMEA sentence */
int chars_in_buffer; /* How many characters are in the buffer */
NMEAParseContext *ctxt;
@@ -81,19 +103,18 @@ typedef struct _GypsyClientPrivate {
double pdop;
double hdop;
double vdop;
-
+
/* Course details */
CourseFields course_fields;
double speed;
double direction;
double climb;
- /* The confirmed satellites */
- int sat_count; /* Number of satellites */
- GypsyClientSatellite satellites[MAX_SATELLITES];
-
- int new_sat_count; /* Number of satellites */
- GypsyClientSatellite new_satellites[MAX_SATELLITES];
+ /* Satellite details */
+ int sat_count; /* The known confirmed satellites */
+ GypsyClientSatellite satellites[MAX_SAT_SVID];
+ int new_sat_count; /* New unconfirmed satellites */
+ GypsyClientSatellite new_satellites[MAX_SAT_SVID];
} GypsyClientPrivate;
enum {
@@ -131,10 +152,10 @@ static gboolean gypsy_client_get_connection_status (GypsyClient *client,
GError **error);
static gboolean gypsy_client_get_accuracy (GypsyClient *client,
int *fields_OUT,
- double *pdop_OUT,
- double *hdop_OUT,
- double *vdop_OUT,
- GError **error);
+ double *pdop_OUT,
+ double *hdop_OUT,
+ double *vdop_OUT,
+ GError **error);
static gboolean gypsy_client_get_position (GypsyClient *client,
int *fields_OUT,
int *timestamp_OUT,
@@ -155,8 +176,14 @@ static gboolean gypsy_client_get_satellites (GypsyClient *client,
static gboolean gypsy_client_get_time (GypsyClient *client,
int *timestamp_OUT,
GError **error);
+
#include "gypsy-client-glue.h"
+/* used for Garmin -> NMEA translation */
+D800_Pvt_Data_Type lastpvt;
+cpo_sat_data lastsatdata[SAT_MAX_COUNT];
+int satdata_valid = 0;
+
static void
shutdown_connection (GypsyClient *client)
{
@@ -178,7 +205,7 @@ shutdown_connection (GypsyClient *client)
g_source_remove (priv->input_id);
priv->input_id = 0;
}
-
+
if (priv->fd > 0) {
close (priv->fd);
priv->fd = -1;
@@ -218,6 +245,147 @@ gps_channel_error (GIOChannel *channel,
}
static gboolean
+gps_channel_garmin_input (GIOChannel *channel,
+ GIOCondition condition,
+ gpointer userdata)
+{
+ GypsyClientPrivate *priv;
+ GIOStatus status;
+ char *buf;
+ gsize chars_left_in_buffer;
+ gsize chars_read;
+ GError *error = NULL;
+
+ int pktlen;
+ char nmeabuf[256];
+
+ priv = GET_PRIVATE (userdata);
+
+ /* set up for the next read */
+ buf = priv->sentence + priv->chars_in_buffer;
+ chars_left_in_buffer = READ_BUFFER_SIZE - priv->chars_in_buffer;
+
+ status = g_io_channel_read_chars (priv->channel,
+ buf,
+ chars_left_in_buffer,
+ &chars_read,
+ &error);
+
+ if (priv->debug_log) {
+ g_io_channel_write_chars(priv->debug_log, buf, chars_read, NULL, NULL);
+ }
+
+ if (status == G_IO_STATUS_NORMAL) {
+ /* update the count of how much we've read
+ of the current packet */
+ priv->chars_in_buffer += chars_read;
+
+ /* get a pointer to our packet */
+ G_Packet_t * pGpkt = (G_Packet_t*)priv->sentence;
+
+ /* check that we have at least enough for the packet header
+ and the packet data; we could conceivably have multiple
+ packets in the buffer between reads */
+
+ while ((priv->chars_in_buffer >= GARMIN_HEADER_SIZE) &&
+ (priv->chars_in_buffer >= (pktlen = GARMIN_HEADER_SIZE + pGpkt->mDataSize))) {
+ char *eos;
+
+ /*g_debug("PacketId: %d pktlen = %d",
+ pGpkt->mPacketId, pktlen);*/
+
+ if (pGpkt->mPacketId == Pid_Pvt_Data) {
+ memcpy(&lastpvt, pGpkt->mData, sizeof(lastpvt));
+
+ /* A single Pvt_Data packet translates
+ into 4 NMEA sentences. */
+
+ if (nmea_gpgga(&lastpvt, satdata_valid ? lastsatdata : NULL, nmeabuf) == 0) {
+ *(strchr (nmeabuf, '\r')) = '\0';
+ g_debug ("NMEA sentence: %s", nmeabuf);
+ if (nmea_parse_sentence (priv->ctxt, nmeabuf, NULL) == FALSE) {
+ g_debug ("Invalid NMEA sentence: %s", nmeabuf);
+ }
+ }
+
+ if (nmea_gprmc(&lastpvt, nmeabuf) == 0) {
+ *(strchr (nmeabuf, '\r')) = '\0';
+ g_debug ("NMEA sentence: %s", nmeabuf);
+ if (nmea_parse_sentence (priv->ctxt, nmeabuf, NULL) == FALSE) {
+ g_debug ("Invalid NMEA sentence: %s", nmeabuf);
+ }
+ }
+
+ if (nmea_gpgll(&lastpvt, nmeabuf) == 0) {
+ *(strchr (nmeabuf, '\r')) = '\0';
+ g_debug ("NMEA sentence: %s", nmeabuf);
+ if (nmea_parse_sentence (priv->ctxt, nmeabuf, NULL) == FALSE) {
+ g_debug ("Invalid NMEA sentence: %s", nmeabuf);
+ }
+ }
+
+ if (nmea_gpgsa(&lastpvt, satdata_valid ? lastsatdata : NULL, nmeabuf) == 0) {
+ *(strchr (nmeabuf, '\r')) = '\0';
+ g_debug ("NMEA sentence: %s", nmeabuf);
+ if (nmea_parse_sentence (priv->ctxt, nmeabuf, NULL) == FALSE) {
+ g_debug ("Invalid NMEA sentence: %s", nmeabuf);
+ }
+ }
+ } else if (pGpkt->mPacketId == Pid_SatData_Record) {
+ memcpy(lastsatdata, pGpkt->mData,
+ sizeof(lastsatdata));
+
+ satdata_valid = 1;
+
+ if (nmea_gpgsv(lastsatdata, nmeabuf) == 0) {
+ /*
+ * The Garmin SatData record translates to multiple GPGSV sentences,
+ * but the parser only handles one sentence per buffer so we have to
+ * feed them in one at a time.
+ */
+
+ char *nmeabufptr = nmeabuf;
+ int length;
+
+ /* NMEA sentences end with <CR><LF>, so find the <CR> at the end of each sentence */
+ while ((eos = strchr (nmeabufptr, '\r'))) {
+ /* Accounf for <LF> */
+ length = (eos - nmeabufptr) + 2;
+ if (length > 1) {
+ /* terminate the string at the <CR> */
+ *eos = '\0';
+
+ g_debug ("NMEA sentence: %s", nmeabufptr);
+ if (nmea_parse_sentence (priv->ctxt, nmeabufptr, NULL) == FALSE)
+ g_debug ("Invalid sentence: %s", nmeabufptr);
+ }
+
+ if (length > 0) {
+ /* point to the next sentence in the buffer */
+ nmeabufptr += length;
+ }
+ }
+ }
+ } else {
+ g_debug ("Untranslated PacketId = %d", pGpkt->mPacketId);
+ }
+
+ /* now that we're done with this packet,
+ move any remaining data up to the
+ beginning of the buffer */
+ memmove (priv->sentence, priv->sentence + pktlen,
+ priv->chars_in_buffer - pktlen);
+ priv->chars_in_buffer -= pktlen;
+ }
+ } else {
+ g_warning ("Read error: %s", g_strerror (errno));
+ g_set_error (&error, GYPSY_ERROR, errno, g_strerror (errno));
+ }
+
+ return TRUE;
+}
+
+static gboolean
gps_channel_input (GIOChannel *channel,
GIOCondition condition,
gpointer userdata)
@@ -230,57 +398,190 @@ gps_channel_input (GIOChannel *channel,
priv = GET_PRIVATE (userdata);
+ /* set up for the next read */
buf = priv->sentence + priv->chars_in_buffer;
chars_left_in_buffer = READ_BUFFER_SIZE - priv->chars_in_buffer;
- status = g_io_channel_read_chars (priv->channel, buf,
+ status = g_io_channel_read_chars (priv->channel,
+ buf,
chars_left_in_buffer,
- &chars_read, &error);
+ &chars_read,
+ NULL);
if (priv->debug_log) {
- g_io_channel_write_chars
- (priv->debug_log, buf, chars_read, NULL, NULL);
+ g_io_channel_write_chars (priv->debug_log, buf,
+ chars_read, NULL, NULL);
}
if (status == G_IO_STATUS_NORMAL) {
char *eos = NULL;
- int length = 0;
- priv->chars_in_buffer += chars_read;
+ int length;
- /* Append a \0 to treat as a string, the \0 will be overwritten
- in the next call to g_io_channel_read_chars */
- *(priv->sentence + priv->chars_in_buffer) = '\0';
+ priv->chars_in_buffer += chars_read;
- /* g_debug ("Buffer: %s", priv->sentence); */
-
- /* NMEA sentences end with <LF>
- Get <LF> at the end of the sentence */
- while ((eos = strchr (priv->sentence, '\n'))) {
- length = (eos - priv->sentence) + 1;
+ /* Append a \0 to treat as a string (so we don't run off the end of valid data);
+ the \0 will be overwritten in the next call to g_io_channel_read_chars */
+ *(priv->sentence + priv->chars_in_buffer) = '\0';
+ /* NMEA sentences end with <CR><LF>, so find the <CR> at the end of each sentence */
+ while ((eos = strchr (priv->sentence, '\r'))) {
+ /* Account for <LF> */
+ length = (eos - priv->sentence) + 2;
if (length > 1) {
- /* Remove the <LF> */
+ /* terminate the string at the <CR> */
*eos = '\0';
-
- if (nmea_parse_sentence (priv->ctxt,
- priv->sentence,
- NULL) == FALSE) {
- g_debug ("Invalid sentence: %s.", priv->sentence);
+
+ g_debug ("NMEA sentence: %s", priv->sentence);
+ if (nmea_parse_sentence (priv->ctxt, priv->sentence, NULL) == FALSE) {
+ g_debug ("Invalid sentence: %s", priv->sentence);
}
}
-
- /* Only need to remove sentence is there was something
- in the first place */
+
if (length > 0) {
/* Remove the sentence from the builder and
move the rest up including terminating 0 */
- memmove (priv->sentence, eos + 1,
- (priv->chars_in_buffer - length) + 1);
+ memmove (priv->sentence, eos + 2, (priv->chars_in_buffer - length) + 1);
priv->chars_in_buffer -= length;
}
}
+ } else {
+ g_warning ("Read error: %s", g_strerror (errno));
+ g_set_error (&error, GYPSY_ERROR, errno, g_strerror (errno));
}
-
+
+ return TRUE;
+}
+
+static int
+garmin_usb_device (GIOChannel *channel,
+ char *devpath)
+{
+ GIOStatus status;
+ u_int32_t privcmd[GARMIN_PRIV_PKT_MAX_SIZE];
+ gsize chars_written;
+ gsize chars_read;
+ GError *error = NULL;
+
+ /*
+ * Since the Garmin driver sets up the device at /dev/ttyUSB<n> it seems
+ * to be a pretty good bet that this check will be valid.
+ */
+
+ if (! strcmp (devpath, "/dev/ttyUSB0")) {
+
+ /* query the device driver to see if it is Garmin */
+
+ privcmd[0] = GARMIN_LAYERID_PRIVATE; // LayerId
+ privcmd[1] = GARMIN_PRIV_PKTID_INFO_REQ; // PacketId
+ privcmd[2] = 0; // DataLength
+
+ status = g_io_channel_write_chars (channel,
+ (gchar*)privcmd,
+ 12,
+ &chars_written,
+ NULL);
+
+ if (status != G_IO_STATUS_NORMAL) {
+ g_warning ("GARMIN: Error writing \"Private Info Req\" packet:\n%s",
+ g_strerror (errno));
+ g_set_error (&error, GYPSY_ERROR, errno,
+ g_strerror (errno));
+ return -1;
+ }
+
+ g_io_channel_flush (channel, NULL);
+
+ /* check the response */
+
+ status = g_io_channel_read_chars (channel,
+ (gchar*)privcmd,
+ GARMIN_PRIV_PKT_INFO_RESP_SIZE,
+ &chars_read,
+ NULL);
+
+ if (status != G_IO_STATUS_NORMAL) {
+ g_warning ("GARMIN: Error reading \"Private Info Resp\" packet:\n%s", g_strerror (errno));
+ g_set_error (&error, GYPSY_ERROR, errno, g_strerror (errno));
+ return -1;
+ }
+
+ if ((privcmd[0] == GARMIN_LAYERID_PRIVATE) &&
+ (privcmd[1] == GARMIN_PRIV_PKTID_INFO_RESP)) {
+ /* we're talking to the Garmin driver */
+ g_debug ("GARMIN: device type confirmed");
+ return 1;
+ } else {
+ g_warning ("GARMIN: \"Private Info Resp\" packet data not recognized");
+ g_set_error (&error, GYPSY_ERROR, -1, "Cannot identify device %s", devpath);
+ return -1;
+ }
+ } else {
+ return 0;
+ }
+}
+
+static gboolean
+garmin_init (GIOChannel *channel)
+{
+ GIOStatus status;
+ u_int32_t privcmd[GARMIN_PRIV_PKT_MAX_SIZE];
+ gsize chars_written;
+ GError *error = NULL;
+ G_Packet_t *pvtpack;
+
+ g_debug ("GARMIN: initialize device");
+
+ /* set the device driver mode to "native" */
+ /* (without this, the device will not talk to us) */
+
+ privcmd[0] = GARMIN_LAYERID_PRIVATE; /* LayerId */
+ privcmd[1] = GARMIN_PRIV_PKTID_SET_MODE; /* PacketId */
+ privcmd[2] = 4; /* DataLength */
+ privcmd[3] = GARMIN_MODE_NATIVE; /* data */
+
+ status = g_io_channel_write_chars (channel,
+ (char*)privcmd,
+ 16,
+ &chars_written,
+ NULL);
+
+ if (status != G_IO_STATUS_NORMAL) {
+ g_warning ("GARMIN: Error writing \"Private Set Mode\" packet:\n%s", g_strerror (errno));
+ g_set_error (&error, GYPSY_ERROR, errno, g_strerror (errno));
+ return FALSE;
+ }
+
+ g_io_channel_flush (channel, NULL);
+
+ /* start PVT transfers */
+
+ pvtpack = (G_Packet_t*)malloc(sizeof(G_Packet_t)+1);
+
+ pvtpack->mPacketType = LAYERID_APPL;
+ pvtpack->mReserved1 = 0;
+ pvtpack->mReserved2 = 0;
+ pvtpack->mPacketId = Pid_Command_Data;
+ pvtpack->mReserved3 = 0;
+ pvtpack->mDataSize = 2;
+ pvtpack->mData[0] = Cmnd_Start_Pvt_Data;
+ pvtpack->mData[1] = 0;
+
+ status = g_io_channel_write_chars (channel,
+ (gchar*)pvtpack,
+ GARMIN_HEADER_SIZE + pvtpack->mDataSize,
+ &chars_written,
+ NULL);
+
+ if (status != G_IO_STATUS_NORMAL) {
+ g_warning ("GARMIN: Error writing \"Start PVT Transfer\" packet:\n%s", g_strerror (errno));
+ g_set_error (&error, GYPSY_ERROR, errno, g_strerror (errno));
+ return FALSE;
+ }
+
+ g_io_channel_flush (channel, NULL);
+
+ free((void*)pvtpack);
+
return TRUE;
}
@@ -295,13 +596,35 @@ gps_channel_connect (GIOChannel *channel,
g_debug ("GPS channel can connect");
- priv->input_id = g_io_add_watch_full (priv->channel,
- G_PRIORITY_HIGH_IDLE,
- G_IO_IN | G_IO_PRI,
- gps_channel_input, userdata,
- NULL);
+ switch (garmin_usb_device (channel, priv->device_path)) {
+ case 1:
+ /* the device *IS* a Garmin -- we must do translation to NMEA */
+ garmin_init (channel);
+ priv->input_id = g_io_add_watch_full (priv->channel,
+ G_PRIORITY_HIGH_IDLE,
+ G_IO_IN | G_IO_PRI,
+ gps_channel_garmin_input,
+ userdata, NULL);
+ break;
+
+ case 0:
+ /* the device is *NOT* a Garmin -- the data is NMEA */
+ priv->input_id = g_io_add_watch_full (priv->channel,
+ G_PRIORITY_HIGH_IDLE,
+ G_IO_IN | G_IO_PRI,
+ gps_channel_input,
+ userdata, NULL);
+ break;
+
+ case -1:
+ /* we got an error trying to figure it out */
+ g_warning ("Error determining device type for %s",
+ priv->device_path);
+ /* g_set_error () has already been called */
+ break;
+ }
- g_signal_emit (G_OBJECT (userdata), signals[CONNECTION_CHANGED],
+ g_signal_emit (G_OBJECT (userdata), signals[CONNECTION_CHANGED],
0, TRUE);
priv->connect_id = 0;
@@ -313,49 +636,45 @@ gypsy_client_start (GypsyClient *client,
GError **error)
{
GypsyClientPrivate *priv;
+ GIOStatus status;
priv = GET_PRIVATE (client);
- g_debug ("Starting connection to %s", priv->device_path);
+ priv->chars_in_buffer = 0;
if (priv->fd != -1) {
g_debug ("Connection to %s already started", priv->device_path);
return TRUE;
}
+ else {
+ g_debug ("Starting connection to %s", priv->device_path);
+ }
/* Open a connection to our device */
+
+ /* we assume that a device path starting with slash is a tty device */
if (priv->device_path[0] == '/') {
+
struct termios term;
- priv->fd = open (priv->device_path, O_RDONLY | O_NOCTTY | O_NONBLOCK);
-
+ priv->fd = open (priv->device_path, O_RDWR | O_NOCTTY | O_NONBLOCK);
+ if (priv->fd == -1) {
+ g_warning ("Error opening device %s: %s", priv->device_path, g_strerror (errno));
+ g_set_error (error, GYPSY_ERROR, errno, g_strerror (errno));
+ return FALSE;
+ }
+
if (tcgetattr (priv->fd, &term) < 0) {
- g_warning ("Error getting term");
- g_set_error (error, GYPSY_ERROR, errno,
- g_strerror (errno));
+ g_warning ("Error getting term: %s", g_strerror (errno));
+ g_set_error (error, GYPSY_ERROR, errno, g_strerror (errno));
return FALSE;
}
-
- /* According to NMEA-0183 GPS serial configuration is:
- * Baud Rate: 4800 bps
- * Data bits: 8
- * Parity: none
- * Stop Bits: 1 (or more)
- * Handshake: none
- */
- term.c_cflag &= ~(PARENB | PARODD | CRTSCTS);
- term.c_cflag |= CREAD | CLOCAL;
-
- term.c_iflag &= ~(PARMRK | INPCK);
- term.c_cflag &= ~(CSIZE | CSTOPB | PARENB | PARODD);
- term.c_cflag |= CS8;
-
- cfsetspeed (&term, B4800);
-
- if (tcsetattr (priv->fd, TCSANOW, &term) < 0) {
- g_warning ("Error setting term");
- g_set_error (error, GYPSY_ERROR, errno,
- g_strerror (errno));
+
+ cfmakeraw(&term);
+
+ if (tcsetattr (priv->fd, TCIOFLUSH, &term) < 0) {
+ g_warning ("Error setting term: %s", g_strerror (errno));
+ g_set_error (error, GYPSY_ERROR, errno, g_strerror (errno));
return FALSE;
}
} else {
@@ -367,12 +686,6 @@ gypsy_client_start (GypsyClient *client,
#endif
}
- if (priv->fd == -1) {
- /* Error */
- g_set_error (error, GYPSY_ERROR, errno, g_strerror (errno));
- return FALSE;
- }
-
if (nmea_log) {
char *device, *filename;
device = g_path_get_basename (priv->device_path);
@@ -384,16 +697,38 @@ gypsy_client_start (GypsyClient *client,
g_free (filename);
}
+ /* Set up the IO Channel */
+
priv->channel = g_io_channel_unix_new (priv->fd);
- g_io_channel_set_flags (priv->channel, G_IO_FLAG_NONBLOCK, NULL);
+
+ status = g_io_channel_set_flags (priv->channel,
+ G_IO_FLAG_NONBLOCK | G_IO_FLAG_IS_READABLE | G_IO_FLAG_IS_WRITEABLE,
+ NULL);
+
+ if (status != G_IO_STATUS_NORMAL) {
+ g_warning ("Error setting flags: %s", g_strerror (errno));
+ g_set_error (error, GYPSY_ERROR, errno, g_strerror (errno));
+ return FALSE;
+ }
+
+ /* set encoding to NULL so we can do reads and writes */
+ status = g_io_channel_set_encoding (priv->channel, NULL, NULL);
+
+ if (status != G_IO_STATUS_NORMAL) {
+ g_warning ("Error setting encoding: %s", g_strerror (errno));
+ g_set_error (error, GYPSY_ERROR, errno, g_strerror (errno));
+ return FALSE;
+ }
+
priv->error_id = g_io_add_watch_full (priv->channel,
G_PRIORITY_HIGH_IDLE,
G_IO_ERR | G_IO_HUP,
gps_channel_error, client, NULL);
+
priv->connect_id = g_io_add_watch_full (priv->channel,
G_PRIORITY_HIGH_IDLE,
- G_IO_OUT, gps_channel_connect,
- client, NULL);
+ G_IO_OUT,
+ gps_channel_connect, client, NULL);
#ifdef HAVE_BLUEZ
/* Now connect to the bluetooth socket */
@@ -404,8 +739,7 @@ gypsy_client_start (GypsyClient *client,
addr.rc_channel = (uint8_t) 1;
str2ba(priv->device_path, &addr.rc_bdaddr);
- if (connect (priv->fd, (struct sockaddr *) &addr,
- sizeof (addr)) == -1) {
+ if (connect (priv->fd, (struct sockaddr *) &addr, sizeof (addr)) == -1) {
/* Error */
if (errno == EINPROGRESS || errno == EAGAIN) {
return TRUE;
@@ -419,7 +753,7 @@ gypsy_client_start (GypsyClient *client,
g_source_remove (priv->connect_id);
priv->connect_id = 0;
- g_io_channel_unref (priv->channel);
+ g_io_channel_unref (priv->channel);
priv->channel = NULL;
close (priv->fd);
@@ -552,19 +886,19 @@ gypsy_client_get_satellites (GypsyClient *client,
priv = GET_PRIVATE (client);
sat_array = g_ptr_array_new ();
-
+
for (i = 0; i < priv->sat_count; i++) {
GValue sat_struct = {0, };
GypsyClientSatellite *sat;
-
+
sat = &priv->satellites[i];
-
+
g_value_init (&sat_struct,
GYPSY_CLIENT_SATELLITES_CHANGED_TYPE);
g_value_take_boxed (&sat_struct,
dbus_g_type_specialized_construct
(GYPSY_CLIENT_SATELLITES_CHANGED_TYPE));
-
+
dbus_g_type_struct_set (&sat_struct,
0, sat->satellite_id,
1, sat->in_use,
@@ -577,7 +911,7 @@ gypsy_client_get_satellites (GypsyClient *client,
}
*satellites_OUT = sat_array;
-
+
return TRUE;
}
@@ -629,7 +963,7 @@ set_property (GObject *object,
switch (prop_id) {
case PROP_DEVICE:
priv->device_path = g_value_dup_string (value);
-
+
break;
default:
@@ -787,7 +1121,7 @@ gypsy_client_set_position (GypsyClient *client,
{
GypsyClientPrivate *priv;
gboolean changed = FALSE;
-
+
priv = GET_PRIVATE (client);
if (fields_set & POSITION_LATITUDE) {
@@ -846,7 +1180,7 @@ gypsy_client_set_position (GypsyClient *client,
}
}
- if (changed) {
+ if (changed) {
g_signal_emit (client, signals[POSITION_CHANGED], 0,
priv->position_fields, priv->timestamp,
priv->latitude, priv->longitude, priv->altitude);
@@ -862,7 +1196,7 @@ gypsy_client_set_course (GypsyClient *client,
{
GypsyClientPrivate *priv;
gboolean changed = FALSE;
-
+
priv = GET_PRIVATE (client);
if (fields_set & COURSE_SPEED) {
@@ -961,9 +1295,9 @@ gypsy_client_set_accuracy (GypsyClient *client,
{
GypsyClientPrivate *priv;
gboolean changed = FALSE;
-
+
priv = GET_PRIVATE (client);
-
+
if (fields_set & ACCURACY_POSITION) {
if (priv->accuracy_fields & ACCURACY_POSITION) {
if (priv->pdop != pdop) {
@@ -977,15 +1311,15 @@ gypsy_client_set_accuracy (GypsyClient *client,
}
}
- if (fields_set & ACCURACY_HORIZONAL) {
- if (priv->accuracy_fields & ACCURACY_HORIZONAL) {
+ if (fields_set & ACCURACY_HORIZONTAL) {
+ if (priv->accuracy_fields & ACCURACY_HORIZONTAL) {
if (priv->hdop != hdop) {
priv->hdop = hdop;
changed = TRUE;
}
} else {
priv->hdop = hdop;
- priv->accuracy_fields |= ACCURACY_HORIZONAL;
+ priv->accuracy_fields |= ACCURACY_HORIZONTAL;
changed = TRUE;
}
}