tc distribution equalization

This commit is contained in:
Robin Müller 2020-10-01 13:21:23 +02:00
parent 32ebca48b8
commit 315777d265
10 changed files with 170 additions and 135 deletions

View File

@ -1,5 +1,6 @@
#include "CCSDSDistributor.h"
#include "../serviceinterface/ServiceInterfaceStream.h" #include "../serviceinterface/ServiceInterfaceStream.h"
#include "../tcdistribution/CCSDSDistributor.h"
#include "../tmtcpacket/SpacePacketBase.h" #include "../tmtcpacket/SpacePacketBase.h"
CCSDSDistributor::CCSDSDistributor(uint16_t setDefaultApid, CCSDSDistributor::CCSDSDistributor(uint16_t setDefaultApid,
@ -42,9 +43,9 @@ MessageQueueId_t CCSDSDistributor::getRequestQueue() {
ReturnValue_t CCSDSDistributor::registerApplication( ReturnValue_t CCSDSDistributor::registerApplication(
AcceptsTelecommandsIF* application) { AcceptsTelecommandsIF* application) {
ReturnValue_t returnValue = RETURN_OK; ReturnValue_t returnValue = RETURN_OK;
bool errorCode = true; auto insertPair = this->queueMap.emplace(application->getIdentifier(),
errorCode = this->queueMap.insert( std::pair<uint32_t, MessageQueueId_t>( application->getIdentifier(), application->getRequestQueue() ) ).second; application->getRequestQueue());
if( errorCode == false ) { if(not insertPair.second) {
returnValue = RETURN_FAILED; returnValue = RETURN_FAILED;
} }
return returnValue; return returnValue;
@ -53,9 +54,8 @@ ReturnValue_t CCSDSDistributor::registerApplication(
ReturnValue_t CCSDSDistributor::registerApplication(uint16_t apid, ReturnValue_t CCSDSDistributor::registerApplication(uint16_t apid,
MessageQueueId_t id) { MessageQueueId_t id) {
ReturnValue_t returnValue = RETURN_OK; ReturnValue_t returnValue = RETURN_OK;
bool errorCode = true; auto insertPair = this->queueMap.emplace(apid, id);
errorCode = this->queueMap.insert( std::pair<uint32_t, MessageQueueId_t>( apid, id ) ).second; if(not insertPair.second) {
if( errorCode == false ) {
returnValue = RETURN_FAILED; returnValue = RETURN_FAILED;
} }
return returnValue; return returnValue;
@ -69,7 +69,11 @@ uint16_t CCSDSDistributor::getIdentifier() {
ReturnValue_t CCSDSDistributor::initialize() { ReturnValue_t CCSDSDistributor::initialize() {
ReturnValue_t status = this->TcDistributor::initialize(); ReturnValue_t status = this->TcDistributor::initialize();
this->tcStore = objectManager->get<StorageManagerIF>( objects::TC_STORE ); this->tcStore = objectManager->get<StorageManagerIF>( objects::TC_STORE );
if (this->tcStore == NULL) status = RETURN_FAILED; if (this->tcStore == nullptr) {
sif::error << "CCSDSDistributor::initialize: Could not initialize"
" TC store!" << std::endl;
status = RETURN_FAILED;
}
return status; return status;
} }

View File

@ -38,7 +38,7 @@ public:
MessageQueueId_t id) override; MessageQueueId_t id) override;
ReturnValue_t registerApplication( ReturnValue_t registerApplication(
AcceptsTelecommandsIF* application) override; AcceptsTelecommandsIF* application) override;
uint16_t getIdentifier(); uint16_t getIdentifier() override;
ReturnValue_t initialize() override; ReturnValue_t initialize() override;
protected: protected:
@ -50,6 +50,12 @@ protected:
* @return Iterator to map entry of found APID or iterator to default APID. * @return Iterator to map entry of found APID or iterator to default APID.
*/ */
TcMqMapIter selectDestination() override; TcMqMapIter selectDestination() override;
/**
* The callback here handles the generation of acceptance
* success/failure messages.
*/
ReturnValue_t callbackAfterSending( ReturnValue_t queueStatus ) override;
/** /**
* The default APID, where packets with unknown APID are sent to. * The default APID, where packets with unknown APID are sent to.
*/ */
@ -59,11 +65,7 @@ protected:
* pure Space Packets and there exists no SpacePacketStored class. * pure Space Packets and there exists no SpacePacketStored class.
*/ */
StorageManagerIF* tcStore = nullptr; StorageManagerIF* tcStore = nullptr;
/**
* The callback here handles the generation of acceptance
* success/failure messages.
*/
ReturnValue_t callbackAfterSending( ReturnValue_t queueStatus );
}; };
#endif /* FRAMEWORK_TCDISTRIBUTION_CCSDSDISTRIBUTOR_H_ */ #endif /* FRAMEWORK_TCDISTRIBUTION_CCSDSDISTRIBUTOR_H_ */

View File

@ -1,34 +1,38 @@
#ifndef CCSDSDISTRIBUTORIF_H_ #ifndef FSFW_TCDISTRIBUTION_CCSDSDISTRIBUTORIF_H_
#define CCSDSDISTRIBUTORIF_H_ #define FSFW_TCDISTRIBUTION_CCSDSDISTRIBUTORIF_H_
#include "../tmtcservices/AcceptsTelecommandsIF.h" #include "../tmtcservices/AcceptsTelecommandsIF.h"
#include "../ipc/MessageQueueSenderIF.h" #include "../ipc/MessageQueueSenderIF.h"
/** /**
* This is the Interface to a CCSDS Distributor. * This is the Interface to a CCSDS Distributor.
* On a CCSDS Distributor, Applications (in terms of CCSDS) may register themselves, * On a CCSDS Distributor, Applications (in terms of CCSDS) may register
* either by passing a pointer to themselves (and implementing the CCSDSApplicationIF, * themselves, either by passing a pointer to themselves (and implementing the
* or by explicitly passing an APID and a MessageQueueId to route the TC's to. * CCSDSApplicationIF), or by explicitly passing an APID and a MessageQueueId
* \ingroup tc_distribution * to route the TC's to.
* @ingroup tc_distribution
*/ */
class CCSDSDistributorIF { class CCSDSDistributorIF {
public: public:
/** /**
* With this call, a class implementing the CCSDSApplicationIF can register at the * With this call, a class implementing the CCSDSApplicationIF can register
* distributor. * at the distributor.
* @param application A pointer to the Application to register. * @param application A pointer to the Application to register.
* @return - \c RETURN_OK on success, * @return - @c RETURN_OK on success,
* - \c RETURN_FAILED on failure. * - @c RETURN_FAILED on failure.
*/ */
virtual ReturnValue_t registerApplication( AcceptsTelecommandsIF* application ) = 0; virtual ReturnValue_t registerApplication(
AcceptsTelecommandsIF* application) = 0;
/** /**
* With this call, other Applications can register to the CCSDS distributor. * With this call, other Applications can register to the CCSDS distributor.
* This is done by passing an APID and a MessageQueueId to the method. * This is done by passing an APID and a MessageQueueId to the method.
* @param apid The APID to register. * @param apid The APID to register.
* @param id The MessageQueueId of the message queue to send the TC Packets to. * @param id The MessageQueueId of the message queue to send the
* @return - \c RETURN_OK on success, * TC Packets to.
* - \c RETURN_FAILED on failure. * @return - @c RETURN_OK on success,
* - @c RETURN_FAILED on failure.
*/ */
virtual ReturnValue_t registerApplication( uint16_t apid, MessageQueueId_t id ) = 0; virtual ReturnValue_t registerApplication( uint16_t apid,
MessageQueueId_t id) = 0;
/** /**
* The empty virtual destructor. * The empty virtual destructor.
*/ */
@ -37,4 +41,4 @@ public:
}; };
#endif /* CCSDSDISTRIBUTORIF_H_ */ #endif /* FSFW_TCDISTRIBUTION_CCSDSDISTRIBUTORIF_H_ */

View File

@ -1,57 +1,66 @@
#include "CCSDSDistributorIF.h"
#include "PUSDistributor.h"
#include "../serviceinterface/ServiceInterfaceStream.h" #include "../serviceinterface/ServiceInterfaceStream.h"
#include "../tcdistribution/CCSDSDistributorIF.h"
#include "../tcdistribution/PUSDistributor.h"
#include "../tmtcpacket/pus/TcPacketStored.h" #include "../tmtcpacket/pus/TcPacketStored.h"
#include "../tmtcservices/PusVerificationReport.h" #include "../tmtcservices/PusVerificationReport.h"
PUSDistributor::PUSDistributor(uint16_t setApid, object_id_t setObjectId, PUSDistributor::PUSDistributor(uint16_t setApid, object_id_t setObjectId,
object_id_t setPacketSource) : object_id_t setPacketSource) :
TcDistributor(setObjectId), checker(setApid), verifyChannel(), TcDistributor(setObjectId), checker(setApid), verifyChannel(),
currentPacket(), tcStatus(RETURN_FAILED), tcStatus(RETURN_FAILED), packetSource(setPacketSource) {}
packetSource(setPacketSource) {}
PUSDistributor::~PUSDistributor() {} PUSDistributor::~PUSDistributor() {}
TcDistributor::TcMqMapIter PUSDistributor::selectDestination() { PUSDistributor::TcMqMapIter PUSDistributor::selectDestination() {
// sif:: debug << "PUSDistributor::handlePacket received: "
// << this->current_packet_id.store_index << ", "
// << this->current_packet_id.packet_index << std::endl;
TcMqMapIter queueMapIt = this->queueMap.end(); TcMqMapIter queueMapIt = this->queueMap.end();
this->currentPacket.setStoreAddress(this->currentMessage.getStorageId()); this->currentPacket->setStoreAddress(this->currentMessage.getStorageId());
if (currentPacket.getWholeData() != NULL) { if (currentPacket->getWholeData() != NULL) {
tcStatus = checker.checkPacket(&currentPacket); tcStatus = checker.checkPacket(currentPacket);
// sif::debug << "PUSDistributor::handlePacket: packetCheck returned with " #ifdef DEBUG
// << (int)tcStatus << std::endl; if(tcStatus != HasReturnvaluesIF::RETURN_OK) {
uint32_t queue_id = currentPacket.getService(); sif::debug << "PUSDistributor::handlePacket: Packet format "
<< "invalid, code "<< static_cast<int>(tcStatus)
<< std::endl;
}
#endif
uint32_t queue_id = currentPacket->getService();
queueMapIt = this->queueMap.find(queue_id); queueMapIt = this->queueMap.find(queue_id);
} else { }
else {
tcStatus = PACKET_LOST; tcStatus = PACKET_LOST;
} }
if (queueMapIt == this->queueMap.end()) { if (queueMapIt == this->queueMap.end()) {
tcStatus = DESTINATION_NOT_FOUND; tcStatus = DESTINATION_NOT_FOUND;
#ifdef DEBUG
sif::debug << "PUSDistributor::handlePacket: Destination not found, "
<< "code "<< static_cast<int>(tcStatus) << std::endl;
#endif
} }
if (tcStatus != RETURN_OK) { if (tcStatus != RETURN_OK) {
sif::debug << "PUSDistributor::handlePacket: Error with " << tcStatus
<< ", 0x"<< std::hex << tcStatus << std::dec << std::endl;
return this->queueMap.end(); return this->queueMap.end();
} else { }
else {
return queueMapIt; return queueMapIt;
} }
} }
//uint16_t PUSDistributor::createDestination( uint8_t service_id, uint8_t subservice_id ) {
// return ( service_id << 8 ) + subservice_id;
//}
ReturnValue_t PUSDistributor::registerService(AcceptsTelecommandsIF* service) { ReturnValue_t PUSDistributor::registerService(AcceptsTelecommandsIF* service) {
uint16_t serviceId = service->getIdentifier(); uint16_t serviceId = service->getIdentifier();
//info << "Service ID: " << (int)serviceId << std::endl; // sif::info << "Service ID: " << (int)serviceId << std::endl;
MessageQueueId_t queue = service->getRequestQueue(); MessageQueueId_t queue = service->getRequestQueue();
auto returnPair = queueMap.emplace(serviceId, queue); auto returnPair = queueMap.emplace(serviceId, queue);
if (not returnPair.second) { if (not returnPair.second) {
//TODO Return Code
sif::error << "PUSDistributor::registerService: Service ID already" sif::error << "PUSDistributor::registerService: Service ID already"
" exists in map." << std::endl; " exists in map." << std::endl;
return HasReturnvaluesIF::RETURN_FAILED; return SERVICE_ID_ALREADY_EXISTS;
} }
return HasReturnvaluesIF::RETURN_OK; return HasReturnvaluesIF::RETURN_OK;
} }
@ -66,13 +75,14 @@ ReturnValue_t PUSDistributor::callbackAfterSending(ReturnValue_t queueStatus) {
} }
if (tcStatus != RETURN_OK) { if (tcStatus != RETURN_OK) {
this->verifyChannel.sendFailureReport(TC_VERIFY::ACCEPTANCE_FAILURE, this->verifyChannel.sendFailureReport(TC_VERIFY::ACCEPTANCE_FAILURE,
&currentPacket, tcStatus); currentPacket, tcStatus);
//A failed packet is deleted immediately after reporting, otherwise it will block memory. // A failed packet is deleted immediately after reporting,
currentPacket.deletePacket(); // otherwise it will block memory.
currentPacket->deletePacket();
return RETURN_FAILED; return RETURN_FAILED;
} else { } else {
this->verifyChannel.sendSuccessReport(TC_VERIFY::ACCEPTANCE_SUCCESS, this->verifyChannel.sendSuccessReport(TC_VERIFY::ACCEPTANCE_SUCCESS,
&currentPacket); currentPacket);
return RETURN_OK; return RETURN_OK;
} }
} }
@ -84,9 +94,15 @@ uint16_t PUSDistributor::getIdentifier() {
ReturnValue_t PUSDistributor::initialize() { ReturnValue_t PUSDistributor::initialize() {
CCSDSDistributorIF* ccsdsDistributor = CCSDSDistributorIF* ccsdsDistributor =
objectManager->get<CCSDSDistributorIF>(packetSource); objectManager->get<CCSDSDistributorIF>(packetSource);
if (ccsdsDistributor == NULL) { if (ccsdsDistributor == nullptr) {
sif::error << "PUSDistributor::initialize: Packet source invalid."
<< " Make sure it exists and implements CCSDSDistributorIF!"
<< std::endl;
return RETURN_FAILED; return RETURN_FAILED;
} else { }
else {
return ccsdsDistributor->registerApplication(this); return ccsdsDistributor->registerApplication(this);
} }
currentPacket = new TcPacketStored();
} }

View File

@ -1,10 +1,11 @@
#ifndef FRAMEWORK_TCDISTRIBUTION_PUSDISTRIBUTOR_H_ #ifndef FSFW_TCDISTRIBUTION_PUSDISTRIBUTOR_H_
#define FRAMEWORK_TCDISTRIBUTION_PUSDISTRIBUTOR_H_ #define FSFW_TCDISTRIBUTION_PUSDISTRIBUTOR_H_
#include "PUSDistributorIF.h"
#include "TcDistributor.h"
#include "TcPacketCheck.h"
#include "../returnvalues/HasReturnvaluesIF.h" #include "../returnvalues/HasReturnvaluesIF.h"
#include "../tcdistribution/PUSDistributorIF.h"
#include "../tcdistribution/TcDistributor.h"
#include "../tcdistribution/TcPacketCheck.h"
#include "../tmtcservices/AcceptsTelecommandsIF.h" #include "../tmtcservices/AcceptsTelecommandsIF.h"
#include "../tmtcservices/VerificationReporter.h" #include "../tmtcservices/VerificationReporter.h"
@ -50,7 +51,7 @@ protected:
/** /**
* The currently handled packet is stored here. * The currently handled packet is stored here.
*/ */
TcPacketStored currentPacket; TcPacketStored* currentPacket = nullptr;
/** /**
* With this variable, the current check status is stored to generate * With this variable, the current check status is stored to generate
* acceptance messages later. * acceptance messages later.
@ -58,6 +59,7 @@ protected:
ReturnValue_t tcStatus; ReturnValue_t tcStatus;
const object_id_t packetSource; const object_id_t packetSource;
/** /**
* This method reads the packet service, checks if such a service is * This method reads the packet service, checks if such a service is
* registered and forwards the packet to the destination. * registered and forwards the packet to the destination.
@ -71,7 +73,7 @@ protected:
* The callback here handles the generation of acceptance * The callback here handles the generation of acceptance
* success/failure messages. * success/failure messages.
*/ */
ReturnValue_t callbackAfterSending(ReturnValue_t queueStatus); ReturnValue_t callbackAfterSending(ReturnValue_t queueStatus) override;
}; };
#endif /* FRAMEWORK_TCDISTRIBUTION_PUSDISTRIBUTOR_H_ */ #endif /* FSFW_TCDISTRIBUTION_PUSDISTRIBUTOR_H_ */

