#ifndef SPACEPACKET_H_
#define SPACEPACKET_H_

#include "SpacePacketBase.h"

/**
 * The SpacePacket class is a representation of a simple CCSDS Space Packet
 * without (control over) a secondary header.
 * It can be instantiated with a size smaller than \c PACKET_MAX_SIZE. Its
 * main use is to serve as an idle packet in case no other packets are sent.
 * For the ECSS PUS part the TcPacket and TmPacket classes are used.
 * A pointer to \c local_data is passed to the \c SpacePacketBase parent class,
 * so the parent's methods are reachable.
 * @ingroup tmtcpackets
 */
class SpacePacket: public SpacePacketBase {
public:
	static const uint16_t PACKET_MAX_SIZE = 1024;
	/**
	 * The constructor initializes the packet and sets all header information
	 * according to the passed parameters.
	 * @param packetDataLength Sets the packet data length field and therefore specifies the size of the packet.
	 * @param isTelecommand Sets the packet type field to either TC (true) or TM (false).
	 * @param apid Sets the packet's APID field. The default value describes an idle packet.
	 * @param sequenceCount ets the packet's Source Sequence Count field.
	 */
	SpacePacket(uint16_t packetDataLength, bool isTelecommand = false,
			uint16_t apid = APID_IDLE_PACKET, uint16_t sequenceCount = 0);
	/**
	 * The class's default destructor.
	 */
	virtual ~SpacePacket();
	/**
	 * With this call, the complete data content (including the CCSDS Primary
	 * Header) is overwritten with the byte stream given.
	 * @param p_data		Pointer to data to overwrite the content with
	 * @param packet_size	Size of the data
	 * @return	@li	\c true if packet_size is smaller than \c MAX_PACKET_SIZE.
	 * 			@li \c false else.
	 */
	bool addWholeData(const uint8_t* p_data, uint32_t packet_size);
protected:
	/**
	 * This structure defines the data structure of a Space Packet as local data.
	 * There's a buffer which corresponds to the Space Packet Data Field with a
	 * maximum size of \c PACKET_MAX_SIZE.
	 */
	struct PacketStructured {
		CCSDSPrimaryHeader header;
		uint8_t buffer[PACKET_MAX_SIZE];
	};
	/**
	 * This union simplifies accessing the full data content of the Space Packet.
	 * This is achieved by putting the \c PacketStructured struct in a union with
	 * a plain buffer.
	 */
	union SpacePacketData {
		PacketStructured fields;
		uint8_t byteStream[PACKET_MAX_SIZE + sizeof(CCSDSPrimaryHeader)];
	};
	/**
	 * This is the data representation of the class.
	 * It is a struct of CCSDS Primary Header and a data field, which again is
	 * packed in an union, so the data can be accessed as a byte stream without
	 * a cast.
	 */
	SpacePacketData localData;
};

#endif /* SPACEPACKET_H_ */