fsfw/src/fsfw/action/SimpleActionHelper.cpp

68 lines
2.2 KiB
C++
Raw Normal View History

2021-07-13 20:22:54 +02:00
#include "fsfw/action.h"
2020-10-29 13:27:41 +01:00
2022-02-02 10:29:30 +01:00
SimpleActionHelper::SimpleActionHelper(HasActionsIF* setOwner, MessageQueueIF* useThisQueue)
: ActionHelper(setOwner, useThisQueue), isExecuting(false) {}
2022-07-04 11:44:26 +02:00
SimpleActionHelper::~SimpleActionHelper() = default;
void SimpleActionHelper::step(ReturnValue_t result) {
2022-02-02 10:29:30 +01:00
// STEP_OFFESET is subtracted to compensate for adding offset in base
// method, which is not necessary here.
ActionHelper::step(stepCount - STEP_OFFSET, lastCommander, lastAction, result);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-02-02 10:29:30 +01:00
resetHelper();
}
}
void SimpleActionHelper::finish(ReturnValue_t result) {
2022-02-02 10:29:30 +01:00
ActionHelper::finish(lastCommander, lastAction, result);
resetHelper();
}
ReturnValue_t SimpleActionHelper::reportData(SerializeIF* data) {
2022-02-02 10:29:30 +01:00
return ActionHelper::reportData(lastCommander, lastAction, data);
}
void SimpleActionHelper::resetHelper() {
2022-02-02 10:29:30 +01:00
stepCount = 0;
isExecuting = false;
lastAction = 0;
lastCommander = 0;
}
2022-02-02 10:29:30 +01:00
void SimpleActionHelper::prepareExecution(MessageQueueId_t commandedBy, ActionId_t actionId,
store_address_t dataAddress) {
CommandMessage reply;
if (isExecuting) {
ipcStore->deleteData(dataAddress);
2022-02-02 10:29:30 +01:00
ActionMessage::setStepReply(&reply, actionId, 0, HasActionsIF::IS_BUSY);
queueToUse->sendMessage(commandedBy, &reply);
}
2022-07-04 11:44:26 +02:00
const uint8_t* dataPtr = nullptr;
2022-02-02 10:29:30 +01:00
size_t size = 0;
ReturnValue_t result = ipcStore->getData(dataAddress, &dataPtr, &size);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-02-02 10:29:30 +01:00
ActionMessage::setStepReply(&reply, actionId, 0, result);
queueToUse->sendMessage(commandedBy, &reply);
return;
}
lastCommander = commandedBy;
lastAction = actionId;
result = owner->executeAction(actionId, commandedBy, dataPtr, size);
ipcStore->deleteData(dataAddress);
switch (result) {
2022-08-16 01:08:26 +02:00
case returnvalue::OK:
2022-02-02 10:29:30 +01:00
isExecuting = true;
stepCount++;
break;
case HasActionsIF::EXECUTION_FINISHED:
2022-08-16 01:08:26 +02:00
ActionMessage::setCompletionReply(&reply, actionId, true, returnvalue::OK);
2022-02-02 10:29:30 +01:00
queueToUse->sendMessage(commandedBy, &reply);
break;
default:
2022-02-02 10:29:30 +01:00
ActionMessage::setStepReply(&reply, actionId, 0, result);
queueToUse->sendMessage(commandedBy, &reply);
break;
}
}