#ifndef FSFW_MEMORY_MEMORYMESSAGE_H_
#define FSFW_MEMORY_MEMORYMESSAGE_H_

#include "../ipc/CommandMessage.h"
#include "../storagemanager/StorageManagerIF.h"


class MemoryMessage {
public:
    // Instantiation forbidden.
	MemoryMessage() = delete;

	static const uint8_t MESSAGE_ID = messagetypes::MEMORY;
	static const Command_t CMD_MEMORY_LOAD = MAKE_COMMAND_ID( 0x01 );
	static const Command_t CMD_MEMORY_DUMP = MAKE_COMMAND_ID( 0x02 );
	static const Command_t CMD_MEMORY_CHECK = MAKE_COMMAND_ID( 0x03 );
	static const Command_t REPLY_MEMORY_DUMP = MAKE_COMMAND_ID( 0x10 );
	static const Command_t REPLY_MEMORY_CHECK = MAKE_COMMAND_ID( 0x30 );
	static const Command_t REPLY_MEMORY_FAILED = MAKE_COMMAND_ID( 0xE0 );
	static const Command_t END_OF_MEMORY_COPY = MAKE_COMMAND_ID(0xF0);

	static uint32_t getAddress( const CommandMessage* message );
	static store_address_t getStoreID(const CommandMessage* message);
	static uint32_t getLength( const CommandMessage* message );
	static ReturnValue_t getErrorCode(const CommandMessage* message);
    static uint16_t getCrc(const CommandMessage* message );
    static ReturnValue_t getCrcReturnValue(const CommandMessage* message);
    static Command_t getInitialCommand(const CommandMessage* message);

	static void setMemoryDumpCommand(CommandMessage* message,
	        uint32_t address, uint32_t length );
	static void setMemoryDumpReply(CommandMessage* message,
	        store_address_t storageID);
	static void setMemoryLoadCommand(CommandMessage* message,
	        uint32_t address, store_address_t storageID );
	static void setMemoryCheckCommand(CommandMessage* message,
	        uint32_t address, uint32_t length);
	static void setMemoryCheckReply(CommandMessage* message,
	        uint16_t crc);
	static void setMemoryReplyFailed(CommandMessage* message,
	        ReturnValue_t errorCode, Command_t initialCommand);
	static void setMemoryCopyEnd(CommandMessage* message);
	static void setCrcReturnValue(CommandMessage*, ReturnValue_t returnValue);

	static void clear(CommandMessage* message);
};

#endif /* FSFW_MEMORY_MEMORYMESSAGE_H_ */