2016-06-15 23:48:41 +02:00
/**
* @file CommandMessage.h
* @brief This file defines the CommandMessage class.
* @date 20.06.2013
* @author baetz
*/
#ifndef COMMANDMESSAGE_H_
#define COMMANDMESSAGE_H_
2020-08-13 20:53:35 +02:00
#include "FwMessageTypes.h"
2018-07-12 16:29:32 +02:00
#include <config/ipc/MissionMessageTypes.h>
2016-06-15 23:48:41 +02:00
2020-08-13 20:53:35 +02:00
#include "MessageQueueMessage.h"
2016-06-15 23:48:41 +02:00
#define MAKE_COMMAND_ID( number ) ((MESSAGE_ID << 8) + (number))
typedef ReturnValue_t Command_t ;
class CommandMessage : public MessageQueueMessage {
public :
2018-07-12 16:29:32 +02:00
static const uint8_t INTERFACE_ID = CLASS_ID :: COMMAND_MESSAGE ;
2020-07-16 12:49:53 +02:00
static const ReturnValue_t UNKNOWN_COMMAND = MAKE_RETURN_CODE ( 0x01 );
2016-06-15 23:48:41 +02:00
2020-06-17 21:15:19 +02:00
static const uint8_t MESSAGE_ID = messagetypes :: COMMAND ;
2016-06-15 23:48:41 +02:00
static const Command_t CMD_NONE = MAKE_COMMAND_ID ( 0 ); //!< Used internally, will be ignored
static const Command_t REPLY_COMMAND_OK = MAKE_COMMAND_ID ( 3 );
static const Command_t REPLY_REJECTED = MAKE_COMMAND_ID ( 0xD1 ); //!< Reply indicating that the current command was rejected, par1 should contain the error code
/**
* This is the size of a message as it is seen by the MessageQueue
*/
static const size_t COMMAND_MESSAGE_SIZE = HEADER_SIZE
+ sizeof ( Command_t ) + 2 * sizeof ( uint32_t );
/**
* Default Constructor, does not initialize anything.
*
* This constructor should be used when receiving a Message, as the content is filled by the MessageQueue.
*/
CommandMessage ();
/**
* This constructor creates a new message with all message content initialized
*
* @param command The DeviceHandlerCommand_t that will be sent
* @param parameter1 The first parameter
* @param parameter2 The second parameter
*/
CommandMessage ( Command_t command ,
uint32_t parameter1 , uint32_t parameter2 );
/**
* Default Destructor
*/
virtual ~ CommandMessage () {
}
/**
* Read the DeviceHandlerCommand_t that is stored in the message, usually used after receiving
*
* @return the Command stored in the Message
*/
Command_t getCommand () const ;
/**
* Set the DeviceHandlerCOmmand_t of the message
*
* @param the Command to be sent
*/
void setCommand ( Command_t command );
/**
* Get the first parameter of the message
*
* @return the first Parameter of the message
*/
uint32_t getParameter () const ;
/**
* Set the first parameter of the message
*
* @param the first parameter of the message
*/
void setParameter ( uint32_t parameter1 );
/**
* Get the second parameter of the message
*
* @return the second Parameter of the message
*/
uint32_t getParameter2 () const ;
/**
* Set the second parameter of the message
*
* @param the second parameter of the message
*/
void setParameter2 ( uint32_t parameter2 );
/**
* Set the command to CMD_NONE and try to find
* the correct class to handle a more detailed
* clear.
2018-07-12 16:29:32 +02:00
* Also, calls a mission-specific clearMissionMessage
* function to separate between framework and mission
* messages. Not optimal, may be replaced by totally
* different auto-delete solution (e.g. smart pointers).
2016-06-15 23:48:41 +02:00
*
*/
void clearCommandMessage ();
/**
* check if a message was cleared
*
* @return if the command is CMD_NONE
*/
bool isClearedCommandMessage ();
/**
* Sets the command to REPLY_REJECTED with parameter UNKNOWN_COMMAND.
* Is needed quite often, so we better code it once only.
*/
2018-07-12 16:29:32 +02:00
void setToUnknownCommand ();
2016-06-15 23:48:41 +02:00
void setReplyRejected ( ReturnValue_t reason , Command_t initialCommand = CMD_NONE );
2020-07-09 19:53:17 +02:00
ReturnValue_t getReplyRejectedReason (
Command_t * initialCommand = nullptr ) const ;
2020-06-24 16:24:16 +02:00
2016-06-15 23:48:41 +02:00
size_t getMinimumMessageSize () const ;
};
#endif /* COMMANDMESSAGE_H_ */