View File

@ -1,11 +1,12 @@
#ifndef PUSDISTRIBUTORIF_H_ #ifndef FSFW_TCDISTRIBUTION_PUSDISTRIBUTORIF_H_
#define PUSDISTRIBUTORIF_H_ #define FSFW_TCDISTRIBUTION_PUSDISTRIBUTORIF_H_
#include "../tmtcservices/AcceptsTelecommandsIF.h" #include "../tmtcservices/AcceptsTelecommandsIF.h"
#include "../ipc/MessageQueueSenderIF.h" #include "../ipc/MessageQueueSenderIF.h"
/** /**
* This interface allows PUS Services to register themselves at a PUS Distributor. * This interface allows PUS Services to register themselves at a PUS Distributor.
* \ingroup tc_distribution * @ingroup tc_distribution
*/ */
class PUSDistributorIF { class PUSDistributorIF {
public: public:
@ -17,10 +18,10 @@ public:
/** /**
* With this method, Services can register themselves at the PUS Distributor. * With this method, Services can register themselves at the PUS Distributor.
* @param service A pointer to the registering Service. * @param service A pointer to the registering Service.
* @return - \c RETURN_OK on success, * @return - @c RETURN_OK on success,
* - \c RETURN_FAILED on failure. * - @c RETURN_FAILED on failure.
*/ */
virtual ReturnValue_t registerService( AcceptsTelecommandsIF* service ) = 0; virtual ReturnValue_t registerService( AcceptsTelecommandsIF* service ) = 0;
}; };
#endif /* PUSDISTRIBUTORIF_H_ */ #endif /* FSFW_TCDISTRIBUTION_PUSDISTRIBUTORIF_H_ */

