add minmea_getdate()
The GPS date is internally converted to a struct tm anyway. Add a function to make use of this for external users too.
This commit is contained in:
parent
ae4dd9442a
commit
4ebbaef840
30
minmea.c
30
minmea.c
@ -612,25 +612,33 @@ bool minmea_parse_zda(struct minmea_sentence_zda *frame, const char *sentence)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int minmea_gettime(struct timespec *ts, const struct minmea_date *date, const struct minmea_time *time_)
|
int minmea_getdate(struct tm *out, const struct minmea_date *date, const struct minmea_time *time_)
|
||||||
{
|
{
|
||||||
if (date->year == -1 || time_->hours == -1)
|
if (date->year == -1 || time_->hours == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
struct tm tm;
|
memset(out, 0, sizeof(struct tm));
|
||||||
memset(&tm, 0, sizeof(tm));
|
|
||||||
if (date->year < 80) {
|
if (date->year < 80) {
|
||||||
tm.tm_year = 2000 + date->year - 1900; // 2000-2079
|
out->tm_year = 2000 + date->year - 1900; // 2000-2079
|
||||||
} else if (date->year >= 1900) {
|
} else if (date->year >= 1900) {
|
||||||
tm.tm_year = date->year - 1900; // 4 digit year, use directly
|
out->tm_year = date->year - 1900; // 4 digit year, use directly
|
||||||
} else {
|
} else {
|
||||||
tm.tm_year = date->year; // 1980-1999
|
out->tm_year = date->year; // 1980-1999
|
||||||
}
|
}
|
||||||
tm.tm_mon = date->month - 1;
|
out->tm_mon = date->month - 1;
|
||||||
tm.tm_mday = date->day;
|
out->tm_mday = date->day;
|
||||||
tm.tm_hour = time_->hours;
|
out->tm_hour = time_->hours;
|
||||||
tm.tm_min = time_->minutes;
|
out->tm_min = time_->minutes;
|
||||||
tm.tm_sec = time_->seconds;
|
out->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(). */
|
time_t timestamp = timegm(&tm); /* See README.md if your system lacks timegm(). */
|
||||||
if (timestamp != (time_t)-1) {
|
if (timestamp != (time_t)-1) {
|
||||||
|
5
minmea.h
5
minmea.h
@ -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_vtg(struct minmea_sentence_vtg *frame, const char *sentence);
|
||||||
bool minmea_parse_zda(struct minmea_sentence_zda *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 *out, const struct minmea_date *date, const struct minmea_time *time_);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert GPS UTC date/time representation to a UNIX timestamp.
|
* Convert GPS UTC date/time representation to a UNIX timestamp.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user