Parse Clutter Filter Map (Message 15)

This commit is contained in:
Dan Paulat 2021-06-15 21:59:38 -05:00
parent f36d57b71d
commit 3ab4ec4b9b
15 changed files with 682 additions and 22 deletions

View file

@ -0,0 +1,46 @@
#pragma once
#include <scwx/wsr88d/rda/message.hpp>
namespace scwx
{
namespace wsr88d
{
namespace rda
{
class ClutterFilterMapImpl;
class ClutterFilterMap : public Message
{
public:
explicit ClutterFilterMap();
~ClutterFilterMap();
ClutterFilterMap(const Message&) = delete;
ClutterFilterMap& operator=(const ClutterFilterMap&) = delete;
ClutterFilterMap(ClutterFilterMap&&) noexcept;
ClutterFilterMap& operator=(ClutterFilterMap&&) noexcept;
uint16_t map_generation_date() const;
uint16_t map_generation_time() const;
uint16_t number_of_elevation_segments() const;
uint16_t number_of_range_zones(uint16_t e, uint16_t a) const;
uint16_t op_code(uint16_t e, uint16_t a, uint16_t z) const;
uint16_t end_range(uint16_t e, uint16_t a, uint16_t z) const;
bool Parse(std::istream& is);
static std::unique_ptr<ClutterFilterMap> Create(MessageHeader&& header,
std::istream& is);
static const size_t NUM_AZIMUTH_SEGMENTS = 360u;
private:
std::unique_ptr<ClutterFilterMapImpl> p;
};
} // namespace rda
} // namespace wsr88d
} // namespace scwx

View file

@ -0,0 +1,42 @@
#pragma once
#include <scwx/wsr88d/rda/message_header.hpp>
namespace scwx
{
namespace wsr88d
{
namespace rda
{
class MessageImpl;
class Message
{
protected:
explicit Message();
Message(const Message&) = delete;
Message& operator=(const Message&) = delete;
Message(Message&&) noexcept;
Message& operator=(Message&&) noexcept;
bool ValidateSize(std::istream& is, size_t bytesRead) const;
public:
virtual ~Message();
const MessageHeader& header() const;
void set_header(MessageHeader&& header);
virtual bool Parse(std::istream& is) = 0;
private:
std::unique_ptr<MessageImpl> p;
};
} // namespace rda
} // namespace wsr88d
} // namespace scwx

View file

@ -0,0 +1,39 @@
#pragma once
#include <scwx/wsr88d/rda/message.hpp>
namespace scwx
{
namespace wsr88d
{
namespace rda
{
struct MessageInfo
{
std::unique_ptr<Message> message;
bool headerValid;
bool messageValid;
MessageInfo() : message(nullptr), headerValid(false), messageValid(false) {}
};
class MessageFactory
{
private:
explicit MessageFactory() = delete;
~MessageFactory() = delete;
MessageFactory(const Message&) = delete;
MessageFactory& operator=(const MessageFactory&) = delete;
MessageFactory(MessageFactory&&) noexcept = delete;
MessageFactory& operator=(MessageFactory&&) noexcept = delete;
public:
static MessageInfo Create(std::istream& is);
};
} // namespace rda
} // namespace wsr88d
} // namespace scwx

View file

@ -1,3 +1,5 @@
#pragma once
#include <cstdint>
#include <memory>
@ -20,7 +22,7 @@ public:
MessageHeader& operator=(const MessageHeader&) = delete;
MessageHeader(MessageHeader&&) noexcept;
MessageHeader& operator=(MessageHeader&&);
MessageHeader& operator=(MessageHeader&&) noexcept;
uint16_t message_size() const;
uint8_t rda_redundant_channel() const;
@ -31,6 +33,8 @@ public:
uint16_t number_of_message_segments() const;
uint16_t message_segment_number() const;
void set_message_size(uint16_t messageSize);
bool Parse(std::istream& is);
static const size_t SIZE = 16u;