2020-12-03 13:14:30 +01:00
|
|
|
#ifndef FSFW_CONTROLLER_CONTROLLERBASE_H_
|
|
|
|
#define FSFW_CONTROLLER_CONTROLLERBASE_H_
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2021-07-13 20:22:54 +02:00
|
|
|
#include "fsfw/health/HasHealthIF.h"
|
|
|
|
#include "fsfw/health/HealthHelper.h"
|
2022-08-26 12:07:59 +02:00
|
|
|
#include "fsfw/introspection/ClasslessEnum.h"
|
2021-07-13 20:22:54 +02:00
|
|
|
#include "fsfw/modes/HasModesIF.h"
|
|
|
|
#include "fsfw/modes/ModeHelper.h"
|
|
|
|
#include "fsfw/objectmanager/SystemObject.h"
|
|
|
|
#include "fsfw/tasks/ExecutableObjectIF.h"
|
|
|
|
#include "fsfw/tasks/PeriodicTaskIF.h"
|
2018-07-12 16:29:32 +02:00
|
|
|
|
2020-12-03 13:14:30 +01:00
|
|
|
/**
|
|
|
|
* @brief Generic base class for controller classes
|
|
|
|
* @details
|
|
|
|
* Implements common interfaces for controllers, which generally have
|
|
|
|
* a mode and a health state. This avoids boilerplate code.
|
|
|
|
*/
|
2022-02-02 10:29:30 +01:00
|
|
|
class ControllerBase : public HasModesIF,
|
|
|
|
public HasHealthIF,
|
|
|
|
public ExecutableObjectIF,
|
|
|
|
public SystemObject,
|
|
|
|
public HasReturnvaluesIF {
|
|
|
|
public:
|
2022-08-26 12:07:59 +02:00
|
|
|
FSFW_CLASSLESS_ENUM(ControllerModes, Mode_t,
|
|
|
|
((CONTROLLER_MODE_ON, MODE_ON, "On"))((CONTROLLER_MODE_OFF, MODE_OFF,
|
|
|
|
"Off"))((MODE_NORMAL, 2, "Normal")))
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
ControllerBase(object_id_t setObjectId, object_id_t parentId, size_t commandQueueDepth = 3);
|
2022-07-04 11:48:36 +02:00
|
|
|
~ControllerBase() override;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/** SystemObject override */
|
2022-07-04 11:48:36 +02:00
|
|
|
ReturnValue_t initialize() override;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-07-04 11:48:36 +02:00
|
|
|
[[nodiscard]] MessageQueueId_t getCommandQueue() const override;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/** HasHealthIF overrides */
|
2022-07-04 11:48:36 +02:00
|
|
|
ReturnValue_t setHealth(HealthState health) override;
|
|
|
|
HasHealthIF::HealthState getHealth() override;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/** ExecutableObjectIF overrides */
|
2022-07-04 11:48:36 +02:00
|
|
|
ReturnValue_t performOperation(uint8_t opCode) override;
|
|
|
|
void setTaskIF(PeriodicTaskIF *task) override;
|
|
|
|
ReturnValue_t initializeAfterTaskCreation() override;
|
2018-07-13 18:28:26 +02:00
|
|
|
|
2022-08-26 11:53:46 +02:00
|
|
|
/** HasModeIF override */
|
2022-08-26 12:07:59 +02:00
|
|
|
const ModeHelper *getModeHelper() const override;
|
2022-08-26 11:53:46 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
protected:
|
|
|
|
/**
|
|
|
|
* Implemented by child class. Handle command messages which are not
|
|
|
|
* mode or health messages.
|
|
|
|
* @param message
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
virtual ReturnValue_t handleCommandMessage(CommandMessage *message) = 0;
|
2018-07-13 18:28:26 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/**
|
|
|
|
* Periodic helper, implemented by child class.
|
|
|
|
*/
|
|
|
|
virtual void performControlOperation() = 0;
|
2018-07-13 18:28:26 +02:00
|
|
|
|
2022-07-04 11:48:36 +02:00
|
|
|
ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode,
|
|
|
|
uint32_t *msToReachTheMode) override = 0;
|
2020-12-03 13:14:30 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
const object_id_t parentId;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
Mode_t mode;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
Submode_t submode;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
MessageQueueIF *commandQueue = nullptr;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
ModeHelper modeHelper;
|
2016-06-15 23:48:41 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
HealthHelper healthHelper;
|
2018-07-13 18:28:26 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/**
|
|
|
|
* Pointer to the task which executes this component,
|
|
|
|
* is invalid before setTaskIF was called.
|
|
|
|
*/
|
|
|
|
PeriodicTaskIF *executingTask = nullptr;
|
2021-01-28 11:50:33 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/** Handle mode and health messages */
|
|
|
|
virtual void handleQueue();
|
2021-01-28 11:50:33 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/** Mode helpers */
|
|
|
|
virtual void modeChanged(Mode_t mode, Submode_t submode);
|
2022-07-04 11:48:36 +02:00
|
|
|
void startTransition(Mode_t mode, Submode_t submode) override;
|
|
|
|
void getMode(Mode_t *mode, Submode_t *submode) override;
|
|
|
|
void setToExternalControl() override;
|
|
|
|
void announceMode(bool recursive) override;
|
2022-02-02 10:29:30 +01:00
|
|
|
/** HK helpers */
|
|
|
|
virtual void changeHK(Mode_t mode, Submode_t submode, bool enable);
|
2016-06-15 23:48:41 +02:00
|
|
|
};
|
|
|
|
|
2020-12-03 13:14:30 +01:00
|
|
|
#endif /* FSFW_CONTROLLER_CONTROLLERBASE_H_ */
|