View File

@ -1,12 +1,13 @@
#include "TcDistributor.h"
#include "../serviceinterface/ServiceInterfaceStream.h" #include "../serviceinterface/ServiceInterfaceStream.h"
#include "../serviceinterface/ServiceInterfaceStream.h"
#include "../tcdistribution/TcDistributor.h"
#include "../tmtcservices/TmTcMessage.h" #include "../tmtcservices/TmTcMessage.h"
#include "../ipc/QueueFactory.h" #include "../ipc/QueueFactory.h"
TcDistributor::TcDistributor(object_id_t set_object_id) : TcDistributor::TcDistributor(object_id_t objectId) :
SystemObject(set_object_id), tcQueue(NULL) { SystemObject(objectId) {
tcQueue = QueueFactory::instance()->createMessageQueue(DISTRIBUTER_MAX_PACKETS); tcQueue = QueueFactory::instance()->
createMessageQueue(DISTRIBUTER_MAX_PACKETS);
} }
TcDistributor::~TcDistributor() { TcDistributor::~TcDistributor() {
@ -38,14 +39,14 @@ ReturnValue_t TcDistributor::handlePacket() {
} }
void TcDistributor::print() { void TcDistributor::print() {
sif::debug << "Distributor content is: " << std::endl << "ID\t| message queue id" sif::debug << "Distributor content is: " << std::endl
<< std::endl; << "ID\t| Message Queue ID" << std::endl;
for (TcMqMapIter it = this->queueMap.begin(); it != this->queueMap.end(); sif::debug << std::setfill('0') << std::setw(8) << std::hex;
it++) { for (const auto& queueMapIter: queueMap) {
sif::debug << it->first << "\t| 0x" << std::hex << it->second << std::dec sif::debug << queueMapIter.first << "\t| 0x" << queueMapIter.second
<< std::endl; << std::endl;
} }
sif::debug << std::dec; sif::debug << std::setfill(' ') << std::dec;
} }

View File

@ -1,5 +1,5 @@
#ifndef FRAMEWORK_TMTCSERVICES_TCDISTRIBUTOR_H_ #ifndef FSFW_TMTCSERVICES_TCDISTRIBUTOR_H_
#define FRAMEWORK_TMTCSERVICES_TCDISTRIBUTOR_H_ #define FSFW_TMTCSERVICES_TCDISTRIBUTOR_H_
#include "../objectmanager/ObjectManagerIF.h" #include "../objectmanager/ObjectManagerIF.h"
#include "../objectmanager/SystemObject.h" #include "../objectmanager/SystemObject.h"
@ -34,9 +34,10 @@ public:
using TcMessageQueueMap = std::map<uint32_t, MessageQueueId_t>; using TcMessageQueueMap = std::map<uint32_t, MessageQueueId_t>;
using TcMqMapIter = std::map<uint32_t, MessageQueueId_t>::iterator; using TcMqMapIter = std::map<uint32_t, MessageQueueId_t>::iterator;
static const uint8_t INTERFACE_ID = CLASS_ID::PACKET_DISTRIBUTION; static constexpr uint8_t INTERFACE_ID = CLASS_ID::PACKET_DISTRIBUTION;
static const ReturnValue_t PACKET_LOST = MAKE_RETURN_CODE( 1 ); static constexpr ReturnValue_t PACKET_LOST = MAKE_RETURN_CODE( 1 );
static const ReturnValue_t DESTINATION_NOT_FOUND = MAKE_RETURN_CODE( 2 ); static constexpr ReturnValue_t DESTINATION_NOT_FOUND = MAKE_RETURN_CODE( 2 );
static constexpr ReturnValue_t SERVICE_ID_ALREADY_EXISTS = MAKE_RETURN_CODE(3);
/** /**
* Within the default constructor, the SystemObject id is set and the * Within the default constructor, the SystemObject id is set and the
* message queue is initialized. * message queue is initialized.
@ -44,7 +45,7 @@ public:
* @param set_object_id This id is assigned to the distributor * @param set_object_id This id is assigned to the distributor
* implementation. * implementation.
*/ */
TcDistributor( object_id_t set_object_id ); TcDistributor(object_id_t objectId);
/** /**
* The destructor is empty, the message queues are not in the vicinity of * The destructor is empty, the message queues are not in the vicinity of
* this class. * this class.
@ -69,7 +70,7 @@ protected:
* This is the receiving queue for incoming Telecommands. * This is the receiving queue for incoming Telecommands.
* The child classes must make its queue id public. * The child classes must make its queue id public.
*/ */
MessageQueueIF* tcQueue; MessageQueueIF* tcQueue = nullptr;
/** /**
* The last received incoming packet information is stored in this * The last received incoming packet information is stored in this
* member. * member.
@ -94,18 +95,19 @@ protected:
/** /**
* The handlePacket method calls the child class's selectDestination method * The handlePacket method calls the child class's selectDestination method
* and forwards the packet to its destination, if found. * and forwards the packet to its destination, if found.
* @return The message queue return value or \c RETURN_FAILED, in case no * @return The message queue return value or @c RETURN_FAILED, in case no
* destination was found. * destination was found.
*/ */
ReturnValue_t handlePacket(); ReturnValue_t handlePacket();
/** /**
* This method gives the child class a chance to perform some kind of operation * This method gives the child class a chance to perform some kind of
* after the parent tried to forward the message. * operation after the parent tried to forward the message.
* A typically application would be sending success/failure messages. * A typically application would be sending success/failure messages.
* The default implementation just returns \c RETURN_OK. * The default implementation just returns @c RETURN_OK.
* @param queueStatus The status of the message queue after an attempt to send the TC. * @param queueStatus The status of the message queue after an attempt
* @return - \c RETURN_OK on success * to send the TC.
* - \c RETURN_FAILED on failure * @return - @c RETURN_OK on success
* - @c RETURN_FAILED on failure
*/ */
virtual ReturnValue_t callbackAfterSending( ReturnValue_t queueStatus ); virtual ReturnValue_t callbackAfterSending( ReturnValue_t queueStatus );
@ -113,8 +115,8 @@ private:
/** /**
* This constant sets the maximum number of packets distributed per call. * This constant sets the maximum number of packets distributed per call.
*/ */
static const uint8_t DISTRIBUTER_MAX_PACKETS = 128; static constexpr uint8_t DISTRIBUTER_MAX_PACKETS = 128;
}; };
#endif /* TCDISTRIBUTOR_H_ */ #endif /* FSFW_TMTCSERVICES_TCDISTRIBUTOR_H_ */

