fsfw/src/fsfw/modes/HasModesIF.h

73 lines
3.0 KiB
C
Raw Normal View History

2020-09-26 14:58:53 +02:00
#ifndef FSFW_MODES_HASMODESIF_H_
#define FSFW_MODES_HASMODESIF_H_
2020-09-26 14:58:53 +02:00
#include <cstdint>
2022-02-02 10:29:30 +01:00
#include "../events/Event.h"
2022-08-26 09:56:49 +02:00
#include "../introspection/ClasslessEnum.h"
2022-08-16 12:48:22 +02:00
#include "../returnvalues/returnvalue.h"
2022-08-25 22:29:20 +02:00
#include "ModeDefinitionHelper.h"
2022-08-26 09:56:49 +02:00
#include "ModeHelper.h"
2022-02-02 10:29:30 +01:00
#include "ModeMessage.h"
class HasModesIF {
2022-02-02 10:29:30 +01:00
friend class ModeHelper;
public:
static const uint8_t INTERFACE_ID = CLASS_ID::HAS_MODES_IF;
2022-03-08 09:45:58 +01:00
static const ReturnValue_t INVALID_MODE = MAKE_RETURN_CODE(0x01);
2022-02-02 10:29:30 +01:00
static const ReturnValue_t TRANS_NOT_ALLOWED = MAKE_RETURN_CODE(0x02);
static const ReturnValue_t IN_TRANSITION = MAKE_RETURN_CODE(0x03);
static const ReturnValue_t INVALID_SUBMODE = MAKE_RETURN_CODE(0x04);
static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::SYSTEM_MANAGER;
2022-02-03 17:06:18 +01:00
//! An object announces changing the mode. p1: target mode. p2: target submode
static const Event CHANGING_MODE = MAKE_EVENT(0, severity::INFO);
//! An Object announces its mode; parameter1 is mode, parameter2 is submode
static const Event MODE_INFO = MAKE_EVENT(1, severity::INFO);
2022-02-02 10:29:30 +01:00
static const Event FALLBACK_FAILED = MAKE_EVENT(2, severity::HIGH);
static const Event MODE_TRANSITION_FAILED = MAKE_EVENT(3, severity::LOW);
static const Event CANT_KEEP_MODE = MAKE_EVENT(4, severity::HIGH);
2022-02-03 17:06:18 +01:00
//! Indicates a bug or configuration failure: Object is in a mode it should never be in.
static const Event OBJECT_IN_INVALID_MODE = MAKE_EVENT(5, severity::LOW);
//! The mode is changed, but for some reason, the change is forced, i.e. EXTERNAL_CONTROL ignored.
//! p1: target mode. p2: target submode
static const Event FORCING_MODE = MAKE_EVENT(6, severity::MEDIUM);
//! A mode command was rejected by the called object. Par1: called object id, Par2: return code.
static const Event MODE_CMD_REJECTED = MAKE_EVENT(7, severity::LOW);
//! The device is powered and ready to perform operations. In this mode, no commands are
//! sent by the device handler itself, but direct commands can be commanded and will be
2022-02-03 17:06:18 +01:00
//! interpreted
2022-03-05 03:01:43 +01:00
static constexpr Mode_t MODE_ON = 1;
2022-02-03 17:06:18 +01:00
//! The device is powered off. The only command accepted in this mode is a mode change to on.
2022-03-05 03:01:43 +01:00
static constexpr Mode_t MODE_OFF = 0;
2022-03-08 09:45:58 +01:00
static constexpr Mode_t MODE_INVALID = -1;
static constexpr Mode_t MODE_UNDEFINED = -2;
2022-03-05 03:01:43 +01:00
2022-08-26 09:56:49 +02:00
FSFW_CLASSLESS_ENUM(DefaultSubmode, Submode_t,
((SUBMODE_NONE, 0,
"Default"))) //!< To avoid checks against magic number "0".
2022-02-02 10:29:30 +01:00
virtual ~HasModesIF() {}
virtual MessageQueueId_t getCommandQueue() const = 0;
2022-08-26 09:56:49 +02:00
virtual const ModeHelper * getModeHelper() const = 0;
virtual ModeDefinitionHelper getModeDefinitionHelper() = 0;
2022-02-02 10:29:30 +01:00
virtual void getMode(Mode_t *mode, Submode_t *submode) = 0;
protected:
virtual ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode,
uint32_t *msToReachTheMode) {
2022-08-15 20:28:16 +02:00
return returnvalue::FAILED;
2022-02-02 10:29:30 +01:00
}
virtual void startTransition(Mode_t mode, Submode_t submode) {}
virtual void setToExternalControl() {}
virtual void announceMode(bool recursive) {}
};
2020-09-26 14:58:53 +02:00
#endif /*FSFW_MODES_HASMODESIF_H_ */