Merge pull request 'Dual Side to Single Side Bugfix' (#497) from bugfix_dual_to_single_side into develop
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
Reviewed-on: #497 Reviewed-by: Marius Eggert <eggertm@irs.uni-stuttgart.de>
This commit is contained in:
commit
de4bf6dd55
@ -16,6 +16,11 @@ will consitute of a breaking change warranting a new major release:
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Fixed transition for dual power lane assemblies: When going from dual side submode to single side
|
||||||
|
submode, perform logical commanding first, similarly to when going to OFF mode.
|
||||||
|
|
||||||
# [v1.38.0] 2023-03-17
|
# [v1.38.0] 2023-03-17
|
||||||
|
|
||||||
eive-tmtc: v2.19.2
|
eive-tmtc: v2.19.2
|
||||||
|
@ -451,7 +451,12 @@ void AcsBoardPolling::gyroAdisHandler(GyroAdis& gyro) {
|
|||||||
cdHasTimedOut = gyro.countdown.hasTimedOut();
|
cdHasTimedOut = gyro.countdown.hasTimedOut();
|
||||||
mustPerformStartup = gyro.performStartup;
|
mustPerformStartup = gyro.performStartup;
|
||||||
}
|
}
|
||||||
if (mode == acs::SimpleSensorMode::NORMAL and cdHasTimedOut) {
|
if (mode == acs::SimpleSensorMode::OFF) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (not cdHasTimedOut) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (mustPerformStartup) {
|
if (mustPerformStartup) {
|
||||||
uint8_t regList[6];
|
uint8_t regList[6];
|
||||||
// Read configuration
|
// Read configuration
|
||||||
@ -540,7 +545,6 @@ void AcsBoardPolling::gyroAdisHandler(GyroAdis& gyro) {
|
|||||||
|
|
||||||
gyro.ownReply.data.temperatureRaw = (rawReply[16] << 8) | rawReply[17];
|
gyro.ownReply.data.temperatureRaw = (rawReply[16] << 8) | rawReply[17];
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void AcsBoardPolling::mgmLis3Handler(MgmLis3& mgm) {
|
void AcsBoardPolling::mgmLis3Handler(MgmLis3& mgm) {
|
||||||
ReturnValue_t result;
|
ReturnValue_t result;
|
||||||
|
@ -65,10 +65,7 @@ ReturnValue_t GyrAdis1650XHandler::buildTransitionDeviceCommand(DeviceCommandId_
|
|||||||
}
|
}
|
||||||
case (InternalState::SHUTDOWN): {
|
case (InternalState::SHUTDOWN): {
|
||||||
*id = adis1650x::REQUEST;
|
*id = adis1650x::REQUEST;
|
||||||
acs::Adis1650XRequest *request = reinterpret_cast<acs::Adis1650XRequest *>(cmdBuf.data());
|
return preparePeriodicRequest(acs::SimpleSensorMode::OFF);
|
||||||
request->mode = acs::SimpleSensorMode::OFF;
|
|
||||||
request->type = adisType;
|
|
||||||
return returnvalue::OK;
|
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
return NOTHING_TO_SEND;
|
return NOTHING_TO_SEND;
|
||||||
|
@ -34,10 +34,17 @@ void DualLaneAssemblyBase::performChildOperation() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DualLaneAssemblyBase::startTransition(Mode_t mode, Submode_t submode) {
|
void DualLaneAssemblyBase::startTransition(Mode_t mode, Submode_t submode) {
|
||||||
// doStartTransition(mode, submode);
|
|
||||||
using namespace duallane;
|
using namespace duallane;
|
||||||
pwrStateMachine.reset();
|
pwrStateMachine.reset();
|
||||||
if (mode != MODE_OFF) {
|
if (mode != MODE_OFF) {
|
||||||
|
// Special exception: A transition from dual side to single mode must be handled like
|
||||||
|
// going OFF.
|
||||||
|
if ((this->mode == MODE_ON or this->mode == DeviceHandlerIF::MODE_NORMAL) and
|
||||||
|
this->submode == DUAL_MODE and submode != DUAL_MODE) {
|
||||||
|
dualToSingleSideTransition = true;
|
||||||
|
AssemblyBase::startTransition(mode, submode);
|
||||||
|
return;
|
||||||
|
}
|
||||||
// If anything other than MODE_OFF is commanded, perform power state machine first
|
// If anything other than MODE_OFF is commanded, perform power state machine first
|
||||||
// Cache the target modes, required by power state machine
|
// Cache the target modes, required by power state machine
|
||||||
pwrStateMachine.start(mode, submode);
|
pwrStateMachine.start(mode, submode);
|
||||||
@ -75,9 +82,13 @@ ReturnValue_t DualLaneAssemblyBase::pwrStateMachineWrapper() {
|
|||||||
// Will be called for transitions to MODE_OFF, where everything is done after power switching
|
// Will be called for transitions to MODE_OFF, where everything is done after power switching
|
||||||
finishModeOp();
|
finishModeOp();
|
||||||
} else if (opCode == OpCodes::TO_NOT_OFF_DONE) {
|
} else if (opCode == OpCodes::TO_NOT_OFF_DONE) {
|
||||||
|
if (dualToSingleSideTransition) {
|
||||||
|
finishModeOp();
|
||||||
|
} else {
|
||||||
// Will be called for transitions from MODE_OFF to anything else, where the mode still has
|
// Will be called for transitions from MODE_OFF to anything else, where the mode still has
|
||||||
// to be commanded after power switching
|
// to be commanded after power switching
|
||||||
AssemblyBase::startTransition(targetMode, targetSubmode);
|
AssemblyBase::startTransition(targetMode, targetSubmode);
|
||||||
|
}
|
||||||
} else if (opCode == OpCodes::TIMEOUT_OCCURED) {
|
} else if (opCode == OpCodes::TIMEOUT_OCCURED) {
|
||||||
if (powerRetryCounter == 0) {
|
if (powerRetryCounter == 0) {
|
||||||
powerRetryCounter++;
|
powerRetryCounter++;
|
||||||
@ -118,6 +129,13 @@ void DualLaneAssemblyBase::handleModeReached() {
|
|||||||
// Ignore failures for now.
|
// Ignore failures for now.
|
||||||
pwrStateMachineWrapper();
|
pwrStateMachineWrapper();
|
||||||
} else {
|
} else {
|
||||||
|
// For dual to single side transition, devices should be logically off, but the switch
|
||||||
|
// handling still needs to be done.
|
||||||
|
if (dualToSingleSideTransition) {
|
||||||
|
pwrStateMachine.start(targetMode, targetSubmode);
|
||||||
|
pwrStateMachineWrapper();
|
||||||
|
return;
|
||||||
|
}
|
||||||
finishModeOp();
|
finishModeOp();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -229,6 +247,7 @@ void DualLaneAssemblyBase::finishModeOp() {
|
|||||||
pwrStateMachine.reset();
|
pwrStateMachine.reset();
|
||||||
powerRetryCounter = 0;
|
powerRetryCounter = 0;
|
||||||
tryingOtherSide = false;
|
tryingOtherSide = false;
|
||||||
|
dualToSingleSideTransition = false;
|
||||||
dualModeErrorSwitch = true;
|
dualModeErrorSwitch = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ class DualLaneAssemblyBase : public AssemblyBase, public ConfirmsFailuresIF {
|
|||||||
uint8_t powerRetryCounter = 0;
|
uint8_t powerRetryCounter = 0;
|
||||||
bool tryingOtherSide = false;
|
bool tryingOtherSide = false;
|
||||||
bool dualModeErrorSwitch = true;
|
bool dualModeErrorSwitch = true;
|
||||||
|
bool dualToSingleSideTransition = false;
|
||||||
duallane::Submodes defaultSubmode = duallane::Submodes::A_SIDE;
|
duallane::Submodes defaultSubmode = duallane::Submodes::A_SIDE;
|
||||||
|
|
||||||
enum RecoveryCustomStates {
|
enum RecoveryCustomStates {
|
||||||
|
Loading…
Reference in New Issue
Block a user