TMTC Stack Refactoring #106
@ -136,8 +136,8 @@ set(FSFW_DUMMY_TGT fsfw-dummy)
|
|||||||
add_library(
|
add_library(
|
||||||
${LIB_FSFW_NAME}
|
${LIB_FSFW_NAME}
|
||||||
src/fsfw/tmtcpacket/SpacePacketIF.h
|
src/fsfw/tmtcpacket/SpacePacketIF.h
|
||||||
src/fsfw/tmtcpacket/pus/tc/TcPacketDeserializer.h
|
src/fsfw/tmtcpacket/pus/tc/PusTcCreator.h
|
||||||
src/fsfw/tmtcpacket/pus/tc/TcPacketDeserializer.cpp
|
src/fsfw/tmtcpacket/pus/tc/PusTcCreator.cpp
|
||||||
src/fsfw/tmtcpacket/pus/tc/PusTcIF.h
|
src/fsfw/tmtcpacket/pus/tc/PusTcIF.h
|
||||||
src/fsfw/tmtcpacket/SpacePacketCreator.h
|
src/fsfw/tmtcpacket/SpacePacketCreator.h
|
||||||
src/fsfw/tmtcpacket/SpacePacketCreator.cpp)
|
src/fsfw/tmtcpacket/SpacePacketCreator.cpp)
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
#ifndef FSFW_INC_FSFW_SERIALIZE_H_
|
#ifndef FSFW_SERIALIZE_H_
|
||||||
#define FSFW_INC_FSFW_SERIALIZE_H_
|
#define FSFW_SERIALIZE_H_
|
||||||
|
|
||||||
#include "src/core/serialize/EndianConverter.h"
|
#include "serialize/EndianConverter.h"
|
||||||
#include "src/core/serialize/SerialArrayListAdapter.h"
|
#include "serialize/SerialArrayListAdapter.h"
|
||||||
#include "src/core/serialize/SerialBufferAdapter.h"
|
#include "serialize/SerialBufferAdapter.h"
|
||||||
#include "src/core/serialize/SerialLinkedListAdapter.h"
|
#include "serialize/SerialLinkedListAdapter.h"
|
||||||
#include "src/core/serialize/SerializeElement.h"
|
#include "serialize/SerializeElement.h"
|
||||||
|
|
||||||
#endif /* FSFW_INC_FSFW_SERIALIZE_H_ */
|
#endif /* FSFW_SERIALIZE_H_ */
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include "fsfw/globalfunctions/CRC.h"
|
#include "fsfw/globalfunctions/CRC.h"
|
||||||
#include "fsfw/serviceinterface/ServiceInterface.h"
|
#include "fsfw/serviceinterface/ServiceInterface.h"
|
||||||
#include "fsfw/storagemanager/StorageManagerIF.h"
|
#include "fsfw/storagemanager/StorageManagerIF.h"
|
||||||
#include "fsfw/tmtcpacket/pus/tc/TcPacketPusBase.h"
|
#include "fsfw/tmtcpacket/pus/tc/PusTcReader.h"
|
||||||
#include "fsfw/tmtcpacket/pus/tc/TcPacketStoredBase.h"
|
#include "fsfw/tmtcpacket/pus/tc/TcPacketStoredBase.h"
|
||||||
#include "fsfw/tmtcpacket/pus/tc/TcPacketStoredPus.h"
|
#include "fsfw/tmtcpacket/pus/tc/TcPacketStoredPus.h"
|
||||||
#include "fsfw/tmtcservices/VerificationCodes.h"
|
#include "fsfw/tmtcservices/VerificationCodes.h"
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
|
#include "ccsds_header.h"
|
||||||
|
|
||||||
namespace ccsds {
|
namespace ccsds {
|
||||||
|
|
||||||
enum PacketType : uint8_t { TM = 0, TC = 1 };
|
enum PacketType : uint8_t { TM = 0, TC = 1 };
|
||||||
@ -35,6 +37,15 @@ constexpr uint16_t getTmSpacePacketIdFromApid(uint16_t apid, bool secondaryHeade
|
|||||||
|
|
||||||
class SpacePacketIF {
|
class SpacePacketIF {
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* This definition defines the CRC size in byte.
|
||||||
|
*/
|
||||||
|
static const uint8_t CRC_SIZE = 2;
|
||||||
|
/**
|
||||||
|
* This is the minimum size of a SpacePacket.
|
||||||
|
*/
|
||||||
|
static const uint16_t MINIMUM_SIZE = sizeof(CCSDSPrimaryHeader) + CRC_SIZE;
|
||||||
|
|
||||||
virtual ~SpacePacketIF() = default;
|
virtual ~SpacePacketIF() = default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -10,58 +10,10 @@ SpacePacketReader::SpacePacketReader(const uint8_t* setAddress) {
|
|||||||
|
|
||||||
SpacePacketReader::~SpacePacketReader() = default;
|
SpacePacketReader::~SpacePacketReader() = default;
|
||||||
|
|
||||||
ReturnValue_t SpacePacketReader::initSpacePacketHeader(bool isTelecommand, bool hasSecondaryHeader,
|
|
||||||
uint16_t apid, uint16_t sequenceCount) {
|
|
||||||
if (data == nullptr) {
|
|
||||||
#if FSFW_VERBOSE_LEVEL >= 1
|
|
||||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
||||||
sif::warning << "SpacePacketBase::initSpacePacketHeader: Data pointer is invalid" << std::endl;
|
|
||||||
#else
|
|
||||||
sif::printWarning("SpacePacketBase::initSpacePacketHeader: Data pointer is invalid!\n");
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
return HasReturnvaluesIF::RETURN_FAILED;
|
|
||||||
}
|
|
||||||
// reset header to zero:
|
|
||||||
memset(data, 0, sizeof(this->data->header));
|
|
||||||
// Set TC/TM bit.
|
|
||||||
data->header.packetIdHAndVersion = ((isTelecommand ? 1 : 0)) << 4;
|
|
||||||
// Set secondaryHeader bit
|
|
||||||
data->header.packetIdHAndVersion |= ((hasSecondaryHeader ? 1 : 0)) << 3;
|
|
||||||
this->setApid(apid);
|
|
||||||
// Always initialize as standalone packets.
|
|
||||||
data->header.packetSeqCtrlH = 0b11000000;
|
|
||||||
setPacketSequenceCount(sequenceCount);
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline uint16_t SpacePacketReader::getPacketId() const {
|
inline uint16_t SpacePacketReader::getPacketId() const {
|
||||||
return ((this->data->header.packetIdHAndVersion) << 8) + this->data->header.packetIdL;
|
return ((this->data->header.packetIdHAndVersion) << 8) + this->data->header.packetIdL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpacePacketReader::setApid(uint16_t setAPID) {
|
|
||||||
// Use first three bits of new APID, but keep rest of packet id as it was (see specification).
|
|
||||||
this->data->header.packetIdHAndVersion =
|
|
||||||
(this->data->header.packetIdHAndVersion & 0b11111000) | ((setAPID & 0x0700) >> 8);
|
|
||||||
this->data->header.packetIdL = (setAPID & 0x00FF);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpacePacketReader::setSequenceFlags(uint8_t sequenceflags) {
|
|
||||||
this->data->header.packetSeqCtrlH &= 0x3F;
|
|
||||||
this->data->header.packetSeqCtrlH |= sequenceflags << 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpacePacketReader::setPacketSequenceCount(uint16_t new_count) {
|
|
||||||
this->data->header.packetSeqCtrlH = (this->data->header.packetSeqCtrlH & 0b11000000) |
|
|
||||||
(((new_count % ccsds::LIMIT_SEQUENCE_COUNT) & 0x3F00) >> 8);
|
|
||||||
this->data->header.packetSeqCtrlL = ((new_count % ccsds::LIMIT_SEQUENCE_COUNT) & 0x00FF);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpacePacketReader::setPacketDataLength(uint16_t new_length) {
|
|
||||||
this->data->header.packetLenH = ((new_length & 0xFF00) >> 8);
|
|
||||||
this->data->header.packetLenL = (new_length & 0x00FF);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t SpacePacketReader::getFullSize() {
|
size_t SpacePacketReader::getFullSize() {
|
||||||
// +1 is done because size in packet data length field is: size of data field -1
|
// +1 is done because size in packet data length field is: size of data field -1
|
||||||
return this->getPacketDataLen() + sizeof(this->data->header) + 1;
|
return this->getPacketDataLen() + sizeof(this->data->header) + 1;
|
||||||
|
@ -19,16 +19,6 @@
|
|||||||
* standards.
|
* standards.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* This struct defines the data structure of a Space Packet when accessed
|
|
||||||
* via a pointer.
|
|
||||||
* @ingroup tmtcpackets
|
|
||||||
*/
|
|
||||||
struct SpacePacketPointer {
|
|
||||||
CCSDSPrimaryHeader header;
|
|
||||||
uint8_t packet_data;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is the basic data handler for any CCSDS Space Packet
|
* This class is the basic data handler for any CCSDS Space Packet
|
||||||
* compatible Telecommand and Telemetry packet.
|
* compatible Telecommand and Telemetry packet.
|
||||||
@ -50,16 +40,6 @@ class SpacePacketReader : public SpacePacketIF, public RedirectableDataPointerIF
|
|||||||
SpacePacketPointer* data;
|
SpacePacketPointer* data;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
|
||||||
* This definition defines the CRC size in byte.
|
|
||||||
*/
|
|
||||||
static const uint8_t CRC_SIZE = 2;
|
|
||||||
/**
|
|
||||||
* This is the minimum size of a SpacePacket.
|
|
||||||
*/
|
|
||||||
static const uint16_t MINIMUM_SIZE = sizeof(CCSDSPrimaryHeader) + CRC_SIZE;
|
|
||||||
SpacePacketReader(uint16_t apid, ccsds::PacketType packetType, bool secHeader, uint16_t seqCount,
|
|
||||||
uint16_t dataLen);
|
|
||||||
/**
|
/**
|
||||||
* This is the default constructor.
|
* This is the default constructor.
|
||||||
* It sets its internal data pointer to the address passed.
|
* It sets its internal data pointer to the address passed.
|
||||||
@ -71,45 +51,10 @@ class SpacePacketReader : public SpacePacketIF, public RedirectableDataPointerIF
|
|||||||
*/
|
*/
|
||||||
~SpacePacketReader() override;
|
~SpacePacketReader() override;
|
||||||
|
|
||||||
ReturnValue_t initSpacePacketHeader(bool isTelecommand, bool hasSecondaryHeader, uint16_t apid,
|
|
||||||
uint16_t sequenceCount = 0);
|
|
||||||
|
|
||||||
[[nodiscard]] uint16_t getPacketId() const override;
|
[[nodiscard]] uint16_t getPacketId() const override;
|
||||||
[[nodiscard]] uint16_t getPacketSeqCtrl() const override;
|
[[nodiscard]] uint16_t getPacketSeqCtrl() const override;
|
||||||
[[nodiscard]] uint16_t getPacketDataLen() const override;
|
[[nodiscard]] uint16_t getPacketDataLen() const override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the APID of a packet, which are the lowest 11 bit of the packet
|
|
||||||
* id.
|
|
||||||
* @param The APID to set. The highest five bits of the parameter are
|
|
||||||
* ignored.
|
|
||||||
*/
|
|
||||||
void setApid(uint16_t setAPID);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the sequence flags of a packet, which are bit 17 and 18 in the space packet header.
|
|
||||||
* @param The sequence flags to set
|
|
||||||
*/
|
|
||||||
void setSequenceFlags(uint8_t sequenceflags);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the packet sequence count, which are the lowest 14 bit of the
|
|
||||||
* packet sequence control field.
|
|
||||||
* setCount is modulo-divided by \c LIMIT_SEQUENCE_COUNT to avoid overflows.
|
|
||||||
* @param setCount The value to set the count to.
|
|
||||||
*/
|
|
||||||
void setPacketSequenceCount(uint16_t setCount);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the packet data length, which is the fifth and sixth byte of the
|
|
||||||
* CCSDS Primary Header.
|
|
||||||
* @param setLength The value of the length to set. It must fit the true
|
|
||||||
* CCSDS packet data length . The packet data length is
|
|
||||||
* the size of every kind of data \b after the CCSDS
|
|
||||||
* Primary Header \b -1.
|
|
||||||
*/
|
|
||||||
void setPacketDataLength(uint16_t setLength);
|
|
||||||
|
|
||||||
// Helper methods:
|
// Helper methods:
|
||||||
/**
|
/**
|
||||||
* This method returns a raw uint8_t pointer to the packet.
|
* This method returns a raw uint8_t pointer to the packet.
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
target_sources(
|
target_sources(
|
||||||
${LIB_FSFW_NAME} PRIVATE TcPacketPusBase.cpp TcPacketPus.cpp
|
${LIB_FSFW_NAME}
|
||||||
TcPacketStoredBase.cpp TcPacketStoredPus.cpp)
|
PRIVATE PusTcReader.cpp TcPacketPus.cpp PusTcReader.cpp PusTcCreator.cpp
|
||||||
|
TcPacketStoredBase.cpp TcPacketStoredPus.cpp)
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
#include "TcPacketDeserializer.h"
|
#include "PusTcCreator.h"
|
||||||
|
|
||||||
TcPacketDeserializer::TcPacketDeserializer(const uint8_t *data, size_t maxSize) {}
|
TcPacketDeserializer::TcPacketDeserializer(const uint8_t *data, size_t maxSize) {}
|
@ -4,9 +4,9 @@
|
|||||||
#include "fsfw/tmtcpacket/RedirectableDataPointerIF.h"
|
#include "fsfw/tmtcpacket/RedirectableDataPointerIF.h"
|
||||||
#include "fsfw/tmtcpacket/SpacePacketIF.h"
|
#include "fsfw/tmtcpacket/SpacePacketIF.h"
|
||||||
|
|
||||||
class TcPacketDeserializer : public SpacePacketIF, public RedirectableDataPointerIF {
|
class PusTcCreator : public SpacePacketIF {
|
||||||
public:
|
public:
|
||||||
TcPacketDeserializer(const uint8_t* data, size_t maxSize);
|
PusTcCreator(const uint8_t* data, size_t maxSize);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
};
|
};
|
@ -3,17 +3,50 @@
|
|||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
class PusTcIF {
|
#include "TcPacketPus.h"
|
||||||
public:
|
|
||||||
virtual ~PusTcIF() = default;
|
namespace ecss {
|
||||||
|
|
||||||
|
enum AckField {
|
||||||
|
//! No acknowledgements are expected.
|
||||||
|
ACK_NONE = 0b0000,
|
||||||
|
//! Acknowledgements on acceptance are expected.
|
||||||
|
ACK_ACCEPTANCE = 0b0001,
|
||||||
|
//! Acknowledgements on start are expected.
|
||||||
|
ACK_START = 0b0010,
|
||||||
|
//! Acknowledgements on step are expected.
|
||||||
|
ACK_STEP = 0b0100,
|
||||||
|
//! Acknowledgement on completion are expected.
|
||||||
|
ACK_COMPLETION = 0b1000
|
||||||
|
};
|
||||||
|
|
||||||
|
static constexpr uint8_t ACK_ALL = ACK_ACCEPTANCE | ACK_START | ACK_STEP | ACK_COMPLETION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This struct defines a byte-wise structured PUS C ata Field Header.
|
||||||
|
* Any optional fields in the header must be added or removed here.
|
||||||
|
* Currently, the Source Id field is present with one byte.
|
||||||
|
* No spare byte support for now.
|
||||||
|
* @ingroup tmtcpackets
|
||||||
|
*/
|
||||||
|
struct PusTcDataFieldHeader {
|
||||||
|
// Version and ACK byte, Service Byte, Subservice Byte, 2 byte Source ID
|
||||||
|
static constexpr size_t MIN_LEN = 5;
|
||||||
|
uint8_t pusVersion;
|
||||||
|
uint8_t ackFlags;
|
||||||
|
uint8_t serviceType;
|
||||||
|
uint8_t serviceSubtype;
|
||||||
|
uint16_t sourceId;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace ecss
|
||||||
|
|
||||||
|
class PusTcIF : public SpacePacketIF {
|
||||||
|
public:
|
||||||
|
~PusTcIF() override = default;
|
||||||
|
static const uint16_t MIN_LEN =
|
||||||
|
(sizeof(CCSDSPrimaryHeader) + ecss::PusTcDataFieldHeader::MIN_LEN + 2);
|
||||||
|
|
||||||
/**
|
|
||||||
* This command returns the CCSDS Secondary Header Flag.
|
|
||||||
* It shall always be zero for PUS Packets. This is the
|
|
||||||
* highest bit of the first byte of the Data Field Header.
|
|
||||||
* @return the CCSDS Secondary Header Flag
|
|
||||||
*/
|
|
||||||
[[nodiscard]] virtual uint8_t getSecondaryHeaderFlag() const = 0;
|
|
||||||
/**
|
/**
|
||||||
* This command returns the TC Packet PUS Version Number.
|
* This command returns the TC Packet PUS Version Number.
|
||||||
* The version number of ECSS PUS 2003 is 1.
|
* The version number of ECSS PUS 2003 is 1.
|
||||||
|
47
src/fsfw/tmtcpacket/pus/tc/PusTcReader.cpp
Normal file
47
src/fsfw/tmtcpacket/pus/tc/PusTcReader.cpp
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#include "PusTcReader.h"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
#include "fsfw/globalfunctions/CRC.h"
|
||||||
|
#include "fsfw/globalfunctions/arrayprinter.h"
|
||||||
|
#include "fsfw/serialize.h"
|
||||||
|
#include "fsfw/serviceinterface/ServiceInterface.h"
|
||||||
|
|
||||||
|
PusTcReader::PusTcReader(const uint8_t* setData, size_t size) : spReader(setData), maxSize(size) {
|
||||||
|
pointers.spHeaderStart = setData;
|
||||||
|
}
|
||||||
|
|
||||||
|
PusTcReader::~PusTcReader() = default;
|
||||||
|
|
||||||
|
ReturnValue_t PusTcReader::parseData() {
|
||||||
|
if (maxSize < sizeof(CCSDSPrimaryHeader)) {
|
||||||
|
return SerializeIF::BUFFER_TOO_SHORT;
|
||||||
|
}
|
||||||
|
pointers.secHeaderStart = pointers.spHeaderStart + sizeof(CCSDSPrimaryHeader);
|
||||||
|
// TODO: No support for spare bytes yet
|
||||||
|
pointers.userDataStart = pointers.secHeaderStart + ecss::PusTcDataFieldHeader::MIN_LEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t PusTcReader::getAcknowledgeFlags() const { return 0; }
|
||||||
|
uint8_t PusTcReader::getService() const { return 0; }
|
||||||
|
uint8_t PusTcReader::getSubService() const { return 0; }
|
||||||
|
uint16_t PusTcReader::getSourceId() const { return 0; }
|
||||||
|
const uint8_t* PusTcReader::getApplicationData() const { return nullptr; }
|
||||||
|
uint16_t PusTcReader::getApplicationDataSize() const { return 0; }
|
||||||
|
uint16_t PusTcReader::getErrorControl() const { return 0; }
|
||||||
|
|
||||||
|
uint16_t PusTcReader::getPacketId() const { return spReader.getPacketId(); }
|
||||||
|
uint16_t PusTcReader::getPacketSeqCtrl() const { return spReader.getPacketSeqCtrl(); }
|
||||||
|
uint16_t PusTcReader::getPacketDataLen() const { return spReader.getPacketDataLen(); }
|
||||||
|
uint8_t PusTcReader::getPusVersion() const { return spReader.getVersion(); }
|
||||||
|
|
||||||
|
/*
|
||||||
|
void PusTcReader::print() {
|
||||||
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||||
|
sif::info << "TcPacketBase::print:" << std::endl;
|
||||||
|
#else
|
||||||
|
sif::printInfo("TcPacketBase::print:\n");
|
||||||
|
#endif
|
||||||
|
arrayprinter::print(getWholeData(), getFullSize());
|
||||||
|
}
|
||||||
|
*/
|
82
src/fsfw/tmtcpacket/pus/tc/PusTcReader.h
Normal file
82
src/fsfw/tmtcpacket/pus/tc/PusTcReader.h
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#ifndef TMTCPACKET_PUS_TCPACKETBASE_H_
|
||||||
|
#define TMTCPACKET_PUS_TCPACKETBASE_H_
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
#include "PusTcIF.h"
|
||||||
|
#include "fsfw/tmtcpacket/RedirectableDataPointerIF.h"
|
||||||
|
#include "fsfw/tmtcpacket/SpacePacketReader.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is the basic data handler for any ECSS PUS Telecommand packet.
|
||||||
|
*
|
||||||
|
* In addition to #SpacePacketBase, the class provides methods to handle
|
||||||
|
* the standardized entries of the PUS TC Packet Data Field Header.
|
||||||
|
* It does not contain the packet data itself but a pointer to the
|
||||||
|
* data must be set on instantiation. An invalid pointer may cause
|
||||||
|
* damage, as no getter method checks data validity. Anyway, a NULL
|
||||||
|
* check can be performed by making use of the getWholeData method.
|
||||||
|
* @ingroup tmtcpackets
|
||||||
|
*/
|
||||||
|
class PusTcReader : public PusTcIF, public RedirectableDataPointerIF {
|
||||||
|
friend class TcPacketStoredBase;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* This is the default constructor.
|
||||||
|
* It sets its internal data pointer to the address passed and also
|
||||||
|
* forwards the data pointer to the parent SpacePacketBase class.
|
||||||
|
* @param setData The position where the packet data lies.
|
||||||
|
*/
|
||||||
|
explicit PusTcReader(const uint8_t* setData, size_t size);
|
||||||
|
|
||||||
|
ReturnValue_t parseData();
|
||||||
|
/**
|
||||||
|
* This is the empty default destructor.
|
||||||
|
*/
|
||||||
|
~PusTcReader() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a debugging helper method that prints the whole packet content
|
||||||
|
* to the screen.
|
||||||
|
*/
|
||||||
|
void print();
|
||||||
|
[[nodiscard]] uint16_t getPacketId() const override;
|
||||||
|
[[nodiscard]] uint16_t getPacketSeqCtrl() const override;
|
||||||
|
[[nodiscard]] uint16_t getPacketDataLen() const override;
|
||||||
|
[[nodiscard]] uint8_t getPusVersion() const override;
|
||||||
|
[[nodiscard]] uint8_t getAcknowledgeFlags() const override;
|
||||||
|
[[nodiscard]] uint8_t getService() const override;
|
||||||
|
[[nodiscard]] uint8_t getSubService() const override;
|
||||||
|
[[nodiscard]] uint16_t getSourceId() const override;
|
||||||
|
[[nodiscard]] const uint8_t* getApplicationData() const override;
|
||||||
|
[[nodiscard]] uint16_t getApplicationDataSize() const override;
|
||||||
|
[[nodiscard]] uint16_t getErrorControl() const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* With this method, the packet data pointer can be redirected to another
|
||||||
|
* location.
|
||||||
|
* This call overwrites the parent's setData method to set both its
|
||||||
|
* @c tc_data pointer and the parent's @c data pointer.
|
||||||
|
*
|
||||||
|
* @param p_data A pointer to another PUS Telecommand Packet.
|
||||||
|
*/
|
||||||
|
ReturnValue_t setData(uint8_t* pData, size_t maxSize, void* args) override = 0;
|
||||||
|
SpacePacketReader spReader;
|
||||||
|
/**
|
||||||
|
* This struct defines the data structure of a Space Packet when accessed
|
||||||
|
* via a pointer.
|
||||||
|
* @ingroup tmtcpackets
|
||||||
|
*/
|
||||||
|
struct PusTcPointers {
|
||||||
|
const uint8_t* spHeaderStart;
|
||||||
|
const uint8_t* secHeaderStart;
|
||||||
|
const uint8_t* userDataStart;
|
||||||
|
};
|
||||||
|
|
||||||
|
PusTcPointers pointers{};
|
||||||
|
size_t maxSize = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* TMTCPACKET_PUS_TCPACKETBASE_H_ */
|
@ -4,44 +4,25 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include "../definitions.h"
|
#include "../definitions.h"
|
||||||
#include "TcPacketPusBase.h"
|
#include "PusTcReader.h"
|
||||||
#include "fsfw/FSFW.h"
|
#include "fsfw/FSFW.h"
|
||||||
#include "fsfw/tmtcpacket/ccsds_header.h"
|
#include "fsfw/tmtcpacket/ccsds_header.h"
|
||||||
|
|
||||||
/**
|
|
||||||
* This struct defines a byte-wise structured PUS TC A Data Field Header.
|
|
||||||
* Any optional fields in the header must be added or removed here.
|
|
||||||
* Currently, the Source Id field is present with one byte.
|
|
||||||
* @ingroup tmtcpackets
|
|
||||||
*/
|
|
||||||
struct PUSTcDataFieldHeader {
|
|
||||||
uint8_t versionTypeAck;
|
|
||||||
uint8_t serviceType;
|
|
||||||
uint8_t serviceSubtype;
|
|
||||||
#if FSFW_USE_PUS_C_TELECOMMANDS == 1
|
|
||||||
uint8_t sourceIdH;
|
|
||||||
uint8_t sourceIdL;
|
|
||||||
#else
|
|
||||||
uint8_t sourceId;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This struct defines the data structure of a PUS Telecommand A packet when
|
* This struct defines the data structure of a PUS Telecommand A packet when
|
||||||
* accessed via a pointer.
|
* accessed via a pointer.
|
||||||
* @ingroup tmtcpackets
|
* @ingroup tmtcpackets
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
struct TcPacketPointer {
|
struct TcPacketPointer {
|
||||||
CCSDSPrimaryHeader primary;
|
CCSDSPrimaryHeader primary;
|
||||||
PUSTcDataFieldHeader dataField;
|
PusTcDataFieldHeader dataField;
|
||||||
uint8_t appData;
|
uint8_t appData;
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
class TcPacketPus : public TcPacketPusBase {
|
class TcPacketPus : public TcPacketPusBase {
|
||||||
public:
|
public:
|
||||||
static const uint16_t TC_PACKET_MIN_SIZE =
|
|
||||||
(sizeof(CCSDSPrimaryHeader) + sizeof(PUSTcDataFieldHeader) + 2);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize a PUS A telecommand packet which already exists. You can also
|
* Initialize a PUS A telecommand packet which already exists. You can also
|
||||||
* create an empty (invalid) object by passing nullptr as the data pointer
|
* create an empty (invalid) object by passing nullptr as the data pointer
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
#include "TcPacketPusBase.h"
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
#include "fsfw/globalfunctions/CRC.h"
|
|
||||||
#include "fsfw/globalfunctions/arrayprinter.h"
|
|
||||||
#include "fsfw/serviceinterface/ServiceInterface.h"
|
|
||||||
|
|
||||||
TcPacketPusBase::TcPacketPusBase(const uint8_t* setData) : SpacePacketReader(setData) {}
|
|
||||||
|
|
||||||
TcPacketPusBase::~TcPacketPusBase() {}
|
|
||||||
|
|
||||||
void TcPacketPusBase::print() {
|
|
||||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
||||||
sif::info << "TcPacketBase::print:" << std::endl;
|
|
||||||
#else
|
|
||||||
sif::printInfo("TcPacketBase::print:\n");
|
|
||||||
#endif
|
|
||||||
arrayprinter::print(getWholeData(), getFullSize());
|
|
||||||
}
|
|
@ -1,151 +0,0 @@
|
|||||||
#ifndef TMTCPACKET_PUS_TCPACKETBASE_H_
|
|
||||||
#define TMTCPACKET_PUS_TCPACKETBASE_H_
|
|
||||||
|
|
||||||
#include <fsfw/tmtcpacket/RedirectableDataPointerIF.h>
|
|
||||||
|
|
||||||
#include <cstddef>
|
|
||||||
|
|
||||||
#include "fsfw/tmtcpacket/SpacePacketReader.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class is the basic data handler for any ECSS PUS Telecommand packet.
|
|
||||||
*
|
|
||||||
* In addition to #SpacePacketBase, the class provides methods to handle
|
|
||||||
* the standardized entries of the PUS TC Packet Data Field Header.
|
|
||||||
* It does not contain the packet data itself but a pointer to the
|
|
||||||
* data must be set on instantiation. An invalid pointer may cause
|
|
||||||
* damage, as no getter method checks data validity. Anyway, a NULL
|
|
||||||
* check can be performed by making use of the getWholeData method.
|
|
||||||
* @ingroup tmtcpackets
|
|
||||||
*/
|
|
||||||
class TcPacketPusBase : public SpacePacketReader {
|
|
||||||
friend class TcPacketStoredBase;
|
|
||||||
|
|
||||||
public:
|
|
||||||
enum AckField {
|
|
||||||
//! No acknowledgements are expected.
|
|
||||||
ACK_NONE = 0b0000,
|
|
||||||
//! Acknowledgements on acceptance are expected.
|
|
||||||
ACK_ACCEPTANCE = 0b0001,
|
|
||||||
//! Acknowledgements on start are expected.
|
|
||||||
ACK_START = 0b0010,
|
|
||||||
//! Acknowledgements on step are expected.
|
|
||||||
ACK_STEP = 0b0100,
|
|
||||||
//! Acknowledfgement on completion are expected.
|
|
||||||
ACK_COMPLETION = 0b1000
|
|
||||||
};
|
|
||||||
|
|
||||||
static constexpr uint8_t ACK_ALL = ACK_ACCEPTANCE | ACK_START | ACK_STEP | ACK_COMPLETION;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is the default constructor.
|
|
||||||
* It sets its internal data pointer to the address passed and also
|
|
||||||
* forwards the data pointer to the parent SpacePacketBase class.
|
|
||||||
* @param setData The position where the packet data lies.
|
|
||||||
*/
|
|
||||||
TcPacketPusBase(const uint8_t* setData);
|
|
||||||
/**
|
|
||||||
* This is the empty default destructor.
|
|
||||||
*/
|
|
||||||
virtual ~TcPacketPusBase();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This command returns the CCSDS Secondary Header Flag.
|
|
||||||
* It shall always be zero for PUS Packets. This is the
|
|
||||||
* highest bit of the first byte of the Data Field Header.
|
|
||||||
* @return the CCSDS Secondary Header Flag
|
|
||||||
*/
|
|
||||||
virtual uint8_t getSecondaryHeaderFlag() const = 0;
|
|
||||||
/**
|
|
||||||
* This command returns the TC Packet PUS Version Number.
|
|
||||||
* The version number of ECSS PUS 2003 is 1.
|
|
||||||
* It consists of the second to fourth highest bits of the
|
|
||||||
* first byte.
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
virtual uint8_t getPusVersionNumber() const = 0;
|
|
||||||
/**
|
|
||||||
* This is a getter for the packet's Ack field, which are the lowest four
|
|
||||||
* bits of the first byte of the Data Field Header.
|
|
||||||
*
|
|
||||||
* It is packed in a uint8_t variable.
|
|
||||||
* @return The packet's PUS Ack field.
|
|
||||||
*/
|
|
||||||
virtual uint8_t getAcknowledgeFlags() const = 0;
|
|
||||||
/**
|
|
||||||
* This is a getter for the packet's PUS Service ID, which is the second
|
|
||||||
* byte of the Data Field Header.
|
|
||||||
* @return The packet's PUS Service ID.
|
|
||||||
*/
|
|
||||||
virtual uint8_t getService() const = 0;
|
|
||||||
/**
|
|
||||||
* This is a getter for the packet's PUS Service Subtype, which is the
|
|
||||||
* third byte of the Data Field Header.
|
|
||||||
* @return The packet's PUS Service Subtype.
|
|
||||||
*/
|
|
||||||
virtual uint8_t getSubService() const = 0;
|
|
||||||
/**
|
|
||||||
* The source ID can be used to have an additional identifier, e.g. for different ground
|
|
||||||
* station.
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
virtual uint16_t getSourceId() const = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is a getter for a pointer to the packet's Application data.
|
|
||||||
*
|
|
||||||
* These are the bytes that follow after the Data Field Header. They form
|
|
||||||
* the packet's application data.
|
|
||||||
* @return A pointer to the PUS Application Data.
|
|
||||||
*/
|
|
||||||
virtual const uint8_t* getApplicationData() const = 0;
|
|
||||||
/**
|
|
||||||
* This method calculates the size of the PUS Application data field.
|
|
||||||
*
|
|
||||||
* It takes the information stored in the CCSDS Packet Data Length field
|
|
||||||
* and subtracts the Data Field Header size and the CRC size.
|
|
||||||
* @return The size of the PUS Application Data (without Error Control
|
|
||||||
* field)
|
|
||||||
*/
|
|
||||||
virtual uint16_t getApplicationDataSize() const = 0;
|
|
||||||
/**
|
|
||||||
* This getter returns the Error Control Field of the packet.
|
|
||||||
*
|
|
||||||
* The field is placed after any possible Application Data. If no
|
|
||||||
* Application Data is present there's still an Error Control field. It is
|
|
||||||
* supposed to be a 16bit-CRC.
|
|
||||||
* @return The PUS Error Control
|
|
||||||
*/
|
|
||||||
virtual uint16_t getErrorControl() const = 0;
|
|
||||||
/**
|
|
||||||
* With this method, the Error Control Field is updated to match the
|
|
||||||
* current content of the packet.
|
|
||||||
*/
|
|
||||||
virtual void setErrorControl() = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculate full packet length from application data length.
|
|
||||||
* @param appDataLen
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
virtual size_t calculateFullPacketLength(size_t appDataLen) const = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is a debugging helper method that prints the whole packet content
|
|
||||||
* to the screen.
|
|
||||||
*/
|
|
||||||
void print();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/**
|
|
||||||
* With this method, the packet data pointer can be redirected to another
|
|
||||||
* location.
|
|
||||||
* This call overwrites the parent's setData method to set both its
|
|
||||||
* @c tc_data pointer and the parent's @c data pointer.
|
|
||||||
*
|
|
||||||
* @param p_data A pointer to another PUS Telecommand Packet.
|
|
||||||
*/
|
|
||||||
virtual ReturnValue_t setData(uint8_t* pData, size_t maxSize, void* args = nullptr) override = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* TMTCPACKET_PUS_TCPACKETBASE_H_ */
|
|
@ -1,6 +1,7 @@
|
|||||||
#ifndef TMTCPACKET_PUS_TCPACKETSTORED_H_
|
#ifndef TMTCPACKET_PUS_TCPACKETSTORED_H_
|
||||||
#define TMTCPACKET_PUS_TCPACKETSTORED_H_
|
#define TMTCPACKET_PUS_TCPACKETSTORED_H_
|
||||||
|
|
||||||
|
#include "PusTcReader.h"
|
||||||
#include "TcPacketStoredIF.h"
|
#include "TcPacketStoredIF.h"
|
||||||
#include "fsfw/storagemanager/StorageManagerIF.h"
|
#include "fsfw/storagemanager/StorageManagerIF.h"
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include <fsfw/tmtcpacket/RedirectableDataPointerIF.h>
|
#include <fsfw/tmtcpacket/RedirectableDataPointerIF.h>
|
||||||
|
|
||||||
#include "TcPacketPusBase.h"
|
#include "PusTcReader.h"
|
||||||
#include "fsfw/returnvalues/HasReturnvaluesIF.h"
|
#include "fsfw/returnvalues/HasReturnvaluesIF.h"
|
||||||
#include "fsfw/storagemanager/storeAddress.h"
|
#include "fsfw/storagemanager/storeAddress.h"
|
||||||
|
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
target_sources(
|
target_sources(
|
||||||
${LIB_FSFW_NAME}
|
${LIB_FSFW_NAME}
|
||||||
PRIVATE TmPacketStoredPusA.cpp
|
PRIVATE TmPacketStoredPusC.cpp TmPacketPusC.cpp TmPacketStoredBase.cpp
|
||||||
TmPacketStoredPusC.cpp
|
TmPacketBase.cpp TmPacketMinimal.cpp)
|
||||||
TmPacketPusA.cpp
|
|
||||||
TmPacketPusC.cpp
|
|
||||||
TmPacketStoredBase.cpp
|
|
||||||
TmPacketBase.cpp
|
|
||||||
TmPacketMinimal.cpp)
|
|
||||||
|
@ -1,68 +0,0 @@
|
|||||||
#include "TmPacketPusA.h"
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
#include "../definitions.h"
|
|
||||||
#include "TmPacketBase.h"
|
|
||||||
#include "fsfw/globalfunctions/CRC.h"
|
|
||||||
#include "fsfw/globalfunctions/arrayprinter.h"
|
|
||||||
#include "fsfw/objectmanager/ObjectManagerIF.h"
|
|
||||||
#include "fsfw/serviceinterface/ServiceInterface.h"
|
|
||||||
#include "fsfw/timemanager/CCSDSTime.h"
|
|
||||||
|
|
||||||
TmPacketPusA::TmPacketPusA(uint8_t* setData) : TmPacketBase(setData) {
|
|
||||||
tmData = reinterpret_cast<TmPacketPointerPusA*>(setData);
|
|
||||||
}
|
|
||||||
|
|
||||||
TmPacketPusA::~TmPacketPusA() {
|
|
||||||
// Nothing to do.
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t TmPacketPusA::getService() { return tmData->data_field.service_type; }
|
|
||||||
|
|
||||||
uint8_t TmPacketPusA::getSubService() { return tmData->data_field.service_subtype; }
|
|
||||||
|
|
||||||
uint8_t* TmPacketPusA::getSourceData() { return &tmData->data; }
|
|
||||||
|
|
||||||
uint16_t TmPacketPusA::getSourceDataSize() {
|
|
||||||
return SpacePacketReader::getPacketDataLen() - sizeof(tmData->data_field) - CRC_SIZE + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnValue_t TmPacketPusA::setData(uint8_t* p_Data, size_t maxSize, void* args) {
|
|
||||||
ReturnValue_t result = SpacePacketReader::setData(p_Data, maxSize, args);
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
tmData = reinterpret_cast<TmPacketPointerPusA*>(const_cast<uint8_t*>(p_Data));
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t TmPacketPusA::getPacketMinimumSize() const { return TM_PACKET_MIN_SIZE; }
|
|
||||||
|
|
||||||
uint16_t TmPacketPusA::getDataFieldSize() { return sizeof(PUSTmDataFieldHeaderPusA); }
|
|
||||||
|
|
||||||
uint8_t* TmPacketPusA::getPacketTimeRaw() const { return tmData->data_field.time; }
|
|
||||||
|
|
||||||
void TmPacketPusA::initializeTmPacket(uint16_t apid, uint8_t service, uint8_t subservice,
|
|
||||||
uint8_t packetSubcounter) {
|
|
||||||
// Set primary header:
|
|
||||||
initSpacePacketHeader(false, true, apid);
|
|
||||||
// Set data Field Header:
|
|
||||||
// First, set to zero.
|
|
||||||
memset(&tmData->data_field, 0, sizeof(tmData->data_field));
|
|
||||||
|
|
||||||
tmData->data_field.version_type_ack = pus::PusVersion::PUS_A_VERSION << 4;
|
|
||||||
tmData->data_field.service_type = service;
|
|
||||||
tmData->data_field.service_subtype = subservice;
|
|
||||||
tmData->data_field.subcounter = packetSubcounter;
|
|
||||||
// Timestamp packet
|
|
||||||
if (TmPacketBase::checkAndSetStamper()) {
|
|
||||||
timeStamper->addTimeStamp(tmData->data_field.time, sizeof(tmData->data_field.time));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void TmPacketPusA::setSourceDataSize(uint16_t size) {
|
|
||||||
setPacketDataLength(size + sizeof(PUSTmDataFieldHeaderPusA) + CRC_SIZE - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t TmPacketPusA::getTimestampSize() const { return sizeof(tmData->data_field.time); }
|
|
@ -1,129 +0,0 @@
|
|||||||
#ifndef FSFW_TMTCPACKET_PUS_TMPACKETPUSA_H_
|
|
||||||
#define FSFW_TMTCPACKET_PUS_TMPACKETPUSA_H_
|
|
||||||
|
|
||||||
#include "TmPacketBase.h"
|
|
||||||
#include "fsfw/objectmanager/SystemObjectIF.h"
|
|
||||||
#include "fsfw/timemanager/Clock.h"
|
|
||||||
#include "fsfw/timemanager/TimeStamperIF.h"
|
|
||||||
#include "fsfw/tmtcpacket/SpacePacketReader.h"
|
|
||||||
|
|
||||||
namespace Factory {
|
|
||||||
void setStaticFrameworkObjectIds();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This struct defines a byte-wise structured PUS TM Data Field Header.
|
|
||||||
* Any optional fields in the header must be added or removed here.
|
|
||||||
* Currently, no Destination field is present, but an eigth-byte representation
|
|
||||||
* for a time tag.
|
|
||||||
* @ingroup tmtcpackets
|
|
||||||
*/
|
|
||||||
struct PUSTmDataFieldHeaderPusA {
|
|
||||||
uint8_t version_type_ack;
|
|
||||||
uint8_t service_type;
|
|
||||||
uint8_t service_subtype;
|
|
||||||
uint8_t subcounter;
|
|
||||||
// uint8_t destination;
|
|
||||||
uint8_t time[TimeStamperIF::MISSION_TIMESTAMP_SIZE];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This struct defines the data structure of a PUS Telecommand Packet when
|
|
||||||
* accessed via a pointer.
|
|
||||||
* @ingroup tmtcpackets
|
|
||||||
*/
|
|
||||||
struct TmPacketPointerPusA {
|
|
||||||
CCSDSPrimaryHeader primary;
|
|
||||||
PUSTmDataFieldHeaderPusA data_field;
|
|
||||||
uint8_t data;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PUS A packet implementation
|
|
||||||
* @ingroup tmtcpackets
|
|
||||||
*/
|
|
||||||
class TmPacketPusA : public TmPacketBase {
|
|
||||||
friend void(Factory::setStaticFrameworkObjectIds)();
|
|
||||||
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* This constant defines the minimum size of a valid PUS Telemetry Packet.
|
|
||||||
*/
|
|
||||||
static const uint32_t TM_PACKET_MIN_SIZE =
|
|
||||||
(sizeof(CCSDSPrimaryHeader) + sizeof(PUSTmDataFieldHeaderPusA) + 2);
|
|
||||||
//! Maximum size of a TM Packet in this mission.
|
|
||||||
static const uint32_t MISSION_TM_PACKET_MAX_SIZE = fsfwconfig::FSFW_MAX_TM_PACKET_SIZE;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is the default constructor.
|
|
||||||
* It sets its internal data pointer to the address passed and also
|
|
||||||
* forwards the data pointer to the parent SpacePacketBase class.
|
|
||||||
* @param set_address The position where the packet data lies.
|
|
||||||
*/
|
|
||||||
TmPacketPusA(uint8_t* setData);
|
|
||||||
/**
|
|
||||||
* This is the empty default destructor.
|
|
||||||
*/
|
|
||||||
virtual ~TmPacketPusA();
|
|
||||||
|
|
||||||
/* TmPacketBase implementations */
|
|
||||||
uint8_t getService() override;
|
|
||||||
uint8_t getSubService() override;
|
|
||||||
uint8_t* getSourceData() override;
|
|
||||||
uint16_t getSourceDataSize() override;
|
|
||||||
uint16_t getDataFieldSize() override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a raw pointer to the beginning of the time field.
|
|
||||||
* @return Raw pointer to time field.
|
|
||||||
*/
|
|
||||||
uint8_t* getPacketTimeRaw() const override;
|
|
||||||
size_t getTimestampSize() const override;
|
|
||||||
|
|
||||||
size_t getPacketMinimumSize() const override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/**
|
|
||||||
* A pointer to a structure which defines the data structure of
|
|
||||||
* the packet's data.
|
|
||||||
*
|
|
||||||
* To be hardware-safe, all elements are of byte size.
|
|
||||||
*/
|
|
||||||
TmPacketPointerPusA* tmData;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes the Tm Packet header.
|
|
||||||
* Does set the timestamp (to now), but not the error control field.
|
|
||||||
* @param apid APID used.
|
|
||||||
* @param service PUS Service
|
|
||||||
* @param subservice PUS Subservice
|
|
||||||
* @param packetSubcounter Additional subcounter used.
|
|
||||||
*/
|
|
||||||
void initializeTmPacket(uint16_t apid, uint8_t service, uint8_t subservice,
|
|
||||||
uint8_t packetSubcounter);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* With this method, the packet data pointer can be redirected to another
|
|
||||||
* location.
|
|
||||||
*
|
|
||||||
* This call overwrites the parent's setData method to set both its
|
|
||||||
* @c tc_data pointer and the parent's @c data pointer.
|
|
||||||
*
|
|
||||||
* @param p_data A pointer to another PUS Telemetry Packet.
|
|
||||||
*/
|
|
||||||
ReturnValue_t setData(uint8_t* pData, size_t maxSize, void* args = nullptr) override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* In case data was filled manually (almost never the case).
|
|
||||||
* @param size Size of source data (without CRC and data filed header!).
|
|
||||||
*/
|
|
||||||
void setSourceDataSize(uint16_t size);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if a time stamper is available and tries to set it if not.
|
|
||||||
* @return Returns false if setting failed.
|
|
||||||
*/
|
|
||||||
bool checkAndSetStamper();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* FSFW_TMTCPACKET_PUS_TMPACKETPUSA_H_ */
|
|
@ -2,7 +2,6 @@
|
|||||||
#define FSFW_TMTCPACKET_PUS_TMPACKETSTOREDBASE_H_
|
#define FSFW_TMTCPACKET_PUS_TMPACKETSTOREDBASE_H_
|
||||||
|
|
||||||
#include "TmPacketBase.h"
|
#include "TmPacketBase.h"
|
||||||
#include "TmPacketPusA.h"
|
|
||||||
#include "TmPacketStoredBase.h"
|
#include "TmPacketStoredBase.h"
|
||||||
#include "fsfw/FSFW.h"
|
#include "fsfw/FSFW.h"
|
||||||
#include "fsfw/internalerror/InternalErrorReporterIF.h"
|
#include "fsfw/internalerror/InternalErrorReporterIF.h"
|
||||||
|
@ -1,73 +0,0 @@
|
|||||||
#include "fsfw/tmtcpacket/pus/tm/TmPacketStoredPusA.h"
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
#include "fsfw/serviceinterface/ServiceInterface.h"
|
|
||||||
#include "fsfw/tmtcservices/TmTcMessage.h"
|
|
||||||
|
|
||||||
TmPacketStoredPusA::TmPacketStoredPusA(store_address_t setAddress)
|
|
||||||
: TmPacketStoredBase(setAddress), TmPacketPusA(nullptr) {}
|
|
||||||
|
|
||||||
TmPacketStoredPusA::TmPacketStoredPusA(uint16_t apid, uint8_t service, uint8_t subservice,
|
|
||||||
uint8_t packetSubcounter, const uint8_t *data, uint32_t size,
|
|
||||||
const uint8_t *headerData, uint32_t headerSize)
|
|
||||||
: TmPacketPusA(nullptr) {
|
|
||||||
storeAddress.raw = StorageManagerIF::INVALID_ADDRESS;
|
|
||||||
if (not TmPacketStoredBase::checkAndSetStore()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
uint8_t *pData = nullptr;
|
|
||||||
size_t sizeToReserve = getPacketMinimumSize() + size + headerSize;
|
|
||||||
ReturnValue_t returnValue = store->getFreeElement(&storeAddress, sizeToReserve, &pData);
|
|
||||||
|
|
||||||
if (returnValue != store->RETURN_OK) {
|
|
||||||
handleStoreFailure("A", returnValue, sizeToReserve);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setData(pData, sizeToReserve);
|
|
||||||
initializeTmPacket(apid, service, subservice, packetSubcounter);
|
|
||||||
memcpy(getSourceData(), headerData, headerSize);
|
|
||||||
memcpy(getSourceData() + headerSize, data, size);
|
|
||||||
setPacketDataLength(size + headerSize + sizeof(PUSTmDataFieldHeaderPusA) + CRC_SIZE - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
TmPacketStoredPusA::TmPacketStoredPusA(uint16_t apid, uint8_t service, uint8_t subservice,
|
|
||||||
uint8_t packetSubcounter, SerializeIF *content,
|
|
||||||
SerializeIF *header)
|
|
||||||
: TmPacketPusA(nullptr) {
|
|
||||||
storeAddress.raw = StorageManagerIF::INVALID_ADDRESS;
|
|
||||||
if (not TmPacketStoredBase::checkAndSetStore()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
size_t sourceDataSize = 0;
|
|
||||||
if (content != nullptr) {
|
|
||||||
sourceDataSize += content->getSerializedSize();
|
|
||||||
}
|
|
||||||
if (header != nullptr) {
|
|
||||||
sourceDataSize += header->getSerializedSize();
|
|
||||||
}
|
|
||||||
uint8_t *pData = nullptr;
|
|
||||||
size_t sizeToReserve = getPacketMinimumSize() + sourceDataSize;
|
|
||||||
ReturnValue_t returnValue = store->getFreeElement(&storeAddress, sizeToReserve, &pData);
|
|
||||||
if (returnValue != store->RETURN_OK) {
|
|
||||||
handleStoreFailure("A", returnValue, sizeToReserve);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setData(pData, sizeToReserve);
|
|
||||||
initializeTmPacket(apid, service, subservice, packetSubcounter);
|
|
||||||
uint8_t *putDataHere = getSourceData();
|
|
||||||
size_t size = 0;
|
|
||||||
if (header != nullptr) {
|
|
||||||
header->serialize(&putDataHere, &size, sourceDataSize, SerializeIF::Endianness::BIG);
|
|
||||||
}
|
|
||||||
if (content != nullptr) {
|
|
||||||
content->serialize(&putDataHere, &size, sourceDataSize, SerializeIF::Endianness::BIG);
|
|
||||||
}
|
|
||||||
setPacketDataLength(sourceDataSize + sizeof(PUSTmDataFieldHeaderPusA) + CRC_SIZE - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *TmPacketStoredPusA::getAllTmData() { return getWholeData(); }
|
|
||||||
|
|
||||||
ReturnValue_t TmPacketStoredPusA::setData(uint8_t *newPointer, size_t maxSize, void *args) {
|
|
||||||
return TmPacketPusA::setData(newPointer, maxSize);
|
|
||||||
}
|
|
@ -1,69 +0,0 @@
|
|||||||
#ifndef FSFW_TMTCPACKET_PUS_TMPACKETSTORED_PUSA_H_
|
|
||||||
#define FSFW_TMTCPACKET_PUS_TMPACKETSTORED_PUSA_H_
|
|
||||||
|
|
||||||
#include <FSFWConfig.h>
|
|
||||||
|
|
||||||
#include "TmPacketPusA.h"
|
|
||||||
#include "TmPacketStoredBase.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class generates a ECSS PUS A Telemetry packet within a given
|
|
||||||
* intermediate storage.
|
|
||||||
* As most packets are passed between tasks with the help of a storage
|
|
||||||
* anyway, it seems logical to create a Packet-In-Storage access class
|
|
||||||
* which saves the user almost all storage handling operation.
|
|
||||||
* Packets can both be newly created with the class and be "linked" to
|
|
||||||
* packets in a store with the help of a storeAddress.
|
|
||||||
* @ingroup tmtcpackets
|
|
||||||
*/
|
|
||||||
class TmPacketStoredPusA : public TmPacketStoredBase, public TmPacketPusA {
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* This is a default constructor which does not set the data pointer.
|
|
||||||
* However, it does try to set the packet store.
|
|
||||||
*/
|
|
||||||
TmPacketStoredPusA(store_address_t setAddress);
|
|
||||||
/**
|
|
||||||
* With this constructor, new space is allocated in the packet store and
|
|
||||||
* a new PUS Telemetry Packet is created there.
|
|
||||||
* Packet Application Data passed in data is copied into the packet.
|
|
||||||
* The Application data is passed in two parts, first a header, then a
|
|
||||||
* data field. This allows building a Telemetry Packet from two separate
|
|
||||||
* data sources.
|
|
||||||
* @param apid Sets the packet's APID field.
|
|
||||||
* @param service Sets the packet's Service ID field.
|
|
||||||
* This specifies the source service.
|
|
||||||
* @param subservice Sets the packet's Service Subtype field.
|
|
||||||
* This specifies the source sub-service.
|
|
||||||
* @param packet_counter Sets the Packet counter field of this packet
|
|
||||||
* @param data The payload data to be copied to the
|
|
||||||
* Application Data Field
|
|
||||||
* @param size The amount of data to be copied.
|
|
||||||
* @param headerData The header Data of the Application field,
|
|
||||||
* will be copied in front of data
|
|
||||||
* @param headerSize The size of the headerDataF
|
|
||||||
*/
|
|
||||||
TmPacketStoredPusA(uint16_t apid, uint8_t service, uint8_t subservice, uint8_t packet_counter = 0,
|
|
||||||
const uint8_t* data = nullptr, uint32_t size = 0,
|
|
||||||
const uint8_t* headerData = nullptr, uint32_t headerSize = 0);
|
|
||||||
/**
|
|
||||||
* Another ctor to directly pass structured content and header data to the
|
|
||||||
* packet to avoid additional buffers.
|
|
||||||
*/
|
|
||||||
TmPacketStoredPusA(uint16_t apid, uint8_t service, uint8_t subservice, uint8_t packet_counter,
|
|
||||||
SerializeIF* content, SerializeIF* header = nullptr);
|
|
||||||
|
|
||||||
uint8_t* getAllTmData() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
/**
|
|
||||||
* Implementation required by base class
|
|
||||||
* @param newPointer
|
|
||||||
* @param maxSize
|
|
||||||
* @param args
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
ReturnValue_t setData(uint8_t* newPointer, size_t maxSize, void* args = nullptr) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* FSFW_TMTCPACKET_PUS_TMPACKETSTORED_PUSA_H_ */
|
|
@ -4,7 +4,7 @@
|
|||||||
#include "VerificationCodes.h"
|
#include "VerificationCodes.h"
|
||||||
#include "fsfw/ipc/MessageQueueMessage.h"
|
#include "fsfw/ipc/MessageQueueMessage.h"
|
||||||
#include "fsfw/returnvalues/HasReturnvaluesIF.h"
|
#include "fsfw/returnvalues/HasReturnvaluesIF.h"
|
||||||
#include "fsfw/tmtcpacket/pus/tc/TcPacketPusBase.h"
|
#include "fsfw/tmtcpacket/pus/tc/PusTcReader.h"
|
||||||
|
|
||||||
class PusVerificationMessage : public MessageQueueMessage {
|
class PusVerificationMessage : public MessageQueueMessage {
|
||||||
private:
|
private:
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
#include "fsfw/tmtcpacket/SpacePacketCreator.h"
|
#include "fsfw/tmtcpacket/SpacePacketCreator.h"
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("CCSDS Creator", "[ccsds-creator]") {
|
TEST_CASE("CCSDS Creator", "[ccsds-creator]") {
|
||||||
SpacePacketCreator base = SpacePacketCreator(ccsds::PacketType::TC, true, 0x02,
|
SpacePacketCreator base = SpacePacketCreator(ccsds::PacketType::TC, true, 0x02,
|
||||||
ccsds::SequenceFlags::FIRST_SEGMENT, 0x34, 0x16);
|
ccsds::SequenceFlags::FIRST_SEGMENT, 0x34, 0x16);
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#include <catch2/catch_test_macros.hpp>
|
#include <catch2/catch_test_macros.hpp>
|
||||||
|
|
||||||
#include "fsfw/tmtcpacket/SpacePacketReader.h"
|
#include "fsfw/tmtcpacket/SpacePacketReader.h"
|
||||||
|
|
||||||
TEST_CASE("CCSDS Reader", "[ccsds-reader]") {
|
TEST_CASE("CCSDS Reader", "[ccsds-reader]") {}
|
||||||
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user