2021-04-12 21:53:08 +02:00
|
|
|
#include "TmPacketStoredBase.h"
|
|
|
|
|
2021-06-05 19:52:38 +02:00
|
|
|
#include "../../objectmanager/ObjectManager.h"
|
|
|
|
#include "../../serviceinterface/ServiceInterface.h"
|
2021-04-12 21:53:08 +02:00
|
|
|
#include "../../tmtcservices/TmTcMessage.h"
|
|
|
|
|
|
|
|
#include <cstring>
|
|
|
|
|
|
|
|
StorageManagerIF *TmPacketStoredBase::store = nullptr;
|
|
|
|
InternalErrorReporterIF *TmPacketStoredBase::internalErrorReporter = nullptr;
|
|
|
|
|
|
|
|
TmPacketStoredBase::TmPacketStoredBase(store_address_t setAddress): storeAddress(setAddress) {
|
|
|
|
setStoreAddress(storeAddress);
|
|
|
|
}
|
|
|
|
|
|
|
|
TmPacketStoredBase::TmPacketStoredBase() {
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TmPacketStoredBase::~TmPacketStoredBase() {
|
|
|
|
}
|
|
|
|
|
|
|
|
store_address_t TmPacketStoredBase::getStoreAddress() {
|
|
|
|
return storeAddress;
|
|
|
|
}
|
|
|
|
|
|
|
|
void TmPacketStoredBase::deletePacket() {
|
|
|
|
store->deleteData(storeAddress);
|
|
|
|
storeAddress.raw = StorageManagerIF::INVALID_ADDRESS;
|
|
|
|
setDataPointer(nullptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
void TmPacketStoredBase::setStoreAddress(store_address_t setAddress) {
|
|
|
|
storeAddress = setAddress;
|
|
|
|
const uint8_t* tempData = nullptr;
|
|
|
|
size_t tempSize;
|
|
|
|
if (not checkAndSetStore()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
ReturnValue_t status = store->getData(storeAddress, &tempData, &tempSize);
|
|
|
|
if (status == StorageManagerIF::RETURN_OK) {
|
|
|
|
setDataPointer(tempData);
|
|
|
|
} else {
|
|
|
|
setDataPointer(nullptr);
|
|
|
|
storeAddress.raw = StorageManagerIF::INVALID_ADDRESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TmPacketStoredBase::checkAndSetStore() {
|
|
|
|
if (store == nullptr) {
|
2021-06-05 19:52:38 +02:00
|
|
|
store = ObjectManager::instance()->get<StorageManagerIF>(objects::TM_STORE);
|
2021-04-12 21:53:08 +02:00
|
|
|
if (store == nullptr) {
|
|
|
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
|
|
sif::error << "TmPacketStored::TmPacketStored: TM Store not found!"
|
|
|
|
<< std::endl;
|
|
|
|
#endif
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
ReturnValue_t TmPacketStoredBase::sendPacket(MessageQueueId_t destination,
|
|
|
|
MessageQueueId_t sentFrom, bool doErrorReporting) {
|
|
|
|
if (getAllTmData() == nullptr) {
|
|
|
|
//SHOULDDO: More decent code.
|
|
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
|
|
}
|
|
|
|
TmTcMessage tmMessage(getStoreAddress());
|
|
|
|
ReturnValue_t result = MessageQueueSenderIF::sendMessage(destination,
|
|
|
|
&tmMessage, sentFrom);
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
deletePacket();
|
|
|
|
if (doErrorReporting) {
|
|
|
|
checkAndReportLostTm();
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
//SHOULDDO: In many cases, some counter is incremented for successfully sent packets. The check is often not done, but just incremented.
|
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void TmPacketStoredBase::checkAndReportLostTm() {
|
|
|
|
if (internalErrorReporter == nullptr) {
|
2021-06-05 19:52:38 +02:00
|
|
|
internalErrorReporter = ObjectManager::instance()->get<InternalErrorReporterIF>(
|
2021-04-12 21:53:08 +02:00
|
|
|
objects::INTERNAL_ERROR_REPORTER);
|
|
|
|
}
|
|
|
|
if (internalErrorReporter != nullptr) {
|
|
|
|
internalErrorReporter->lostTm();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|