Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -rbdc44195e6d1ae202787520caad26c8abbc8b588 -r757d59e07e926f5a0a508a9dc0f0830a1f765827 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision bdc44195e6d1ae202787520caad26c8abbc8b588) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 757d59e07e926f5a0a508a9dc0f0830a1f765827) @@ -7,8 +7,8 @@ * * @file SelfTests.c * -* @author (last) James Walter Taylor -* @date (last) 26-Jul-2023 +* @author (last) Sean Nash +* @date (last) 19-Jul-2023 * * @author (original) Quang Nguyen * @date (original) 28-Jan-2021 @@ -113,6 +113,7 @@ static BOOL wetSelfTestsResult; ///< Result of wet self-tests. static WET_SELF_TESTS_STATE_T currentWetSelfTestsState; ///< Current state of the wet self-tests state machine. +static WET_SELF_TESTS_STATE_T checkpointWetSelfTestsState; ///< Checkpoint state of the wet self tests state machine. static U32 settleStartTime; ///< Wait for reservoir to settle start time. static U32 displacementStartTime; ///< Dialysate displacement starting time. static F32 fmdIntegratedVolume; ///< FMD integrated volume over displacement time. @@ -585,6 +586,7 @@ { wetSelfTestsResult = FALSE; currentWetSelfTestsState = WET_SELF_TESTS_START_STATE; + checkpointWetSelfTestsState = WET_SELF_TESTS_START_STATE; settleStartTime = 0; displacementStartTime = 0; fmdIntegratedVolume = 0.0; @@ -1665,7 +1667,7 @@ * The handleWetSelfTestSetupState function setup for bubble self-test * check. * @details Inputs: none - * @details Outputs: bubble detector self-test requested + * @details Outputs: bubble detector self-test requested, checkpointWetSelfTestsState * @return the next state of wet self-tests state machine *************************************************************************/ static WET_SELF_TESTS_STATE_T handleWetSelfTestSetupState( void ) @@ -1676,6 +1678,7 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { + checkpointWetSelfTestsState = WET_SELF_TESTS_BUBBLE_CHECK_STATE; state = WET_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); } @@ -1688,7 +1691,7 @@ * The handleWetSelfTestBubblesState function waiting for air bubble detectors * self-tests to finish. * @details Inputs: bubbleSelfTestStatus - * @details Outputs: none + * @details Outputs: checkpointWetSelfTestsState * @return the next state of wet self-tests state machine *************************************************************************/ static WET_SELF_TESTS_STATE_T handleWetSelfTestBubblesState( void ) @@ -1702,6 +1705,7 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { + checkpointWetSelfTestsState = WET_SELF_TESTS_BUBBLE_CHECK_STATE; state = WET_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); } @@ -1714,7 +1718,7 @@ * The handleWetSelfTestPrimeCheckState function checks arterial and venous * lines to make sure they are primed. * @details Inputs: Arterial and venous bubble detectors status - * @details Outputs: Test pass/fail + * @details Outputs: Test pass/fail, checkpointWetSelfTestsState * @return the next state of wet self-tests state machine *************************************************************************/ static WET_SELF_TESTS_STATE_T handleWetSelfTestPrimeCheckState( void ) @@ -1748,6 +1752,7 @@ } if ( TRUE == doesAlarmStatusIndicateStop() ) // WET_PRIME_TEST_FAILURE will force the self-tests to stop { + checkpointWetSelfTestsState = WET_SELF_TESTS_PRIME_CHECK_STATE; state = WET_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); } @@ -1796,7 +1801,7 @@ * self-test for blood leak detector. * @details Inputs: none * @details Outputs: bloodLeakDebubbleStartTimeMS, settleStartTime, - * isValvesSettingSent + * isValvesSettingSent, checkpointWetSelfTestsState * @return the next state of wet self-tests state machine *************************************************************************/ static WET_SELF_TESTS_STATE_T handleWetSelfTestBloodLeakDetectorState( void ) @@ -1833,6 +1838,7 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { + checkpointWetSelfTestsState = WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE; state = WET_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); } @@ -1845,7 +1851,7 @@ * The handleWetSelfTestStartFirstDisplacementState function setups the valves * and pumps to start first dialysate displacement. * @details Inputs: settleStartTime, isValvesSettingSent - * @details Outputs: isValvesSettingSent + * @details Outputs: isValvesSettingSent, checkpointWetSelfTestsState * @return the next state of wet self-tests state machine *************************************************************************/ static WET_SELF_TESTS_STATE_T handleWetSelfTestFirstDisplacementSetupState( void ) @@ -1878,6 +1884,7 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { + checkpointWetSelfTestsState = WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE; state = WET_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); } @@ -1890,7 +1897,7 @@ * The handleWetSelfTestFirstDisplacementState function handles the first * dialysate displacement from reservoir 1 to reservoir 2. * @details Inputs: displacementStartTime, fmdIntegratedVolume, settleStartTime - * @details Outputs: settleStartTime, displacementStartTime + * @details Outputs: settleStartTime, displacementStartTime, checkpointWetSelfTestsState * @return the next state of wet self-tests state machine *************************************************************************/ static WET_SELF_TESTS_STATE_T handleWetSelfTestFirstDisplacementState( void ) @@ -1923,6 +1930,7 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { + checkpointWetSelfTestsState = WET_SELF_TESTS_FIRST_DISPLACEMENT_STATE; state = WET_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); } @@ -1935,7 +1943,7 @@ * The handleWetSelfTestFirstDisplacementVerifyState function checks the load cell * readings and FMD integrated volume after the first dialysate displacement. * @details Inputs: settleStartTime, fmdIntegratedVolume - * @details Outputs: none + * @details Outputs: checkpointWetSelfTestsState * @return the next state of wet self-tests state machine *************************************************************************/ static WET_SELF_TESTS_STATE_T handleWetSelfTestFirstDisplacementVerifyState( void ) @@ -1985,6 +1993,7 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { + checkpointWetSelfTestsState = WET_SELF_TESTS_FIRST_DISPLACEMENT_VERIFY_STATE; state = WET_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); } @@ -1997,7 +2006,7 @@ * The handleWetSelfTestSecondDisplacementSetupState function setups the valves * and pumps to start second dialysate displacement. * @details Inputs: settleStartTime, isValvesSettingSent - * @details Outputs: isValvesSettingSent + * @details Outputs: isValvesSettingSent, checkpointWetSelfTestsState * @return the next state of wet self-tests state machine *************************************************************************/ static WET_SELF_TESTS_STATE_T handleWetSelfTestSecondDisplacementSetupState( void ) @@ -2030,6 +2039,7 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { + checkpointWetSelfTestsState = WET_SELF_TESTS_SECOND_DISPLACEMENT_SETUP_STATE; state = WET_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); } @@ -2042,7 +2052,7 @@ * The handleWetSelfTestSecondDisplacementState function handles the first * dialysate displacement from reservoir 2 to reservoir 1. * @details Inputs: displacementStartTime, fmdIntegratedVolume, settleStartTime - * @details Outputs: displacementStartTime + * @details Outputs: displacementStartTime, checkpointWetSelfTestsState * @return the next state of wet self-tests state machine *************************************************************************/ static WET_SELF_TESTS_STATE_T handleWetSelfTestSecondDisplacementState( void ) @@ -2073,6 +2083,7 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { + checkpointWetSelfTestsState = WET_SELF_TESTS_SECOND_DISPLACEMENT_STATE; state = WET_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); } @@ -2085,7 +2096,7 @@ * The handleWetSelfTestSecondDisplacementVerifyState function checks the load cell * readings and FMD integrated volume after the second dialysate displacement. * @details Inputs: settleStartTime, reservoirVolume[], reservoirs' weights - * @details Outputs: verify correctness of dialysate flow meter and load cell + * @details Outputs: verify correctness of dialysate flow meter and load cell, checkpointWetSelfTestsState * @return the next state of wet self-tests state machine *************************************************************************/ static WET_SELF_TESTS_STATE_T handleWetSelfTestSecondDisplacementVerifyState( void ) @@ -2135,6 +2146,7 @@ if ( TRUE == doesAlarmStatusIndicateStop() ) { + checkpointWetSelfTestsState = WET_SELF_TESTS_SECOND_DISPLACEMENT_VERIFY_STATE; state = WET_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); } @@ -2146,7 +2158,7 @@ * @brief * The handleWetSelfTestStoppedState function handles the stopped wet self-tests * operation. - * @details Inputs: selfTestsResumeRequested + * @details Inputs: selfTestsResumeRequested, checkpointWetSelfTestsState * @details Outputs: selfTestsResumeRequested, selfTestStartTime * @return the next state of wet self-tests state machine *************************************************************************/ @@ -2170,7 +2182,37 @@ selfTestStartTime = getMSTimerCount(); doorClosedRequired( TRUE, TRUE ); selfTestsResumeRequested = FALSE; - state = WET_SELF_TESTS_START_STATE; // TODO - should start state make sure there is sufficient/appropriate res volumes to restart wet self-tests? and if not, should it signal res mgmt to drain and fill R1 and R2 before resuming wet self-tests? + + switch( checkpointWetSelfTestsState ) + { + case WET_SELF_TESTS_BUBBLE_CHECK_SETUP_STATE: + case WET_SELF_TESTS_BUBBLE_CHECK_STATE: + case WET_SELF_TESTS_PRIME_CHECK_STATE: + case WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE: + state = WET_SELF_TESTS_START_STATE; + break; + + case WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE: + case WET_SELF_TESTS_FIRST_DISPLACEMENT_STATE: + state = WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE; + break; + + case WET_SELF_TESTS_FIRST_DISPLACEMENT_VERIFY_STATE: + state = WET_SELF_TESTS_SECOND_DISPLACEMENT_SETUP_STATE; + break; + + case WET_SELF_TESTS_SECOND_DISPLACEMENT_SETUP_STATE: + case WET_SELF_TESTS_SECOND_DISPLACEMENT_STATE: + state = WET_SELF_TESTS_SECOND_DISPLACEMENT_SETUP_STATE; + break; + + case WET_SELF_TESTS_SECOND_DISPLACEMENT_VERIFY_STATE: + case WET_SELF_TESTS_COMPLETE_STATE: + state = WET_SELF_TESTS_COMPLETE_STATE; + + default: + state = WET_SELF_TESTS_START_STATE; + } } return state;