#include "fsfw/tcdistribution/CfdpDistributor.h" #include "fsfw/objectmanager/ObjectManager.h" #include "fsfw/tcdistribution/CcsdsDistributorIF.h" #include "fsfw/tmtcpacket/cfdp/CfdpPacketStored.h" #ifndef FSFW_CFDP_DISTRIBUTOR_DEBUGGING #define FSFW_CFDP_DISTRIBUTOR_DEBUGGING 1 #endif CfdpDistributor::CfdpDistributor(uint16_t setApid, object_id_t setObjectId, object_id_t setPacketSource) : TcDistributorBase(setObjectId), apid(setApid), checker(setApid), tcStatus(RETURN_FAILED), packetSource(setPacketSource) {} CfdpDistributor::~CfdpDistributor() = default; ReturnValue_t CfdpDistributor::selectDestination(MessageQueueId_t& destId) { //#if FSFW_CFDP_DISTRIBUTOR_DEBUGGING == 1 // store_address_t storeId = this->currentMessage.getStorageId(); //#if FSFW_CPP_OSTREAM_ENABLED == 1 // sif::debug << "CFDPDistributor::handlePacket received: " << storeId.poolIndex << ", " // << storeId.packetIndex << std::endl; //#else // sif::printDebug("CFDPDistributor::handlePacket received: %d, %d\n", storeId.poolIndex, // storeId.packetIndex); //#endif //#endif // auto queueMapIt = this->queueMap.end(); // if (this->currentPacket == nullptr) { // return queueMapIt; // } // this->currentPacket->setStoreAddress(this->currentMessage.getStorageId()); // if (currentPacket->getFullData() != nullptr) { // tcStatus = checker.checkPacket(*currentPacket, currentPacket->getFullPacketLen()); // if (tcStatus != HasReturnvaluesIF::RETURN_OK) { //#if FSFW_VERBOSE_LEVEL >= 1 //#if FSFW_CPP_OSTREAM_ENABLED == 1 // sif::debug << "CFDPDistributor::handlePacket: Packet format invalid, code " // << static_cast(tcStatus) << std::endl; //#else // sif::printDebug("CFDPDistributor::handlePacket: Packet format invalid, code %d\n", // static_cast(tcStatus)); //#endif //#endif // } // queueMapIt = this->queueMap.find(0); // } else { // tcStatus = PACKET_LOST; // } // // if (queueMapIt == this->queueMap.end()) { // tcStatus = DESTINATION_NOT_FOUND; //#if FSFW_VERBOSE_LEVEL >= 1 //#if FSFW_CPP_OSTREAM_ENABLED == 1 // sif::debug << "CFDPDistributor::handlePacket: Destination not found" << std::endl; //#else // sif::printDebug("CFDPDistributor::handlePacket: Destination not found\n"); //#endif /* !FSFW_CPP_OSTREAM_ENABLED == 1 */ //#endif // } // // if (tcStatus != RETURN_OK) { // return this->queueMap.end(); // } else { // return queueMapIt; // } return HasReturnvaluesIF::RETURN_OK; } ReturnValue_t CfdpDistributor::registerHandler(AcceptsTelecommandsIF* handler) { // uint16_t handlerId = // handler->getIdentifier(); // should be 0, because CfdpHandler does not set a set a // service-ID //#if FSFW_CFDP_DISTRIBUTOR_DEBUGGING == 1 //#if FSFW_CPP_OSTREAM_ENABLED == 1 // sif::info << "CFDPDistributor::registerHandler: Handler ID: " << static_cast(handlerId) // << std::endl; //#else // sif::printInfo("CFDPDistributor::registerHandler: Handler ID: %d\n", // static_cast(handlerId)); //#endif //#endif // MessageQueueId_t queue = handler->getRequestQueue(); // auto returnPair = queueMap.emplace(handlerId, queue); // if (not returnPair.second) { //#if FSFW_VERBOSE_LEVEL >= 1 //#if FSFW_CPP_OSTREAM_ENABLED == 1 // sif::error << "CFDPDistributor::registerHandler: Service ID already" // " exists in map" // << std::endl; //#else // sif::printError("CFDPDistributor::registerHandler: Service ID already exists in map\n"); //#endif //#endif // return SERVICE_ID_ALREADY_EXISTS; // } return HasReturnvaluesIF::RETURN_OK; } MessageQueueId_t CfdpDistributor::getRequestQueue() const { return tcQueue->getId(); } // ReturnValue_t CFDPDistributor::callbackAfterSending(ReturnValue_t queueStatus) { // if (queueStatus != RETURN_OK) { // tcStatus = queueStatus; // } // if (tcStatus != RETURN_OK) { // this->verifyChannel.sendFailureReport(tc_verification::ACCEPTANCE_FAILURE, // currentPacket, tcStatus); // // A failed packet is deleted immediately after reporting, // // otherwise it will block memory. // currentPacket->deletePacket(); // return RETURN_FAILED; // } else { // this->verifyChannel.sendSuccessReport(tc_verification::ACCEPTANCE_SUCCESS, // currentPacket); // return RETURN_OK; // } // } uint32_t CfdpDistributor::getIdentifier() const { return this->apid; } ReturnValue_t CfdpDistributor::initialize() { // currentPacket = new CfdpPacketStored(); // if (currentPacket == nullptr) { // // Should not happen, memory allocation failed! // return ObjectManagerIF::CHILD_INIT_FAILED; // } // // auto* ccsdsDistributor = ObjectManager::instance()->get(packetSource); // if (ccsdsDistributor == nullptr) { //#if FSFW_CPP_OSTREAM_ENABLED == 1 // sif::error << "CFDPDistributor::initialize: Packet source invalid" << std::endl; // sif::error << " Make sure it exists and implements CCSDSDistributorIF!" << std::endl; //#else // sif::printError("CFDPDistributor::initialize: Packet source invalid\n"); // sif::printError("Make sure it exists and implements CcsdsDistributorIF\n"); //#endif // return RETURN_FAILED; // } // return ccsdsDistributor->registerApplication(this); return HasReturnvaluesIF::RETURN_OK; }