From d9453c3b83f0129478d6f1afebfb098930f44d9a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 19 Dec 2022 14:40:27 +0100 Subject: [PATCH] absolutely magnificent --- mission/tmtc/PusTmFunnel.cpp | 33 ++----------------------------- mission/tmtc/TmFunnelBase.cpp | 37 +++++++++++++++++++++++++++++++++++ mission/tmtc/TmFunnelBase.h | 3 +++ mission/tmtc/TmStore.cpp | 9 +++++++-- mission/tmtc/TmStore.h | 6 +++--- 5 files changed, 52 insertions(+), 36 deletions(-) diff --git a/mission/tmtc/PusTmFunnel.cpp b/mission/tmtc/PusTmFunnel.cpp index 18706397..f79ac9b2 100644 --- a/mission/tmtc/PusTmFunnel.cpp +++ b/mission/tmtc/PusTmFunnel.cpp @@ -98,7 +98,7 @@ ReturnValue_t PusTmFunnel::performOperation(uint8_t) { SerializeAdapter::deSerialize(&dumpUntilUnixSeconds, accessor.second.data(), &size, SerializeIF::Endianness::NETWORK); // TODO: TM store missing, and maybe there is a better way to do this? - tmStore->dumpFromUpTo(dumpFromUnixSeconds, dumpUntilUnixSeconds, destinations, tmQueue); + tmStore->dumpFromUpTo(dumpFromUnixSeconds, dumpUntilUnixSeconds, *this); } } } @@ -149,36 +149,7 @@ ReturnValue_t PusTmFunnel::handlePacket(TmTcMessage &message) { miscStore.passPacket(packet); okStore.passPacket(packet); } - - for (unsigned int idx = 0; idx < destinations.size(); idx++) { - const auto &destVcidPair = destinations[idx]; - if (destinations.size() > 1) { - if (idx < destinations.size() - 1) { - // Create copy of data to ensure each TM recipient has its own copy. That way, we don't need - // to bother with send order and where the data is deleted. - store_address_t storeId; - result = tmStore.addData(&storeId, packetData, size); - if (result == returnvalue::OK) { - message.setStorageId(storeId); - } else { -#if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::error << "PusTmFunnel::handlePacket: Store too full to create data copy" - << std::endl; -#endif - } - } else { - message.setStorageId(origStoreId); - } - } - result = tmQueue->sendMessage(destVcidPair.first, &message); - if (result != returnvalue::OK) { -#if FSFW_CPP_OSTREAM_ENABLED == 1 - sif::error << "PusTmFunnel::handlePacket: Error sending TM to downlink handler" << std::endl; -#endif - tmStore.deleteData(message.getStorageId()); - } - } - return result; + return sendPacketToDestinations(origStoreId, message, packetData, size); } const char *PusTmFunnel::getName() const { return "PUS TM Funnel"; } diff --git a/mission/tmtc/TmFunnelBase.cpp b/mission/tmtc/TmFunnelBase.cpp index b4bf6c62..0f600efe 100644 --- a/mission/tmtc/TmFunnelBase.cpp +++ b/mission/tmtc/TmFunnelBase.cpp @@ -1,5 +1,7 @@ #include "TmFunnelBase.h" +#include + #include "fsfw/ipc/QueueFactory.h" TmFunnelBase::TmFunnelBase(object_id_t objectId, StorageManagerIF &tmStore, uint32_t tmMsgDepth, @@ -21,3 +23,38 @@ void TmFunnelBase::addDestination(const AcceptsTelemetryIF &downlinkDestination, auto queueId = downlinkDestination.getReportReceptionQueue(vcid); destinations.emplace_back(queueId, vcid); } + +ReturnValue_t TmFunnelBase::sendPacketToDestinations(store_address_t origStoreId, + TmTcMessage &message, + const uint8_t *packetData, size_t size) { + ReturnValue_t result; + for (unsigned int idx = 0; idx < destinations.size(); idx++) { + const auto &destVcidPair = destinations[idx]; + if (destinations.size() > 1) { + if (idx < destinations.size() - 1) { + // Create copy of data to ensure each TM recipient has its own copy. That way, we don't need + // to bother with send order and where the data is deleted. + store_address_t storeId; + result = tmStore.addData(&storeId, packetData, size); + if (result == returnvalue::OK) { + message.setStorageId(storeId); + } else { +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::error << "PusTmFunnel::handlePacket: Store too full to create data copy" + << std::endl; +#endif + } + } else { + message.setStorageId(origStoreId); + } + } + result = tmQueue->sendMessage(destVcidPair.first, &message); + if (result != returnvalue::OK) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::error << "PusTmFunnel::handlePacket: Error sending TM to downlink handler" << std::endl; +#endif + tmStore.deleteData(message.getStorageId()); + } + } + return result; +} diff --git a/mission/tmtc/TmFunnelBase.h b/mission/tmtc/TmFunnelBase.h index 12453cc2..bfff3440 100644 --- a/mission/tmtc/TmFunnelBase.h +++ b/mission/tmtc/TmFunnelBase.h @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -15,6 +16,8 @@ class TmFunnelBase : public TmStoreFrontendSimpleIF, TmFunnelBase(object_id_t objectId, StorageManagerIF& tmStore, uint32_t tmMsgDepth, uint32_t tcMsgDepth, StorageManagerIF& ipcStore); void addDestination(const AcceptsTelemetryIF& downlinkDestination, uint8_t vcid = 0); + ReturnValue_t sendPacketToDestinations(store_address_t origStoreId, TmTcMessage& message, + const uint8_t* packetData, size_t size); [[nodiscard]] MessageQueueId_t getCommandQueue() const override; [[nodiscard]] MessageQueueId_t getReportReceptionQueue(uint8_t virtualChannel) const override; diff --git a/mission/tmtc/TmStore.cpp b/mission/tmtc/TmStore.cpp index 2de1e818..a18f16d1 100644 --- a/mission/tmtc/TmStore.cpp +++ b/mission/tmtc/TmStore.cpp @@ -185,5 +185,10 @@ void TmStore::addServiceSubservice(uint8_t service, uint8_t subservice) { void TmStore::deleteUpTo(uint32_t unixSeconds) {} void TmStore::dumpFromUpTo(uint32_t fromUnixSeconds, uint32_t upToUnixSeconds, - std::vector>& destinations, - MessageQueueIF* tmQueue) {} + TmFunnelBase& funnel) { + store_address_t storeId; + TmTcMessage message; + const uint8_t* packetData = nullptr; + size_t size = 0; + funnel.sendPacketToDestinations(storeId, message, packetData, size); +} diff --git a/mission/tmtc/TmStore.h b/mission/tmtc/TmStore.h index 72071e02..0654052d 100644 --- a/mission/tmtc/TmStore.h +++ b/mission/tmtc/TmStore.h @@ -9,6 +9,8 @@ #include +#include "TmFunnelBase.h" + struct PacketFilter { std::optional> apid; std::optional> services; @@ -28,9 +30,7 @@ class TmStore : public SystemObject { void addServiceSubservice(uint8_t service, uint8_t subservice); void deleteUpTo(uint32_t unixSeconds); - void dumpFromUpTo(uint32_t fromUnixSeconds, uint32_t upToUnixSeconds, - std::vector>& destinations, - MessageQueueIF* tmQueue); + void dumpFromUpTo(uint32_t fromUnixSeconds, uint32_t upToUnixSeconds, TmFunnelBase& tmFunnel); void updateBaseDir(); ReturnValue_t passPacket(PusTmReader& reader);