Skip to content

Commit

Permalink
Fix elements passed in TX and Rcv PVP parsing (#744)
Browse files Browse the repository at this point in the history
* Fix elements passed in TX and Rcv PVP parsing

* Unittests and plumbing for PVP

* Debugging PVPBlock reading

* Fix unittest

* Revert debugging changes

---------

Co-authored-by: Vaughn Holmes <[email protected]>
  • Loading branch information
vaughn-holmes and holmesv3 committed Apr 15, 2024
1 parent 3430e25 commit efc8e76
Show file tree
Hide file tree
Showing 10 changed files with 325 additions and 18 deletions.
52 changes: 51 additions & 1 deletion six/modules/c++/cphd/include/cphd/PVP.h
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,21 @@ struct SIX_CPHD_API TxAntenna final
{
return !((*this) == other);
}

//! Given an initial offset, setup each member relative to it
void setOffset(const size_t offset)
{
txACX.value().param.setOffset(offset); // 3 blocks
txACY.value().param.setOffset(offset + 3); // 3 blocks
txEB.value().param.setOffset(offset + 6); // 2 blocks
}

//! Get the offset to the first member
//! This assumes the fields are sequential, which isn't necessarily true
const size_t getOffset() const
{
return txACX.value().param.getOffset();
}

//! TxACX PVP Structure
six::XsElement<PerVectorParameterXYZ> txACX{ "TxACX" };
Expand Down Expand Up @@ -307,7 +322,22 @@ struct SIX_CPHD_API RcvAntenna final
{
return !((*this) == other);
}


//! Given an initial offset, setup each member relative to it
void setOffset(const size_t offset)
{
rcvACX.value().param.setOffset(offset); // 3 blocks
rcvACY.value().param.setOffset(offset + 3); // 3 blocks
rcvEB.value().param.setOffset(offset + 6); // 2 blocks
}

//! Get the offset to the first member
//! This assumes the fields are sequential, which isn't necessarily true
const size_t getOffset() const
{
return rcvACX.value().param.getOffset();
}

//! RcvACX PVP Structure
six::XsElement<PerVectorParameterXYZ> rcvACX{ "RcvACX" };

Expand Down Expand Up @@ -579,6 +609,26 @@ struct SIX_CPHD_API Pvp final
* if format is invalid
*/
void append(PVPType& param);

/*
* \func appendTxAnt
*
* \brief Add transmit antenna block to PVP data
*
* \throws except::Exception If param offset or size overlaps another parameter, or
* if format is invalid, or the transmit antenna already has been set
*/
void appendTxAnt();

/*
* \func appendRcvAnt
*
* \brief Add receive antenna block to PVP data
*
* \throws except::Exception If param offset or size overlaps another parameter, or
* if format is invalid, or the receive antenna already has been set
*/
void appendRcvAnt();

/*
* \func setParameter
Expand Down
60 changes: 59 additions & 1 deletion six/modules/c++/cphd/include/cphd/PVPBlock.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,47 @@ struct AddedPVP<std::string>
}
};

struct PvpAntenna
{
PvpAntenna() :
acx(Vector3()),
acy(Vector3()),
eb(Vector2()) {};
PvpAntenna(Vector3 acx, Vector3 acy, Vector2 eb):
acx(acx),
acy(acy),
eb(eb) {};
~PvpAntenna() = default;
PvpAntenna(const PvpAntenna&) = default;
PvpAntenna& operator=(const PvpAntenna&) = default;
PvpAntenna(PvpAntenna&&) = default;
PvpAntenna& operator=(PvpAntenna&&) = default;

Vector3 acx;
Vector3 acy;
Vector2 eb;


bool operator==(const PvpAntenna& other) const
{
return (acx == other.acx) &&
(acy == other.acy) &&
(eb == other.eb);
};

bool operator!=(const PvpAntenna& other) const
{
return !(*this == other);
};
};
inline std::ostream& operator<<(std::ostream& os, const PvpAntenna& v)
{
os << v.acx << "\n";
os << v.acy << "\n";
os << v.eb << "\n";
return os;
}

/*!
* \struct PVPBlock
*
Expand Down Expand Up @@ -184,6 +225,8 @@ struct SIX_CPHD_API PVPBlock
double getTOAE2(size_t channel, size_t set) const;
double getTdIonoSRP(size_t channel, size_t set) const;
std::int64_t getSignal(size_t channel, size_t set) const;
PvpAntenna getTxAntenna(size_t channel, size_t set) const;
PvpAntenna getRcvAntenna(size_t channel, size_t set) const;

template<typename T>
T getAddedPVP(size_t channel, size_t set, const std::string& name) const
Expand Down Expand Up @@ -223,6 +266,8 @@ struct SIX_CPHD_API PVPBlock
void setTOAE2(double value, size_t channel, size_t set);
void setTdIonoSRP(double value, size_t channel, size_t set);
void setSignal(std::int64_t value, size_t channel, size_t set);
void setTxAntenna(PvpAntenna value, size_t channel, size_t set);
void setRcvAntenna(PvpAntenna value, size_t channel, size_t set);

template<typename T>
void setAddedPVP(T value, size_t channel, size_t set, const std::string& name)
Expand Down Expand Up @@ -312,6 +357,14 @@ struct SIX_CPHD_API PVPBlock
{
return mSignalEnabled;
}
bool hasTxAntenna() const
{
return mTxAntennaEnabled;
}
bool hasRcvAntenna() const
{
return mRcvAntennaEnabled;
}

/*
* \func load
Expand Down Expand Up @@ -416,7 +469,8 @@ struct SIX_CPHD_API PVPBlock
ampSF == other.ampSF && fxN1 == other.fxN1 &&
fxN2 == other.fxN2 && toaE1 == other.toaE1 &&
toaE2 == other.toaE2 && tdIonoSRP == other.tdIonoSRP &&
signal == other.signal && addedPVP == other.addedPVP;
signal == other.signal && addedPVP == other.addedPVP &&
txAntenna == other.txAntenna && rcvAntenna == other.rcvAntenna;
}
bool operator!=(const PVPSet& other) const
{
Expand Down Expand Up @@ -450,6 +504,8 @@ struct SIX_CPHD_API PVPBlock
mem::ScopedCopyablePtr<double> toaE2;
mem::ScopedCopyablePtr<double> tdIonoSRP;
mem::ScopedCopyablePtr<std::int64_t> signal;
mem::ScopedCopyablePtr<PvpAntenna> txAntenna;
mem::ScopedCopyablePtr<PvpAntenna> rcvAntenna;

//! (Optional) Additional parameters
std::unordered_map<std::string,six::Parameter> addedPVP;
Expand All @@ -474,6 +530,8 @@ struct SIX_CPHD_API PVPBlock
bool mToaE2Enabled;
bool mTDIonoSRPEnabled;
bool mSignalEnabled;
bool mTxAntennaEnabled;
bool mRcvAntennaEnabled;

//! Ostream operator
SIX_CPHD_API friend std::ostream& operator<< (std::ostream& os, const PVPBlock& p);
Expand Down
8 changes: 8 additions & 0 deletions six/modules/c++/cphd/include/cphd/TestDataGenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@ namespace cphd
*/
SIX_CPHD_API double getRandom();

/*
* \func getRandomVector2
* \brief generates vector2D type object with random values
*
* \return Return vector2D object
*/
SIX_CPHD_API Vector2 getRandomVector2();

/*
* \func getRandomVector3
* \brief generates vector3D type object with random values
Expand Down
16 changes: 8 additions & 8 deletions six/modules/c++/cphd/source/CPHDXMLParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1460,20 +1460,20 @@ void CPHDXMLParser::parse(const xml::lite::Element& parent, six::XsElement_minOc
{
if (const auto pXML = getOptional(parent, o.tag()))
{
o = TxAntenna{};
parse(*pXML, value(o).txACX);
parse(*pXML, value(o).txACY);
parse(*pXML, value(o).txEB);
o.value().emplace();
parse(getFirstAndOnly(*pXML, "TxACX"), value(o).txACX);
parse(getFirstAndOnly(*pXML, "TxACY"), value(o).txACY);
parse(getFirstAndOnly(*pXML, "TxEB"), value(o).txEB);
}
}
void CPHDXMLParser::parse(const xml::lite::Element& parent, six::XsElement_minOccurs0<RcvAntenna>& o) const
{
if (const auto pXML = getOptional(parent, o.tag()))
{
o = RcvAntenna{};
parse(*pXML, value(o).rcvACX);
parse(*pXML, value(o).rcvACY);
parse(*pXML, value(o).rcvEB);
o.value().emplace();
parse(getFirstAndOnly(*pXML, "RcvACX"), value(o).rcvACX);
parse(getFirstAndOnly(*pXML, "RcvACY"), value(o).rcvACY);
parse(getFirstAndOnly(*pXML, "RcvEB"), value(o).rcvEB);
}
}

Expand Down
36 changes: 34 additions & 2 deletions six/modules/c++/cphd/source/PVP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,30 @@ void Pvp::append(PVPType& param)
setOffset(currentOffset, param);
}

void Pvp::appendTxAnt()
{
size_t currentOffset = mParamLocations.size();
if(has_value(txAntenna))
{
throw except::Exception(Ctxt("txAntenna already set"));
}
validate(8, currentOffset);
txAntenna.value().emplace();
value(txAntenna).setOffset(currentOffset);
}

void Pvp::appendRcvAnt()
{
size_t currentOffset = mParamLocations.size();
if(has_value(rcvAntenna))
{
throw except::Exception(Ctxt("rcvAntenna already set"));
}
validate(8, currentOffset);
rcvAntenna.value().emplace();
value(rcvAntenna).setOffset(currentOffset);
}

// Assumes addedPVP is already correct size
void Pvp::setCustomParameter(size_t size, size_t offset, const std::string& format, const std::string& name)
{
Expand Down Expand Up @@ -175,6 +199,14 @@ size_t Pvp::getReqSetSize() const
{
res += signal.getSize();
}
if(has_value(txAntenna))
{
res += 8;
}
if(has_value(rcvAntenna))
{
res += 8;
}
for (auto it = addedPVP.begin(); it != addedPVP.end(); ++it)
{
res += it->second.getSize();
Expand Down Expand Up @@ -253,11 +285,11 @@ std::ostream& operator<< (std::ostream& os, const Pvp& p)
}
if (has_value(p.txAntenna))
{
os << " TxAntenna : \n" << p.txAntenna << "\n";
os << p.txAntenna;
}
if (has_value(p.rcvAntenna))
{
os << " RcvAntenna : \n" << p.rcvAntenna << "\n";
os << p.rcvAntenna;
}
for (auto it = p.addedPVP.begin(); it != p.addedPVP.end(); ++it)
{
Expand Down
Loading

0 comments on commit efc8e76

Please sign in to comment.