changeset 95:2a518c6d77c6

dump-pvt: dump UBX-NAV-PVT messages Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Thu, 07 Sep 2023 20:07:59 -0400
parents 7e07763a98a7
children a79efd17d4d6
files CMakeLists.txt dump-pvt dump-pvt.c
diffstat 3 files changed, 136 insertions(+), 101 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Tue Feb 23 07:56:26 2021 -0500
+++ b/CMakeLists.txt	Thu Sep 07 20:07:59 2023 -0400
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2019-2021 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
+# Copyright (c) 2019-2021,2023 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
 #
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documentation files (the "Software"), to deal
@@ -90,6 +90,15 @@
 	ublox8
 )
 
+add_executable(dump-pvt
+	dump-common.c
+	dump-pvt.c
+)
+
+target_link_libraries(dump-pvt
+	ublox8
+)
+
 add_executable(dump-uniqid
 	dump-common.c
 	dump-uniqid.c
--- a/dump-pvt	Tue Feb 23 07:56:26 2021 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-
-	/* FIXME: for now, we just print it - to demonstrate correctness */
-	if ((hdr.class == UBX_CLASS_NAV) && (hdr.id == 0x07)) {
-		/* UBX-NAV-PVT */
-		struct ubx_nav_pvt msg;
-		char fix_type[16];
-
-		memcpy(&msg, raw, hdr.len);
-
-		msg.itow            = le32_to_cpu(msg.itow);
-		msg.year            = le16_to_cpu(msg.year);
-		msg.time_acc        = le32_to_cpu(msg.time_acc);
-		msg.nsec            = le32_to_cpu(msg.nsec);
-		msg.lon             = le32_to_cpu(msg.lon);
-		msg.lat             = le32_to_cpu(msg.lat);
-		msg.height_ell      = le32_to_cpu(msg.height_ell);
-		msg.height_msl      = le32_to_cpu(msg.height_msl);
-		msg.horiz_acc       = le32_to_cpu(msg.horiz_acc);
-		msg.vert_acc        = le32_to_cpu(msg.vert_acc);
-		msg.vel_n           = le32_to_cpu(msg.vel_n);
-		msg.vel_e           = le32_to_cpu(msg.vel_e);
-		msg.vel_d           = le32_to_cpu(msg.vel_d);
-		msg.gspeed          = le32_to_cpu(msg.gspeed);
-		msg.motion_heading  = le32_to_cpu(msg.motion_heading);
-		msg.speed_acc       = le32_to_cpu(msg.speed_acc);
-		msg.head_acc        = le32_to_cpu(msg.head_acc);
-		msg.pdop            = le16_to_cpu(msg.pdop);
-		msg.vehicle_heading = le32_to_cpu(msg.vehicle_heading);
-		msg.mag_dec         = le16_to_cpu(msg.mag_dec);
-		msg.mag_dec_acc     = le16_to_cpu(msg.mag_dec_acc);
-
-		switch (msg.fix_type) {
-			case 0:
-				strcpy(fix_type, "no");
-				break;
-			case 1:
-				strcpy(fix_type, "dead-reckoning");
-				break;
-			case 2:
-				strcpy(fix_type, "2D");
-				break;
-			case 3:
-				strcpy(fix_type, "3D");
-				break;
-			case 4:
-				strcpy(fix_type, "GNSS + dead-reckoning");
-				break;
-			case 5:
-				strcpy(fix_type, "time-only");
-				break;
-			default:
-				snprintf(fix_type, sizeof(fix_type), "<%u>",
-					 msg.fix_type);
-				break;
-		}
-
-		fprintf(stderr, "UBX-NAV-PVT @ %u "
-			"valid d%s t%s fr%s m%s f%s vh%s , "
-			"%04u-%02u-%02u %02u:%02u:%02u +- %uns , "
-			"%s fix diff-corr %sapplied , "
-			"UTC validity %savailable d%s t%s , "
-			"%u SVs , "
-			"lat %.7f lon %.7f alt %.3f MSL %.3f ellipsoid , "
-			"acc horiz %u vert %u , "
-			"NED vel %d %d %d gspeed %d acc %u , "
-			"head motion %.5f vehicle %.5f acc %.5f , "
-			"mag dec %.2f acc %.2f , "
-			"PDOP %.2f\n",
-			msg.itow,
-			(msg.valid & 0x01) ? "Y" : "N",
-			(msg.valid & 0x02) ? "Y" : "N",
-			(msg.valid & 0x04) ? "Y" : "N",
-			(msg.valid & 0x08) ? "Y" : "N",
-			(msg.flags & 0x01) ? "Y" : "N",
-			(msg.flags & 0x20) ? "Y" : "N",
-			msg.year, msg.month, msg.day,
-			msg.hour, msg.min, msg.sec,
-			msg.time_acc,
-			fix_type,
-			(msg.flags & 0x02) ? "" : "not-",
-			(msg.flags2 & 0x20) ? "" : "not-",
-			(msg.flags2 & 0x40) ? "Y" : "N",
-			(msg.flags2 & 0x80) ? "Y" : "N",
-			msg.num_sv,
-			((int32_t) msg.lat) * 1e-7,
-			((int32_t) msg.lon) * 1e-7,
-			((int32_t) msg.height_msl) / 1000.,
-			((int32_t) msg.height_ell) / 1000.,
-			msg.horiz_acc, msg.vert_acc,
-			msg.vel_n, msg.vel_e, msg.vel_d, msg.gspeed,
-			msg.speed_acc,
-			((int32_t) msg.motion_heading) * 1e-5,
-			((int32_t) msg.vehicle_heading) * 1e-5,
-			((int32_t) msg.head_acc) * 1e-5,
-			((int32_t) msg.mag_dec) / 100.,
-			msg.mag_dec_acc / 100.,
-			msg.pdop * 0.01);
-
-	}
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dump-pvt.c	Thu Sep 07 20:07:59 2023 -0400
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2019-2020,2023 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "dump-common.h"
+
+void process_ubx_message(const struct ubx_header *header,
+			 const uint8_t *raw, size_t len,
+			 enum ubx_msg_id msgid,
+			 uint64_t tick)
+{
+	struct ubx_nav_pvt msg;
+	char fix_type[32];
+
+	if (msgid != UBX_NAV_PVT)
+		return;
+
+	memcpy(&msg, raw, len);
+
+	msg.itow            = le32_to_cpu(msg.itow);
+	msg.year            = le16_to_cpu(msg.year);
+	msg.time_acc        = le32_to_cpu(msg.time_acc);
+	msg.nsec            = le32_to_cpu(msg.nsec);
+	msg.lon             = le32_to_cpu(msg.lon);
+	msg.lat             = le32_to_cpu(msg.lat);
+	msg.height_ell      = le32_to_cpu(msg.height_ell);
+	msg.height_msl      = le32_to_cpu(msg.height_msl);
+	msg.horiz_acc       = le32_to_cpu(msg.horiz_acc);
+	msg.vert_acc        = le32_to_cpu(msg.vert_acc);
+	msg.vel_n           = le32_to_cpu(msg.vel_n);
+	msg.vel_e           = le32_to_cpu(msg.vel_e);
+	msg.vel_d           = le32_to_cpu(msg.vel_d);
+	msg.gspeed          = le32_to_cpu(msg.gspeed);
+	msg.motion_heading  = le32_to_cpu(msg.motion_heading);
+	msg.speed_acc       = le32_to_cpu(msg.speed_acc);
+	msg.head_acc        = le32_to_cpu(msg.head_acc);
+	msg.pdop            = le16_to_cpu(msg.pdop);
+	msg.vehicle_heading = le32_to_cpu(msg.vehicle_heading);
+	msg.mag_dec         = le16_to_cpu(msg.mag_dec);
+	msg.mag_dec_acc     = le16_to_cpu(msg.mag_dec_acc);
+
+	switch (msg.fix_type) {
+		case 0:
+			strcpy(fix_type, "no");
+			break;
+		case 1:
+			strcpy(fix_type, "dead-reckoning");
+			break;
+		case 2:
+			strcpy(fix_type, "2D");
+			break;
+		case 3:
+			strcpy(fix_type, "3D");
+			break;
+		case 4:
+			strcpy(fix_type, "GNSS + dead-reckoning");
+			break;
+		case 5:
+			strcpy(fix_type, "time-only");
+			break;
+		default:
+			snprintf(fix_type, sizeof(fix_type), "<%u>",
+				 msg.fix_type);
+			break;
+	}
+
+	fprintf(stderr, "UBX-NAV-PVT @ %u "
+		"valid d%s t%s fr%s m%s f%s vh%s , "
+		"%04u-%02u-%02u %02u:%02u:%02u +- %uns , "
+		"%s fix diff-corr %sapplied , "
+		"UTC validity %savailable d%s t%s , "
+		"%u SVs , "
+		"lat %.7f lon %.7f alt %.3f MSL %.3f ellipsoid , "
+		"acc horiz %u vert %u , "
+		"NED vel %d %d %d gspeed %d acc %u , "
+		"head motion %.5f vehicle %.5f acc %.5f , "
+		"mag dec %.2f acc %.2f , "
+		"PDOP %.2f\n",
+		msg.itow,
+		(msg.valid & 0x01) ? "Y" : "N",
+		(msg.valid & 0x02) ? "Y" : "N",
+		(msg.valid & 0x04) ? "Y" : "N",
+		(msg.valid & 0x08) ? "Y" : "N",
+		(msg.flags & 0x01) ? "Y" : "N",
+		(msg.flags & 0x20) ? "Y" : "N",
+		msg.year, msg.month, msg.day,
+		msg.hour, msg.min, msg.sec,
+		msg.time_acc,
+		fix_type,
+		(msg.flags & 0x02) ? "" : "not-",
+		(msg.flags2 & 0x20) ? "" : "not-",
+		(msg.flags2 & 0x40) ? "Y" : "N",
+		(msg.flags2 & 0x80) ? "Y" : "N",
+		msg.num_sv,
+		((int32_t) msg.lat) * 1e-7,
+		((int32_t) msg.lon) * 1e-7,
+		((int32_t) msg.height_msl) / 1000.,
+		((int32_t) msg.height_ell) / 1000.,
+		msg.horiz_acc, msg.vert_acc,
+		msg.vel_n, msg.vel_e, msg.vel_d, msg.gspeed,
+		msg.speed_acc,
+		((int32_t) msg.motion_heading) * 1e-5,
+		((int32_t) msg.vehicle_heading) * 1e-5,
+		((int32_t) msg.head_acc) * 1e-5,
+		((int32_t) msg.mag_dec) / 100.,
+		msg.mag_dec_acc / 100.,
+		msg.pdop * 0.01);
+}