Add parsing of transmission header

This commit is contained in:
Dan Paulat 2021-12-27 23:20:14 -06:00
parent b65e9a3561
commit f66a0b46e6
2 changed files with 41 additions and 0 deletions

View file

@ -35,6 +35,7 @@ public:
WmoHeader(WmoHeader&&) noexcept; WmoHeader(WmoHeader&&) noexcept;
WmoHeader& operator=(WmoHeader&&) noexcept; WmoHeader& operator=(WmoHeader&&) noexcept;
const std::string& sequence_number() const;
const std::string& data_type() const; const std::string& data_type() const;
const std::string& geographic_designator() const; const std::string& geographic_designator() const;
const std::string& bulletin_id() const; const std::string& bulletin_id() const;

View file

@ -26,6 +26,7 @@ class WmoHeaderImpl
{ {
public: public:
explicit WmoHeaderImpl() : explicit WmoHeaderImpl() :
sequenceNumber_ {},
dataType_ {}, dataType_ {},
geographicDesignator_ {}, geographicDesignator_ {},
bulletinId_ {}, bulletinId_ {},
@ -36,6 +37,7 @@ public:
productDesignator_ {} {}; productDesignator_ {} {};
~WmoHeaderImpl() = default; ~WmoHeaderImpl() = default;
std::string sequenceNumber_;
std::string dataType_; std::string dataType_;
std::string geographicDesignator_; std::string geographicDesignator_;
std::string bulletinId_; std::string bulletinId_;
@ -52,6 +54,11 @@ WmoHeader::~WmoHeader() = default;
WmoHeader::WmoHeader(WmoHeader&&) noexcept = default; WmoHeader::WmoHeader(WmoHeader&&) noexcept = default;
WmoHeader& WmoHeader::operator=(WmoHeader&&) noexcept = default; WmoHeader& WmoHeader::operator=(WmoHeader&&) noexcept = default;
const std::string& WmoHeader::sequence_number() const
{
return p->sequenceNumber_;
}
const std::string& WmoHeader::data_type() const const std::string& WmoHeader::data_type() const
{ {
return p->dataType_; return p->dataType_;
@ -96,9 +103,17 @@ bool WmoHeader::Parse(std::istream& is)
{ {
bool headerValid = true; bool headerValid = true;
std::string sohLine;
std::string sequenceLine;
std::string wmoLine; std::string wmoLine;
std::string awipsLine; std::string awipsLine;
if (is.peek() == 0x01)
{
std::getline(is, sohLine);
std::getline(is, sequenceLine);
}
std::getline(is, wmoLine); std::getline(is, wmoLine);
std::getline(is, awipsLine); std::getline(is, awipsLine);
@ -107,6 +122,17 @@ bool WmoHeader::Parse(std::istream& is)
BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Reached end of file"; BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Reached end of file";
headerValid = false; headerValid = false;
} }
else if (!sohLine.empty() && !sohLine.ends_with("\r\r"))
{
BOOST_LOG_TRIVIAL(debug)
<< logPrefix_ << "Start of Heading Line is malformed";
headerValid = false;
}
else if (!sequenceLine.empty() && !sequenceLine.ends_with(" \r\r"))
{
BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Sequence Line is malformed";
headerValid = false;
}
else if (!wmoLine.ends_with("\r\r")) else if (!wmoLine.ends_with("\r\r"))
{ {
BOOST_LOG_TRIVIAL(debug) BOOST_LOG_TRIVIAL(debug)
@ -122,10 +148,24 @@ bool WmoHeader::Parse(std::istream& is)
else else
{ {
// Remove delimiters from the end of the line // Remove delimiters from the end of the line
if (!sequenceLine.empty())
{
sequenceLine.erase(sequenceLine.end() - 3);
}
wmoLine.erase(wmoLine.end() - 2); wmoLine.erase(wmoLine.end() - 2);
awipsLine.erase(awipsLine.end() - 2); awipsLine.erase(awipsLine.end() - 2);
} }
// Transmission Header:
// [SOH]
// nnn
if (headerValid && !sequenceLine.empty())
{
p->sequenceNumber_ = sequenceLine;
}
// WMO Abbreviated Heading Line: // WMO Abbreviated Heading Line:
// T1T2A1A2ii CCCC YYGGgg (BBB) // T1T2A1A2ii CCCC YYGGgg (BBB)