eive-obsw/mission/system/objects/EiveSystem.cpp

123 lines
4.0 KiB
C++
Raw Normal View History

#include "EiveSystem.h"
2022-04-14 09:54:07 +02:00
2023-03-10 15:21:36 +01:00
#include <eive/objects.h>
2023-03-08 18:56:27 +01:00
#include <fsfw/events/EventManager.h>
#include <fsfw/ipc/QueueFactory.h>
2023-02-13 01:26:30 +01:00
#include <mission/acsDefs.h>
#include <mission/comDefs.h>
#include <mission/controller/controllerdefinitions/tcsCtrlDefs.h>
2023-02-13 01:26:30 +01:00
2022-09-29 19:40:00 +02:00
EiveSystem::EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences,
2022-04-14 09:54:07 +02:00
uint32_t maxNumberOfTables)
2023-03-08 18:56:27 +01:00
: Subsystem(setObjectId, maxNumberOfSequences, maxNumberOfTables) {
auto mqArgs = MqArgs(SubsystemBase::getObjectId(), static_cast<void*>(this));
2023-03-08 18:56:27 +01:00
eventQueue =
QueueFactory::instance()->createMessageQueue(10, EventMessage::EVENT_MESSAGE_SIZE, &mqArgs);
}
2023-02-13 01:26:30 +01:00
void EiveSystem::announceMode(bool recursive) {
const char* modeStr = "UNKNOWN";
switch (mode) {
case (acs::AcsMode::OFF): {
modeStr = "OFF";
break;
}
case (acs::AcsMode::SAFE): {
modeStr = "SAFE";
break;
}
case (acs::AcsMode::PTG_IDLE): {
modeStr = "POINTING IDLE";
break;
}
case (acs::AcsMode::PTG_INERTIAL): {
modeStr = "POINTING INERTIAL";
break;
}
case (acs::AcsMode::PTG_TARGET): {
modeStr = "POINTING TARGET";
break;
}
case (acs::AcsMode::PTG_TARGET_GS): {
modeStr = "POINTING TARGET GS";
break;
}
}
sif::info << "EIVE system is now in " << modeStr << " mode" << std::endl;
return Subsystem::announceMode(recursive);
}
2023-03-08 18:56:27 +01:00
void EiveSystem::performChildOperation() {
handleEventMessages();
return Subsystem::performChildOperation();
}
ReturnValue_t EiveSystem::initialize() {
auto* manager = ObjectManager::instance()->get<EventManagerIF>(objects::EVENT_MANAGER);
2023-03-08 18:56:27 +01:00
if (manager == nullptr) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "AcsSubsystem::initialize: Invalid event manager" << std::endl;
#endif
return ObjectManagerIF::CHILD_INIT_FAILED;
}
ReturnValue_t result = manager->registerListener(eventQueue->getId());
if (result != returnvalue::OK) {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "AcsSubsystem::registerListener: Failed to register as "
"listener"
<< std::endl;
#endif
return ObjectManagerIF::CHILD_INIT_FAILED;
}
manager->subscribeToEvent(eventQueue->getId(), event::getEventId(tcsCtrl::SYRLINKS_OVERHEATING));
manager->subscribeToEvent(eventQueue->getId(),
event::getEventId(tcsCtrl::PCDU_SYSTEM_OVERHEATING));
manager->subscribeToEvent(eventQueue->getId(), event::getEventId(tcsCtrl::OBC_OVERHEATING));
2023-03-10 15:21:36 +01:00
return Subsystem::initialize();
2023-03-08 18:56:27 +01:00
}
void EiveSystem::handleEventMessages() {
EventMessage event;
for (ReturnValue_t status = eventQueue->receiveMessage(&event); status == returnvalue::OK;
status = eventQueue->receiveMessage(&event)) {
2023-03-08 18:56:27 +01:00
switch (event.getMessageId()) {
case EventMessage::EVENT_MESSAGE:
switch (event.getEvent()) {
case tcsCtrl::SYRLINKS_OVERHEATING: {
CommandMessage msg;
ModeMessage::setCmdModeMessage(msg, com::RX_ONLY, 0);
ReturnValue_t result =
commandQueue->sendMessage(childrenMap[objects::COM_SUBSYSTEM].commandQueue, &msg);
if (result != returnvalue::OK) {
sif::error << "EiveSystem: Commanding COM to RX_ONLY failed" << std::endl;
}
break;
}
case tcsCtrl::OBC_OVERHEATING:
case tcsCtrl::PCDU_SYSTEM_OVERHEATING: {
commandSelfToSafe();
break;
}
}
2023-03-08 18:56:27 +01:00
break;
default:
sif::debug << "AcsSubsystem::performChildOperation: Did not subscribe "
"to this event message"
<< std::endl;
break;
}
}
}
void EiveSystem::commandSelfToSafe() {
if (fallbackCommandCd.hasTimedOut()) {
CommandMessage msg;
ModeMessage::setCmdModeMessage(msg, acs::AcsMode::SAFE, 0);
ReturnValue_t result = commandQueue->sendMessage(commandQueue->getId(), &msg);
if (result != returnvalue::OK) {
sif::error << "EiveSystem: Commanding EIVE-System to SAFE failed" << std::endl;
}
fallbackCommandCd.resetTimer();
}
}