k4be 5a76b3c919 gps-test-tool: fix mktime() applying local TZ to UTC NMEA timestamps před 1 týdnem
..
avr 139fe81b28 Add test system for NMEA parsing and GPX generation před 1 týdnem
.gitignore 3f6735e9c3 Harden reset-cause/speed-gating edge cases; wire the test tool up to the real system log před 1 týdnem
HD44780-I2C.h 139fe81b28 Add test system for NMEA parsing and GPX generation před 1 týdnem
Makefile 760f59354c Share auto-pause detection between the firmware and gps-test-tool před 1 týdnem
README.md e65ed23194 Remove outdated info from README před 1 týdnem
UC1601S-I2C.h 139fe81b28 Add test system for NMEA parsing and GPX generation před 1 týdnem
autopause_wrapper.c 760f59354c Share auto-pause detection between the firmware and gps-test-tool před 1 týdnem
avr_compat.h 139fe81b28 Add test system for NMEA parsing and GPX generation před 1 týdnem
expander.h 139fe81b28 Add test system for NMEA parsing and GPX generation před 1 týdnem
gpx_wrapper.c 139fe81b28 Add test system for NMEA parsing and GPX generation před 1 týdnem
main.c 36f399eae4 Track pause state via tracking_is_paused(), harden GGA/auto-pause edge cases před 1 týdnem
main.h 5a76b3c919 gps-test-tool: fix mktime() applying local TZ to UTC NMEA timestamps před 1 týdnem
malformed_test.nmea 3f6735e9c3 Harden reset-cause/speed-gating edge cases; wire the test tool up to the real system log před 1 týdnem
nmea_actual_wrapper.c 139fe81b28 Add test system for NMEA parsing and GPX generation před 1 týdnem
nmea_wrapper.c 139fe81b28 Add test system for NMEA parsing and GPX generation před 1 týdnem
settings.h 139fe81b28 Add test system for NMEA parsing and GPX generation před 1 týdnem
stime.h 139fe81b28 Add test system for NMEA parsing and GPX generation před 1 týdnem
syslog_wrapper.c 3f6735e9c3 Harden reset-cause/speed-gating edge cases; wire the test tool up to the real system log před 1 týdnem
test_malformed.c 6b49b6226f Fix off-by-one warm-up sample threshold in malformed-NMEA test před 1 týdnem
timec.h 139fe81b28 Add test system for NMEA parsing and GPX generation před 1 týdnem
xprintf.h 139fe81b28 Add test system for NMEA parsing and GPX generation před 1 týdnem

README.md

GPS Test Tool - PC Application

Standalone PC program that reprocesses recorded NMEA logs (or lets you feed NMEA sentences from a live source) through the actual embedded filtering and GPX-generation code from ../soft (gpx.c, nmea.c, autopause.c, syslog.c), unmodified. Useful for reviewing/re-tuning filter behavior against real recorded tracks, and for regression-testing the parser against malformed input, without flashing a device.

How it works

main.h is a single central header that switches between the embedded build and a PC build via #define PC_BUILD:

  • Standard C headers (stdio, time, math, ...) instead of AVR headers
  • Stub avr/*.h headers (pgmspace.h, interrupt.h, eeprom.h, io.h) so __flash/PROGMEM-style code compiles as plain RAM data
  • Stub project headers (stime.h, settings.h, timec.h, expander.h, display headers) that satisfy includes without pulling in embedded-only code
  • A FIL/f_*() FatFS-like shim backed by plain FILE*, so gpx.c can write files without linking ff.c

Each *_wrapper.c file just does #define PC_BUILD / #include "main.h" and then #include "../soft/<file>.c", so the real embedded source is compiled as-is, not copied. main.c is the tool's own driver/main() — soft/main.c itself is not part of this build.

Build

cd gps-test-tool
make            # builds ./gps-test-tool
make clean      # removes build artifacts and generated output/debug files

Running

./gps-test-tool <input.nmea>

Each run processes the input file twice — once with filters enabled, once disabled — and produces four files in the current directory:

  • output_filtered.gpx / output_unfiltered.gpx — GPX 1.1 tracks
  • debug_filtered.txt / debug_unfiltered.txt — per-run debug console output plus a summary (points processed, distance, elevation gain/loss, moving/stopped time, average speeds)

"Filters enabled" mirrors an out-of-the-box device: Kalman filtering, distance/minimum-distance thresholds, 3-point averaging, and auto-pause are all active. "Filters disabled" turns off the distance/Kalman filtering (CONFFLAG_DISABLE_FILTERS) so you can compare raw vs. filtered output for the same input.

Adjusting settings

There's no command-line or interactive settings UI. To try different device settings against a log, edit the defaults in reset_system() in main.c (around line 67) and rebuild:

System.conf.skip_points = 0;
System.conf.auto_pause_time = 30;   // seconds
System.conf.auto_pause_dist = 10;   // meters
System.conf.auto_pause_speed = 3;   // km/h
System.conf.min_sats = 4;           // minimum satellites for a valid fix

These match soft/settings.c's out-of-the-box defaults, so start from a known-good baseline before changing them.

Input format

Plain text, one NMEA sentence per line (\n or \r\n), the same as a device's raw log file. The parser only acts on recognized sentences (RMC, GGA, GSA, VTG, ...); unrelated lines are ignored. Example minimal input:

$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47

Automated tests

A regression test (test-malformed) feeds the real gps_parse() a fixture of real and synthetic edge-case NMEA sentences (malformed_test.nmea): truncated lines, bad checksums, invalid epochs, short dialect variants, and a run long enough to exercise HDOP-based speed-sample gating.

make run-test-malformed

This builds test-malformed and runs it against malformed_test.nmea. It asserts that:

  • nothing crashes the parser, regardless of how malformed a line is (run under valgrind/ASan for a stronger guarantee than "exited zero")
  • invalid-epoch lines (RMC status V, VTG mode N) do not add a speed sample
  • a genuinely poor-quality fast sample (bad HDOP) is excluded from the speed average outright
  • a genuinely fast, good-quality sample is capped rather than excluded or let through raw

To run it against a different fixture file:

./test-malformed path/to/other.nmea

Any non-zero exit / FAIL: line means a check failed.