#include "EiveSystem.h" #include #include #include EiveSystem::EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables) : Subsystem(setObjectId, maxNumberOfSequences, maxNumberOfTables) { auto mqArgs = MqArgs(getObjectId(), static_cast(this)); eventQueue = QueueFactory::instance()->createMessageQueue(10, EventMessage::EVENT_MESSAGE_SIZE, &mqArgs); } 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); } void EiveSystem::performChildOperation() { handleEventMessages(); return Subsystem::performChildOperation(); } ReturnValue_t EiveSystem::initialize() { EventManagerIF* manager = ObjectManager::instance()->get(objects::EVENT_MANAGER); 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; ; } result = manager->subscribeToEvent(eventQueue->getId(), event::getEventId(acs::MULTIPLE_RW_INVALID)); if (result != returnvalue::OK) { sif::error << "AcsSubsystem: Subscribing for acs::MULTIPLE_RW_INVALID failed" << std::endl; } result = manager->subscribeToEvent(eventQueue->getId(), event::getEventId(acs::MEKF_INVALID_MODE_VIOLATION)); if (result != returnvalue::OK) { sif::error << "AcsSubsystem: Subscribing for acs::MULTIPLE_RW_INVALID failed" << std::endl; } return returnvalue::OK; } void EiveSystem::handleEventMessages() { EventMessage event; for (ReturnValue_t result = eventQueue->receiveMessage(&event); result == returnvalue::OK; result = eventQueue->receiveMessage(&event)) { ReturnValue_t status; switch (event.getMessageId()) { case EventMessage::EVENT_MESSAGE: if (event.getEvent() == acs::SAFE_RATE_VIOLATION) { CommandMessage msg; ModeMessage::setCmdModeMessage(msg, acs::AcsMode::SAFE, acs::SafeSubmode::DETUMBLE); status = commandQueue->sendMessage(commandQueue->getId(), &msg); if (result != returnvalue::OK) { sif::error << "AcsSubsystem: sending DETUMBLE mode cmd to self has failed" << std::endl; } } if (event.getEvent() == acs::SAFE_RATE_RECOVERY) { CommandMessage msg; ModeMessage::setCmdModeMessage(msg, acs::AcsMode::SAFE, acs::SafeSubmode::DEFAULT); status = commandQueue->sendMessage(commandQueue->getId(), &msg); if (status != returnvalue::OK) { sif::error << "AcsSubsystem: sending SAFE mode cmd to self has failed" << std::endl; } } break; default: sif::debug << "AcsSubsystem::performChildOperation: Did not subscribe " "to this event message" << std::endl; break; } } }