tc distribution equalization
This commit is contained in:
parent
32ebca48b8
commit
315777d265
@ -1,5 +1,6 @@
|
||||
#include "CCSDSDistributor.h"
|
||||
|
||||
#include "../serviceinterface/ServiceInterfaceStream.h"
|
||||
#include "../tcdistribution/CCSDSDistributor.h"
|
||||
#include "../tmtcpacket/SpacePacketBase.h"
|
||||
|
||||
CCSDSDistributor::CCSDSDistributor(uint16_t setDefaultApid,
|
||||
@ -19,7 +20,7 @@ TcDistributor::TcMqMapIter CCSDSDistributor::selectDestination() {
|
||||
&packet, &size );
|
||||
if(result != HasReturnvaluesIF::RETURN_OK) {
|
||||
sif::error << "CCSDSDistributor::selectDestination: Getting data from"
|
||||
"store failed!" << std::endl;
|
||||
" store failed!" << std::endl;
|
||||
}
|
||||
SpacePacketBase currentPacket(packet);
|
||||
|
||||
@ -42,9 +43,9 @@ MessageQueueId_t CCSDSDistributor::getRequestQueue() {
|
||||
ReturnValue_t CCSDSDistributor::registerApplication(
|
||||
AcceptsTelecommandsIF* application) {
|
||||
ReturnValue_t returnValue = RETURN_OK;
|
||||
bool errorCode = true;
|
||||
errorCode = this->queueMap.insert( std::pair<uint32_t, MessageQueueId_t>( application->getIdentifier(), application->getRequestQueue() ) ).second;
|
||||
if( errorCode == false ) {
|
||||
auto insertPair = this->queueMap.emplace(application->getIdentifier(),
|
||||
application->getRequestQueue());
|
||||
if(not insertPair.second) {
|
||||
returnValue = RETURN_FAILED;
|
||||
}
|
||||
return returnValue;
|
||||
@ -53,9 +54,8 @@ ReturnValue_t CCSDSDistributor::registerApplication(
|
||||
ReturnValue_t CCSDSDistributor::registerApplication(uint16_t apid,
|
||||
MessageQueueId_t id) {
|
||||
ReturnValue_t returnValue = RETURN_OK;
|
||||
bool errorCode = true;
|
||||
errorCode = this->queueMap.insert( std::pair<uint32_t, MessageQueueId_t>( apid, id ) ).second;
|
||||
if( errorCode == false ) {
|
||||
auto insertPair = this->queueMap.emplace(apid, id);
|
||||
if(not insertPair.second) {
|
||||
returnValue = RETURN_FAILED;
|
||||
}
|
||||
return returnValue;
|
||||
@ -69,7 +69,11 @@ uint16_t CCSDSDistributor::getIdentifier() {
|
||||
ReturnValue_t CCSDSDistributor::initialize() {
|
||||
ReturnValue_t status = this->TcDistributor::initialize();
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@ public:
|
||||
MessageQueueId_t id) override;
|
||||
ReturnValue_t registerApplication(
|
||||
AcceptsTelecommandsIF* application) override;
|
||||
uint16_t getIdentifier();
|
||||
uint16_t getIdentifier() override;
|
||||
ReturnValue_t initialize() override;
|
||||
|
||||
protected:
|
||||
@ -50,6 +50,12 @@ protected:
|
||||
* @return Iterator to map entry of found APID or iterator to default APID.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
@ -59,11 +65,7 @@ protected:
|
||||
* pure Space Packets and there exists no SpacePacketStored class.
|
||||
*/
|
||||
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_ */
|
||||
|
@ -1,34 +1,38 @@
|
||||
#ifndef CCSDSDISTRIBUTORIF_H_
|
||||
#define CCSDSDISTRIBUTORIF_H_
|
||||
#ifndef FSFW_TCDISTRIBUTION_CCSDSDISTRIBUTORIF_H_
|
||||
#define FSFW_TCDISTRIBUTION_CCSDSDISTRIBUTORIF_H_
|
||||
|
||||
#include "../tmtcservices/AcceptsTelecommandsIF.h"
|
||||
#include "../ipc/MessageQueueSenderIF.h"
|
||||
/**
|
||||
* This is the Interface to a CCSDS Distributor.
|
||||
* On a CCSDS Distributor, Applications (in terms of CCSDS) may register themselves,
|
||||
* either by passing a pointer to themselves (and implementing the CCSDSApplicationIF,
|
||||
* or by explicitly passing an APID and a MessageQueueId to route the TC's to.
|
||||
* \ingroup tc_distribution
|
||||
* On a CCSDS Distributor, Applications (in terms of CCSDS) may register
|
||||
* themselves, either by passing a pointer to themselves (and implementing the
|
||||
* CCSDSApplicationIF), or by explicitly passing an APID and a MessageQueueId
|
||||
* to route the TC's to.
|
||||
* @ingroup tc_distribution
|
||||
*/
|
||||
class CCSDSDistributorIF {
|
||||
public:
|
||||
/**
|
||||
* With this call, a class implementing the CCSDSApplicationIF can register at the
|
||||
* distributor.
|
||||
* With this call, a class implementing the CCSDSApplicationIF can register
|
||||
* at the distributor.
|
||||
* @param application A pointer to the Application to register.
|
||||
* @return - \c RETURN_OK on success,
|
||||
* - \c RETURN_FAILED on failure.
|
||||
* @return - @c RETURN_OK on success,
|
||||
* - @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.
|
||||
* This is done by passing an APID and a MessageQueueId to the method.
|
||||
* @param apid The APID to register.
|
||||
* @param id The MessageQueueId of the message queue to send the TC Packets to.
|
||||
* @return - \c RETURN_OK on success,
|
||||
* - \c RETURN_FAILED on failure.
|
||||
* @param id The MessageQueueId of the message queue to send the
|
||||
* TC Packets to.
|
||||
* @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.
|
||||
*/
|
||||
@ -37,4 +41,4 @@ public:
|
||||
};
|
||||
|
||||
|
||||
#endif /* CCSDSDISTRIBUTORIF_H_ */
|
||||
#endif /* FSFW_TCDISTRIBUTION_CCSDSDISTRIBUTORIF_H_ */
|
||||
|
@ -1,57 +1,66 @@
|
||||
#include "CCSDSDistributorIF.h"
|
||||
#include "PUSDistributor.h"
|
||||
|
||||
#include "../serviceinterface/ServiceInterfaceStream.h"
|
||||
#include "../tcdistribution/CCSDSDistributorIF.h"
|
||||
#include "../tcdistribution/PUSDistributor.h"
|
||||
#include "../tmtcpacket/pus/TcPacketStored.h"
|
||||
#include "../tmtcservices/PusVerificationReport.h"
|
||||
|
||||
PUSDistributor::PUSDistributor(uint16_t setApid, object_id_t setObjectId,
|
||||
object_id_t setPacketSource) :
|
||||
TcDistributor(setObjectId), checker(setApid), verifyChannel(),
|
||||
currentPacket(), tcStatus(RETURN_FAILED),
|
||||
packetSource(setPacketSource) {}
|
||||
tcStatus(RETURN_FAILED), packetSource(setPacketSource) {}
|
||||
|
||||
PUSDistributor::~PUSDistributor() {}
|
||||
|
||||
TcDistributor::TcMqMapIter PUSDistributor::selectDestination() {
|
||||
TcMqMapIter queueMapIt = this->queueMap.end();
|
||||
this->currentPacket.setStoreAddress(this->currentMessage.getStorageId());
|
||||
if (currentPacket.getWholeData() != NULL) {
|
||||
tcStatus = checker.checkPacket(¤tPacket);
|
||||
// sif::debug << "PUSDistributor::handlePacket: packetCheck returned with "
|
||||
// << (int)tcStatus << std::endl;
|
||||
uint32_t queue_id = currentPacket.getService();
|
||||
queueMapIt = this->queueMap.find(queue_id);
|
||||
} else {
|
||||
tcStatus = PACKET_LOST;
|
||||
}
|
||||
if (queueMapIt == this->queueMap.end()) {
|
||||
tcStatus = DESTINATION_NOT_FOUND;
|
||||
}
|
||||
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();
|
||||
this->currentPacket->setStoreAddress(this->currentMessage.getStorageId());
|
||||
if (currentPacket->getWholeData() != NULL) {
|
||||
tcStatus = checker.checkPacket(currentPacket);
|
||||
#ifdef DEBUG
|
||||
if(tcStatus != HasReturnvaluesIF::RETURN_OK) {
|
||||
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);
|
||||
}
|
||||
else {
|
||||
tcStatus = PACKET_LOST;
|
||||
}
|
||||
|
||||
if (tcStatus != RETURN_OK) {
|
||||
sif::debug << "PUSDistributor::handlePacket: Error with " << tcStatus
|
||||
<< ", 0x"<< std::hex << tcStatus << std::dec << std::endl;
|
||||
return this->queueMap.end();
|
||||
} else {
|
||||
return queueMapIt;
|
||||
}
|
||||
if (queueMapIt == this->queueMap.end()) {
|
||||
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) {
|
||||
return this->queueMap.end();
|
||||
}
|
||||
else {
|
||||
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) {
|
||||
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();
|
||||
auto returnPair = queueMap.emplace(serviceId, queue);
|
||||
if (not returnPair.second) {
|
||||
//TODO Return Code
|
||||
sif::error << "PUSDistributor::registerService: Service ID already"
|
||||
" exists in map." << std::endl;
|
||||
return HasReturnvaluesIF::RETURN_FAILED;
|
||||
return SERVICE_ID_ALREADY_EXISTS;
|
||||
}
|
||||
return HasReturnvaluesIF::RETURN_OK;
|
||||
}
|
||||
@ -66,13 +75,14 @@ ReturnValue_t PUSDistributor::callbackAfterSending(ReturnValue_t queueStatus) {
|
||||
}
|
||||
if (tcStatus != RETURN_OK) {
|
||||
this->verifyChannel.sendFailureReport(TC_VERIFY::ACCEPTANCE_FAILURE,
|
||||
¤tPacket, tcStatus);
|
||||
//A failed packet is deleted immediately after reporting, otherwise it will block memory.
|
||||
currentPacket.deletePacket();
|
||||
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_VERIFY::ACCEPTANCE_SUCCESS,
|
||||
¤tPacket);
|
||||
currentPacket);
|
||||
return RETURN_OK;
|
||||
}
|
||||
}
|
||||
@ -84,9 +94,15 @@ uint16_t PUSDistributor::getIdentifier() {
|
||||
ReturnValue_t PUSDistributor::initialize() {
|
||||
CCSDSDistributorIF* ccsdsDistributor =
|
||||
objectManager->get<CCSDSDistributorIF>(packetSource);
|
||||
if (ccsdsDistributor == NULL) {
|
||||
return RETURN_FAILED;
|
||||
} else {
|
||||
if (ccsdsDistributor == nullptr) {
|
||||
sif::error << "PUSDistributor::initialize: Packet source invalid."
|
||||
<< " Make sure it exists and implements CCSDSDistributorIF!"
|
||||
<< std::endl;
|
||||
return RETURN_FAILED;
|
||||
}
|
||||
else {
|
||||
return ccsdsDistributor->registerApplication(this);
|
||||
}
|
||||
|
||||
currentPacket = new TcPacketStored();
|
||||
}
|
||||
|
@ -1,10 +1,11 @@
|
||||
#ifndef FRAMEWORK_TCDISTRIBUTION_PUSDISTRIBUTOR_H_
|
||||
#define FRAMEWORK_TCDISTRIBUTION_PUSDISTRIBUTOR_H_
|
||||
#ifndef FSFW_TCDISTRIBUTION_PUSDISTRIBUTOR_H_
|
||||
#define FSFW_TCDISTRIBUTION_PUSDISTRIBUTOR_H_
|
||||
|
||||
#include "PUSDistributorIF.h"
|
||||
#include "TcDistributor.h"
|
||||
#include "TcPacketCheck.h"
|
||||
|
||||
#include "../returnvalues/HasReturnvaluesIF.h"
|
||||
#include "../tcdistribution/PUSDistributorIF.h"
|
||||
#include "../tcdistribution/TcDistributor.h"
|
||||
#include "../tcdistribution/TcPacketCheck.h"
|
||||
#include "../tmtcservices/AcceptsTelecommandsIF.h"
|
||||
#include "../tmtcservices/VerificationReporter.h"
|
||||
|
||||
@ -50,7 +51,7 @@ protected:
|
||||
/**
|
||||
* The currently handled packet is stored here.
|
||||
*/
|
||||
TcPacketStored currentPacket;
|
||||
TcPacketStored* currentPacket = nullptr;
|
||||
/**
|
||||
* With this variable, the current check status is stored to generate
|
||||
* acceptance messages later.
|
||||
@ -58,6 +59,7 @@ protected:
|
||||
ReturnValue_t tcStatus;
|
||||
|
||||
const object_id_t packetSource;
|
||||
|
||||
/**
|
||||
* This method reads the packet service, checks if such a service is
|
||||
* registered and forwards the packet to the destination.
|
||||
@ -71,7 +73,7 @@ protected:
|
||||
* The callback here handles the generation of acceptance
|
||||
* 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_ */
|
||||
|
@ -1,11 +1,12 @@
|
||||
#ifndef PUSDISTRIBUTORIF_H_
|
||||
#define PUSDISTRIBUTORIF_H_
|
||||
#ifndef FSFW_TCDISTRIBUTION_PUSDISTRIBUTORIF_H_
|
||||
#define FSFW_TCDISTRIBUTION_PUSDISTRIBUTORIF_H_
|
||||
|
||||
#include "../tmtcservices/AcceptsTelecommandsIF.h"
|
||||
#include "../ipc/MessageQueueSenderIF.h"
|
||||
|
||||
/**
|
||||
* This interface allows PUS Services to register themselves at a PUS Distributor.
|
||||
* \ingroup tc_distribution
|
||||
* @ingroup tc_distribution
|
||||
*/
|
||||
class PUSDistributorIF {
|
||||
public:
|
||||
@ -17,10 +18,10 @@ public:
|
||||
/**
|
||||
* With this method, Services can register themselves at the PUS Distributor.
|
||||
* @param service A pointer to the registering Service.
|
||||
* @return - \c RETURN_OK on success,
|
||||
* - \c RETURN_FAILED on failure.
|
||||
* @return - @c RETURN_OK on success,
|
||||
* - @c RETURN_FAILED on failure.
|
||||
*/
|
||||
virtual ReturnValue_t registerService( AcceptsTelecommandsIF* service ) = 0;
|
||||
};
|
||||
|
||||
#endif /* PUSDISTRIBUTORIF_H_ */
|
||||
#endif /* FSFW_TCDISTRIBUTION_PUSDISTRIBUTORIF_H_ */
|
||||
|
@ -1,12 +1,13 @@
|
||||
#include "TcDistributor.h"
|
||||
|
||||
#include "../serviceinterface/ServiceInterfaceStream.h"
|
||||
#include "../serviceinterface/ServiceInterfaceStream.h"
|
||||
#include "../tcdistribution/TcDistributor.h"
|
||||
#include "../tmtcservices/TmTcMessage.h"
|
||||
#include "../ipc/QueueFactory.h"
|
||||
|
||||
TcDistributor::TcDistributor(object_id_t set_object_id) :
|
||||
SystemObject(set_object_id), tcQueue(NULL) {
|
||||
tcQueue = QueueFactory::instance()->createMessageQueue(DISTRIBUTER_MAX_PACKETS);
|
||||
TcDistributor::TcDistributor(object_id_t objectId) :
|
||||
SystemObject(objectId) {
|
||||
tcQueue = QueueFactory::instance()->
|
||||
createMessageQueue(DISTRIBUTER_MAX_PACKETS);
|
||||
}
|
||||
|
||||
TcDistributor::~TcDistributor() {
|
||||
@ -38,14 +39,14 @@ ReturnValue_t TcDistributor::handlePacket() {
|
||||
}
|
||||
|
||||
void TcDistributor::print() {
|
||||
sif::debug << "Distributor content is: " << std::endl << "ID\t| message queue id"
|
||||
<< std::endl;
|
||||
for (TcMqMapIter it = this->queueMap.begin(); it != this->queueMap.end();
|
||||
it++) {
|
||||
sif::debug << it->first << "\t| 0x" << std::hex << it->second << std::dec
|
||||
<< std::endl;
|
||||
sif::debug << "Distributor content is: " << std::endl
|
||||
<< "ID\t| Message Queue ID" << std::endl;
|
||||
sif::debug << std::setfill('0') << std::setw(8) << std::hex;
|
||||
for (const auto& queueMapIter: queueMap) {
|
||||
sif::debug << queueMapIter.first << "\t| 0x" << queueMapIter.second
|
||||
<< std::endl;
|
||||
}
|
||||
sif::debug << std::dec;
|
||||
sif::debug << std::setfill(' ') << std::dec;
|
||||
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef FRAMEWORK_TMTCSERVICES_TCDISTRIBUTOR_H_
|
||||
#define FRAMEWORK_TMTCSERVICES_TCDISTRIBUTOR_H_
|
||||
#ifndef FSFW_TMTCSERVICES_TCDISTRIBUTOR_H_
|
||||
#define FSFW_TMTCSERVICES_TCDISTRIBUTOR_H_
|
||||
|
||||
#include "../objectmanager/ObjectManagerIF.h"
|
||||
#include "../objectmanager/SystemObject.h"
|
||||
@ -34,9 +34,10 @@ public:
|
||||
using TcMessageQueueMap = std::map<uint32_t, MessageQueueId_t>;
|
||||
using TcMqMapIter = std::map<uint32_t, MessageQueueId_t>::iterator;
|
||||
|
||||
static const uint8_t INTERFACE_ID = CLASS_ID::PACKET_DISTRIBUTION;
|
||||
static const ReturnValue_t PACKET_LOST = MAKE_RETURN_CODE( 1 );
|
||||
static const ReturnValue_t DESTINATION_NOT_FOUND = MAKE_RETURN_CODE( 2 );
|
||||
static constexpr uint8_t INTERFACE_ID = CLASS_ID::PACKET_DISTRIBUTION;
|
||||
static constexpr ReturnValue_t PACKET_LOST = MAKE_RETURN_CODE( 1 );
|
||||
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
|
||||
* message queue is initialized.
|
||||
@ -44,7 +45,7 @@ public:
|
||||
* @param set_object_id This id is assigned to the distributor
|
||||
* 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
|
||||
* this class.
|
||||
@ -69,7 +70,7 @@ protected:
|
||||
* This is the receiving queue for incoming Telecommands.
|
||||
* The child classes must make its queue id public.
|
||||
*/
|
||||
MessageQueueIF* tcQueue;
|
||||
MessageQueueIF* tcQueue = nullptr;
|
||||
/**
|
||||
* The last received incoming packet information is stored in this
|
||||
* member.
|
||||
@ -94,18 +95,19 @@ protected:
|
||||
/**
|
||||
* The handlePacket method calls the child class's selectDestination method
|
||||
* 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.
|
||||
*/
|
||||
ReturnValue_t handlePacket();
|
||||
/**
|
||||
* This method gives the child class a chance to perform some kind of operation
|
||||
* after the parent tried to forward the message.
|
||||
* This method gives the child class a chance to perform some kind of
|
||||
* operation after the parent tried to forward the message.
|
||||
* A typically application would be sending success/failure messages.
|
||||
* The default implementation just returns \c RETURN_OK.
|
||||
* @param queueStatus The status of the message queue after an attempt to send the TC.
|
||||
* @return - \c RETURN_OK on success
|
||||
* - \c RETURN_FAILED on failure
|
||||
* The default implementation just returns @c RETURN_OK.
|
||||
* @param queueStatus The status of the message queue after an attempt
|
||||
* to send the TC.
|
||||
* @return - @c RETURN_OK on success
|
||||
* - @c RETURN_FAILED on failure
|
||||
*/
|
||||
virtual ReturnValue_t callbackAfterSending( ReturnValue_t queueStatus );
|
||||
|
||||
@ -113,8 +115,8 @@ private:
|
||||
/**
|
||||
* 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_ */
|
||||
|
@ -1,31 +1,33 @@
|
||||
#include "TcPacketCheck.h"
|
||||
|
||||
#include "../globalfunctions/CRC.h"
|
||||
#include "../serviceinterface/ServiceInterfaceStream.h"
|
||||
#include "../storagemanager/StorageManagerIF.h"
|
||||
#include "../tcdistribution/TcPacketCheck.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 ) {
|
||||
uint16_t calculated_crc = CRC::crc16ccitt( current_packet->getWholeData(), current_packet->getFullSize() );
|
||||
ReturnValue_t TcPacketCheck::checkPacket( TcPacketStored* currentPacket ) {
|
||||
uint16_t calculated_crc = CRC::crc16ccitt( currentPacket->getWholeData(),
|
||||
currentPacket->getFullSize() );
|
||||
if ( calculated_crc != 0 ) {
|
||||
return INCORRECT_CHECKSUM;
|
||||
}
|
||||
bool condition = !(current_packet->hasSecondaryHeader()) ||
|
||||
current_packet->getPacketVersionNumber() != CCSDS_VERSION_NUMBER ||
|
||||
!(current_packet->isTelecommand());
|
||||
bool condition = (not currentPacket->hasSecondaryHeader()) or
|
||||
(currentPacket->getPacketVersionNumber() != CCSDS_VERSION_NUMBER) or
|
||||
(not currentPacket->isTelecommand());
|
||||
if ( condition ) {
|
||||
return INCORRECT_PRIMARY_HEADER;
|
||||
}
|
||||
if ( current_packet->getAPID() != this->apid )
|
||||
if ( currentPacket->getAPID() != this->apid )
|
||||
return ILLEGAL_APID;
|
||||
|
||||
if ( !current_packet->isSizeCorrect() ) {
|
||||
if ( not currentPacket->isSizeCorrect() ) {
|
||||
return INCOMPLETE_PACKET;
|
||||
}
|
||||
condition = (current_packet->getSecondaryHeaderFlag() != CCSDS_SECONDARY_HEADER_FLAG) ||
|
||||
(current_packet->getPusVersionNumber() != PUS_VERSION_NUMBER);
|
||||
condition = (currentPacket->getSecondaryHeaderFlag() != CCSDS_SECONDARY_HEADER_FLAG) ||
|
||||
(currentPacket->getPusVersionNumber() != PUS_VERSION_NUMBER);
|
||||
if ( condition ) {
|
||||
return INCORRECT_SECONDARY_HEADER;
|
||||
}
|
||||
|
@ -1,28 +1,29 @@
|
||||
#ifndef TCPACKETCHECK_H_
|
||||
#define TCPACKETCHECK_H_
|
||||
#ifndef FSFW_TCDISTRIBUTION_TCPACKETCHECK_H_
|
||||
#define FSFW_TCDISTRIBUTION_TCPACKETCHECK_H_
|
||||
|
||||
#include "../returnvalues/HasReturnvaluesIF.h"
|
||||
#include "../tmtcpacket/pus/TcPacketStored.h"
|
||||
#include "../tmtcservices/PusVerificationReport.h"
|
||||
|
||||
/**
|
||||
* This class performs a formal packet check for incoming PUS Telecommand Packets.
|
||||
* Currently, it only checks if the APID and CRC are correct.
|
||||
* \ingroup tc_distribution
|
||||
* @ingroup tc_distribution
|
||||
*/
|
||||
class TcPacketCheck : public HasReturnvaluesIF {
|
||||
protected:
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
static const uint8_t PUS_VERSION_NUMBER = 1;
|
||||
static constexpr uint8_t PUS_VERSION_NUMBER = 1;
|
||||
/**
|
||||
* The packet id each correct packet should have.
|
||||
* It is composed of the APID and some static fields.
|
||||
@ -41,19 +42,19 @@ public:
|
||||
* The constructor only sets the APID attribute.
|
||||
* @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.
|
||||
* The packet's Application Data can not be checked here.
|
||||
* @param current_packet The packt to check
|
||||
* @return - \c RETURN_OK on success.
|
||||
* - \c INCORRECT_CHECKSUM if checksum is invalid.
|
||||
* - \c ILLEGAL_APID if APID does not match.
|
||||
* @return - @c RETURN_OK on success.
|
||||
* - @c INCORRECT_CHECKSUM if checksum is invalid.
|
||||
* - @c ILLEGAL_APID if APID does not match.
|
||||
*/
|
||||
ReturnValue_t checkPacket( TcPacketStored* current_packet );
|
||||
ReturnValue_t checkPacket( TcPacketStored* currentPacket );
|
||||
|
||||
uint16_t getApid() const;
|
||||
};
|
||||
|
||||
|
||||
#endif /* TCPACKETCHECK_H_ */
|
||||
#endif /* FSFW_TCDISTRIBUTION_TCPACKETCHECK_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user