2020-08-13 20:53:35 +02:00
|
|
|
#include "HasModesIF.h"
|
|
|
|
#include "ModeHelper.h"
|
|
|
|
#include "../ipc/MessageQueueSenderIF.h"
|
2016-06-15 23:48:41 +02:00
|
|
|
|
|
|
|
ModeHelper::ModeHelper(HasModesIF *owner) :
|
|
|
|
theOneWhoCommandedAMode(0), commandedMode(HasModesIF::MODE_OFF), commandedSubmode(
|
|
|
|
HasModesIF::SUBMODE_NONE), owner(owner), parentQueueId(0), forced(
|
|
|
|
false) {
|
|
|
|
}
|
|
|
|
|
|
|
|
ModeHelper::~ModeHelper() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
ReturnValue_t ModeHelper::handleModeCommand(CommandMessage* message) {
|
|
|
|
CommandMessage reply;
|
|
|
|
Mode_t mode;
|
|
|
|
Submode_t submode;
|
|
|
|
switch (message->getCommand()) {
|
|
|
|
case ModeMessage::CMD_MODE_COMMAND_FORCED:
|
|
|
|
forced = true;
|
2018-07-12 16:29:32 +02:00
|
|
|
/* NO BREAK falls through*/
|
2016-06-15 23:48:41 +02:00
|
|
|
case ModeMessage::CMD_MODE_COMMAND: {
|
|
|
|
mode = ModeMessage::getMode(message);
|
|
|
|
submode = ModeMessage::getSubmode(message);
|
|
|
|
uint32_t timeout;
|
|
|
|
ReturnValue_t result = owner->checkModeCommand(mode, submode, &timeout);
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
ModeMessage::cantReachMode(&reply, result);
|
2018-07-12 16:29:32 +02:00
|
|
|
MessageQueueSenderIF::sendMessage(message->getSender(), &reply,
|
2016-06-15 23:48:41 +02:00
|
|
|
owner->getCommandQueue());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
//Free to start transition
|
|
|
|
theOneWhoCommandedAMode = message->getSender();
|
|
|
|
commandedMode = mode;
|
|
|
|
commandedSubmode = submode;
|
|
|
|
|
2020-09-15 16:58:38 +02:00
|
|
|
if ((parentQueueId != MessageQueueIF::NO_QUEUE)
|
2016-06-15 23:48:41 +02:00
|
|
|
&& (theOneWhoCommandedAMode != parentQueueId)) {
|
|
|
|
owner->setToExternalControl();
|
|
|
|
}
|
|
|
|
|
|
|
|
countdown.setTimeout(timeout);
|
|
|
|
|
|
|
|
owner->startTransition(mode, submode);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case ModeMessage::CMD_MODE_READ: {
|
|
|
|
owner->getMode(&mode, &submode);
|
|
|
|
ModeMessage::setModeMessage(&reply, ModeMessage::REPLY_MODE_REPLY, mode,
|
|
|
|
submode);
|
2018-07-12 16:29:32 +02:00
|
|
|
MessageQueueSenderIF::sendMessage(message->getSender(), &reply,
|
2016-06-15 23:48:41 +02:00
|
|
|
owner->getCommandQueue());
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case ModeMessage::CMD_MODE_ANNOUNCE:
|
|
|
|
owner->announceMode(false);
|
|
|
|
break;
|
|
|
|
case ModeMessage::CMD_MODE_ANNOUNCE_RECURSIVELY:
|
|
|
|
owner->announceMode(true);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
|
|
}
|
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
ReturnValue_t ModeHelper::initialize(MessageQueueId_t parentQueueId) {
|
|
|
|
setParentQueue(parentQueueId);
|
|
|
|
return initialize();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ModeHelper::modeChanged(Mode_t mode, Submode_t submode) {
|
|
|
|
forced = false;
|
|
|
|
CommandMessage reply;
|
2020-09-15 16:58:38 +02:00
|
|
|
if (theOneWhoCommandedAMode != MessageQueueIF::NO_QUEUE) {
|
2016-06-15 23:48:41 +02:00
|
|
|
if ((mode != commandedMode) || (submode != commandedSubmode)) {
|
|
|
|
ModeMessage::setModeMessage(&reply,
|
|
|
|
ModeMessage::REPLY_WRONG_MODE_REPLY, mode, submode);
|
|
|
|
} else {
|
|
|
|
ModeMessage::setModeMessage(&reply, ModeMessage::REPLY_MODE_REPLY,
|
|
|
|
mode, submode);
|
|
|
|
}
|
2018-07-12 16:29:32 +02:00
|
|
|
MessageQueueSenderIF::sendMessage(theOneWhoCommandedAMode, &reply,
|
2016-06-15 23:48:41 +02:00
|
|
|
owner->getCommandQueue());
|
|
|
|
}
|
|
|
|
if (theOneWhoCommandedAMode != parentQueueId
|
2020-09-15 16:58:38 +02:00
|
|
|
&& parentQueueId != MessageQueueIF::NO_QUEUE) {
|
2016-06-15 23:48:41 +02:00
|
|
|
ModeMessage::setModeMessage(&reply, ModeMessage::REPLY_MODE_INFO, mode,
|
|
|
|
submode);
|
2018-07-12 16:29:32 +02:00
|
|
|
MessageQueueSenderIF::sendMessage(parentQueueId, &reply, owner->getCommandQueue());
|
2016-06-15 23:48:41 +02:00
|
|
|
}
|
2020-09-15 16:58:38 +02:00
|
|
|
theOneWhoCommandedAMode = MessageQueueIF::NO_QUEUE;
|
2016-06-15 23:48:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void ModeHelper::startTimer(uint32_t timeoutMs) {
|
|
|
|
countdown.setTimeout(timeoutMs);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ModeHelper::setParentQueue(MessageQueueId_t parentQueueId) {
|
|
|
|
this->parentQueueId = parentQueueId;
|
|
|
|
}
|
|
|
|
|
|
|
|
ReturnValue_t ModeHelper::initialize(void) {
|
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ModeHelper::isTimedOut() {
|
|
|
|
return countdown.hasTimedOut();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ModeHelper::isForced() {
|
|
|
|
return forced;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ModeHelper::setForced(bool forced) {
|
|
|
|
this->forced = forced;
|
|
|
|
}
|