From 742d57479479e026bad462a76daefe7942e3febe Mon Sep 17 00:00:00 2001 From: Mario Konrad Date: Sun, 11 Sep 2016 12:32:33 +0200 Subject: [PATCH] nmeadump: more AIS messages added. --- src/marnav/ais/message.cpp | 2 + src/marnav/ais/message.hpp | 2 + src/marnav/ais/message_05.cpp | 5 --- src/marnav/ais/message_24.cpp | 33 ++++++++++++++++ src/marnav/ais/message_24.hpp | 12 +++--- src/marnav/nmea/ais_helper.hpp | 2 + src/nmeadump.cpp | 85 +++++++++++++++++++++++++++++++++++++++++- 7 files changed, 129 insertions(+), 12 deletions(-) diff --git a/src/marnav/ais/message.cpp b/src/marnav/ais/message.cpp index ab5e4461..84139921 100644 --- a/src/marnav/ais/message.cpp +++ b/src/marnav/ais/message.cpp @@ -36,6 +36,8 @@ uint8_t encode_sixbit_ascii(char c) return i != SIXBIT_ASCII_TABLE.end() ? i->first : 0xff; } +std::string trim_ais_string(const std::string & s) { return s.substr(0, s.find_first_of("@")); } + /// Reads a string from the AIS message at the specified offset. /// The string is decoded and returned. /// diff --git a/src/marnav/ais/message.hpp b/src/marnav/ais/message.hpp index 3141493c..1e2938db 100644 --- a/src/marnav/ais/message.hpp +++ b/src/marnav/ais/message.hpp @@ -198,6 +198,8 @@ uint8_t encode_sixbit_ascii(char c); /// @} +std::string trim_ais_string(const std::string & s); + /// @brief Base class for all AIS messages. class message { diff --git a/src/marnav/ais/message_05.cpp b/src/marnav/ais/message_05.cpp index 0e950e2e..bfeeaa1f 100644 --- a/src/marnav/ais/message_05.cpp +++ b/src/marnav/ais/message_05.cpp @@ -6,11 +6,6 @@ namespace ais { MARNAV_AIS_DEFINE_MESSAGE_PARSE_FUNC(message_05) -namespace -{ -std::string trim_ais_string(const std::string & s) { return s.substr(0, s.find_first_of("@")); } -} - message_05::message_05() : message(ID) , callsign("@@@@@@@") diff --git a/src/marnav/ais/message_24.cpp b/src/marnav/ais/message_24.cpp index 1b4663c7..fa89d088 100644 --- a/src/marnav/ais/message_24.cpp +++ b/src/marnav/ais/message_24.cpp @@ -88,5 +88,38 @@ raw message_24::get_data() const return bits; } + +std::string message_24::get_shipname() const { return trim_ais_string(shipname); } + +std::string message_24::get_vendor_id() const { return trim_ais_string(vendor_id); } + +std::string message_24::get_callsign() const { return trim_ais_string(callsign); } + +void message_24::set_shipname(const std::string & t) +{ + if (t.size() > 20) { + shipname = t.substr(0, 20); + } else { + shipname = t; + } +} + +void message_24::set_vendor_id(const std::string & t) +{ + if (t.size() > 3) { + callsign = t.substr(0, 3); + } else { + callsign = t; + } +} + +void message_24::set_callsign(const std::string & t) +{ + if (t.size() > 7) { + callsign = t.substr(0, 7); + } else { + callsign = t; + } +} } } diff --git a/src/marnav/ais/message_24.hpp b/src/marnav/ais/message_24.hpp index 694f9c1c..e358df14 100644 --- a/src/marnav/ais/message_24.hpp +++ b/src/marnav/ais/message_24.hpp @@ -76,14 +76,14 @@ public: part get_part_number() const noexcept { return part_number; } // part A specific - std::string get_shipname() const { return shipname; } + std::string get_shipname() const; // part B specific (normal) ship_type get_shiptype() const noexcept { return shiptype; } - std::string get_vendor_id() const { return vendor_id; } + std::string get_vendor_id() const; uint32_t get_model() const noexcept { return model; } uint32_t get_serial() const noexcept { return serial; } - std::string get_callsign() const { return callsign; } + std::string get_callsign() const; // part B specific (normal) uint32_t get_to_bow() const noexcept { return to_bow; } @@ -99,14 +99,14 @@ public: void set_part_number(part t) noexcept { part_number = t; } // part A specific - void set_shipname(const std::string & t) { shipname = t; } + void set_shipname(const std::string & t); // part B specific void set_shiptype(ship_type t) noexcept { shiptype = t; } - void set_vendor_id(const std::string & t) { vendor_id = t; } + void set_vendor_id(const std::string & t); void set_model(uint32_t t) noexcept { model = t; } void set_serial(uint32_t t) noexcept { serial = t; } - void set_callsign(const std::string & t) { callsign = t; } + void set_callsign(const std::string & t); // part B specific (normal) void set_to_bow(uint32_t t) noexcept { to_bow = t; } diff --git a/src/marnav/nmea/ais_helper.hpp b/src/marnav/nmea/ais_helper.hpp index 42d46703..8fda220d 100644 --- a/src/marnav/nmea/ais_helper.hpp +++ b/src/marnav/nmea/ais_helper.hpp @@ -51,6 +51,8 @@ std::vector> collect_payload(InputIt begin, Inp } else if (t->id() == sentence_id::VDO) { const auto & s = sentence_cast(t); v.push_back(make_pair(s->get_payload(), s->get_n_fill_bits())); + } else { + throw std::runtime_error{"invalid sentence in collect_payload"}; } } diff --git a/src/nmeadump.cpp b/src/nmeadump.cpp index 6440043b..96c3e25c 100644 --- a/src/nmeadump.cpp +++ b/src/nmeadump.cpp @@ -45,7 +45,10 @@ #include #include #include +#include #include +#include +#include namespace nmeadump { @@ -173,6 +176,19 @@ static std::string render(const marnav::geo::longitude & t) "%03u\u00b0%02u'%04.1f%s", t.degrees(), t.minutes(), t.seconds(), to_string(t.hem())); } +static std::string render(const marnav::ais::message_24::part t) +{ + switch (t) { + case marnav::ais::message_24::part::A: + return "A"; + case marnav::ais::message_24::part::B: + return "B"; + default: + break; + } + return "-"; +} + static std::string render(const marnav::ais::ship_type t) { switch (t) { @@ -781,6 +797,25 @@ static void print_detail_message_03(const marnav::ais::message * m) print_detail_message_01_common(marnav::ais::message_cast(m)); } +static void print_detail_message_04(const marnav::ais::message * m) +{ + const auto t = marnav::ais::message_cast(m); + print("Repeat Indicator", render(t->get_repeat_indicator())); + print("MMSI", render(t->get_mmsi())); + print("Year", render(t->get_year())); + print("Month", render(t->get_month())); + print("Day", render(t->get_day())); + print("Hour", render(t->get_hour())); + print("Minute", render(t->get_minute())); + print("Second", render(t->get_second())); + print("Pos Accuracy", render(t->get_position_accuracy())); + print("Latitude", render(t->get_latitude())); + print("Longitude", render(t->get_longitude())); + print("EPFD Fix", render(t->get_epfd_fix())); + print("RAIM", render(t->get_raim())); + print("Radio Status", render(t->get_radio_status())); +} + static void print_detail_message_05(const marnav::ais::message * m) { const auto t = marnav::ais::message_cast(m); @@ -802,6 +837,51 @@ static void print_detail_message_05(const marnav::ais::message * m) print("Destination", render(t->get_destination())); print("DTE", render(t->get_dte())); } + +static void print_detail_message_18(const marnav::ais::message * m) +{ + const auto t = marnav::ais::message_cast(m); + print("Repeat Indicator", render(t->get_repeat_indicator())); + print("MMSI", render(t->get_mmsi())); + print("SOG", render(t->get_sog())); + print("Pos Accuracy", render(t->get_position_accuracy())); + print("Latitude", render(t->get_latitude())); + print("Longitude", render(t->get_longitude())); + print("COG", render(t->get_cog())); + print("HDG", render(t->get_hdg())); + print("Time Stamp", render(t->get_timestamp())); + print("CS Unit", render(t->get_cs_unit())); + print("Display Flag", render(t->get_display_flag())); + print("DSC Flag", render(t->get_dsc_flag())); + print("Band Flag", render(t->get_band_flag())); + print("Message 22 Flag", render(t->get_message_22_flag())); + print("Assigned", render(t->get_assigned())); + print("RAIM", render(t->get_raim())); + print("Radio Status", render(t->get_radio_status())); +} + +static void print_detail_message_24(const marnav::ais::message * m) +{ + const auto t = marnav::ais::message_cast(m); + print("Repeat Indicator", render(t->get_repeat_indicator())); + print("MMSI", render(t->get_mmsi())); + print("Part", render(t->get_part_number())); + if (t->get_part_number() == marnav::ais::message_24::part::A) { + print("Ship Name", render(t->get_shipname())); + } else { + print("Ship Type", render(t->get_shiptype())); + print("Vendor ID", render(t->get_vendor_id())); + print("Model", render(t->get_model())); + print("Serial", render(t->get_serial())); + print("Callsign", render(t->get_callsign())); + if (t->is_auxiliary_vessel()) { + print("Mothership MMSI", render(t->get_mothership_mmsi())); + } else { + print("Length", render(t->get_to_bow() + t->get_to_stern())); + print("Width", render(t->get_to_port() + t->get_to_starboard())); + } + } +} } static void dump_nmea(const std::string & line) @@ -889,7 +969,10 @@ static void dump_ais(const std::vector> ADD_MESSAGE(message_01), ADD_MESSAGE(message_02), ADD_MESSAGE(message_03), - ADD_MESSAGE(message_05) + ADD_MESSAGE(message_04), + ADD_MESSAGE(message_05), + ADD_MESSAGE(message_18), + ADD_MESSAGE(message_24) }; // clang-format on #undef ADD_MESSAGE -- 2.11.4.GIT