From b7913fb8df6d9a8ff8fb132a29d598d2dcf4146b Mon Sep 17 00:00:00 2001 From: Mario Konrad Date: Wed, 22 Jun 2016 17:50:23 +0200 Subject: [PATCH] NMEA: TODO resolved: target status in TLL is now an enumeration. --- src/marnav/nmea/constants.hpp | 7 +++++++ src/marnav/nmea/io.cpp | 19 +++++++++++++++++++ src/marnav/nmea/io.hpp | 1 + src/marnav/nmea/string.cpp | 13 +++++++++++++ src/marnav/nmea/string.hpp | 1 + src/marnav/nmea/tll.cpp | 12 ++++++------ src/marnav/nmea/tll.hpp | 18 +++++++++--------- test/nmea/Test_nmea_tll.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 8 files changed, 95 insertions(+), 15 deletions(-) diff --git a/src/marnav/nmea/constants.hpp b/src/marnav/nmea/constants.hpp index 7584198f..95660a3e 100644 --- a/src/marnav/nmea/constants.hpp +++ b/src/marnav/nmea/constants.hpp @@ -43,6 +43,13 @@ enum class quality : uint32_t { simulation = 8 ///< NMEA representation: 8 }; +/// Target status. +enum class target_status : char { + lost, ///< NMEA representation: 'L' + query, ///< NMEA representation: 'Q' + tracking ///< NMEA representation: 'T' +}; + /// Contains enumerations of units. namespace unit { diff --git a/src/marnav/nmea/io.cpp b/src/marnav/nmea/io.cpp index 7629e785..2b2705e8 100644 --- a/src/marnav/nmea/io.cpp +++ b/src/marnav/nmea/io.cpp @@ -413,6 +413,25 @@ void read(const std::string & s, quality & value, data_format fmt) } } +void read(const std::string & s, target_status & value, data_format fmt) +{ + typename std::underlying_type::type t; + read(s, t, fmt); + switch (t) { + case 'L': + value = target_status::lost; + break; + case 'Q': + value = target_status::query; + break; + case 'T': + value = target_status::tracking; + break; + default: + throw std::runtime_error{"invalid data for nmea/target_status"}; + } +} + void read(const std::string & s, unit::distance & value, data_format fmt) { typename std::underlying_type::type t; diff --git a/src/marnav/nmea/io.hpp b/src/marnav/nmea/io.hpp index 3c347511..998c77c7 100644 --- a/src/marnav/nmea/io.hpp +++ b/src/marnav/nmea/io.hpp @@ -116,6 +116,7 @@ void read(const std::string & s, positioning_system_mode_indicator & value, data_format fmt = data_format::none); void read(const std::string & s, status & value, data_format fmt = data_format::none); void read(const std::string & s, quality & value, data_format fmt = data_format::none); +void read(const std::string & s, target_status & value, data_format fmt = data_format::none); void read(const std::string & s, unit::distance & value, data_format fmt = data_format::none); void read(const std::string & s, unit::velocity & value, data_format fmt = data_format::none); void read( diff --git a/src/marnav/nmea/string.cpp b/src/marnav/nmea/string.cpp index 59d690f6..3835ddf7 100644 --- a/src/marnav/nmea/string.cpp +++ b/src/marnav/nmea/string.cpp @@ -167,6 +167,19 @@ std::string to_string(quality t) return ""; // never reached, gcc does not get it, prevents compiler warning } +std::string to_string(target_status t) +{ + switch (t) { + case target_status::lost: + return "L"; + case target_status::query: + return "Q"; + case target_status::tracking: + return "T"; + } + return ""; // never reached, gcc does not get it, prevents compiler warning +} + std::string to_string(unit::distance t) { switch (t) { diff --git a/src/marnav/nmea/string.hpp b/src/marnav/nmea/string.hpp index 3b7b816d..58645566 100644 --- a/src/marnav/nmea/string.hpp +++ b/src/marnav/nmea/string.hpp @@ -32,6 +32,7 @@ std::string to_string(reference t); std::string to_string(positioning_system_mode_indicator t); std::string to_string(status t); std::string to_string(quality t); +std::string to_string(target_status t); std::string to_string(unit::distance t); std::string to_string(unit::velocity t); std::string to_string(unit::temperature t); diff --git a/src/marnav/nmea/tll.cpp b/src/marnav/nmea/tll.cpp index dd9bc566..d87e0688 100644 --- a/src/marnav/nmea/tll.cpp +++ b/src/marnav/nmea/tll.cpp @@ -22,14 +22,14 @@ tll::tll(const std::string & talker, fields::const_iterator first, fields::const if (std::distance(first, last) != 9) throw std::invalid_argument{"invalid number of fields in tll"}; - read(*(first + 0), target_number); + read(*(first + 0), number); read(*(first + 1), lat); read(*(first + 2), lat_hem); read(*(first + 3), lon); read(*(first + 4), lon_hem); - read(*(first + 5), target_name); + read(*(first + 5), name); read(*(first + 6), time_utc); - read(*(first + 7), target_status); + read(*(first + 7), status); read(*(first + 8), reference_target); // instead of reading data into temporary lat/lon, let's correct values afterwards @@ -55,9 +55,9 @@ void tll::set_lon(const geo::longitude & t) std::vector tll::get_data() const { - return {format(target_number, 2), to_string(lat), to_string(lat_hem), to_string(lon), - to_string(lon_hem), to_string(target_name), to_string(time_utc), - to_string(target_status), to_string(reference_target)}; + return {format(number, 2), to_string(lat), to_string(lat_hem), to_string(lon), + to_string(lon_hem), to_string(name), to_string(time_utc), to_string(status), + to_string(reference_target)}; } } } diff --git a/src/marnav/nmea/tll.hpp b/src/marnav/nmea/tll.hpp index 205060c1..b1e4ea69 100644 --- a/src/marnav/nmea/tll.hpp +++ b/src/marnav/nmea/tll.hpp @@ -60,32 +60,32 @@ protected: virtual std::vector get_data() const override; private: - uint32_t target_number = 0; + uint32_t number = 0; geo::latitude lat; direction lat_hem = direction::north; geo::longitude lon; direction lon_hem = direction::east; - waypoint target_name; + waypoint name; nmea::time time_utc; - char target_status = 'T'; // @todo use an enumeration + target_status status = target_status::tracking; utils::optional reference_target; public: - NMEA_GETTER(target_number) - NMEA_GETTER(target_name) + NMEA_GETTER(number) + NMEA_GETTER(name) NMEA_GETTER(time_utc) - NMEA_GETTER(target_status) + NMEA_GETTER(status) NMEA_GETTER(reference_target) geo::longitude get_longitude() const; geo::latitude get_latitude() const; - void set_target_number(uint32_t t) noexcept { target_number = t; } + void set_number(uint32_t t) noexcept { number = t; } void set_lat(const geo::latitude & t); void set_lon(const geo::longitude & t); - void set_target_name(const waypoint & t) { target_name = t; } + void set_name(const waypoint & t) { name = t; } void set_time_utc(const nmea::time & t) noexcept { time_utc = t; } - void set_target_status(char t) noexcept { target_status = t; } + void set_status(target_status t) noexcept { status = t; } void set_reference_target(char t) noexcept { reference_target = t; } }; } diff --git a/test/nmea/Test_nmea_tll.cpp b/test/nmea/Test_nmea_tll.cpp index 50aa1e43..d67666e3 100644 --- a/test/nmea/Test_nmea_tll.cpp +++ b/test/nmea/Test_nmea_tll.cpp @@ -105,4 +105,43 @@ TEST_F(Test_nmea_tll, get_longitude_east) EXPECT_EQ(geo::longitude{123.45}, tll->get_longitude()); } + +TEST_F(Test_nmea_tll, set_status) +{ + { + nmea::tll tll; + tll.set_status(nmea::target_status::lost); + EXPECT_STREQ( + "$GPTLL,00,0000.0000,N,00000.0000,E,,000000,L,*18", nmea::to_string(tll).c_str()); + } + { + nmea::tll tll; + tll.set_status(nmea::target_status::query); + EXPECT_STREQ( + "$GPTLL,00,0000.0000,N,00000.0000,E,,000000,Q,*05", nmea::to_string(tll).c_str()); + } + { + nmea::tll tll; + tll.set_status(nmea::target_status::tracking); + EXPECT_STREQ( + "$GPTLL,00,0000.0000,N,00000.0000,E,,000000,T,*00", nmea::to_string(tll).c_str()); + } +} + +TEST_F(Test_nmea_tll, get_status) +{ + { + const auto s = nmea::make_sentence("$GPTLL,00,0000.0000,N,00000.0000,E,,000000,L,*18"); + EXPECT_EQ(nmea::target_status::lost, nmea::sentence_cast(s)->get_status()); + } + { + const auto s = nmea::make_sentence("$GPTLL,00,0000.0000,N,00000.0000,E,,000000,Q,*05"); + EXPECT_EQ(nmea::target_status::query, nmea::sentence_cast(s)->get_status()); + } + { + const auto s = nmea::make_sentence("$GPTLL,00,0000.0000,N,00000.0000,E,,000000,T,*00"); + EXPECT_EQ( + nmea::target_status::tracking, nmea::sentence_cast(s)->get_status()); + } +} } -- 2.11.4.GIT