Adaptions to make shared power lines possible #57
@ -71,7 +71,7 @@ bool AssemblyBase::handleChildrenChangedHealth() {
|
|||||||
if (iter == childrenMap.end()) {
|
if (iter == childrenMap.end()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
HealthState healthState = healthHelper.healthTable->getHealth(iter->first);
|
HealthState healthState = healthHelper.healthTable->getHealth(convertToDeviceObjectId(iter->first));
|
||||||
if (healthState == HasHealthIF::NEEDS_RECOVERY) {
|
if (healthState == HasHealthIF::NEEDS_RECOVERY) {
|
||||||
triggerEvent(TRYING_RECOVERY, iter->first, 0);
|
triggerEvent(TRYING_RECOVERY, iter->first, 0);
|
||||||
recoveryState = RECOVERY_STARTED;
|
recoveryState = RECOVERY_STARTED;
|
||||||
@ -92,9 +92,14 @@ void AssemblyBase::handleChildrenTransition() {
|
|||||||
if (commandsOutstanding <= 0) {
|
if (commandsOutstanding <= 0) {
|
||||||
switch (internalState) {
|
switch (internalState) {
|
||||||
case STATE_NEED_SECOND_STEP:
|
case STATE_NEED_SECOND_STEP:
|
||||||
|
{
|
||||||
internalState = STATE_SECOND_STEP;
|
internalState = STATE_SECOND_STEP;
|
||||||
commandChildren(targetMode, targetSubmode);
|
ReturnValue_t result = commandChildren(targetMode, targetSubmode);
|
||||||
|
if(result == NEED_SECOND_STEP) {
|
||||||
|
internalState = STATE_NEED_SECOND_STEP;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
case STATE_OVERWRITE_HEALTH: {
|
case STATE_OVERWRITE_HEALTH: {
|
||||||
internalState = STATE_SINGLE_STEP;
|
internalState = STATE_SINGLE_STEP;
|
||||||
ReturnValue_t result = commandChildren(mode, submode);
|
ReturnValue_t result = commandChildren(mode, submode);
|
||||||
@ -170,7 +175,7 @@ ReturnValue_t AssemblyBase::checkChildrenStateOff() {
|
|||||||
|
|
||||||
ReturnValue_t AssemblyBase::checkChildOff(uint32_t objectId) {
|
ReturnValue_t AssemblyBase::checkChildOff(uint32_t objectId) {
|
||||||
ChildInfo childInfo = childrenMap.find(objectId)->second;
|
ChildInfo childInfo = childrenMap.find(objectId)->second;
|
||||||
if (healthHelper.healthTable->isCommandable(objectId)) {
|
if (healthHelper.healthTable->isCommandable(convertToDeviceObjectId(objectId))) {
|
||||||
if (childInfo.submode != SUBMODE_NONE) {
|
if (childInfo.submode != SUBMODE_NONE) {
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
} else {
|
} else {
|
||||||
@ -227,7 +232,7 @@ bool AssemblyBase::checkAndHandleRecovery() {
|
|||||||
case RECOVERY_STARTED:
|
case RECOVERY_STARTED:
|
||||||
// The recovery was already start in #handleChildrenChangedHealth and we just need
|
// The recovery was already start in #handleChildrenChangedHealth and we just need
|
||||||
// to wait for an off time period.
|
// to wait for an off time period.
|
||||||
// TODO: make time period configurable
|
// The timeout can be defined by #setRecoveryWaitTimer
|
||||||
recoveryState = RECOVERY_WAIT;
|
recoveryState = RECOVERY_WAIT;
|
||||||
recoveryOffTimer.resetTimer();
|
recoveryOffTimer.resetTimer();
|
||||||
return true;
|
return true;
|
||||||
@ -264,7 +269,15 @@ void AssemblyBase::overwriteDeviceHealth(object_id_t objectId, HasHealthIF::Heal
|
|||||||
triggerEvent(OVERWRITING_HEALTH, objectId, oldHealth);
|
triggerEvent(OVERWRITING_HEALTH, objectId, oldHealth);
|
||||||
internalState = STATE_OVERWRITE_HEALTH;
|
internalState = STATE_OVERWRITE_HEALTH;
|
||||||
modeHelper.setForced(true);
|
modeHelper.setForced(true);
|
||||||
sendHealthCommand(childrenMap[objectId].commandQueue, EXTERNAL_CONTROL);
|
if(childrenMap.find(objectId) != childrenMap.end()) {
|
||||||
|
sendHealthCommand(childrenMap.at(objectId).commandQueue, EXTERNAL_CONTROL);
|
||||||
|
} else {
|
||||||
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||||
|
sif::debug << std::hex << SystemObject::getObjectId() << ": invalid mode table entry"
|
||||||
|
<< std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssemblyBase::triggerModeHelperEvents(Mode_t mode, Submode_t submode) {
|
void AssemblyBase::triggerModeHelperEvents(Mode_t mode, Submode_t submode) {
|
||||||
@ -274,3 +287,7 @@ void AssemblyBase::triggerModeHelperEvents(Mode_t mode, Submode_t submode) {
|
|||||||
triggerEvent(CHANGING_MODE, mode, submode);
|
triggerEvent(CHANGING_MODE, mode, submode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AssemblyBase::setRecoveryWaitTimer(uint32_t timeoutMS) {
|
||||||
|
recoveryOffTimer.setTimeout(timeoutMS);
|
||||||
|
}
|
||||||
|
@ -206,6 +206,8 @@ class AssemblyBase : public SubsystemBase {
|
|||||||
void overwriteDeviceHealth(object_id_t objectId, HasHealthIF::HealthState oldHealth);
|
void overwriteDeviceHealth(object_id_t objectId, HasHealthIF::HealthState oldHealth);
|
||||||
|
|
||||||
void triggerModeHelperEvents(Mode_t mode, Submode_t submode);
|
void triggerModeHelperEvents(Mode_t mode, Submode_t submode);
|
||||||
|
|
||||||
|
void setRecoveryWaitTimer(uint32_t timeoutMS);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* FSFW_DEVICEHANDLERS_ASSEMBLYBASE_H_ */
|
#endif /* FSFW_DEVICEHANDLERS_ASSEMBLYBASE_H_ */
|
||||||
|
@ -78,9 +78,9 @@ void SubsystemBase::executeTable(HybridIterator<ModeListEntry> tableIter, Submod
|
|||||||
submodeToCommand = targetSubmode;
|
submodeToCommand = targetSubmode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (healthHelper.healthTable->hasHealth(object)) {
|
if (healthHelper.healthTable->hasHealth(convertToDeviceObjectId(object))) {
|
||||||
|
|
||||||
switch (healthHelper.healthTable->getHealth(object)) {
|
switch (healthHelper.healthTable->getHealth(convertToDeviceObjectId(object))) {
|
||||||
case NEEDS_RECOVERY:
|
case NEEDS_RECOVERY:
|
||||||
case FAULTY:
|
case FAULTY:
|
||||||
case PERMANENT_FAULTY:
|
case PERMANENT_FAULTY:
|
||||||
@ -353,3 +353,7 @@ ReturnValue_t SubsystemBase::registerChild(object_id_t childObjectId, MessageQue
|
|||||||
}
|
}
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object_id_t SubsystemBase::convertToDeviceObjectId(object_id_t id) {
|
||||||
|
return id;
|
||||||
|
}
|
@ -153,6 +153,12 @@ class SubsystemBase : public SystemObject,
|
|||||||
virtual void announceMode(bool recursive) override;
|
virtual void announceMode(bool recursive) override;
|
||||||
|
|
||||||
virtual void modeChanged();
|
virtual void modeChanged();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Provides an adaptation point for the user to change an objectId into
|
||||||
|
* a different objectId.
|
||||||
|
*/
|
||||||
|
virtual object_id_t convertToDeviceObjectId(object_id_t id);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* FSFW_SUBSYSTEM_SUBSYSTEMBASE_H_ */
|
#endif /* FSFW_SUBSYSTEM_SUBSYSTEMBASE_H_ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user