mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
20005: tests/pkg/minmea: adding GGA, GSA and RMC sentences to test application r=benpicco a=jan-mo This will extend the minmea test with additional NMEA sentences like GGA, GSA and RMC. 20008: release-test.yml: Fix strasbourg spelling r=benpicco a=MrKevinWeiss ### Contribution description Small typo fix... stasbourg -> strasbourg ### Testing procedure Really not easy since we need an RC to actually test it (since these tests can only be run on RCs)... but the RC1 doesn't contain the `openmote-b` fixes. ### Issues/PRs references Co-authored-by: Jan Mohr <jan.mohr@ml-pa.com> Co-authored-by: MrKevinWeiss <weiss.kevin604@gmail.com>
This commit is contained in:
commit
238fb60eca
4
.github/workflows/release-test.yml
vendored
4
.github/workflows/release-test.yml
vendored
@ -85,12 +85,12 @@ jobs:
|
||||
IOTLAB_USER=$(cat ~/.iotlabrc | cut -f1 -d:)
|
||||
ssh -oStrictHostKeyChecking=accept-new \
|
||||
${IOTLAB_USER}@lille.iot-lab.info exit
|
||||
- name: Fetch host key from IoT-LAB stasbourg site
|
||||
- name: Fetch host key from IoT-LAB strasbourg site
|
||||
if: ${{ matrix.pytest_mark == 'iotlab_creds' }}
|
||||
run: |
|
||||
IOTLAB_USER=$(cat ~/.iotlabrc | cut -f1 -d:)
|
||||
ssh -oStrictHostKeyChecking=accept-new \
|
||||
${IOTLAB_USER}@stasbourg.iot-lab.info exit
|
||||
${IOTLAB_USER}@strasbourg.iot-lab.info exit
|
||||
- name: Checkout Release-Specs
|
||||
uses: actions/checkout@main
|
||||
with:
|
||||
|
@ -1,4 +1,6 @@
|
||||
BOARD_INSUFFICIENT_MEMORY := \
|
||||
atmega8 \
|
||||
nucleo-l011k4 \
|
||||
samd10-xmini \
|
||||
stm32f030f4-demo \
|
||||
#
|
||||
|
@ -14,31 +14,147 @@
|
||||
* @brief minmea GPS NMEA parser library package test application
|
||||
*
|
||||
* @author Kaspar Schleiser <kaspar@schleiser.de>
|
||||
* @author Jan Mohr <jan.mohr@ml-pa.com>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "fmt.h"
|
||||
#include "minmea.h"
|
||||
|
||||
static const char *_gga = "$GNGGA,142142.227,5227.022,N,01317.919,E,1,12,1.0,0.0,M,0.0,M,,*70";
|
||||
static const char *_gll = "$GNGLL,5229.0178,N,01326.7605,E,114350.000,A,A*45";
|
||||
static const char *_gsa = "$GNGSA,A,3,01,02,03,04,05,06,07,08,09,10,11,12,1.0,1.0,1.0*2E";
|
||||
static const char *_rmc = "$GPRMC,142142.227,A,5227.022,N,01317.919,E,,,201023,000.0,W*78";
|
||||
|
||||
int main(void)
|
||||
int _parse_nmea_msg(const char* nmea_msg)
|
||||
{
|
||||
print_str("START\n");
|
||||
struct minmea_sentence_gll frame;
|
||||
/* get message type */
|
||||
int msg_type = minmea_sentence_id(nmea_msg, false);
|
||||
switch (msg_type) {
|
||||
case MINMEA_SENTENCE_GGA: {
|
||||
struct minmea_sentence_gga frame;
|
||||
if (minmea_parse_gga(&frame, nmea_msg) && frame.fix_quality) {
|
||||
puts("check_nmea: GGA recorded");
|
||||
|
||||
int res = minmea_parse_gll(&frame, _gll);
|
||||
if (!res) {
|
||||
print_str("FAILURE: error parsing GPS sentence\n");
|
||||
}
|
||||
else {
|
||||
print_str("parsed coordinates: lat=");
|
||||
print_float(minmea_tocoord(&frame.latitude), 6);
|
||||
print_str(" lon=");
|
||||
print_float(minmea_tocoord(&frame.longitude), 6);
|
||||
print_str("\nSUCCESS\n");
|
||||
/* print values */
|
||||
print_str("\tlat: ");
|
||||
print_float(minmea_tocoord(&frame.latitude), 6);
|
||||
printf("\n");
|
||||
print_str("\tlon: ");
|
||||
print_float(minmea_tocoord(&frame.longitude), 6);
|
||||
printf("\n");
|
||||
printf("\talt: %"PRId32"\n", minmea_rescale(&frame.altitude, 1));
|
||||
printf("\tn_sats: %d\n", frame.satellites_tracked);
|
||||
}
|
||||
else {
|
||||
puts("check_nmea: invalid GGA record");
|
||||
}
|
||||
} break;
|
||||
case MINMEA_SENTENCE_GLL: {
|
||||
struct minmea_sentence_gll frame;
|
||||
if (minmea_parse_gll(&frame, nmea_msg)) {
|
||||
puts("check_nmea: GLL recorded");
|
||||
|
||||
/* print values */
|
||||
print_str("\tlat: ");
|
||||
print_float(minmea_tocoord(&frame.latitude), 6);
|
||||
printf("\n");
|
||||
print_str("\tlon: ");
|
||||
print_float(minmea_tocoord(&frame.longitude), 6);
|
||||
printf("\n");
|
||||
}
|
||||
else {
|
||||
puts("check_nmea: invalid GLL record");
|
||||
}
|
||||
} break;
|
||||
case MINMEA_SENTENCE_GSA: {
|
||||
struct minmea_sentence_gsa frame;
|
||||
if (minmea_parse_gsa(&frame, nmea_msg)) {
|
||||
puts("check_nmea: GSA recorded");
|
||||
|
||||
/* print values */
|
||||
printf("\tmode: %c\n", frame.mode); /* (A)automatic and (M)manual mode */
|
||||
/* identify fix-type */
|
||||
switch (frame.fix_type) {
|
||||
case MINMEA_GPGSA_FIX_NONE:
|
||||
printf("\tfix_type: %s\n", "NONE");
|
||||
break;
|
||||
case MINMEA_GPGSA_FIX_2D:
|
||||
printf("\tfix_type: %s\n", "2D");
|
||||
break;
|
||||
case MINMEA_GPGSA_FIX_3D:
|
||||
printf("\tfix_type: %s\n", "3D");
|
||||
break;
|
||||
default:
|
||||
printf("\tfix_type: %s\n", "UNKNOWN");
|
||||
}
|
||||
/* always a record of 12 satellites */
|
||||
for (int i = 0; i < 12; i++) {
|
||||
printf("\t%d. sat: %d\n", i, frame.sats[i]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
puts("check_nmea: invalid GSA record");
|
||||
}
|
||||
} break;
|
||||
case MINMEA_SENTENCE_RMC: {
|
||||
struct minmea_sentence_rmc frame;
|
||||
if (minmea_parse_rmc(&frame, nmea_msg) && frame.valid) {
|
||||
puts("check_nmea: RMC recorded");
|
||||
|
||||
/* parse timestamp */
|
||||
struct tm tm;
|
||||
time_t timestamp;
|
||||
minmea_getdatetime(&tm, &frame.date, &frame.time);
|
||||
timestamp = mktime(&tm);
|
||||
|
||||
/* print values */
|
||||
print_str("\tlat: ");
|
||||
print_float(minmea_tocoord(&frame.latitude), 6);
|
||||
printf("\n");
|
||||
print_str("\tlon: ");
|
||||
print_float(minmea_tocoord(&frame.longitude), 6);
|
||||
printf("\n");
|
||||
printf("\ttime: %"PRIu32"\n", (uint32_t)timestamp);
|
||||
}
|
||||
else {
|
||||
puts("check_nmea: invalid RMC record");
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
printf("check_nmea: unknown message type %d\n", msg_type);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
puts("START");
|
||||
|
||||
/* check GGA */
|
||||
if (_parse_nmea_msg(_gga) != 0) {
|
||||
puts("Error parsing GGA");
|
||||
}
|
||||
/* check GLL */
|
||||
if (_parse_nmea_msg(_gll) != 0) {
|
||||
puts("Error parsing GLL");
|
||||
}
|
||||
/* check GSA */
|
||||
if (_parse_nmea_msg(_gsa) != 0) {
|
||||
puts("Error parsing GSA");
|
||||
}
|
||||
/* check RMC */
|
||||
if (_parse_nmea_msg(_rmc) != 0) {
|
||||
puts("Error parsing RMC");
|
||||
}
|
||||
|
||||
puts("SUCCESS");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -5,9 +5,35 @@ from testrunner import run
|
||||
|
||||
|
||||
def testfunc(child):
|
||||
child.expect_exact('START')
|
||||
child.expect('parsed coordinates: lat=52.483631 lon=13.446008')
|
||||
child.expect_exact('SUCCESS')
|
||||
child.expect_exact('START\r\n')
|
||||
child.expect_exact('check_nmea: GGA recorded\r\n')
|
||||
child.expect_exact('\tlat: 52.450366\r\n')
|
||||
child.expect_exact('\tlon: 13.298649\r\n')
|
||||
child.expect_exact('\talt: 0\r\n')
|
||||
child.expect_exact('\tn_sats: 12\r\n')
|
||||
child.expect_exact('check_nmea: GLL recorded\r\n')
|
||||
child.expect_exact('\tlat: 52.483631\r\n')
|
||||
child.expect_exact('\tlon: 13.446008\r\n')
|
||||
child.expect_exact('check_nmea: GSA recorded\r\n')
|
||||
child.expect_exact('\tmode: A\r\n')
|
||||
child.expect_exact('\tfix_type: 3D\r\n')
|
||||
child.expect_exact('\t0. sat: 1\r\n')
|
||||
child.expect_exact('\t1. sat: 2\r\n')
|
||||
child.expect_exact('\t2. sat: 3\r\n')
|
||||
child.expect_exact('\t3. sat: 4\r\n')
|
||||
child.expect_exact('\t4. sat: 5\r\n')
|
||||
child.expect_exact('\t5. sat: 6\r\n')
|
||||
child.expect_exact('\t6. sat: 7\r\n')
|
||||
child.expect_exact('\t7. sat: 8\r\n')
|
||||
child.expect_exact('\t8. sat: 9\r\n')
|
||||
child.expect_exact('\t9. sat: 10\r\n')
|
||||
child.expect_exact('\t10. sat: 11\r\n')
|
||||
child.expect_exact('\t11. sat: 12\r\n')
|
||||
child.expect_exact('check_nmea: RMC recorded\r\n')
|
||||
child.expect_exact('\tlat: 52.450366\r\n')
|
||||
child.expect_exact('\tlon: 13.298649\r\n')
|
||||
child.expect_exact('\ttime: 1697808102\r\n')
|
||||
child.expect_exact('SUCCESS\r\n')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
Loading…
Reference in New Issue
Block a user