fsfw/src/fsfw/tmtcpacket/pus/tm/TmPacketStoredPusC.cpp

82 lines
3.0 KiB
C++
Raw Normal View History

2021-07-13 21:02:53 +02:00
#include "fsfw/tmtcpacket/pus/tm/TmPacketStoredPusC.h"
2021-04-12 23:55:33 +02:00
2021-07-13 21:02:53 +02:00
#include "fsfw/serviceinterface/ServiceInterface.h"
#include "fsfw/tmtcservices/TmTcMessage.h"
2021-04-13 00:19:09 +02:00
#include <cstring>
TmPacketStoredPusC::TmPacketStoredPusC(store_address_t setAddress) :
TmPacketStoredBase(setAddress), TmPacketPusC(nullptr){
}
TmPacketStoredPusC::TmPacketStoredPusC(uint16_t apid, uint8_t service,
uint8_t subservice, uint16_t packetSubcounter, const uint8_t *data,
uint32_t size, const uint8_t *headerData, uint32_t headerSize, uint16_t destinationId,
uint8_t timeRefField) :
TmPacketPusC(nullptr) {
storeAddress.raw = StorageManagerIF::INVALID_ADDRESS;
if (not TmPacketStoredBase::checkAndSetStore()) {
return;
}
uint8_t *pData = nullptr;
size_t sizeToReserve = getPacketMinimumSize() + size + headerSize;
2021-04-13 00:19:09 +02:00
ReturnValue_t returnValue = store->getFreeElement(&storeAddress,
sizeToReserve, &pData);
2021-04-13 00:19:09 +02:00
if (returnValue != store->RETURN_OK) {
handleStoreFailure("C", returnValue, sizeToReserve);
2021-04-13 00:19:09 +02:00
return;
}
setData(pData);
initializeTmPacket(apid, service, subservice, packetSubcounter, destinationId, timeRefField);
memcpy(getSourceData(), headerData, headerSize);
memcpy(getSourceData() + headerSize, data, size);
2021-10-05 01:23:56 +02:00
setPacketDataLength(size + headerSize + sizeof(PUSTmDataFieldHeaderPusC) + CRC_SIZE - 1);
2021-04-13 00:19:09 +02:00
}
TmPacketStoredPusC::TmPacketStoredPusC(uint16_t apid, uint8_t service,
uint8_t subservice, uint16_t packetSubcounter, SerializeIF *content,
SerializeIF *header, uint16_t destinationId, uint8_t timeRefField) :
TmPacketPusC(nullptr) {
storeAddress.raw = StorageManagerIF::INVALID_ADDRESS;
if (not TmPacketStoredBase::checkAndSetStore()) {
return;
}
size_t sourceDataSize = 0;
if (content != nullptr) {
2021-04-13 00:19:09 +02:00
sourceDataSize += content->getSerializedSize();
}
if (header != nullptr) {
2021-04-13 00:19:09 +02:00
sourceDataSize += header->getSerializedSize();
}
uint8_t *pData = nullptr;
size_t sizeToReserve = getPacketMinimumSize() + sourceDataSize;
ReturnValue_t returnValue = store->getFreeElement(&storeAddress, sizeToReserve, &pData);
2021-04-13 00:19:09 +02:00
if (returnValue != store->RETURN_OK) {
handleStoreFailure("C", returnValue, sizeToReserve);
return;
2021-04-13 00:19:09 +02:00
}
setData(pData);
2021-04-13 01:24:26 +02:00
initializeTmPacket(apid, service, subservice, packetSubcounter, destinationId, timeRefField);
2021-04-13 00:19:09 +02:00
uint8_t *putDataHere = getSourceData();
size_t size = 0;
if (header != nullptr) {
2021-04-13 00:19:09 +02:00
header->serialize(&putDataHere, &size, sourceDataSize,
SerializeIF::Endianness::BIG);
}
if (content != nullptr) {
2021-04-13 00:19:09 +02:00
content->serialize(&putDataHere, &size, sourceDataSize,
SerializeIF::Endianness::BIG);
}
setPacketDataLength(
sourceDataSize + sizeof(PUSTmDataFieldHeaderPusC) + CRC_SIZE - 1);
}
uint8_t* TmPacketStoredPusC::getAllTmData() {
return getWholeData();
}
void TmPacketStoredPusC::setDataPointer(const uint8_t *newPointer) {
setData(newPointer);
}