2020-10-01 13:23:06 +02:00
|
|
|
#ifndef FRAMEWORK_TCDISTRIBUTION_CCSDSDISTRIBUTOR_H_
|
|
|
|
#define FRAMEWORK_TCDISTRIBUTION_CCSDSDISTRIBUTOR_H_
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-08-01 11:00:36 +02:00
|
|
|
#include <map>
|
|
|
|
|
2022-07-27 17:00:43 +02:00
|
|
|
#include "fsfw/objectmanager/ObjectManagerIF.h"
|
|
|
|
#include "fsfw/storagemanager/StorageManagerIF.h"
|
2022-07-29 12:03:14 +02:00
|
|
|
#include "fsfw/tcdistribution/CcsdsDistributorIF.h"
|
2022-07-27 17:00:43 +02:00
|
|
|
#include "fsfw/tcdistribution/CcsdsPacketChecker.h"
|
2022-08-01 11:00:36 +02:00
|
|
|
#include "fsfw/tcdistribution/TcDistributorBase.h"
|
2022-07-27 17:00:43 +02:00
|
|
|
#include "fsfw/tmtcservices/AcceptsTelecommandsIF.h"
|
2020-10-01 13:23:06 +02:00
|
|
|
|
2016-06-15 23:48:41 +02:00
|
|
|
/**
|
2022-07-29 12:03:14 +02:00
|
|
|
* @brief An instantiation of the CcsdsDistributorIF.
|
2020-10-01 13:23:06 +02:00
|
|
|
* @details
|
|
|
|
* It receives Space Packets, and selects a destination depending on the
|
|
|
|
* APID of the telecommands.
|
2016-06-15 23:48:41 +02:00
|
|
|
* The Secondary Header (with Service/Subservice) is ignored.
|
2020-10-01 13:23:06 +02:00
|
|
|
* @ingroup tc_distribution
|
2016-06-15 23:48:41 +02:00
|
|
|
*/
|
2022-08-01 11:00:36 +02:00
|
|
|
class CcsdsDistributor : public TcDistributorBase,
|
2022-07-29 12:03:14 +02:00
|
|
|
public CcsdsDistributorIF,
|
2022-02-02 10:29:30 +01:00
|
|
|
public AcceptsTelecommandsIF {
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* @brief The constructor sets the default APID and calls the
|
|
|
|
* TcDistributor ctor with a certain object id.
|
|
|
|
* @details
|
|
|
|
* @c tcStore is set in the @c initialize method.
|
2022-07-27 17:00:43 +02:00
|
|
|
* @param unknownApid The default APID, where packets with unknown
|
2022-02-02 10:29:30 +01:00
|
|
|
* destination are sent to.
|
|
|
|
*/
|
2022-07-29 12:03:14 +02:00
|
|
|
CcsdsDistributor(uint16_t unknownApid, object_id_t setObjectId,
|
2022-08-01 17:16:37 +02:00
|
|
|
StorageManagerIF* tcStore = nullptr, MessageQueueIF* msgQueue = nullptr,
|
2022-07-27 17:00:43 +02:00
|
|
|
CcsdsPacketCheckIF* packetChecker = nullptr);
|
2022-02-02 10:29:30 +01:00
|
|
|
/**
|
|
|
|
* The destructor is empty.
|
|
|
|
*/
|
2022-07-29 12:03:14 +02:00
|
|
|
~CcsdsDistributor() override;
|
2020-10-01 13:23:06 +02:00
|
|
|
|
2022-08-01 14:23:52 +02:00
|
|
|
[[nodiscard]] MessageQueueId_t getRequestQueue() const override;
|
2022-08-01 11:00:36 +02:00
|
|
|
ReturnValue_t registerApplication(DestInfo info) override;
|
2022-08-01 14:23:52 +02:00
|
|
|
[[nodiscard]] uint32_t getIdentifier() const override;
|
2022-02-02 10:29:30 +01:00
|
|
|
ReturnValue_t initialize() override;
|
2022-08-01 11:00:36 +02:00
|
|
|
[[nodiscard]] const char* getName() const override;
|
2020-10-01 13:23:06 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
protected:
|
2022-08-01 11:00:36 +02:00
|
|
|
using CcsdsReceiverMap = std::map<uint16_t, DestInfo>;
|
|
|
|
CcsdsReceiverMap receiverMap;
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/**
|
|
|
|
* This implementation checks if an application with fitting APID has
|
|
|
|
* registered and forwards the packet to the according message queue.
|
|
|
|
* If the packet is not found, it returns the queue to @c defaultApid,
|
|
|
|
* where a Acceptance Failure message should be generated.
|
2022-08-03 11:33:10 +02:00
|
|
|
* @return
|
|
|
|
* - @c RETURN_OK if a valid desintation was found, error code otherwise
|
|
|
|
* - @c SerializeIF::STREAM_TOO_SHORT: Packet too short to be a space packet
|
2022-02-02 10:29:30 +01:00
|
|
|
*/
|
2022-08-01 11:00:36 +02:00
|
|
|
ReturnValue_t selectDestination(MessageQueueId_t& destId) override;
|
2022-02-02 10:29:30 +01:00
|
|
|
/**
|
|
|
|
* The callback here handles the generation of acceptance
|
|
|
|
* success/failure messages.
|
|
|
|
*/
|
|
|
|
ReturnValue_t callbackAfterSending(ReturnValue_t queueStatus) override;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-08-01 11:00:36 +02:00
|
|
|
static void handlePacketCheckFailure(ReturnValue_t result);
|
|
|
|
|
2022-08-01 17:16:37 +02:00
|
|
|
ReturnValue_t handleCcsdsHeaderRemoval(ConstStorageAccessor& accessor);
|
2022-08-01 11:00:36 +02:00
|
|
|
void print();
|
2022-02-02 10:29:30 +01:00
|
|
|
/**
|
|
|
|
* The default APID, where packets with unknown APID are sent to.
|
|
|
|
*/
|
|
|
|
uint16_t defaultApid;
|
|
|
|
/**
|
|
|
|
* A reference to the TC storage must be maintained, as this class handles
|
|
|
|
* pure Space Packets and there exists no SpacePacketStored class.
|
|
|
|
*/
|
|
|
|
StorageManagerIF* tcStore = nullptr;
|
2022-07-27 17:00:43 +02:00
|
|
|
|
2022-08-03 11:36:56 +02:00
|
|
|
bool ownedPacketChecker = false;
|
2022-07-27 17:00:43 +02:00
|
|
|
CcsdsPacketCheckIF* packetChecker = nullptr;
|
2020-10-01 13:23:06 +02:00
|
|
|
};
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2020-10-01 13:23:06 +02:00
|
|
|
#endif /* FRAMEWORK_TCDISTRIBUTION_CCSDSDISTRIBUTOR_H_ */
|