#ifndef VIRTUALCHANNEL_H_
#define VIRTUALCHANNEL_H_

#include "OBSWConfig.h"
#include "fsfw/tmtcservices/AcceptsTelemetryIF.h"
#include "fsfw/returnvalues/HasReturnvaluesIF.h"
#include <fsfw/ipc/MessageQueueIF.h>
#include <linux/obc/PtmeIF.h>

/**
 * @brief   This class represents a virtual channel. Sending a tm message to an object of this class
 *          will forward the tm packet to the respective virtual channel of the PTME IP Core.
 *
 * @author  J. Meier
 */
class VirtualChannel: public AcceptsTelemetryIF, public HasReturnvaluesIF {
	public:
	/**
	 * @brief   Constructor
	 *
	 * @param vcId  The virtual channel id assigned to this object
	 * @param tmQueueDepth  Queue depth of queue receiving telemetry from other objects
	 */
	VirtualChannel(uint8_t vcId, uint32_t tmQueueDepth);

	ReturnValue_t initialize();
    MessageQueueId_t getReportReceptionQueue(uint8_t virtualChannel = 0) override;
	ReturnValue_t performOperation();

	/**
	 * @brief   Sets the PTME object which handles access to the PTME IP Core.
	 *
	 * @param ptme  Pointer to ptme object
	 */
	void setPtmeObject(PtmeIF* ptme_);

	/**
	 * @brief   Can be used by the owner to set the link state. Packets will be discarded if link
	 *          to ground station is down.
	 */
	void setLinkState(bool linkIsUp_);

private:

	PtmeIF* ptme = nullptr;
	MessageQueueIF* tmQueue = nullptr;
	uint8_t vcId;

	bool linkIsUp = false;

	StorageManagerIF* tmStore = nullptr;
};

#endif /* VIRTUALCHANNEL_H_ */