Bug 55533

Summary: New nmea parser leaves LF in the buffer and discards following sentences
Product: Gypsy Reporter: Christopher Vogl <habaneroeater>
Component: GeneralAssignee: iain <iain>
Status: NEW --- QA Contact:
Severity: normal    
Priority: medium    
Version: unspecified   
Hardware: ARM   
OS: Linux (All)   
Whiteboard:
i915 platform: i915 features:

Description Christopher Vogl 2012-10-02 12:42:56 UTC
gypsy_nmea_parser_received_data() in gypsy-nmea-parser.c watches out for <CR>.
NMEA sentences may come in in chunks and if the second to last chunk ends with a <CR>, the following <LF> is left in the buffer and consequently the next sentence starts with a <LF>. nmea_parse_sentence() in nmea-parser.c invalidates a sentence that does not start with '$'.
I am using a Telit UC864-G. NMEA sentences come in in several chunks and thus most of them get discarded because of that.

A solution would be to ignore a sentence with a <LF> at the beginning.
The following code works for me:

static gboolean
gypsy_nmea_parser_received_data (GypsyParser *parser,
                                 gsize        length,
                                 GError     **error)
{
    GypsyNmeaParser *nmea = GYPSY_NMEA_PARSER (parser);
    GypsyNmeaParserPrivate *priv = nmea->priv;
    char *eos = NULL;

    priv->chars_in_buffer += length;

    /* Append a '\0' to the data so we never run off the end.
       The '\0' will be overwritten by the next call to received_data */
    *(priv->buffer + priv->chars_in_buffer) = '\0';

    /* NMEA sentences end with <CR><LF>,
       so find the <LF> at the end of each sentence */
    while ((eos = strchr (priv->buffer, '\n'))) {
        int sentence_length;

        sentence_length = (eos - priv->buffer);

        if (sentence_length > 1) {
            /* terminate the string at the <CR> */
            *(eos-1) = '\0';

            g_debug ("NMEA sentence: %s", priv->buffer);
            if (nmea_parse_sentence (priv->ctxt, priv->buffer, NULL) == FALSE) {
                g_debug ("Invalid sentence: %s", priv->buffer);
            }
        }

        if (sentence_length > 0) {
            /* Remove the sentence from the buffer */
            memset (priv->buffer, 0, sentence_length + 2);
            priv->chars_in_buffer = 0;
        }
    }

    return TRUE;
}

Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.