fsfw/src/fsfw/action/SimpleActionHelper.cpp

84 lines
2.8 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);
2022-06-29 23:36:45 +02:00
ipcStore->deleteData(dataAddress);
return;
}
auto actionIter = actionMap.find(actionId);
if (actionIter == actionMap.end()){
CommandMessage reply;
ActionMessage::setStepReply(&reply, actionId, 0, HasActionsIF::INVALID_ACTION_ID);
queueToUse->sendMessage(commandedBy, &reply);
ipcStore->deleteData(dataAddress);
return;
}
Action* action = actionIter->second;
result = action->deSerialize(&dataPtr, &size, SerializeIF::Endianness::NETWORK);
2022-09-14 16:31:36 +02:00
if ((result != returnvalue::OK) or (size != 0)) {
2022-06-29 23:36:45 +02:00
CommandMessage reply;
ActionMessage::setStepReply(&reply, actionId, 0, HasActionsIF::INVALID_PARAMETERS);
queueToUse->sendMessage(commandedBy, &reply);
ipcStore->deleteData(dataAddress);
2022-02-02 10:29:30 +01:00
return;
}
2022-06-29 23:36:45 +02:00
result = action->handle();
2022-02-02 10:29:30 +01:00
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;
}
}