this seems to work
This commit is contained in:
parent
f78344b8fb
commit
7c5308429c
@ -4,11 +4,10 @@
|
|||||||
#include "fsfw/ipc/QueueFactory.h"
|
#include "fsfw/ipc/QueueFactory.h"
|
||||||
#include "fsfw/objectmanager/ObjectManager.h"
|
#include "fsfw/objectmanager/ObjectManager.h"
|
||||||
#include "fsfw/subsystem/SubsystemBase.h"
|
#include "fsfw/subsystem/SubsystemBase.h"
|
||||||
|
#include "fsfw/subsystem/helper.h"
|
||||||
|
|
||||||
ControllerBase::ControllerBase(object_id_t setObjectId, object_id_t parentId,
|
ControllerBase::ControllerBase(object_id_t setObjectId, size_t commandQueueDepth)
|
||||||
size_t commandQueueDepth)
|
|
||||||
: SystemObject(setObjectId),
|
: SystemObject(setObjectId),
|
||||||
parentId(parentId),
|
|
||||||
mode(MODE_OFF),
|
mode(MODE_OFF),
|
||||||
submode(SUBMODE_NONE),
|
submode(SUBMODE_NONE),
|
||||||
modeHelper(this),
|
modeHelper(this),
|
||||||
@ -25,28 +24,6 @@ ReturnValue_t ControllerBase::initialize() {
|
|||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageQueueId_t parentQueue = 0;
|
|
||||||
if (parentId != objects::NO_OBJECT) {
|
|
||||||
auto* parent = ObjectManager::instance()->get<SubsystemBase>(parentId);
|
|
||||||
if (parent == nullptr) {
|
|
||||||
return returnvalue::FAILED;
|
|
||||||
}
|
|
||||||
parentQueue = parent->getCommandQueue();
|
|
||||||
|
|
||||||
parent->registerChild(getObjectId());
|
|
||||||
}
|
|
||||||
|
|
||||||
result = healthHelper.initialize(parentQueue);
|
|
||||||
if (result != returnvalue::OK) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = modeHelper.initialize(parentQueue);
|
|
||||||
if (result != returnvalue::OK) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,3 +97,12 @@ void ControllerBase::setTaskIF(PeriodicTaskIF* task_) { executingTask = task_; }
|
|||||||
void ControllerBase::changeHK(Mode_t mode_, Submode_t submode_, bool enable) {}
|
void ControllerBase::changeHK(Mode_t mode_, Submode_t submode_, bool enable) {}
|
||||||
|
|
||||||
ReturnValue_t ControllerBase::initializeAfterTaskCreation() { return returnvalue::OK; }
|
ReturnValue_t ControllerBase::initializeAfterTaskCreation() { return returnvalue::OK; }
|
||||||
|
|
||||||
|
const HasHealthIF* ControllerBase::getOptHealthIF() const { return this; }
|
||||||
|
|
||||||
|
const HasModesIF& ControllerBase::getModeIF() const { return *this; }
|
||||||
|
|
||||||
|
ReturnValue_t ControllerBase::connectModeTreeParent(HasModeTreeChildrenIF& parent,
|
||||||
|
const ModeTreeChildIF& child) {
|
||||||
|
return modetree::connectModeTreeParent(parent, child, healthHelper, modeHelper);
|
||||||
|
}
|
||||||
|
@ -6,6 +6,9 @@
|
|||||||
#include "fsfw/modes/HasModesIF.h"
|
#include "fsfw/modes/HasModesIF.h"
|
||||||
#include "fsfw/modes/ModeHelper.h"
|
#include "fsfw/modes/ModeHelper.h"
|
||||||
#include "fsfw/objectmanager/SystemObject.h"
|
#include "fsfw/objectmanager/SystemObject.h"
|
||||||
|
#include "fsfw/subsystem/HasModeTreeChildrenIF.h"
|
||||||
|
#include "fsfw/subsystem/ModeTreeChildIF.h"
|
||||||
|
#include "fsfw/subsystem/modes/ModeTreeConnectionIF.h"
|
||||||
#include "fsfw/tasks/ExecutableObjectIF.h"
|
#include "fsfw/tasks/ExecutableObjectIF.h"
|
||||||
#include "fsfw/tasks/PeriodicTaskIF.h"
|
#include "fsfw/tasks/PeriodicTaskIF.h"
|
||||||
|
|
||||||
@ -18,13 +21,18 @@
|
|||||||
class ControllerBase : public HasModesIF,
|
class ControllerBase : public HasModesIF,
|
||||||
public HasHealthIF,
|
public HasHealthIF,
|
||||||
public ExecutableObjectIF,
|
public ExecutableObjectIF,
|
||||||
|
public ModeTreeChildIF,
|
||||||
|
public ModeTreeConnectionIF,
|
||||||
public SystemObject {
|
public SystemObject {
|
||||||
public:
|
public:
|
||||||
static const Mode_t MODE_NORMAL = 2;
|
static const Mode_t MODE_NORMAL = 2;
|
||||||
|
|
||||||
ControllerBase(object_id_t setObjectId, object_id_t parentId, size_t commandQueueDepth = 3);
|
ControllerBase(object_id_t setObjectId, size_t commandQueueDepth = 3);
|
||||||
~ControllerBase() override;
|
~ControllerBase() override;
|
||||||
|
|
||||||
|
ReturnValue_t connectModeTreeParent(HasModeTreeChildrenIF &parent,
|
||||||
|
const ModeTreeChildIF &child) override;
|
||||||
|
|
||||||
/** SystemObject override */
|
/** SystemObject override */
|
||||||
ReturnValue_t initialize() override;
|
ReturnValue_t initialize() override;
|
||||||
|
|
||||||
@ -38,6 +46,8 @@ class ControllerBase : public HasModesIF,
|
|||||||
ReturnValue_t performOperation(uint8_t opCode) override;
|
ReturnValue_t performOperation(uint8_t opCode) override;
|
||||||
void setTaskIF(PeriodicTaskIF *task) override;
|
void setTaskIF(PeriodicTaskIF *task) override;
|
||||||
ReturnValue_t initializeAfterTaskCreation() override;
|
ReturnValue_t initializeAfterTaskCreation() override;
|
||||||
|
const HasHealthIF *getOptHealthIF() const override;
|
||||||
|
const HasModesIF &getModeIF() const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
@ -56,8 +66,6 @@ class ControllerBase : public HasModesIF,
|
|||||||
ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode,
|
ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode,
|
||||||
uint32_t *msToReachTheMode) override = 0;
|
uint32_t *msToReachTheMode) override = 0;
|
||||||
|
|
||||||
const object_id_t parentId;
|
|
||||||
|
|
||||||
Mode_t mode;
|
Mode_t mode;
|
||||||
|
|
||||||
Submode_t submode;
|
Submode_t submode;
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
#include "fsfw/controller/ExtendedControllerBase.h"
|
#include "fsfw/controller/ExtendedControllerBase.h"
|
||||||
|
|
||||||
ExtendedControllerBase::ExtendedControllerBase(object_id_t objectId, object_id_t parentId,
|
ExtendedControllerBase::ExtendedControllerBase(object_id_t objectId, size_t commandQueueDepth)
|
||||||
size_t commandQueueDepth)
|
: ControllerBase(objectId, commandQueueDepth),
|
||||||
: ControllerBase(objectId, parentId, commandQueueDepth),
|
|
||||||
poolManager(this, commandQueue),
|
poolManager(this, commandQueue),
|
||||||
actionHelper(this, commandQueue) {}
|
actionHelper(this, commandQueue) {}
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ class ExtendedControllerBase : public ControllerBase,
|
|||||||
public HasActionsIF,
|
public HasActionsIF,
|
||||||
public HasLocalDataPoolIF {
|
public HasLocalDataPoolIF {
|
||||||
public:
|
public:
|
||||||
ExtendedControllerBase(object_id_t objectId, object_id_t parentId, size_t commandQueueDepth = 3);
|
ExtendedControllerBase(object_id_t objectId, size_t commandQueueDepth = 3);
|
||||||
~ExtendedControllerBase() override;
|
~ExtendedControllerBase() override;
|
||||||
|
|
||||||
/* SystemObjectIF overrides */
|
/* SystemObjectIF overrides */
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
target_sources(${LIB_FSFW_NAME} PRIVATE Subsystem.cpp SubsystemBase.cpp)
|
target_sources(${LIB_FSFW_NAME} PRIVATE Subsystem.cpp SubsystemBase.cpp
|
||||||
|
helper.cpp)
|
||||||
|
|
||||||
add_subdirectory(modes)
|
add_subdirectory(modes)
|
||||||
|
13
src/fsfw/subsystem/HasModeTreeChildrenIF.h
Normal file
13
src/fsfw/subsystem/HasModeTreeChildrenIF.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef FSFW_SUBSYSTEM_HASMODETREECHILDRENIF_H_
|
||||||
|
#define FSFW_SUBSYSTEM_HASMODETREECHILDRENIF_H_
|
||||||
|
|
||||||
|
#include "ModeTreeChildIF.h"
|
||||||
|
|
||||||
|
class HasModeTreeChildrenIF {
|
||||||
|
public:
|
||||||
|
virtual ~HasModeTreeChildrenIF() = default;
|
||||||
|
virtual ReturnValue_t registerChild(const ModeTreeChildIF& child) = 0;
|
||||||
|
virtual MessageQueueId_t getCommandQueue() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FSFW_SUBSYSTEM_HASMODETREECHILDRENIF_H_
|
15
src/fsfw/subsystem/ModeTreeChildIF.h
Normal file
15
src/fsfw/subsystem/ModeTreeChildIF.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef FSFW_SUBSYSTEM_MODETREECHILDIF_H_
|
||||||
|
#define FSFW_SUBSYSTEM_MODETREECHILDIF_H_
|
||||||
|
|
||||||
|
#include <fsfw/health/HasHealthIF.h>
|
||||||
|
#include <fsfw/modes/HasModesIF.h>
|
||||||
|
|
||||||
|
class ModeTreeChildIF {
|
||||||
|
public:
|
||||||
|
virtual ~ModeTreeChildIF() = default;
|
||||||
|
virtual object_id_t getObjectId() const = 0;
|
||||||
|
virtual const HasHealthIF* getOptHealthIF() const = 0;
|
||||||
|
virtual const HasModesIF& getModeIF() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* FSFW_SUBSYSTEM_MODETREECHILDIF_H_ */
|
@ -334,3 +334,20 @@ ReturnValue_t SubsystemBase::setHealth(HealthState health) {
|
|||||||
HasHealthIF::HealthState SubsystemBase::getHealth() { return healthHelper.getHealth(); }
|
HasHealthIF::HealthState SubsystemBase::getHealth() { return healthHelper.getHealth(); }
|
||||||
|
|
||||||
void SubsystemBase::modeChanged() {}
|
void SubsystemBase::modeChanged() {}
|
||||||
|
|
||||||
|
ReturnValue_t SubsystemBase::registerChild(const ModeTreeChildIF& child) {
|
||||||
|
ChildInfo info;
|
||||||
|
|
||||||
|
const HasModesIF& modeChild = child.getModeIF();
|
||||||
|
// intentional to force an initial command during system startup
|
||||||
|
info.commandQueue = modeChild.getCommandQueue();
|
||||||
|
info.mode = HasModesIF::MODE_UNDEFINED;
|
||||||
|
info.submode = SUBMODE_NONE;
|
||||||
|
info.healthChanged = false;
|
||||||
|
|
||||||
|
auto resultPair = childrenMap.emplace(child.getObjectId(), info);
|
||||||
|
if (not resultPair.second) {
|
||||||
|
return COULD_NOT_INSERT_CHILD;
|
||||||
|
}
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
@ -3,14 +3,15 @@
|
|||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include "../container/HybridIterator.h"
|
#include "fsfw/container/HybridIterator.h"
|
||||||
#include "../health/HasHealthIF.h"
|
#include "fsfw/health/HasHealthIF.h"
|
||||||
#include "../health/HealthHelper.h"
|
#include "fsfw/health/HealthHelper.h"
|
||||||
#include "../ipc/MessageQueueIF.h"
|
#include "fsfw/ipc/MessageQueueIF.h"
|
||||||
#include "../modes/HasModesIF.h"
|
#include "fsfw/modes/HasModesIF.h"
|
||||||
#include "../objectmanager/SystemObject.h"
|
#include "fsfw/objectmanager/SystemObject.h"
|
||||||
#include "../returnvalues/returnvalue.h"
|
#include "fsfw/returnvalues/returnvalue.h"
|
||||||
#include "../tasks/ExecutableObjectIF.h"
|
#include "fsfw/subsystem/HasModeTreeChildrenIF.h"
|
||||||
|
#include "fsfw/tasks/ExecutableObjectIF.h"
|
||||||
#include "modes/HasModeSequenceIF.h"
|
#include "modes/HasModeSequenceIF.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -27,6 +28,7 @@
|
|||||||
class SubsystemBase : public SystemObject,
|
class SubsystemBase : public SystemObject,
|
||||||
public HasModesIF,
|
public HasModesIF,
|
||||||
public HasHealthIF,
|
public HasHealthIF,
|
||||||
|
public HasModeTreeChildrenIF,
|
||||||
public ExecutableObjectIF {
|
public ExecutableObjectIF {
|
||||||
public:
|
public:
|
||||||
static const uint8_t INTERFACE_ID = CLASS_ID::SUBSYSTEM_BASE;
|
static const uint8_t INTERFACE_ID = CLASS_ID::SUBSYSTEM_BASE;
|
||||||
@ -129,6 +131,8 @@ class SubsystemBase : public SystemObject,
|
|||||||
|
|
||||||
virtual void performChildOperation() = 0;
|
virtual void performChildOperation() = 0;
|
||||||
|
|
||||||
|
ReturnValue_t registerChild(const ModeTreeChildIF &child) override;
|
||||||
|
|
||||||
virtual ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode,
|
virtual ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode,
|
||||||
uint32_t *msToReachTheMode) override = 0;
|
uint32_t *msToReachTheMode) override = 0;
|
||||||
|
|
||||||
|
13
src/fsfw/subsystem/helper.cpp
Normal file
13
src/fsfw/subsystem/helper.cpp
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#include "helper.h"
|
||||||
|
|
||||||
|
ReturnValue_t modetree::connectModeTreeParent(HasModeTreeChildrenIF& parent,
|
||||||
|
const ModeTreeChildIF& child,
|
||||||
|
HealthHelper& healthHelper, ModeHelper& modeHelper) {
|
||||||
|
ReturnValue_t result = parent.registerChild(child);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
healthHelper.setParentQueue(parent.getCommandQueue());
|
||||||
|
modeHelper.setParentQueue(parent.getCommandQueue());
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
14
src/fsfw/subsystem/helper.h
Normal file
14
src/fsfw/subsystem/helper.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#ifndef FSFW_SUBSYSTEM_HELPER_H_
|
||||||
|
#define FSFW_SUBSYSTEM_HELPER_H_
|
||||||
|
|
||||||
|
#include "HasModeTreeChildrenIF.h"
|
||||||
|
#include "fsfw/health/HealthHelper.h"
|
||||||
|
|
||||||
|
namespace modetree {
|
||||||
|
|
||||||
|
ReturnValue_t connectModeTreeParent(HasModeTreeChildrenIF& parent, const ModeTreeChildIF& child,
|
||||||
|
HealthHelper& healthHelper, ModeHelper& modeHelper);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* FSFW_SRC_FSFW_SUBSYSTEM_HELPER_H_ */
|
13
src/fsfw/subsystem/modes/ModeTreeConnectionIF.h
Normal file
13
src/fsfw/subsystem/modes/ModeTreeConnectionIF.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef FSFW_SUBSYSTEM_MODES_MODETREECONNECTIONIF_H_
|
||||||
|
#define FSFW_SUBSYSTEM_MODES_MODETREECONNECTIONIF_H_
|
||||||
|
|
||||||
|
#include "fsfw/subsystem/HasModeTreeChildrenIF.h"
|
||||||
|
|
||||||
|
class ModeTreeConnectionIF {
|
||||||
|
public:
|
||||||
|
virtual ~ModeTreeConnectionIF() = default;
|
||||||
|
virtual ReturnValue_t connectModeTreeParent(HasModeTreeChildrenIF &parent,
|
||||||
|
const ModeTreeChildIF &child) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* FSFW_SRC_FSFW_SUBSYSTEM_MODES_MODETREECONNECTIONIF_H_ */
|
@ -4,8 +4,8 @@
|
|||||||
#include <fsfw/objectmanager/ObjectManager.h>
|
#include <fsfw/objectmanager/ObjectManager.h>
|
||||||
#include <fsfw/serviceinterface/ServiceInterface.h>
|
#include <fsfw/serviceinterface/ServiceInterface.h>
|
||||||
|
|
||||||
TestController::TestController(object_id_t objectId, object_id_t parentId, size_t commandQueueDepth)
|
TestController::TestController(object_id_t objectId, size_t commandQueueDepth)
|
||||||
: ExtendedControllerBase(objectId, parentId, commandQueueDepth) {}
|
: ExtendedControllerBase(objectId, commandQueueDepth) {}
|
||||||
|
|
||||||
TestController::~TestController() {}
|
TestController::~TestController() {}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
class TestController : public ExtendedControllerBase {
|
class TestController : public ExtendedControllerBase {
|
||||||
public:
|
public:
|
||||||
TestController(object_id_t objectId, object_id_t parentId, size_t commandQueueDepth = 10);
|
TestController(object_id_t objectId, size_t commandQueueDepth = 10);
|
||||||
virtual ~TestController();
|
virtual ~TestController();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
Loading…
Reference in New Issue
Block a user