diff --git a/example.c b/example.c index 665b18f..e91451d 100644 --- a/example.c +++ b/example.c @@ -107,6 +107,24 @@ int main(void) } } break; + case MINMEA_SENTENCE_ZDA: { + struct minmea_sentence_zda frame; + if (minmea_parse_zda(&frame, line)) { + printf(INDENT_SPACES "$xxZDA: %d:%d:%d %02d.%02d.%d UTC%+03d:%02d\n", + frame.time.hours, + frame.time.minutes, + frame.time.seconds, + frame.date.day, + frame.date.month, + frame.date.year, + frame.hour_offset, + frame.minute_offset); + } + else { + printf(INDENT_SPACES "$xxZDA sentence is not parsed\n"); + } + } break; + case MINMEA_INVALID: { printf(INDENT_SPACES "$xxxxx sentence is not valid\n"); } break; diff --git a/minmea.c b/minmea.c index e5633c6..9e23933 100644 --- a/minmea.c +++ b/minmea.c @@ -372,6 +372,8 @@ enum minmea_sentence_id minmea_sentence_id(const char *sentence, bool strict) return MINMEA_SENTENCE_GSV; if (!strcmp(type+2, "VTG")) return MINMEA_SENTENCE_VTG; + if (!strcmp(type+2, "ZDA")) + return MINMEA_SENTENCE_ZDA; return MINMEA_UNKNOWN; } @@ -584,6 +586,32 @@ bool minmea_parse_vtg(struct minmea_sentence_vtg *frame, const char *sentence) return true; } +bool minmea_parse_zda(struct minmea_sentence_zda *frame, const char *sentence) +{ + // $GPZDA,201530.00,04,07,2002,00,00*60 + char type[6]; + + if(!minmea_scan(sentence, "tTiiiii", + type, + &frame->time, + &frame->date.day, + &frame->date.month, + &frame->date.year, + &frame->hour_offset, + &frame->minute_offset)) + return false; + if (strcmp(type+2, "ZDA")) + return false; + + // check offsets + if (abs(frame->hour_offset) > 13 || + frame->minute_offset > 59 || + frame->minute_offset < 0) + return false; + + return true; +} + int minmea_gettime(struct timespec *ts, const struct minmea_date *date, const struct minmea_time *time_) { if (date->year == -1 || time_->hours == -1) diff --git a/minmea.h b/minmea.h index acbf182..10351f6 100644 --- a/minmea.h +++ b/minmea.h @@ -32,6 +32,7 @@ enum minmea_sentence_id { MINMEA_SENTENCE_GST, MINMEA_SENTENCE_GSV, MINMEA_SENTENCE_VTG, + MINMEA_SENTENCE_ZDA, }; struct minmea_float { @@ -152,6 +153,13 @@ struct minmea_sentence_vtg { enum minmea_faa_mode faa_mode; }; +struct minmea_sentence_zda { + struct minmea_time time; + struct minmea_date date; + int hour_offset; + int minute_offset; +}; + /** * Calculate raw sentence checksum. Does not check sentence integrity. */ @@ -195,6 +203,7 @@ bool minmea_parse_gll(struct minmea_sentence_gll *frame, const char *sentence); bool minmea_parse_gst(struct minmea_sentence_gst *frame, const char *sentence); bool minmea_parse_gsv(struct minmea_sentence_gsv *frame, const char *sentence); bool minmea_parse_vtg(struct minmea_sentence_vtg *frame, const char *sentence); +bool minmea_parse_zda(struct minmea_sentence_zda *frame, const char *sentence); /** * Convert GPS UTC date/time representation to a UNIX timestamp.