Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r8d14f6af0d1c2edd293a2157ed56b5e7e475d2df -r19fc8f015489be63932eed969d28329d123332e0 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 8d14f6af0d1c2edd293a2157ed56b5e7e475d2df) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 19fc8f015489be63932eed969d28329d123332e0) @@ -49,7 +49,7 @@ typedef enum No_Cart_Self_Tests_State { NO_CART_SELF_TESTS_START_STATE = 0, ///< No cartridge self-tests starting state. - NO_CART_SELF_TESTS_WAIT_FOR_CLOSED_DOOR, ///< Wait for door to be closed before running self-tests. + NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE, ///< Wait for door to be closed before running self-tests. NO_CART_SELF_TESTS_OCCLUSION_SENSORS_STATE, ///< No cartridge occlusion sensors self-test state. NO_CART_SELF_TESTS_BLOOD_FLOW_METERS_STATE, ///< No cartridge blood flow meter self-test state. NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS_STATE, ///< No cartridge dialysate flow meter self-test state. @@ -59,6 +59,7 @@ NO_CART_SELF_TESTS_DOOR_SWITCH_STATE, ///< No cartridge door switch self-test state. NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE, ///< No cartridge home valves and pumps self-test state. NO_CART_SELF_TESTS_HOME_IDLE_STATE, ///< Wait for valves and pumps finish homing state. + NO_CART_SELF_TESTS_STOPPED, ///< No cart self-test stopped state. NO_CART_SELF_TESTS_COMPLETE, ///< No cartridge self-test complete state. NUM_OF_NO_CART_SELF_TESTS_STATES ///< Number of no cartridge self-tests states. } NO_CART_SELF_TESTS_STATE_T; @@ -67,12 +68,14 @@ typedef enum Dry_Self_Tests_State { DRY_SELF_TESTS_START_STATE = 0, ///< Dry self-tests starting state. + DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE, ///< Wait for door to close before executing self-tests. DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE, ///< Bubble detectors dry self-test state. DRY_SELF_TESTS_AIR_TRAP_STATE, ///< Air trap fill level ultrasonic sensor dry self-test state. DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE, ///< Occlusion sensors dry self-test state. DRY_SELF_TESTS_PRESSURE_SENSORS_SETUP_STATE, ///< Pressure sensors dry self-test setup valves and pump state. DRY_SELF_TESTS_PRESSURE_SENSORS_STATE, ///< Pressure sensors verify pressure readings state. DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE, ///< Preassure sensors verify normal pressure readings state. + DRY_SELF_TESTS_STOPPED, ///< Dry self-test stopped state. DRY_SELF_TESTS_COMPLETE, ///< Dry self-test complete state. NUM_OF_DRY_SELF_TESTS_STATES ///< Number of dry self-tests states. } DRY_SELF_TESTS_STATE_T; @@ -103,18 +106,28 @@ 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 BOOL selfTestsResumeRequested; ///< Flag indicates user requesting self-tests resume. +static BOOL selfTestsStopRequested; ///< Flag indicates alarm requesting to stop self-test. + // ********** private function prototypes ********** +static void resetSelfTestsFlags( void ); + +static void handleNoCartSelfTestsStopRequest( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestsWaitForClosedDoor( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestPumpsState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeValvesAndPumpState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestLeakDetectorsState( SELF_TEST_STATUS_T *result ); +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestStoppedState( void ); +static void handleDrySelfTestsStopRequest( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestBubbleDetectorsState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestAirTrapState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsSetupState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsState( SELF_TEST_STATUS_T *result ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalState( SELF_TEST_STATUS_T *result ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestStoppedState( void ); /*********************************************************************//** * @brief @@ -129,6 +142,45 @@ /*********************************************************************//** * @brief + * The signalResumeSelfTests function signals the self-tests to resume + * previous operation. + * @details Inputs: none + * @details Outputs: primeResumeRequested + * @return none + *************************************************************************/ +void signalResumeSelfTests( void ) +{ + selfTestsResumeRequested = TRUE; +} + +/*********************************************************************//** + * @brief + * The signalStopPrime function signals self-tests to stop when an + * alarm with stop property has been triggered. + * @details Inputs: none + * @details Outputs: primeStopRequested + * @return none + *************************************************************************/ +void signalStopSelfTests( void ) +{ + selfTestsStopRequested = TRUE; +} + +/*********************************************************************//** + * @brief + * The resetSelfTestsFlags function resets all self-tests signal flags. + * @details Inputs: none + * @details Outputs: signal flags set to FALSE + * @return none + *************************************************************************/ +static void resetSelfTestsFlags( void ) +{ + selfTestsResumeRequested = FALSE; + selfTestsStopRequested = FALSE; +} + +/*********************************************************************//** + * @brief * The transitionToNoCartSelfTests function resets anything required before * the start of no cartridge self-tests. * @details Inputs: none @@ -140,8 +192,9 @@ noCartSelfTestsResult = FALSE; hasPumpsStarted = FALSE; currentNoCartSelfTestsState = NO_CART_SELF_TESTS_START_STATE; - runPumpStartTime = 0; + + resetSelfTestsFlags(); } /*********************************************************************//** @@ -163,11 +216,11 @@ #ifdef SKIP_SELF_TESTS currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; #else - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_WAIT_FOR_CLOSED_DOOR; + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; #endif break; - case NO_CART_SELF_TESTS_WAIT_FOR_CLOSED_DOOR: + case NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE: currentNoCartSelfTestsState = handleNoCartSelfTestsWaitForClosedDoor(); break; @@ -215,6 +268,10 @@ } break; + case NO_CART_SELF_TESTS_STOPPED: + currentNoCartSelfTestsState = handleNoCartSelfTestStoppedState(); + break; + case NO_CART_SELF_TESTS_COMPLETE: noCartSelfTestsResult = TRUE; break; @@ -225,6 +282,12 @@ break; } + // Transition to stopped state when alarm with stop property has been triggered + handleNoCartSelfTestsStopRequest(); + + // Self-tests flags should be handled by now, reset if flags not handled with current state + resetSelfTestsFlags(); + if ( SELF_TEST_STATUS_FAILED == result ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRE_TREATMENT_SELF_TEST_FAILURE, currentNoCartSelfTestsState ); @@ -255,6 +318,8 @@ { drySelfTestsResult = FALSE; currentDrySelfTestsState = DRY_SELF_TESTS_START_STATE; + + resetSelfTestsFlags(); } /*********************************************************************//** @@ -275,10 +340,14 @@ #ifdef SKIP_SELF_TESTS currentDrySelfTestsState = DRY_SELF_TESTS_COMPLETE; #else - currentDrySelfTestsState = DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE; + currentDrySelfTestsState = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; #endif break; + case DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE: + currentDrySelfTestsState = handleDrySelfTestWaitForDoorCloseState(); + break; + case DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE: currentDrySelfTestsState = handleDrySelfTestBubbleDetectorsState(); break; @@ -306,6 +375,10 @@ currentDrySelfTestsState = handleDrySelfTestPressureSensorsNormalState( &result ); break; + case DRY_SELF_TESTS_STOPPED: + currentDrySelfTestsState = handleDrySelfTestStoppedState(); + break; + case DRY_SELF_TESTS_COMPLETE: drySelfTestsResult = TRUE; break; @@ -316,6 +389,12 @@ break; } + // Transition to stopped state when alarm with stop property has been triggered + handleDrySelfTestsStopRequest(); + + // Self-tests flags should be handled by now, reset if flags not handled with current state + resetSelfTestsFlags(); + if ( SELF_TEST_STATUS_FAILED == result ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRE_TREATMENT_SELF_TEST_FAILURE, currentDrySelfTestsState ); @@ -346,6 +425,8 @@ { wetSelfTestsResult = FALSE; currentWetSelfTestsState = WET_SELF_TESTS_START_STATE; + + resetSelfTestsFlags(); } /*********************************************************************//** @@ -418,7 +499,27 @@ return wetSelfTestsResult; } +/*********************************************************************//** + * @brief + * The handleNoCartSelfTestsStopRequest function handles stop request from alarm + * and transition to stopped state. + * @details Inputs: none + * @details Outputs: none + * @return the next state of no cart self-tests state machine + *************************************************************************/ +static void handleNoCartSelfTestsStopRequest( void ) +{ + if ( TRUE == selfTestsStopRequested ) + { + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + currentNoCartSelfTestsState = NO_CART_SELF_TESTS_STOPPED; + selfTestsStopRequested = FALSE; + } +} + /*********************************************************************//** * @brief * The handleNoCartridgeWaitForClosedDoor function executes the wait for @@ -429,7 +530,7 @@ *************************************************************************/ static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestsWaitForClosedDoor( void ) { - NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_WAIT_FOR_CLOSED_DOOR; + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; signalBloodPumpHardStop(); signalDialInPumpHardStop(); @@ -528,6 +629,67 @@ /*********************************************************************//** * @brief + * The handleNoCartSelfTestStoppedState function handles the stopped no + * cartridge self-tests operation. + * @details Inputs: none + * @details Outputs: none + * @return the next state of no cart self-tests state machine + *************************************************************************/ +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestStoppedState( void ) +{ + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_STOPPED; + + if ( TRUE == selfTestsResumeRequested ) + { + state = NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleDrySelfTestsStopRequest function handles stop request from alarm + * and transition to stopped state. + * @details Inputs: none + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static void handleDrySelfTestsStopRequest( void ) +{ + if ( TRUE == selfTestsStopRequested ) + { + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + + currentDrySelfTestsState = DRY_SELF_TESTS_STOPPED; + selfTestsStopRequested = FALSE; + } +} + +/*********************************************************************//** + * @brief + * The handleDrySelfTestWaitForDoorCloseState function verify no fluid is detected + * by bubble detectors. + * @details Inputs: none + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ) +{ + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + + if ( STATE_CLOSED == getFPGADoorState() ) + { + state = DRY_SELF_TESTS_BUBBLE_DETECTOR_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleDrySelfTestBubbleDetectorsState function verify no fluid is detected * by bubble detectors. * @details Inputs: none @@ -661,4 +823,24 @@ return state; } +/*********************************************************************//** + * @brief + * The handleDrySelfTestStoppedState function handles the stopped dry self-tests + * operation. + * @details Inputs: none + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestStoppedState( void ) +{ + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_STOPPED; + + if ( TRUE == selfTestsResumeRequested ) + { + state = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + } + + return state; +} + /**@}*/