Skip to content

Commit

Permalink
add minmea_getdate()
Browse files Browse the repository at this point in the history
The GPS date is internally converted to a struct tm anyway.
Add a function to make use of this for external users too.
  • Loading branch information
benpicco committed May 16, 2019
1 parent ae4dd94 commit 4dae701
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 11 deletions.
30 changes: 19 additions & 11 deletions minmea.c
Original file line number Diff line number Diff line change
Expand Up @@ -612,25 +612,33 @@ bool minmea_parse_zda(struct minmea_sentence_zda *frame, const char *sentence)
return true;
}

int minmea_gettime(struct timespec *ts, const struct minmea_date *date, const struct minmea_time *time_)
int minmea_getdate(struct tm *tm, const struct minmea_date *date, const struct minmea_time *time_)
{
if (date->year == -1 || time_->hours == -1)
return -1;

struct tm tm;
memset(&tm, 0, sizeof(tm));
memset(tm, 0, sizeof(*tm));
if (date->year < 80) {
tm.tm_year = 2000 + date->year - 1900; // 2000-2079
tm->tm_year = 2000 + date->year - 1900; // 2000-2079
} else if (date->year >= 1900) {
tm.tm_year = date->year - 1900; // 4 digit year, use directly
tm->tm_year = date->year - 1900; // 4 digit year, use directly
} else {
tm.tm_year = date->year; // 1980-1999
tm->tm_year = date->year; // 1980-1999
}
tm.tm_mon = date->month - 1;
tm.tm_mday = date->day;
tm.tm_hour = time_->hours;
tm.tm_min = time_->minutes;
tm.tm_sec = time_->seconds;
tm->tm_mon = date->month - 1;
tm->tm_mday = date->day;
tm->tm_hour = time_->hours;
tm->tm_min = time_->minutes;
tm->tm_sec = time_->seconds;

return 0;
}

int minmea_gettime(struct timespec *ts, const struct minmea_date *date, const struct minmea_time *time_)
{
struct tm tm;
if (minmea_getdate(&tm, date, time_))
return -1;

time_t timestamp = timegm(&tm); /* See README.md if your system lacks timegm(). */
if (timestamp != (time_t)-1) {
Expand Down
5 changes: 5 additions & 0 deletions minmea.h
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,11 @@ 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 calendar time.
*/
int minmea_getdate(struct tm *tm, const struct minmea_date *date, const struct minmea_time *time_);

/**
* Convert GPS UTC date/time representation to a UNIX timestamp.
*/
Expand Down

0 comments on commit 4dae701

Please sign in to comment.