impl proper NORMAL mode for MPSoC
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
This commit is contained in:
@ -8,22 +8,29 @@
|
||||
#include "fsfw/devicehandlers/FreshDeviceHandlerBase.h"
|
||||
#include "fsfw/ipc/MessageQueueIF.h"
|
||||
#include "fsfw/ipc/QueueFactory.h"
|
||||
#include "fsfw/ipc/messageQueueDefinitions.h"
|
||||
#include "fsfw/power/PowerSwitchIF.h"
|
||||
#include "fsfw/power/definitions.h"
|
||||
#include "fsfw/returnvalues/returnvalue.h"
|
||||
#include "fsfw/serialize/SerializeAdapter.h"
|
||||
#include "linux/payload/MpsocCommunication.h"
|
||||
#include "linux/payload/plocMpsocHelpers.h"
|
||||
#include "linux/payload/plocSupvDefs.h"
|
||||
#include "mission/power/gsDefs.h"
|
||||
|
||||
FreshMpsocHandler::FreshMpsocHandler(DhbConfig cfg, MpsocCommunication& comInterface,
|
||||
PlocMpsocSpecialComHelper& specialComHelper,
|
||||
Gpio uartIsolatorSwitch, object_id_t supervisorHandler)
|
||||
Gpio uartIsolatorSwitch, object_id_t supervisorHandler,
|
||||
PowerSwitchIF& powerSwitcher, power::Switch_t camSwitchId)
|
||||
: FreshDeviceHandlerBase(cfg),
|
||||
comInterface(comInterface),
|
||||
specialComHelper(specialComHelper),
|
||||
commandActionHelper(this),
|
||||
uartIsolatorSwitch(uartIsolatorSwitch),
|
||||
hkReport(this),
|
||||
supervisorHandler(supervisorHandler) {
|
||||
supervisorHandler(supervisorHandler),
|
||||
powerSwitcher(powerSwitcher),
|
||||
camSwitchId(camSwitchId) {
|
||||
commandActionHelperQueue = QueueFactory::instance()->createMessageQueue(10);
|
||||
eventQueue = QueueFactory::instance()->createMessageQueue(10);
|
||||
spParams.maxSize = sizeof(commandBuffer);
|
||||
@ -77,8 +84,13 @@ void FreshMpsocHandler::performDefaultDeviceOperation() {
|
||||
}
|
||||
}
|
||||
|
||||
// We checked the action queue beforehand, so action commands should always be performed
|
||||
// before normal commands.
|
||||
if (mode == MODE_NORMAL and not activeCmdInfo.pending) {
|
||||
// TODO: Take care of regular periodic commanding here.
|
||||
ReturnValue_t result = commandTcGetHkReport();
|
||||
if (result == returnvalue::OK) {
|
||||
commandInitHandling(mpsoc::TC_GET_HK_REPORT, MessageQueueIF::NO_QUEUE);
|
||||
}
|
||||
}
|
||||
|
||||
if (activeCmdInfo.pending and activeCmdInfo.cmdCountdown.hasTimedOut()) {
|
||||
@ -224,6 +236,11 @@ ReturnValue_t FreshMpsocHandler::checkModeCommand(Mode_t mode, Submode_t submode
|
||||
return HasModesIF::INVALID_SUBMODE;
|
||||
}
|
||||
}
|
||||
if (submode == mpsoc::Submode::SNAPSHOT and
|
||||
powerSwitcher.getSwitchState(camSwitchId) != PowerSwitchIF::SWITCH_ON) {
|
||||
triggerEvent(mpsoc::CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE);
|
||||
return HasModesIF::TRANS_NOT_ALLOWED;
|
||||
}
|
||||
*msToReachTheMode = MPSOC_MODE_CMD_TIMEOUT_MS;
|
||||
return returnvalue::OK;
|
||||
}
|
||||
@ -583,16 +600,20 @@ ReturnValue_t FreshMpsocHandler::executeRegularCmd(ActionId_t actionId,
|
||||
}
|
||||
|
||||
if (result == returnvalue::OK) {
|
||||
activeCmdInfo.start(actionId, commandedBy);
|
||||
/**
|
||||
* Flushing the receive buffer to make sure there are no data left from a faulty reply.
|
||||
*/
|
||||
comInterface.getComHelper().flushUartRxBuffer();
|
||||
commandInitHandling(actionId, commandedBy);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void FreshMpsocHandler::commandInitHandling(ActionId_t actionId, MessageQueueId_t commandedBy) {
|
||||
activeCmdInfo.start(actionId, commandedBy);
|
||||
/**
|
||||
* Flushing the receive buffer to make sure there are no data left from a faulty reply.
|
||||
*/
|
||||
comInterface.getComHelper().flushUartRxBuffer();
|
||||
}
|
||||
|
||||
ReturnValue_t FreshMpsocHandler::commandTcMemWrite(const uint8_t* commandData,
|
||||
size_t commandDataLen) {
|
||||
ReturnValue_t result = returnvalue::OK;
|
||||
@ -1229,7 +1250,9 @@ bool FreshMpsocHandler::handleHwShutdown() {
|
||||
supvTransitionCd.resetTimer();
|
||||
powerState = PowerState::PENDING_SHUTDOWN;
|
||||
} else {
|
||||
triggerEvent(mpsoc::SUPV_NOT_ON, 0);
|
||||
if ((this->mode != MODE_OFF) and (this->mode != MODE_UNDEFINED)) {
|
||||
triggerEvent(mpsoc::SUPV_NOT_ON, 0);
|
||||
}
|
||||
powerState = PowerState::DONE;
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
#include "fsfw/action/ActionMessage.h"
|
||||
#include "fsfw/action/CommandsActionsIF.h"
|
||||
#include "fsfw/devicehandlers/DeviceHandlerIF.h"
|
||||
#include "fsfw/devicehandlers/FreshDeviceHandlerBase.h"
|
||||
@ -5,6 +6,8 @@
|
||||
#include "fsfw/ipc/messageQueueDefinitions.h"
|
||||
#include "fsfw/modes/ModeMessage.h"
|
||||
#include "fsfw/objectmanager/SystemObjectIF.h"
|
||||
#include "fsfw/power/PowerSwitchIF.h"
|
||||
#include "fsfw/power/definitions.h"
|
||||
#include "fsfw/returnvalues/returnvalue.h"
|
||||
#include "fsfw_hal/linux/gpio/Gpio.h"
|
||||
#include "linux/payload/MpsocCommunication.h"
|
||||
@ -18,7 +21,8 @@ class FreshMpsocHandler : public FreshDeviceHandlerBase, public CommandsActionsI
|
||||
|
||||
FreshMpsocHandler(DhbConfig cfg, MpsocCommunication& comInterface,
|
||||
PlocMpsocSpecialComHelper& specialComHelper, Gpio uartIsolatorSwitch,
|
||||
object_id_t supervisorHandler);
|
||||
object_id_t supervisorHandler, PowerSwitchIF& powerSwitcher,
|
||||
power::Switch_t camSwitchId);
|
||||
|
||||
/**
|
||||
* Periodic helper executed function, implemented by child class.
|
||||
@ -128,6 +132,8 @@ class FreshMpsocHandler : public FreshDeviceHandlerBase, public CommandsActionsI
|
||||
TmMemReadReport tmMemReadReport;
|
||||
uint32_t lastReplySequenceCount = 0;
|
||||
uint8_t skipSupvCommandingToOn = false;
|
||||
PowerSwitchIF& powerSwitcher;
|
||||
power::Switch_t camSwitchId;
|
||||
|
||||
// HK manager abstract functions.
|
||||
LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override;
|
||||
@ -202,4 +208,5 @@ class FreshMpsocHandler : public FreshDeviceHandlerBase, public CommandsActionsI
|
||||
void commandSubmodeTransition();
|
||||
void commonSpecialComInit();
|
||||
void commonSpecialComStop();
|
||||
void commandInitHandling(ActionId_t actionId, MessageQueueId_t commandedBy);
|
||||
};
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "eive/eventSubsystemIds.h"
|
||||
#include "eive/resultClassIds.h"
|
||||
#include "fsfw/action/HasActionsIF.h"
|
||||
#include "fsfw/events/Event.h"
|
||||
#include "fsfw/returnvalues/returnvalue.h"
|
||||
#include "fsfw/serialize/SerializeAdapter.h"
|
||||
#include "fsfw/serialize/SerializeIF.h"
|
||||
@ -113,6 +114,9 @@ static const Event MPSOC_SHUTDOWN_FAILED = MAKE_EVENT(6, severity::HIGH);
|
||||
//! ON transition.
|
||||
static constexpr Event SUPV_NOT_ON = event::makeEvent(SUBSYSTEM_ID, 7, severity::LOW);
|
||||
static constexpr Event SUPV_REPLY_TIMEOUT = event::makeEvent(SUBSYSTEM_ID, 8, severity::LOW);
|
||||
//! [EXPORT] : [COMMENT] Camera must be commanded on first.
|
||||
static constexpr Event CAM_MUST_BE_ON_FOR_SNAPSHOT_MODE =
|
||||
event::makeEvent(SUBSYSTEM_ID, 9, severity::LOW);
|
||||
|
||||
enum ParamId : uint8_t { SKIP_SUPV_ON_COMMANDING = 0x01 };
|
||||
|
||||
|
Reference in New Issue
Block a user