some more bugfixes
All checks were successful
EIVE/eive-obsw/pipeline/pr-develop This commit looks good

This commit is contained in:
Robin Müller 2023-01-10 15:04:49 +01:00
parent 6503778cd5
commit 557162fe8c
4 changed files with 58 additions and 54 deletions

View File

@ -41,6 +41,8 @@ ReturnValue_t PCDUHandler::performOperation(uint8_t counter) {
if (pg.getReadResult() == returnvalue::OK) { if (pg.getReadResult() == returnvalue::OK) {
if (switcherSet.p60Dock5VStack.value != switchState) { if (switcherSet.p60Dock5VStack.value != switchState) {
triggerEvent(power::SWITCH_HAS_CHANGED, switchState, pcdu::Switches::P60_DOCK_5V_STACK); triggerEvent(power::SWITCH_HAS_CHANGED, switchState, pcdu::Switches::P60_DOCK_5V_STACK);
MutexGuard mg(pwrMutex);
switchStates[pcdu::P60_DOCK_5V_STACK] = switchState;
} }
switcherSet.p60Dock5VStack.setValid(true); switcherSet.p60Dock5VStack.setValid(true);
switcherSet.p60Dock5VStack.value = switchState; switcherSet.p60Dock5VStack.value = switchState;
@ -178,23 +180,23 @@ void PCDUHandler::updatePdu2SwitchStates() {
} }
switcherSet.pdu2Switches.setValid(true); switcherSet.pdu2Switches.setValid(true);
MutexGuard mg(pwrMutex); MutexGuard mg(pwrMutex);
checkAndUpdateSwitch(pdu, Switches::PDU2_CH0_Q7S, pdu2CoreHk.outputEnables[Channels::Q7S]); checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH0_Q7S, pdu2CoreHk.outputEnables[Channels::Q7S]);
checkAndUpdateSwitch(pdu, Switches::PDU2_CH1_PL_PCDU_BATT_0_14V8, checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH1_PL_PCDU_BATT_0_14V8,
pdu2CoreHk.outputEnables[Channels::PAYLOAD_PCDU_CH1]); pdu2CoreHk.outputEnables[Channels::PAYLOAD_PCDU_CH1]);
checkAndUpdateSwitch(pdu, Switches::PDU2_CH2_RW_5V, pdu2CoreHk.outputEnables[Channels::RW]); checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH2_RW_5V, pdu2CoreHk.outputEnables[Channels::RW]);
checkAndUpdateSwitch(pdu, Switches::PDU2_CH3_TCS_BOARD_HEATER_IN_8V, checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH3_TCS_BOARD_HEATER_IN_8V,
pdu2CoreHk.outputEnables[Channels::TCS_HEATER_IN]); pdu2CoreHk.outputEnables[Channels::TCS_HEATER_IN]);
checkAndUpdateSwitch(pdu, Switches::PDU2_CH4_SUS_REDUNDANT_3V3, checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH4_SUS_REDUNDANT_3V3,
pdu2CoreHk.outputEnables[Channels::SUS_REDUNDANT]); pdu2CoreHk.outputEnables[Channels::SUS_REDUNDANT]);
checkAndUpdateSwitch(pdu, Switches::PDU2_CH5_DEPLOYMENT_MECHANISM_8V, checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH5_DEPLOYMENT_MECHANISM_8V,
pdu2CoreHk.outputEnables[Channels::DEPY_MECHANISM]); pdu2CoreHk.outputEnables[Channels::DEPY_MECHANISM]);
checkAndUpdateSwitch(pdu, Switches::PDU2_CH6_PL_PCDU_BATT_1_14V8, checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH6_PL_PCDU_BATT_1_14V8,
pdu2CoreHk.outputEnables[Channels::PAYLOAD_PCDU_CH6]); pdu2CoreHk.outputEnables[Channels::PAYLOAD_PCDU_CH6]);
checkAndUpdateSwitch(pdu, Switches::PDU2_CH7_ACS_BOARD_SIDE_B_3V3, checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH7_ACS_BOARD_SIDE_B_3V3,
pdu2CoreHk.outputEnables[Channels::ACS_B_SIDE]); pdu2CoreHk.outputEnables[Channels::ACS_B_SIDE]);
checkAndUpdateSwitch(pdu, Switches::PDU2_CH8_PAYLOAD_CAMERA, checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH8_PAYLOAD_CAMERA,
pdu2CoreHk.outputEnables[Channels::PAYLOAD_CAMERA]); pdu2CoreHk.outputEnables[Channels::PAYLOAD_CAMERA]);
if (firstSwitchInfoPdu2) { if (firstSwitchInfoPdu2) {
firstSwitchInfoPdu2 = false; firstSwitchInfoPdu2 = false;
} }
@ -215,23 +217,24 @@ void PCDUHandler::updatePdu1SwitchStates() {
} }
switcherSet.pdu1Switches.setValid(true); switcherSet.pdu1Switches.setValid(true);
MutexGuard mg(pwrMutex); MutexGuard mg(pwrMutex);
checkAndUpdateSwitch(pdu, Switches::PDU1_CH0_TCS_BOARD_3V3, checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH0_TCS_BOARD_3V3,
pdu1CoreHk.outputEnables[Channels::TCS_BOARD_3V3]); pdu1CoreHk.outputEnables[Channels::TCS_BOARD_3V3]);
checkAndUpdateSwitch(pdu, Switches::PDU1_CH1_SYRLINKS_12V, checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH1_SYRLINKS_12V,
pdu1CoreHk.outputEnables[Channels::SYRLINKS]); pdu1CoreHk.outputEnables[Channels::SYRLINKS]);
checkAndUpdateSwitch(pdu, Switches::PDU1_CH2_STAR_TRACKER_5V, checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH2_STAR_TRACKER_5V,
pdu1CoreHk.outputEnables[Channels::STR]); pdu1CoreHk.outputEnables[Channels::STR]);
checkAndUpdateSwitch(pdu, Switches::PDU1_CH3_MGT_5V, pdu1CoreHk.outputEnables[Channels::MGT]); checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH3_MGT_5V,
checkAndUpdateSwitch(pdu, Switches::PDU1_CH4_SUS_NOMINAL_3V3, pdu1CoreHk.outputEnables[Channels::MGT]);
pdu1CoreHk.outputEnables[Channels::SUS_NOMINAL]); checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH4_SUS_NOMINAL_3V3,
checkAndUpdateSwitch(pdu, Switches::PDU1_CH5_SOLAR_CELL_EXP_5V, pdu1CoreHk.outputEnables[Channels::SUS_NOMINAL]);
pdu1CoreHk.outputEnables[Channels::SOL_CELL_EXPERIMENT]); checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH5_SOLAR_CELL_EXP_5V,
checkAndUpdateSwitch(pdu, Switches::PDU1_CH6_PLOC_12V, pdu1CoreHk.outputEnables[Channels::SOL_CELL_EXPERIMENT]);
pdu1CoreHk.outputEnables[Channels::PLOC]); checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH6_PLOC_12V,
checkAndUpdateSwitch(pdu, Switches::PDU1_CH7_ACS_A_SIDE_3V3, pdu1CoreHk.outputEnables[Channels::PLOC]);
pdu1CoreHk.outputEnables[Channels::ACS_A_SIDE]); checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH7_ACS_A_SIDE_3V3,
checkAndUpdateSwitch(pdu, Switches::PDU1_CH8_UNOCCUPIED, pdu1CoreHk.outputEnables[Channels::ACS_A_SIDE]);
pdu1CoreHk.outputEnables[Channels::UNUSED]); checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH8_UNOCCUPIED,
pdu1CoreHk.outputEnables[Channels::UNUSED]);
if (firstSwitchInfoPdu1) { if (firstSwitchInfoPdu1) {
firstSwitchInfoPdu1 = false; firstSwitchInfoPdu1 = false;
} }
@ -450,8 +453,8 @@ LocalPoolDataSetBase* PCDUHandler::getDataSetHandle(sid_t sid) {
} }
} }
void PCDUHandler::checkAndUpdateSwitch(GOMSPACE::Pdu pdu, pcdu::Switches switchIdx, void PCDUHandler::checkAndUpdatePduSwitch(GOMSPACE::Pdu pdu, pcdu::Switches switchIdx,
uint8_t setValue) { uint8_t setValue) {
using namespace pcdu; using namespace pcdu;
if (switchStates[switchIdx] != setValue) { if (switchStates[switchIdx] != setValue) {
#if OBSW_INITIALIZE_SWITCHES == 1 #if OBSW_INITIALIZE_SWITCHES == 1

View File

@ -130,7 +130,7 @@ class PCDUHandler : public PowerSwitchIF,
*/ */
void updateHkTableDataset(store_address_t storeId, LocalPoolDataSetBase* dataset, void updateHkTableDataset(store_address_t storeId, LocalPoolDataSetBase* dataset,
CCSDSTime::CDS_short* datasetTimeStamp); CCSDSTime::CDS_short* datasetTimeStamp);
void checkAndUpdateSwitch(GOMSPACE::Pdu pdu, pcdu::Switches switchIdx, uint8_t setValue); void checkAndUpdatePduSwitch(GOMSPACE::Pdu pdu, pcdu::Switches switchIdx, uint8_t setValue);
}; };
#endif /* MISSION_DEVICES_PCDUHANDLER_H_ */ #endif /* MISSION_DEVICES_PCDUHANDLER_H_ */

View File

@ -9,6 +9,9 @@ ReturnValue_t Stack5VHandler::deviceToOn(StackCommander commander, bool updateSt
if (updateStates) { if (updateStates) {
updateInternalStates(); updateInternalStates();
} }
if (handlerState == HandlerState::SWITCH_PENDING) {
return BUSY;
}
if (switchIsOn) { if (switchIsOn) {
if (commander == StackCommander::PL_PCDU) { if (commander == StackCommander::PL_PCDU) {
plPcduIsOn = true; plPcduIsOn = true;
@ -17,10 +20,9 @@ ReturnValue_t Stack5VHandler::deviceToOn(StackCommander commander, bool updateSt
} }
return returnvalue::OK; return returnvalue::OK;
} }
if (handlerState == HandlerState::SWITCH_PENDING) {
return BUSY;
}
handlerState = HandlerState::SWITCH_PENDING; handlerState = HandlerState::SWITCH_PENDING;
targetState = true;
return switcher.sendSwitchCommand(stackSwitch, PowerSwitchIF::SWITCH_ON); return switcher.sendSwitchCommand(stackSwitch, PowerSwitchIF::SWITCH_ON);
} }
@ -29,6 +31,11 @@ ReturnValue_t Stack5VHandler::deviceToOff(StackCommander commander, bool updateS
if (updateStates) { if (updateStates) {
updateInternalStates(); updateInternalStates();
} }
// wait for our turn
if (handlerState == HandlerState::SWITCH_PENDING) {
return BUSY;
}
// If the switch is already off, we are done
if (not switchIsOn) { if (not switchIsOn) {
if (commander == StackCommander::PL_PCDU) { if (commander == StackCommander::PL_PCDU) {
plPcduIsOn = false; plPcduIsOn = false;
@ -37,14 +44,13 @@ ReturnValue_t Stack5VHandler::deviceToOff(StackCommander commander, bool updateS
} }
return returnvalue::OK; return returnvalue::OK;
} }
if (handlerState == HandlerState::SWITCH_PENDING) { // If one device is still on, do not turn off the switch
return BUSY;
}
if ((commander == StackCommander::PL_PCDU and radSensorIsOn) or if ((commander == StackCommander::PL_PCDU and radSensorIsOn) or
(commander == StackCommander::RAD_SENSOR and plPcduIsOn)) { (commander == StackCommander::RAD_SENSOR and plPcduIsOn)) {
return returnvalue::OK; return returnvalue::OK;
} }
handlerState = HandlerState::SWITCH_PENDING; handlerState = HandlerState::SWITCH_PENDING;
targetState = false;
return switcher.sendSwitchCommand(stackSwitch, PowerSwitchIF::SWITCH_OFF); return switcher.sendSwitchCommand(stackSwitch, PowerSwitchIF::SWITCH_OFF);
} }
@ -60,22 +66,16 @@ void Stack5VHandler::update() {
bool Stack5VHandler::updateInternalStates() { bool Stack5VHandler::updateInternalStates() {
if (switcher.getSwitchState(stackSwitch) == PowerSwitchIF::SWITCH_ON) { if (switcher.getSwitchState(stackSwitch) == PowerSwitchIF::SWITCH_ON) {
if (not switchIsOn) { if (handlerState == HandlerState::SWITCH_PENDING and targetState) {
if (handlerState == HandlerState::SWITCH_PENDING) { handlerState = HandlerState::IDLE;
handlerState = HandlerState::IDLE;
}
switchIsOn = true; switchIsOn = true;
} }
return true; return true;
} } else if (handlerState == HandlerState::SWITCH_PENDING and not targetState) {
if (switchIsOn) { handlerState = HandlerState::IDLE;
if (handlerState == HandlerState::SWITCH_PENDING) {
handlerState = HandlerState::IDLE;
}
switchIsOn = false; switchIsOn = false;
radSensorIsOn = false;
plPcduIsOn = false;
} }
radSensorIsOn = false;
plPcduIsOn = false;
return false; return false;
} }

View File

@ -23,6 +23,7 @@ class Stack5VHandler {
MutexIF* stackLock; MutexIF* stackLock;
PowerSwitchIF& switcher; PowerSwitchIF& switcher;
bool switchIsOn = false; bool switchIsOn = false;
bool targetState = false;
HandlerState handlerState = HandlerState::IDLE; HandlerState handlerState = HandlerState::IDLE;
bool radSensorIsOn = false; bool radSensorIsOn = false;
bool plPcduIsOn = false; bool plPcduIsOn = false;