fsfw/src/fsfw/controller/ExtendedControllerBase.cpp

96 lines
2.9 KiB
C++
Raw Normal View History

2021-07-13 20:22:54 +02:00
#include "fsfw/controller/ExtendedControllerBase.h"
2020-10-12 15:40:27 +02:00
2022-02-02 10:29:30 +01:00
ExtendedControllerBase::ExtendedControllerBase(object_id_t objectId, object_id_t parentId,
size_t commandQueueDepth)
: ControllerBase(objectId, parentId, commandQueueDepth),
poolManager(this, commandQueue),
actionHelper(this, commandQueue) {}
2020-10-12 15:40:27 +02:00
ExtendedControllerBase::~ExtendedControllerBase() = default;
2021-02-03 22:23:31 +01:00
2022-07-28 16:13:01 +02:00
ActionHelper *ExtendedControllerBase::getActionHelper() {
return &actionHelper;
}
2022-07-20 16:59:42 +02:00
ReturnValue_t ExtendedControllerBase::executeAction(Action *action) {
2022-07-28 16:13:01 +02:00
return action->handle();
2020-10-12 15:40:27 +02:00
}
2022-02-02 10:29:30 +01:00
object_id_t ExtendedControllerBase::getObjectId() const { return SystemObject::getObjectId(); }
2020-10-12 15:40:27 +02:00
uint32_t ExtendedControllerBase::getPeriodicOperationFrequency() const {
2022-02-02 10:29:30 +01:00
return this->executingTask->getPeriodMs();
2020-10-12 15:40:27 +02:00
}
2022-02-02 10:29:30 +01:00
ReturnValue_t ExtendedControllerBase::handleCommandMessage(CommandMessage *message) {
ReturnValue_t result = actionHelper.handleActionMessage(message);
2022-08-16 01:08:26 +02:00
if (result == returnvalue::OK) {
2022-02-02 10:29:30 +01:00
return result;
}
return poolManager.handleHousekeepingMessage(message);
2020-10-12 15:40:27 +02:00
}
void ExtendedControllerBase::handleQueue() {
2022-02-02 10:29:30 +01:00
CommandMessage command;
ReturnValue_t result;
2022-08-16 01:08:26 +02:00
for (result = commandQueue->receiveMessage(&command); result == returnvalue::OK;
2022-02-02 10:29:30 +01:00
result = commandQueue->receiveMessage(&command)) {
result = actionHelper.handleActionMessage(&command);
2022-08-16 01:08:26 +02:00
if (result == returnvalue::OK) {
2022-02-02 10:29:30 +01:00
continue;
2020-10-12 15:40:27 +02:00
}
2022-02-02 10:29:30 +01:00
result = modeHelper.handleModeCommand(&command);
2022-08-16 01:08:26 +02:00
if (result == returnvalue::OK) {
2022-02-02 10:29:30 +01:00
continue;
2020-10-12 15:40:27 +02:00
}
2022-02-02 10:29:30 +01:00
result = healthHelper.handleHealthCommand(&command);
2022-08-16 01:08:26 +02:00
if (result == returnvalue::OK) {
2022-02-02 10:29:30 +01:00
continue;
2020-10-12 15:40:27 +02:00
}
2022-02-02 10:29:30 +01:00
result = poolManager.handleHousekeepingMessage(&command);
2022-08-16 01:08:26 +02:00
if (result == returnvalue::OK) {
2022-02-02 10:29:30 +01:00
continue;
}
result = handleCommandMessage(&command);
2022-08-16 01:08:26 +02:00
if (result == returnvalue::OK) {
2022-02-02 10:29:30 +01:00
continue;
}
command.setToUnknownCommand();
commandQueue->reply(&command);
}
}
ReturnValue_t ExtendedControllerBase::initialize() {
ReturnValue_t result = ControllerBase::initialize();
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-02-02 10:29:30 +01:00
return result;
}
result = actionHelper.initialize(commandQueue);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-02-02 10:29:30 +01:00
return result;
}
return poolManager.initialize(commandQueue);
2020-10-12 15:40:27 +02:00
}
ReturnValue_t ExtendedControllerBase::initializeAfterTaskCreation() {
2022-02-02 10:29:30 +01:00
return poolManager.initializeAfterTaskCreation();
2020-10-12 15:40:27 +02:00
}
ReturnValue_t ExtendedControllerBase::performOperation(uint8_t opCode) {
2022-02-02 10:29:30 +01:00
handleQueue();
performControlOperation();
/* We do this after performing control operation because variables will be set changed
in this function. */
poolManager.performHkOperation();
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
2020-10-12 15:40:27 +02:00
}
2022-02-02 10:29:30 +01:00
MessageQueueId_t ExtendedControllerBase::getCommandQueue() const { return commandQueue->getId(); }
2020-10-12 15:40:27 +02:00
2022-02-02 10:29:30 +01:00
LocalDataPoolManager *ExtendedControllerBase::getHkManagerHandle() { return &poolManager; }