Radar coded message stub

This commit is contained in:
Dan Paulat 2022-01-13 18:23:43 -06:00
parent 9b48db3d8d
commit 97ab1de94c
4 changed files with 159 additions and 0 deletions

View file

@ -0,0 +1,43 @@
#pragma once
#include <scwx/wsr88d/rpg/level3_message.hpp>
#include <scwx/wsr88d/rpg/product_description_block.hpp>
#include <cstdint>
#include <memory>
namespace scwx
{
namespace wsr88d
{
namespace rpg
{
class RadarCodedMessageImpl;
class RadarCodedMessage : public Level3Message
{
public:
explicit RadarCodedMessage();
~RadarCodedMessage();
RadarCodedMessage(const RadarCodedMessage&) = delete;
RadarCodedMessage& operator=(const RadarCodedMessage&) = delete;
RadarCodedMessage(RadarCodedMessage&&) noexcept;
RadarCodedMessage& operator=(RadarCodedMessage&&) noexcept;
std::shared_ptr<ProductDescriptionBlock> description_block() const;
bool Parse(std::istream& is) override;
static std::shared_ptr<RadarCodedMessage>
Create(Level3MessageHeader&& header, std::istream& is);
private:
std::unique_ptr<RadarCodedMessageImpl> p;
};
} // namespace rpg
} // namespace wsr88d
} // namespace scwx

View file

@ -3,6 +3,7 @@
#include <scwx/util/vectorbuf.hpp>
#include <scwx/wsr88d/rpg/general_status_message.hpp>
#include <scwx/wsr88d/rpg/graphic_product_message.hpp>
#include <scwx/wsr88d/rpg/radar_coded_message.hpp>
#include <scwx/wsr88d/rpg/tabular_product_message.hpp>
#include <unordered_map>
@ -48,6 +49,7 @@ static const std::unordered_map<int16_t, CreateLevel3MessageFunction> //
{65, GraphicProductMessage::Create},
{66, GraphicProductMessage::Create},
{67, GraphicProductMessage::Create},
{74, RadarCodedMessage::Create},
{75, TabularProductMessage::Create},
{77, TabularProductMessage::Create},
{78, GraphicProductMessage::Create},

View file

@ -0,0 +1,112 @@
#include <scwx/wsr88d/rpg/radar_coded_message.hpp>
#include <istream>
#include <string>
#include <boost/log/trivial.hpp>
namespace scwx
{
namespace wsr88d
{
namespace rpg
{
static const std::string logPrefix_ =
"[scwx::wsr88d::rpg::radar_coded_message] ";
class RadarCodedMessageImpl
{
public:
explicit RadarCodedMessageImpl() :
descriptionBlock_ {0},
pupSiteIdentifier_ {},
productCategory_ {},
rdaSiteIdentifier_ {}
{
}
~RadarCodedMessageImpl() = default;
bool LoadBlocks(std::istream& is);
std::shared_ptr<ProductDescriptionBlock> descriptionBlock_;
std::string pupSiteIdentifier_;
std::string productCategory_;
std::string rdaSiteIdentifier_;
};
RadarCodedMessage::RadarCodedMessage() :
p(std::make_unique<RadarCodedMessageImpl>())
{
}
RadarCodedMessage::~RadarCodedMessage() = default;
RadarCodedMessage::RadarCodedMessage(RadarCodedMessage&&) noexcept = default;
RadarCodedMessage&
RadarCodedMessage::operator=(RadarCodedMessage&&) noexcept = default;
std::shared_ptr<ProductDescriptionBlock>
RadarCodedMessage::description_block() const
{
return p->descriptionBlock_;
}
bool RadarCodedMessage::Parse(std::istream& is)
{
bool dataValid = true;
const std::streampos dataStart = is.tellg();
p->descriptionBlock_ = std::make_shared<ProductDescriptionBlock>();
dataValid = p->descriptionBlock_->Parse(is);
if (dataValid)
{
dataValid = p->LoadBlocks(is);
}
const std::streampos dataEnd = is.tellg();
if (!ValidateMessage(is, dataEnd - dataStart))
{
dataValid = false;
}
return dataValid;
}
bool RadarCodedMessageImpl::LoadBlocks(std::istream& is)
{
BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Loading Blocks";
pupSiteIdentifier_.resize(4);
productCategory_.resize(5);
rdaSiteIdentifier_.resize(4);
is.read(pupSiteIdentifier_.data(), 4);
is.seekg(1, std::ios_base::cur);
is.read(productCategory_.data(), 5);
is.seekg(1, std::ios_base::cur);
is.read(rdaSiteIdentifier_.data(), 4);
return !is.eof();
}
std::shared_ptr<RadarCodedMessage>
RadarCodedMessage::Create(Level3MessageHeader&& header, std::istream& is)
{
std::shared_ptr<RadarCodedMessage> message =
std::make_shared<RadarCodedMessage>();
message->set_header(std::move(header));
if (!message->Parse(is))
{
message.reset();
}
return message;
}
} // namespace rpg
} // namespace wsr88d
} // namespace scwx

View file

@ -69,6 +69,7 @@ set(HDR_WSR88D_RPG include/scwx/wsr88d/rpg/ccb_header.hpp
include/scwx/wsr88d/rpg/precipitation_rate_data_array_packet.hpp
include/scwx/wsr88d/rpg/product_description_block.hpp
include/scwx/wsr88d/rpg/product_symbology_block.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/scit_forecast_data_packet.hpp
@ -107,6 +108,7 @@ set(SRC_WSR88D_RPG source/scwx/wsr88d/rpg/ccb_header.cpp
source/scwx/wsr88d/rpg/precipitation_rate_data_array_packet.cpp
source/scwx/wsr88d/rpg/product_description_block.cpp
source/scwx/wsr88d/rpg/product_symbology_block.cpp
source/scwx/wsr88d/rpg/radar_coded_message.cpp
source/scwx/wsr88d/rpg/radial_data_packet.cpp
source/scwx/wsr88d/rpg/raster_data_packet.cpp
source/scwx/wsr88d/rpg/scit_forecast_data_packet.cpp