Merge pull request #45 from benpicco/minmea_getdate

add minmea_getdatetime()
This commit is contained in:
Kosma Moczek 2022-06-03 01:15:07 +02:00 committed by GitHub
commit 6915c08c59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 50 additions and 11 deletions

View File

@ -645,25 +645,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_getdatetime(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_getdatetime(&tm, date, time_))
return -1;
time_t timestamp = timegm(&tm); /* See README.md if your system lacks timegm(). */
if (timestamp != (time_t)-1) {

View File

@ -221,6 +221,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_getdatetime(struct tm *tm, const struct minmea_date *date, const struct minmea_time *time_);
/**
* Convert GPS UTC date/time representation to a UNIX timestamp.
*/

26
tests.c
View File

@ -975,50 +975,76 @@ START_TEST(test_minmea_gettime)
{
struct minmea_date d = { 14, 2, 14 };
struct minmea_time t = { 13, 0, 9, 123456 };
struct tm tm;
struct timespec ts;
ck_assert(minmea_getdatetime(&tm, &d, &t) == 0);
ck_assert(minmea_gettime(&ts, &d, &t) == 0);
ck_assert_int_eq(tm.tm_year, 2014-1900);
ck_assert_int_eq(tm.tm_mon, 1);
ck_assert_int_eq(tm.tm_mday, 14);
ck_assert_int_eq(tm.tm_hour, 13);
ck_assert_int_eq(tm.tm_min, 0);
ck_assert_int_eq(tm.tm_sec, 9);
ck_assert_int_eq(ts.tv_sec, 1392382809);
ck_assert_int_eq(ts.tv_nsec, 123456000);
d.year = -1;
ck_assert(minmea_getdatetime(&tm, &d, &t) != 0);
ck_assert(minmea_gettime(&ts, &d, &t) != 0);
d.year = 14;
t.hours = -1;
ck_assert(minmea_getdatetime(&tm, &d, &t) != 0);
ck_assert(minmea_gettime(&ts, &d, &t) != 0);
t.hours = 13;
/* two digit year conversions */
d.year = 80;
ck_assert(minmea_getdatetime(&tm, &d, &t) == 0);
ck_assert(minmea_gettime(&ts, &d, &t) == 0);
ck_assert_int_eq(tm.tm_year, 1980-1900);
ck_assert_int_eq(ts.tv_sec, 319381209); /* 1980 */
d.year = 37;
ck_assert(minmea_getdatetime(&tm, &d, &t) == 0);
ck_assert(minmea_gettime(&ts, &d, &t) == 0);
ck_assert_int_eq(tm.tm_year, 2037-1900);
ck_assert_int_eq(ts.tv_sec, 2118229209); /* 2037 */
/* skip >= 2038 tests on 32-bit time_t platforms */
if (sizeof(time_t) == sizeof(int64_t)) {
d.year = 79;
ck_assert(minmea_getdatetime(&tm, &d, &t) == 0);
ck_assert(minmea_gettime(&ts, &d, &t) == 0);
ck_assert_int_eq(tm.tm_year, 2079-1900);
ck_assert_int_eq(ts.tv_sec, 3443605209); /* 2079 */
}
/* four digit year conversions */
d.year = 1979;
ck_assert(minmea_getdatetime(&tm, &d, &t) == 0);
ck_assert(minmea_gettime(&ts, &d, &t) == 0);
ck_assert_int_eq(tm.tm_year, 1979-1900);
ck_assert_int_eq(ts.tv_sec, 287845209);
d.year = 1980;
ck_assert(minmea_getdatetime(&tm, &d, &t) == 0);
ck_assert(minmea_gettime(&ts, &d, &t) == 0);
ck_assert_int_eq(tm.tm_year, 1980-1900);
ck_assert_int_eq(ts.tv_sec, 319381209);
d.year = 2037;
ck_assert(minmea_getdatetime(&tm, &d, &t) == 0);
ck_assert(minmea_gettime(&ts, &d, &t) == 0);
ck_assert_int_eq(tm.tm_year, 2037-1900);
ck_assert_int_eq(ts.tv_sec, 2118229209);
/* skip >= 2038 tests on 32-bit time_t platforms */
if (sizeof(time_t) == sizeof(int64_t)) {
d.year = 2079;
ck_assert(minmea_getdatetime(&tm, &d, &t) == 0);
ck_assert(minmea_gettime(&ts, &d, &t) == 0);
ck_assert_int_eq(tm.tm_year, 2079-1900);
ck_assert_int_eq(ts.tv_sec, 3443605209);
d.year = 2080;
ck_assert(minmea_getdatetime(&tm, &d, &t) == 0);
ck_assert(minmea_gettime(&ts, &d, &t) == 0);
ck_assert_int_eq(tm.tm_year, 2080-1900);
ck_assert_int_eq(ts.tv_sec, 3475141209);
}
}