Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -r38355442b06187fe5d57deca647b3adf2fa26b89 -re5167d0700038c1faf8b689b844a905f20c0d3c6 --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 38355442b06187fe5d57deca647b3adf2fa26b89) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision e5167d0700038c1faf8b689b844a905f20c0d3c6) @@ -151,7 +151,12 @@ break; case HD_FAULT_STATE_COMPLETE: - // Do nothing. Done with the NV operations + // Do nothing unless the test configuration to recover treatment is enabled + if ( ( TRUE == getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) ) && ( TRUE == hasRecoverFromFaultModeBeenSet() ) ) + { + HD_OP_MODE_T prevMode = getPreviousOperationMode(); + requestNewOperationMode( prevMode ); + } break; default: Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r82bd1d24c050e79690a7f5b236e49dd7db7e2a91 -re5167d0700038c1faf8b689b844a905f20c0d3c6 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 82bd1d24c050e79690a7f5b236e49dd7db7e2a91) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision e5167d0700038c1faf8b689b844a905f20c0d3c6) @@ -92,6 +92,7 @@ static BOOL doorOpened; ///< Flag indicates user has opened door (to invert dialyzer). static BOOL patientConnectionConfirm; ///< Flag indicates user has confirmed patient connection complete. static BOOL treatmentStartRequested; ///< Flag indicates user requests treatment begin. +static BOOL signalTestConfigRsrvrMgmtUse; ///< Flag indicates to use test configuration reservoir management. static BOOL alarmActionResumeReceived; ///< Flag indicates alarm action resume received. @@ -169,6 +170,7 @@ doorOpened = FALSE; patientConnectionConfirm = FALSE; treatmentStartRequested = FALSE; + signalTestConfigRsrvrMgmtUse = FALSE; submodeCompleteTransitionTimeCounter = 0; @@ -313,7 +315,7 @@ break; } - if ( getTestConfigStatus( TEST_CONFIG_EXPEDITE_PRE_TREATMENT ) != TRUE ) + if ( ( getTestConfigStatus( TEST_CONFIG_EXPEDITE_PRE_TREATMENT ) != TRUE ) && ( FALSE == signalTestConfigRsrvrMgmtUse ) ) { // Execute reservoir management for pre-treatment mode execPreTreatmentReservoirMgmt(); @@ -697,11 +699,18 @@ static void transitionToPatientConnection( void ) { VALVE_T valve; - setUFVolStatus = FALSE; - doorOpened = FALSE; - patientConnectionConfirm = FALSE; - treatmentStartRequested = FALSE; + setUFVolStatus = FALSE; + doorOpened = FALSE; + patientConnectionConfirm = FALSE; + treatmentStartRequested = FALSE; + // Signal the reservoir management to use the test configuration reservoir management to drain the reservoirs + // to target volume in case the inactive reservoir was filled to more than the target volume + // Set the reservoir management state machine to be start again. The reservoir management was set to + // complete at the end of the prime + signalTestConfigRsrvrMgmtUse = TRUE; + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_START_STATE; + doorClosedRequired( FALSE, TRUE ); for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r38355442b06187fe5d57deca647b3adf2fa26b89 -re5167d0700038c1faf8b689b844a905f20c0d3c6 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 38355442b06187fe5d57deca647b3adf2fa26b89) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision e5167d0700038c1faf8b689b844a905f20c0d3c6) @@ -207,16 +207,20 @@ *************************************************************************/ U32 transitionToTreatmentMode( void ) { - // Initialize treatment mode each time we transition to it - initTreatmentMode(); - initReservoirs(); - // Initialize treatment sub-modes each time we transition to treatment mode - initBloodPrime(); - initDialysis(); - initTreatmentStop(); - initRinseback(); - initTreatmentRecirc(); - initTreatmentEnd(); + if ( ( getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) != TRUE ) || ( getPreviousOperationMode() != DG_MODE_FAUL ) ) + { + // Initialize treatment mode each time we transition to it + initTreatmentMode(); + initReservoirs(); + // Initialize treatment sub-modes each time we transition to treatment mode + initBloodPrime(); + initDialysis(); + initTreatmentStop(); + initRinseback(); + initTreatmentRecirc(); + initTreatmentEnd(); + } + setCurrentSubState( NO_SUB_STATE ); // Enable venous bubble detection in treatment mode setVenousBubbleDetectionEnabled( TRUE ); Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r38355442b06187fe5d57deca647b3adf2fa26b89 -re5167d0700038c1faf8b689b844a905f20c0d3c6 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 38355442b06187fe5d57deca647b3adf2fa26b89) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision e5167d0700038c1faf8b689b844a905f20c0d3c6) @@ -144,8 +144,12 @@ // Any new mode requests? newMode = arbitrateModeRequest(); // Will return current mode if no pending requests - newMode = MODE_TRANSITION_TABLE[ currentMode ][ newMode ]; + if ( getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) != TRUE ) + { + newMode = MODE_TRANSITION_TABLE[ currentMode ][ newMode ]; + } + // Is requested new mode valid and legal at this time? if ( newMode >= MODE_NLEG ) { Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -rbf44edd28c59df78a75165764b6b654f2e91e556 -re5167d0700038c1faf8b689b844a905f20c0d3c6 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision bf44edd28c59df78a75165764b6b654f2e91e556) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision e5167d0700038c1faf8b689b844a905f20c0d3c6) @@ -1773,6 +1773,10 @@ handleTestHDSetTestConfig( message ); break; + case MSG_ID_HD_SIGNAL_RECOVER_FROM_FAULT_MODE: + handleTestHDSetRecoverFromFaultModeSignal( message ); + break; + // The default cannot be reached in VectorCAST since the cases are run in a for loop default: // Unrecognized message ID received - ignore Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rbf44edd28c59df78a75165764b6b654f2e91e556 -re5167d0700038c1faf8b689b844a905f20c0d3c6 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision bf44edd28c59df78a75165764b6b654f2e91e556) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision e5167d0700038c1faf8b689b844a905f20c0d3c6) @@ -8226,4 +8226,28 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, status ); } +/*********************************************************************//** + * @brief + * The handleTestHDSetRecoverFromFaultModeSignal function handles a request to + * set the signal to recover from the fault mode. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestHDSetRecoverFromFaultModeSignal( MESSAGE_T* message ) +{ + BOOL status = FALSE; + + if ( 0 == message->hdr.payloadLen ) + { + status = TRUE; + + setRecoverFromFaultModeSignal(); + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, status ); +} + /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -rbf44edd28c59df78a75165764b6b654f2e91e556 -re5167d0700038c1faf8b689b844a905f20c0d3c6 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision bf44edd28c59df78a75165764b6b654f2e91e556) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision e5167d0700038c1faf8b689b844a905f20c0d3c6) @@ -986,6 +986,9 @@ // MSG_ID_HD_SET_TEST_CONFIGURATION void handleTestHDSetTestConfig( MESSAGE_T *message ); +// MSG_ID_HD_SIGNAL_RECOVER_FROM_FAULT_MODE +void handleTestHDSetRecoverFromFaultModeSignal( MESSAGE_T* message ); + /**@}*/ #endif