Add special symbol getter method to TextAndSpecialSymbolPacket

This commit is contained in:
Dan Paulat 2024-02-03 23:58:26 -06:00
parent 43911c1179
commit a5d97933dc
4 changed files with 88 additions and 36 deletions

View file

@ -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

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <scwx/wsr88d/rpg/packet.hpp> #include <scwx/wsr88d/rpg/packet.hpp>
#include <scwx/wsr88d/rpg/rpg_types.hpp>
#include <cstdint> #include <cstdint>
#include <memory> #include <memory>
@ -14,8 +15,6 @@ namespace wsr88d
namespace rpg namespace rpg
{ {
class TextAndSpecialSymbolPacketImpl;
class TextAndSpecialSymbolPacket : public Packet class TextAndSpecialSymbolPacket : public Packet
{ {
public: public:
@ -29,21 +28,23 @@ public:
TextAndSpecialSymbolPacket(TextAndSpecialSymbolPacket&&) noexcept; TextAndSpecialSymbolPacket(TextAndSpecialSymbolPacket&&) noexcept;
TextAndSpecialSymbolPacket& operator=(TextAndSpecialSymbolPacket&&) noexcept; TextAndSpecialSymbolPacket& operator=(TextAndSpecialSymbolPacket&&) noexcept;
uint16_t packet_code() const override; std::uint16_t packet_code() const override;
uint16_t length_of_block() const; std::uint16_t length_of_block() const;
std::optional<uint16_t> value_of_text() const; std::optional<std::uint16_t> value_of_text() const;
int16_t start_i() const; std::int16_t start_i() const;
int16_t start_j() const; std::int16_t start_j() const;
std::string text() 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; bool Parse(std::istream& is) override;
static std::shared_ptr<TextAndSpecialSymbolPacket> Create(std::istream& is); static std::shared_ptr<TextAndSpecialSymbolPacket> Create(std::istream& is);
private: private:
std::unique_ptr<TextAndSpecialSymbolPacketImpl> p; class Impl;
std::unique_ptr<Impl> p;
}; };
} // namespace rpg } // namespace rpg

View file

@ -15,53 +15,45 @@ static const std::string logPrefix_ =
"scwx::wsr88d::rpg::text_and_special_symbol_packet"; "scwx::wsr88d::rpg::text_and_special_symbol_packet";
static const auto logger_ = util::Logger::Create(logPrefix_); static const auto logger_ = util::Logger::Create(logPrefix_);
class TextAndSpecialSymbolPacketImpl class TextAndSpecialSymbolPacket::Impl
{ {
public: public:
explicit TextAndSpecialSymbolPacketImpl() : explicit Impl() {}
packetCode_ {0}, ~Impl() = default;
lengthOfBlock_ {0},
valueOfText_ {0},
startI_ {0},
startJ_ {0},
text_ {}
{
}
~TextAndSpecialSymbolPacketImpl() = default;
uint16_t packetCode_; std::uint16_t packetCode_ {0};
uint16_t lengthOfBlock_; std::uint16_t lengthOfBlock_ {0};
uint16_t valueOfText_; std::uint16_t valueOfText_ {0};
int16_t startI_; std::int16_t startI_ {0};
int16_t startJ_; std::int16_t startJ_ {0};
std::string text_; std::string text_ {};
}; };
TextAndSpecialSymbolPacket::TextAndSpecialSymbolPacket() : TextAndSpecialSymbolPacket::TextAndSpecialSymbolPacket() :
p(std::make_unique<TextAndSpecialSymbolPacketImpl>()) p(std::make_unique<Impl>())
{ {
} }
TextAndSpecialSymbolPacket::~TextAndSpecialSymbolPacket() = default; TextAndSpecialSymbolPacket::~TextAndSpecialSymbolPacket() = default;
TextAndSpecialSymbolPacket::TextAndSpecialSymbolPacket( TextAndSpecialSymbolPacket::TextAndSpecialSymbolPacket(
TextAndSpecialSymbolPacket&&) noexcept = default; TextAndSpecialSymbolPacket&&) noexcept = default;
TextAndSpecialSymbolPacket& TextAndSpecialSymbolPacket::operator=( TextAndSpecialSymbolPacket& TextAndSpecialSymbolPacket::operator=(
TextAndSpecialSymbolPacket&&) noexcept = default; TextAndSpecialSymbolPacket&&) noexcept = default;
uint16_t TextAndSpecialSymbolPacket::packet_code() const std::uint16_t TextAndSpecialSymbolPacket::packet_code() const
{ {
return p->packetCode_; return p->packetCode_;
} }
uint16_t TextAndSpecialSymbolPacket::length_of_block() const std::uint16_t TextAndSpecialSymbolPacket::length_of_block() const
{ {
return p->lengthOfBlock_; return p->lengthOfBlock_;
} }
std::optional<uint16_t> TextAndSpecialSymbolPacket::value_of_text() const std::optional<std::uint16_t> TextAndSpecialSymbolPacket::value_of_text() const
{ {
std::optional<uint16_t> value; std::optional<std::uint16_t> value;
if (p->packetCode_ == 8) if (p->packetCode_ == 8)
{ {
@ -71,12 +63,12 @@ std::optional<uint16_t> TextAndSpecialSymbolPacket::value_of_text() const
return value; return value;
} }
int16_t TextAndSpecialSymbolPacket::start_i() const std::int16_t TextAndSpecialSymbolPacket::start_i() const
{ {
return p->startI_; return p->startI_;
} }
int16_t TextAndSpecialSymbolPacket::start_j() const std::int16_t TextAndSpecialSymbolPacket::start_j() const
{ {
return p->startJ_; return p->startJ_;
} }
@ -86,7 +78,43 @@ std::string TextAndSpecialSymbolPacket::text() const
return p->text_; 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; return p->lengthOfBlock_ + 4u;
} }

View file

@ -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/radar_coded_message.hpp
include/scwx/wsr88d/rpg/radial_data_packet.hpp include/scwx/wsr88d/rpg/radial_data_packet.hpp
include/scwx/wsr88d/rpg/raster_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/scit_data_packet.hpp
include/scwx/wsr88d/rpg/set_color_level_packet.hpp include/scwx/wsr88d/rpg/set_color_level_packet.hpp
include/scwx/wsr88d/rpg/special_graphic_symbol_packet.hpp include/scwx/wsr88d/rpg/special_graphic_symbol_packet.hpp