mirror of
https://github.com/nasa/fprime.git
synced 2025-12-11 04:35:25 -06:00
* Format Fw and add to CI * Fix include of HPP file instead of H in extern C * Fix format strings
399 lines
11 KiB
C++
399 lines
11 KiB
C++
// ======================================================================
|
|
// \title FilePacket.hpp
|
|
// \author bocchino
|
|
// \brief hpp file for FilePacket
|
|
//
|
|
// \copyright
|
|
// Copyright 2009-2016, by the California Institute of Technology.
|
|
// ALL RIGHTS RESERVED. United States Government Sponsorship
|
|
// acknowledged.
|
|
//
|
|
// ======================================================================
|
|
|
|
#ifndef Fw_FilePacket_HPP
|
|
#define Fw_FilePacket_HPP
|
|
|
|
#include <CFDP/Checksum/Checksum.hpp>
|
|
#include <Fw/Buffer/Buffer.hpp>
|
|
#include <Fw/FPrimeBasicTypes.hpp>
|
|
#include <Fw/Types/SerialBuffer.hpp>
|
|
#include <Fw/Types/Serializable.hpp>
|
|
|
|
// Forward declaration for UTs
|
|
namespace Svc {
|
|
class FileUplinkTester;
|
|
class FileDownlinkTester;
|
|
} // namespace Svc
|
|
|
|
namespace Fw {
|
|
|
|
//! \class FilePacket
|
|
//! \brief A file packet
|
|
//!
|
|
union FilePacket {
|
|
public:
|
|
// ----------------------------------------------------------------------
|
|
// Types
|
|
// ----------------------------------------------------------------------
|
|
|
|
//! Packet type
|
|
typedef enum { T_START = 0, T_DATA = 1, T_END = 2, T_CANCEL = 3, T_NONE = 255 } Type;
|
|
|
|
//! The type of a path name
|
|
class PathName {
|
|
friend union FilePacket;
|
|
friend class Svc::FileDownlinkTester;
|
|
friend class Svc::FileUplinkTester;
|
|
|
|
public:
|
|
//! The maximum length of a path name
|
|
enum { MAX_LENGTH = 255 };
|
|
|
|
private:
|
|
//! The length
|
|
U8 m_length;
|
|
|
|
//! Pointer to the path value
|
|
const char* m_value;
|
|
|
|
public:
|
|
//! Initialize a PathName
|
|
void initialize(const char* const value //! The path value
|
|
);
|
|
|
|
//! Compute the buffer size needed to hold this PathName
|
|
U32 bufferSize() const;
|
|
|
|
//! Get the length of the path name value
|
|
U32 getLength(void) const { return this->m_length; };
|
|
|
|
//! Get the path name value
|
|
const char* getValue(void) const { return this->m_value; };
|
|
|
|
private:
|
|
//! Initialize this PathName from a SerialBuffer
|
|
SerializeStatus fromSerialBuffer(SerialBuffer& serialBuffer);
|
|
|
|
//! Write this PathName to a SerialBuffer
|
|
SerializeStatus toSerialBuffer(SerialBuffer& serialBuffer) const;
|
|
};
|
|
|
|
//! The type of a packet header
|
|
class Header {
|
|
friend union FilePacket;
|
|
friend class FilePacketTester;
|
|
friend class Svc::FileDownlinkTester;
|
|
friend class Svc::FileUplinkTester;
|
|
|
|
private:
|
|
//! The packet type
|
|
Type m_type;
|
|
|
|
//! The sequence index
|
|
U32 m_sequenceIndex;
|
|
|
|
public:
|
|
//! Header size
|
|
enum { HEADERSIZE = sizeof(U8) + sizeof(U32) };
|
|
|
|
private:
|
|
//! Initialize a file packet header
|
|
void initialize(const Type type, //!< The packet type
|
|
const U32 sequenceIndex //!< The sequence index
|
|
);
|
|
|
|
//! Compute the buffer size needed to hold this Header
|
|
U32 bufferSize() const;
|
|
|
|
//! Initialize this Header from a SerialBuffer
|
|
SerializeStatus fromSerialBuffer(SerialBuffer& serialBuffer);
|
|
|
|
//! Write this Header to a SerialBuffer
|
|
SerializeStatus toSerialBuffer(SerialBuffer& serialBuffer) const;
|
|
|
|
public:
|
|
Type getType(void) const { return this->m_type; };
|
|
|
|
U32 getSequenceIndex(void) const { return this->m_sequenceIndex; };
|
|
};
|
|
|
|
//! The type of a start packet
|
|
struct StartPacket {
|
|
friend union FilePacket;
|
|
|
|
private:
|
|
//! The packet header
|
|
Header m_header;
|
|
|
|
//! The file size
|
|
U32 m_fileSize;
|
|
|
|
//! The source path
|
|
PathName m_sourcePath;
|
|
|
|
//! The destination path
|
|
PathName m_destinationPath;
|
|
|
|
public:
|
|
//! Initialize a StartPacket with sequence number 0
|
|
void initialize(const U32 fileSize, //!< The file size
|
|
const char* const sourcePath, //!< The source path
|
|
const char* const destinationPath //!< The destination path
|
|
);
|
|
|
|
//! Compute the buffer size needed to hold this StartPacket
|
|
U32 bufferSize() const;
|
|
|
|
//! Convert this StartPacket to a Buffer
|
|
SerializeStatus toBuffer(Buffer& buffer) const;
|
|
|
|
//! Get this as a Header
|
|
const FilePacket::Header& asHeader() const { return this->m_header; };
|
|
|
|
//! Get the destination path
|
|
const PathName& getDestinationPath() const { return this->m_destinationPath; };
|
|
|
|
//! Get the source path
|
|
const PathName& getSourcePath() const { return this->m_sourcePath; };
|
|
|
|
//! Get the file size
|
|
U32 getFileSize() const { return this->m_fileSize; };
|
|
|
|
private:
|
|
//! Initialize this StartPacket from a SerialBuffer
|
|
SerializeStatus fromSerialBuffer(SerialBuffer& serialBuffer);
|
|
|
|
//! Write this StartPacket to a SerialBuffer
|
|
SerializeStatus toSerialBuffer(SerialBuffer& serialBuffer) const;
|
|
};
|
|
|
|
//! The type of a data packet
|
|
class DataPacket {
|
|
friend union FilePacket;
|
|
friend class Svc::FileDownlinkTester;
|
|
friend class Svc::FileUplinkTester;
|
|
|
|
private:
|
|
//! The packet header
|
|
Header m_header;
|
|
|
|
//! The byte offset of the packet data into the destination file
|
|
U32 m_byteOffset;
|
|
|
|
//! The size of the file data in the packet
|
|
U16 m_dataSize;
|
|
|
|
//! Pointer to the file data
|
|
const U8* m_data;
|
|
|
|
public:
|
|
//! header size
|
|
enum { HEADERSIZE = Header::HEADERSIZE + sizeof(U32) + sizeof(U16) };
|
|
|
|
//! Initialize a data packet
|
|
void initialize(const U32 sequenceIndex, //!< The sequence index
|
|
const U32 byteOffset, //!< The byte offset
|
|
const U16 dataSize, //!< The data size
|
|
const U8* const data //!< The file data
|
|
);
|
|
|
|
//! Compute the buffer size needed to hold this DataPacket
|
|
U32 bufferSize() const;
|
|
|
|
//! Convert this DataPacket to a Buffer
|
|
SerializeStatus toBuffer(Buffer& buffer) const;
|
|
|
|
//! Get this as a Header
|
|
const FilePacket::Header& asHeader() const { return this->m_header; };
|
|
|
|
//! Get the byte offset
|
|
U32 getByteOffset() const { return this->m_byteOffset; };
|
|
|
|
//! Get the data size
|
|
U32 getDataSize() const { return this->m_dataSize; };
|
|
|
|
//! Get the data
|
|
const U8* getData() const { return this->m_data; };
|
|
|
|
private:
|
|
//! Initialize this DataPacket from a SerialBuffer
|
|
SerializeStatus fromSerialBuffer(SerialBuffer& serialBuffer);
|
|
|
|
//! Compute the fixed-length data size of a StartPacket
|
|
U32 fixedLengthSize() const;
|
|
|
|
//! Write this DataPacket to a SerialBuffer
|
|
SerializeStatus toSerialBuffer(SerialBuffer& serialBuffer) const;
|
|
};
|
|
|
|
//! The type of an end packet
|
|
class EndPacket {
|
|
friend union FilePacket;
|
|
friend class Svc::FileDownlinkTester;
|
|
friend class Svc::FileUplinkTester;
|
|
|
|
private:
|
|
//! The packet header
|
|
Header m_header;
|
|
|
|
public:
|
|
//! Set the checksum
|
|
void setChecksum(const CFDP::Checksum& checksum);
|
|
|
|
//! Get the checksum
|
|
void getChecksum(CFDP::Checksum& checksum) const;
|
|
|
|
//! Compute the buffer size needed to hold this EndPacket
|
|
U32 bufferSize() const;
|
|
|
|
//! Convert this EndPacket to a Buffer
|
|
SerializeStatus toBuffer(Buffer& buffer) const;
|
|
|
|
//! Get this as a Header
|
|
const FilePacket::Header& asHeader() const { return this->m_header; };
|
|
|
|
public:
|
|
//! Initialize an end packet
|
|
void initialize(const U32 sequenceIndex, //!< The sequence index
|
|
const CFDP::Checksum& checksum //!< The checksum
|
|
);
|
|
|
|
private:
|
|
//! The checksum
|
|
U32 m_checksumValue;
|
|
|
|
//! Initialize this EndPacket from a SerialBuffer
|
|
SerializeStatus fromSerialBuffer(SerialBuffer& serialBuffer);
|
|
|
|
//! Write this EndPacket to a SerialBuffer
|
|
SerializeStatus toSerialBuffer(SerialBuffer& serialBuffer) const;
|
|
};
|
|
|
|
//! The type of a cancel packet
|
|
class CancelPacket {
|
|
friend union FilePacket;
|
|
friend class Svc::FileDownlinkTester;
|
|
friend class Svc::FileUplinkTester;
|
|
|
|
private:
|
|
//! The packet header
|
|
Header m_header;
|
|
|
|
public:
|
|
//! Initialize a cancel packet
|
|
void initialize(const U32 sequenceIndex //!< The sequence index
|
|
);
|
|
|
|
//! Compute the buffer size needed to hold this CancelPacket
|
|
U32 bufferSize() const;
|
|
|
|
//! Convert this CancelPacket to a Buffer
|
|
SerializeStatus toBuffer(Buffer& buffer) const;
|
|
|
|
//! Get this as a Header
|
|
const FilePacket::Header& asHeader() const { return this->m_header; };
|
|
|
|
private:
|
|
//! Initialize this CancelPacket from a SerialBuffer
|
|
SerializeStatus fromSerialBuffer(SerialBuffer& serialBuffer);
|
|
};
|
|
|
|
public:
|
|
// ----------------------------------------------------------------------
|
|
// Constructor
|
|
// ----------------------------------------------------------------------
|
|
|
|
FilePacket() { this->m_header.m_type = T_NONE; }
|
|
|
|
public:
|
|
// ----------------------------------------------------------------------
|
|
// Public instance methods
|
|
// ----------------------------------------------------------------------
|
|
|
|
//! Initialize this from a Buffer
|
|
//!
|
|
SerializeStatus fromBuffer(const Buffer& buffer);
|
|
|
|
//! Get this as a Header
|
|
//!
|
|
const Header& asHeader() const;
|
|
|
|
//! Get this as a StartPacket
|
|
//!
|
|
const StartPacket& asStartPacket() const;
|
|
|
|
//! Get this as a DataPacket
|
|
//!
|
|
const DataPacket& asDataPacket() const;
|
|
|
|
//! Get this as an EndPacket
|
|
//!
|
|
const EndPacket& asEndPacket() const;
|
|
|
|
//! Get this as a CancelPacket
|
|
//!
|
|
const CancelPacket& asCancelPacket() const;
|
|
|
|
//! Initialize this with a StartPacket
|
|
//!
|
|
void fromStartPacket(const StartPacket& startPacket);
|
|
|
|
//! Initialize this with a DataPacket
|
|
//!
|
|
void fromDataPacket(const DataPacket& dataPacket);
|
|
|
|
//! Initialize this with an EndPacket
|
|
//!
|
|
void fromEndPacket(const EndPacket& endPacket);
|
|
|
|
//! Initialize this with a CancelPacket
|
|
//!
|
|
void fromCancelPacket(const CancelPacket& cancelPacket);
|
|
|
|
//! Get the buffer size needed to hold this FilePacket
|
|
//!
|
|
U32 bufferSize() const;
|
|
|
|
//! Convert this FilePacket to a Buffer
|
|
//!
|
|
SerializeStatus toBuffer(Buffer& buffer) const;
|
|
|
|
private:
|
|
// ----------------------------------------------------------------------
|
|
// Private methods
|
|
// ----------------------------------------------------------------------
|
|
|
|
//! Initialize this from a SerialBuffer
|
|
//!
|
|
SerializeStatus fromSerialBuffer(SerialBuffer& serialBuffer);
|
|
|
|
private:
|
|
// ----------------------------------------------------------------------
|
|
// Private data
|
|
// ----------------------------------------------------------------------
|
|
|
|
//! this, seen as a header
|
|
//!
|
|
Header m_header;
|
|
|
|
//! this, seen as a Start packet
|
|
//!
|
|
StartPacket m_startPacket;
|
|
|
|
//! this, seen as a Data packet
|
|
//!
|
|
DataPacket m_dataPacket;
|
|
|
|
//! this, seen as an End packet
|
|
//!
|
|
EndPacket m_endPacket;
|
|
|
|
//! this, seen as a Cancel packet
|
|
//!
|
|
CancelPacket m_cancelPacket;
|
|
};
|
|
|
|
} // namespace Fw
|
|
|
|
#endif
|