#ifndef MISSION_TMTC_TMFUNNELBASE_H_ #define MISSION_TMTC_TMFUNNELBASE_H_ #include #include #include #include #include #include class TmFunnelBase : public TmStoreFrontendSimpleIF, public AcceptsTelemetryIF, public SystemObject { public: struct FunnelCfg { FunnelCfg(object_id_t objId, StorageManagerIF& tmStore, StorageManagerIF& ipcStore, uint32_t tmMsgDepth, uint32_t tcMsgDepth) : objectId(objId), tmStore(tmStore), ipcStore(ipcStore), tmMsgDepth(tmMsgDepth), tcMsgDepth(tcMsgDepth) {} object_id_t objectId; StorageManagerIF& tmStore; StorageManagerIF& ipcStore; uint32_t tmMsgDepth; uint32_t tcMsgDepth; }; TmFunnelBase(FunnelCfg cfg); void addDestination(const char* name, 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 getReportReceptionQueue(uint8_t virtualChannel) const override; virtual ~TmFunnelBase(); protected: StorageManagerIF& tmStore; StorageManagerIF& ipcStore; struct Destination { Destination(const char* name, MessageQueueId_t queueId, uint8_t virtualChannel) : name(name), queueId(queueId), virtualChannel(virtualChannel) {} const char* name; MessageQueueId_t queueId; uint8_t virtualChannel = 0; }; std::vector destinations; MessageQueueIF* tmQueue = nullptr; MessageQueueIF* tcQueue = nullptr; MessageQueueId_t getCommandQueue() const override; }; #endif /* MISSION_TMTC_TMFUNNELBASE_H_ */