2020-08-13 20:53:35 +02:00
|
|
|
#include "Service1TelecommandVerification.h"
|
|
|
|
#include "servicepackets/Service1Packets.h"
|
2020-07-10 14:16:55 +02:00
|
|
|
|
2020-08-13 20:53:35 +02:00
|
|
|
#include "../ipc/QueueFactory.h"
|
2021-06-05 19:52:38 +02:00
|
|
|
#include "../objectmanager/ObjectManager.h"
|
2020-08-13 20:53:35 +02:00
|
|
|
#include "../tmtcservices/PusVerificationReport.h"
|
2021-06-14 10:19:01 +02:00
|
|
|
#include "../tmtcpacket/pus/tm/TmPacketStored.h"
|
2020-08-13 20:53:35 +02:00
|
|
|
#include "../serviceinterface/ServiceInterfaceStream.h"
|
|
|
|
#include "../tmtcservices/AcceptsTelemetryIF.h"
|
2020-07-10 14:16:55 +02:00
|
|
|
|
|
|
|
Service1TelecommandVerification::Service1TelecommandVerification(
|
|
|
|
object_id_t objectId, uint16_t apid, uint8_t serviceId,
|
2020-11-09 21:33:09 +01:00
|
|
|
object_id_t targetDestination, uint16_t messageQueueDepth):
|
2020-07-10 14:16:55 +02:00
|
|
|
SystemObject(objectId), apid(apid), serviceId(serviceId),
|
|
|
|
targetDestination(targetDestination) {
|
2020-11-09 21:33:09 +01:00
|
|
|
tmQueue = QueueFactory::instance()->createMessageQueue(messageQueueDepth);
|
2020-07-10 14:16:55 +02:00
|
|
|
}
|
|
|
|
|
2021-04-09 09:14:42 +02:00
|
|
|
Service1TelecommandVerification::~Service1TelecommandVerification() {
|
|
|
|
QueueFactory::instance()->deleteMessageQueue(tmQueue);
|
|
|
|
}
|
2020-07-10 14:16:55 +02:00
|
|
|
|
|
|
|
MessageQueueId_t Service1TelecommandVerification::getVerificationQueue(){
|
|
|
|
return tmQueue->getId();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ReturnValue_t Service1TelecommandVerification::performOperation(
|
|
|
|
uint8_t operationCode){
|
|
|
|
PusVerificationMessage message;
|
|
|
|
ReturnValue_t status = tmQueue->receiveMessage(&message);
|
|
|
|
while(status == HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
status = sendVerificationReport(&message);
|
|
|
|
if(status != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
status = tmQueue->receiveMessage(&message);
|
|
|
|
}
|
|
|
|
if (status == MessageQueueIF::EMPTY) {
|
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ReturnValue_t Service1TelecommandVerification::sendVerificationReport(
|
|
|
|
PusVerificationMessage* message) {
|
|
|
|
ReturnValue_t result;
|
|
|
|
if(message->getReportId() % 2 == 0) {
|
|
|
|
result = generateFailureReport(message);
|
|
|
|
} else {
|
|
|
|
result = generateSuccessReport(message);
|
|
|
|
}
|
|
|
|
if(result != HasReturnvaluesIF::RETURN_OK){
|
2021-01-03 14:16:52 +01:00
|
|
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
2020-11-09 21:33:09 +01:00
|
|
|
sif::error << "Service1TelecommandVerification::sendVerificationReport: "
|
2020-07-10 14:16:55 +02:00
|
|
|
"Sending verification packet failed !" << std::endl;
|
2021-01-03 13:58:18 +01:00
|
|
|
#endif
|
2020-07-10 14:16:55 +02:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
ReturnValue_t Service1TelecommandVerification::generateFailureReport(
|
|
|
|
PusVerificationMessage *message) {
|
|
|
|
FailureReport report(
|
|
|
|
message->getReportId(), message->getTcPacketId(),
|
|
|
|
message->getTcSequenceControl(), message->getStep(),
|
|
|
|
message->getErrorCode(), message->getParameter1(),
|
|
|
|
message->getParameter2());
|
2021-04-13 00:19:09 +02:00
|
|
|
#if FSFW_USE_PUS_C_TELEMETRY == 0
|
2021-04-12 21:53:08 +02:00
|
|
|
TmPacketStoredPusA tmPacket(apid, serviceId, message->getReportId(),
|
2020-07-10 14:16:55 +02:00
|
|
|
packetSubCounter++, &report);
|
2021-04-13 00:19:09 +02:00
|
|
|
#else
|
|
|
|
TmPacketStoredPusC tmPacket(apid, serviceId, message->getReportId(),
|
|
|
|
packetSubCounter++, &report);
|
|
|
|
#endif
|
2020-07-10 14:16:55 +02:00
|
|
|
ReturnValue_t result = tmPacket.sendPacket(tmQueue->getDefaultDestination(),
|
|
|
|
tmQueue->getId());
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
ReturnValue_t Service1TelecommandVerification::generateSuccessReport(
|
|
|
|
PusVerificationMessage *message) {
|
|
|
|
SuccessReport report(message->getReportId(),message->getTcPacketId(),
|
|
|
|
message->getTcSequenceControl(),message->getStep());
|
2021-04-13 00:19:09 +02:00
|
|
|
#if FSFW_USE_PUS_C_TELEMETRY == 0
|
2021-04-12 21:53:08 +02:00
|
|
|
TmPacketStoredPusA tmPacket(apid, serviceId, message->getReportId(),
|
2020-07-10 14:16:55 +02:00
|
|
|
packetSubCounter++, &report);
|
2021-04-13 00:19:09 +02:00
|
|
|
#else
|
|
|
|
TmPacketStoredPusC tmPacket(apid, serviceId, message->getReportId(),
|
|
|
|
packetSubCounter++, &report);
|
|
|
|
#endif
|
2020-07-10 14:16:55 +02:00
|
|
|
ReturnValue_t result = tmPacket.sendPacket(tmQueue->getDefaultDestination(),
|
|
|
|
tmQueue->getId());
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ReturnValue_t Service1TelecommandVerification::initialize() {
|
|
|
|
// Get target object for TC verification messages
|
2021-06-05 19:52:38 +02:00
|
|
|
AcceptsTelemetryIF* funnel = ObjectManager::instance()->
|
2020-07-10 14:16:55 +02:00
|
|
|
get<AcceptsTelemetryIF>(targetDestination);
|
|
|
|
if(funnel == nullptr){
|
2021-01-03 14:16:52 +01:00
|
|
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
2020-07-10 14:16:55 +02:00
|
|
|
sif::error << "Service1TelecommandVerification::initialize: Specified"
|
|
|
|
" TM funnel invalid. Make sure it is set up and implements"
|
|
|
|
" AcceptsTelemetryIF." << std::endl;
|
2021-01-03 13:58:18 +01:00
|
|
|
#endif
|
2020-07-10 14:16:55 +02:00
|
|
|
return ObjectManagerIF::CHILD_INIT_FAILED;
|
|
|
|
}
|
|
|
|
tmQueue->setDefaultDestination(funnel->getReportReceptionQueue());
|
|
|
|
return SystemObject::initialize();
|
|
|
|
}
|