pud: nmealib: include latest fixes
authorFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 20 Mar 2014 20:45:12 +0000 (21:45 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 20 Mar 2014 20:45:32 +0000 (21:45 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/pud/nmealib/include/nmea/parse.h
lib/pud/nmealib/include/nmea/parser.h
lib/pud/nmealib/src/parse.c
lib/pud/nmealib/src/parser.c

index 779b643..c2fb093 100644 (file)
@@ -32,11 +32,11 @@ const char * nmea_parse_sentence_has_invalid_chars(const char * s, const size_t
 
 enum nmeaPACKTYPE nmea_parse_get_sentence_type(const char *s, const int len);
 
-int nmea_parse_GPGGA(const char *s, const int len, nmeaGPGGA *pack);
-int nmea_parse_GPGSA(const char *s, const int len, nmeaGPGSA *pack);
-int nmea_parse_GPGSV(const char *s, const int len, nmeaGPGSV *pack);
-int nmea_parse_GPRMC(const char *s, const int len, nmeaGPRMC *pack);
-int nmea_parse_GPVTG(const char *s, const int len, nmeaGPVTG *pack);
+int nmea_parse_GPGGA(const char *s, const int len, bool has_checksum, nmeaGPGGA *pack);
+int nmea_parse_GPGSA(const char *s, const int len, bool has_checksum, nmeaGPGSA *pack);
+int nmea_parse_GPGSV(const char *s, const int len, bool has_checksum, nmeaGPGSV *pack);
+int nmea_parse_GPRMC(const char *s, const int len, bool has_checksum, nmeaGPRMC *pack);
+int nmea_parse_GPVTG(const char *s, const int len, bool has_checksum, nmeaGPVTG *pack);
 
 #ifdef  __cplusplus
 }
index 6aeb250..3fbc615 100644 (file)
@@ -47,6 +47,8 @@ typedef struct _sentencePARSER {
 
     char sentence_eol_chars_count;
 
+    bool has_checksum;
+
     sentence_parser_state state;
 } sentencePARSER;
 
index 203ab08..6589912 100644 (file)
@@ -320,14 +320,19 @@ enum nmeaPACKTYPE nmea_parse_get_sentence_type(const char *s, const int len) {
  *
  * @param s the string
  * @param len the length of the string
+ * @param has_checksum true when the string contains a checksum
  * @param pack a pointer to the result structure
  * @return 1 (true) - if parsed successfully or 0 (false) otherwise.
  */
-int nmea_parse_GPGGA(const char *s, const int len, nmeaGPGGA *pack) {
+int nmea_parse_GPGGA(const char *s, const int len, bool has_checksum, nmeaGPGGA *pack) {
        int token_count;
        char time_buff[NMEA_TIMEPARSE_BUF];
        size_t time_buff_len = 0;
 
+       if (!has_checksum) {
+         return 0;
+       }
+
        assert(s);
        assert(pack);
 
@@ -430,13 +435,18 @@ int nmea_parse_GPGGA(const char *s, const int len, nmeaGPGGA *pack) {
  *
  * @param s the string
  * @param len the length of the string
+ * @param has_checksum true when the string contains a checksum
  * @param pack a pointer to the result structure
  * @return 1 (true) - if parsed successfully or 0 (false) otherwise.
  */
-int nmea_parse_GPGSA(const char *s, const int len, nmeaGPGSA *pack) {
+int nmea_parse_GPGSA(const char *s, const int len, bool has_checksum, nmeaGPGSA *pack) {
        int token_count;
        int i;
 
+       if (!has_checksum) {
+         return 0;
+       }
+
        assert(s);
        assert(pack);
 
@@ -506,15 +516,20 @@ int nmea_parse_GPGSA(const char *s, const int len, nmeaGPGSA *pack) {
  *
  * @param s the string
  * @param len the length of the string
+ * @param has_checksum true when the string contains a checksum
  * @param pack a pointer to the result structure
  * @return 1 (true) - if parsed successfully or 0 (false) otherwise.
  */
-int nmea_parse_GPGSV(const char *s, const int len, nmeaGPGSV *pack) {
+int nmea_parse_GPGSV(const char *s, const int len, bool has_checksum, nmeaGPGSV *pack) {
        int token_count;
        int token_count_expected;
        int sat_count;
        int sat_counted = 0;
 
+       if (!has_checksum) {
+         return 0;
+       }
+
        assert(s);
        assert(pack);
 
@@ -588,15 +603,20 @@ int nmea_parse_GPGSV(const char *s, const int len, nmeaGPGSV *pack) {
  *
  * @param s the string
  * @param len the length of the string
+ * @param has_checksum true when the string contains a checksum
  * @param pack a pointer to the result structure
  * @return 1 (true) - if parsed successfully or 0 (false) otherwise.
  */
-int nmea_parse_GPRMC(const char *s, const int len, nmeaGPRMC *pack) {
+int nmea_parse_GPRMC(const char *s, const int len, bool has_checksum, nmeaGPRMC *pack) {
        int token_count;
        char time_buff[NMEA_TIMEPARSE_BUF];
        int date;
        size_t time_buff_len = 0;
 
+       if (!has_checksum) {
+         return 0;
+       }
+
        assert(s);
        assert(pack);
 
@@ -721,12 +741,17 @@ int nmea_parse_GPRMC(const char *s, const int len, nmeaGPRMC *pack) {
  *
  * @param s the string
  * @param len the length of the string
+ * @param has_checksum true when the string contains a checksum
  * @param pack a pointer to the result structure
  * @return 1 (true) - if parsed successfully or 0 (false) otherwise.
  */
-int nmea_parse_GPVTG(const char *s, const int len, nmeaGPVTG *pack) {
+int nmea_parse_GPVTG(const char *s, const int len, bool has_checksum, nmeaGPVTG *pack) {
        int token_count;
 
+       if (!has_checksum) {
+         return 0;
+       }
+
        assert(s);
        assert(pack);
 
index 81f1998..90520dd 100644 (file)
@@ -36,6 +36,7 @@ static void reset_sentence_parser(nmeaPARSER * parser, sentence_parser_state new
   memset(&parser->sentence_parser, 0, sizeof(parser->sentence_parser));
   parser->buffer.buffer[0] = '\0';
   parser->buffer.length = 0;
+  parser->sentence_parser.has_checksum = false;
   parser->sentence_parser.state = new_state;
 }
 
@@ -112,7 +113,7 @@ static bool nmea_parse_sentence_character(nmeaPARSER *parser, const char * c) {
         parser->sentence_parser.sentence_checksum_chars_count = 0;
       } else if (*c == first_eol_char) {
         parser->sentence_parser.state = READ_EOL;
-        parser->sentence_parser.sentence_eol_chars_count = 0;
+        parser->sentence_parser.sentence_eol_chars_count = 1;
       } else if (isInvalidNMEACharacter(c)) {
         reset_sentence_parser(parser, SKIP_UNTIL_START);
       } else {
@@ -135,6 +136,7 @@ static bool nmea_parse_sentence_character(nmeaPARSER *parser, const char * c) {
             parser->sentence_parser.sentence_checksum_chars[1] = *c;
             parser->sentence_parser.sentence_checksum_chars_count = 2;
             parser->sentence_parser.sentence_checksum = nmea_atoi(parser->sentence_parser.sentence_checksum_chars, 2, 16);
+            parser->sentence_parser.has_checksum = true;
             parser->sentence_parser.state = READ_EOL;
             break;
 
@@ -206,35 +208,35 @@ int nmea_parse(nmeaPARSER * parser, const char * s, int len, nmeaINFO * info) {
       enum nmeaPACKTYPE sentence_type = nmea_parse_get_sentence_type(&parser->buffer.buffer[1], parser->buffer.length - 1);
       switch (sentence_type) {
         case GPGGA:
-          if (nmea_parse_GPGGA(parser->buffer.buffer, parser->buffer.length, &parser->sentence.gpgga)) {
+          if (nmea_parse_GPGGA(parser->buffer.buffer, parser->buffer.length, parser->sentence_parser.has_checksum, &parser->sentence.gpgga)) {
             sentences_count++;
             nmea_GPGGA2info(&parser->sentence.gpgga, info);
           }
           break;
 
         case GPGSA:
-          if (nmea_parse_GPGSA(parser->buffer.buffer, parser->buffer.length, &parser->sentence.gpgsa)) {
+          if (nmea_parse_GPGSA(parser->buffer.buffer, parser->buffer.length, parser->sentence_parser.has_checksum, &parser->sentence.gpgsa)) {
             sentences_count++;
             nmea_GPGSA2info(&parser->sentence.gpgsa, info);
           }
           break;
 
         case GPGSV:
-          if (nmea_parse_GPGSV(parser->buffer.buffer, parser->buffer.length, &parser->sentence.gpgsv)) {
+          if (nmea_parse_GPGSV(parser->buffer.buffer, parser->buffer.length, parser->sentence_parser.has_checksum, &parser->sentence.gpgsv)) {
             sentences_count++;
             nmea_GPGSV2info(&parser->sentence.gpgsv, info);
           }
           break;
 
         case GPRMC:
-          if (nmea_parse_GPRMC(parser->buffer.buffer, parser->buffer.length, &parser->sentence.gprmc)) {
+          if (nmea_parse_GPRMC(parser->buffer.buffer, parser->buffer.length, parser->sentence_parser.has_checksum, &parser->sentence.gprmc)) {
             sentences_count++;
             nmea_GPRMC2info(&parser->sentence.gprmc, info);
           }
           break;
 
         case GPVTG:
-          if (nmea_parse_GPVTG(parser->buffer.buffer, parser->buffer.length, &parser->sentence.gpvtg)) {
+          if (nmea_parse_GPVTG(parser->buffer.buffer, parser->buffer.length, parser->sentence_parser.has_checksum, &parser->sentence.gpvtg)) {
             sentences_count++;
             nmea_GPVTG2info(&parser->sentence.gpvtg, info);
           }