commit
fcc63a54b0
18
example.c
18
example.c
@ -107,6 +107,24 @@ int main(void)
|
|||||||
}
|
}
|
||||||
} break;
|
} 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: {
|
case MINMEA_INVALID: {
|
||||||
printf(INDENT_SPACES "$xxxxx sentence is not valid\n");
|
printf(INDENT_SPACES "$xxxxx sentence is not valid\n");
|
||||||
} break;
|
} break;
|
||||||
|
28
minmea.c
28
minmea.c
@ -372,6 +372,8 @@ enum minmea_sentence_id minmea_sentence_id(const char *sentence, bool strict)
|
|||||||
return MINMEA_SENTENCE_GSV;
|
return MINMEA_SENTENCE_GSV;
|
||||||
if (!strcmp(type+2, "VTG"))
|
if (!strcmp(type+2, "VTG"))
|
||||||
return MINMEA_SENTENCE_VTG;
|
return MINMEA_SENTENCE_VTG;
|
||||||
|
if (!strcmp(type+2, "ZDA"))
|
||||||
|
return MINMEA_SENTENCE_ZDA;
|
||||||
|
|
||||||
return MINMEA_UNKNOWN;
|
return MINMEA_UNKNOWN;
|
||||||
}
|
}
|
||||||
@ -584,6 +586,32 @@ bool minmea_parse_vtg(struct minmea_sentence_vtg *frame, const char *sentence)
|
|||||||
return true;
|
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_)
|
int minmea_gettime(struct timespec *ts, const struct minmea_date *date, const struct minmea_time *time_)
|
||||||
{
|
{
|
||||||
if (date->year == -1 || time_->hours == -1)
|
if (date->year == -1 || time_->hours == -1)
|
||||||
|
9
minmea.h
9
minmea.h
@ -32,6 +32,7 @@ enum minmea_sentence_id {
|
|||||||
MINMEA_SENTENCE_GST,
|
MINMEA_SENTENCE_GST,
|
||||||
MINMEA_SENTENCE_GSV,
|
MINMEA_SENTENCE_GSV,
|
||||||
MINMEA_SENTENCE_VTG,
|
MINMEA_SENTENCE_VTG,
|
||||||
|
MINMEA_SENTENCE_ZDA,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct minmea_float {
|
struct minmea_float {
|
||||||
@ -152,6 +153,13 @@ struct minmea_sentence_vtg {
|
|||||||
enum minmea_faa_mode faa_mode;
|
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.
|
* 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_gst(struct minmea_sentence_gst *frame, const char *sentence);
|
||||||
bool minmea_parse_gsv(struct minmea_sentence_gsv *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_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.
|
* Convert GPS UTC date/time representation to a UNIX timestamp.
|
||||||
|
22
tests.c
22
tests.c
@ -40,6 +40,7 @@ static const char *valid_sentences_checksum[] = {
|
|||||||
"$GPRMC,123205.00,A,5106.94085,N,01701.51689,E,0.016,,280214,,,A*7B",
|
"$GPRMC,123205.00,A,5106.94085,N,01701.51689,E,0.016,,280214,,,A*7B",
|
||||||
"$GPVTG,,T,,M,0.016,N,0.030,K,A*27",
|
"$GPVTG,,T,,M,0.016,N,0.030,K,A*27",
|
||||||
"$GPGST,024603.00,3.2,6.6,4.7,47.3,5.8,5.6,22.0*58",
|
"$GPGST,024603.00,3.2,6.6,4.7,47.3,5.8,5.6,22.0*58",
|
||||||
|
"$GPZDA,160012.71,11,03,2004,-1,00*7D",
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -865,6 +866,26 @@ START_TEST(test_minmea_parse_vtg2)
|
|||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
START_TEST(test_minmea_parse_zda1)
|
||||||
|
{
|
||||||
|
const char *sentence = "$GPZDA,160012.71,11,03,2004,-1,00*7D";
|
||||||
|
struct minmea_sentence_zda frame = {};
|
||||||
|
struct minmea_sentence_zda expected = {};
|
||||||
|
|
||||||
|
expected = (struct minmea_sentence_zda) {
|
||||||
|
.time = { 16, 0, 12, 710000 },
|
||||||
|
.date = { 11, 3, 2004 },
|
||||||
|
.hour_offset = -1,
|
||||||
|
.minute_offset = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
ck_assert(minmea_check(sentence, false) == true);
|
||||||
|
ck_assert(minmea_check(sentence, true) == true);
|
||||||
|
ck_assert(minmea_parse_zda(&frame, sentence) == true);
|
||||||
|
ck_assert(!memcmp(&frame, &expected, sizeof(frame)));
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
START_TEST(test_minmea_usage1)
|
START_TEST(test_minmea_usage1)
|
||||||
{
|
{
|
||||||
const char *sentences[] = {
|
const char *sentences[] = {
|
||||||
@ -1021,6 +1042,7 @@ static Suite *minmea_suite(void)
|
|||||||
tcase_add_test(tc_parse, test_minmea_parse_gsv5);
|
tcase_add_test(tc_parse, test_minmea_parse_gsv5);
|
||||||
tcase_add_test(tc_parse, test_minmea_parse_vtg1);
|
tcase_add_test(tc_parse, test_minmea_parse_vtg1);
|
||||||
tcase_add_test(tc_parse, test_minmea_parse_vtg2);
|
tcase_add_test(tc_parse, test_minmea_parse_vtg2);
|
||||||
|
tcase_add_test(tc_parse, test_minmea_parse_zda1);
|
||||||
suite_add_tcase(s, tc_parse);
|
suite_add_tcase(s, tc_parse);
|
||||||
|
|
||||||
TCase *tc_usage = tcase_create("minmea_usage");
|
TCase *tc_usage = tcase_create("minmea_usage");
|
||||||
|
Loading…
Reference in New Issue
Block a user