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
#include <scwx/wsr88d/rpg/packet.hpp>
#include <scwx/wsr88d/rpg/rpg_types.hpp>
#include <cstdint>
#include <memory>
@ -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<uint16_t> value_of_text() const;
int16_t start_i() const;
int16_t start_j() const;
std::uint16_t packet_code() const override;
std::uint16_t length_of_block() const;
std::optional<std::uint16_t> 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<TextAndSpecialSymbolPacket> Create(std::istream& is);
private:
std::unique_ptr<TextAndSpecialSymbolPacketImpl> p;
class Impl;
std::unique_ptr<Impl> p;
};
} // namespace rpg

View file

@ -15,31 +15,23 @@ 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<TextAndSpecialSymbolPacketImpl>())
p(std::make_unique<Impl>())
{
}
TextAndSpecialSymbolPacket::~TextAndSpecialSymbolPacket() = default;
@ -49,19 +41,19 @@ TextAndSpecialSymbolPacket::TextAndSpecialSymbolPacket(
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<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)
{
@ -71,12 +63,12 @@ std::optional<uint16_t> 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;
}

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