diff --git a/mission/devices/PCDUHandler.cpp b/mission/devices/PCDUHandler.cpp index 1553afe8..244cc6db 100644 --- a/mission/devices/PCDUHandler.cpp +++ b/mission/devices/PCDUHandler.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -15,6 +16,7 @@ PCDUHandler::PCDUHandler(object_id_t setObjectId, size_t cmdQueueSize) cmdQueueSize(cmdQueueSize) { commandQueue = QueueFactory::instance()->createMessageQueue( cmdQueueSize, MessageQueueMessage::MAX_MESSAGE_SIZE); + pwrMutex = MutexFactory::instance()->createMutex(); } PCDUHandler::~PCDUHandler() {} @@ -156,8 +158,9 @@ void PCDUHandler::updateHkTableDataset(store_address_t storeId, LocalPoolDataSet void PCDUHandler::updatePdu2SwitchStates() { using namespace pcduSwitches; - PoolReadGuard rf(&pdu2HkTableDataset); - if (rf.getReadResult() == RETURN_OK) { + PoolReadGuard rg(&pdu2HkTableDataset); + if (rg.getReadResult() == RETURN_OK) { + MutexGuard mg(pwrMutex); switchStates[Switches::PDU2_CH0_Q7S] = pdu2HkTableDataset.outEnabledQ7S.value; switchStates[Switches::PDU2_CH1_PL_PCDU_BATT_0_14V8] = pdu2HkTableDataset.outEnabledPlPCDUCh1.value; @@ -181,9 +184,10 @@ void PCDUHandler::updatePdu2SwitchStates() { } void PCDUHandler::updatePdu1SwitchStates() { - if (pdu1HkTableDataset.read() == RETURN_OK) { - using namespace pcduSwitches; - PoolReadGuard rf(&pdu1HkTableDataset); + using namespace pcduSwitches; + PoolReadGuard rg(&pdu1HkTableDataset); + if (rg.getReadResult() == RETURN_OK) { + MutexGuard mg(pwrMutex); switchStates[Switches::PDU1_CH0_TCS_BOARD_3V3] = pdu1HkTableDataset.outEnabledTCSBoard3V3.value; switchStates[Switches::PDU1_CH1_SYRLINKS_12V] = pdu1HkTableDataset.outEnabledSyrlinks.value; switchStates[Switches::PDU1_CH2_STAR_TRACKER_5V] = @@ -352,7 +356,10 @@ ReturnValue_t PCDUHandler::getSwitchState(uint8_t switchNr) const { sif::debug << "PCDUHandler::getSwitchState: Invalid switch number" << std::endl; return RETURN_FAILED; } - if (switchStates[switchNr] == 1) { + pwrMutex->lockMutex(); + uint8_t currentState = switchStates[switchNr]; + pwrMutex->unlockMutex(); + if (currentState == 1) { return PowerSwitchIF::SWITCH_ON; } else { return PowerSwitchIF::SWITCH_OFF; diff --git a/mission/devices/PCDUHandler.h b/mission/devices/PCDUHandler.h index c045ed03..126f486a 100644 --- a/mission/devices/PCDUHandler.h +++ b/mission/devices/PCDUHandler.h @@ -47,6 +47,7 @@ class PCDUHandler : public PowerSwitchIF, private: uint32_t pstIntervalMs = 0; + MutexIF* pwrMutex = nullptr; /** Housekeeping manager. Handles updates of local pool variables. */ LocalDataPoolManager poolManager; diff --git a/mission/devices/RadiationSensorHandler.h b/mission/devices/RadiationSensorHandler.h index cc5f4d4f..0061f296 100644 --- a/mission/devices/RadiationSensorHandler.h +++ b/mission/devices/RadiationSensorHandler.h @@ -2,9 +2,8 @@ #define MISSION_DEVICES_RADIATIONSENSORHANDLER_H_ #include -#include #include - +#include /** * @brief This is the device handler class for radiation sensor on the OBC IF Board. The diff --git a/mission/system/AcsBoardAssembly.cpp b/mission/system/AcsBoardAssembly.cpp index 3d695d8e..1f6ffb98 100644 --- a/mission/system/AcsBoardAssembly.cpp +++ b/mission/system/AcsBoardAssembly.cpp @@ -174,35 +174,36 @@ void AcsBoardAssembly::powerStateMachine(Mode_t mode, Submode_t submode) { if (state == States::IDLE or state == States::SWITCHING_POWER) { switchStateA = pwrSwitcher->getSwitchState(SWITCH_A); switchStateB = pwrSwitcher->getSwitchState(SWITCH_B); - if (mode == MODE_OFF) { - if (switchStateA == PowerSwitchIF::SWITCH_OFF and switchStateB == PowerSwitchIF::SWITCH_OFF) { - state = States::MODE_COMMANDING; - return; + } else { + return; + } + if (mode == MODE_OFF) { + if (switchStateA == PowerSwitchIF::SWITCH_OFF and switchStateB == PowerSwitchIF::SWITCH_OFF) { + state = States::MODE_COMMANDING; + return; + } + } else { + switch (submode) { + case (A_SIDE): { + if (switchStateA == PowerSwitchIF::SWITCH_ON and + switchStateB == PowerSwitchIF::SWITCH_OFF) { + state = States::MODE_COMMANDING; + return; + } + break; } - } else { - switch (submode) { - case (A_SIDE): { - if (switchStateA == PowerSwitchIF::SWITCH_ON and - switchStateB == PowerSwitchIF::SWITCH_OFF) { - state = States::MODE_COMMANDING; - return; - } - break; + case (B_SIDE): { + if (switchStateA == PowerSwitchIF::SWITCH_OFF and + switchStateB == PowerSwitchIF::SWITCH_ON) { + state = States::MODE_COMMANDING; + return; } - case (B_SIDE): { - if (switchStateA == PowerSwitchIF::SWITCH_OFF and - switchStateB == PowerSwitchIF::SWITCH_ON) { - state = States::MODE_COMMANDING; - return; - } - break; - } - case (DUAL_MODE): { - if (switchStateA == PowerSwitchIF::SWITCH_ON and - switchStateB == PowerSwitchIF::SWITCH_ON) { - state = States::MODE_COMMANDING; - return; - } + break; + } + case (DUAL_MODE): { + if (switchStateA == PowerSwitchIF::SWITCH_ON and switchStateB == PowerSwitchIF::SWITCH_ON) { + state = States::MODE_COMMANDING; + return; } } } diff --git a/mission/system/SusAssembly.cpp b/mission/system/SusAssembly.cpp index 21e5aa50..f34665d4 100644 --- a/mission/system/SusAssembly.cpp +++ b/mission/system/SusAssembly.cpp @@ -56,40 +56,61 @@ void SusAssembly::powerStateMachine(Mode_t mode, Submode_t submode) { ReturnValue_t switchStateNom = RETURN_OK; ReturnValue_t switchStateRed = RETURN_OK; if (state == States::IDLE or state == States::SWITCHING_POWER) { - switchStateNom = pwrSwitcher->getSwitchState(pcduSwitches::PDU1_CH4_SUS_NOMINAL_3V3); - switchStateRed = pwrSwitcher->getSwitchState(pcduSwitches::PDU2_CH4_SUS_REDUNDANT_3V3); - if (mode == MODE_OFF) { - if (switchStateNom == PowerSwitchIF::SWITCH_OFF and - switchStateRed == PowerSwitchIF::SWITCH_OFF) { - state = States::MODE_COMMANDING; - return; - } - } else { - switch (submode) { - case (NOMINAL): { - if (switchStateNom == PowerSwitchIF::SWITCH_ON and - switchStateRed == PowerSwitchIF::SWITCH_OFF) { - state = States::MODE_COMMANDING; - return; - } - break; + switchStateNom = pwrSwitcher->getSwitchState(SWITCH_NOM); + switchStateRed = pwrSwitcher->getSwitchState(SWITCH_RED); + } else { + return; + } + if (mode == MODE_OFF) { + if (switchStateNom == PowerSwitchIF::SWITCH_OFF and + switchStateRed == PowerSwitchIF::SWITCH_OFF) { + state = States::MODE_COMMANDING; + return; + } + } else { + if (state == States::IDLE) { + if (mode == MODE_OFF) { + if (switchStateNom != PowerSwitchIF::SWITCH_OFF) { + pwrSwitcher->sendSwitchCommand(SWITCH_NOM, false); } - case (REDUNDANT): { - if (switchStateNom == PowerSwitchIF::SWITCH_OFF and - switchStateRed == PowerSwitchIF::SWITCH_ON) { - state = States::MODE_COMMANDING; - return; - } - break; + if (switchStateRed != PowerSwitchIF::SWITCH_OFF) { + pwrSwitcher->sendSwitchCommand(SWITCH_RED, false); } - case (DUAL_MODE): { - if (switchStateNom == PowerSwitchIF::SWITCH_ON and - switchStateRed == PowerSwitchIF::SWITCH_ON) { - state = States::MODE_COMMANDING; - return; + } else { + switch (submode) { + case (NOMINAL): { + if (switchStateNom != PowerSwitchIF::SWITCH_ON) { + pwrSwitcher->sendSwitchCommand(SWITCH_NOM, true); + } + if (switchStateRed != PowerSwitchIF::SWITCH_OFF) { + pwrSwitcher->sendSwitchCommand(SWITCH_RED, false); + } + break; + } + case (REDUNDANT): { + if (switchStateRed != PowerSwitchIF::SWITCH_OFF) { + pwrSwitcher->sendSwitchCommand(SWITCH_RED, false); + } + if (switchStateNom != PowerSwitchIF::SWITCH_ON) { + pwrSwitcher->sendSwitchCommand(SWITCH_NOM, true); + } + break; + } + case (DUAL_MODE): { + if (switchStateNom != PowerSwitchIF::SWITCH_ON) { + pwrSwitcher->sendSwitchCommand(SWITCH_NOM, true); + } + if (switchStateRed != PowerSwitchIF::SWITCH_ON) { + pwrSwitcher->sendSwitchCommand(SWITCH_RED, true); + } + break; } } } + state = States::SWITCHING_POWER; + } + if (state == States::SWITCHING_POWER) { + // TODO: Could check for a timeout (temporal or cycles) here and resend command } } } diff --git a/mission/system/SusAssembly.h b/mission/system/SusAssembly.h index c09384fb..c7acdd87 100644 --- a/mission/system/SusAssembly.h +++ b/mission/system/SusAssembly.h @@ -1,6 +1,7 @@ #ifndef MISSION_SYSTEM_SUSASSEMBLY_H_ #define MISSION_SYSTEM_SUSASSEMBLY_H_ +#include #include struct SusAssHelper { @@ -25,7 +26,10 @@ class SusAssembly : AssemblyBase { private: enum class States { IDLE, SWITCHING_POWER, MODE_COMMANDING } state = States::IDLE; - + static constexpr pcduSwitches::Switches SWITCH_NOM = + pcduSwitches::Switches::PDU1_CH4_SUS_NOMINAL_3V3; + static constexpr pcduSwitches::Switches SWITCH_RED = + pcduSwitches::Switches::PDU2_CH4_SUS_REDUNDANT_3V3; FixedArrayList modeTable; SusAssHelper helper; diff --git a/tmtc b/tmtc index 37c1a68d..07601b73 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 37c1a68da1b465514e84403b06ce40d035e4ad88 +Subproject commit 07601b734eec162771251e8e5f5fae16d20f1655 diff --git a/unittest/mocks/EventManagerMock.h b/unittest/mocks/EventManagerMock.h index 84588a97..8e471b59 100644 --- a/unittest/mocks/EventManagerMock.h +++ b/unittest/mocks/EventManagerMock.h @@ -15,10 +15,12 @@ class EventManagerMock : public EventManager { void clearEventList(); bool isEventInEventList(object_id_t object, Event event); - bool isEventInEventList(object_id_t object, Event event, uint32_t parameter1, uint32_t parameter2); + bool isEventInEventList(object_id_t object, Event event, uint32_t parameter1, + uint32_t parameter2); bool isEventInEventList(object_id_t object, EventId_t eventId); - bool isEventInEventList(object_id_t object, EventId_t eventId, uint32_t parameter1, uint32_t parameter2); + bool isEventInEventList(object_id_t object, EventId_t eventId, uint32_t parameter1, + uint32_t parameter2); private: std::list eventList; diff --git a/unittest/mocks/HouseKeepingMock.cpp b/unittest/mocks/HouseKeepingMock.cpp index d2592c93..d6588b1b 100644 --- a/unittest/mocks/HouseKeepingMock.cpp +++ b/unittest/mocks/HouseKeepingMock.cpp @@ -2,7 +2,6 @@ #include - HouseKeepingMock::HouseKeepingMock() : SystemObject(objects::PUS_SERVICE_3_HOUSEKEEPING) {} MessageQueueId_t HouseKeepingMock::getHkQueue() const { return MessageQueueIF::NO_QUEUE; } \ No newline at end of file diff --git a/unittest/mocks/HouseKeepingMock.h b/unittest/mocks/HouseKeepingMock.h index 9cc933ed..6ad3e188 100644 --- a/unittest/mocks/HouseKeepingMock.h +++ b/unittest/mocks/HouseKeepingMock.h @@ -2,8 +2,8 @@ #define HOUSEKEEPINGMOCK_H_ #include -#include #include +#include class HouseKeepingMock : public SystemObject, public AcceptsHkPacketsIF { public: @@ -12,5 +12,4 @@ class HouseKeepingMock : public SystemObject, public AcceptsHkPacketsIF { virtual MessageQueueId_t getHkQueue() const; }; - #endif /*HOUSEKEEPINGMOCK_H_*/ \ No newline at end of file