View File

@ -1,31 +1,33 @@
#include "TcPacketCheck.h"
#include "../globalfunctions/CRC.h" #include "../globalfunctions/CRC.h"
#include "../serviceinterface/ServiceInterfaceStream.h" #include "../serviceinterface/ServiceInterfaceStream.h"
#include "../storagemanager/StorageManagerIF.h" #include "../storagemanager/StorageManagerIF.h"
#include "../tcdistribution/TcPacketCheck.h"
#include "../tmtcservices/VerificationCodes.h" #include "../tmtcservices/VerificationCodes.h"
TcPacketCheck::TcPacketCheck( uint16_t set_apid ) : apid(set_apid) { TcPacketCheck::TcPacketCheck( uint16_t setApid ) : apid(setApid) {
} }
ReturnValue_t TcPacketCheck::checkPacket( TcPacketStored* current_packet ) { ReturnValue_t TcPacketCheck::checkPacket( TcPacketStored* currentPacket ) {
uint16_t calculated_crc = CRC::crc16ccitt( current_packet->getWholeData(), current_packet->getFullSize() ); uint16_t calculated_crc = CRC::crc16ccitt( currentPacket->getWholeData(),
currentPacket->getFullSize() );
if ( calculated_crc != 0 ) { if ( calculated_crc != 0 ) {
return INCORRECT_CHECKSUM; return INCORRECT_CHECKSUM;
} }
bool condition = !(current_packet->hasSecondaryHeader()) || bool condition = (not currentPacket->hasSecondaryHeader()) or
current_packet->getPacketVersionNumber() != CCSDS_VERSION_NUMBER || (currentPacket->getPacketVersionNumber() != CCSDS_VERSION_NUMBER) or
!(current_packet->isTelecommand()); (not currentPacket->isTelecommand());
if ( condition ) { if ( condition ) {
return INCORRECT_PRIMARY_HEADER; return INCORRECT_PRIMARY_HEADER;
} }
if ( current_packet->getAPID() != this->apid ) if ( currentPacket->getAPID() != this->apid )
return ILLEGAL_APID; return ILLEGAL_APID;
if ( !current_packet->isSizeCorrect() ) { if ( not currentPacket->isSizeCorrect() ) {
return INCOMPLETE_PACKET; return INCOMPLETE_PACKET;
} }
condition = (current_packet->getSecondaryHeaderFlag() != CCSDS_SECONDARY_HEADER_FLAG) || condition = (currentPacket->getSecondaryHeaderFlag() != CCSDS_SECONDARY_HEADER_FLAG) ||
(current_packet->getPusVersionNumber() != PUS_VERSION_NUMBER); (currentPacket->getPusVersionNumber() != PUS_VERSION_NUMBER);
if ( condition ) { if ( condition ) {
return INCORRECT_SECONDARY_HEADER; return INCORRECT_SECONDARY_HEADER;
} }

View File

@ -1,28 +1,29 @@
#ifndef TCPACKETCHECK_H_ #ifndef FSFW_TCDISTRIBUTION_TCPACKETCHECK_H_
#define TCPACKETCHECK_H_ #define FSFW_TCDISTRIBUTION_TCPACKETCHECK_H_
#include "../returnvalues/HasReturnvaluesIF.h" #include "../returnvalues/HasReturnvaluesIF.h"
#include "../tmtcpacket/pus/TcPacketStored.h" #include "../tmtcpacket/pus/TcPacketStored.h"
#include "../tmtcservices/PusVerificationReport.h" #include "../tmtcservices/PusVerificationReport.h"
/** /**
* This class performs a formal packet check for incoming PUS Telecommand Packets. * This class performs a formal packet check for incoming PUS Telecommand Packets.
* Currently, it only checks if the APID and CRC are correct. * Currently, it only checks if the APID and CRC are correct.
* \ingroup tc_distribution * @ingroup tc_distribution
*/ */
class TcPacketCheck : public HasReturnvaluesIF { class TcPacketCheck : public HasReturnvaluesIF {
protected: protected:
/** /**
* Describes the version number a packet must have to pass. * Describes the version number a packet must have to pass.
*/ */
static const uint8_t CCSDS_VERSION_NUMBER = 0; static constexpr uint8_t CCSDS_VERSION_NUMBER = 0;
/** /**
* Describes the secondary header a packet must have to pass. * Describes the secondary header a packet must have to pass.
*/ */
static const uint8_t CCSDS_SECONDARY_HEADER_FLAG = 0; static constexpr uint8_t CCSDS_SECONDARY_HEADER_FLAG = 0;
/** /**
* Describes the TC Packet PUS Version Number a packet must have to pass. * Describes the TC Packet PUS Version Number a packet must have to pass.
*/ */
static const uint8_t PUS_VERSION_NUMBER = 1; static constexpr uint8_t PUS_VERSION_NUMBER = 1;
/** /**
* The packet id each correct packet should have. * The packet id each correct packet should have.
* It is composed of the APID and some static fields. * It is composed of the APID and some static fields.
@ -41,19 +42,19 @@ public:
* The constructor only sets the APID attribute. * The constructor only sets the APID attribute.
* @param set_apid The APID to set. * @param set_apid The APID to set.
*/ */
TcPacketCheck( uint16_t set_apid ); TcPacketCheck( uint16_t setApid );
/** /**
* This is the actual method to formally check a certain Telecommand Packet. * This is the actual method to formally check a certain Telecommand Packet.
* The packet's Application Data can not be checked here. * The packet's Application Data can not be checked here.
* @param current_packet The packt to check * @param current_packet The packt to check
* @return - \c RETURN_OK on success. * @return - @c RETURN_OK on success.
* - \c INCORRECT_CHECKSUM if checksum is invalid. * - @c INCORRECT_CHECKSUM if checksum is invalid.
* - \c ILLEGAL_APID if APID does not match. * - @c ILLEGAL_APID if APID does not match.
*/ */
ReturnValue_t checkPacket( TcPacketStored* current_packet ); ReturnValue_t checkPacket( TcPacketStored* currentPacket );
uint16_t getApid() const; uint16_t getApid() const;
}; };
#endif /* TCPACKETCHECK_H_ */ #endif /* FSFW_TCDISTRIBUTION_TCPACKETCHECK_H_ */