From a5d97933dc4e971564a18abaaeaefe707faf125f Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sat, 3 Feb 2024 23:58:26 -0600 Subject: [PATCH] Add special symbol getter method to TextAndSpecialSymbolPacket --- wxdata/include/scwx/wsr88d/rpg/rpg_types.hpp | 22 +++++ .../rpg/text_and_special_symbol_packet.hpp | 21 ++--- .../rpg/text_and_special_symbol_packet.cpp | 80 +++++++++++++------ wxdata/wxdata.cmake | 1 + 4 files changed, 88 insertions(+), 36 deletions(-) create mode 100644 wxdata/include/scwx/wsr88d/rpg/rpg_types.hpp diff --git a/wxdata/include/scwx/wsr88d/rpg/rpg_types.hpp b/wxdata/include/scwx/wsr88d/rpg/rpg_types.hpp new file mode 100644 index 00000000..a278017c --- /dev/null +++ b/wxdata/include/scwx/wsr88d/rpg/rpg_types.hpp @@ -0,0 +1,22 @@ +#pragma once + +namespace scwx +{ +namespace wsr88d +{ +namespace rpg +{ + +enum class SpecialSymbol +{ + PastStormCellPosition, + CurrentStormCellPosition, + ForecastStormCellPosition, + PastMdaPosition, + ForecastMdaPosition, + None +}; + +} // namespace rpg +} // namespace wsr88d +} // namespace scwx diff --git a/wxdata/include/scwx/wsr88d/rpg/text_and_special_symbol_packet.hpp b/wxdata/include/scwx/wsr88d/rpg/text_and_special_symbol_packet.hpp index 18cccb75..b668002f 100644 --- a/wxdata/include/scwx/wsr88d/rpg/text_and_special_symbol_packet.hpp +++ b/wxdata/include/scwx/wsr88d/rpg/text_and_special_symbol_packet.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -14,8 +15,6 @@ namespace wsr88d namespace rpg { -class TextAndSpecialSymbolPacketImpl; - class TextAndSpecialSymbolPacket : public Packet { public: @@ -29,21 +28,23 @@ public: TextAndSpecialSymbolPacket(TextAndSpecialSymbolPacket&&) noexcept; TextAndSpecialSymbolPacket& operator=(TextAndSpecialSymbolPacket&&) noexcept; - uint16_t packet_code() const override; - uint16_t length_of_block() const; - std::optional value_of_text() const; - int16_t start_i() const; - int16_t start_j() const; - std::string text() const; + std::uint16_t packet_code() const override; + std::uint16_t length_of_block() const; + std::optional value_of_text() const; + std::int16_t start_i() const; + std::int16_t start_j() const; + std::string text() const; + SpecialSymbol special_symbol() const; - size_t data_size() const override; + std::size_t data_size() const override; bool Parse(std::istream& is) override; static std::shared_ptr Create(std::istream& is); private: - std::unique_ptr p; + class Impl; + std::unique_ptr p; }; } // namespace rpg diff --git a/wxdata/source/scwx/wsr88d/rpg/text_and_special_symbol_packet.cpp b/wxdata/source/scwx/wsr88d/rpg/text_and_special_symbol_packet.cpp index a0833717..313bc0e7 100644 --- a/wxdata/source/scwx/wsr88d/rpg/text_and_special_symbol_packet.cpp +++ b/wxdata/source/scwx/wsr88d/rpg/text_and_special_symbol_packet.cpp @@ -15,53 +15,45 @@ static const std::string logPrefix_ = "scwx::wsr88d::rpg::text_and_special_symbol_packet"; static const auto logger_ = util::Logger::Create(logPrefix_); -class TextAndSpecialSymbolPacketImpl +class TextAndSpecialSymbolPacket::Impl { public: - explicit TextAndSpecialSymbolPacketImpl() : - packetCode_ {0}, - lengthOfBlock_ {0}, - valueOfText_ {0}, - startI_ {0}, - startJ_ {0}, - text_ {} - { - } - ~TextAndSpecialSymbolPacketImpl() = default; + explicit Impl() {} + ~Impl() = default; - uint16_t packetCode_; - uint16_t lengthOfBlock_; - uint16_t valueOfText_; - int16_t startI_; - int16_t startJ_; + std::uint16_t packetCode_ {0}; + std::uint16_t lengthOfBlock_ {0}; + std::uint16_t valueOfText_ {0}; + std::int16_t startI_ {0}; + std::int16_t startJ_ {0}; - std::string text_; + std::string text_ {}; }; TextAndSpecialSymbolPacket::TextAndSpecialSymbolPacket() : - p(std::make_unique()) + p(std::make_unique()) { } TextAndSpecialSymbolPacket::~TextAndSpecialSymbolPacket() = default; TextAndSpecialSymbolPacket::TextAndSpecialSymbolPacket( - TextAndSpecialSymbolPacket&&) noexcept = default; + TextAndSpecialSymbolPacket&&) noexcept = default; TextAndSpecialSymbolPacket& TextAndSpecialSymbolPacket::operator=( TextAndSpecialSymbolPacket&&) noexcept = default; -uint16_t TextAndSpecialSymbolPacket::packet_code() const +std::uint16_t TextAndSpecialSymbolPacket::packet_code() const { return p->packetCode_; } -uint16_t TextAndSpecialSymbolPacket::length_of_block() const +std::uint16_t TextAndSpecialSymbolPacket::length_of_block() const { return p->lengthOfBlock_; } -std::optional TextAndSpecialSymbolPacket::value_of_text() const +std::optional TextAndSpecialSymbolPacket::value_of_text() const { - std::optional value; + std::optional value; if (p->packetCode_ == 8) { @@ -71,12 +63,12 @@ std::optional TextAndSpecialSymbolPacket::value_of_text() const return value; } -int16_t TextAndSpecialSymbolPacket::start_i() const +std::int16_t TextAndSpecialSymbolPacket::start_i() const { return p->startI_; } -int16_t TextAndSpecialSymbolPacket::start_j() const +std::int16_t TextAndSpecialSymbolPacket::start_j() const { return p->startJ_; } @@ -86,7 +78,43 @@ std::string TextAndSpecialSymbolPacket::text() const return p->text_; } -size_t TextAndSpecialSymbolPacket::data_size() const +SpecialSymbol TextAndSpecialSymbolPacket::special_symbol() const +{ + SpecialSymbol symbol = SpecialSymbol::None; + + if (!p->text_.empty()) + { + switch (p->text_.at(0)) + { + case '!': // 0x21 + symbol = SpecialSymbol::PastStormCellPosition; + break; + + case '"': // 0x22 + symbol = SpecialSymbol::CurrentStormCellPosition; + break; + + case '#': // 0x23 + symbol = SpecialSymbol::ForecastStormCellPosition; + break; + + case '$': // 0x24 + symbol = SpecialSymbol::PastMdaPosition; + break; + + case '%': // 0x25 + symbol = SpecialSymbol::ForecastMdaPosition; + break; + + default: + break; + } + } + + return symbol; +} + +std::size_t TextAndSpecialSymbolPacket::data_size() const { return p->lengthOfBlock_ + 4u; } diff --git a/wxdata/wxdata.cmake b/wxdata/wxdata.cmake index 30d1cd8c..8a885719 100644 --- a/wxdata/wxdata.cmake +++ b/wxdata/wxdata.cmake @@ -152,6 +152,7 @@ set(HDR_WSR88D_RPG include/scwx/wsr88d/rpg/ccb_header.hpp include/scwx/wsr88d/rpg/radar_coded_message.hpp include/scwx/wsr88d/rpg/radial_data_packet.hpp include/scwx/wsr88d/rpg/raster_data_packet.hpp + include/scwx/wsr88d/rpg/rpg_types.hpp include/scwx/wsr88d/rpg/scit_data_packet.hpp include/scwx/wsr88d/rpg/set_color_level_packet.hpp include/scwx/wsr88d/rpg/special_graphic_symbol_packet.hpp