fsfw/src/fsfw/controller/ControllerBase.h

99 lines
3.1 KiB
C
Raw Normal View History

2020-12-03 13:14:30 +01:00
#ifndef FSFW_CONTROLLER_CONTROLLERBASE_H_
#define FSFW_CONTROLLER_CONTROLLERBASE_H_
2021-07-13 20:22:54 +02:00
#include "fsfw/health/HasHealthIF.h"
#include "fsfw/health/HealthHelper.h"
#include "fsfw/modes/HasModesIF.h"
#include "fsfw/modes/ModeHelper.h"
#include "fsfw/objectmanager/SystemObject.h"
2022-09-29 19:21:24 +02:00
#include "fsfw/subsystem/HasModeTreeChildrenIF.h"
#include "fsfw/subsystem/ModeTreeChildIF.h"
2022-09-30 13:30:07 +02:00
#include "fsfw/subsystem/ModeTreeConnectionIF.h"
2021-07-13 20:22:54 +02:00
#include "fsfw/tasks/ExecutableObjectIF.h"
#include "fsfw/tasks/PeriodicTaskIF.h"
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,
2022-09-29 19:21:24 +02:00
public ModeTreeChildIF,
public ModeTreeConnectionIF,
2022-08-16 01:08:26 +02:00
public SystemObject {
2022-02-02 10:29:30 +01:00
public:
static const Mode_t MODE_NORMAL = 2;
2022-09-29 19:21:24 +02:00
ControllerBase(object_id_t setObjectId, size_t commandQueueDepth = 3);
~ControllerBase() override;
2022-09-29 19:39:37 +02:00
ReturnValue_t connectModeTreeParent(HasModeTreeChildrenIF &parent) override;
2022-09-30 15:05:32 +02:00
ModeTreeChildIF &getModeTreeChildIF() override;
2022-09-29 19:21:24 +02:00
2022-02-02 10:29:30 +01:00
/** SystemObject override */
ReturnValue_t initialize() override;
[[nodiscard]] MessageQueueId_t getCommandQueue() const override;
2022-02-02 10:29:30 +01:00
/** HasHealthIF overrides */
ReturnValue_t setHealth(HealthState health) override;
HasHealthIF::HealthState getHealth() override;
2022-02-02 10:29:30 +01:00
/** ExecutableObjectIF overrides */
ReturnValue_t performOperation(uint8_t opCode) override;
void setTaskIF(PeriodicTaskIF *task) override;
ReturnValue_t initializeAfterTaskCreation() override;
2022-09-29 19:21:24 +02:00
const HasHealthIF *getOptHealthIF() const override;
const HasModesIF &getModeIF() const override;
2018-07-13 18:28:26 +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
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
Mode_t mode;
2022-02-02 10:29:30 +01:00
Submode_t submode;
2022-02-02 10:29:30 +01:00
MessageQueueIF *commandQueue = nullptr;
2022-02-02 10:29:30 +01:00
ModeHelper modeHelper;
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;
2022-02-02 10:29:30 +01:00
/** Handle mode and health messages */
virtual void handleQueue();
2022-02-02 10:29:30 +01:00
/** Mode helpers */
virtual void modeChanged(Mode_t mode, Submode_t submode);
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);
};
2020-12-03 13:14:30 +01:00
#endif /* FSFW_CONTROLLER_CONTROLLERBASE_H_ */