From 020476df4694dc186309265f164f9b17ea4a3d70 Mon Sep 17 00:00:00 2001 From: curt Date: Sat, 2 Jul 2005 20:53:42 +0000 Subject: [PATCH] Add a small utility that can read a saved GPS track, interpolate data points at some higher frequency, approximate roll/pitch angles, and blast the result over to FlightGear using FGNetFDM udp packets. --- utils/GPSsmooth/Makefile.am | 9 + utils/GPSsmooth/ShortDemo.txt | 1004 +++++++++++++++++++++++++++++++++ utils/GPSsmooth/gps.cxx | 159 ++++++ utils/GPSsmooth/gps.hxx | 109 ++++ utils/GPSsmooth/main.cxx | 468 +++++++++++++++ utils/Makefile.am | 2 +- utils/js_server/Makefile.am | 2 +- 7 files changed, 1751 insertions(+), 2 deletions(-) create mode 100644 utils/GPSsmooth/Makefile.am create mode 100644 utils/GPSsmooth/ShortDemo.txt create mode 100644 utils/GPSsmooth/gps.cxx create mode 100644 utils/GPSsmooth/gps.hxx create mode 100644 utils/GPSsmooth/main.cxx diff --git a/utils/GPSsmooth/Makefile.am b/utils/GPSsmooth/Makefile.am new file mode 100644 index 000000000..8b3c2eca5 --- /dev/null +++ b/utils/GPSsmooth/Makefile.am @@ -0,0 +1,9 @@ +noinst_PROGRAMS = GPSsmooth + +GPSsmooth_SOURCES = \ + gps.cxx gps.hxx \ + main.cxx + +GPSsmooth_LDADD = -lsgtiming -lsgmisc -lplibnet -lz + +INCLUDES = -I$(top_srcdir)/src diff --git a/utils/GPSsmooth/ShortDemo.txt b/utils/GPSsmooth/ShortDemo.txt new file mode 100644 index 000000000..0f5180b89 --- /dev/null +++ b/utils/GPSsmooth/ShortDemo.txt @@ -0,0 +1,1004 @@ +$GPGSV,3,1,12,01,23,247,48,03,05,252,41,05,11,099,41,09,36,055,45*7E +$GPGSV,3,2,12,11,07,322,00,14,62,260,44,15,43,179,45,18,47,101,43*7A +$GPGSV,3,3,12,19,15,278,42,21,09,160,37,22,80,051,44,35,25,131,41*7F +$GPGLL,4513.2294,N,09308.6713,W,175212,A,D*5D +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.1,M,4.0,M*2C +$PGRMZ,1198,f,3*2A +$GPRTE,1,1,c,*37 +$GPRMC,175214,A,4513.2363,N,09308.6684,W,12.8,10.9,010705,1.3,E,D*03 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175214,4513.2363,N,09308.6684,W,2,12,1.1,371.8,M,-31.2,M,,*7D +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.6,1.1,1.1*3E +$GPGSV,3,1,12,01,23,247,49,03,05,252,42,05,11,099,41,09,36,055,45*7C +$GPGSV,3,2,12,11,07,322,00,14,62,260,43,15,43,179,45,18,47,101,45*7B +$GPGSV,3,3,12,19,15,278,42,21,09,160,38,22,80,051,45,35,25,131,41*71 +$GPGLL,4513.2363,N,09308.6684,W,175214,A,D*5D +$GPBOD,,T,,M,,*47 +$PGRME,2.5,M,2.9,M,3.8,M*29 +$PGRMZ,1220,f,3*2A +$GPRTE,1,1,c,*37 +$GPRMC,175216,A,4513.2436,N,09308.6692,W,16.1,349.7,010705,1.3,E,D*3D +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175216,4513.2436,N,09308.6692,W,2,12,1.1,369.3,M,-31.2,M,,*7D +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.6,1.1,1.1*3E +$GPGSV,3,1,12,01,23,247,48,03,05,252,43,05,11,099,40,09,36,055,43*7B +$GPGSV,3,2,12,11,07,322,00,14,62,260,46,15,43,179,46,18,47,101,45*7D +$GPGSV,3,3,12,19,15,278,42,21,09,160,41,22,80,051,45,35,25,131,41*7F +$GPGLL,4513.2436,N,09308.6692,W,175216,A,D*5F +$GPBOD,,T,,M,,*47 +$PGRME,2.5,M,2.9,M,3.8,M*29 +$PGRMZ,1212,f,3*2B +$GPRTE,1,1,c,*37 +$GPRMC,175218,A,4513.2561,N,09308.6730,W,26.2,349.8,010705,1.3,E,D*36 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175218,4513.2561,N,09308.6730,W,2,11,1.3,364.1,M,-31.2,M,,*77 +$GPGSA,A,3,01,03,05,09,,14,15,18,19,21,22,35,2.1,1.3,1.5*3C +$GPGSV,3,1,12,01,23,247,46,03,05,252,42,05,11,099,40,09,36,055,43*74 +$GPGSV,3,2,12,11,07,322,00,14,62,260,48,15,43,179,44,18,47,101,45*71 +$GPGSV,3,3,12,19,15,278,42,21,09,160,40,22,80,051,44,35,25,131,40*7E +$GPGLL,4513.2561,N,09308.6730,W,175218,A,D*5B +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.0,M,4.0,M*2D +$PGRMZ,1194,f,3*26 +$GPRTE,1,1,c,*37 +$GPRMC,175220,A,4513.2720,N,09308.6774,W,29.5,346.4,010705,1.3,E,D*31 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175220,4513.2720,N,09308.6774,W,2,11,1.5,362.6,M,-31.2,M,,*7C +$GPGSA,A,3,01,03,05,09,,14,15,18,19,21,22,35,2.3,1.5,1.6*3B +$GPGSV,3,1,12,01,23,247,48,03,05,252,43,05,11,099,38,09,36,055,43*74 +$GPGSV,3,2,12,11,07,322,00,14,62,260,47,15,43,179,45,18,47,101,45*7F +$GPGSV,3,3,12,19,15,278,43,21,09,160,00,22,80,051,46,35,25,131,40*79 +$GPGLL,4513.2720,N,09308.6774,W,175220,A,D*57 +$GPBOD,,T,,M,,*47 +$PGRME,2.5,M,3.1,M,4.0,M*2F +$PGRMZ,1190,f,3*22 +$GPRTE,1,1,c,*37 +$GPRMC,175222,A,4513.2824,N,09308.6899,W,25.1,308.0,010705,1.3,E,D*32 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175222,4513.2824,N,09308.6899,W,2,11,1.6,368.7,M,-31.2,M,,*71 +$GPGSA,A,3,01,03,05,09,,14,15,18,19,21,22,35,2.3,1.6,1.6*38 +$GPGSV,3,1,12,01,23,247,47,03,05,252,44,05,11,099,39,09,36,055,42*7C +$GPGSV,3,2,12,11,07,322,00,14,62,260,46,15,43,179,43,18,46,101,45*79 +$GPGSV,3,3,12,19,15,278,00,21,09,160,43,22,80,051,46,35,25,131,39*77 +$GPGLL,4513.2824,N,09308.6899,W,175222,A,D*52 +$GPBOD,,T,,M,,*47 +$PGRME,2.8,M,3.1,M,4.2,M*20 +$PGRMZ,1210,f,3*29 +$GPRTE,1,1,c,*37 +$GPRMC,175224,A,4513.2846,N,09308.7081,W,23.7,274.6,010705,1.3,E,D*3C +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175224,4513.2846,N,09308.7081,W,2,12,2.1,373.6,M,-31.2,M,,*7F +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,3.0,2.1,2.1*3A +$GPGSV,3,1,12,01,23,247,00,03,05,252,00,05,11,099,38,09,36,055,44*78 +$GPGSV,3,2,12,11,07,322,39,14,62,260,43,15,43,179,46,18,46,101,44*72 +$GPGSV,3,3,12,19,15,278,00,21,09,160,43,22,80,051,46,35,25,131,40*79 +$GPGLL,4513.2846,N,09308.7081,W,175224,A,D*50 +$GPBOD,,T,,M,,*47 +$PGRME,2.9,M,3.5,M,4.6,M*21 +$PGRMZ,1226,f,3*2C +$GPRTE,1,1,c,*37 +$GPRMC,175226,A,4513.2848,N,09308.7247,W,20.4,274.5,010705,1.3,E,D*3B +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175226,4513.2848,N,09308.7247,W,2,12,1.0,375.7,M,-31.2,M,,*7E +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.6,1.0,1.2*3C +$GPGSV,3,1,12,01,23,247,00,03,05,252,00,05,11,099,38,09,36,055,43*7F +$GPGSV,3,2,12,11,07,322,40,14,62,260,41,15,43,179,48,18,46,101,47*73 +$GPGSV,3,3,12,19,15,277,38,21,09,160,41,22,80,051,47,35,25,131,40*7E +$GPGLL,4513.2848,N,09308.7247,W,175226,A,D*54 +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.1,M,4.1,M*2D +$PGRMZ,1232,f,3*29 +$GPRTE,1,1,c,*37 +$GPRMC,175228,A,4513.2909,N,09308.7357,W,19.4,323.6,010705,1.3,E,D*3B +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175228,4513.2909,N,09308.7357,W,2,12,1.3,367.0,M,-31.2,M,,*73 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.0,1.3,1.5*3D +$GPGSV,3,1,12,01,23,247,40,03,05,252,00,05,11,099,40,09,36,055,44*73 +$GPGSV,3,2,12,11,07,322,00,14,62,260,44,15,43,179,46,18,46,101,47*7C +$GPGSV,3,3,12,19,15,277,00,21,09,160,43,22,80,051,49,35,25,131,39*77 +$GPGLL,4513.2909,N,09308.7357,W,175228,A,D*5E +$GPBOD,,T,,M,,*47 +$PGRME,2.9,M,3.3,M,4.4,M*25 +$PGRMZ,1204,f,3*2C +$GPRTE,1,1,c,*37 +$GPRMC,175230,A,4513.3040,N,09308.7351,W,27.3,9.6,010705,1.3,E,D*30 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175230,4513.3040,N,09308.7351,W,2,12,1.4,353.2,M,-31.2,M,,*7B +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.0,1.4,1.3*3C +$GPGSV,3,1,12,01,23,247,42,03,05,252,39,05,11,099,41,09,36,055,44*7A +$GPGSV,3,2,12,11,07,322,00,14,62,260,46,15,43,179,46,18,46,101,45*7C +$GPGSV,3,3,12,19,15,277,41,21,09,160,41,22,80,051,48,35,25,131,40*7F +$GPGLL,4513.3040,N,09308.7351,W,175230,A,D*54 +$GPBOD,,T,,M,,*47 +$PGRME,2.5,M,3.0,M,3.9,M*20 +$PGRMZ,1159,f,3*27 +$GPRTE,1,1,c,*37 +$GPRMC,175232,A,4513.3178,N,09308.7295,W,24.4,14.2,010705,1.3,E,D*0D +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175232,4513.3178,N,09308.7295,W,2,12,1.1,352.3,M,-31.2,M,,*7F +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.6,1.1,1.2*3D +$GPGSV,3,1,12,01,23,247,44,03,05,252,39,05,11,099,40,09,36,055,45*7C +$GPGSV,3,2,12,11,07,322,00,14,62,260,46,15,43,179,45,18,46,101,45*7F +$GPGSV,3,3,12,19,15,277,44,21,09,160,40,22,80,051,47,35,25,131,40*74 +$GPGLL,4513.3178,N,09308.7295,W,175232,A,D*55 +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,2.9,M,3.9,M*2B +$PGRMZ,1156,f,3*28 +$GPRTE,1,1,c,*37 +$GPRMC,175234,A,4513.3258,N,09308.7265,W,13.2,15.3,010705,1.3,E,D*07 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175234,4513.3258,N,09308.7265,W,2,12,1.1,358.1,M,-31.2,M,,*7F +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.7,1.1,1.3*3D +$GPGSV,3,1,12,01,23,247,46,03,05,252,39,05,11,099,41,09,36,055,45*7F +$GPGSV,3,2,12,11,07,322,00,14,62,260,46,15,43,179,45,18,46,101,46*7C +$GPGSV,3,3,12,19,15,277,42,21,09,160,40,22,80,051,46,35,25,131,40*73 +$GPGLL,4513.3258,N,09308.7265,W,175234,A,D*5D +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.0,M,4.0,M*2D +$PGRMZ,1175,f,3*29 +$GPRTE,1,1,c,*37 +$GPRMC,175236,A,4513.3314,N,09308.7226,W,12.2,30.0,010705,1.3,E,D*0E +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175236,4513.3314,N,09308.7226,W,2,11,1.0,355.4,M,-31.2,M,,*79 +$GPGSA,A,3,01,03,05,09,,14,15,18,19,21,22,35,1.7,1.0,1.3*3C +$GPGSV,3,1,12,01,23,247,45,03,05,252,39,05,11,099,41,09,36,055,44*7D +$GPGSV,3,2,12,11,07,322,00,14,62,260,48,15,43,179,46,18,46,101,46*71 +$GPGSV,3,3,12,19,15,277,43,21,09,160,40,22,80,051,45,35,25,131,39*7F +$GPGLL,4513.3314,N,09308.7226,W,175236,A,D*51 +$GPBOD,,T,,M,,*47 +$PGRME,2.5,M,2.9,M,3.8,M*29 +$PGRMZ,1166,f,3*2B +$GPRTE,1,1,c,*37 +$GPRMC,175238,A,4513.3368,N,09308.7110,W,20.3,65.1,010705,1.3,E,D*0C +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175238,4513.3368,N,09308.7110,W,2,12,1.2,343.2,M,-31.2,M,,*7A +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.0,1.2,1.5*3C +$GPGSV,3,1,12,01,23,247,44,03,05,252,40,05,11,099,41,09,36,055,42*74 +$GPGSV,3,2,12,11,07,322,39,14,62,260,45,15,43,179,47,18,46,101,47*76 +$GPGSV,3,3,12,19,15,277,44,21,09,160,40,22,80,056,47,35,25,131,39*7D +$GPGLL,4513.3368,N,09308.7110,W,175238,A,D*52 +$GPBOD,,T,,M,,*47 +$PGRME,2.5,M,3.0,M,3.9,M*20 +$PGRMZ,1126,f,3*2F +$GPRTE,1,1,c,*37 +$GPRMC,175240,A,4513.3232,N,09308.6898,W,44.0,147.4,010705,1.3,E,D*30 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175240,4513.3232,N,09308.6898,W,2,12,1.4,322.5,M,-31.2,M,,*75 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.2,1.4,1.1*3C +$GPGSV,3,1,12,01,23,247,43,03,05,252,41,05,11,099,00,09,36,055,41*74 +$GPGSV,3,2,12,11,07,322,39,14,62,260,44,15,43,179,47,18,46,101,47*77 +$GPGSV,3,3,12,19,15,277,43,21,09,160,40,22,80,056,47,35,25,131,38*7B +$GPGLL,4513.3232,N,09308.6898,W,175240,A,D*5B +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.1,M,4.1,M*2D +$PGRMZ,1058,f,3*27 +$GPRTE,1,1,c,*37 +$GPRMC,175242,A,4513.2962,N,09308.6887,W,44.2,189.4,010705,1.3,E,D*33 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175242,4513.2962,N,09308.6887,W,2,12,2.5,306.3,M,-31.2,M,,*74 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,3.2,2.5,1.0*3E +$GPGSV,3,1,12,01,23,247,44,03,05,252,42,05,11,099,35,09,36,055,45*72 +$GPGSV,3,2,12,11,07,322,39,14,62,260,44,15,43,179,44,18,46,101,48*7B +$GPGSV,3,3,12,19,15,277,42,21,09,160,00,22,80,056,49,35,25,131,00*7B +$GPGLL,4513.2962,N,09308.6887,W,175242,A,D*58 +$GPBOD,,T,,M,,*47 +$PGRME,2.7,M,3.0,M,4.2,M*2E +$PGRMZ,1005,f,3*2F +$GPRTE,1,1,c,*37 +$GPRMC,175244,A,4513.2710,N,09308.6957,W,42.9,188.9,010705,1.3,E,D*33 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175244,4513.2710,N,09308.6957,W,2,12,1.5,312.3,M,-31.2,M,,*73 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.9,1.5,1.3*34 +$GPGSV,3,1,12,01,23,247,44,03,05,252,39,05,11,099,40,09,36,055,48*71 +$GPGSV,3,2,12,11,07,322,40,14,62,260,42,15,43,179,43,18,46,101,48*74 +$GPGSV,3,3,12,19,15,277,41,21,09,160,00,22,80,056,47,35,25,131,00*76 +$GPGLL,4513.2710,N,09308.6957,W,175244,A,D*59 +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.0,M,4.3,M*2E +$PGRMZ,1025,f,3*2D +$GPRTE,1,1,c,*37 +$GPRMC,175246,A,4513.2520,N,09308.7005,W,31.9,193.3,010705,1.3,E,D*3B +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175246,4513.2520,N,09308.7005,W,2,12,1.3,318.4,M,-31.2,M,,*74 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.6,1.3,1.0*3D +$GPGSV,3,1,12,01,23,247,44,03,05,252,40,05,11,099,00,09,36,055,49*7A +$GPGSV,3,2,12,11,07,322,42,14,62,260,41,15,43,179,00,18,46,101,48*72 +$GPGSV,3,3,12,19,15,277,42,21,09,160,35,22,80,056,45,35,25,131,00*71 +$GPGLL,4513.2520,N,09308.7005,W,175246,A,D*55 +$GPBOD,,T,,M,,*47 +$PGRME,2.7,M,3.1,M,4.3,M*2E +$PGRMZ,1045,f,3*2B +$GPRTE,1,1,c,*37 +$GPRMC,175248,A,4513.2363,N,09308.7062,W,30.4,193.0,010705,1.3,E,D*3A +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175248,4513.2363,N,09308.7062,W,2,12,1.1,321.5,M,-31.2,M,,*73 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.6,1.1,1.0*3F +$GPGSV,3,1,12,01,23,247,43,03,05,252,40,05,11,099,45,09,36,055,50*74 +$GPGSV,3,2,12,11,07,322,41,14,62,260,42,15,43,179,00,18,46,101,50*7B +$GPGSV,3,3,12,19,15,277,42,21,09,160,00,22,80,056,46,35,25,131,00*74 +$GPGLL,4513.2363,N,09308.7062,W,175248,A,D*5B +$GPBOD,,T,,M,,*47 +$PGRME,2.9,M,3.0,M,4.4,M*26 +$PGRMZ,1055,f,3*2A +$GPRTE,1,1,c,*37 +$GPRMC,175250,A,4513.2176,N,09308.7123,W,35.5,194.0,010705,1.3,E,D*32 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175250,4513.2176,N,09308.7123,W,2,12,1.7,314.2,M,-31.2,M,,*7F +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.2,1.7,1.2*3C +$GPGSV,3,1,12,01,23,247,41,03,05,252,41,05,11,099,45,09,36,055,50*77 +$GPGSV,3,2,12,11,07,322,40,14,62,260,44,15,43,179,00,18,46,101,51*7D +$GPGSV,3,3,12,19,15,277,42,21,09,160,00,22,80,056,45,35,25,131,41*72 +$GPGLL,4513.2176,N,09308.7123,W,175250,A,D*50 +$GPBOD,,T,,M,,*47 +$PGRME,3.2,M,3.1,M,4.6,M*2F +$PGRMZ,1031,f,3*28 +$GPRTE,1,1,c,*37 +$GPRMC,175252,A,4513.1966,N,09308.7187,W,38.3,192.2,010705,1.3,E,D*3B +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175252,4513.1966,N,09308.7187,W,2,12,1.2,310.1,M,-31.2,M,,*7B +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.7,1.2,1.2*3F +$GPGSV,3,1,12,01,23,247,40,03,05,252,42,05,11,099,45,09,36,055,50*75 +$GPGSV,3,2,12,11,07,322,41,14,62,260,45,15,43,179,00,18,46,101,51*7D +$GPGSV,3,3,12,19,15,277,42,21,09,160,00,22,80,056,45,35,25,131,00*77 +$GPGLL,4513.1966,N,09308.7187,W,175252,A,D*56 +$GPBOD,,T,,M,,*47 +$PGRME,3.3,M,3.0,M,4.7,M*2E +$PGRMZ,1017,f,3*2C +$GPRTE,1,1,c,*37 +$GPRMC,175254,A,4513.1753,N,09308.7224,W,40.0,184.9,010705,1.3,E,D*3F +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175254,4513.1753,N,09308.7224,W,2,12,1.4,314.0,M,-31.2,M,,*7C +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.0,1.4,1.4*3B +$GPGSV,3,1,12,01,23,247,42,03,05,252,41,05,11,099,44,09,36,055,51*74 +$GPGSV,3,2,12,11,07,322,41,14,62,260,43,15,43,179,00,18,46,101,49*72 +$GPGSV,3,3,12,19,15,277,41,21,09,160,00,22,80,056,46,35,25,131,00*77 +$GPGLL,4513.1753,N,09308.7224,W,175254,A,D*52 +$GPBOD,,T,,M,,*47 +$PGRME,4.5,M,3.1,M,5.9,M*21 +$PGRMZ,1030,f,3*29 +$GPRTE,1,1,c,*37 +$GPRMC,175256,A,4513.1504,N,09308.7151,W,46.7,162.4,010705,1.3,E,D*38 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175256,4513.1504,N,09308.7151,W,2,12,1.5,327.0,M,-31.2,M,,*7E +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.1,1.5,1.6*39 +$GPGSV,3,1,12,01,23,247,44,03,05,252,43,05,11,099,42,09,36,055,50*77 +$GPGSV,3,2,12,11,07,322,42,14,62,260,43,15,43,179,46,18,46,101,46*7C +$GPGSV,3,3,12,19,15,277,41,21,09,160,38,22,80,056,47,35,25,131,00*7D +$GPGLL,4513.1504,N,09308.7151,W,175256,A,D*51 +$GPBOD,,T,,M,,*47 +$PGRME,2.8,M,3.3,M,4.4,M*24 +$PGRMZ,1073,f,3*2E +$GPRTE,1,1,c,*37 +$GPRMC,175258,A,4513.1391,N,09308.6906,W,35.8,103.8,010705,1.3,E,D*37 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175258,4513.1391,N,09308.6906,W,2,12,1.2,352.2,M,-31.2,M,,*76 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.8,1.2,1.3*31 +$GPGSV,3,1,12,01,23,247,43,03,05,252,44,05,11,099,41,09,36,055,48*7D +$GPGSV,3,2,12,11,07,322,44,14,62,260,43,15,43,179,00,18,46,101,44*7A +$GPGSV,3,3,12,19,15,277,43,21,09,160,37,22,80,056,46,35,25,131,00*71 +$GPGLL,4513.1391,N,09308.6906,W,175258,A,D*5E +$GPBOD,,T,,M,,*47 +$PGRME,3.0,M,3.1,M,4.5,M*2E +$PGRMZ,1156,f,3*28 +$GPRTE,1,1,c,*37 +$GPRMC,175300,A,4513.1492,N,09308.6666,W,45.4,27.8,010705,1.3,E,D*0A +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175300,4513.1492,N,09308.6666,W,2,11,1.6,366.7,M,-31.2,M,,*72 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,2.2,1.6,1.2*3B +$GPGSV,3,1,12,01,23,247,45,03,05,252,45,05,11,099,40,09,36,055,46*75 +$GPGSV,3,2,12,11,07,322,45,14,62,260,44,15,43,179,45,18,46,101,44*7D +$GPGSV,3,3,12,19,15,277,44,21,09,160,40,22,80,056,46,35,25,131,42*70 +$GPGLL,4513.1492,N,09308.6666,W,175300,A,D*5F +$GPBOD,,T,,M,,*47 +$PGRME,3.1,M,3.2,M,4.5,M*2C +$PGRMZ,1203,f,3*2B +$GPRTE,1,1,c,*37 +$GPRMC,175302,A,4513.1789,N,09308.6745,W,56.8,343.9,010705,1.3,E,A*3A +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175302,4513.1789,N,09308.6745,W,1,11,1.3,364.1,M,-31.2,M,,*7B +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,2.0,1.3,1.3*3D +$GPGSV,3,1,12,01,23,247,45,03,05,252,00,05,11,099,42,09,36,055,45*75 +$GPGSV,3,2,12,11,07,322,43,14,62,260,45,15,43,179,48,18,46,101,44*77 +$GPGSV,3,3,12,19,15,277,42,21,09,160,41,22,80,056,47,35,25,131,41*75 +$GPGLL,4513.1789,N,09308.6745,W,175302,A,A*51 +$GPBOD,,T,,M,,*47 +$PGRME,2.7,M,3.1,M,4.1,M*2C +$PGRMZ,1195,f,3*27 +$GPRTE,1,1,c,*37 +$GPRMC,175304,A,4513.2105,N,09308.6835,W,58.5,349.4,010705,1.3,E,A*31 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175304,4513.2105,N,09308.6835,W,1,11,1.0,365.9,M,-31.2,M,,*7E +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.5,1.0,1.2*39 +$GPGSV,3,1,12,01,23,247,44,03,05,252,00,05,11,099,43,09,36,055,45*75 +$GPGSV,3,2,12,11,07,322,41,14,62,260,46,15,43,179,48,18,46,101,45*77 +$GPGSV,3,3,12,19,15,277,41,21,09,160,42,22,80,056,48,35,25,131,42*79 +$GPGLL,4513.2105,N,09308.6835,W,175304,A,A*5E +$GPBOD,,T,,M,,*47 +$PGRME,2.7,M,3.2,M,4.2,M*2C +$PGRMZ,1201,f,3*29 +$GPRTE,1,1,c,*37 +$GPRMC,175306,A,4513.2438,N,09308.6926,W,62.1,348.4,010705,1.3,E,A*37 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175306,4513.2438,N,09308.6926,W,1,11,1.1,362.6,M,-31.2,M,,*7D +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.7,1.1,1.3*3B +$GPGSV,3,1,12,01,23,247,46,03,05,252,00,05,11,099,43,09,36,055,45*77 +$GPGSV,3,2,12,11,07,322,39,14,62,260,46,15,43,179,49,18,46,101,44*78 +$GPGSV,3,3,12,19,15,277,31,21,09,160,42,22,80,056,49,35,25,131,42*7F +$GPGLL,4513.2438,N,09308.6926,W,175306,A,A*54 +$GPBOD,,T,,M,,*47 +$PGRME,2.7,M,3.2,M,4.2,M*2C +$PGRMZ,1190,f,3*22 +$GPRTE,1,1,c,*37 +$GPRMC,175308,A,4513.2772,N,09308.7034,W,61.1,346.4,010705,1.3,E,D*37 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175308,4513.2772,N,09308.7034,W,2,12,1.2,366.4,M,-31.2,M,,*70 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.9,1.2,1.4*37 +$GPGSV,3,1,12,01,23,247,48,03,05,252,47,05,11,099,41,09,36,055,44*79 +$GPGSV,3,2,12,11,07,322,38,14,62,260,45,15,43,179,48,18,46,101,44*7B +$GPGSV,3,3,12,19,15,277,00,21,09,160,41,22,80,056,49,35,25,131,41*7D +$GPGLL,4513.2772,N,09308.7034,W,175308,A,D*59 +$GPBOD,,T,,M,,*47 +$PGRME,2.9,M,3.3,M,4.3,M*22 +$PGRMZ,1202,f,3*2A +$GPRTE,1,1,c,*37 +$GPRMC,175310,A,4513.3062,N,09308.7246,W,60.0,327.2,010705,1.3,E,D*3F +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175310,4513.3062,N,09308.7246,W,2,12,1.4,370.1,M,-31.2,M,,*7D +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.0,1.4,1.4*3B +$GPGSV,3,1,12,01,23,247,46,03,05,252,47,05,11,099,42,09,36,055,42*72 +$GPGSV,3,2,12,11,07,322,36,14,62,260,45,15,43,179,47,18,46,101,44*7A +$GPGSV,3,3,12,19,15,277,34,21,09,160,38,22,80,056,48,35,25,131,40*74 +$GPGLL,4513.3062,N,09308.7246,W,175310,A,D*50 +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.1,M,4.0,M*2C +$PGRMZ,1214,f,3*2D +$GPRTE,1,1,c,*37 +$GPRMC,175312,A,4513.3279,N,09308.7624,W,62.6,305.0,010705,1.3,E,D*33 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175312,4513.3279,N,09308.7624,W,2,12,1.4,369.9,M,-31.2,M,,*77 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.2,1.4,1.6*3B +$GPGSV,3,1,12,01,23,247,43,03,05,252,45,05,11,099,40,09,36,055,43*76 +$GPGSV,3,2,12,11,07,322,35,14,62,260,44,15,43,179,48,18,46,101,44*77 +$GPGSV,3,3,12,19,15,277,00,21,09,160,38,22,80,056,47,35,25,131,39*72 +$GPGLL,4513.3279,N,09308.7624,W,175312,A,D*5A +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.2,M,4.1,M*2E +$PGRMZ,1214,f,3*2D +$GPRTE,1,1,c,*37 +$GPRMC,175314,A,4513.3467,N,09308.7865,W,38.5,335.0,010705,1.3,E,D*38 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175314,4513.3467,N,09308.7865,W,2,12,1.7,398.2,M,-31.2,M,,*75 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.5,1.7,1.8*31 +$GPGSV,3,1,12,01,23,247,42,03,05,252,43,05,11,099,41,09,36,055,44*77 +$GPGSV,3,2,12,11,07,322,35,14,62,260,42,15,43,179,48,18,46,101,44*71 +$GPGSV,3,3,12,19,15,277,44,21,09,160,42,22,80,056,44,35,25,131,42*70 +$GPGLL,4513.3467,N,09308.7865,W,175314,A,D*5E +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.2,M,4.2,M*2D +$PGRMZ,1307,f,3*2E +$GPRTE,1,1,c,*37 +$GPRMC,175316,A,4513.3623,N,09308.7729,W,46.4,77.7,010705,1.3,E,D*05 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175316,4513.3623,N,09308.7729,W,2,12,1.0,426.7,M,-31.2,M,,*72 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.7,1.0,1.3*3C +$GPGSV,3,1,12,01,23,247,41,03,05,252,41,05,11,099,39,09,36,055,42*7F +$GPGSV,3,2,12,11,07,322,40,14,62,260,38,15,43,179,49,18,46,101,42*79 +$GPGSV,3,3,12,19,15,277,44,21,09,160,44,22,80,056,42,35,25,131,00*76 +$GPGLL,4513.3623,N,09308.7729,W,175316,A,D*59 +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.2,M,4.1,M*2E +$PGRMZ,1400,f,3*2E +$GPRTE,1,1,c,*37 +$GPRMC,175318,A,4513.3458,N,09308.7387,W,55.9,140.8,010705,1.3,E,D*30 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175318,4513.3458,N,09308.7387,W,2,12,1.3,414.8,M,-31.2,M,,*7F +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.3,1.3,2.0*38 +$GPGSV,3,1,12,01,24,248,44,03,05,252,41,05,11,099,00,09,36,055,43*79 +$GPGSV,3,2,12,11,07,322,40,14,62,260,41,15,43,179,48,18,46,101,00*70 +$GPGSV,3,3,12,19,15,277,43,21,09,160,41,22,80,056,40,35,25,131,00*76 +$GPGLL,4513.3458,N,09308.7387,W,175318,A,D*59 +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.2,M,4.2,M*2D +$PGRMZ,1361,f,3*2E +$GPRTE,1,1,c,*37 +$GPRMC,175320,A,4513.3116,N,09308.7311,W,62.2,172.2,010705,1.3,E,D*3F +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175320,4513.3116,N,09308.7311,W,2,12,1.4,403.5,M,-31.2,M,,*78 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.4,1.4,1.6*3D +$GPGSV,3,1,12,01,24,248,43,03,05,252,40,05,11,099,00,09,36,055,46*7A +$GPGSV,3,2,12,11,07,322,38,14,62,260,42,15,43,179,45,18,46,101,50*74 +$GPGSV,3,3,12,19,15,277,42,21,09,160,39,22,80,056,42,35,25,131,00*7A +$GPGLL,4513.3116,N,09308.7311,W,175320,A,D*52 +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.3,M,4.2,M*2C +$PGRMZ,1324,f,3*2F +$GPRTE,1,1,c,*37 +$GPRMC,175322,A,4513.2795,N,09308.7207,W,58.1,165.6,010705,1.3,E,D*3F +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175322,4513.2795,N,09308.7207,W,2,12,1.4,393.3,M,-31.2,M,,*78 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.4,1.4,1.6*3D +$GPGSV,3,1,12,01,24,248,44,03,05,252,38,05,11,099,39,09,36,055,48*76 +$GPGSV,3,2,12,11,07,322,35,14,62,260,42,15,43,179,43,18,46,101,47*79 +$GPGSV,3,3,12,19,15,277,41,21,09,160,33,22,80,056,42,35,25,131,00*73 +$GPGLL,4513.2795,N,09308.7207,W,175322,A,D*5A +$GPBOD,,T,,M,,*47 +$PGRME,2.4,M,3.2,M,4.0,M*2D +$PGRMZ,1290,f,3*21 +$GPRTE,1,1,c,*37 +$GPRMC,175324,A,4513.2519,N,09308.7074,W,55.1,165.1,010705,1.3,E,D*33 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175324,4513.2519,N,09308.7074,W,2,11,2.6,384.6,M,-31.2,M,,*7F +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,3.5,2.6,1.0*3C +$GPGSV,3,1,12,01,24,248,43,03,05,252,41,05,11,099,00,09,36,055,49*74 +$GPGSV,3,2,12,11,07,322,00,14,62,260,41,15,43,179,41,18,46,101,47*7E +$GPGSV,3,3,12,19,15,277,41,21,09,160,33,22,80,056,45,35,25,131,00*74 +$GPGLL,4513.2519,N,09308.7074,W,175324,A,D*5C +$GPBOD,,T,,M,,*47 +$PGRME,3.8,M,3.4,M,5.4,M*23 +$PGRMZ,1262,f,3*2C +$GPRTE,1,1,c,*37 +$GPRMC,175326,A,4513.2129,N,09308.7001,W,71.0,173.2,010705,1.3,E,D*37 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175326,4513.2129,N,09308.7001,W,2,11,3.2,378.7,M,-31.2,M,,*7F +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,3.9,3.2,1.0*35 +$GPGSV,3,1,12,01,24,248,44,03,04,251,41,05,11,099,00,09,36,055,49*71 +$GPGSV,3,2,12,11,07,322,36,14,62,260,41,15,43,179,40,18,46,101,48*75 +$GPGSV,3,3,12,19,15,277,42,21,09,160,32,22,80,056,46,35,25,131,00*75 +$GPGLL,4513.2129,N,09308.7001,W,175326,A,D*5B +$GPBOD,,T,,M,,*47 +$PGRME,5.2,M,3.6,M,6.8,M*22 +$PGRMZ,1242,f,3*2E +$GPRTE,1,1,c,*37 +$GPRMC,175328,A,4513.1841,N,09308.6919,W,44.9,167.3,010705,1.3,E,D*37 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175328,4513.1841,N,09308.6919,W,2,11,3.6,374.3,M,-31.2,M,,*78 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,4.3,3.6,1.0*3C +$GPGSV,3,1,12,01,24,248,44,03,04,251,42,05,11,099,36,09,36,055,49*77 +$GPGSV,3,2,12,11,07,322,00,14,62,260,42,15,43,179,39,18,46,101,46*73 +$GPGSV,3,3,12,19,15,277,41,21,09,160,33,22,80,056,47,35,25,131,00*76 +$GPGLL,4513.1841,N,09308.6919,W,175328,A,D*50 +$GPBOD,,T,,M,,*47 +$PGRME,3.9,M,4.2,M,7.0,M*25 +$PGRMZ,1228,f,3*22 +$GPRTE,1,1,c,*37 +$GPRMC,175330,A,4513.1567,N,09308.6913,W,55.9,187.2,010705,1.3,E,D*32 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175330,4513.1567,N,09308.6913,W,2,10,4.3,378.4,M,-31.2,M,,*7A +$GPGSA,A,3,01,,05,09,11,14,15,18,19,21,22,,4.8,4.3,1.0*36 +$GPGSV,3,1,12,01,24,248,00,03,04,251,40,05,11,099,36,09,36,055,48*74 +$GPGSV,3,2,12,11,07,322,00,14,62,260,43,15,43,179,38,18,46,101,47*72 +$GPGSV,3,3,12,19,15,277,42,21,09,160,34,22,80,056,49,35,25,131,00*7C +$GPGLL,4513.1567,N,09308.6913,W,175330,A,D*5A +$GPBOD,,T,,M,,*47 +$PGRME,5.7,M,4.5,M,8.5,M*20 +$PGRMZ,1242,f,3*2E +$GPRTE,1,1,c,*37 +$GPRMC,175332,A,4513.1353,N,09308.6963,W,38.1,189.8,010705,1.3,E,D*31 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175332,4513.1353,N,09308.6963,W,2,11,1.2,378.9,M,-31.2,M,,*76 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.9,1.2,1.1*34 +$GPGSV,3,1,12,01,24,248,43,03,04,251,39,05,11,099,41,09,36,055,50*74 +$GPGSV,3,2,12,11,07,322,39,14,62,260,00,15,43,179,37,18,46,101,48*7F +$GPGSV,3,3,12,19,15,277,42,21,09,160,00,22,80,056,47,35,25,131,00*75 +$GPGLL,4513.1353,N,09308.6963,W,175332,A,D*5E +$GPBOD,,T,,M,,*47 +$PGRME,3.0,M,3.3,M,4.9,M*20 +$PGRMZ,1243,f,3*2F +$GPRTE,1,1,c,*37 +$GPRMC,175334,A,4513.1157,N,09308.6952,W,37.6,174.0,010705,1.3,E,D*31 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175334,4513.1157,N,09308.6952,W,2,11,1.3,378.6,M,-31.2,M,,*7A +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.9,1.3,1.2*36 +$GPGSV,3,1,12,01,24,248,42,03,04,251,39,05,12,099,44,09,36,055,49*7B +$GPGSV,3,2,12,11,07,322,40,14,62,260,00,15,43,179,42,18,46,101,46*7D +$GPGSV,3,3,12,19,15,277,40,21,09,160,00,22,80,056,47,35,25,131,00*77 +$GPGLL,4513.1157,N,09308.6952,W,175334,A,D*5C +$GPBOD,,T,,M,,*47 +$PGRME,3.2,M,3.6,M,5.1,M*2E +$PGRMZ,1242,f,3*2E +$GPRTE,1,1,c,*37 +$GPRMC,175336,A,4513.0938,N,09308.6840,W,51.1,129.3,010705,1.3,E,D*3D +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175336,4513.0938,N,09308.6840,W,2,11,1.3,377.8,M,-31.2,M,,*7B +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.9,1.3,1.0*34 +$GPGSV,3,1,12,01,24,248,40,03,04,251,40,05,12,099,00,09,36,055,47*79 +$GPGSV,3,2,12,11,07,322,00,14,62,260,42,15,43,179,42,18,46,101,44*7D +$GPGSV,3,3,12,19,15,277,41,21,09,160,40,22,80,056,46,35,25,131,00*73 +$GPGLL,4513.0938,N,09308.6840,W,175336,A,D*5C +$GPBOD,,T,,M,,*47 +$PGRME,3.4,M,3.7,M,5.2,M*2A +$PGRMZ,1240,f,3*2C +$GPRTE,1,1,c,*37 +$GPRMC,175338,A,4513.0915,N,09308.6477,W,53.9,67.1,010705,1.3,E,D*07 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175338,4513.0915,N,09308.6477,W,2,11,1.1,373.0,M,-31.2,M,,*7C +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.7,1.1,1.3*3B +$GPGSV,3,1,12,01,24,248,41,03,04,251,41,05,12,099,00,09,36,055,46*78 +$GPGSV,3,2,12,11,07,322,46,14,62,260,43,15,43,179,43,18,46,101,43*78 +$GPGSV,3,3,12,19,15,277,40,21,09,160,41,22,80,056,46,35,25,131,00*73 +$GPGLL,4513.0915,N,09308.6477,W,175338,A,D*55 +$GPBOD,,T,,M,,*47 +$PGRME,3.0,M,3.7,M,4.8,M*25 +$PGRMZ,1224,f,3*2E +$GPRTE,1,1,c,*37 +$GPRMC,175340,A,4513.1366,N,09308.6240,W,57.7,355.1,010705,1.3,E,A*38 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175340,4513.1366,N,09308.6240,W,1,11,1.3,368.2,M,-31.2,M,,*77 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.9,1.3,1.3*37 +$GPGSV,3,1,12,01,24,248,45,03,04,251,48,05,12,099,38,09,36,055,45*7D +$GPGSV,3,2,12,11,07,322,00,14,62,260,43,15,43,179,41,18,46,101,41*7A +$GPGSV,3,3,12,19,15,277,39,21,09,160,40,22,80,056,46,35,25,131,00*7C +$GPGLL,4513.1366,N,09308.6240,W,175340,A,A*52 +$GPBOD,,T,,M,,*47 +$PGRME,3.5,M,3.8,M,5.3,M*25 +$PGRMZ,1208,f,3*20 +$GPRTE,1,1,c,*37 +$GPRMC,175342,A,4513.1648,N,09308.6319,W,61.8,343.5,010705,1.3,E,A*37 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175342,4513.1648,N,09308.6319,W,1,11,1.5,355.8,M,-31.2,M,,*73 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,2.2,1.5,1.6*3C +$GPGSV,3,1,12,01,24,248,47,03,04,251,46,05,12,099,40,09,36,055,45*7E +$GPGSV,3,2,12,11,07,322,00,14,62,260,45,15,43,179,43,18,46,101,43*7C +$GPGSV,3,3,12,19,15,277,40,21,09,160,39,22,80,056,46,35,25,131,38*77 +$GPGLL,4513.1648,N,09308.6319,W,175342,A,A*54 +$GPBOD,,T,,M,,*47 +$PGRME,3.2,M,3.4,M,5.0,M*2D +$PGRMZ,1167,f,3*2A +$GPRTE,1,1,c,*37 +$GPRMC,175344,A,4513.1991,N,09308.6491,W,65.9,339.8,010705,1.3,E,A*38 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175344,4513.1991,N,09308.6491,W,1,11,1.3,341.4,M,-31.2,M,,*76 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.8,1.3,1.2*37 +$GPGSV,3,1,12,01,24,248,48,03,04,251,45,05,12,099,41,09,36,055,45*73 +$GPGSV,3,2,12,11,07,322,00,14,62,260,47,15,43,179,46,18,46,101,43*7B +$GPGSV,3,3,12,19,15,277,00,21,09,160,39,22,80,056,46,35,25,131,37*7C +$GPGLL,4513.1991,N,09308.6491,W,175344,A,A*5E +$GPBOD,,T,,M,,*47 +$PGRME,3.2,M,3.4,M,5.0,M*2D +$PGRMZ,1120,f,3*29 +$GPRTE,1,1,c,*37 +$GPRMC,175346,A,4513.2333,N,09308.6697,W,65.8,336.0,010705,1.3,E,A*39 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175346,4513.2333,N,09308.6697,W,1,11,1.3,334.6,M,-31.2,M,,*71 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.8,1.3,1.2*37 +$GPGSV,3,1,12,01,24,248,48,03,04,251,44,05,12,099,42,09,36,055,44*70 +$GPGSV,3,2,12,11,07,322,00,14,62,260,46,15,43,179,49,18,46,101,43*75 +$GPGSV,3,3,12,19,15,277,00,21,09,160,37,22,80,056,46,35,25,131,37*72 +$GPGLL,4513.2333,N,09308.6697,W,175346,A,A*59 +$GPBOD,,T,,M,,*47 +$PGRME,3.3,M,3.4,M,5.0,M*2C +$PGRMZ,1098,f,3*2B +$GPRTE,1,1,c,*37 +$GPRMC,175348,A,4513.2651,N,09308.6938,W,63.4,330.5,010705,1.3,E,A*35 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175348,4513.2651,N,09308.6938,W,1,11,1.1,335.5,M,-31.2,M,,*74 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.8,1.1,1.3*34 +$GPGSV,3,1,12,01,24,248,47,03,04,251,42,05,12,099,42,09,35,054,44*7B +$GPGSV,3,2,12,11,07,322,37,14,62,260,44,15,43,179,50,18,46,101,43*7B +$GPGSV,3,3,12,19,15,277,00,21,09,160,39,22,80,056,47,35,25,131,36*7C +$GPGLL,4513.2651,N,09308.6938,W,175348,A,A*5C +$GPBOD,,T,,M,,*47 +$PGRME,2.9,M,3.4,M,4.5,M*23 +$PGRMZ,1101,f,3*2A +$GPRTE,1,1,c,*37 +$GPRMC,175350,A,4513.2930,N,09308.7176,W,55.9,329.0,010705,1.3,E,A*32 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175350,4513.2930,N,09308.7176,W,1,11,1.2,351.7,M,-31.2,M,,*75 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.9,1.2,1.3*36 +$GPGSV,3,1,12,01,24,248,46,03,04,251,41,05,12,099,42,09,35,054,44*79 +$GPGSV,3,2,12,11,07,322,36,14,62,260,43,15,43,179,50,18,46,101,43*7D +$GPGSV,3,3,12,19,15,277,00,21,09,160,39,22,80,056,46,35,25,131,35*7E +$GPGLL,4513.2930,N,09308.7176,W,175350,A,A*5E +$GPBOD,,T,,M,,*47 +$PGRME,3.0,M,3.5,M,4.6,M*29 +$PGRMZ,1154,f,3*2A +$GPRTE,1,1,c,*37 +$GPRMC,175352,A,4513.3073,N,09308.7398,W,36.3,303.2,010705,1.3,E,A*38 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175352,4513.3073,N,09308.7398,W,1,11,1.2,372.6,M,-31.2,M,,*7A +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,2.0,1.2,1.4*3B +$GPGSV,3,1,12,01,24,248,44,03,04,251,40,05,12,099,41,09,35,054,42*7F +$GPGSV,3,2,12,11,07,322,00,14,62,260,42,15,43,179,48,18,46,101,44*77 +$GPGSV,3,3,12,19,15,277,00,21,09,160,42,22,80,056,43,35,25,131,00*71 +$GPGLL,4513.3073,N,09308.7398,W,175352,A,A*51 +$GPBOD,,T,,M,,*47 +$PGRME,3.0,M,3.6,M,4.7,M*2B +$PGRMZ,1222,f,3*28 +$GPRTE,1,1,c,*37 +$GPRMC,175354,A,4513.3060,N,09308.7622,W,25.8,257.1,010705,1.3,E,A*32 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175354,4513.3060,N,09308.7622,W,1,11,1.5,387.5,M,-31.2,M,,*74 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,2.3,1.5,1.7*3C +$GPGSV,3,1,12,01,24,248,42,03,04,251,40,05,12,099,44,09,35,054,43*7D +$GPGSV,3,2,12,11,07,322,37,14,62,260,40,15,43,179,45,18,46,101,46*7E +$GPGSV,3,3,12,19,15,277,00,21,09,160,43,22,80,056,42,35,25,131,42*77 +$GPGLL,4513.3060,N,09308.7622,W,175354,A,A*51 +$GPBOD,,T,,M,,*47 +$PGRME,3.1,M,3.7,M,4.8,M*24 +$PGRMZ,1271,f,3*2E +$GPRTE,1,1,c,*37 +$GPRMC,175356,A,4513.3077,N,09308.7750,W,15.6,299.7,010705,1.3,E,A*3B +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175356,4513.3077,N,09308.7750,W,1,12,1.6,390.5,M,-31.2,M,,*72 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.4,1.6,1.6*3F +$GPGSV,3,1,12,01,24,248,00,03,04,251,41,05,12,099,44,09,35,054,45*7C +$GPGSV,3,2,12,11,07,322,00,14,62,260,00,15,43,179,44,18,46,101,49*70 +$GPGSV,3,3,12,19,15,277,41,21,09,160,41,22,80,056,46,35,25,131,42*74 +$GPGLL,4513.3077,N,09308.7750,W,175356,A,A*51 +$GPBOD,,T,,M,,*47 +$PGRME,3.3,M,3.7,M,5.0,M*2F +$PGRMZ,1281,f,3*21 +$GPRTE,1,1,c,*37 +$GPRMC,175358,A,4513.3141,N,09308.7743,W,21.3,44.5,010705,1.3,E,A*01 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175358,4513.3141,N,09308.7743,W,1,12,1.3,387.9,M,-31.2,M,,*75 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.7,1.3,1.0*3C +$GPGSV,3,1,12,01,24,248,42,03,04,251,42,05,12,099,43,09,35,054,44*7F +$GPGSV,3,2,12,11,07,322,00,14,62,260,42,15,43,179,44,18,46,101,48*77 +$GPGSV,3,3,12,19,15,277,39,21,09,160,41,22,80,056,49,35,25,131,42*74 +$GPGLL,4513.3141,N,09308.7743,W,175358,A,A*59 +$GPBOD,,T,,M,,*47 +$PGRME,3.2,M,3.7,M,4.9,M*26 +$PGRMZ,1273,f,3*2C +$GPRTE,1,1,c,*37 +$GPRMC,175400,A,4513.3187,N,09308.7450,W,42.1,87.5,010705,1.3,E,D*0D +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175400,4513.3187,N,09308.7450,W,2,12,1.5,385.0,M,-31.2,M,,*7A +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.9,1.5,1.0*34 +$GPGSV,3,1,12,01,24,248,43,03,04,251,42,05,12,099,41,09,35,054,41*79 +$GPGSV,3,2,12,11,07,322,00,14,62,260,45,15,43,179,44,18,46,101,45*7D +$GPGSV,3,3,12,19,15,277,39,21,09,160,42,22,80,056,49,35,25,131,41*74 +$GPGLL,4513.3187,N,09308.7450,W,175400,A,D*5D +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.4,M,4.3,M*2A +$PGRMZ,1263,f,3*2D +$GPRTE,1,1,c,*37 +$GPRMC,175402,A,4513.3093,N,09308.7098,W,60.0,127.4,010705,1.3,E,D*30 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175402,4513.3093,N,09308.7098,W,2,12,1.5,383.6,M,-31.2,M,,*7C +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.0,1.5,1.2*3C +$GPGSV,3,1,12,01,24,248,45,03,04,251,43,05,12,099,35,09,35,054,00*78 +$GPGSV,3,2,12,11,07,322,42,14,62,260,47,15,43,179,44,18,46,101,44*78 +$GPGSV,3,3,12,19,15,277,43,21,09,160,42,22,80,056,48,35,25,131,00*7D +$GPGLL,4513.3093,N,09308.7098,W,175402,A,D*5B +$GPBOD,,T,,M,,*47 +$PGRME,2.7,M,3.0,M,4.2,M*2E +$PGRMZ,1258,f,3*25 +$GPRTE,1,1,c,*37 +$GPRMC,175404,A,4513.2715,N,09308.6844,W,81.9,161.5,010705,1.3,E,D*33 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175404,4513.2715,N,09308.6844,W,2,12,1.6,382.8,M,-31.2,M,,*76 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.1,1.6,1.0*3C +$GPGSV,3,1,12,01,24,248,45,03,04,251,43,05,12,099,36,09,35,054,00*7B +$GPGSV,3,2,12,11,07,322,40,14,62,260,47,15,43,179,43,18,46,101,42*7B +$GPGSV,3,3,12,19,15,277,45,21,09,160,41,22,80,056,47,35,25,131,00*77 +$GPGLL,4513.2715,N,09308.6844,W,175404,A,D*5D +$GPBOD,,T,,M,,*47 +$PGRME,2.9,M,3.1,M,4.5,M*26 +$PGRMZ,1256,f,3*2B +$GPRTE,1,1,c,*37 +$GPRMC,175406,A,4513.2281,N,09308.6792,W,79.5,173.8,010705,1.3,E,D*38 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175406,4513.2281,N,09308.6792,W,2,12,2.0,377.4,M,-31.2,M,,*7B +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.6,2.0,1.2*3C +$GPGSV,3,1,12,01,24,248,45,03,04,251,42,05,12,099,00,09,35,054,44*7F +$GPGSV,3,2,12,11,07,322,40,14,62,260,46,15,43,179,41,18,46,101,43*79 +$GPGSV,3,3,12,19,15,277,44,21,09,160,40,22,80,056,49,35,25,131,00*79 +$GPGLL,4513.2281,N,09308.6792,W,175406,A,D*53 +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,3.2,M,4.2,M*2D +$PGRMZ,1238,f,3*23 +$GPRTE,1,1,c,*37 +$GPRMC,175408,A,4513.1834,N,09308.6782,W,81.9,181.0,010705,1.3,E,D*3E +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175408,4513.1834,N,09308.6782,W,2,12,1.8,332.3,M,-31.2,M,,*7E +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.1,1.8,1.0*32 +$GPGSV,3,1,12,01,24,248,44,03,04,251,41,05,12,099,38,09,35,054,45*77 +$GPGSV,3,2,12,11,07,322,38,14,62,261,47,15,43,179,41,18,46,101,44*71 +$GPGSV,3,3,12,19,15,277,43,21,09,160,39,22,80,056,50,35,25,131,00*78 +$GPGLL,4513.1834,N,09308.6782,W,175408,A,D*5B +$GPBOD,,T,,M,,*47 +$PGRME,2.4,M,2.9,M,3.8,M*28 +$PGRMZ,1090,f,3*23 +$GPRTE,1,1,c,*37 +$GPRMC,175410,A,4513.1402,N,09308.6855,W,77.7,189.0,010705,1.3,E,D*34 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175410,4513.1402,N,09308.6855,W,2,11,1.9,339.7,M,-31.2,M,,*76 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,2.5,1.9,1.5*34 +$GPGSV,3,1,12,01,24,248,43,03,04,251,42,05,12,099,00,09,35,054,47*7A +$GPGSV,3,2,12,11,07,322,39,14,62,261,47,15,42,179,40,18,46,101,45*71 +$GPGSV,3,3,12,19,15,277,42,21,09,160,38,22,80,056,50,35,25,131,00*78 +$GPGLL,4513.1402,N,09308.6855,W,175410,A,D*5E +$GPBOD,,T,,M,,*47 +$PGRME,2.5,M,3.0,M,3.9,M*20 +$PGRMZ,1115,f,3*2F +$GPRTE,1,1,c,*37 +$GPRMC,175412,A,4513.1066,N,09308.6877,W,53.8,177.1,010705,1.3,E,D*39 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175412,4513.1066,N,09308.6877,W,2,11,2.3,368.0,M,-31.2,M,,*78 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,3.1,2.3,1.9*34 +$GPGSV,3,1,12,01,24,248,41,03,04,251,41,05,12,099,41,09,35,054,48*71 +$GPGSV,3,2,12,11,07,322,40,14,62,261,44,15,42,179,41,18,46,101,44*7C +$GPGSV,3,3,12,19,15,277,42,21,09,160,37,22,80,056,49,35,25,131,00*7F +$GPGLL,4513.1066,N,09308.6877,W,175412,A,D*5A +$GPBOD,,T,,M,,*47 +$PGRME,2.6,M,2.9,M,3.9,M*2B +$PGRMZ,1207,f,3*2F +$GPRTE,1,1,c,*37 +$GPRMC,175414,A,4513.0898,N,09308.6688,W,33.6,94.6,010705,1.3,E,D*0A +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175414,4513.0898,N,09308.6688,W,2,11,1.7,396.1,M,-31.2,M,,*7F +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,2.2,1.7,1.1*39 +$GPGSV,3,1,12,01,24,248,42,03,04,251,41,05,12,099,39,09,35,054,47*72 +$GPGSV,3,2,12,11,07,322,41,14,62,261,44,15,42,179,39,18,46,101,42*74 +$GPGSV,3,3,12,19,15,277,43,21,09,160,00,22,80,056,46,35,25,131,00*75 +$GPGLL,4513.0898,N,09308.6688,W,175414,A,D*5A +$GPBOD,,T,,M,,*47 +$PGRME,3.4,M,3.3,M,4.8,M*25 +$PGRMZ,1299,f,3*28 +$GPRTE,1,1,c,*37 +$GPRMC,175416,A,4513.1063,N,09308.6546,W,39.8,31.6,010705,1.3,E,D*0F +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175416,4513.1063,N,09308.6546,W,2,11,2.1,404.4,M,-31.2,M,,*7D +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,2.6,2.1,1.2*3B +$GPGSV,3,1,12,01,24,248,46,03,04,251,44,05,12,099,00,09,35,054,00*7A +$GPGSV,3,2,12,11,07,322,43,14,62,261,43,15,42,179,41,18,46,101,44*78 +$GPGSV,3,3,12,19,15,277,43,21,09,160,45,22,80,056,45,35,25,131,38*7C +$GPGLL,4513.1063,N,09308.6546,W,175416,A,D*54 +$GPBOD,,T,,M,,*47 +$PGRME,5.1,M,3.3,M,6.3,M*2F +$PGRMZ,1327,f,3*2C +$GPRTE,1,1,c,*37 +$GPRMC,175418,A,4513.1345,N,09308.6675,W,58.1,334.7,010705,1.3,E,D*3C +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175418,4513.1345,N,09308.6675,W,2,11,1.7,381.8,M,-31.2,M,,*74 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,2.8,1.7,1.5*37 +$GPGSV,3,1,12,01,24,248,45,03,04,251,43,05,12,099,41,09,35,054,44*7B +$GPGSV,3,2,12,11,07,322,42,14,62,261,46,15,42,179,43,18,46,101,45*7F +$GPGSV,3,3,12,19,15,277,42,21,09,160,43,22,80,056,46,35,25,131,40*77 +$GPGLL,4513.1345,N,09308.6675,W,175418,A,D*5E +$GPBOD,,T,,M,,*47 +$PGRME,2.8,M,3.2,M,4.2,M*23 +$PGRMZ,1253,f,3*2E +$GPRTE,1,1,c,*37 +$GPRMC,175420,A,4513.1787,N,09308.6619,W,62.9,342.4,010705,1.3,E,D*34 +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175420,4513.1787,N,09308.6619,W,2,11,1.0,365.7,M,-31.2,M,,*7D +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.5,1.0,1.1*3A +$GPGSV,3,1,12,01,24,248,45,03,04,251,42,05,12,099,41,09,35,054,43*7D +$GPGSV,3,2,12,11,07,322,40,14,62,261,49,15,42,179,45,18,46,101,45*74 +$GPGSV,3,3,12,19,15,277,00,21,09,160,41,22,80,056,45,35,25,131,39*7E +$GPGLL,4513.1787,N,09308.6619,W,175420,A,D*55 +$GPBOD,,T,,M,,*47 +$PGRME,2.9,M,3.3,M,4.4,M*25 +$PGRMZ,1200,f,3*28 +$GPRTE,1,1,c,*37 +$GPRMC,175422,A,4513.2143,N,09308.6744,W,65.4,345.6,010705,1.3,E,D*3D +$GPRMB,A,,,,,,,,,,,,A,D*0E +$GPGGA,175422,4513.2143,N,09308.6744,W,2,11,1.1,354.8,M,-31.2,M,,*77 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.6,1.1,1.2*3B +$GPGSV,3,1,12,01,24,248,46,03,04,251,40,05,12,099,41,09,35,054,41*7E +$GPGSV,3,2,12,11,07,322,39,14,62,261,49,15,42,179,47,18,46,102,45*7B +$GPGSV,3,3,12,19,15,277,00,21,09,160,40,22,80,056,45,35,25,131,00*75 +$GPGLL,4513.2143,N,09308.6744,W,175422,A,D*53 +$GPBOD,,T,,M,,*47 +$PGRME,2.9,M,3.4,M,4.4,M*22 +$PGRMZ,1164,f,3*29 +$GPRTE,1,1,c,*37 +$GPRMC,175424,A,4513.2491,N,09308.6842,W,63.1,351.3,010705,1.3,E,A*3E +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175424,4513.2491,N,09308.6842,W,1,11,1.2,353.7,M,-31.2,M,,*7A +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.7,1.2,1.2*39 +$GPGSV,3,1,12,01,24,248,46,03,04,251,39,05,12,099,42,09,35,054,40*72 +$GPGSV,3,2,12,11,07,322,37,14,62,261,50,15,42,179,48,18,46,102,44*73 +$GPGSV,3,3,12,19,15,277,39,21,09,160,00,22,80,056,45,35,25,131,00*7B +$GPGLL,4513.2491,N,09308.6842,W,175424,A,A*53 +$GPBOD,,T,,M,,*47 +$PGRME,2.9,M,3.3,M,4.4,M*25 +$PGRMZ,1160,f,3*2D +$GPRTE,1,1,c,*37 +$GPRMC,175426,A,4513.2826,N,09308.6870,W,60.4,356.5,010705,1.3,E,A*3A +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175426,4513.2826,N,09308.6870,W,1,12,1.4,356.0,M,-31.2,M,,*7E +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.1,1.4,1.5*3B +$GPGSV,3,1,12,01,24,248,45,03,04,251,39,05,12,099,41,09,35,054,00*76 +$GPGSV,3,2,12,11,07,322,00,14,62,261,49,15,42,179,48,18,46,102,43*78 +$GPGSV,3,3,12,19,14,277,39,21,09,160,00,22,80,056,47,35,25,131,38*73 +$GPGLL,4513.2826,N,09308.6870,W,175426,A,A*50 +$GPBOD,,T,,M,,*47 +$PGRME,3.1,M,3.5,M,4.6,M*28 +$PGRMZ,1168,f,3*25 +$GPRTE,1,1,c,*37 +$GPRMC,175428,A,4513.3156,N,09308.6914,W,58.7,353.6,010705,1.3,E,A*36 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175428,4513.3156,N,09308.6914,W,1,12,1.6,355.4,M,-31.2,M,,*79 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.1,1.6,1.3*3F +$GPGSV,3,1,12,01,24,248,47,03,04,251,40,05,12,099,40,09,35,054,35*7D +$GPGSV,3,2,12,11,07,322,00,14,62,261,48,15,42,179,47,18,46,102,45*70 +$GPGSV,3,3,12,19,14,277,38,21,09,160,00,22,80,056,47,35,25,131,39*73 +$GPGLL,4513.3156,N,09308.6914,W,175428,A,A*52 +$GPBOD,,T,,M,,*47 +$PGRME,3.2,M,3.4,M,4.7,M*2B +$PGRMZ,1166,f,3*2B +$GPRTE,1,1,c,*37 +$GPRMC,175430,A,4513.3428,N,09308.6991,W,44.7,343.9,010705,1.3,E,A*3D +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175430,4513.3428,N,09308.6991,W,1,12,2.1,372.1,M,-31.2,M,,*75 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.6,2.1,1.5*3A +$GPGSV,3,1,12,01,24,248,46,03,04,251,43,05,12,099,40,09,35,054,39*73 +$GPGSV,3,2,12,11,07,322,37,14,62,261,45,15,42,179,46,18,46,102,44*79 +$GPGSV,3,3,12,19,14,277,38,21,09,160,42,22,80,056,46,35,25,131,38*75 +$GPGLL,4513.3428,N,09308.6991,W,175430,A,A*5A +$GPBOD,,T,,M,,*47 +$PGRME,2.8,M,3.2,M,4.3,M*22 +$PGRMZ,1221,f,3*2B +$GPRTE,1,1,c,*37 +$GPRMC,175432,A,4513.3384,N,09308.7019,W,32.6,161.9,010705,1.3,E,A*34 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175432,4513.3384,N,09308.7019,W,1,12,2.6,408.7,M,-31.2,M,,*75 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,3.1,2.6,1.0*3E +$GPGSV,3,1,12,01,24,248,44,03,04,251,42,05,12,099,41,09,35,054,39*71 +$GPGSV,3,2,12,11,07,322,00,14,62,261,00,15,42,179,45,18,46,102,43*78 +$GPGSV,3,3,12,19,14,277,00,21,09,160,42,22,80,056,44,35,25,131,37*73 +$GPGLL,4513.3384,N,09308.7019,W,175432,A,A*51 +$GPBOD,,T,,M,,*47 +$PGRME,4.0,M,3.3,M,5.4,M*2B +$PGRMZ,1341,f,3*2C +$GPRTE,1,1,c,*37 +$GPRMC,175434,A,4513.3286,N,09308.7127,W,27.0,235.0,010705,1.3,E,A*34 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175434,4513.3286,N,09308.7127,W,1,12,1.7,413.3,M,-31.2,M,,*70 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.7,1.7,1.4*3F +$GPGSV,3,1,12,01,24,248,41,03,04,251,00,05,12,099,42,09,35,054,41*7E +$GPGSV,3,2,12,11,07,322,45,14,62,261,34,15,42,179,43,18,46,102,44*7F +$GPGSV,3,3,12,19,14,277,00,21,08,160,43,22,80,056,44,35,25,131,38*7C +$GPGLL,4513.3286,N,09308.7127,W,175434,A,A*58 +$GPBOD,,T,,M,,*47 +$PGRME,4.1,M,3.5,M,5.6,M*2E +$PGRMZ,1356,f,3*2A +$GPRTE,1,1,c,*37 +$GPRMC,175436,A,4513.3189,N,09308.7331,W,44.8,174.8,010705,1.3,E,A*3C +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175436,4513.3189,N,09308.7331,W,1,12,1.2,374.2,M,-31.2,M,,*79 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.8,1.2,1.3*31 +$GPGSV,3,1,12,01,24,248,41,03,04,251,37,05,12,099,45,09,35,054,44*78 +$GPGSV,3,2,12,11,07,322,44,14,62,261,38,15,42,179,44,18,46,102,47*76 +$GPGSV,3,3,12,19,14,277,38,21,08,160,42,22,80,056,45,35,25,131,37*78 +$GPGLL,4513.3189,N,09308.7331,W,175436,A,A*53 +$GPBOD,,T,,M,,*47 +$PGRME,2.7,M,3.1,M,4.1,M*2C +$PGRMZ,1228,f,3*22 +$GPRTE,1,1,c,*37 +$GPRMC,175438,A,4513.2871,N,09308.7229,W,61.9,166.6,010705,1.3,E,A*3E +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175438,4513.2871,N,09308.7229,W,1,12,1.2,341.9,M,-31.2,M,,*7D +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,1.9,1.2,1.4*37 +$GPGSV,3,1,12,01,24,248,42,03,04,251,39,05,12,099,43,09,35,054,45*72 +$GPGSV,3,2,12,11,07,322,00,14,62,261,39,15,42,179,43,18,46,102,49*7E +$GPGSV,3,3,12,19,14,277,38,21,08,160,00,22,79,060,48,35,25,131,00*74 +$GPGLL,4513.2871,N,09308.7229,W,175438,A,A*5A +$GPBOD,,T,,M,,*47 +$PGRME,2.8,M,3.2,M,4.2,M*23 +$PGRMZ,1122,f,3*2B +$GPRTE,1,1,c,*37 +$GPRMC,175440,A,4513.2532,N,09308.7162,W,61.3,173.1,010705,1.3,E,A*3E +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175440,4513.2532,N,09308.7162,W,1,12,1.4,324.6,M,-31.2,M,,*7E +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.0,1.4,1.4*3B +$GPGSV,3,1,12,01,24,248,43,03,04,251,39,05,12,099,00,09,35,054,46*77 +$GPGSV,3,2,12,11,07,322,00,14,62,261,39,15,42,179,41,18,46,102,50*74 +$GPGSV,3,3,12,19,14,277,38,21,08,160,00,22,79,060,49,35,25,131,00*75 +$GPGLL,4513.2532,N,09308.7162,W,175440,A,A*53 +$GPBOD,,T,,M,,*47 +$PGRME,2.8,M,3.2,M,4.2,M*23 +$PGRMZ,1065,f,3*29 +$GPRTE,1,1,c,*37 +$GPRMC,175442,A,4513.2220,N,09308.7121,W,57.4,175.1,010705,1.3,E,A*3B +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175442,4513.2220,N,09308.7121,W,1,12,1.5,316.8,M,-31.2,M,,*71 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,35,2.2,1.5,1.6*3A +$GPGSV,3,1,12,01,24,248,42,03,04,251,00,05,12,099,31,09,35,054,46*7E +$GPGSV,3,2,12,11,07,322,00,14,62,261,40,15,42,179,40,18,46,102,49*73 +$GPGSV,3,3,12,19,14,277,40,21,08,160,00,22,79,060,49,35,25,131,00*7A +$GPGLL,4513.2220,N,09308.7121,W,175442,A,A*52 +$GPBOD,,T,,M,,*47 +$PGRME,3.0,M,3.3,M,4.5,M*2C +$PGRMZ,1039,f,3*20 +$GPRTE,1,1,c,*37 +$GPRMC,175444,A,4513.1912,N,09308.7157,W,56.5,186.4,010705,1.3,E,A*3C +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175444,4513.1912,N,09308.7157,W,1,11,2.2,320.7,M,-31.2,M,,*72 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,2.7,2.2,1.0*3B +$GPGSV,3,1,12,01,24,248,40,03,04,251,43,05,12,099,33,09,35,054,47*78 +$GPGSV,3,2,12,11,07,322,00,14,62,261,42,15,42,179,38,18,46,102,48*7F +$GPGSV,3,3,12,19,14,277,42,21,08,160,33,22,79,060,49,35,25,131,00*78 +$GPGLL,4513.1912,N,09308.7157,W,175444,A,A*5C +$GPBOD,,T,,M,,*47 +$PGRME,3.1,M,3.3,M,4.5,M*2D +$PGRMZ,1052,f,3*2D +$GPRTE,1,1,c,*37 +$GPRMC,175446,A,4513.1569,N,09308.7240,W,64.2,190.4,010705,1.3,E,A*3A +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175446,4513.1569,N,09308.7240,W,1,11,2.0,329.4,M,-31.2,M,,*7D +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,2.8,2.0,1.4*32 +$GPGSV,3,1,12,01,24,248,39,03,04,251,42,05,12,099,39,09,35,054,48*72 +$GPGSV,3,2,12,11,07,322,42,14,62,261,42,15,42,179,37,18,46,102,48*76 +$GPGSV,3,3,12,19,14,277,42,21,08,160,34,22,79,060,47,35,25,131,00*71 +$GPGLL,4513.1569,N,09308.7240,W,175446,A,A*5B +$GPBOD,,T,,M,,*47 +$PGRME,3.3,M,3.2,M,4.7,M*2C +$PGRMZ,1081,f,3*23 +$GPRTE,1,1,c,*37 +$GPRMC,175448,A,4513.1314,N,09308.7235,W,39.1,170.8,010705,1.3,E,A*33 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175448,4513.1314,N,09308.7235,W,1,11,1.8,360.5,M,-31.2,M,,*7A +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,2.1,1.8,1.0*34 +$GPGSV,3,1,12,01,24,248,38,03,04,251,41,05,12,099,00,09,35,054,47*75 +$GPGSV,3,2,12,11,07,322,43,14,62,261,43,15,42,179,36,18,46,102,45*7A +$GPGSV,3,3,12,19,14,277,41,21,08,160,37,22,79,060,45,35,25,131,00*73 +$GPGLL,4513.1314,N,09308.7235,W,175448,A,A*5B +$GPBOD,,T,,M,,*47 +$PGRME,3.5,M,3.3,M,4.9,M*25 +$PGRMZ,1183,f,3*20 +$GPRTE,1,1,c,*37 +$GPRMC,175450,A,4513.1194,N,09308.7059,W,39.3,105.1,010705,1.3,E,A*31 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175450,4513.1194,N,09308.7059,W,1,11,1.4,382.7,M,-31.2,M,,*73 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,2.1,1.4,1.0*38 +$GPGSV,3,1,12,01,24,248,39,03,04,251,41,05,12,099,35,09,35,054,46*73 +$GPGSV,3,2,12,11,07,322,44,14,62,261,43,15,42,179,41,18,46,102,44*7C +$GPGSV,3,3,12,19,14,277,41,21,08,160,39,22,79,060,44,35,25,131,00*7C +$GPGLL,4513.1194,N,09308.7059,W,175450,A,A*50 +$GPBOD,,T,,M,,*47 +$PGRME,3.1,M,3.4,M,4.8,M*27 +$PGRMZ,1256,f,3*2B +$GPRTE,1,1,c,*37 +$GPRMC,175452,A,4513.1302,N,09308.6919,W,28.5,27.1,010705,1.3,E,A*05 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175452,4513.1302,N,09308.6919,W,1,11,1.0,359.3,M,-31.2,M,,*76 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.5,1.0,1.1*3A +$GPGSV,3,1,12,01,24,248,41,03,04,251,42,05,12,099,39,09,35,054,45*70 +$GPGSV,3,2,12,11,07,322,43,14,62,261,46,15,42,179,42,18,46,102,44*7D +$GPGSV,3,3,12,19,14,277,44,21,08,160,40,22,79,060,46,35,25,131,42*73 +$GPGLL,4513.1302,N,09308.6919,W,175452,A,A*53 +$GPBOD,,T,,M,,*47 +$PGRME,2.8,M,3.1,M,4.2,M*20 +$PGRMZ,1179,f,3*25 +$GPRTE,1,1,c,*37 +$GPRMC,175454,A,4513.1579,N,09308.6871,W,53.5,4.1,010705,1.3,E,A*3B +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175454,4513.1579,N,09308.6871,W,1,11,1.1,347.6,M,-31.2,M,,*7E +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.7,1.1,1.2*3A +$GPGSV,3,1,12,01,24,248,44,03,04,251,43,05,12,099,40,09,35,054,42*7D +$GPGSV,3,2,12,11,07,322,41,14,62,261,46,15,42,179,46,18,46,102,45*7A +$GPGSV,3,3,12,19,14,277,44,21,08,160,40,22,79,060,47,35,25,131,42*72 +$GPGLL,4513.1579,N,09308.6871,W,175454,A,A*50 +$GPBOD,,T,,M,,*47 +$PGRME,2.7,M,3.1,M,4.1,M*2C +$PGRMZ,1140,f,3*2F +$GPRTE,1,1,c,*37 +$GPRMC,175456,A,4513.1905,N,09308.6860,W,58.6,1.4,010705,1.3,E,A*36 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175456,4513.1905,N,09308.6860,W,1,11,1.1,343.6,M,-31.2,M,,*7F +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.7,1.1,1.2*3A +$GPGSV,3,1,12,01,24,248,44,03,04,251,41,05,12,099,40,09,35,054,00*79 +$GPGSV,3,2,12,11,07,322,40,14,62,261,47,15,42,179,47,18,46,102,45*7B +$GPGSV,3,3,12,19,14,277,45,21,08,160,38,22,79,060,48,35,25,131,41*70 +$GPGLL,4513.1905,N,09308.6860,W,175456,A,A*55 +$GPBOD,,T,,M,,*47 +$PGRME,2.8,M,3.1,M,4.2,M*20 +$PGRMZ,1127,f,3*2E +$GPRTE,1,1,c,*37 +$GPRMC,175458,A,4513.2232,N,09308.6867,W,58.1,357.9,010705,1.3,E,A*39 +$GPRMB,A,,,,,,,,,,,,A,A*0B +$GPGGA,175458,4513.2232,N,09308.6867,W,1,11,1.2,344.1,M,-31.2,M,,*79 +$GPGSA,A,3,01,03,05,09,11,14,15,18,19,21,22,,1.8,1.2,1.3*37 +$GPGSV,3,1,12,01,24,248,46,03,04,251,41,05,12,099,39,09,35,054,00*75 +$GPGSV,3,2,12,11,07,322,00,14,62,261,47,15,42,179,48,18,46,102,45*70 +$GPGSV,3,3,12,19,14,277,44,21,08,160,36,22,79,060,48,35,25,131,40*7E +$GPGLL,4513.2232,N,09308.6867,W,175458,A,A*50 +$GPBOD,,T,,M,,*47 +$PGRME,2.8,M,3.1,M,4.2,M*20 +$PGRMZ,1129,f,3*20 +$GPRTE,1,1,c,*37 diff --git a/utils/GPSsmooth/gps.cxx b/utils/GPSsmooth/gps.cxx new file mode 100644 index 000000000..54bdeb48f --- /dev/null +++ b/utils/GPSsmooth/gps.cxx @@ -0,0 +1,159 @@ +#include + +#include +#include +#include + +#include "gps.hxx" + +SG_USING_STD(cout); +SG_USING_STD(endl); + + +GPSTrack::GPSTrack() {}; +GPSTrack::~GPSTrack() {}; + + +// load the specified file, return the number of records loaded +int GPSTrack::load( const string &file ) { + int count = 0; + + data.clear(); + + // openg the file + sg_gzifstream in( file ); + if ( !in.is_open() ) { + cout << "Cannot open file: " << file << endl; + return 0; + } + + vector tokens; + GPSPoint p; + + while ( ! in.eof() ) { + char tmp[2049]; + + in.getline(tmp, 2048); + + tokens.clear(); + tokens = simgear::strutils::split(tmp, ","); + + int dd; + double raw, min; + + if ( tokens[0] == "$GPRMC" && tokens.size() == 13 ) { + int raw_time = atoi(tokens[1].c_str()); + GPSTime gps_time = GPSTime( raw_time ); + if ( (gps_time.get_time() > p.gps_time.get_time()) && + (p.gps_time.get_time() > 1.0) ) + { + // new data cycle store last data before continuing + data.push_back( p ); + count++; + } + + p.gps_time = gps_time; + + raw = atof( tokens[3].c_str() ); + dd = (int)(raw / 100.00); + min = raw - dd * 100.0; + p.lat_deg = dd + min / 60.0; + if ( tokens[4] == "S" ) { + p.lat_deg = -p.lat_deg; + } + raw = atof( tokens[5].c_str() ); + dd = (int)(raw / 100.00); + min = raw - dd * 100.0; + p.lon_deg = dd + min / 60.0; + if ( tokens[6] == "W" ) { + p.lon_deg = -p.lon_deg; + } + + static double max_speed = 0.0; + p.speed_kts = atof( tokens[7].c_str() ); + if ( p.speed_kts > max_speed ) { + max_speed = p.speed_kts; + cout << "max speed = " << max_speed << endl; + } + p.course_true = atof( tokens[8].c_str() ) * SGD_DEGREES_TO_RADIANS; + + } else if ( tokens[0] == "$GPGGA" && tokens.size() == 15 ) { + int raw_time = atoi(tokens[1].c_str()); + GPSTime gps_time = GPSTime( raw_time ); + if ( (gps_time.get_time() != p.gps_time.get_time()) && + (p.gps_time.get_time() > 1.0) ) { + // new data cycle store last data before continuing + data.push_back( p ); + count++; + } + + p.gps_time = gps_time; + + raw = atof( tokens[2].c_str() ); + dd = (int)(raw / 100.00); + min = raw - dd * 100.0; + p.lat_deg = dd + min / 60.0; + if ( tokens[3] == "S" ) { + p.lat_deg = -p.lat_deg; + } + raw = atof( tokens[4].c_str() ); + dd = (int)(raw / 100.00); + min = raw - dd * 100.0; + p.lon_deg = dd + min / 60.0; + if ( tokens[5] == "W" ) { + p.lon_deg = -p.lon_deg; + } + + p.fix_quality = atoi( tokens[6].c_str() ); + p.num_satellites = atoi( tokens[7].c_str() ); + p.hdop = atof( tokens[8].c_str() ); + + static double max_alt = 0.0; + double alt = atof( tokens[9].c_str() ); + if ( alt > max_alt ) { + max_alt = alt; + cout << "max alt = " << max_alt << endl; + } + + if ( tokens[10] == "F" || tokens[10] == "f" ) { + alt *= SG_FEET_TO_METER; + } + p.altitude_msl = alt; + } + } + + return count; +} + + +static double interp( double a, double b, double p, bool rotational = false ) { + double diff = b - a; + if ( rotational ) { + // special handling of rotational data + if ( diff > SGD_PI ) { + diff -= SGD_2PI; + } else if ( diff < -SGD_PI ) { + diff += SGD_2PI; + } + } + return a + diff * p; +} + + +GPSPoint GPSInterpolate( const GPSPoint A, const GPSPoint B, + const double percent ) { + GPSPoint p; + p.gps_time = GPSTime((int)interp(A.gps_time.get_time(), + B.gps_time.get_time(), + percent)); + p.lat_deg = interp(A.lat_deg, B.lat_deg, percent); + p.lon_deg = interp(A.lon_deg, B.lon_deg, percent); + p.fix_quality = (int)interp(A.fix_quality, B.fix_quality, percent); + p.num_satellites = (int)interp(A.num_satellites, B.num_satellites, percent); + p.hdop = interp(A.hdop, B.hdop, percent); + p.altitude_msl = interp(A.altitude_msl, B.altitude_msl, percent); + p.speed_kts = interp(A.speed_kts, B.speed_kts, percent); + p.course_true = interp(A.course_true, B.course_true, percent, true); + + return p; +} diff --git a/utils/GPSsmooth/gps.hxx b/utils/GPSsmooth/gps.hxx new file mode 100644 index 000000000..6a6137ace --- /dev/null +++ b/utils/GPSsmooth/gps.hxx @@ -0,0 +1,109 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include +#include +#include + +SG_USING_STD(cout); +SG_USING_STD(endl); +SG_USING_STD(string); +SG_USING_STD(vector); + + +// encapsulate a gps integer time (fixme, assumes all times in a track +// are from the same day, so we don't handle midnight roll over) +class GPSTime { + +public: + + int seconds; + + inline GPSTime( const int hh, const int mm, const int ss ) { + seconds = hh*3600 + mm*60 + ss; + } + inline GPSTime( const int gpstime ) { + int tmp = gpstime; + int hh = tmp / 10000; + tmp -= hh * 10000; + int mm = tmp / 100; + tmp -= mm * 100; + int ss = tmp; + seconds = hh*3600 + mm*60 + ss; + // cout << gpstime << " = " << seconds << endl; + } + inline ~GPSTime() {} + + inline int get_time() const { return seconds; } + inline int diff_sec( const GPSTime t ) const { + return seconds - t.seconds; + } +}; + + + +// encapsulate the interesting gps data for a moment in time +class GPSPoint { + +public: + + GPSTime gps_time; + double lat_deg; + double lon_deg; + int fix_quality; + int num_satellites; + double hdop; + double altitude_msl; + double speed_kts; + double course_true; + + GPSPoint() : + gps_time(GPSTime(0,0,0)), + lat_deg(0.0), + lon_deg(0.0), + fix_quality(0), + num_satellites(0), + hdop(0.0), + altitude_msl(0.0), + speed_kts(0.0), + course_true(0.0) + { } + + inline int get_time() const { return gps_time.get_time(); } +}; + + +// Manage a saved gps log (track file) +class GPSTrack { + +private: + + vector data; + +public: + + GPSTrack(); + ~GPSTrack(); + + int load( const string &file ); + + inline int size() const { return data.size(); } + + inline GPSPoint get_point( const unsigned int i ) + { + if ( i < data.size() ) { + return data[i]; + } else { + return GPSPoint(); + } + } + + +}; + + +GPSPoint GPSInterpolate( const GPSPoint A, const GPSPoint B, + const double percent ); diff --git a/utils/GPSsmooth/main.cxx b/utils/GPSsmooth/main.cxx new file mode 100644 index 000000000..df6474b79 --- /dev/null +++ b/utils/GPSsmooth/main.cxx @@ -0,0 +1,468 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include +#include + +#include // endian tests +#include + +#include +#include + +#include "gps.hxx" + + +SG_USING_STD(cout); +SG_USING_STD(endl); +SG_USING_STD(string); + + +// Network channels +static netSocket fdm_sock, ctrls_sock; + +// gps data +GPSTrack track; + +// Default ports +static int fdm_port = 5505; +static int ctrls_port = 5506; + +// Default path +static string file = ""; + +// Master time counter +float sim_time = 0.0f; + +// sim control +SGTimeStamp last_time_stamp; +SGTimeStamp current_time_stamp; + +bool inited = false; + + +// The function htond is defined this way due to the way some +// processors and OSes treat floating point values. Some will raise +// an exception whenever a "bad" floating point value is loaded into a +// floating point register. Solaris is notorious for this, but then +// so is LynxOS on the PowerPC. By translating the data in place, +// there is no need to load a FP register with the "corruped" floating +// point value. By doing the BIG_ENDIAN test, I can optimize the +// routine for big-endian processors so it can be as efficient as +// possible +static void htond (double &x) +{ + if ( sgIsLittleEndian() ) { + int *Double_Overlay; + int Holding_Buffer; + + Double_Overlay = (int *) &x; + Holding_Buffer = Double_Overlay [0]; + + Double_Overlay [0] = htonl (Double_Overlay [1]); + Double_Overlay [1] = htonl (Holding_Buffer); + } else { + return; + } +} + +// Float version +static void htonf (float &x) +{ + if ( sgIsLittleEndian() ) { + int *Float_Overlay; + int Holding_Buffer; + + Float_Overlay = (int *) &x; + Holding_Buffer = Float_Overlay [0]; + + Float_Overlay [0] = htonl (Holding_Buffer); + } else { + return; + } +} + + +static void gps2fg( const GPSPoint p, FGNetFDM *fdm, FGNetCtrls *ctrls ) +{ + unsigned int i; + + static double last_psi; + static double last_alt; + static double phi_filter = 0.0; + static double theta_filter = 0.0; + + // Nan-be-gone + if ( phi_filter != phi_filter ) { + phi_filter = 0.0; + } + if ( theta_filter != theta_filter ) { + theta_filter = 0.0; + } + + // Version sanity checking + fdm->version = FG_NET_FDM_VERSION; + + // Aero parameters + fdm->longitude = p.lon_deg * SGD_DEGREES_TO_RADIANS; + fdm->latitude = p.lat_deg * SGD_DEGREES_TO_RADIANS; + fdm->altitude = p.altitude_msl; + fdm->agl = -9999.0; + fdm->psi = p.course_true; // heading + + double diff = p.course_true - last_psi; + if ( diff < -SGD_PI ) { diff += 2.0*SGD_PI; } + if ( diff > SGD_PI ) { diff -= 2.0*SGD_PI; } + double phi = diff * 100.0; + if ( phi > 0.5*SGD_PI ) { phi = 0.5*SGD_PI; } + if ( phi < -0.5*SGD_PI ) { phi = -0.5*SGD_PI; } + phi_filter = 0.99*phi_filter + 0.01*phi; + fdm->phi = phi_filter; + last_psi = p.course_true; + // cout << p.course_true << endl; + + diff = p.altitude_msl - last_alt; + if ( diff < -SGD_PI ) { diff += 2.0*SGD_PI; } + if ( diff > SGD_PI ) { diff -= 2.0*SGD_PI; } + double theta = diff; + if ( theta > 0.5*SGD_PI ) { theta = 0.5*SGD_PI; } + if ( theta < -0.5*SGD_PI ) { theta = -0.5*SGD_PI; } + theta_filter = 0.99*theta_filter + 0.01*theta; + fdm->theta = theta_filter; + last_alt = p.altitude_msl; + + fdm->phidot = 0.0; + fdm->thetadot = 0.0; + fdm->psidot = 0.0; + fdm->vcas = p.speed_kts; + fdm->climb_rate = 0; // fps + // cout << "climb rate = " << aero->hdota << endl; + fdm->v_north = 0.0; + fdm->v_east = 0.0; + fdm->v_down = 0.0; + fdm->v_wind_body_north = 0.0; + fdm->v_wind_body_east = 0.0; + fdm->v_wind_body_down = 0.0; + fdm->stall_warning = 0.0; + + fdm->A_X_pilot = 0.0; + fdm->A_Y_pilot = 0.0; + fdm->A_Z_pilot = 0.0 /* (should be -G) */; + + // Engine parameters + fdm->num_engines = 1; + fdm->eng_state[0] = 2; + // cout << "state = " << fdm->eng_state[0] << endl; + double rpm = ((p.speed_kts - 15.0) / 65.0) * 2000.0 + 500.0; + if ( rpm < 0.0 ) { rpm = 0.0; } + if ( rpm > 3000.0 ) { rpm = 3000.0; } + fdm->rpm[0] = rpm; + + fdm->fuel_flow[0] = 0.0; + fdm->egt[0] = 0.0; + // cout << "egt = " << aero->EGT << endl; + fdm->oil_temp[0] = 0.0; + fdm->oil_px[0] = 0.0; + + // Consumables + fdm->num_tanks = 2; + fdm->fuel_quantity[0] = 0.0; + fdm->fuel_quantity[1] = 0.0; + + // Gear and flaps + fdm->num_wheels = 3; + fdm->wow[0] = 0; + fdm->wow[1] = 0; + fdm->wow[2] = 0; + + // the following really aren't used in this context + fdm->cur_time = 0; + fdm->warp = 0; + fdm->visibility = 0; + + // cout << "Flap deflection = " << aero->dflap << endl; + fdm->left_flap = 0.0; + fdm->right_flap = 0.0; + + // Convert the net buffer to network format + fdm->version = htonl(fdm->version); + + htond(fdm->longitude); + htond(fdm->latitude); + htond(fdm->altitude); + htonf(fdm->agl); + htonf(fdm->phi); + htonf(fdm->theta); + htonf(fdm->psi); + htonf(fdm->alpha); + htonf(fdm->beta); + + htonf(fdm->phidot); + htonf(fdm->thetadot); + htonf(fdm->psidot); + htonf(fdm->vcas); + htonf(fdm->climb_rate); + htonf(fdm->v_north); + htonf(fdm->v_east); + htonf(fdm->v_down); + htonf(fdm->v_wind_body_north); + htonf(fdm->v_wind_body_east); + htonf(fdm->v_wind_body_down); + + htonf(fdm->A_X_pilot); + htonf(fdm->A_Y_pilot); + htonf(fdm->A_Z_pilot); + + htonf(fdm->stall_warning); + htonf(fdm->slip_deg); + + for ( i = 0; i < fdm->num_engines; ++i ) { + fdm->eng_state[i] = htonl(fdm->eng_state[i]); + htonf(fdm->rpm[i]); + htonf(fdm->fuel_flow[i]); + htonf(fdm->egt[i]); + htonf(fdm->cht[i]); + htonf(fdm->mp_osi[i]); + htonf(fdm->tit[i]); + htonf(fdm->oil_temp[i]); + htonf(fdm->oil_px[i]); + } + fdm->num_engines = htonl(fdm->num_engines); + + for ( i = 0; i < fdm->num_tanks; ++i ) { + htonf(fdm->fuel_quantity[i]); + } + fdm->num_tanks = htonl(fdm->num_tanks); + + for ( i = 0; i < fdm->num_wheels; ++i ) { + fdm->wow[i] = htonl(fdm->wow[i]); + htonf(fdm->gear_pos[i]); + htonf(fdm->gear_steer[i]); + htonf(fdm->gear_compression[i]); + } + fdm->num_wheels = htonl(fdm->num_wheels); + + fdm->cur_time = htonl( fdm->cur_time ); + fdm->warp = htonl( fdm->warp ); + htonf(fdm->visibility); + + htonf(fdm->elevator); + htonf(fdm->elevator_trim_tab); + htonf(fdm->left_flap); + htonf(fdm->right_flap); + htonf(fdm->left_aileron); + htonf(fdm->right_aileron); + htonf(fdm->rudder); + htonf(fdm->nose_wheel); + htonf(fdm->speedbrake); + htonf(fdm->spoilers); +} + + +static void send_data( const GPSPoint p ) { + int len; + int ctrlsize = sizeof( FGNetCtrls ); + int fdmsize = sizeof( FGNetFDM ); + + // cout << "Running main loop" << endl; + + FGNetFDM fgfdm; + FGNetCtrls fgctrls; + + gps2fg( p, &fgfdm, &fgctrls ); + len = fdm_sock.send(&fgfdm, fdmsize, 0); +} + + +void usage( const string &argv0 ) { + cout << "Usage: " << argv0 << endl; + cout << "\t[ --help ]" << endl; + cout << "\t[ --file " << endl; + cout << "\t[ --hertz ]" << endl; + cout << "\t[ --host ]" << endl; + cout << "\t[ --broadcast ]" << endl; + cout << "\t[ --fdm-port ]" << endl; + cout << "\t[ --ctrls-port ]" << endl; +} + + +int main( int argc, char **argv ) { + double hertz = 60.0; + string out_host = "localhost"; + bool do_broadcast = false; + + // process command line arguments + for ( int i = 1; i < argc; ++i ) { + if ( strcmp( argv[i], "--help" ) == 0 ) { + usage( argv[0] ); + exit( 0 ); + } else if ( strcmp( argv[i], "--hertz" ) == 0 ) { + ++i; + if ( i < argc ) { + hertz = atof( argv[i] ); + } else { + usage( argv[0] ); + exit( -1 ); + } + } else if ( strcmp( argv[i], "--file" ) == 0 ) { + ++i; + if ( i < argc ) { + file = argv[i]; + } else { + usage( argv[0] ); + exit( -1 ); + } + } else if ( strcmp( argv[i], "--host" ) == 0 ) { + ++i; + if ( i < argc ) { + out_host = argv[i]; + } else { + usage( argv[0] ); + exit( -1 ); + } + } else if ( strcmp( argv[i], "--broadcast" ) == 0 ) { + do_broadcast = true; + } else if ( strcmp( argv[i], "--fdm-port" ) == 0 ) { + ++i; + if ( i < argc ) { + fdm_port = atoi( argv[i] ); + } else { + usage( argv[0] ); + exit( -1 ); + } + } else if ( strcmp( argv[i], "--ctrls-port" ) == 0 ) { + ++i; + if ( i < argc ) { + ctrls_port = atoi( argv[i] ); + } else { + usage( argv[0] ); + exit( -1 ); + } + } else { + usage( argv[0] ); + exit( -1 ); + } + } + + // Load the track data + if ( file == "" ) { + cout << "No track file specified" << endl; + exit(-1); + } + track.load( file ); + cout << "Loaded " << track.size() << " records." << endl; + + // Setup up outgoing network connections + + netInit( &argc,argv ); // We must call this before any other net stuff + + if ( ! fdm_sock.open( false ) ) { // open a UDP socket + cout << "error opening fdm output socket" << endl; + return -1; + } + if ( ! ctrls_sock.open( false ) ) { // open a UDP socket + cout << "error opening ctrls output socket" << endl; + return -1; + } + cout << "open net channels" << endl; + + fdm_sock.setBlocking( false ); + ctrls_sock.setBlocking( false ); + cout << "blocking false" << endl; + + if ( do_broadcast ) { + fdm_sock.setBroadcast( true ); + ctrls_sock.setBroadcast( true ); + } + + if ( fdm_sock.connect( out_host.c_str(), fdm_port ) == -1 ) { + perror("connect"); + cout << "error connecting to outgoing fdm port: " << out_host + << ":" << fdm_port << endl; + return -1; + } + cout << "connected outgoing fdm socket" << endl; + + if ( ctrls_sock.connect( out_host.c_str(), ctrls_port ) == -1 ) { + perror("connect"); + cout << "error connecting to outgoing ctrls port: " << out_host + << ":" << ctrls_port << endl; + return -1; + } + cout << "connected outgoing ctrls socket" << endl; + + int size = track.size(); + + double current_time = track.get_point(0).get_time(); + cout << "Track begin time is " << current_time << endl; + double end_time = track.get_point(size-1).get_time(); + cout << "Track end time is " << end_time << endl; + cout << "Duration = " << end_time - current_time << endl; + + double frame_us = 1000000.0 / hertz; + if ( frame_us < 0.0 ) { + frame_us = 0.0; + } + + SGTimeStamp start_time; + start_time.stamp(); + int count = 0; + + GPSPoint p, p0, p1; + p0 = p1 = track.get_point( 0 ); + + while ( current_time < end_time ) { + // cout << "current_time = " << current_time << " end_time = " + // << end_time << endl; + + if ( current_time > p1.get_time() ) { + p0 = p1; + ++count; + // cout << "count = " << count << endl; + p1 = track.get_point( count ); + } + // cout << "p0 = " << p0.get_time() << " p1 = " << p1.get_time() + // << endl; + + double percent = + (current_time - p0.get_time()) / + (p1.get_time() - p0.get_time()); + // cout << "Percent = " << percent << endl; + + GPSPoint p = GPSInterpolate( p0, p1, percent ); + cout << current_time << " " << p.lat_deg << ", " << p.lon_deg << endl; + + send_data( p ); + + // Update the elapsed time. + static bool first_time = true; + if ( first_time ) { + last_time_stamp.stamp(); + first_time = false; + } + + current_time_stamp.stamp(); + /* Convert to ms */ + double elapsed_us = current_time_stamp - last_time_stamp; + if ( elapsed_us < (frame_us - 2000) ) { + double requested_us = (frame_us - elapsed_us) - 2000 ; + ulMilliSecondSleep ( (int)(requested_us / 1000.0) ) ; + } + current_time_stamp.stamp(); + while ( current_time_stamp - last_time_stamp < frame_us ) { + current_time_stamp.stamp(); + } + + current_time += (frame_us / 1000000.0); + last_time_stamp = current_time_stamp; + } + + cout << "Processed " << count << " entries in " + << current_time_stamp - start_time << " seconds." << endl; + + return 0; +} diff --git a/utils/Makefile.am b/utils/Makefile.am index bb771a59d..4393a1a97 100644 --- a/utils/Makefile.am +++ b/utils/Makefile.am @@ -1,4 +1,4 @@ DIST_SUBDIRS = TerraSync Modeller js_server fgadmin -SUBDIRS = TerraSync Modeller js_server +SUBDIRS = GPSsmooth TerraSync Modeller js_server diff --git a/utils/js_server/Makefile.am b/utils/js_server/Makefile.am index b17acf235..d4ca0a49e 100644 --- a/utils/js_server/Makefile.am +++ b/utils/js_server/Makefile.am @@ -1,4 +1,4 @@ -sbin_PROGRAMS = js_server +noinst_PROGRAMS = js_server js_server_SOURCES = js_server.cxx js_server_LDADD = -lplibjs -lplibnet -lplibul $(base_LIBS) $(joystick_LIBS) $(network_LIBS) -- 2.39.5