diff -rupN orig/driver_nmea0183.c modif/driver_nmea0183.c --- orig/driver_nmea0183.c 2016-05-11 10:51:47.972318970 -0500 +++ modif/driver_nmea0183.c 2016-05-16 03:45:57.055431883 -0500 @@ -1070,6 +1070,13 @@ static gps_mask_t processPASHR(int c UNU * **************************************************************************/ +static bool startsWith(const char *pre, const char *str) +{ + size_t lenpre = strlen(pre), + lenstr = strlen(str); + return lenstr < lenpre ? false : strncmp(pre, str, lenpre) == 0; +} + /*@ -mayaliasunique @*/ gps_mask_t nmea_parse(char *sentence, struct gps_device_t * session) /* parse an NMEA sentence, unpack it into a session structure */ @@ -1115,6 +1122,7 @@ gps_mask_t nmea_parse(char *sentence, st {"GBS", 7, false, processGPGBS}, {"HDT", 1, false, processHDT}, {"DBT", 7, true, processDBT}, + {"PGLOR", 0, false, NULL}, /* ignore PGLOR data */ #ifdef TNT_ENABLE {"PTNTHTM", 9, false, processTNTHTM}, #endif /* TNT_ENABLE */ @@ -1133,6 +1141,11 @@ gps_mask_t nmea_parse(char *sentence, st char *p, *s, *e; volatile char *t; + if (startsWith("$PGLOR", sentence)) { + /* Discard PGLOR sentence */ + return ONLINE_SET; + } + /* * We've had reports that on the Garmin GPS-10 the device sometimes * (1:1000 or so) sends garbage packets that have a valid checksum diff -rupN orig/gpsd.c modif/gpsd.c --- orig/gpsd.c 2016-05-11 10:52:17.432319947 -0500 +++ modif/gpsd.c 2016-05-16 03:45:38.125432103 -0500 @@ -259,6 +259,7 @@ static void usage(void) -n = don't wait for client connects to poll GPS\n\ -N = don't go into background\n\ -F sockfile = specify control socket location\n" +" -t = device sends text data in lines that finish with \\n char\n" #ifndef FORCE_GLOBAL_ENABLE " -G = make gpsd listen on INADDR_ANY\n" #endif /* FORCE_GLOBAL_ENABLE */ @@ -1866,7 +1867,7 @@ int main(int argc, char *argv[]) context.pps_hook = ship_pps_drift_message; #endif /* PPS_ENABLE */ - while ((option = getopt(argc, argv, "F:D:S:bGhlNnP:V")) != -1) { + while ((option = getopt(argc, argv, "F:D:S:btGhlNnP:V")) != -1) { switch (option) { case 'D': context.debug = (int)strtol(optarg, 0, 0); @@ -1885,6 +1886,9 @@ int main(int argc, char *argv[]) case 'b': context.readonly = true; break; + case 't': + packet_parse_as_text(true); + break; #ifndef FORCE_GLOBAL_ENABLE case 'G': listen_global = true; diff -rupN orig/gpsd.h-tail modif/gpsd.h-tail --- orig/gpsd.h-tail 2016-05-16 03:49:49.055429196 -0500 +++ modif/gpsd.h-tail 2016-05-16 03:49:56.495429110 -0500 @@ -185,6 +185,7 @@ extern void packet_init(/address@hidden@*/struct extern void packet_reset(/address@hidden@*/struct gps_packet_t *); extern void packet_pushback(struct gps_packet_t *); extern void packet_parse(struct gps_packet_t *); +extern void packet_parse_as_text(bool value); extern ssize_t packet_get(int, struct gps_packet_t *); extern int packet_sniff(struct gps_packet_t *); #define packet_buffered_input(lexer) ((lexer)->inbuffer + (lexer)->inbuflen - (lexer)->inbufptr) diff -rupN orig/packet.c modif/packet.c --- orig/packet.c 2016-05-11 10:51:59.052319337 -0500 +++ modif/packet.c 2016-05-16 03:45:44.965432023 -0500 @@ -1997,15 +1997,57 @@ void packet_parse(struct gps_packet_t *l #undef getword +static char tmp_buffer[MAX_PACKET_LENGTH*2+1]; +static int tmp_buffer_read = 0; +static int tmp_buffer_index = 0; +static bool parse_as_text = false; + +void packet_parse_as_text(bool value) { + parse_as_text = value; +} + ssize_t packet_get(int fd, struct gps_packet_t *lexer) /* grab a packet; return -1=>I/O error, 0=>EOF, BAD_PACKET or a length */ { ssize_t recvd; + int i; /*@ -modobserver @*/ errno = 0; - recvd = read(fd, lexer->inbuffer + lexer->inbuflen, - sizeof(lexer->inbuffer) - (lexer->inbuflen)); + if (parse_as_text) { + /* Split the binary data into lines */ + recvd = 0; + for (i=lexer->inbuflen; iinbuffer); i++) { + if (tmp_buffer_index >= tmp_buffer_read) { + /* Read data from device */ + tmp_buffer_read = read(fd, tmp_buffer, sizeof(tmp_buffer)); + tmp_buffer_index = 0; + if (tmp_buffer_read < 0) { + recvd = -1; + break; + } + else + if (tmp_buffer_read == 0) { + recvd = 0; + break; + } + + } + + /* Read data from buffer */ + lexer->inbuffer[i] = tmp_buffer[tmp_buffer_index++]; + recvd++; + if (lexer->inbuffer[i] == '\n') { + break; + } + } + + } + else { + + recvd = read(fd, lexer->inbuffer + lexer->inbuflen, + sizeof(lexer->inbuffer) - (lexer->inbuflen)); + } /*@ +modobserver @*/ if (recvd == -1) { if ((errno == EAGAIN) || (errno == EINTR)) {