tc distribution equalization
This commit is contained in:
parent
32ebca48b8
commit
315777d265
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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_ */
|
||||||
|
@ -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_ */
|
||||||
|
@ -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(¤tPacket);
|
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,
|
||||||
¤tPacket, 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,
|
||||||
¤tPacket);
|
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();
|
||||||
}
|
}
|
||||||
|
@ -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_ */
|
||||||
|
@ -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_ */
|
||||||
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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_ */
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user